В типовых конфигурациях платформы 1С:Предприятие по умолчанию отсутствует встроенный механизм, фиксирующий историю отправки документов на печать. На практике такая задача возникает регулярно: службе безопасности нужно контролировать несанкционированный вывод документов, руководству — оценивать затраты на бумагу, а менеджерам и кладовщикам — решать спорные ситуации, когда клиент или склад заявляет о расхождениях в выданных накладных. Кроме того, со временем структура базы данных и макеты печатных форм могут меняться, из-за чего напечатать документ «задним числом» в его первозданном виде становится невозможно.
В этой статье мы подробно разберем, как решить проблему отсутствия истории печати. Мы проанализируем четыре наиболее эффективных и надежных способа реализации этой задачи: от простого ведения логов до интеграции со средствами операционной системы Windows и механизмами автоматического сохранения копий.
Самый очевидный и быстрый в реализации метод — это фиксация факта формирования печатной формы непосредственно из кода 1С. Мы можем записывать информацию о событии во внешний текстовый файл или использовать для этого стандартный Журнал регистрации.
Для устаревших конфигураций на платформе 1С v7.7 или обычных формах 1С v8 разработчики часто применяют запись в простой текстовый файл. Рассмотрим пример функции, которая фиксирует имя внешней печатной формы, время ее вызова и текущего пользователя:
Процедура ЛогИспользованияОтчета()
Путь = "";
Имя = "";
РасположениеФайла(Путь, Имя);
ТекстЛог = СоздатьОбъект("Текст");
ФайлЛог = КаталогИБ() + "\ExtForms\" + "LogIO.txt";
Если ФС.СуществуетФайл(ФайлЛог) = 0 Тогда
ТекстЛог.Записать(ФайлЛог);
КонецЕсли;
ТекстЛог.Открыть(ФайлЛог);
ТекстЛог.ДобавитьСтроку(Имя + "#" + ТекущаяДата() + "#" + ТекущееВремя() + "#" + Пользователь);
ТекстЛог.Записать(ФайлЛог);
КонецПроцедуры
В современной среде 1С v8.3 (особенно в управляемых формах) гораздо эффективнее и безопаснее осуществлять запись логов в Журнал регистрации или специально созданный Регистр сведений. Давайте посмотрим на пример функции, регистрирующей печать документа в 1С 8.3:
Процедура ЗаписатьВЛогПечати(ДокументСсылка, ИмяПечатнойФормы) Экспорт
ИмяСобытия = "_ПечатьДокумента.Успешно";
ПредставлениеДокумента = Строка(ДокументСсылка);
ТекстСообщения = СтрШаблон("Пользователь %1 сформировал печатную форму '%2' для документа %3",
Пользователи.ТекущийПользователь(),
ИмяПечатнойФормы,
ПредставлениеДокумента);
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , ДокументСсылка, ТекстСообщения);
КонецПроцедуры
Этот метод прост, однако важно помнить о существенном нюансе: он фиксирует только факт формирования печатной формы на экране (вывод табличного документа). Был ли документ фактически отправлен на принтер, или пользователь просто закрыл окно предварительного просмотра — в рамках данного способа отследить невозможно.
Если перед нами стоит задача гарантировать, что распечатанный год назад договор или акт будет доступен для повторной печати именно в том виде, в котором его получил клиент (даже если макет формы или данные в базе кардинально поменялись), нам поможет механизм сохранения электронных дубликатов.
Мы можем доработать конфигурацию (или написать расширение), которое в момент первой отправки документа на печать или при его проведении будет программно генерировать табличный документ, конвертировать его в формат PDF и прикреплять к документу-источнику.
Давайте разберем по шагам, как программно сохранить печатную форму в PDF и прикрепить ее к документу с помощью механизмов Библиотеки стандартных подсистем (БСП):
УправлениеПечатью (например, через расширение с аннотацией &После).Записать().Пример кода для программного сохранения сформированной формы в PDF-файл:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
// Далее вызывается типовой метод БСП для добавления файла к объекту
// РаботаСФайлами.ДобавитьФайл(ДокументСсылка, ИмяВременногоФайла, "ПечатнаяФорма.pdf");
При таком подходе повторная печать документа сводится к простому открытию прикрепленного PDF-файла, что полностью решает проблему изменения версий и метаданных.
Часто споры возникают из-за того, что пользователи перед отправкой на печать редактируют документ прямо в окне предварительного просмотра 1С (меняют количество товара, цены или контрагента). Чтобы исключить такие махинации, необходимо внедрить жесткие организационно-технические регламенты:
ТолькоПросмотр установлено в значение Истина, а свойство Защита — также в значение Истина. Это лишит пользователя возможности менять ячейки вручную перед печатью.ТабличныйДокумент.Напечатать(РежимИспользованияПараметровПечати.Использовать). При вызове этого метода форма сразу уходит в спулер принтера, а в коде фиксируется гарантированное событие отправки.Если требуется стопроцентный контроль за бумажными носителями и физической отправкой файлов на принтер, мы можем перенести аудит на уровень операционной системы. В ОС Windows есть мощная служба отслеживания печати, которая фиксирует абсолютно все задания.
Для настройки этого процесса проделаем следующие шаги:
Applications and Services Logs -> Microsoft -> Windows -> PrintService.Operational и выбираем Включить журнал.После активации службы каждое успешное задание печати будет регистрироваться в системе с ID события 307. В деталях этого события операционная система сохраняет:
Мы можем настроить в 1С периодическое чтение этого системного лога через COM-соединение (технология WMI) или с помощью запуска скриптов PowerShell. Это позволит сопоставлять данные из 1С с фактическими логами принтера и оперативно выявлять любые попытки обмана со стороны сотрудников.