При работе с типовыми конфигурациями, такими как 1С:Розница 2.3 или 1С:Управление торговлей 11, часто возникает задача кастомизации ценников. Одной из самых популярных задач является добавление дополнительных расчетных цен (например, цена по акции, цена со скидкой 5%, 10% и т.д.). Однако разработчики часто сталкиваются с ситуацией: поле в схему компоновки данных (СКД) добавлено, а в визуальном редакторе шаблонов оно так и не появилось. Рассмотрим подробно, почему это происходит и как правильно решить эту задачу.
Разберем архитектуру механизма печати этикеток. В системе существует справочник ХранилищеШаблонов (в некоторых версиях — ШаблоныЭтикетокИЦенников), который отвечает за хранение и редактирование макетов. Когда мы открываем редактор макета, система обращается к типовой обработке ПечатьЭтикетокИЦенников для получения списка доступных полей.
Проанализируем основные причины «невидимости» новых полей:
Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет(...). Если вы просто сохранили обработку как внешнюю и изменили ее, система об этом «не знает» и продолжает брать структуру полей из основной конфигурации.ПечатьЭтикетокИЦенников существует несколько макетов СКД. Один используется для формирования дерева полей в редакторе (обычно называется ПоляШаблона...), а другой — для фактического сбора данных при печати.Рассмотрим пример добавления поля ЦенаСоСкидкой2. Сначала нам необходимо внести изменения в запрос макета, который отвечает за предоставление полей редактору. Выясним, какой именно макет нам нужен. В 1С:Розница для акционных ценников это макет ПоляШаблонаЦенникАкционный.
Нам нужно отредактировать текст запроса в СКД, добавив вычисляемое выражение. Посмотрим на пример кода запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
...
ВЫРАЗИТЬ(МАКСИМУМ(ЦеныНоменклатуры.Цена * 0.97) КАК ЧИСЛО(15, 2)) КАК ЦенаСоСкидкой,
// Наше новое поле:
ВЫРАЗИТЬ(МАКСИМУМ(ЦеныНоменклатуры.Цена * 0.95) КАК ЧИСЛО(15, 2)) КАК ЦенаСоСкидкой2,
...
{ВЫБРАТЬ
ЦенаСоСкидкой,
ЦенаСоСкидкой2, // Обязательно добавляем в поле выбора СКД
...
Важный момент: Если вы хотите избежать сложного редактирования текста запроса, вы можете добавить поле на закладку Вычисляемые поля в СКД. В колонке «Путь к данным» укажите ЦенаСоСкидкой2, а в колонке «Выражение» — Цена * 0.95. Это более гибкий способ, который сохранит читаемость основного запроса.
Теперь разберем самую важную часть, которую часто упускают. Даже после правки СКД поле не появится в списке доступных, пока мы не добавим его в процедуру заполнения полей. В модуле менеджера или модуле объекта обработки ПечатьЭтикетокИЦенников (в зависимости от версии конфигурации) найдем процедуру ЗаполнитьДоступныеПоля() или аналогичную ей.
В этой процедуре происходит инициализация массива имен. Нам нужно найти блок, отвечающий за нужный нам тип шаблона, и добавить туда наше поле. Рассмотрим пример реализации:
ИначеЕсли Объект.Назначение = Перечисления.НазначенияШаблоновЭтикетокИЦенников.ЦенникДляТоваров Тогда
ИменаПолей = Новый Массив;
ИменаПолей.Добавить("Штрихкод");
ИменаПолей.Добавить("Цена");
ИменаПолей.Добавить("ЦенаСоСкидкой");
// Добавляем наше новое поле в список разрешенных для интерфейса:
ИменаПолей.Добавить("ЦенаСоСкидкой2");
...
КонецЕсли;
Без этой строки кода редактор макетов просто проигнорирует наличие поля в схеме компоновки данных.
Поскольку автор темы справедливо заметил, что использование внешнего файла обработки не всегда удобно (так как типовой справочник все равно обращается к встроенной обработке), наиболее правильным методом будет использование Расширения конфигурации. Это позволит нам не снимать основную конфигурацию с поддержки и корректно внедрить изменения.
Разберем по шагам процесс создания расширения:
ПечатьЭтикетокИЦенников.ПоляШаблонаЦенникАкционный) и внесем в него правки, описанные в Шаге 1.&Вместо или &После.Если мы хотим перехватить получение макета, код в расширении может выглядеть так:
&Вместо("ПолучитьМакет")
Функция Расш1_ПолучитьМакет(ИмяМакета)
Если ИмяМакета = "ПоляШаблонаЦенникАкционный" Тогда
// Возвращаем макет именно из нашего расширения
Возврат ЭтотОбъект.ПолучитьМакет(ИмяМакета);
КонецЕсли;
ПродолжитьВызов(ИмяМакета);
КонецФункции
Для успешного добавления нового расчетного поля в ценник необходимо выполнить три условия:
После выполнения этих действий и перезапуска сеанса (кэш макетов иногда требует перезахода в программу), новое поле ЦенаСоСкидкой2 появится в списке доступных полей, и его можно будет просто перетащить мышкой в нужную область вашего ценника.