Как сохраняются настройки внешних обработок в обычных формах и почему они пропадают?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Разработчики нередко сталкиваются с ситуацией: во внешней обработке на обычных формах (ОФ) включено свойство Сохранять значения, отмечены нужные реквизиты, но при попытке программно получить эти данные через ХранилищеОбщихНастроек или системные таблицы оказывается, что там пусто. Более того, у отдельных пользователей сохраненные параметры периодически бесследно исчезают. Проанализируем, как устроен этот механизм платформы 1С, где физически находятся данные и как сделать сохранение параметров стабильным.

Куда платформа сохраняет стандартные настройки в обычных формах

Разберем принципиальное различие между управляемым и обычным интерфейсом. В управляемых формах настройки по умолчанию помещаются в базу данных через специализированные хранилища настроек. В режиме обычных форм при использовании стандартного свойства формы Сохранять значения платформа работает иначе:

  1. Файловое хранение параметров: Платформа сохраняет значения не в таблицах информационной базы, а в файлах настроек пользователя операционной системы с расширением .pfl (например, 1Cv8.pfl). По этой причине искать их в ХранилищеОбщихНастроек бессмысленно.
  2. Расположение в профиле пользователя: Файлы с настройками форм находятся в перемещаемой части профиля Windows — каталоге %APPDATA%\1C\1Cv8... (ветка Roaming). Стандартная процедура очистки кэша, которую часто выполняют системные администраторы, обычно затрагивает папку Local AppData (где лежат кэшированные метаданные и динамические модули). Поэтому удаление локального кэша не сбрасывает настройки формы, так как они хранятся в Roaming.
  3. Идентификация внешней обработки: Для внешних отчетов и обработок платформа не опирается на путь к файлу на диске или имя файла. Привязка настроек выполняется по внутреннему уникальному идентификатору (UUID) объекта и формы. Если обработка была создана простым копированием существующего файла через проводник операционной системы или команду «Сохранить как», внутренний UUID формы не меняется. В результате две визуально разные обработки могут перезаписывать настройки друг друга.

Почему настройки периодически пропадают у пользователей

Выясним главные причины, по которым пользователи теряют введенные параметры в обычных формах:

  1. Работа на терминальных фермах (RDS / NLB): Если в компании развернута ферма терминальных серверов без перемещаемых профилей (Roaming User Profiles) или контейнеров профилей, пользователь при каждом новом входе может попадать на разные серверы. На каждом узле формируется свой локальный каталог AppData и собственный файл .pfl. При переключении между серверами пользователю кажется, что настройки «пропали».
  2. Повреждение файла настроек при аварийном завершении: Если сеанс 1С завершается аварийно (сбой питания, закрытие по «крестику» зависшего терминального сеанса, принудительное завершение процесса через диспетчер задач), файл 1Cv8.pfl может повредиться или перезаписаться пустым содержимым.
  3. Открытие обработки из временных папок: Запуск обработки напрямую из почтовой программы, браузера или zip-архива приводит к тому, что операционная система помещает файл во временные каталоги с непредсказуемым контекстом сеанса.
  4. Скрипты очистки профилей пользователей: Регламентные скрипты очистки дисков терминальных серверов могут удалять не только временные файлы, но и модифицированные файлы профиля в каталоге пользователя.

Решение 1. Программное сохранение в ХранилищеОбщихНастроек (рекомендуемый способ)

Рассмотрим самый надежный способ, позволяющий исключить зависимость от файлов на рабочих станциях. Мы откажемся от стандартной галочки Сохранять значения в свойствах формы и напишем явное сохранение настроек непосредственно в базу данных.

Разберем по шагам реализацию в модуле формы внешней обработки:

В обработчике ПриОткрытии загружаем сохраненные данные:


Процедура ПриОткрытии()
    КлючОбъекта = "ВнешняяОбработка_ИмяОбработки";
    КлючНастроек = "НастройкиПоУмолчанию";
    
    Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
    
    Если ТипЗнч(Настройки) = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, Настройки);
    КонецЕсли;
КонецПроцедуры

В обработчике ПередЗакрытием или ПриЗакрытии сохраняем реквизиты в базу данных:


Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    КлючОбъекта = "ВнешняяОбработка_ИмяОбработки";
    КлючНастроек = "НастройкиПоУмолчанию";
    
    СтруктураНастроек = Новый Структура;
    СтруктураНастроек.Вставить("Организация", Организация);
    СтруктураНастроек.Вставить("ПериодС", ПериодС);
    СтруктураНастроек.Вставить("ПериодПо", ПериодПо);
    
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, СтруктураНастроек);
КонецПроцедуры

При таком подходе данные хранятся централизованно в таблицах базы 1С. Пользователь получит свои настройки на любом компьютере и сервере терминалов вне зависимости от состояния папки AppData.

Решение 2. Использование платформенных методов СохранитьЗначение и ВосстановитьЗначение

Посмотрим на классический механизм обычных форм, использующий встроенные функции работы со значениями пользователя:


// Сохранение данных
СтруктураПараметров = Новый Структура("Организация, Склад", Организация, Склад);
СохранитьЗначение("Обработка_ИмяОбработки_Настройки", СтруктураПараметров);

// Восстановление данных
СтруктураПараметров = ВосстановитьЗначение("Обработка_ИмяОбработки_Настройки");
Если ТипЗнч(СтруктураПараметров) = Тип("Структура") Тогда
    ЗаполнитьЗначенияСвойств(ЭтотОбъект, СтруктураПараметров);
КонецЕсли;

Этот метод проще в написании, но важно помнить, что в зависимости от настроек конфигурации данные также могут быть привязаны к локальному профилю текущего пользователя.

Решение 3. Устранение коллизий при стандартном сохранении

Если необходимо оставить стандартный механизм со свойством формы Сохранять значения, выполним следующие действия для устранения ошибок:

  1. Устранение дублирования внутренних идентификаторов: Если обработка копировалась из другой, создадим в конфигураторе новую форму «с нуля» через мастер добавления форм, перенесем на нее реквизиты и назначим ее основной. Это сгенерирует уникальный UUID формы, и настройки перестанут перезаписываться другими обработками.
  2. Фиксация расположения файла: Сохраним файл обработки в фиксированную общую или локальную директорию (например, C:\1C_External\ProcessingName.epf) и настроим запуск только из этого каталога, исключая открытие из временных папок почты или мессенджеров.
  3. Проверка терминального профиля: Совместно с системными администраторами убедимся, что для пользователя на терминальном сервере настроено сохранение профиля при выходе из сеанса.
← На главную