Почему в СКД не выводятся итоги по группировкам и не работают отборы на форме?

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

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

Разбираемся с итогами: почему пустуют ресурсы?

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

1. Проверка размещения итогов в настройках

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

  1. Расположение итогов по вертикали: Если здесь установлено значение Нет, итоги будут рассчитаны внутри системы, но не выведены в таблицу. Установим значение Конец или Начало и конец.
  2. Расположение итогов по горизонтали: Аналогично проверьте этот параметр, если итоги должны выводиться в колонках.
  3. Расположение группировок: Иногда при использовании режима Отдельно и только в итоге строки данных скрываются, что создает иллюзию отсутствия итогов.

2. Роли полей и типы данных

Если настройки отображения верны, но цифр всё равно нет, выясним причину в определении данных. Перейдем на закладку Набор данных:

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

Обратите внимание на колонку Роль. Для полей, участвующих в расчетах в иерархических отчетах, важно правильно настроить измерение. Если у поля группировки стоит флаг Без итогов, это заблокирует вывод сумм по этой ветке.

3. Взаимодействие группировок и ресурсов

Разберем важный момент: настройка Рассчитывать по... на закладке Ресурсы. Если вы указали конкретные группировки, убедитесь, что в этот список включен Общий итог, иначе в самой нижней строке отчета (подвале) сумма не появится. Также проверьте, что ресурс включен в Выбранные поля конкретной группировки. Если там снят флаг Авто и ресурс не добавлен вручную, колонка будет пустой.

Почему отборы на форме не «слушаются» компоновщик?

Ситуация, когда отбор работает из диалога настроек, но не работает из поля на форме, — классическая проблема рассинхронизации Компоновщика настроек.

1. Связь с пользовательскими настройками

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

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

2. Программная инициализация отборов

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


// Убедимся, что пользовательские настройки содержат нужные нам элементы
Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);

// Если мы программно добавляем отбор, обязательно генерируем ID
НовыйОтбор = Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
НовыйОтбор.Использование = Истина;
НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
НовыйОтбор.ИдентификаторПользовательскойНастройки = "ОтборПоОрганизации";

3. Синхронизация данных при изменении

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

  1. Находим нужный элемент в Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы по идентификатору.
  2. Устанавливаем новое значение и флаг использования.
  3. Вызываем стандартные механизмы обновления отчета.

Дополнительные рекомендации и «подводные камни»

Проанализируем еще несколько ситуаций, которые могут влиять на поведение СКД.

Кэширование настроек в сеансе пользователя

Часто разработчик вносит изменения в конфигураторе (например, добавляет итог), но в режиме «1С:Предприятие» ничего не меняется. Это происходит потому, что система сохранила старые настройки пользователя. Для решения этой проблемы выполните следующие действия:

Использование функции ВычислитьВыражение

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


// Пример расчета суммы по группировке относительно общего итога
Сумма(СуммаОборот) / ВычислитьВыражение("Сумма(СуммаОборот)", , "ОбщийИтог") * 100

Свойство «Автозаполнение»

Убедитесь, что в тексте запроса набора данных включена галочка Автозаполнение. Без неё СКД не сможет автоматически определить доступные поля для отборов и итогов, и вам придется прописывать каждое поле в секции {ПОЛЯ_КОМПОНОВКИ} вручную, что часто ведет к ошибкам и «потере» данных.

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

← На главную