В типовом функционале программы 1С:Документооборот 2.1 механизм автозаполнения файлов по шаблону по умолчанию отрабатывает лишь один раз — в момент первичного добавления файла из шаблона в карточку документа. Если в дальнейшем пользователь изменяет реквизиты карточки (например, сумму договора, контрагента или контактные данные), файл автоматически не обновляется. Штатная модель взаимодействия требует ручного нажатия команды заполнения файла по данным документа. Полноценное штатное фоновое обновление файлов при любых правках карточки появилось только в редакции «1С:Документооборот 3.0». Для версии 2.1 такую функциональность необходимо реализовывать программно.
При попытке автоматизировать этот процесс разработчики часто сталкиваются с критической проблемой: система уходит в бесконечную рекурсию, а регламентное задание ОбработкаПроизошедшихБизнесСобытий начинает циклически перезаписывать один и тот же документ. Давайте детально разберем природу этой ошибки и рассмотрим надежные варианты решения задачи.
Проанализируем цепочку событий, которая разворачивается в системе при наивной реализации через обработчики бизнес-событий:
Изменение внутреннего документа и добавляет запись в регистр сведений ПроизошедшиеБизнесСобытия.АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьПоляФайлаДаннымиВладельца).Изменение внутреннего документа.Чтобы избавиться от бесконечной цепочки, необходимо применить механизм блокировки повторных вызовов. Рассмотрим проверенные способы реализации автоматического обновления.
Разберем самый чистый способ предотвращения рекурсии на стороне серверного кода. Объект ДополнительныеСвойства существует исключительно во время текущей сессии записи в оперативной памяти и не сохраняется в базу данных. Мы можем установить специальный маркер перед перезаполнением файла и проверять его в обработчиках событий.
Посмотрим на пример кода, который внедряется в модуль объекта документа или в подписку на событие ПередЗаписью / ПриЗаписи:
Если Не Источник.ДополнительныеСвойства.Свойство("ПерезаполнениеФайлаВыполнено") Тогда
Источник.ДополнительныеСвойства.Вставить("ПерезаполнениеФайлаВыполнено", Истина);
// Выполняем проверку условий и вызов процедуры перезаполнения
Если АвтозаполнениеТребуется(Источник) Тогда
ВыполнитьПерезаполнениеФайловПоШаблону(Источник);
КонецЕсли;
КонецЕсли;
Когда типовые процедуры сохранения файла попытаются снова перезаписать данные документа или отправить его в обработку бизнес-событий, наличие свойства ПерезаполнениеФайлаВыполнено со значением Истина прервет каскадный запуск процедуры.
Документ может перезаписываться регламентными механизмами, процессами маршрутизации или при смене служебных статусов. Запускать тяжелую процедуру разбора шаблона при каждой технической перезаписи нерационально. Проанализируем правильный алгоритм проверки: сравниваем текущие данные объекта со значениями, которые уже записаны в информационной базе по ссылке.
Разберем по шагам, как построить подобную проверку в событии ПриЗаписи или ПередЗаписью:
Сумма, Контрагент, СрокИсполнения).Источник.Посмотрим на пример функции проверки модифицированности:
Функция АвтозаполнениеТребуется(Источник)
Если Источник.ЭтоНовый() Тогда
Возврат Ложь;
КонецЕсли;
РеквизитыБазы = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Источник.Ссылка,
"Сумма, Стороны, ДатаРегистрации"
);
Если Источник.Сумма <> РеквизитыБазы.Сумма
Или Источник.ДатаРегистрации <> РеквизитыБазы.ДатаРегистрации Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Если бизнес-требования не настаивают на выполнении фонового автозаполнения в фоновых заданиях без участия пользователя, наиболее надежный и безопасный путь — внедрение в форму документа через расширение конфигурации. В этом сценарии обновление происходит непосредственно в контексте сохранения формы пользователем, минуя механизм бизнес-событий.
Рассмотрим порядок действий:
ПослеЗаписиНаСервере.ПараметрыЗаписи.Отработано отсутствует и форма была модифицирована пользователем, запускаем метод перезаполнения файла.При внедрении программного перезаполнения шаблонов обязательно обратим внимание на следующие архитектурные особенности системы:
Редактирует. Если файл открыт кем-то из пользователей на редактирование (значение реквизита не равно пустой ссылке справочника Пользователи), перезаполнять его нельзя. Попытка перезаписи приведет либо к исключительной ситуации блокировки, либо к потере изменений, внесенных сотрудником вручную.ВерсииФайлов каждая процедура перезаполнения генерирует новую запись бинарных данных. Регулярные правки документов способны за короткий срок переполнить дисковое пространство томов хранения. Рекомендуется настроить регламентное задание очистки устаревших версий файлов.doc или dot, их обработка может требовать наличия установленного пакета Microsoft Office и вызова COM-соединений. На серверах под управлением 64-битной версии «1С:Предприятия» или ОС Linux это вызывает падение процессов. Для стабильной работы автозаполнения на сервере необходимо перевести все используемые шаблоны в современные форматы docx или dotx, обработка которых выполняется платформой встроенными средствами без использования COM-объектов.