Автоматическое заполнение файлов — одна из ключевых функций 1С:Документооборот (1С:ДО). Она позволяет значительно экономить время сотрудников, генерируя договоры, сметы и служебные записки на основе данных из карточки документа. Однако, если с простыми полями (Дата, Номер, Контрагент) проблем обычно не возникает, то перенос табличной части (например, списка товаров или услуг) в файл часто вызывает вопросы.
В этой статье мы подробно разберем, как решить задачу автозаполнения таблиц, обсудим нюансы работы с форматом MXL, рекомендованным автором вопроса, изучим условия для шаблонов файлов в видах документов и рассмотрим более удобные альтернативы, а также напишем необходимый программный код для скриптов заполнения.
В исходной ситуации пользователь создал в системе новый «Вид документа» и добавил к нему шаблон файла в формате MXL (родной формат табличного документа 1С). Задача состоит в том, чтобы при создании документа в режиме «Предприятие» система автоматически заполнила таблицу в этом файле строками из табличной части карточки документа.
Прежде чем мы перейдем к технической реализации, давайте проанализируем выбор формата. Хотя 1С прекрасно работает с MXL программно, механизм пользовательского автозаполнения в 1С:Документооборот исторически оптимизирован для офисных форматов:
Использование MXL для автозаполнения силами пользователя (без доработки конфигурации в Конфигураторе) накладывает ряд ограничений. Стандартная подсистема работы с файлами лучше всего «понимает» разметку таблиц именно в Word и Excel. Поэтому, если перед вами не стоит жесткого требования использовать именно MXL, мы настоятельно рекомендуем конвертировать шаблон в Excel (.xlsx). Это существенно упростит настройку.
Тем не менее, мы рассмотрим общий алгоритм, который базируется на механизме скриптов, упомянутом в обсуждении.
Чтобы система поняла, как перенести многострочную часть из 1С в файл, нам необходимо выполнить два условия:
В обсуждении справедливо заметили, что простого сопоставления полей недостаточно. Нам понадобится использовать скрипт. Давайте разберем, как это сделать пошагово.
Разберем подготовку шаблона на примере форматов, которые поддерживают корректное тиражирование строк.
В файле Excel нам нужно выделить строку, которая будет служить шаблоном для одной строки данных, и присвоить ей имя (Named Range).
[Товар], [Количество], [Цена].СписокТоваров.В Word используется механизм, похожий на слияние почты.
TableStart:СписокТоваров.TableEnd:СписокТоваров.{Товар}, {Количество}.Теперь перейдем в режим «1С:Предприятие». Нам нужно открыть карточку Вида документа, к которому привязан наш шаблон. При необходимости перенести настроенные правила на другие виды документов пригодится обработка для переноса скриптов автозаполнения файлов.
В разделе настройки шаблона файла вы увидите список полей, которые система нашла в вашем файле. Если вы используете таблицу, нам нужно связать область таблицы с данными.
Рассмотрим, как задействовать скрипт, о котором шла речь в сообщениях форума. Стандартные настройки позволяют выбрать поле «Из реквизита», но для таблицы нам часто требуется выбрать тип значения Скрипт.
В редакторе скрипта нам доступен контекст выполнения. Ключевые переменные:
Файл — ссылка на файл, который мы заполняем.РезультатОбработки — переменная, в которую скрипт должен вернуть значение (строку, число или таблицу значений, в зависимости от контекста).Чтобы добраться до данных документа, мы используем конструкцию Файл.Владелец. Владельцем файла является сам внутренний документ.
Самое сложное и важное — правильно написать запрос к базе данных прямо в поле скрипта настройки. Мы должны обратиться к табличной части документа-владельца.
Предположим, у нас есть табличная часть Товары с реквизитами Номенклатура, Количество и Цена. Давайте напишем код, который сформирует таблицу значений для заполнения.
// Создаем запрос для выборки данных из табличной части документа
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокТовары.НомерСтроки КАК НомерСтроки,
| ДокТовары.Номенклатура.Наименование КАК Товар,
| ДокТовары.Количество КАК Количество,
| ДокТовары.Цена КАК Цена,
| ДокТовары.Сумма КАК Сумма
|ИЗ
| Справочник.ВнутренниеДокументы.Товары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Владелец";
// Устанавливаем параметр &Владелец, обращаясь к владельцу файла
Запрос.УстановитьПараметр("Владелец", Файл.Владелец);
// Выполняем запрос и выгружаем результат в Таблицу Значений
Результат = Запрос.Выполнить().Выгрузить();
// Возвращаем результат для системы автозаполнения
РезультатОбработки = Результат;
Обратите внимание на важные детали:
Справочник.ВнутренниеДокументы.Товары). Уточните точный путь к метаданным в вашей конфигурации.РезультатОбработки — это именно то, что ждет 1С:ДО от скрипта. Если мы заполняем простую ячейку, там должна быть строка. Если мы заполняем группу (таблицу), там должна быть коллекция данных (ТаблицаЗначений или Массив структур).В обсуждении (сообщение 12) упоминалась функция ВыполнитьЗаменуПолейИСтрокВДокументе. Давайте разберем, что это и как это применить.
Эта функция, как и похожие методы (например, ЗаполнитьФайлПоШаблону), находится в общих модулях конфигурации. Она предназначена для вызова из программного кода (в Конфигураторе), если вы пишете внешнюю обработку или расширение. В пользовательском скрипте (в режиме Предприятия) прямой вызов серверных процедур общего модуля может быть ограничен правами или режимом безопасного выполнения кода.
Однако, если вы хотите использовать возможности встроенного языка по максимуму и у вас есть доступ к изменению скриптов, вы можете использовать стандартные библиотеки БСП (Библиотека Стандартных Подсистем), встроенные в ДО.
Для корректной работы с таблицами в скрипте правила заполнения (для Word/Excel) часто достаточно просто вернуть таблицу значений, имена колонок которой (Товар, Количество) совпадают с именами полей в шаблоне ({Товар}, {Количество}).
Вернемся к проблеме автора с форматом MXL. Если вы категорически настроены использовать этот формат, подход через пользовательский интерфейс «Настройка заполнения файла» может не сработать для табличных частей так гладко, как для Word/Excel.
Для MXL обычно применяется следующий подход через Конфигуратор:
MXL в дереве метаданных (или используется файл).ОбластьШапка, ОбластьСтрока, ОбластьПодвал.
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("НужныйМакет");
// Вывод шапки
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Заполнить(ДанныеДокумента);
ТабДок.Вывести(Область);
// Цикл по строкам таблицы
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого ТекСтрока Из ДанныеДокумента.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(ТекСтрока);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Именно поэтому участники обсуждения советовали «написать пару строчек в Конфигураторе». Автозаполнение MXL через пользовательские настройки 1С:ДО сильно ограничено и часто сводится только к замене одиночных параметров, без возможности динамического добавления строк. Для решения этой проблемы можно использовать готовое решение для автозаполнения шаблонов файлов MXL.
Давайте подведем итог и сформируем план действий для решения вашей проблемы:
.xlsx (Excel). Это позволит использовать штатный механизм заполнения таблиц без программирования в Конфигураторе.Запрос и Файл.Владелец, чтобы получить данные табличной части и вернуть их в переменную РезультатОбработки.Такой подход позволит вам гибко управлять данными, попадающими в печатную форму, оставаясь в рамках типового функционала 1С:Документооборот и не усложняя поддержку системы.