При работе с виртуальными таблицами регистров бухгалтерии разработчики часто сталкиваются с ситуацией, когда результат запроса содержит повторяющиеся строки. В частности, при попытке выгрузить данные из типовых отчетов (например, из оборотно-сальдовой ведомости) в плоскую таблицу значений, одна и та же номенклатура или контрагент выводится несколько раз. Если к такой таблице применить метод Свернуть(), итоговые суммы рассчитываются некорректно, так как суммируются дублирующие записи.
Рассмотрим подробнее причины возникновения этой проблемы и разберем по шагам варианты ее решения.
Главная причина «задвоения» данных при выгрузке запроса в таблицу значений заключается в наличии секции ИТОГИ ПО... в самом тексте запроса. Секция итогов предназначена для построения иерархических отчетов или вывода группировочных строк. Когда запрос содержит конструкции вида:
ИТОГИ
СУММА(СуммаКонечныйОстатокДт),
СУММА(КоличествоКонечныйОстатокДт)
ПО
ОБЩИЕ,
Счет ИЕРАРХИЯ КАК Счет,
Субконто1,
Субконто2
система возвращает выборку, содержащую не только детальные записи, но и общие итоги, промежуточные итоги по счетам и иерархиям субконто. Если вызвать метод Запрос.Выполнить().Выгрузить() без указания типа обхода, сформированная таблица значений будет включать строки всех уровней группировки. В результате детальная строка и соответствующая ей итоговая строка кажутся идентичными, а метод ТаблицаЗначений.Свернуть() суммирует итоговые и детальные данные между собой.
Способы решения:
ИТОГИ необходимо полностью удалить из текста запроса. При необходимости группировки данных прямо в запросе следует использовать конструкцию СГРУППИРОВАТЬ ПО.ОбходРезультатаЗапроса.Прямой:
РезультатЗапроса = Запрос.Выполнить();
ТаблицаБезДублей = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой);
Проанализируем ситуацию, когда отбор в виртуальной таблице выполняется по иерархии счетов: Счет В ИЕРАРХИИ (&Счет). Если на разных субсчетах включен различный порядок субконто (например, на одном субсчете Субконто1 — это «Номенклатура», а на другом — «Склады»), то без жесткого указания состава аналитики виртуальная таблица распределит субконто по их порядковым номерам.
В таком случае одна и та же позиция справочника может попасть в колонку Субконто1 для одного счета и в колонку Субконто2 для другого счета. Визуально в отчете это создаст впечатление задвоения аналитики.
Способ решения:
Для корректного распределения аналитики передавайте в шестой параметр виртуальной таблицы ОстаткиИОбороты массив или список видов субконто (параметр ВидыСубконто). Это позволит привязать конкретный вид аналитики к фиксированной колонке запроса.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ОстаткиИОбороты.Счет КАК Счет,
ОстаткиИОбороты.Субконто1 КАК Номенклатура,
ОстаткиИОбороты.КоличествоКонечныйОстатокДт КАК Количество
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
&ДатаНач,
&ДатаКон,
,
,
Счет В ИЕРАРХИИ (&Счет),
&МассивВидовСубконто,
Организация = &Организация
) КАК ОстаткиИОбороты
Выясним еще одну распространенную причину: наличие дублей в информационных базах. В справочнике «Номенклатура» или «Контрагенты» могут быть созданы элементы с абсолютно одинаковыми наименованиями. В текстовом представлении ПРЕДСТАВЛЕНИЕ(ОстаткиИОбороты.Субконто1) такие строки будут выглядеть идентично, однако они имеют разный уникальный идентификатор (ссылку).
Способ решения:
При отладке и анализе результата запроса проверяйте не только строковое представление субконто, но и само поле ссылки Субконто1. Для объединения таких строк в информационной базе необходимо воспользоваться стандартной обработкой поиска и удаления дублей.