Как в СКД 1С включить возвраты в группировку по менеджеру

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

При разработке отчетов по продажам в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда данные по документам ВозвратТоваровОтПокупателя попадают в отдельную пустую строку или группировку "Не определено". Это происходит потому, что в самом документе возврата может отсутствовать реквизит Менеджер, либо он не заполнен. В результате при группировке данных по ответственному лицу система не может сопоставить возврат с конкретным сотрудником, и общие показатели продаж (выручка за вычетом возвратов) рассчитываются некорректно.

В этой статье мы подробно разберем, как изменить запрос СКД, чтобы подтянуть менеджера из документа-основания (реализации) и обеспечить правильное распределение сумм в отчете.

Анализ исходной проблемы

Рассмотрим типичную ситуацию. В исходном запросе используются две временные таблицы: одна для реализаций, другая для возвратов. Затем они объединяются с помощью оператора ОБЪЕДИНИТЬ ВСЕ. Проблема заключается в том, что в блоке выбора данных из возвратов поле Менеджер заполняется значением NULL, так как в табличной части возврата этого поля просто нет.

Проанализируем фрагмент ошибочного кода:


ВЫБРАТЬ
    ВТ_ДанныеВозвратов.Ссылка,
    ВТ_ДанныеВозвратов.Номенклатура,
    ВТ_ДанныеВозвратов.Количество,
    ВТ_ДанныеВозвратов.Сумма,
    NULL КАК Менеджер // Вот здесь кроется ошибка
ИЗ
    ВТ_ДанныеВозвратов КАК ВТ_ДанныеВозвратов

Из-за того, что мы передаем NULL, СКД создает отдельную ветку в иерархии группировок. Наша задача — заменить этот NULL на конкретное значение, взятое из цепочки документов.

Решение задачи через соединение таблиц

Для того чтобы получить менеджера для возврата, нам необходимо обратиться к документу, на основании которого этот возврат был сделан. В большинстве типовых конфигураций 1С (УТ, ERP, КА) связь осуществляется через реквизит Сделка или ДокументОснование в шапке документа ВозвратТоваровОтПокупателя.

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

  1. Создаем временную таблицу реализаций. Здесь мы выбираем данные о продажах за период.
  2. Создаем временную таблицу возвратов с левым соединением. Это ключевой этап. Мы выбираем данные из возвратов и "присоединяем" к ним данные из реализаций, чтобы достать менеджера.
  3. Объединяем данные. Собираем все записи в итоговую таблицу, где поле Менеджер будет заполнено для обоих типов документов.

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


// 1. Собираем реализации
ВЫБРАТЬ
    РеализацияТовары.Ссылка КАК Ссылка,
    РеализацияТовары.Номенклатура КАК Номенклатура,
    РеализацияТовары.Количество КАК Количество,
    РеализацияТовары.Сумма КАК Сумма,
    РеализацияТовары.Ссылка.Менеджер КАК Менеджер,
    РеализацияТовары.Ссылка.ОплатаКартой КАК ОплатаКартой
ПОМЕСТИТЬ ВТ_ДанныеРеализаций
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
    РеализацияТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания;

////////////////////////////////////////////////////////////////////////////////
// 2. Собираем возвраты и получаем менеджера из сделки
ВЫБРАТЬ
    ВозвратТовары.Ссылка КАК Ссылка,
    ВозвратТовары.Номенклатура КАК Номенклатура,
    -1 * ВозвратТовары.Количество КАК Количество,
    -1 * ВозвратТовары.Сумма КАК Сумма,
    // Получаем менеджера из документа-основания (Сделки)
    ЕСТЬNULL(ВозвратТовары.Ссылка.Сделка.Менеджер, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК Менеджер
ПОМЕСТИТЬ ВТ_ДанныеВозвратов
ИЗ
    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТовары
ГДЕ
    ВозвратТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания;

////////////////////////////////////////////////////////////////////////////////
// 3. Объединяем результаты
ВЫБРАТЬ
    Р.Ссылка, Р.Номенклатура, Р.Количество, Р.Сумма, Р.Менеджер, Р.ОплатаКартой
ИЗ
    ВТ_ДанныеРеализаций КАК Р
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    В.Ссылка, В.Номенклатура, В.Количество, В.Сумма, В.Менеджер, NULL
ИЗ
    ВТ_ДанныеВозвратов КАК В

Важные нюансы при работе с возвратами

Рассмотрим подробнее несколько критических моментов, которые помогут сделать ваш отчет более стабильным и точным:

1. Отсутствие документа-основания. Бывают случаи, когда возврат оформляется без указания конкретной реализации. В такой ситуации поле Сделка будет пустым, и менеджер снова станет NULL. Чтобы этого избежать, можно использовать альтернативный источник данных. Например, брать основного менеджера из карточки контрагента:

ЕСТЬNULL(ВозвратТовары.Ссылка.Сделка.Менеджер, ВозвратТовары.Ссылка.Контрагент.ОсновнойМенеджер)

2. Использование регистров накопления. Выбирать данные напрямую из документов (табличных частей) — не самая лучшая практика. Если ваша конфигурация содержит регистры Продажи или ВыручкаИСебестоимостьПродаж, лучше использовать их виртуальные таблицы Обороты. В этих регистрах данные по возвратам часто уже записаны с отрицательными значениями, а измерение Менеджер присутствует в каждой записи, что избавляет от необходимости делать сложные соединения в запросе.

3. Роли полей в СКД. После того как вы изменили запрос, обязательно зайдите на закладку "Набор данных" в схеме компоновки. Убедитесь, что для поля Менеджер установлена роль "Измерение" (если это необходимо) и проверьте, чтобы тип данных был четко определен. Это исключит проблемы, когда СКД не может корректно сопоставить типы при объединении таблиц.

4. Производительность. При работе с большими объемами данных в запросах с временными таблицами рекомендуется использовать индексацию. Проанализируем ситуацию: если документов тысячи, соединение по полю Сделка может замедлить отчет. Добавьте индексацию по ссылкам в промежуточных запросах, чтобы ускорить поиск соответствий.

Заключение

Мы выяснили причину возникновения пустых группировок: она заключается в отсутствии связи между возвратом и ответственным менеджером в структуре запроса. Исправив логику получения данных и добавив обращение к документу-основанию через ЕСТЬNULL или прямое соединение, мы добиваемся того, что возвраты начинают корректно уменьшать итоговые показатели конкретного сотрудника.

Помните, что качественный отчет в 1С — это не только правильные цифры, но и учет всех бизнес-процессов, включая возвраты без оснований и корректировки прошлых периодов. Использование регистров накопления и грамотная настройка связей в СКД позволят вам создавать быстрые и надежные инструменты для анализа продаж.

← На главную