При настройке правил автозаполнения шаблонов файлов (в форматах DOCX, ODT) пользователи и разработчики часто сталкиваются с тем, что стандартное дерево выбора реквизитов документа ограничено первым или вторым уровнем вложенности. Например, напрямую кликом мыши нельзя выбрать цепочку свойств вида Владелец.Организация.ОсновнойБанковскийСчет.Код или обратиться к реквизитам конкретной строки табличной части договора. Разберем, как обойти это ограничение, правильно составить скрипты получения данных и решить вопрос с выводом списочных структур.
Ограничение разузлования дерева метаданных в пользовательском интерфейсе сделано намеренно. Если позволить платформе разворачивать ссылки произвольной глубины в интерактивном окне настройки, это приведет к лавинообразному количеству запросов к базе данных, тяжелым блокировкам и зависанию клиентского приложения. Поэтому разработчики платформы ограничили интерактивный выбор основными реквизитами карточки документа, табличными частями ДополнительныеРеквизиты и КонтактнаяИнформация.
Для извлечения любых связанных данных произвольной глубины в типовом механизме автозаполнения предусмотрено использование скриптов (встроенных алгоритмов на языке 1С). В окне настройки соответствия полей шаблона вместо прямого указания реквизита выбирается тип источника «Скрипт» (или «Выражение»).
Рассмотрим контекст выполнения такого скрипта. В момент формирования файла доступен объект самого файла и связанного с ним документа. Проанализируем пример обращения к реквизитам:
// Получение банковского счета организации владельца файла
Если ЗначениеЗаполнено(Файл.ВладелецФайла) Тогда
Организация = Файл.ВладелецФайла.Организация;
Если ЗначениеЗаполнено(Организация) И ЗначениеЗаполнено(Организация.ОсновнойБанковскийСчет) Тогда
Результат = Организация.ОсновнойБанковскийСчет.НомерСчета;
Иначе
Результат = "";
КонецЕсли;
КонецЕсли;
Обратите внимание на синтаксис: переменная Результат является возвращаемым значением скрипта, которое непосредственно подставится в поле шаблона файла.
В современных редакциях конфигурации 1С:Документооборот структура хранения участников сделки была переработана: вместо отдельных реквизитов «Контрагент» и «Организация» используется табличная часть Стороны. Это позволяет фиксировать многосторонние договоры. Из-за этого прямое обращение к конкретному контрагенту через интерфейс становится невозможным.
Чтобы извлечь нужную сторону через код скрипта, мы можем обратиться к строкам табличной части по индексу или через обход коллекции:
// Обращение к первой стороне договора (например, контрагенту)
Если Файл.ВладелецФайла.Стороны.Количество() > 0 Тогда
ПерваяСторона = Файл.ВладелецФайла.Стороны[0].Сторона;
Результат = Строка(ПерваяСторона);
Иначе
Результат = "";
КонецЕсли;
Если необходимо найти сторону с определенной ролью, организуем поиск по реквизитам строки:
Результат = "";
Для Каждого Стр Из Файл.ВладелецФайла.Стороны Цикл
Если Стр.ОпределеннаяРоль = Истина Тогда // или проверка конкретного значения роли
Результат = Стр.Сторона.НаименованиеПолное;
Прервать;
КонецЕсли;
КонецЦикла;
Если один и тот же сложный реквизит (например, расширенные банковские реквизиты, подписант по доверенности или цепочка согласования) требуется выводить во многих шаблонах, писать одинаковый код в каждом правиле неэффективно. Разберем правильный порядок действий:
ПолучитьБанкОрганизации.Часто возникает вопрос: почему автозаполнение шаблонов работает для файлов Word (DOCX), но не работает стандартно для файлов Excel (XLSX) или табличных документов 1С (MXL)?
Выясним причину: механизм автозаполнения DOCX основан на работе с элементами управления содержимым (Content Controls) и модификации структуры XML внутри файла на сервере без необходимости запуска внешних офисных приложений. В файлах таблиц Excel аналогичные элементы управления текстом отсутствуют, а позиционирование жестко привязано к координатам ячеек.
Если вам требуется выводить табличные данные, рассмотрим два основных подхода:
ТабличныйДокумент, заполняются секции макета, после чего документ сохраняется методом ТабличныйДокумент.Записать(...) в формате XLSX или PDF и программно прикрепляется к карточке документа в 1С:Документооборот.Важный нюанс: первичное автозаполнение файла срабатывает автоматически только при его создании из шаблона. Если реквизиты документа изменились позже (например, был присвоен регистрационный номер или изменилась сумма), для обновления текста файла необходимо вызвать команду повторного заполнения либо настроить действие автозаполнения в схеме процесса обработки документа.