Как устранить дублирование данных в запросе к регистру бухгалтерии при добавлении субконто Склады

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

При разработке отчетов на базе регистра бухгалтерии программисты часто сталкиваются с ситуацией, когда добавление нового поля в запрос (например, аналитики по складам) приводит к резкому увеличению итоговых сумм и количества — данные начинают «задваиваться» или даже «зачетверяться». Рассмотрим причины возникновения этой проблемы на примере конфигурации 1С:Бухгалтерия предприятия КОРП 3.0 и разберем эффективные способы ее решения.

Почему происходит дублирование данных в виртуальных таблицах

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

Выясним причину: Виртуальная таблица оборотов — это не просто выборка из физической таблицы, а результат агрегации данных. Когда мы добавляем новое субконто в список полей, система автоматически добавляет его в группировку. Если в течение выбранного периода (например, месяца) затраты по одной номенклатурной группе на 20-м или 25-м счете распределялись с участием четырех разных складов (что возможно в версии КОРП при соответствующих настройках), запрос честно вернет четыре строки — по одной на каждый склад. Если при этом в отчете или СКД не настроены правильные группировки, пользователь увидит сумму, увеличенную в 4 раза.

Проанализируем основные методы исправления этой ситуации.

Метод 1. Правильное использование параметра ВидыСубконто

Одной из самых частых ошибок является игнорирование параметров виртуальной таблицы. Если мы не указываем явно, какой вид субконто мы хотим видеть в Субконто1, Субконто2 и так далее, 1С берет их в том порядке, в котором они определены в плане счетов для конкретного счета. На разных счетах (20.01, 25, 26) порядок субконто может различаться.

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


МассивСубконто = Новый Массив;
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НоменклатурныеГруппы);
МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);

Запрос.УстановитьПараметр("ВидыСубконто", МассивСубконто);

В самом тексте запроса это позволит нам обращаться к конкретным полям более предсказуемо:


ВЫБРАТЬ
    ХозрасчетныйОбороты.Счет КАК Счет,
    ХозрасчетныйОбороты.Субконто1 КАК НоменклатурнаяГруппа,
    ХозрасчетныйОбороты.Субконто2 КАК Склад,
    ХозрасчетныйОбороты.СуммаОборот КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаКончания, , Счет В ИЕРАРХИИ (&СчетаЗатрат), &ВидыСубконто) КАК ХозрасчетныйОбороты

Метод 2. Группировка данных и агрегатные функции

Если ваша задача — получить общую сумму затрат, но при этом «справочно» показать хотя бы один склад (или если вам не важен конкретный склад в итоговой строке), используйте классическую группировку СГРУППИРОВАТЬ ПО. Это позволит «схлопнуть» лишние строки.

Рассмотрим пример, где мы используем функцию МАКСИМУМ для выбора склада, чтобы избежать размножения записей:


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

Важный момент: использование МАКСИМУМ оправдано только в том случае, если вам действительно не нужен детальный отчет по каждому складу. Если отчет должен быть «Склад — Сумма», то «зачетверение» — это не ошибка, а детальность учета.

Метод 3. Использование временных таблиц и левого соединения

Рассмотрим более сложный, но гибкий сценарий. Мы можем сначала получить основные данные без лишней аналитики во временную таблицу, а затем присоединить информацию о складах. Это гарантирует, что итоговые суммы по подразделениям останутся верными.

  1. Создаем временную таблицу ВТ_ОсновныеДанные, где считаем обороты по счетам и подразделениям.
  2. Создаем временную таблицу ВТ_Склады, выбирая только уникальные пары «Подразделение — Склад».
  3. Соединяем их левым соединением.

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


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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Основа.Счет,
    Основа.Подразделение,
    Основа.Сумма,
    Склады.Склад
ИЗ
    ВТ_ОсновныеДанные КАК Основа
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Склады КАК Склады
    ПО Основа.Подразделение = Склады.Подразделение

Внимание: Будьте осторожны с левым соединением. Если в таблице ВТ_Склады для одного подразделения найдется несколько складов, сумма в Основа.Сумма снова начнет дублироваться. Чтобы этого не произошло, в финальной выборке нужно либо использовать СГРУППИРОВАТЬ ПО, либо пересмотреть бизнес-логику отчета (нужно ли выводить склад, если их несколько?).

Особенности работы в Системе Компоновки Данных (СКД)

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

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

Подводя итог, отметим: появление лишних строк в запросах к бухгалтерии — это всегда сигнал о том, что в данных регистра есть дополнительный разрез аналитики. Решение задачи всегда сводится либо к уточнению параметров ВидыСубконто, либо к осознанному схлопыванию данных через ГРУППИРОВАТЬ ПО.

← На главную