Как реализовать историю печати документов в 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В типовых конфигурациях платформы 1С:Предприятие по умолчанию отсутствует встроенный механизм, фиксирующий историю отправки документов на печать. На практике такая задача возникает регулярно: службе безопасности нужно контролировать несанкционированный вывод документов, руководству — оценивать затраты на бумагу, а менеджерам и кладовщикам — решать спорные ситуации, когда клиент или склад заявляет о расхождениях в выданных накладных. Кроме того, со временем структура базы данных и макеты печатных форм могут меняться, из-за чего напечатать документ «задним числом» в его первозданном виде становится невозможно.

В этой статье мы подробно разберем, как решить проблему отсутствия истории печати. Мы проанализируем четыре наиболее эффективных и надежных способа реализации этой задачи: от простого ведения логов до интеграции со средствами операционной системы Windows и механизмами автоматического сохранения копий.

Способ 1. Программное логирование в текстовый файл или Журнал регистрации

Самый очевидный и быстрый в реализации метод — это фиксация факта формирования печатной формы непосредственно из кода 1С. Мы можем записывать информацию о событии во внешний текстовый файл или использовать для этого стандартный Журнал регистрации.

Для устаревших конфигураций на платформе 1С v7.7 или обычных формах 1С v8 разработчики часто применяют запись в простой текстовый файл. Рассмотрим пример функции, которая фиксирует имя внешней печатной формы, время ее вызова и текущего пользователя:


Процедура ЛогИспользованияОтчета()
    Путь = "";
    Имя = "";
    РасположениеФайла(Путь, Имя);
    ТекстЛог = СоздатьОбъект("Текст");
    ФайлЛог = КаталогИБ() + "\ExtForms\" + "LogIO.txt";
    Если ФС.СуществуетФайл(ФайлЛог) = 0 Тогда
        ТекстЛог.Записать(ФайлЛог);
    КонецЕсли;
    ТекстЛог.Открыть(ФайлЛог);
    ТекстЛог.ДобавитьСтроку(Имя + "#" + ТекущаяДата() + "#" + ТекущееВремя() + "#" + Пользователь);
    ТекстЛог.Записать(ФайлЛог);
КонецПроцедуры

В современной среде 1С v8.3 (особенно в управляемых формах) гораздо эффективнее и безопаснее осуществлять запись логов в Журнал регистрации или специально созданный Регистр сведений. Давайте посмотрим на пример функции, регистрирующей печать документа в 1С 8.3:


Процедура ЗаписатьВЛогПечати(ДокументСсылка, ИмяПечатнойФормы) Экспорт
    ИмяСобытия = "_ПечатьДокумента.Успешно";
    ПредставлениеДокумента = Строка(ДокументСсылка);
    ТекстСообщения = СтрШаблон("Пользователь %1 сформировал печатную форму '%2' для документа %3", 
        Пользователи.ТекущийПользователь(), 
        ИмяПечатнойФормы, 
        ПредставлениеДокумента);
    ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , ДокументСсылка, ТекстСообщения);
КонецПроцедуры

Этот метод прост, однако важно помнить о существенном нюансе: он фиксирует только факт формирования печатной формы на экране (вывод табличного документа). Был ли документ фактически отправлен на принтер, или пользователь просто закрыл окно предварительного просмотра — в рамках данного способа отследить невозможно.

Способ 2. Автоматическое сохранение копий печатных форм в PDF

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

Мы можем доработать конфигурацию (или написать расширение), которое в момент первой отправки документа на печать или при его проведении будет программно генерировать табличный документ, конвертировать его в формат PDF и прикреплять к документу-источнику.

Давайте разберем по шагам, как программно сохранить печатную форму в PDF и прикрепить ее к документу с помощью механизмов Библиотеки стандартных подсистем (БСП):

  1. Перехватываем процедуру печати в общем модуле УправлениеПечатью (например, через расширение с аннотацией &После).
  2. Получаем сформированный табличный документ печатной формы.
  3. Конвертируем его в PDF-файл во временный каталог на сервере с помощью метода Записать().
  4. Добавляем полученный файл в справочник присоединенных файлов, связанных с нашим документом.

Пример кода для программного сохранения сформированной формы в PDF-файл:


ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
// Далее вызывается типовой метод БСП для добавления файла к объекту
// РаботаСФайлами.ДобавитьФайл(ДокументСсылка, ИмяВременногоФайла, "ПечатнаяФорма.pdf");

При таком подходе повторная печать документа сводится к простому открытию прикрепленного PDF-файла, что полностью решает проблему изменения версий и метаданных.

Способ 3. Прямая печать без предпросмотра и блокировка изменений

Часто споры возникают из-за того, что пользователи перед отправкой на печать редактируют документ прямо в окне предварительного просмотра 1С (меняют количество товара, цены или контрагента). Чтобы исключить такие махинации, необходимо внедрить жесткие организационно-технические регламенты:

  1. Запрет редактирования табличных документов: Убедитесь, что для выводимых табличных документов свойство ТолькоПросмотр установлено в значение Истина, а свойство Защита — также в значение Истина. Это лишит пользователя возможности менять ячейки вручную перед печатью.
  2. Прямая отправка на принтер: Исключите интерактивный просмотр для критически важных документов. Используйте метод ТабличныйДокумент.Напечатать(РежимИспользованияПараметровПечати.Использовать). При вызове этого метода форма сразу уходит в спулер принтера, а в коде фиксируется гарантированное событие отправки.
  3. Блокировка проведенных документов: Как только документ проводится и закрывает период, он должен блокироваться для изменений намертво. Разблокировка должна быть доступна только администратору или руководителю по официальной заявке.

Способ 4. Аудит печати средствами операционной системы Windows

Если требуется стопроцентный контроль за бумажными носителями и физической отправкой файлов на принтер, мы можем перенести аудит на уровень операционной системы. В ОС Windows есть мощная служба отслеживания печати, которая фиксирует абсолютно все задания.

Для настройки этого процесса проделаем следующие шаги:

  1. Открываем на сервере или локальном компьютере Просмотр событий (Event Viewer).
  2. Переходим по пути: Applications and Services Logs -> Microsoft -> Windows -> PrintService.
  3. Нажимаем правой кнопкой мыши по журналу Operational и выбираем Включить журнал.

После активации службы каждое успешное задание печати будет регистрироваться в системе с ID события 307. В деталях этого события операционная система сохраняет:

Мы можем настроить в 1С периодическое чтение этого системного лога через COM-соединение (технология WMI) или с помощью запуска скриптов PowerShell. Это позволит сопоставлять данные из 1С с фактическими логами принтера и оперативно выявлять любые попытки обмана со стороны сотрудников.

← На главную