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