Почему слетают пользовательские настройки управляемых форм в 1С и как решить эту проблему?

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

При переходе на новые версии платформы 1С:Предприятие 8.3 (особенно линейки 8.3.15, 8.3.16 и выше) многие разработчики и администраторы сталкиваются с неприятным поведением системы: у пользователей внезапно «слетают» индивидуальные настройки управляемых форм. Сбрасывается видимость и ширина колонок, порядок их расположения, а также правила условного оформления динамических списков. Ситуация усугубляется, когда пользователи работают в терминальном режиме (RDP/RemoteApp) или когда управляемые формы открываются внутри обычного (толстого) клиента.

В этой статье мы подробно проанализируем причины этой проблемы и разберем по шагам практические методы ее решения — от административных настроек сервера до программного обхода системных ограничений.


Выясняем причины: почему пропадают настройки?

Для эффективного решения проблемы сначала необходимо понять физику процесса. Платформа 1С сохраняет пользовательские настройки интерфейса в специальный системный кэш и базу данных. Сбои в этом механизме происходят под влиянием трех основных факторов:

  1. Специфика гибридного режима работы. Когда мы открываем управляемую форму внутри обычного приложения (толстого клиента), стандартные механизмы платформы по сохранению настроек формы работают нестабильно. Системные события закрытия формы не всегда корректно регистрируются платформой для записи в хранилище настроек. Как результат — изменения, внесенные пользователем, теряются при закрытии сеанса.
  2. Особенности работы в терминальном окружении (RDP/RemoteApp). Если пользователи некорректно завершают работу с терминалом (например, закрывают окно подключения «крестиком» вместо выхода из программы), процесс 1cv8.exe аварийно уничтожается операционной системой. Платформа физически не успевает записать накопленные кэш-файлы из оперативной памяти на диск. Кроме того, использование временных профилей пользователей на терминальном сервере или отсутствие прав на запись в папки %APPDATA%\1C и %LOCALAPPDATA%\1C гарантированно приводит к потере настроек после каждого завершения сеанса.
  3. Поведение оптимизатора платформы (начиная с версии 8.3.15). Начиная с этих релизов, разработчики 1С оптимизировали механизм компоновки данных. Системный метод КомпоновщикНастроекКомпоновкиДанных.Восстановить() автоматически удаляет пользовательские настройки из хранилища, если они теряют связь со схемой запроса. Если в конфигурации было выполнено динамическое («демоническое») обновление, или если в запросе динамического списка изменилось хотя бы одно поле (или его псевдоним), платформа считает старые настройки невалидными и полностью их очищает.

Решение 1: Программное принудительное сохранение настроек

Самым надежным способом борьбы со «слетанием» настроек в гибридном режиме является принудительное сохранение структуры динамического списка через программный код. Мы можем задействовать встроенные механизмы работы с хранилищем общих настроек.

Рассмотрим по шагам реализацию этого механизма для управляемой формы списка документов.

Шаг 1. Перехват закрытия формы и запись настроек.

Нам необходимо принудительно сохранять текущие настройки динамического списка при закрытии формы пользователем. Для этого в модуле управляемой формы определим обработчик события ПриЗакрытии:


&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
    
    // Вызываем серверный метод для принудительной записи настроек в хранилище
    СохранитьНастройкиСпискаНаСервере();
    
КонецПроцедуры

На сервере реализуем процедуру сохранения настроек. Мы будем использовать глобальный объект ХранилищеОбщихНастроек, связывая настройки с именем текущего пользователя:


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

Шаг 2. Восстановление настроек при открытии формы.

Теперь нужно гарантировать, что при открытии формы сохраненные настройки будут принудительно применены к динамическому списку. Для этого используем обработчик события ПриСозданииНаСервере:


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

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


Решение 2: Использование специализированного регистра сведений

Если в вашей конфигурации уже есть регистр сведений для хранения пользовательских настроек (например, в старых типовых решениях это часто регистр СохраненныеНастройки), логично задействовать его потенциал. Это позволит администраторам централизованно управлять настройками пользователей, копировать их между сотрудниками или сбрасывать некорректные конфигурации экранов. Для централизованного сохранения настроек форм без доработки метаданных можно использовать внешнюю обработку для сохранения настроек формы для всех пользователей.

Для интеграции управляемой формы с таким регистром выполните следующие действия:

  1. При закрытии управляемой формы получайте структуру настроек динамического списка с помощью метода Список.КомпоновщикНастроек.ПолучитьНастройки().
  2. Преобразуйте полученный объект настроек в XML-строку с помощью сериализатора XDTO или поместите его во временное хранилище и преобразуйте в двоичные данные.
  3. Запишите полученные данные в ресурс регистра сведений с типом ХранилищеЗначения, связав запись измерениями с пользователем и метаданными формы.
  4. При создании формы на сервере считывайте запись из регистра, извлекайте настройки из ХранилищеЗначения и применяйте их методом Список.КомпоновщикНастроек.ЗагрузитьНастройки().

Решение 3: Администрирование терминального сервера и кэша

Если дорабатывать конфигурацию программно нет возможности, проблему можно существенно минимизировать правильной настройкой операционной системы на терминальном сервере и регламентами работы:


Решение 4: Стабилизация работы платформы

Проанализируем также поведение самой платформы 1С. Поскольку на релизе 8.3.15.1656 наблюдались внутренние ошибки кэширования настроек управляемых форм в многопоточном режиме работы сервера приложений, настоятельно рекомендуется выполнить обновление технологической платформы.

Переход на актуальные стабильные релизы веток 8.3.18, 8.3.20 или старше позволяет решить данную проблему без изменения программного кода, так как в этих версиях разработчики 1С оптимизировали синхронизацию кэша системных хранилищ между рабочими процессами rphost сервера приложений.

← На главную