При работе с внешними обработками на обычных формах в 1С:Предприятие 8 часто используется стандартный механизм платформы «Сохранять значения». Это очень удобно для пользователей: один раз заполнив реквизиты (например, организацию, период или путь к файлу), они не вынуждены вводить их снова при каждом открытии. Однако перед разработчиком нередко встает задача программного доступа к этим данным. Например, когда нужно скопировать настройки от одного пользователя другому или перенести их в новую версию обработки.
В этой статье мы подробно разберем механизм хранения этих данных, выясним, почему их не всегда удается найти простым перебором хранилищ, и научимся извлекать и записывать их с помощью программного кода.
Проанализируем ситуацию: если в свойствах формы установлена галочка «Сохранять значения» и выбраны соответствующие реквизиты, платформа берет на себя управление их жизненным циклом. Важно понимать, что для внешних обработок, которые открываются через меню «Файл — Открыть», механизм хранения имеет свои особенности.
Многие ошибочно полагают, что эти данные хранятся в локальном кэше пользователя на компьютере. Однако, как показывает практика, настройки сохраняются даже после очистки кэша и при переезде пользователя на другой компьютер (в рамках одной информационной базы). Это однозначно указывает на то, что данные хранятся внутри информационной базы в системных таблицах (для SQL-версий — это таблица Files или SystemSettings).
Доступ к этим данным из кода осуществляется через объект ХранилищеСистемныхНастроек. Рассмотрим подробнее, почему стандартный метод Выбрать() часто не показывает нужные записи.
Платформа 1С использует строго определенную иерархию ключей для идентификации настроек. Если мы имеем дело с внешней обработкой, ключи формируются следующим образом:
ВнешняяОбработка.[ИмяОбработкиИзМетаданных]. Обратите внимание, что используется именно внутреннее имя, заданное в Конфигураторе, а не имя файла .epf на диске.ДанныеФормы или НастройкиФормы.Выясним причину, по которой поиск через Выбрать() может быть затруднен: без указания точного префикса ключа объекта или при наличии большого количества системных записей, настройки внешних объектов могут «теряться» в общем потоке данных.
Рассмотрим, как мы можем программно прочитать сохраненные значения. Допустим, у нас есть внешняя обработка с внутренним именем ЗагрузкаДанныхИзExcel.
Для начала нам необходимо определить, от лица какого пользователя мы хотим получить настройки. Если пользователь не указан, система попытается получить данные текущего сеанса. Посмотрим на пример кода:
// Определяем ключи доступа
КлючОбъекта = "ВнешняяОбработка.ЗагрузкаДанныхИзExcel";
КлючНастроек = "ДанныеФормы";
// Пытаемся загрузить настройки из системного хранилища
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастроек);
Если Настройки <> Неопределено Тогда
// Обычно настройки возвращаются в виде структуры или соответствия
Для Каждого ТекНастройка Из Настройки Цикл
Сообщить("Реквизит: " + ТекНастройка.Ключ + ", Значение: " + ТекНастройка.Значение);
КонецЦикла;
Иначе
Сообщить("Настройки для данной обработки не найдены.");
КонецЕсли;
Важный нюанс: если вы меняли имя обработки в Конфигураторе, старые настройки, сохраненные под прежним именем, станут недоступны через интерфейс, так как ключ объекта изменится.
Одной из наиболее частых задач является перенос настроек от «эталонного» пользователя всем остальным. Поскольку ХранилищеСистемныхНастроек позволяет указывать имя пользователя в качестве параметра, мы можем легко реализовать процедуру копирования.
Проанализируем следующий алгоритм:
Пример реализации функции копирования:
Процедура СкопироватьНастройкиОбработки(ИмяОбработки, ОтКого, Кому)
КлючОбъекта = "ВнешняяОбработка." + ИмяОбработки;
КлючНастроек = "ДанныеФормы";
// Получаем настройки исходного пользователя
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастроек, , ОтКого);
Если Настройки <> Неопределено Тогда
// Записываем настройки целевому пользователю
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, , Кому);
Сообщить("Настройки успешно скопированы для пользователя: " + Кому);
КонецЕсли;
КонецПроцедуры
Разберем ситуацию, которая часто сбивает с толку начинающих разработчиков: вы переименовали файл обработки на диске или перенесли его в другую папку, а настройки формы сохранились. Это происходит потому, что для платформы идентификатором является не путь к файлу, а его внутренняя структура и метаданные.
Однако стоит учитывать, что в очень старых релизах платформы 8.2 (или в режиме совместимости с ними) настройки могли привязываться к пути. В современных реалиях 8.3 обычное приложение ведет себя более стабильно, привязывая настройки к внутреннему идентификатору или имени объекта метаданных.
Иногда в конфигурациях, разработанных на базе «1С:Управление торговлей 10.3» или «1С:Бухгалтерия 2.0», программно переопределяются механизмы сохранения. В этом случае данные могут попадать в регистр сведений СохраненныеНастройки.
Но если вы используете штатную галочку в свойствах формы и не прописывали код сохранения вручную в процедурах ПриЗакрытии или ПередЗакрытием, то в регистре вы ничего не найдете. Механизм платформы работает на более низком уровне и не создает записей в объектах метаданных конфигурации.
Если вам необходимо «сбросить» настройки, которые мешают нормальной работе формы (например, из-за ошибки в сохраненных данных), можно воспользоваться методом удаления:
ХранилищеСистемныхНастроек.Удалить("ВнешняяОбработка.ИмяВашейОбработки", "ДанныеФормы", "ИмяПользователя");
Это гораздо эффективнее и корректнее, чем пересоздание формы в Конфигураторе, так как позволяет точечно управлять данными в рабочей базе без изменения кода обработки.
Мы выяснили, что сохраненные значения обычных форм внешних обработок надежно защищены от очистки кэша, так как находятся в системном хранилище базы данных. Для работы с ними программисту необходимо использовать объект ХранилищеСистемныхНастроек, четко понимая структуру формирования КлючаОбъекта. Использование приведенных выше примеров кода позволит вам гибко управлять пользовательскими предпочтениями и упростит администрирование внешних разработок.