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

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

Автоматическое заполнение файлов — одна из ключевых функций 1С:Документооборот (1С:ДО). Она позволяет значительно экономить время сотрудников, генерируя договоры, сметы и служебные записки на основе данных из карточки документа. Однако, если с простыми полями (Дата, Номер, Контрагент) проблем обычно не возникает, то перенос табличной части (например, списка товаров или услуг) в файл часто вызывает вопросы.

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

Постановка задачи и выбор формата файла

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

Прежде чем мы перейдем к технической реализации, давайте проанализируем выбор формата. Хотя 1С прекрасно работает с MXL программно, механизм пользовательского автозаполнения в 1С:Документооборот исторически оптимизирован для офисных форматов:

  1. Microsoft Word (.docx) или OpenOffice Writer (.odt).
  2. Microsoft Excel (.xlsx) или OpenOffice Calc (.ods).

Использование MXL для автозаполнения силами пользователя (без доработки конфигурации в Конфигураторе) накладывает ряд ограничений. Стандартная подсистема работы с файлами лучше всего «понимает» разметку таблиц именно в Word и Excel. Поэтому, если перед вами не стоит жесткого требования использовать именно MXL, мы настоятельно рекомендуем конвертировать шаблон в Excel (.xlsx). Это существенно упростит настройку.

Тем не менее, мы рассмотрим общий алгоритм, который базируется на механизме скриптов, упомянутом в обсуждении.

Общий принцип работы автозаполнения таблиц

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

  1. Подготовить шаблон файла: расставить специальные метки (теги), указывающие границы таблицы и названия колонок.
  2. Настроить правило заполнения: написать скрипт на языке 1С, который получит данные из документа и передаст их в эти метки.

В обсуждении справедливо заметили, что простого сопоставления полей недостаточно. Нам понадобится использовать скрипт. Давайте разберем, как это сделать пошагово.

Шаг 1. Подготовка шаблона файла (включая гриф утверждения цифровой подписью)

Разберем подготовку шаблона на примере форматов, которые поддерживают корректное тиражирование строк.

Вариант А: Шаблон в Excel (рекомендуемый)

В файле Excel нам нужно выделить строку, которая будет служить шаблоном для одной строки данных, и присвоить ей имя (Named Range).

  1. Откройте шаблон в Excel.
  2. Создайте "шапку" таблицы.
  3. Под шапкой оформите одну строку с переменными, например: [Товар], [Количество], [Цена].
  4. Выделите эту строку ячеек.
  5. В Excel присвойте этому диапазону имя (через меню Формулы -> Диспетчер имен). Назовите область, например, СписокТоваров.

Вариант Б: Шаблон в Word (включая визуализацию печати ЭЦП)

В Word используется механизм, похожий на слияние почты.

  1. Создайте таблицу в Word.
  2. В первой ячейке строки данных (не шапки) вставьте поле с текстом TableStart:СписокТоваров.
  3. В последней ячейке этой же строки вставьте поле TableEnd:СписокТоваров.
  4. Между этими тегами расположите переменные, например {Товар}, {Количество}.

Шаг 2. Настройка правил автозаполнения в 1С:ДО

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

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

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

В редакторе скрипта нам доступен контекст выполнения. Ключевые переменные:

Чтобы добраться до данных документа, мы используем конструкцию Файл.Владелец. Владельцем файла является сам внутренний документ.

Шаг 3. Написание скрипта для получения данных

Самое сложное и важное — правильно написать запрос к базе данных прямо в поле скрипта настройки. Мы должны обратиться к табличной части документа-владельца.

Предположим, у нас есть табличная часть Товары с реквизитами Номенклатура, Количество и Цена. Давайте напишем код, который сформирует таблицу значений для заполнения.


// Создаем запрос для выборки данных из табличной части документа
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДокТовары.НомерСтроки КАК НомерСтроки,
    |	ДокТовары.Номенклатура.Наименование КАК Товар,
    |	ДокТовары.Количество КАК Количество,
    |	ДокТовары.Цена КАК Цена,
    |	ДокТовары.Сумма КАК Сумма
    |ИЗ
    |	Справочник.ВнутренниеДокументы.Товары КАК ДокТовары
    |ГДЕ
    |	ДокТовары.Ссылка = &Владелец";

// Устанавливаем параметр &Владелец, обращаясь к владельцу файла
Запрос.УстановитьПараметр("Владелец", Файл.Владелец);

// Выполняем запрос и выгружаем результат в Таблицу Значений
Результат = Запрос.Выполнить().Выгрузить();

// Возвращаем результат для системы автозаполнения
РезультатОбработки = Результат;

Обратите внимание на важные детали:

Шаг 4. Использование системных функций

В обсуждении (сообщение 12) упоминалась функция ВыполнитьЗаменуПолейИСтрокВДокументе. Давайте разберем, что это и как это применить.

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

Однако, если вы хотите использовать возможности встроенного языка по максимуму и у вас есть доступ к изменению скриптов, вы можете использовать стандартные библиотеки БСП (Библиотека Стандартных Подсистем), встроенные в ДО.

Для корректной работы с таблицами в скрипте правила заполнения (для Word/Excel) часто достаточно просто вернуть таблицу значений, имена колонок которой (Товар, Количество) совпадают с именами полей в шаблоне ({Товар}, {Количество}).

Особенности работы с MXL

Вернемся к проблеме автора с форматом MXL. Если вы категорически настроены использовать этот формат, подход через пользовательский интерфейс «Настройка заполнения файла» может не сработать для табличных частей так гладко, как для Word/Excel.

Для MXL обычно применяется следующий подход через Конфигуратор:

  1. Создается макет MXL в дереве метаданных (или используется файл).
  2. В макете создаются именованные области: ОбластьШапка, ОбластьСтрока, ОбластьПодвал.
  3. Пишется программный код (не пользовательский скрипт, а код в модуле), который выводит области последовательно:

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("НужныйМакет");

// Вывод шапки
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Заполнить(ДанныеДокумента);
ТабДок.Вывести(Область);

// Цикл по строкам таблицы
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого ТекСтрока Из ДанныеДокумента.Товары Цикл
    ОбластьСтрока.Параметры.Заполнить(ТекСтрока);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

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

Резюме и рекомендации

Давайте подведем итог и сформируем план действий для решения вашей проблемы:

  1. Смените формат шаблона. Если это возможно, сохраните ваш макет как .xlsx (Excel). Это позволит использовать штатный механизм заполнения таблиц без программирования в Конфигураторе.
  2. Используйте правильную разметку. В Excel используйте «Именованные диапазоны» (Named Ranges) для обозначения строки таблицы, которую нужно размножить.
  3. Настройте скрипт в пользовательском режиме. В настройках автозаполнения файла 1С:ДО для соответствующей группы (таблицы) выберите способ заполнения «Скрипт».
  4. Напишите запрос. Используйте приведенный выше пример кода с Запрос и Файл.Владелец, чтобы получить данные табличной части и вернуть их в переменную РезультатОбработки.

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

← На главную