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

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробнее причины возникновения этой проблемы и разберем по шагам варианты ее решения.

Причина 1. Использование секции ИТОГИ при выгрузке в плоскую таблицу

Главная причина «задвоения» данных при выгрузке запроса в таблицу значений заключается в наличии секции ИТОГИ ПО... в самом тексте запроса. Секция итогов предназначена для построения иерархических отчетов или вывода группировочных строк. Когда запрос содержит конструкции вида:


ИТОГИ
    СУММА(СуммаКонечныйОстатокДт),
    СУММА(КоличествоКонечныйОстатокДт)
ПО
    ОБЩИЕ,
    Счет ИЕРАРХИЯ КАК Счет,
    Субконто1,
    Субконто2

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

Способы решения:

  1. Удаление секции ИТОГИ из запроса. Если конечная цель заключается в получении плоской таблицы значений без иерархии и промежуточных итогов, секцию ИТОГИ необходимо полностью удалить из текста запроса. При необходимости группировки данных прямо в запросе следует использовать конструкцию СГРУППИРОВАТЬ ПО.
  2. Использование прямого обхода результата. Если менять текст запроса нельзя, выгружайте только детальные записи с помощью параметра ОбходРезультатаЗапроса.Прямой:
    
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаБезДублей = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой);
    

Причина 2. Порядок видов субконто на разных субсчетах

Проанализируем ситуацию, когда отбор в виртуальной таблице выполняется по иерархии счетов: Счет В ИЕРАРХИИ (&Счет). Если на разных субсчетах включен различный порядок субконто (например, на одном субсчете Субконто1 — это «Номенклатура», а на другом — «Склады»), то без жесткого указания состава аналитики виртуальная таблица распределит субконто по их порядковым номерам.

В таком случае одна и та же позиция справочника может попасть в колонку Субконто1 для одного счета и в колонку Субконто2 для другого счета. Визуально в отчете это создаст впечатление задвоения аналитики.

Способ решения:

Для корректного распределения аналитики передавайте в шестой параметр виртуальной таблицы ОстаткиИОбороты массив или список видов субконто (параметр ВидыСубконто). Это позволит привязать конкретный вид аналитики к фиксированной колонке запроса.


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

Причина 3. Дублирующие элементы в справочниках

Выясним еще одну распространенную причину: наличие дублей в информационных базах. В справочнике «Номенклатура» или «Контрагенты» могут быть созданы элементы с абсолютно одинаковыми наименованиями. В текстовом представлении ПРЕДСТАВЛЕНИЕ(ОстаткиИОбороты.Субконто1) такие строки будут выглядеть идентично, однако они имеют разный уникальный идентификатор (ссылку).

Способ решения:

При отладке и анализе результата запроса проверяйте не только строковое представление субконто, но и само поле ссылки Субконто1. Для объединения таких строк в информационной базе необходимо воспользоваться стандартной обработкой поиска и удаления дублей.

← На главную