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