Как настроить автоматическое заполнение шаблонов документов при изменении данных в карточке 1С:Документооборот?

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

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

Анализ штатных возможностей системы

Прежде чем приступать к написанию программного кода, давайте проанализируем штатные механизмы последних версий 1С:Документооборот (начиная с релизов 2.1 и в редакции 3.0). Разработчики предусмотрели функциональную опцию «Использовать автозаполнение шаблонов файлов». Если этот флаг включен, система способна перезаполнять файл при каждом сохранении карточки документа.

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

Решение через обработчики бизнес-событий

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

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


Задача = Событие.Источник;
МассивПредметов = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(Задача);

Для Каждого Документ ИЗ МассивПредметов Цикл
    Если ДелопроизводствоКлиентСервер.ЭтоВнутреннийДокумент(Документ) Тогда
        Если ТипЗнч(Задача.БизнесПроцесс) = Тип("БизнесПроцессСсылка.Утверждение") Тогда
            Запрос = Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ
                           | РезультатыУтверждения.РезультатУтверждения
                           |ИЗ
                           | БизнесПроцесс.Утверждение.РезультатыУтверждения КАК РезультатыУтверждения
                           |ГДЕ
                           | РезультатыУтверждения.ЗадачаИсполнителя = &ЗадачаИсполнителя
                           | И РезультатыУтверждения.РезультатУтверждения = &РезультатУтверждения";
            
            Запрос.УстановитьПараметр("ЗадачаИсполнителя", Задача);
            Запрос.УстановитьПараметр("РезультатУтверждения", Перечисления.РезультатыУтверждения.Утверждено);
            Результат = Запрос.Выполнить;

            Если НЕ Результат.Пустой Тогда
                КоличествоФайлов = Делопроизводство.КоличествоФайлов(Документ.Ссылка);
                Если КоличествоФайлов > 0 Тогда
                    ВсеФайлыДокумента = РаботаСФайламиВызовСервера.ПолучитьВсеПодчиненныеФайлы(Документ.Ссылка, Ложь);
                    Для Каждого ТекущийФайл Из ВсеФайлыДокумента Цикл
                        СозданИзШаблона = ?(ТекущийФайл.ШаблонОснованиеДляСоздания <> Справочники.Файлы.ПустаяСсылка, Истина, Ложь);
                        Если СозданИзШаблона Тогда
                            ДанныеВыполнения = АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьПоляФайлаДаннымиВладельца(Истина, ТекущийФайл.Ссылка, Ложь);
                            Если ДанныеВыполнения.Результат Тогда
                                Комментарий = "Автозаполнение полей файла после утверждения документа";
                                АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДанныеВыполнения.ДвоичныеДанныеЗаполненногоФайла, ТекущийФайл, Комментарий);
                            КонецЕсли;
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

В данном фрагменте мы сначала получаем предмет задачи (наш документ), проверяем его тип и убеждаемся, что бизнес-процесс завершился именно статусом Утверждено. Далее мы перебираем все прикрепленные файлы, находим те, что были созданы на основании шаблона, и инициируем метод ЗаполнитьПоляФайлаДаннымиВладельца. Это позволяет системе программно «нажать» ту самую кнопку заполнения и сохранить новую версию файла с актуальными данными.

Автозаполнение после согласования

Ситуация с согласованием аналогична, но здесь важно проверить активную визу. Посмотрим на алгоритм, который стоит использовать для обработчика «Автоматическое заполнение после согласования» (также при подписке на «Выполнение задачи»):


Задача = Событие.Источник;
МассивПредметов = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(Задача);

Для Каждого Документ ИЗ МассивПредметов Цикл
    Если ДелопроизводствоКлиентСервер.ЭтоВнутреннийДокумент(Документ) Тогда
        Если ТипЗнч(Задача.БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование") Тогда
            Виза = РаботаСВизамиСогласования.ПолучитьАктивнуюВизуПоЗадаче(Документ, Задача);
            Если Виза <> Неопределено И Виза.РезультатСогласования <> Перечисления.РезультатыСогласования.НеСогласовано Тогда
                // Логика поиска файлов и автозаполнения аналогична предыдущему примеру
                // ...
                Комментарий = "Автозаполнение полей файла после согласования документа";
                // ...
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Обратите внимание на использование функции РаботаСВизамиСогласования.ПолучитьАктивнуюВизуПоЗадаче. Это позволяет нам убедиться, что файл будет обновлен только в том случае, если документ не был отклонен согласующим лицом.

Обновление данных при регистрации документа

Регистрация — один из самых важных моментов, так как в документе должны появиться регистрационный номер и дата. Здесь мы используем другой тип подписки: «Регистрация внутреннего документа». В этом случае объектом события выступает сам документ, что упрощает код:


Документ = Событие.Источник;
КоличествоФайлов = Делопроизводство.КоличествоФайлов(Документ.Ссылка);

Если КоличествоФайлов > 0 Тогда
    ВсеФайлыДокумента = РаботаСФайламиВызовСервера.ПолучитьВсеПодчиненныеФайлы(Документ.Ссылка, Ложь);
    Для Каждого ТекущийФайл Из ВсеФайлыДокумента Цикл
        Если ТекущийФайл.ШаблонОснованиеДляСоздания <> Справочники.Файлы.ПустаяСсылка Тогда
            ДанныеВыполнения = АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьПоляФайлаДаннымиВладельца(Истина, ТекущийФайл, Ложь);
            Если ДанныеВыполнения.Результат Тогда
                Комментарий = "Автозаполнение полей файла после регистрации";
                АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДанныеВыполнения.ДвоичныеДанныеЗаполненногоФайла, ТекущийФайл, Комментарий);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Выбор формата файла: DOC или DOCX?

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

  1. Формат DOCX (современный стандарт): 1С:Документооборот умеет работать с ним напрямую на уровне XML-структуры. Это означает, что для автозаполнения не требуется установка Microsoft Word на сервере. Это самый стабильный и быстрый вариант для работы в клиент-серверном режиме.
  2. Формат DOC (устаревший бинарный формат): Работа с ним возможна только через COM-объект. Это требует наличия установленного и лицензированного MS Office на сервере 1С. Такой подход часто вызывает проблемы с производительностью, зависание процессов WINWORD.EXE и сложности при работе на серверах под управлением Linux.

Рекомендация: Если ваша задача — минимизировать ошибки и обеспечить быстродействие, переводите все шаблоны в формат DOCX. Для корректного заполнения используйте не простую замену строк, а механизм «Полей» (вкладка «Разработчик» в MS Word). Это сохраняет структуру документа и снижает риск порчи файла при вставке длинных строк.

Особенности 1С:Документооборот 3.0

Проанализируем изменения в новой версии программы. Если вы работаете в редакции 3.0, вместо вставки кода непосредственно в обработчики событий рекомендуется использовать механизм «Алгоритмов».

Алгоритмы — это справочник, где вы один раз пишете программный код, а затем вызываете его по имени из разных точек конфигурации (правил автозаполнения, схем процессов). Это значительно упрощает поддержку: если вам нужно будет изменить логику (например, добавить склонение ФИО через СклонениеФизическихЛиц.Просклонять()), вы сделаете это в одном месте.

Важные ограничения

Разберем ситуацию с электронной подписью (ЭП). Важно помнить: если файл уже был подписан усиленной квалифицированной электронной подписью, любое автоматическое заполнение будет заблокировано. Система не позволит изменить ни одного байта в файле, так как это сделает подпись невалидной. Поэтому все скрипты автозаполнения должны отрабатывать до этапа подписания документа.

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

← На главную