Как программно заполнить и вывести пользовательский макет печати в 1С:Фреш?

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

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

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

Выясним причину: почему документ формируется пустым?

Проанализируем механизм работы платформы с макетами. Основные причины получения пустого результата:

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

Ограничения платформы и особенности работы во 1С:Фреш

При работе в облаке необходимо учитывать строгие требования безопасности. Рассмотрим подробнее, что нужно помнить разработчику:

  1. В базах 1С:Фреш расширения запускаются в строгом безопасном профиле. Любые нетиповые схемы генерации печатных форм, прямое обращение к файловой системе сервера или использование COM-соединений будут заблокированы системой и не пройдут аудит. Как справедливо отмечено в обсуждении, иногда проще и надежнее сделать стандартную внешнюю печатную форму, которая пройдет аудит сервиса.
  2. Механизм пользовательских макетов Библиотеки стандартных подсистем (БСП) жестко привязан к форматам внутренних идентификаторов. Если вы создаете новый макет в расширении, он обязан соответствовать правилам именования подсистемы печати (например, иметь префикс ПФ_MXL_ИмяМакета). Иначе этот макет просто не появится в рабочем месте пользователя для редактирования.

Проверенные способы решения и правильный алгоритм вывода

Посмотрим на правильный подход к сборке печатной формы с учетом пользовательских изменений. Процесс генерации итогового документа необходимо прописывать с использованием стандартных программных интерфейсов БСП.

Для корректного получения актуального макета (с учетом того, что пользователь мог его отредактировать) следует использовать метод БСП:

УправлениеПечатью.МакетПечатнойФормы(ПолныйПутьКМакету)

Эта функция самостоятельно проверит регистр пользовательских макетов. Если макет был изменен пользователем, она вернет измененную версию. Если правок не было — вернет стандартный макет из метаданных.

Далее процесс сборки необходимо прописать так:

  1. Создать новый пустой результирующий табличный документ.
  2. Получать области из извлеченного макета-шаблона.
  3. Обязательно проверять наличие областей в макете методом Найти() на случай, если пользователь удалил нужную строку.
  4. Заполнять параметры безопасным способом с помощью метода ЗаполнитьЗначенияСвойств().

Посмотрим на пример безопасного заполнения параметров макета:


// Безопасное заполнение параметров без ошибок исполнения, 
// если пользователь удалил параметр из макета
ЗаполнитьЗначенияСвойств(ТекОбласть.Параметры, СтруктураДанныхИсточника);
ТабличныйДокумент.Вывести(ТекОбласть);

В отличие от прямого присвоения (например, ТекОбласть.Параметры.Организация = Данные.Организация), использование ЗаполнитьЗначенияСвойств() не вызовет критической ошибки, если параметр "Организация" отсутствует в пользовательском варианте макета.

Альтернативные варианты реализации печати

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

1. Интеграция в типовую подсистему печати БСП через расширение.
Вместо того чтобы программировать отдельную произвольную кнопку на форме, добавьте команду печати программно. Для этого в расширении необходимо переопределить процедуру ДобавитьКомандыПечати в модуле менеджера объекта. Саму логику получения данных разместите в процедуре Печать менеджера. При таком подходе типовые механизмы БСП сами позаботятся о поиске пользовательского макета, формировании задания на печать и выводе формы на экран пользователя.

2. Заимствование макета.
Если нужный макет уже существует в типовой конфигурации, заимствуйте его в свое расширение с правилом «Объединять» или «Замещать». Платформа сможет автоматически применять как ваши доработки из расширения, так и пользовательские изменения из базы.

3. Использование офисных документов (Word / DOCX).
БСП отлично поддерживает пользовательские макеты в формате DOCX. Этот вариант требует гораздо меньше ручной работы со структурой. Вам достаточно передать шаблон и структуру данных в метод УправлениеПечатью.СформироватьОфисныйДокумент(). Платформа самостоятельно найдет теги в документе формата {v8 ИмяПараметра} и заменит их на значения из вашей структуры. Это особенно удобно для сложных договоров или кадровых приказов, где табличный документ проигрывает по возможностям форматирования текста.

← На главную