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