При разработке отчетов по продажам в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда данные по документам ВозвратТоваровОтПокупателя попадают в отдельную пустую строку или группировку "Не определено". Это происходит потому, что в самом документе возврата может отсутствовать реквизит Менеджер, либо он не заполнен. В результате при группировке данных по ответственному лицу система не может сопоставить возврат с конкретным сотрудником, и общие показатели продаж (выручка за вычетом возвратов) рассчитываются некорректно.
В этой статье мы подробно разберем, как изменить запрос СКД, чтобы подтянуть менеджера из документа-основания (реализации) и обеспечить правильное распределение сумм в отчете.
Рассмотрим типичную ситуацию. В исходном запросе используются две временные таблицы: одна для реализаций, другая для возвратов. Затем они объединяются с помощью оператора ОБЪЕДИНИТЬ ВСЕ. Проблема заключается в том, что в блоке выбора данных из возвратов поле Менеджер заполняется значением NULL, так как в табличной части возврата этого поля просто нет.
Проанализируем фрагмент ошибочного кода:
ВЫБРАТЬ
ВТ_ДанныеВозвратов.Ссылка,
ВТ_ДанныеВозвратов.Номенклатура,
ВТ_ДанныеВозвратов.Количество,
ВТ_ДанныеВозвратов.Сумма,
NULL КАК Менеджер // Вот здесь кроется ошибка
ИЗ
ВТ_ДанныеВозвратов КАК ВТ_ДанныеВозвратов
Из-за того, что мы передаем NULL, СКД создает отдельную ветку в иерархии группировок. Наша задача — заменить этот NULL на конкретное значение, взятое из цепочки документов.
Для того чтобы получить менеджера для возврата, нам необходимо обратиться к документу, на основании которого этот возврат был сделан. В большинстве типовых конфигураций 1С (УТ, ERP, КА) связь осуществляется через реквизит Сделка или ДокументОснование в шапке документа ВозвратТоваровОтПокупателя.
Разберем по шагам, как правильно составить запрос:
Менеджер будет заполнено для обоих типов документов.Посмотрим на пример исправленного запроса:
// 1. Собираем реализации
ВЫБРАТЬ
РеализацияТовары.Ссылка КАК Ссылка,
РеализацияТовары.Номенклатура КАК Номенклатура,
РеализацияТовары.Количество КАК Количество,
РеализацияТовары.Сумма КАК Сумма,
РеализацияТовары.Ссылка.Менеджер КАК Менеджер,
РеализацияТовары.Ссылка.ОплатаКартой КАК ОплатаКартой
ПОМЕСТИТЬ ВТ_ДанныеРеализаций
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
РеализацияТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания;
////////////////////////////////////////////////////////////////////////////////
// 2. Собираем возвраты и получаем менеджера из сделки
ВЫБРАТЬ
ВозвратТовары.Ссылка КАК Ссылка,
ВозвратТовары.Номенклатура КАК Номенклатура,
-1 * ВозвратТовары.Количество КАК Количество,
-1 * ВозвратТовары.Сумма КАК Сумма,
// Получаем менеджера из документа-основания (Сделки)
ЕСТЬNULL(ВозвратТовары.Ссылка.Сделка.Менеджер, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК Менеджер
ПОМЕСТИТЬ ВТ_ДанныеВозвратов
ИЗ
Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТовары
ГДЕ
ВозвратТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания;
////////////////////////////////////////////////////////////////////////////////
// 3. Объединяем результаты
ВЫБРАТЬ
Р.Ссылка, Р.Номенклатура, Р.Количество, Р.Сумма, Р.Менеджер, Р.ОплатаКартой
ИЗ
ВТ_ДанныеРеализаций КАК Р
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
В.Ссылка, В.Номенклатура, В.Количество, В.Сумма, В.Менеджер, NULL
ИЗ
ВТ_ДанныеВозвратов КАК В
Рассмотрим подробнее несколько критических моментов, которые помогут сделать ваш отчет более стабильным и точным:
1. Отсутствие документа-основания. Бывают случаи, когда возврат оформляется без указания конкретной реализации. В такой ситуации поле Сделка будет пустым, и менеджер снова станет NULL. Чтобы этого избежать, можно использовать альтернативный источник данных. Например, брать основного менеджера из карточки контрагента:
ЕСТЬNULL(ВозвратТовары.Ссылка.Сделка.Менеджер, ВозвратТовары.Ссылка.Контрагент.ОсновнойМенеджер)
2. Использование регистров накопления. Выбирать данные напрямую из документов (табличных частей) — не самая лучшая практика. Если ваша конфигурация содержит регистры Продажи или ВыручкаИСебестоимостьПродаж, лучше использовать их виртуальные таблицы Обороты. В этих регистрах данные по возвратам часто уже записаны с отрицательными значениями, а измерение Менеджер присутствует в каждой записи, что избавляет от необходимости делать сложные соединения в запросе.
3. Роли полей в СКД. После того как вы изменили запрос, обязательно зайдите на закладку "Набор данных" в схеме компоновки. Убедитесь, что для поля Менеджер установлена роль "Измерение" (если это необходимо) и проверьте, чтобы тип данных был четко определен. Это исключит проблемы, когда СКД не может корректно сопоставить типы при объединении таблиц.
4. Производительность. При работе с большими объемами данных в запросах с временными таблицами рекомендуется использовать индексацию. Проанализируем ситуацию: если документов тысячи, соединение по полю Сделка может замедлить отчет. Добавьте индексацию по ссылкам в промежуточных запросах, чтобы ускорить поиск соответствий.
Мы выяснили причину возникновения пустых группировок: она заключается в отсутствии связи между возвратом и ответственным менеджером в структуре запроса. Исправив логику получения данных и добавив обращение к документу-основанию через ЕСТЬNULL или прямое соединение, мы добиваемся того, что возвраты начинают корректно уменьшать итоговые показатели конкретного сотрудника.
Помните, что качественный отчет в 1С — это не только правильные цифры, но и учет всех бизнес-процессов, включая возвраты без оснований и корректировки прошлых периодов. Использование регистров накопления и грамотная настройка связей в СКД позволят вам создавать быстрые и надежные инструменты для анализа продаж.