При разработке печатных форм в формате Word (DOCX) с использованием Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с ситуацией, когда данные из табличной части или произвольного массива не отображаются в готовом документе. Рассмотрим эту проблему на примере кода, использующего функции общего модуля УправлениеПечатью, и разберем, как правильно подготовить данные и макет для корректного вывода.
Проанализируем представленный в вопросе код. Автор создает массив КириллМассив и заполняет его обычными строками текста:
Ии = Ии + 1;
КириллМассив.Вставить(Ии, СтрокаДляВывода);
Затем этот массив передается в стандартную функцию БСП для заполнения области макета:
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Массив"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеОбъекта.КириллМассив);
Основная причина ошибки заключается в том, что метод ПрисоединитьИЗаполнитьКоллекцию ожидает в качестве третьего параметра массив структур, а не массив строк. Механизм БСП работает по принципу сопоставления: он берет каждый элемент массива (структуру), ищет в ней ключи и подставляет их значения в соответствующие поля подстановки в файле Word. Если передать массив строк, система не сможет найти в них именованные параметры, и область останется пустой.
Выясним, как изменить формирование массива, чтобы данные начали выводиться. Вместо добавления строки текста, нам нужно создать структуру, где имя ключа совпадает с именем параметра в макете Word (например, ТекстСтроки).
Рассмотрим исправленный фрагмент цикла заполнения:
// Создаем пустой массив для коллекции структур
КириллМассив = Новый Массив;
Для Каждого Должность Из СписокДолжностей Цикл
// ... логика формирования переменной СтрокаДляВывода ...
// ПРАВИЛЬНО: Создаем структуру и добавляем ее в массив
НоваяСтрокаКоллекции = Новый Структура;
НоваяСтрокаКоллекции.Вставить("ТекстСтроки", СтрокаДляВывода);
КириллМассив.Добавить(НоваяСтрокаКоллекции);
КонецЦикла;
Теперь КириллМассив содержит объекты, понятные программному интерфейсу печати. Обратите внимание, что если вы выводите таблицу с несколькими колонками, в структуру нужно добавить все соответствующие ключи.
Проанализируем настройки самого файла Word. Чтобы БСП «поняла», куда именно выводить коллекцию, в макете должны быть выполнены два условия:
ОписаниеОбластей (в нашем примере это «Массив»).{v ИмяПараметра}.Если в коде мы использовали ключ структуры ТекстСтроки, то в Word внутри закладки «Массив» нужно написать: {v ТекстСтроки}. Важно следить за регистром имен параметров, так как в некоторых версиях БСП это имеет значение.
Для вывода коллекций (таблиц) крайне важно правильно инициализировать описание областей. В коде автора это выглядит так:
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Массив", "СтрокаТаблицы");
Тип области "СтрокаТаблицы" указывает системе, что данная область в Word должна дублироваться столько раз, сколько элементов находится в переданном массиве. Если закладка в Word установлена на всю строку таблицы целиком, то при печати будет создано столько новых строк, сколько структур мы добавили в КириллМассив.
Посмотрим на упрощенный и структурированный пример функции, который гарантированно выводит список данных в Word:
Функция СформироватьПечатнуюФорму(Ссылка)
МакетДокумента = УправлениеПечатью.МакетПечатнойФормы("Документ.ВашДокумент.ПФ_DOC_Макет");
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДокумента, Неопределено);
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Заголовок", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ТаблицаСотрудников", "СтрокаТаблицы");
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет);
// Данные шапки
ДанныеШапки = Новый Структура("Номер, Дата", Ссылка.Номер, Формат(Ссылка.Дата, "ДЛФ=D"));
// Формируем коллекцию для таблицы
КоллекцияДляВывода = Новый Массив;
Для Каждого СтрТЧ Из Ссылка.Сотрудники Цикл
СтруктураСтроки = Новый Структура;
СтруктураСтроки.Вставить("ФИО", СтрТЧ.Сотрудник.Наименование);
СтруктураСтроки.Вставить("Должность", СтрТЧ.Должность.Наименование);
КоллекцияДляВывода.Добавить(СтруктураСтроки);
КонецЦикла;
// Вывод шапки
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Заголовок"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапки);
// Вывод таблицы (массива структур)
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["ТаблицаСотрудников"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, КоллекцияДляВывода);
АдресХранилища = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма);
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат АдресХранилища;
КонецФункции
Если после всех исправлений данные все равно не выводятся, рекомендуем выполнить следующие действия:
ПрисоединитьИЗаполнитьКоллекцию и убедитесь, что ваш массив не пустой и содержит именно структуры.Символы.ПС. Word нормально воспринимает переносы строк внутри структуры, но убедитесь, что они не разрывают саму конструкцию поля подстановки {v ...}.ДобавитьОписаниеОбласти указан верно (обычно используется "Строка" или "Общая" в зависимости от версии БСП).Проанализировав ситуацию, можно сделать вывод: успех вывода массива в Word зависит от строгого соответствия имен в трех местах: Ключ структуры в 1С = Имя параметра в поле {v...} в Word, а также Имя области в коде = Имя закладки в Word. Использование массива структур вместо массива строк — ключевое требование стандарта БСП.