Рассмотрим ситуацию, с которой часто сталкиваются разработчики при доработке конфигураций в облачном сервисе 1С:Фреш (например, в базе 1С:Бухгалтерия). Задача звучит так: необходимо по доработанной кнопке в расширении формировать заполненный табличный документ, используя макет, который пользователь самостоятельно отредактировал и сохранил в регистре сведений ПользовательскиеМакетыПечати (или справочнике МакетыПечатныхФорм). Однако при попытке программно получить этот макет и вывести его на экран, табличный документ формируется абсолютно пустым.
Разберем по шагам, почему возникает эта ошибка, какие ограничения накладывает облачная инфраструктура, и как правильно реализовать программный вывод пользовательского макета.
Проанализируем механизм работы платформы с макетами. Основные причины получения пустого результата:
При работе в облаке необходимо учитывать строгие требования безопасности. Рассмотрим подробнее, что нужно помнить разработчику:
ПФ_MXL_ИмяМакета). Иначе этот макет просто не появится в рабочем месте пользователя для редактирования.Посмотрим на правильный подход к сборке печатной формы с учетом пользовательских изменений. Процесс генерации итогового документа необходимо прописывать с использованием стандартных программных интерфейсов БСП.
Для корректного получения актуального макета (с учетом того, что пользователь мог его отредактировать) следует использовать метод БСП:
УправлениеПечатью.МакетПечатнойФормы(ПолныйПутьКМакету)
Эта функция самостоятельно проверит регистр пользовательских макетов. Если макет был изменен пользователем, она вернет измененную версию. Если правок не было — вернет стандартный макет из метаданных.
Далее процесс сборки необходимо прописать так:
Найти() на случай, если пользователь удалил нужную строку.ЗаполнитьЗначенияСвойств().Посмотрим на пример безопасного заполнения параметров макета:
// Безопасное заполнение параметров без ошибок исполнения,
// если пользователь удалил параметр из макета
ЗаполнитьЗначенияСвойств(ТекОбласть.Параметры, СтруктураДанныхИсточника);
ТабличныйДокумент.Вывести(ТекОбласть);
В отличие от прямого присвоения (например, ТекОбласть.Параметры.Организация = Данные.Организация), использование ЗаполнитьЗначенияСвойств() не вызовет критической ошибки, если параметр "Организация" отсутствует в пользовательском варианте макета.
Если ручная сборка табличного документа кажется избыточной, разберем альтернативные подходы, которые лучше интегрируются с типовой конфигурацией:
1. Интеграция в типовую подсистему печати БСП через расширение.
Вместо того чтобы программировать отдельную произвольную кнопку на форме, добавьте команду печати программно. Для этого в расширении необходимо переопределить процедуру ДобавитьКомандыПечати в модуле менеджера объекта. Саму логику получения данных разместите в процедуре Печать менеджера. При таком подходе типовые механизмы БСП сами позаботятся о поиске пользовательского макета, формировании задания на печать и выводе формы на экран пользователя.
2. Заимствование макета.
Если нужный макет уже существует в типовой конфигурации, заимствуйте его в свое расширение с правилом «Объединять» или «Замещать». Платформа сможет автоматически применять как ваши доработки из расширения, так и пользовательские изменения из базы.
3. Использование офисных документов (Word / DOCX).
БСП отлично поддерживает пользовательские макеты в формате DOCX. Этот вариант требует гораздо меньше ручной работы со структурой. Вам достаточно передать шаблон и структуру данных в метод УправлениеПечатью.СформироватьОфисныйДокумент(). Платформа самостоятельно найдет теги в документе формата {v8 ИмяПараметра} и заменит их на значения из вашей структуры. Это особенно удобно для сложных договоров или кадровых приказов, где табличный документ проигрывает по возможностям форматирования текста.