Как создать прайс-лист с категориями наценок через СКД во внешнем отчете?

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

Разработка прайс-листа — одна из базовых задач программиста 1С, однако она требует понимания работы с системой компоновки данных (СКД), запросами и виртуальными таблицами. В данной статье мы разберем, как реализовать отчет, который будет выводить цены номенклатуры, разделяя их по категориям (например, в зависимости от веса или типа наценки), используя внешние файлы отчетов.

Выбор типа объекта: Отчет или Обработка?

Прежде всего, проанализируем техническое задание. Часто новички получают задачу "сделать внешнюю обработку", но для вывода данных в 1С правильнее использовать Внешний отчет (файл с расширением .erf). Рассмотрим причины этого выбора:

  1. Автоматизация интерфейса: Внешний отчет на базе СКД автоматически генерирует форму с кнопками "Сформировать", "Настройки" и "Варианты отчета".
  2. Гибкость настроек: Пользователь сможет самостоятельно добавлять отборы, группировки или менять порядок колонок без изменения программного кода.
  3. Сохранение настроек: Система запоминает настройки, которые установил пользователь (например, выбранную дату или категорию цен).

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

Работа с данными: Виртуальные таблицы и СрезПоследних

Для получения цен нам необходимо обратиться к регистру сведений. В типовых конфигурациях (например, Управление торговлей) это регистр ЦеныНоменклатуры. Рассмотрим ситуацию, когда нам нужны актуальные цены на текущий момент. Для этого в языке запросов предусмотрена виртуальная таблица СрезПоследних.

Проанализируем важный нюанс: условия по дате и типам цен необходимо передавать напрямую в параметры виртуальной таблицы. Это критически важно для производительности системы. Если мы выберем все цены, а потом будем фильтровать их через ГДЕ, отчет будет работать крайне медленно на больших базах.

Реализация логики колонок через оператор ВЫБОР

Чтобы распределить цены по разным колонкам (например, для весовых категорий VIP 0, VIP 250, VIP 500), мы будем использовать конструкцию ВЫБОР КОГДА ... ТОГДА прямо в тексте запроса. Посмотрим на пример кода, который решает эту задачу:


ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.Цена > 0 И ЦеныНоменклатурыСрезПоследних.Цена <= 250
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
        ИНАЧЕ 0
    КОНЕЦ КАК Цена_VIP_0,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.Цена > 250 И ЦеныНоменклатурыСрезПоследних.Цена <= 500
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
        ИНАЧЕ 0
    КОНЕЦ КАК Цена_VIP_250,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.Цена > 500
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
        ИНАЧЕ 0
    КОНЕЦ КАК Цена_VIP_500
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних

В этом примере мы создаем три отдельных поля. Если цена попадает в диапазон, она отображается в соответствующей колонке, иначе выводится ноль. В настройках СКД эти поля нужно добавить в ресурсы, чтобы они корректно суммировались при группировке по иерархии номенклатуры.

Соединение с данными о товаре (Вес номенклатуры)

Если категории (0-250гр и т.д.) зависят не от самой цены, а от физических характеристик товара, нам потребуется Левое соединение. Основной таблицей выступит справочник Номенклатура, а присоединяемой — ЦеныНоменклатуры.СрезПоследних.

Разберем, почему именно левое соединение: это позволит нам увидеть в прайс-листе все товары, даже те, по которым цена еще не была установлена. В противном случае (при внутреннем соединении) пустые позиции просто исчезнут из отчета.

Настройка структуры отчета в СКД

После написания запроса перейдем в конструктор СКД на вкладку "Настройки". Чтобы отчет выглядел как настоящий прайс-лист, выполним следующие шаги:

  1. Создадим структуру типа "Таблица".
  2. В Строки добавим поле Номенклатура (установив тип вывода "Иерархия", чтобы сохранить структуру папок).
  3. В Выбранные поля добавим наши вычисляемые колонки цен.
  4. Настроим Условное оформление: например, если цена равна 0, можно настроить вывод текста "По запросу" или просто скрывать нулевые значения для чистоты документа.

Полезные советы для начинающих разработчиков

Рассмотрим несколько практических рекомендаций, которые помогут избежать типичных ошибок при работе с внешними отчетами:

Безопасность данных: При разработке на тестовой базе всегда проверяйте, не включены ли в ней регламентные задания или обмены. Как показывает практика, случайная "продажа" или изменение цен в тестовой базе может затронуть боевые кассы или интеграции, если они настроены некорректно.

Имена полей: Старайтесь давать полям понятные заголовки. Вместо "Поле2" используйте "Цена (от 250 до 500 гр)". Это упростит жизнь и вам, и пользователям, которые будут работать с настройками отчета.

Использование БСП: Если ваша конфигурация поддерживает БСП (Библиотеку стандартных подсистем), рекомендуем регистрировать отчет через справочник Дополнительные отчеты и обработки. Это позволит пользователям открывать прайс-лист через меню программы, а не через "Файл — Открыть", и обеспечит корректное разграничение прав доступа.

Таким образом, комбинируя возможности языка запросов и гибкость системы компоновки данных, мы получаем мощный инструмент для анализа цен, который легко поддерживать и масштабировать под новые требования бизнеса.

← На главную