Как получить количество уникальных клиентов по продажам в 1С:Бухгалтерия 3.0

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

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

Анализ проблемы: почему стандартный запрос не работает

Разберем типичную ситуацию. Программист пытается получить данные из виртуальной таблицы РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты по счету 41.01. Проблема заключается в том, что на 41 счете (Товары на складах) в типовой бухгалтерии настроено субконто Номенклатура, Партии и Склады. Данных о Контрагенте (покупателе) в проводках по кредиту 41 счета напрямую нет.

С другой стороны, информация о покупателе содержится на счете 62.01 (Расчеты с покупателями), но там нет аналитики по номенклатуре. Чтобы соединить эти данные, нам необходимо использовать либо таблицу оборотов между счетами, либо связывать записи регистра через Регистратор (документ продажи).

Решение 1: Использование регистратора и периодичности

Проанализируем самый доступный способ — использование детализации до документа. Если мы установим периодичность виртуальной таблицы Регистратор, мы сможем «вытащить» объект документа, из которого затем можно получить контрагента. Однако в самом запросе лучше сразу соединять данные по разным счетам.

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


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

ВЫБРАТЬ
    Хозрасчетный.Регистратор КАК Регистратор,
    Хозрасчетный.Субконто1 КАК Номенклатура,
    СУММА(Хозрасчетный.КоличествоКт) КАК Продано
ПОМЕСТИТЬ ВТ_ОборотыНоменклатуры
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Счет = &Счет41, , , , ) КАК Хозрасчетный
СГРУППИРОВАТЬ ПО
    Хозрасчетный.Регистратор,
    Хозрасчетный.Субконто1
;

ВЫБРАТЬ
    ВТ_ОборотыНоменклатуры.Номенклатура,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_ПродажиКонтрагентам.Контрагент) КАК КоличествоКлиентов,
    СУММА(ВТ_ОборотыНоменклатуры.Продано) КАК ВсегоПродано
ИЗ
    ВТ_ОборотыНоменклатуры КАК ВТ_ОборотыНоменклатуры
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПродажиКонтрагентам КАК ВТ_ПродажиКонтрагентам
        ПО ВТ_ОборотыНоменклатуры.Регистратор = ВТ_ПродажиКонтрагентам.Регистратор
СГРУППИРОВАТЬ ПО
    ВТ_ОборотыНоменклатуры.Номенклатура

В этом подходе мы сначала находим всех контрагентов из документов, сделавших проводки по 62 счету, а затем соединяем их с оборотами по 41 счету по полю Регистратор. Важно помнить, что использование КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...) позволяет избежать дублей, если один и тот же клиент купил товар несколькими накладными за отчетный период.

Решение 2: Оптимальный запрос через таблицу ОборотыДтКт

Для конфигурации 1С:Бухгалтерия 3.0 наиболее элегантным решением будет использование виртуальной таблицы Хозрасчетный.ОборотыДтКт. Эта таблица специально создана для анализа корреспонденций счетов. Мы можем сразу увидеть, какая номенклатура (со счета 41 или 90.02) ушла в дебет счета расчетов с покупателями (62).

Разберем по шагам, как настроить такой запрос:

  1. Выбираем таблицу: РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт.
  2. Устанавливаем фильтры: СчетКт должен быть 41.01 (или 90.02.1 для анализа себестоимости продаж), а СчетДт — 62.01.
  3. Получаем аналитику: СубконтоКт1 даст нам Номенклатуру, а СубконтоДт1 — Контрагента.

Пример оптимизированного кода запроса:


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

Этот метод работает быстрее, так как платформа 1С на уровне СУБД выполняет соединение данных эффективнее, чем при использовании временных таблиц с регистратором.

Как избежать задвоения строк в СКД

Часто программисты жалуются на «задвоение» строк, когда добавляют поле Регистратор в отчет СКД. Проанализируем причину: когда в группировках отчета присутствует детальная запись (документ), ресурс (количество проданного) выводится для каждой строки. Если мы хотим видеть общую сумму по номенклатуре и общее количество клиентов, нужно правильно настроить вкладку Ресурсы в СКД.

Для поля КоличествоКлиентов используйте выражение:

Количество(Различные Контрагент)

Это гарантирует, что даже если в детальных записях один клиент встречается 10 раз, на уровне группировки по номенклатуре он будет посчитан как 1.

Дополнительные рекомендации для планирования закупок

При реализации данного отчета в 1С:Бухгалтерия 3.0 стоит учесть следующие технические нюансы:

Используя предложенные методы, мы создадим мощный инструмент для отдела закупок, который позволит не просто видеть «сухие» остатки, но и понимать структуру спроса в базе 1С.

← На главную