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

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

При настройке правил автозаполнения шаблонов файлов (в форматах DOCX, ODT) пользователи и разработчики часто сталкиваются с тем, что стандартное дерево выбора реквизитов документа ограничено первым или вторым уровнем вложенности. Например, напрямую кликом мыши нельзя выбрать цепочку свойств вида Владелец.Организация.ОсновнойБанковскийСчет.Код или обратиться к реквизитам конкретной строки табличной части договора. Разберем, как обойти это ограничение, правильно составить скрипты получения данных и решить вопрос с выводом списочных структур.

Причина ограничения глубины реквизитов в интерфейсе

Ограничение разузлования дерева метаданных в пользовательском интерфейсе сделано намеренно. Если позволить платформе разворачивать ссылки произвольной глубины в интерактивном окне настройки, это приведет к лавинообразному количеству запросов к базе данных, тяжелым блокировкам и зависанию клиентского приложения. Поэтому разработчики платформы ограничили интерактивный выбор основными реквизитами карточки документа, табличными частями ДополнительныеРеквизиты и КонтактнаяИнформация.

Получение вложенных данных через скрипты автозаполнения

Для извлечения любых связанных данных произвольной глубины в типовом механизме автозаполнения предусмотрено использование скриптов (встроенных алгоритмов на языке 1С). В окне настройки соответствия полей шаблона вместо прямого указания реквизита выбирается тип источника «Скрипт» (или «Выражение»).

Рассмотрим контекст выполнения такого скрипта. В момент формирования файла доступен объект самого файла и связанного с ним документа. Проанализируем пример обращения к реквизитам:


// Получение банковского счета организации владельца файла
Если ЗначениеЗаполнено(Файл.ВладелецФайла) Тогда
    Организация = Файл.ВладелецФайла.Организация;
    Если ЗначениеЗаполнено(Организация) И ЗначениеЗаполнено(Организация.ОсновнойБанковскийСчет) Тогда
        Результат = Организация.ОсновнойБанковскийСчет.НомерСчета;
    Иначе
        Результат = "";
    КонецЕсли;
КонецЕсли;

Обратите внимание на синтаксис: переменная Результат является возвращаемым значением скрипта, которое непосредственно подставится в поле шаблона файла.

Особенности работы с табличной частью «Стороны» в договорах

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

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


// Обращение к первой стороне договора (например, контрагенту)
Если Файл.ВладелецФайла.Стороны.Количество() > 0 Тогда
    ПерваяСторона = Файл.ВладелецФайла.Стороны[0].Сторона;
    Результат = Строка(ПерваяСторона);
Иначе
    Результат = "";
КонецЕсли;

Если необходимо найти сторону с определенной ролью, организуем поиск по реквизитам строки:


Результат = "";
Для Каждого Стр Из Файл.ВладелецФайла.Стороны Цикл
    Если Стр.ОпределеннаяРоль = Истина Тогда // или проверка конкретного значения роли
        Результат = Стр.Сторона.НаименованиеПолное;
        Прервать;
    КонецЕсли;
КонецЦикла;

Централизованное хранение скриптов в справочнике «Алгоритмы»

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

  1. Открываем справочник Алгоритмы (или Алгоритмы и скрипты в зависимости от версии конфигурации).
  2. Создаем отдельный алгоритм с понятным наименованием, например, ПолучитьБанкОрганизации.
  3. В теле алгоритма описываем логику формирования значения и присваиваем его переменной возврата.
  4. В настройке автозаполнения конкретного шаблона вызываем созданный алгоритм, передавая текущий контекст.

Поддержка форматов Excel и MXL: ограничения и решения

Часто возникает вопрос: почему автозаполнение шаблонов работает для файлов Word (DOCX), но не работает стандартно для файлов Excel (XLSX) или табличных документов 1С (MXL)?

Выясним причину: механизм автозаполнения DOCX основан на работе с элементами управления содержимым (Content Controls) и модификации структуры XML внутри файла на сервере без необходимости запуска внешних офисных приложений. В файлах таблиц Excel аналогичные элементы управления текстом отсутствуют, а позиционирование жестко привязано к координатам ячеек.

Если вам требуется выводить табличные данные, рассмотрим два основных подхода:

  1. Использование стандартных таблиц в шаблоне Word: типовой механизм 1С:Документооборот отлично умеет заполнять таблицы DOCX. Для этого в шаблоне создается таблица, строка которой размечается элементами управления. В настройках автозаполнения сопоставляется табличная часть документа 1С со строкой таблицы шаблона, и при генерации файла 1С автоматически дублирует строки на весь объем данных.
  2. Формирование внешних печатных форм (ВПФ): если оформление требует строгого табличного вида Excel или MXL, лучшим решением будет создание внешней печатной формы на базе механизма БСП. В ней программно формируется объект ТабличныйДокумент, заполняются секции макета, после чего документ сохраняется методом ТабличныйДокумент.Записать(...) в формате XLSX или PDF и программно прикрепляется к карточке документа в 1С:Документооборот.

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

← На главную