Как вывести массив данных в печатную форму Word через БСП?

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

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

Разбор проблемы: почему массив не выводится?

Проанализируем представленный в вопросе код. Автор создает массив КириллМассив и заполняет его обычными строками текста:


Ии = Ии + 1;
КириллМассив.Вставить(Ии, СтрокаДляВывода);

Затем этот массив передается в стандартную функцию БСП для заполнения области макета:


Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Массив"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеОбъекта.КириллМассив);

Основная причина ошибки заключается в том, что метод ПрисоединитьИЗаполнитьКоллекцию ожидает в качестве третьего параметра массив структур, а не массив строк. Механизм БСП работает по принципу сопоставления: он берет каждый элемент массива (структуру), ищет в ней ключи и подставляет их значения в соответствующие поля подстановки в файле Word. Если передать массив строк, система не сможет найти в них именованные параметры, и область останется пустой.

Шаг 1: Правильная подготовка данных в коде

Выясним, как изменить формирование массива, чтобы данные начали выводиться. Вместо добавления строки текста, нам нужно создать структуру, где имя ключа совпадает с именем параметра в макете Word (например, ТекстСтроки).

Рассмотрим исправленный фрагмент цикла заполнения:


// Создаем пустой массив для коллекции структур
КириллМассив = Новый Массив;

Для Каждого Должность Из СписокДолжностей Цикл
    // ... логика формирования переменной СтрокаДляВывода ...
    
    // ПРАВИЛЬНО: Создаем структуру и добавляем ее в массив
    НоваяСтрокаКоллекции = Новый Структура;
    НоваяСтрокаКоллекции.Вставить("ТекстСтроки", СтрокаДляВывода); 
    
    КириллМассив.Добавить(НоваяСтрокаКоллекции);
КонецЦикла;

Теперь КириллМассив содержит объекты, понятные программному интерфейсу печати. Обратите внимание, что если вы выводите таблицу с несколькими колонками, в структуру нужно добавить все соответствующие ключи.

Шаг 2: Настройка макета Word (DOCX)

Проанализируем настройки самого файла Word. Чтобы БСП «поняла», куда именно выводить коллекцию, в макете должны быть выполнены два условия:

  1. Закладка (Bookmark): Вся область, которая должна повторяться (например, строка таблицы или абзац), должна быть выделена и помещена в закладку с именем, указанным в ОписаниеОбластей (в нашем примере это «Массив»).
  2. Поля подстановки: Внутри этой закладки должен находиться текст-заполнитель в формате {v ИмяПараметра}.

Если в коде мы использовали ключ структуры ТекстСтроки, то в Word внутри закладки «Массив» нужно написать: {v ТекстСтроки}. Важно следить за регистром имен параметров, так как в некоторых версиях БСП это имеет значение.

Шаг 3: Описание областей макета

Для вывода коллекций (таблиц) крайне важно правильно инициализировать описание областей. В коде автора это выглядит так:


УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Массив", "СтрокаТаблицы");

Тип области "СтрокаТаблицы" указывает системе, что данная область в Word должна дублироваться столько раз, сколько элементов находится в переданном массиве. Если закладка в Word установлена на всю строку таблицы целиком, то при печати будет создано столько новых строк, сколько структур мы добавили в КириллМассив.

Полный пример исправленной функции

Посмотрим на упрощенный и структурированный пример функции, который гарантированно выводит список данных в Word:


Функция СформироватьПечатнуюФорму(Ссылка)
    
    МакетДокумента = УправлениеПечатью.МакетПечатнойФормы("Документ.ВашДокумент.ПФ_DOC_Макет");
    Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДокумента, Неопределено);
    
    ОписаниеОбластей = Новый Структура;
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Заголовок", "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ТаблицаСотрудников", "СтрокаТаблицы");
    
    ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет);
    
    // Данные шапки
    ДанныеШапки = Новый Структура("Номер, Дата", Ссылка.Номер, Формат(Ссылка.Дата, "ДЛФ=D"));
    
    // Формируем коллекцию для таблицы
    КоллекцияДляВывода = Новый Массив;
    Для Каждого СтрТЧ Из Ссылка.Сотрудники Цикл
        СтруктураСтроки = Новый Структура;
        СтруктураСтроки.Вставить("ФИО", СтрТЧ.Сотрудник.Наименование);
        СтруктураСтроки.Вставить("Должность", СтрТЧ.Должность.Наименование);
        КоллекцияДляВывода.Добавить(СтруктураСтроки);
    КонецЦикла;
    
    // Вывод шапки
    Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Заголовок"]);
    УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапки);
    
    // Вывод таблицы (массива структур)
    Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["ТаблицаСотрудников"]);
    УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, КоллекцияДляВывода);
    
    АдресХранилища = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
    
    УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма);
    УправлениеПечатью.ОчиститьСсылки(Макет);
    
    Возврат АдресХранилища;
    
КонецФункции

Рекомендации по отладке

Если после всех исправлений данные все равно не выводятся, рекомендуем выполнить следующие действия:

  1. Проверка точки останова: Остановите выполнение кода перед вызовом ПрисоединитьИЗаполнитьКоллекцию и убедитесь, что ваш массив не пустой и содержит именно структуры.
  2. Имена закладок: Откройте макет Word, перейдите на вкладку «Вставка» -> «Закладка» и проверьте, что область с нужным именем действительно существует и охватывает нужный текст.
  3. Спецсимволы: В тексте сообщения автор использует Символы.ПС. Word нормально воспринимает переносы строк внутри структуры, но убедитесь, что они не разрывают саму конструкцию поля подстановки {v ...}.
  4. Тип области: Если вы выводите не строку таблицы, а просто повторяющиеся абзацы текста, убедитесь, что тип области в ДобавитьОписаниеОбласти указан верно (обычно используется "Строка" или "Общая" в зависимости от версии БСП).

Проанализировав ситуацию, можно сделать вывод: успех вывода массива в Word зависит от строгого соответствия имен в трех местах: Ключ структуры в 1С = Имя параметра в поле {v...} в Word, а также Имя области в коде = Имя закладки в Word. Использование массива структур вместо массива строк — ключевое требование стандарта БСП.

← На главную