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