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