Почему задваиваются строки в отчете СКД при использовании внешних данных и как это исправить

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

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

Причина 1. Кэширование настроек и структуры отчета

Как показывает практика и опыт участников обсуждения, одной из самых коварных причин «глюков» в СКД является кэширование. Даже если вы исправили ошибку в схеме компоновки данных, система может продолжать использовать старую структуру, сохраненную в локальном кэше пользователя или в настройках варианта отчета.

Проанализируем ситуацию: если системное поле Номер по порядку выводится одинаковым для двух идущих подряд строк, это означает, что сама СКД воспринимает эти записи как одну и ту же строку данных, но по какой-то причине отрисовывает ее дважды.

Как решить проблему через очистку:

  1. Попробуйте полностью очистить кэш пользователя 1С (папки в %AppData%\1C\1Cv8).
  2. В режиме «1С:Предприятие» в форме отчета выполните команду Еще — Установить стандартные настройки. Это сбросит пользовательские настройки, которые могли конфликтовать с новой структурой.
  3. Если это не помогает, создайте новый файл внешнего отчета и скопируйте туда схему. Часто создание объекта с новым внутренним идентификатором полностью решает проблему «фантомных» дублей.

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

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

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

Рекомендации по настройке связей:

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

Причина 3. Виртуальные таблицы и периодичность

Виртуальные таблицы регистров бухгалтерии, такие как ХозрасчетныйОстаткиИОбороты, крайне чувствительны к параметрам. Если в запросе выбрана периодичность (например, «День» или «Авто»), а в настройках отчета эти поля не выведены в группировки, записи будут визуально дублироваться. На самом деле это будут разные записи за разные даты, которые в «Детальных записях» выглядят одинаково.

Разберем пример запроса:


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

Если за указанный период было несколько движений в разные дни, параметр Авто заставит таблицу вернуть строки по каждому периоду. Чтобы этого избежать, установите периодичность в значение Период (что означает получение итогов за весь указанный интервал одной строкой).

Причина 4. Глюк настройки «Расположение итогов»

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

Причина 5. Роли полей и проверка уникальности

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

Алгоритм диагностики для разработчика

Если вы столкнулись с задваиванием, выполните следующие действия:

  1. Проверьте исходник: В процедуре ПриКомпоновкеРезультата выгрузите вашу ТаблицуЗначений в отладчике и убедитесь, что в ней нет дублей.
  2. Выведите все поля: Добавьте в отчет абсолютно все поля из всех наборов данных. Зачастую оказывается, что строки «почти» одинаковые, но различаются каким-то скрытым параметром (например, пустым значением субконто или системным периодом).
  3. Минимизируйте макеты: Если у вас созданы собственные макеты на закладке Макеты, проверьте, не назначена ли одна и та же область детальных записей дважды.
  4. Используйте консоль компоновки: Откройте вашу схему в консоли системы компоновки данных. Если там отчет работает корректно, значит проблема в программном коде вызова или в кэшированных настройках формы.

Соблюдение этих правил и внимательный анализ связей наборов данных позволяют избежать большинства проблем с корректностью вывода данных в 1С.

← На главную