При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда программно созданный объект отчета "не видит" новые варианты настроек или упорно использует старые данные, которые, казалось бы, уже удалены. Особенно остро эта проблема проявляется при работе с внешними отчетами (файлы .erf) в режиме обычных форм. Рассмотрим подробно, почему возникают такие сложности и как правильно управлять настройками через код.
Первая распространенная ошибка заключается в способе обращения к коллекции вариантов настроек. Проанализируем ситуацию: в схеме создан вариант с именем "Робот", но код СхемаКомпоновкиДанных.ВариантыНастроек.Робот выдает ошибку или возвращает неопределенное значение. Это происходит потому, что обращение через точку работает только для имени варианта, заданного в конфигураторе, а не для его представления (заголовка), который видит пользователь.
Разберем, как правильно обращаться к вариантам, чтобы избежать ошибок:
Найти() или перебор коллекции.Рассмотрим пример кода для надежного поиска варианта:
// Поиск варианта по внутреннему имени
ИскомоеИмя = "Робот";
Вариант = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(ИскомоеИмя);
Если Вариант <> Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
Иначе
// Если по имени не нашли, можно попробовать найти по представлению (заголовку)
Для Каждого ТекВариант Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
Если ТекВариант.Представление = "Робот" Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(ТекВариант.Настройки);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если вы изменили схему во внешнем файле (удалили старую настройку "Основной", добавили новую), но программа продолжает видеть старую структуру, виной всему кэширование. Когда выполняется метод ВнешниеОтчеты.Создать(ИмяФайла), платформа 1С может взять описание объекта из кэша текущего сеанса, если этот файл уже открывался ранее.
Чтобы гарантированно получить актуальную схему, проанализируем следующие действия:
Часто путают два разных понятия в СКД: Настройки (общая структура отчета) и Пользовательские настройки (конкретные значения фильтров и параметров, которые пользователь изменил "под себя").
Если пользователь сохранил настройки через стандартную кнопку (синяя дискета), они попадают в Хранилище системных настроек. Чтобы программно их достать, нужно точно знать КлючОбъекта. Рассмотрим, как он формируется для внешних отчетов.
Выясним причину, по которой ХранилищеСистемныхНастроек.Выбрать() часто возвращает пустой результат. Для внешнего отчета КлючОбъекта обычно строится по шаблону: ВнешнийОтчет.ИмяОтчета. Важно: ИмяОтчета берется не из имени файла на диске, а из свойства "Имя" в корне метаданных самого файла .erf.
Посмотрим на пример правильной загрузки пользовательских настроек:
// 1. Инициализируем отчет
НужныйОтчет = ВнешниеОтчеты.Создать(ПутьКФайлу, Ложь);
Схема = НужныйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 2. Формируем ключ объекта. ВАЖНО: берем имя из метаданных отчета
КлючОбъекта = "ВнешнийОтчет." + НужныйОтчет.Метаданные().Имя;
КлючНастроек = ""; // Обычно пустая строка для основной настройки
// 3. Загружаем из хранилища
СохраненныеНастройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастроек);
Если ТипЗнч(СохраненныеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
// Если в хранилище лежат полные настройки
НужныйОтчет.КомпоновщикНастроек.ЗагрузитьНастройки(СохраненныеНастройки);
ИначеЕсли ТипЗнч(СохраненныеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
// Если там только пользовательские значения
НужныйОтчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(СохраненныеНастройки);
КонецЕсли;
В обычных формах за сохранение значений может отвечать не механизм СКД, а стандартное свойство формы СохранятьЗначения. В этом случае данные сохраняются не в СКД-хранилище, а в ХранилищеОбщихНастроек под ключом, соответствующим имени формы отчета.
Проанализируем ситуацию: если вы используете типовую панель настроек СКД, которая встроена в форму, то сохранение идет именно в разрезе вариантов СКД. Если же вы используете "синюю дискету" в шапке окна формы, то настройки привязаны к реквизитам формы.
Алгоритм программного восстановления настроек для формирования отчета:
ВнешниеОтчеты.Создать().КомпоновщикНастроек схемой компоновки.ЗагрузитьНастройки().ЗагрузитьПользовательскиеНастройки().КомпоновщикНастроек.Настройки.ПараметрыДанных.КомпоновщикНастроек.Восстановить(). Это критически важный метод, который синхронизирует загруженные настройки с доступными полями схемы, чтобы избежать пустых отборов или ошибок исполнения.Пример программной установки параметров после загрузки настроек:
// Установка периода в настройках
ПараметрДатаНачала = НужныйОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");
Если ПараметрДатаНачала <> Неопределено Тогда
ПараметрДатаНачала.Значение = НачалоДня(ТекущаяДата());
ПараметрДатаНачала.Использование = Истина;
КонецЕсли;
// Обязательная синхронизация
НужныйОтчет.КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное);
Таким образом, для успешной программной настройки отчета необходимо четко разделять уровни настроек (схема -> вариант -> пользовательские правки) и корректно формировать ключи для обращения к системным хранилищам, учитывая специфику метаданных внешнего файла.