При планировании закупок в 1С:Бухгалтерия 3.0 часто возникает задача анализа ликвидности товара. Простого знания количества проданного товара недостаточно: важно понимать, был ли это разовый крупный заказ одного клиента или стабильный спрос со стороны множества покупателей. В этой статье мы разберем, как с помощью Системы компоновки данных (СКД) и языка запросов получить статистику продаж с количеством уникальных контрагентов.
Разберем типичную ситуацию. Программист пытается получить данные из виртуальной таблицы РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты по счету 41.01. Проблема заключается в том, что на 41 счете (Товары на складах) в типовой бухгалтерии настроено субконто Номенклатура, Партии и Склады. Данных о Контрагенте (покупателе) в проводках по кредиту 41 счета напрямую нет.
С другой стороны, информация о покупателе содержится на счете 62.01 (Расчеты с покупателями), но там нет аналитики по номенклатуре. Чтобы соединить эти данные, нам необходимо использовать либо таблицу оборотов между счетами, либо связывать записи регистра через Регистратор (документ продажи).
Проанализируем самый доступный способ — использование детализации до документа. Если мы установим периодичность виртуальной таблицы Регистратор, мы сможем «вытащить» объект документа, из которого затем можно получить контрагента. Однако в самом запросе лучше сразу соединять данные по разным счетам.
Рассмотрим пример запроса, который собирает данные о продажах и остатках, объединяя информацию о товаре и покупателе:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Хозрасчетный.Регистратор КАК Регистратор,
ХозрасчетныйСубконто.Значение КАК Контрагент
ПОМЕСТИТЬ ВТ_ПродажиКонтрагентам
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Субконто КАК ХозрасчетныйСубконто
ПО Хозрасчетный.Регистратор = ХозрасчетныйСубконто.Регистратор
ГДЕ
Хозрасчетный.СчетДт В (&Счета62)
И ХозрасчетныйСубконто.Вид = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты)
;
ВЫБРАТЬ
Хозрасчетный.Регистратор КАК Регистратор,
Хозрасчетный.Субконто1 КАК Номенклатура,
СУММА(Хозрасчетный.КоличествоКт) КАК Продано
ПОМЕСТИТЬ ВТ_ОборотыНоменклатуры
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Счет = &Счет41, , , , ) КАК Хозрасчетный
СГРУППИРОВАТЬ ПО
Хозрасчетный.Регистратор,
Хозрасчетный.Субконто1
;
ВЫБРАТЬ
ВТ_ОборотыНоменклатуры.Номенклатура,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_ПродажиКонтрагентам.Контрагент) КАК КоличествоКлиентов,
СУММА(ВТ_ОборотыНоменклатуры.Продано) КАК ВсегоПродано
ИЗ
ВТ_ОборотыНоменклатуры КАК ВТ_ОборотыНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПродажиКонтрагентам КАК ВТ_ПродажиКонтрагентам
ПО ВТ_ОборотыНоменклатуры.Регистратор = ВТ_ПродажиКонтрагентам.Регистратор
СГРУППИРОВАТЬ ПО
ВТ_ОборотыНоменклатуры.Номенклатура
В этом подходе мы сначала находим всех контрагентов из документов, сделавших проводки по 62 счету, а затем соединяем их с оборотами по 41 счету по полю Регистратор. Важно помнить, что использование КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...) позволяет избежать дублей, если один и тот же клиент купил товар несколькими накладными за отчетный период.
Для конфигурации 1С:Бухгалтерия 3.0 наиболее элегантным решением будет использование виртуальной таблицы Хозрасчетный.ОборотыДтКт. Эта таблица специально создана для анализа корреспонденций счетов. Мы можем сразу увидеть, какая номенклатура (со счета 41 или 90.02) ушла в дебет счета расчетов с покупателями (62).
Разберем по шагам, как настроить такой запрос:
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт.СубконтоКт1 даст нам Номенклатуру, а СубконтоДт1 — Контрагента.Пример оптимизированного кода запроса:
ВЫБРАТЬ
Обороты.СубконтоКт1 КАК Номенклатура,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Обороты.СубконтоДт1) КАК КоличествоКлиентов,
СУММА(Обороты.КоличествоОборот) КАК КоличествоПродано
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&Начало, &Конец, , СчетДт В ИЕРАРХИИ (&Счет62), , СчетКт В ИЕРАРХИИ (&Счет41), , ) КАК Обороты
СГРУППИРОВАТЬ ПО
Обороты.СубконтоКт1
Этот метод работает быстрее, так как платформа 1С на уровне СУБД выполняет соединение данных эффективнее, чем при использовании временных таблиц с регистратором.
Часто программисты жалуются на «задвоение» строк, когда добавляют поле Регистратор в отчет СКД. Проанализируем причину: когда в группировках отчета присутствует детальная запись (документ), ресурс (количество проданного) выводится для каждой строки. Если мы хотим видеть общую сумму по номенклатуре и общее количество клиентов, нужно правильно настроить вкладку Ресурсы в СКД.
Для поля КоличествоКлиентов используйте выражение:
Количество(Различные Контрагент)
Это гарантирует, что даже если в детальных записях один клиент встречается 10 раз, на уровне группировки по номенклатуре он будет посчитан как 1.
При реализации данного отчета в 1С:Бухгалтерия 3.0 стоит учесть следующие технические нюансы:
Дт 90.02.1 - Кт 41.01.ВсегоПродано велико, но КоличествоКлиентов равно 1 — это признак специфического спроса. Такой товар опасно закупать впрок большими партиями.Используя предложенные методы, мы создадим мощный инструмент для отдела закупок, который позволит не просто видеть «сухие» остатки, но и понимать структуру спроса в базе 1С.