При разработке расширений для конфигурации 1С:Розница 2.3 программисты часто сталкиваются с задачей модификации печатных форм ценников или этикеток. Особенность этой конфигурации заключается в том, что шаблоны ценников не хранятся как обычные макеты объектов метаданных. Они являются элементами справочника ХранилищеШаблонов и хранятся в специальном поле в бинарном виде. В этой статье мы подробно разберем, как получить доступ к этим данным, извлечь из них табличный документ и корректно прописать в него данные.
Для начала проанализируем ситуацию: пользователь создает шаблон в интерфейсе программы, и нам нужно получить к нему доступ из кода расширения. Справочник ХранилищеШаблонов содержит реквизит Шаблон. Если мы просто обратимся к нему через точку, например Справочники.ХранилищеШаблонов.НайтиПоНаименованию("МойЦенник").Шаблон, мы получим объект типа ХранилищеЗначения. Это "контейнер", из которого данные нужно еще извлечь.
Важно понимать, что внутри этого хранилища в Рознице 2.3 (и других конфигурациях на базе БСП) лежит не просто табличный документ, а зачастую Структура. Рассмотрим типичный состав этой структуры:
ТабличныйДокумент, который мы видим в редакторе.Рассмотрим по шагам, как программно добраться до самого макета. Мы будем использовать метод Получить() для извлечения данных из ХранилищеЗначения. Выясним, как правильно обработать полученный объект, так как его тип может зависеть от версии конфигурации или способа создания шаблона.
// 1. Находим ссылку на нужный шаблон
СсылкаНаШаблон = Справочники.ХранилищеШаблонов.НайтиПоНаименованию("МАКЕТ_ВЕСМЕСТО");
Если СсылкаНаШаблон.Пустая() Тогда
Сообщить("Шаблон не найден!");
Возврат;
КонецЕсли;
// 2. Получаем данные из реквизита Шаблон (тип ХранилищеЗначения)
ОбъектИзХранилища = СсылкаНаШаблон.Шаблон.Получить();
// 3. Проверяем, что именно мы получили
ТабДок = Неопределено;
Если ТипЗнч(ОбъектИзХранилища) = Тип("Структура") Тогда
// В большинстве случаев в Рознице 2.3 там структура
Если ОбъектИзХранилища.Свойство("Макет") Тогда
ТабДок = ОбъектИзХранилища.Макет;
ИначеЕсли ОбъектИзХранилища.Свойство("РедакторТабличныйДокумент") Тогда
ТабДок = ОбъектИзХранилища.РедакторТабличныйДокумент;
КонецЕсли;
ИначеЕсли ТипЗнч(ОбъектИзХранилища) = Тип("ТабличныйДокумент") Тогда
// Иногда (в старых версиях) макет лежит напрямую
ТабДок = ОбъектИзХранилища;
КонецЕсли;
После выполнения этого кода в переменной ТабДок будет находиться полноценный табличный документ, с которым можно работать стандартными средствами платформы 1С.
Вместо того чтобы вручную разбирать структуру хранилища, мы рекомендуем использовать встроенные механизмы типовой конфигурации. В 1С:Розница 2.3 существует общий модуль, который инкапсулирует логику работы с шаблонами. Это наиболее надежный способ, так как он учитывает все внутренние зависимости системы.
Разберем пример использования системной функции:
// Используем штатный метод для получения данных
ДанныеШаблона = ШаблоныЭтикетокИЦенников.ПолучитьДанныеШаблона(СсылкаНаШаблон);
Если ДанныеШаблона <> Неопределено Тогда
// Обращаемся к макету через свойство структуры
ТабДок = ДанныеШаблона.Макет;
// Теперь мы можем работать с областями
Область = ТабДок.ПолучитьОбласть("Строка");
КонецЕсли;
Преимущество этого метода в том, что функция ПолучитьДанныеШаблона уже содержит все необходимые проверки типов и гарантирует возврат корректной структуры, готовой для печати или редактирования.
Проанализируем ситуацию, когда нам нужно прописать свои данные в макет. В Рознице 2.3 параметры в макетах ценников часто оформляются не как стандартные параметры 1С (через заполнение в свойствах ячейки), а как текстовые вставки вида [Наименование] или [Цена]. Это связано с использованием механизма компоновки данных (СКД).
Если вы хотите программно заполнить параметры в полученном макете, вам нужно учитывать следующее:
"Строка" или "ОбластьДанных".Параметры табличного документа.Шаблон.Пример заполнения области данными:
// Получаем область из макета
ОбластьЦенника = ТабДок.ПолучитьОбласть("Строка");
// Заполняем параметры напрямую
ОбластьЦенника.Параметры.Наименование = "Диван Маргарита";
ОбластьЦенника.Параметры.Цена = 15000;
ОбластьЦенника.Параметры.Артикул = "АРТ-001";
// Выводим заполненную область в итоговый документ
РезультатПечати.Вывести(ОбластьЦенника);
При написании кода в расширении необходимо убедиться, что все используемые объекты заимствованы правильно. Выясним основные моменты:
ХранилищеШаблонов добавлен в расширение. Если вы используете программное обращение к перечислениям (например, Перечисления.ТипыШаблонов.Ценник), они также должны быть в расширении.ШаблоныЭтикетокИЦенников, проверьте, доступен ли он в контексте (Сервер/Клиент), где выполняется ваш код.Получить() доступен только на стороне сервера.Если ваша задача — изменить сам макет в справочнике (например, добавить логотип во все существующие ценники), вам нужно выполнить обратную операцию: извлечь структуру, изменить ТабличныйДокумент, поместить его обратно в структуру и записать структуру в ХранилищеЗначения реквизита справочника, после чего вызвать Объект.Записать().
Таким образом, мы рассмотрели полный цикл работы с макетами ценников в 1С:Розница 2.3. Понимание того, что макет скрыт внутри структуры в ХранилищеЗначения, позволяет быстро решить проблему доступа к данным и эффективно использовать возможности расширений для кастомизации процесса печати.