Почему программный отбор в отчетах на СКД не работает в типовых конфигурациях?

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

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

Разбор архитектурной проблемы

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

Решение 1: Использование фиксированных настроек

Если ваша задача — сделать отбор обязательным, который пользователь не должен иметь возможности отключить или изменить, самым надежным способом является работа с ФиксированнымиНастройками. В отличие от пользовательских настроек, фиксированные настройки имеют более высокий приоритет и не перезаписываются механизмами БСП при инициализации отчета.

Посмотрим, как выглядит корректный пример кода:


// Вместо КомпоновщикНастроек.Настройки используем ФиксированныеНастройки
НовыйЭлементОтбора = КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных("Номенклатура");
НовыйЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
НовыйЭлементОтбора.Использование = Истина;
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;

СписокНоменклатур = Новый СписокЗначений;
СписокНоменклатур.ЗагрузитьЗначения(мНоменклатур);
НовыйЭлементОтбора.ПравоеЗначение = СписокНоменклатур;

Решение 2: Получение настроек через метод ПолучитьНастройки()

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

Важные замечания при работе в фоновых заданиях

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

  1. Передавайте данные через параметры СКД. Вместо добавления элемента отбора программно, определите в СКД параметр (например, &СписокНоменклатур). В условиях отбора используйте выражение Номенклатура В (&СписокНоменклатур).
  2. Проверяйте контекст. Если вы все же используете программный отбор, перед компоновкой обязательно убедитесь, что массив данных, который вы передаете в ПравоеЗначение, действительно заполнен в текущем контексте исполнения.

Советы по отладке

Если вы столкнулись с тем, что отбор «исчезает» в процессе формирования, выполните следующие шаги:

Помните, что использование ФиксированныхНастроек — это самый простой и быстрый способ «заставить» отчет принудительно использовать ваши условия отбора, игнорируя попытки системы их изменить.

← На главную