Как создать прайс-лист с остатками и последней ценой продажи в 1С:Бухгалтерия 3.0?

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

Формирование прайс-листа в 1С:Бухгалтерии часто вызывает затруднения, так как типовые механизмы программы заточены под ведение бухгалтерского учета, а не под сложные торговые операции с гибким ценообразованием. В данной статье мы разберем, как с помощью Системы Компоновки Данных (СКД) собрать отчет, который выводит текущие остатки товаров по счету 41.01, цену из регистра сведений и, при её отсутствии, цену последней продажи конкретному контрагенту.

Основные ошибки при построении запроса

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

  1. Неправильное использование условий в разделе ГДЕ. Если вы накладываете фильтр на таблицу, которая присоединяется через ЛЕВОЕ СОЕДИНЕНИЕ, вы фактически превращаете его во ВНУТРЕННЕЕ. Если данных для соединения нет, в отчете такие строки просто исчезают.
  2. Дублирование строк. Возникает, когда одна номенклатура имеет несколько записей в присоединенных таблицах (например, несколько документов реализации за один день).
  3. Выбор основной таблицы. Основной таблицей всегда должен быть регистр остатков. Если начать с документов реализации, вы потеряете все товары, которые есть на складе, но по которым еще не было продаж.

Шаг 1: Получение остатков и цен из регистра

Первым делом мы выбираем номенклатуру, которая числится на 41.01 с учетом заданного склада. Для получения цен используем ЛЕВОЕ СОЕДИНЕНИЕ с регистром ЦеныНоменклатурыДокументов.

Важный момент: чтобы не потерять товары, у которых нет цены, все условия фильтрации цен (например, СпособЗаполненияЦены) переносим в условие ПО, а не в блок ГДЕ.


ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстатки.КоличествоОстатокДт КАК Остаток,
    ЦеныНоменклатурыДокументов.Цена КАК ЦенаРегистра
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&КонДата, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТоварыНаСкладах), , ) КАК ХозрасчетныйОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыДокументов КАК ЦеныНоменклатурыДокументов
        ПО ХозрасчетныйОстатки.Субконто1 = ЦеныНоменклатурыДокументов.Номенклатура
        И ЦеныНоменклатурыДокументов.СпособЗаполненияЦены = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияЦен.ПоПродажнымЦенам)
ГДЕ
    ХозрасчетныйОстатки.Субконто2 = &Склад

Шаг 2: Получение цены последней продажи

Чтобы найти цену последней продажи, мы формируем вложенный запрос к табличной части Товары документа РеализацияТоваровУслуг. Используем конструкцию, позволяющую отобрать только последнюю запись для каждого товара.


ВЫБРАТЬ
    Реализация.Номенклатура КАК Номенклатура,
    Реализация.Сумма / Реализация.Количество КАК ЦенаПоследнейПродажи
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Реализация
ГДЕ
    Реализация.Ссылка В
        (ВЫБРАТЬ ПЕРВЫЕ 1
            Т.Ссылка
        ИЗ
            Документ.РеализацияТоваровУслуг.Товары КАК Т
        ГДЕ
            Т.Номенклатура = Реализация.Номенклатура
        УПОРЯДОЧИТЬ ПО Т.Ссылка.Дата УБЫВ)

Шаг 3: Объединение данных и логика выбора цены

Теперь, когда у нас есть два источника данных, мы объединяем их в итоговом запросе и с помощью конструкции ВЫБОР КОГДА определяем приоритет цены. Мы отдаем приоритет цене из регистра, а если она равна нулю или отсутствует — берем цену из последнего документа продажи.


ВЫБОР
    КОГДА ВложенныйЗапрос1.Цена > 0
        ТОГДА ВложенныйЗапрос1.Цена
    ИНАЧЕ ВЫБОР
            КОГДА ВложенныйЗапрос.ЦенаРеализации > 0
                ТОГДА ВложенныйЗапрос.ЦенаРеализации
            ИНАЧЕ 0
        КОНЕЦ
КОНЕЦ КАК ИтоговаяЦена

Советы по оптимизации и отладке

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

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

← На главную