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