gifts2017

Копия напечатанного документа или как спрятать документ.

Опубликовал Дмитрий Фаст (Dima_) в раздел Администрирование - Журнал регистрации

Возникла необходимость, чтобы при печати определённого документа (даже потом не сохранённого), создавалась его копия, т.е. запись всех напечатанных документов. (В результате чего возникла такая потребность, полагаюсь на вашу фантазию).
В итоге получилось два варианта решения, остановился на втором.

Как всё реализовывал:

I Вариант

  1. Открываем конфигурацию.
  2. Становимся на нужный документ и нажимаем кнопку «Копировать»
  3. Переименовываем получившийся документ, например «СкрытыйДокумент»
  4. В документе убираем галочки (если стоят):
     «Автоматическая нумерация»,
    «Разрешить проведение документа»
    «Бухгалтерский учёт»
  5. Добавляем в шапку реквизиты (при необходимости) например:
    ИсходНомерДок
    ИсходДатаДок
    ИмяКомпа
  6. Журнал у документа ставим «Прочие»
  7. Нажимаем кнопку «Ввод на основании» и убираем все галочки.
  8. Открываем форму документа и удаляем ненужные кнопки «Ок», «Записать» и т.д., если при закрытии отслеживается изменения в документе и спрашивается «Записать документ», тогда убираем это в модуле формы в процедуре «ПриЗакрытии()»
  9. Нужно убрать этот документ из общего журнала…
    открываем «Общий» журнал
    меняем ему тип на «Дополнительный»
    заполняем состав, все документы, кроме нашего созданного
  10. Создаём новый журнал, например «СкрытыйДокумент»
    (можно воспользоваться конструктором)
    сделаем его обычным
    в документах ставим галочку на нашем «СкрытыйДокумент»
    в меню его никому не добавляем
    графы настраиваем как удобно
  11. Чтобы документ не удалили:
    открываем глобальный модуль
    находим процедуру «ПриУдаленииДокумента(Докум, Режим)»
    дописываем код:

[CODE]

                Если Докум.Вид()="СкрытыйДокумент" Тогда

                               СтатусВозврата(0);

                КонецЕсли;

[/CODE]

     12. Теперь в исходном документе в модуле формы в процедуре печати дописываем код:

[CODE]
//*************************      

        ИсхДок=ТекущийДокумент();

        ВидИсхДока=ТекущийДокумент().Вид();

        КопияДока=СоздатьОбъект("Документ.СкрытыйДокумент");

        КопияДока.Новый();

        Для ш=1 по Метаданные.ОбщийРеквизитДокумента() Цикл 

                       Вр=ПолучитьАтрибут(Метаданные.ОбщийРеквизитДокумента(ш));

                       КопияДока.УстановитьАтрибут(Метаданные.ОбщийРеквизитДокумента(ш),вр);

        конецЦикла;

        Для ш=1 по Метаданные.Документ(ВидИсхДока).РеквизитШапки() Цикл 

                       Вр=ПолучитьАтрибут(Метаданные.Документ(ВидИсхДока).РеквизитШапки(ш));

                       КопияДока.УстановитьАтрибут(Метаданные.Документ(ВидИсхДока).РеквизитШапки(ш),вр);

        конецЦикла;

       

        времТЗ=СоздатьОбъект("ТаблицаЗначений");

        ВыгрузитьТабличнуюЧасть(ВремТЗ);

        КопияДока.ЗагрузитьТабличнуюЧасть(ВремТЗ);

 

        КопияДока.ДатаДок=ТекущаяДата();

        ЧЧ="";

        ММ="";

        СС="";

        ТекущееВремя(ЧЧ,ММ,СС);

        КопияДока.АвтоВремяОтключить();

        КопияДока.УстановитьВремя(ЧЧ,ММ,СС);

        КопияДока.ИсходНомерДок=НомерДок;

        КопияДока.ИсходДатаДок=ДатаДок;

        Если ПустоеЗначение(ИсхДок.НомерДок)=1 Тогда

                       КопияДока.НомерДок=НомерДок;

        иначе  

                       КопияДока.НомерДок=ИсхДок.НомерДок;

        КонецЕсли;

        КопияДока.ИмяКомпа=ИмяКомпьютера();

 

        КопияДока.Записать();

 //*************************

 [/CODE]

В итоге получаем полную картину печати всех определённых документов.
Недостаток - если открыт пункт меню «Операции», тогда документ можно увидеть, либо вызвав созданный журнал «СкрытыйДокумент», либо открыв журнал «Полный».

II Вариант решения (который применил)

Из-за того, что, в журнале, если он не основной, не работает отбор, сделал всё по второму варианту:

  1. Создаём справочник с неприметным наименованием, например «СкрытыйДокумент»
  2. Количество уровней выставляем равное 2
  3. Создаём реквизиты справочника, такие же, как и исходного документа реквизиты шапки и табличной части:
    Если это реквизит шапки исходного документа, тогда на закладке «Дополнительные» в свойствах реквизита устанавливаем «Для группы»
    Если это реквизит табличной части исходного документа, тогда на закладке «Дополнительные» в свойствах реквизита устанавливаем «Для элемента»
  4. Создаём нужные нам реквизиты, например:
    ДатаПечати
    ВремяПечати
    ИсходНомерДок
    ИсходДатаДок
  5. Настраиваем у нужных реквизитов сортировку и отбор
  6. Убираем галочку «Одна форма для элемента и группы»
  7. Ставим галочку «Редактировать в диалоге»
  8. Настраиваем форму группы (можно как в исходном документе)
    Добавляем в форму таблицу «ТЗ»
    В модуле формы у таблицы создаём поля, как у табличной части исходного документа
    Добавляем в модуль формы процедуру:

 [CODE]Процедура ПриОткрытии()

                ТЧ=СоздатьОбъект("Справочник.СкрытыйДокумент");

                ТЧ.ИспользоватьРодителя(ТекущийЭлемент());

                Если ТЧ.ВыбратьЭлементы()=1 Тогда

                               Пока ТЧ.ПолучитьЭлемент()=1 Цикл

                                               ТЗ.НоваяСтрока();

                                               ТЗ.НазваниеПоля=ТЧ.НазваниеПоля;

                                               ТЗ.НазваниеПоля1=ТЧ.НазваниеПоля1;

                                               …;

                               КонецЦикла;

                КонецЕсли; [/CODE]

  1. Чтобы никто не поправил элемент, у всех объектов формы в свойствах ставим галочку «Сделать недоступным»
  2. Кнопку «ОК» вообще можно удалить
  3. Настраиваем форму элемента (необязательно, можно оставить пустой)
  4. В модуль исходного документа перед печатью вставляем код (или выделяем его в процедуру)

 [CODE]                ИсхДок=ТекущийДокумент();

                ВидИсхДока=ТекущийДокумент().Вид();

                КопияДока=СоздатьОбъект("Справочник.СкрытыйДокумент");

                КопияДокаТЧ=СоздатьОбъект("Справочник.СкрытыйДокумент");

                КопияДока.НоваяГруппа();

                КопияДока.Наименование=ТекущееВремя();

                Если ПустоеЗначение(ИсхДок.НомерДок)=1 Тогда

                               КопияДока.Код=НомерДок;

                иначе  

                               КопияДока.Код=ИсхДок.НомерДок;

                               КопияДока.СсылкаНаДокумент=ИсхДок;

                КонецЕсли;

    КопияДока.ДатаПечати=ТекущаяДата();

                КопияДока.ВремяПечати=ТекущееВремя();

                КопияДока.ИмяКомпа=ИмяКомпьютера();

 

                КопияДока.ИсходНомерДок=НомерДок;

                КопияДока.ИсходДатаДок=ДатаДок;

               

                Для ш=1 по Метаданные.Документ(ВидИсхДока).РеквизитШапки() Цикл 

                               Вр=ПолучитьАтрибут(Метаданные.Документ(ВидИсхДока).РеквизитШапки(ш));

                               ИдРеквизита=Метаданные.Документ(ВидИсхДока).РеквизитШапки(ш).Идентификатор;

                               Попытка

                                               КопияДока.УстановитьАтрибут(Метаданные.Справочник("СкрытыйДокумент").Реквизит(ИдРеквизита),Вр);

                               Исключение

                               КонецПопытки;

                конецЦикла;

               

                КопияДока.Записать();

   

                КопияДокаТЧ.ИспользоватьРодителя(КопияДока);

               

                ВыбратьСтроки();

                Пока ПолучитьСтроку()=1 Цикл

 

                               КопияДокаТЧ.Новый();

                              

                               Для ш=1 по Метаданные.Документ(ВидИсхДока).РеквизитТабличнойЧасти() Цикл

                                               Вр=ПолучитьАтрибут(Метаданные.Документ(ВидИсхДока).РеквизитТабличнойЧасти(ш));

                                               ИдРеквизита=Метаданные.Документ(ВидИсхДока).РеквизитТабличнойЧасти(ш).Идентификатор;

                                               Попытка

                                                               КопияДокаТЧ.УстановитьАтрибут(Метаданные.Справочник("СкрытыйДокумент").Реквизит(ИдРеквизита),Вр);

                                               Исключение

                                               КонецПопытки;

                               КонецЦикла;

                               КопияДокаТЧ.Записать();

                КонецЦикла; [/CODE]

  1. Чтобы не удалили элементы справочника, в глобальный модуль пишем процедуру

 [CODE]Процедура ПриУдаленииЭлемента(УдалЭлем, Режим)

        Если УдалЭлем.Вид()="СкрытыйДокумент " Тогда

                       СтатусВозврата(0);

        КонецЕсли;

КонецПроцедуры [/CODE]

 

Получили копию документа в виде группы справочника.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Максим Кречетов (piloturs) 12.04.13 20:34
(0)
Если есть у кого варианты, как убрать журнал из списка журналов и убрать документ из полного журнала


> как убрать журнал из списка журналов:
не создавай новый журнал, а назначь для своего документа журнал "(Прочие)"

> убрать документ из полного журнала:
Свои "скрытые" документы записываешь, скажем, на лет 20 назад.
один из общих журналов должен быть назначен полным, чтобы при выборе в меню Операции -> Журналы документов... -> Диалог "Выбор журнала" при выборе пункта (Полный) открывалась конкретная форма журнала.
В этой форме в процедуре ПриОткрытии() используеш УстановитьИнтервал()
в предопределенной процедуре ПриУстановкеИнтервала() контролируешь изменение периода
2. Максим Кречетов (piloturs) 12.04.13 20:43
а вообще, касаясь задачи сформированной в (0), сохранять надо непосредственно идущее на печать. Т.е. работать на уровне драйвера принтера, а не на уровне базы данных 1С.
3. Сергей Радченко (Rad90210) 18.04.13 11:44
В печатной форме нужного документа перед выводом на экран, копию сохраняем в файл. Название файла формируем автоматически с префиксами даты/времени и автора. 3-5 строчек кода. И все копии документов напечатанных - У ВАС.
Сам бы делал как-то так...
4. Дмитрий Фаст (Dima_) 18.04.13 11:56
(2) piloturs, (3) Rad90210,
Вводная:
1. База распределённая (РИБ)
2. Печать в нескольких филиалах (другие населённые пункты)
3. Принтеры все разные
...

Задачи:
1. Копия всех напечатанных документов определённого типа
2. Быстрый визуальный просмотр и анализ
3. Сравнение напечатанных документов с проведёнными по нескольким критериям (дата, контрагент и т.д.)
...

Получаем:
Реализация варианта II
1. Автоматическое сохранение напечатанных документов
2. Автоматическое поступление данных в центр
3. Пишем обработку и получаем любой необходимый анализ.
...

Как-то так.

P.S. ...фантазируем масштабно...
5. Сергей Радченко (Rad90210) 18.04.13 12:19
РИБ ЗЛО. Причем старое зло. 7.7 зло. Причем старое зло. Решение :8.2 - типовое версионирование + закрытие печати не записанных документов.
Чего хотим добиться? чтобы не делали левых документов? ХАХА. А ексель, ксерокс и копии 1С на что? 7.7 - не выдерживает никакой критики по безопасности. А копии документов (печатных) - можно складировать и на фтп и на серваке и де угодно.
Если делать по уму=это чистое версионирование, которое ложит объемами большую базу, а для не большой - не имеет смысла. Если нужен бюджетный вариант - предложите заказчику поставить муляжи видеокамер на филиалах - левака пойдет меньше. А если нужна история - кто выписал этот неправильный счет - просто имя ответственно вставьте в печатную форму. Это не противоречит нормам бух/налог учета, и сразу будет понятно кто виноват.
Если уж на то пошло - без записи и проведения - документы печатать - это больше похоже на работу с екселем.
6. Дмитрий Фаст (Dima_) 18.04.13 12:52
(5) Rad90210,
Выбора нет, что имеем, с тем и работаем....
(Выбор есть всегда: работать или не работать)
Вот и получается, что приходится изобретать почти версионирование на 7.7.
7. Сергей Радченко (Rad90210) 18.04.13 12:55
Объясните заказчику что это деньги на ветер. В любом случае - создавать копию документа и скрыть его записывать это решение не красивое.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа