Как добавить закупочную цену в отчет «Выручка и себестоимость продаж» в 1С:УТ 11.3?

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

Отчет Выручка и себестоимость продаж является одним из самых востребованных в 1С:Управление торговлей 11.3. Однако стандартный функционал показывает только фактическую себестоимость списания, а менеджеры часто хотят видеть «закупочную цену» (прайсовую цену поставщика) на дату продажи. Это необходимо для оперативного контроля маржинальности и анализа отклонений от текущего прайс-листа закупок.

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

Метод 1: Связь наборов данных в СКД (Классический способ)

Самый простой путь — это добавление второго набора данных в схему компоновки. Рассмотрим пошагово, как это сделать:

  1. Откроем схему компоновки данных отчета. Создадим новый Набор данных - запрос.
  2. В качестве источника выберем виртуальную таблицу РегистрСведений.ЦеныНоменклатуры.СрезПоследних.
  3. В параметрах виртуальной таблицы укажем &Период и добавим условие по ВидЦены.
  4. Перейдем на вкладку Связи наборов данных. Это критический момент.
  5. Установим связь от основного набора данных (Продажи) к новому набору (Цены). В колонке Параметры связи для параметра Период укажите поле Период или ДатаДокумента из первого набора.

Проанализируем ситуацию: почему отчет может «зависать»? Если связей слишком много или данные в первом наборе не сгруппированы, 1С будет выполнять отдельный запрос к базе данных для каждой строки продаж. Чтобы этого избежать, убедимся, что связи настроены по полям Номенклатура и Характеристика (если они используются).

Метод 2: Оптимизация через «Технику интервалов»

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


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.Характеристика КАК Характеристика,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
    ЦеныНоменклатуры.Цена КАК Цена,
    ЦеныНоменклатуры.Период КАК Период
ПОМЕСТИТЬ ВтЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены
    И ЦеныНоменклатуры.Период МЕЖДУ &НачалоПериода И &КонецПериода;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВтЦены.Номенклатура КАК Номенклатура,
    ВтЦены.Характеристика КАК Характеристика,
    ВтЦены.ВидЦены КАК ВидЦены,
    ВтЦены.Цена КАК Цена,
    ВтЦены.Период КАК НачПериода,
    МАКСИМУМ(ВтЦены1.Период) КАК КонПериода
ИЗ
    ВтЦены КАК ВтЦены
ЛЕВОЕ СОЕДИНЕНИЕ ВтЦены КАК ВтЦены1 ПО ВтЦены.Номенклатура = ВтЦены1.Номенклатура
    И ВтЦены.Характеристика = ВтЦены1.Характеристика
    И ВтЦены.ВидЦены = ВтЦены1.ВидЦены
    И ВтЦены.Период < ВтЦены1.Период
СГРУППИРОВАТЬ ПО
    ВтЦены.ВидЦены,
    ВтЦены.Цена,
    ВтЦены.Период,
    ВтЦены.Номенклатура,
    ВтЦены.Характеристика

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

Настройка параметра «Вид цены»

Посмотрим на пример настройки параметра. Чтобы пользователь мог сам выбирать, какую именно цену считать «Закупочной», не нужно жестко прописывать её в коде. Сделаем следующее:

Почему поле не появляется в отчете?

Рассмотрим ситуацию, когда запрос написан верно, но поле Цена не отображается. Проверим следующие моменты:

  1. Выбранные поля: Перейдем на вкладку «Настройки» в СКД и убедимся, что новое поле добавлено в список «Выбранные поля».
  2. Роли и права: Проверим, есть ли у текущего пользователя права на чтение регистра сведений ЦеныНоменклатуры. В 1С часто срабатывает RLS (ограничение прав на уровне записей), которое скрывает данные.
  3. Учет характеристик: Если в базе ведется учет по характеристикам, а в связи наборов данных вы указали только Номенклатуру, система может выдать пустые значения, если цена установлена именно на характеристику. Всегда связывайте оба поля.
  4. Единицы измерения: Помните, что закупочная цена хранится за единицу хранения номенклатуры. Если продажа была в упаковках, цену нужно умножить на коэффициент упаковки из документа.

Использование расширений для модификации отчета

Поскольку Выручка и себестоимость продаж — это сложный типовой объект, мы настоятельно рекомендуем использовать Расширения конфигурации для внедрения изменений. Это позволит:

1. Сохранить типовую конфигурацию на поддержке.

2. Избежать ошибок при обновлении программы.

3. Гибко управлять видимостью новых полей через программный интерфейс расширения.

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

← На главную