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