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