Разработчики нередко сталкиваются с ситуацией: во внешней обработке на обычных формах (ОФ) включено свойство Сохранять значения, отмечены нужные реквизиты, но при попытке программно получить эти данные через ХранилищеОбщихНастроек или системные таблицы оказывается, что там пусто. Более того, у отдельных пользователей сохраненные параметры периодически бесследно исчезают. Проанализируем, как устроен этот механизм платформы 1С, где физически находятся данные и как сделать сохранение параметров стабильным.
Разберем принципиальное различие между управляемым и обычным интерфейсом. В управляемых формах настройки по умолчанию помещаются в базу данных через специализированные хранилища настроек. В режиме обычных форм при использовании стандартного свойства формы Сохранять значения платформа работает иначе:
.pfl (например, 1Cv8.pfl). По этой причине искать их в ХранилищеОбщихНастроек бессмысленно.%APPDATA%\1C\1Cv8... (ветка Roaming). Стандартная процедура очистки кэша, которую часто выполняют системные администраторы, обычно затрагивает папку Local AppData (где лежат кэшированные метаданные и динамические модули). Поэтому удаление локального кэша не сбрасывает настройки формы, так как они хранятся в Roaming.Выясним главные причины, по которым пользователи теряют введенные параметры в обычных формах:
AppData и собственный файл .pfl. При переключении между серверами пользователю кажется, что настройки «пропали».1Cv8.pfl может повредиться или перезаписаться пустым содержимым.Рассмотрим самый надежный способ, позволяющий исключить зависимость от файлов на рабочих станциях. Мы откажемся от стандартной галочки Сохранять значения в свойствах формы и напишем явное сохранение настроек непосредственно в базу данных.
Разберем по шагам реализацию в модуле формы внешней обработки:
В обработчике ПриОткрытии загружаем сохраненные данные:
Процедура ПриОткрытии()
КлючОбъекта = "ВнешняяОбработка_ИмяОбработки";
КлючНастроек = "НастройкиПоУмолчанию";
Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
Если ТипЗнч(Настройки) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Настройки);
КонецЕсли;
КонецПроцедуры
В обработчике ПередЗакрытием или ПриЗакрытии сохраняем реквизиты в базу данных:
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
КлючОбъекта = "ВнешняяОбработка_ИмяОбработки";
КлючНастроек = "НастройкиПоУмолчанию";
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("Организация", Организация);
СтруктураНастроек.Вставить("ПериодС", ПериодС);
СтруктураНастроек.Вставить("ПериодПо", ПериодПо);
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, СтруктураНастроек);
КонецПроцедуры
При таком подходе данные хранятся централизованно в таблицах базы 1С. Пользователь получит свои настройки на любом компьютере и сервере терминалов вне зависимости от состояния папки AppData.
Посмотрим на классический механизм обычных форм, использующий встроенные функции работы со значениями пользователя:
// Сохранение данных
СтруктураПараметров = Новый Структура("Организация, Склад", Организация, Склад);
СохранитьЗначение("Обработка_ИмяОбработки_Настройки", СтруктураПараметров);
// Восстановление данных
СтруктураПараметров = ВосстановитьЗначение("Обработка_ИмяОбработки_Настройки");
Если ТипЗнч(СтруктураПараметров) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, СтруктураПараметров);
КонецЕсли;
Этот метод проще в написании, но важно помнить, что в зависимости от настроек конфигурации данные также могут быть привязаны к локальному профилю текущего пользователя.
Если необходимо оставить стандартный механизм со свойством формы Сохранять значения, выполним следующие действия для устранения ошибок:
C:\1C_External\ProcessingName.epf) и настроим запуск только из этого каталога, исключая открытие из временных папок почты или мессенджеров.