Как добавить новые вычисляемые поля в шаблон ценника в 1С:Розница 2.3

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При работе с типовыми конфигурациями, такими как 1С:Розница 2.3 или 1С:Управление торговлей 11, часто возникает задача кастомизации ценников. Одной из самых популярных задач является добавление дополнительных расчетных цен (например, цена по акции, цена со скидкой 5%, 10% и т.д.). Однако разработчики часто сталкиваются с ситуацией: поле в схему компоновки данных (СКД) добавлено, а в визуальном редакторе шаблонов оно так и не появилось. Рассмотрим подробно, почему это происходит и как правильно решить эту задачу.

Почему изменения во внешней обработке не отображаются в шаблонах?

Разберем архитектуру механизма печати этикеток. В системе существует справочник ХранилищеШаблонов (в некоторых версиях — ШаблоныЭтикетокИЦенников), который отвечает за хранение и редактирование макетов. Когда мы открываем редактор макета, система обращается к типовой обработке ПечатьЭтикетокИЦенников для получения списка доступных полей.

Проанализируем основные причины «невидимости» новых полей:

  1. Жесткая привязка к метаданным: Справочник шаблонов программно вызывает встроенную в конфигурацию обработку по имени: Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет(...). Если вы просто сохранили обработку как внешнюю и изменили ее, система об этом «не знает» и продолжает брать структуру полей из основной конфигурации.
  2. Программная фильтрация полей: Даже если система прочитала вашу СКД, список полей, которые вы видите слева в редакторе, формируется специальной процедурой в коде. Если поле не добавлено в специальный массив имен полей, оно будет отсечено интерфейсом.
  3. Разделение макетов: В обработке ПечатьЭтикетокИЦенников существует несколько макетов СКД. Один используется для формирования дерева полей в редакторе (обычно называется ПоляШаблона...), а другой — для фактического сбора данных при печати.

Шаг 1: Изменение схемы компоновки данных (СКД)

Рассмотрим пример добавления поля ЦенаСоСкидкой2. Сначала нам необходимо внести изменения в запрос макета, который отвечает за предоставление полей редактору. Выясним, какой именно макет нам нужен. В 1С:Розница для акционных ценников это макет ПоляШаблонаЦенникАкционный.

Нам нужно отредактировать текст запроса в СКД, добавив вычисляемое выражение. Посмотрим на пример кода запроса:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ...
    ВЫРАЗИТЬ(МАКСИМУМ(ЦеныНоменклатуры.Цена * 0.97) КАК ЧИСЛО(15, 2)) КАК ЦенаСоСкидкой,
    // Наше новое поле:
    ВЫРАЗИТЬ(МАКСИМУМ(ЦеныНоменклатуры.Цена * 0.95) КАК ЧИСЛО(15, 2)) КАК ЦенаСоСкидкой2,
    ...
{ВЫБРАТЬ
    ЦенаСоСкидкой,
    ЦенаСоСкидкой2, // Обязательно добавляем в поле выбора СКД
    ...

Важный момент: Если вы хотите избежать сложного редактирования текста запроса, вы можете добавить поле на закладку Вычисляемые поля в СКД. В колонке «Путь к данным» укажите ЦенаСоСкидкой2, а в колонке «Выражение» — Цена * 0.95. Это более гибкий способ, который сохранит читаемость основного запроса.

Шаг 2: Регистрация поля в программном коде

Теперь разберем самую важную часть, которую часто упускают. Даже после правки СКД поле не появится в списке доступных, пока мы не добавим его в процедуру заполнения полей. В модуле менеджера или модуле объекта обработки ПечатьЭтикетокИЦенников (в зависимости от версии конфигурации) найдем процедуру ЗаполнитьДоступныеПоля() или аналогичную ей.

В этой процедуре происходит инициализация массива имен. Нам нужно найти блок, отвечающий за нужный нам тип шаблона, и добавить туда наше поле. Рассмотрим пример реализации:


ИначеЕсли Объект.Назначение = Перечисления.НазначенияШаблоновЭтикетокИЦенников.ЦенникДляТоваров Тогда
    
    ИменаПолей = Новый Массив;
    ИменаПолей.Добавить("Штрихкод");
    ИменаПолей.Добавить("Цена");
    ИменаПолей.Добавить("ЦенаСоСкидкой");
    // Добавляем наше новое поле в список разрешенных для интерфейса:
    ИменаПолей.Добавить("ЦенаСоСкидкой2"); 
    
    ...
КонецЕсли;

Без этой строки кода редактор макетов просто проигнорирует наличие поля в схеме компоновки данных.

Шаг 3: Реализация через расширение конфигурации

Поскольку автор темы справедливо заметил, что использование внешнего файла обработки не всегда удобно (так как типовой справочник все равно обращается к встроенной обработке), наиболее правильным методом будет использование Расширения конфигурации. Это позволит нам не снимать основную конфигурацию с поддержки и корректно внедрить изменения.

Разберем по шагам процесс создания расширения:

  1. Создадим новое расширение и снимем галочку «Безопасный режим».
  2. Добавим в расширение обработку ПечатьЭтикетокИЦенников.
  3. Добавим в расширение нужный макет СКД (например, ПоляШаблонаЦенникАкционный) и внесем в него правки, описанные в Шаге 1.
  4. Заимствуем процедуру, отвечающую за получение макета или заполнение полей. Используем аннотацию &Вместо или &После.

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


&Вместо("ПолучитьМакет")
Функция Расш1_ПолучитьМакет(ИмяМакета)
    Если ИмяМакета = "ПоляШаблонаЦенникАкционный" Тогда
        // Возвращаем макет именно из нашего расширения
        Возврат ЭтотОбъект.ПолучитьМакет(ИмяМакета);
    КонецЕсли;
    
    ПродолжитьВызов(ИмяМакета);
КонецФункции

Подведем итоги

Для успешного добавления нового расчетного поля в ценник необходимо выполнить три условия:

  1. Обновить запрос или вычисляемые поля в макете СКД, который используется для вывода доступных полей.
  2. Программно добавить имя поля в массив доступных полей в коде обработки.
  3. Обеспечить использование именно вашей измененной логики (лучше всего через механизм расширений), так как типовые формы справочников обращаются к встроенным объектам конфигурации напрямую.

После выполнения этих действий и перезапуска сеанса (кэш макетов иногда требует перезахода в программу), новое поле ЦенаСоСкидкой2 появится в списке доступных полей, и его можно будет просто перетащить мышкой в нужную область вашего ценника.

← На главную