При переходе на новые версии платформы 1С:Предприятие 8.3 (особенно линейки 8.3.15, 8.3.16 и выше) многие разработчики и администраторы сталкиваются с неприятным поведением системы: у пользователей внезапно «слетают» индивидуальные настройки управляемых форм. Сбрасывается видимость и ширина колонок, порядок их расположения, а также правила условного оформления динамических списков. Ситуация усугубляется, когда пользователи работают в терминальном режиме (RDP/RemoteApp) или когда управляемые формы открываются внутри обычного (толстого) клиента.
В этой статье мы подробно проанализируем причины этой проблемы и разберем по шагам практические методы ее решения — от административных настроек сервера до программного обхода системных ограничений.
Для эффективного решения проблемы сначала необходимо понять физику процесса. Платформа 1С сохраняет пользовательские настройки интерфейса в специальный системный кэш и базу данных. Сбои в этом механизме происходят под влиянием трех основных факторов:
1cv8.exe аварийно уничтожается операционной системой. Платформа физически не успевает записать накопленные кэш-файлы из оперативной памяти на диск. Кроме того, использование временных профилей пользователей на терминальном сервере или отсутствие прав на запись в папки %APPDATA%\1C и %LOCALAPPDATA%\1C гарантированно приводит к потере настроек после каждого завершения сеанса.КомпоновщикНастроекКомпоновкиДанных.Восстановить() автоматически удаляет пользовательские настройки из хранилища, если они теряют связь со схемой запроса. Если в конфигурации было выполнено динамическое («демоническое») обновление, или если в запросе динамического списка изменилось хотя бы одно поле (или его псевдоним), платформа считает старые настройки невалидными и полностью их очищает.Самым надежным способом борьбы со «слетанием» настроек в гибридном режиме является принудительное сохранение структуры динамического списка через программный код. Мы можем задействовать встроенные механизмы работы с хранилищем общих настроек.
Рассмотрим по шагам реализацию этого механизма для управляемой формы списка документов.
Шаг 1. Перехват закрытия формы и запись настроек.
Нам необходимо принудительно сохранять текущие настройки динамического списка при закрытии формы пользователем. Для этого в модуле управляемой формы определим обработчик события ПриЗакрытии:
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
// Вызываем серверный метод для принудительной записи настроек в хранилище
СохранитьНастройкиСпискаНаСервере();
КонецПроцедуры
На сервере реализуем процедуру сохранения настроек. Мы будем использовать глобальный объект ХранилищеОбщихНастроек, связывая настройки с именем текущего пользователя:
&НаСервере
Процедура СохранитьНастройкиСпискаНаСервере()
// Формируем уникальный ключ для сохранения настроек конкретной формы списка
КлючОбъекта = "НастройкиФормыСписка_" + ИмяФормы;
КлючНастройки = "Пользователь_" + ПараметрыСеанса.ТекущийПользователь.Имя;
// Получаем текущие настройки компоновщика динамического списка
ТекущиеНастройки = Список.КомпоновщикНастроек.ПолучитьНастройки();
// Записываем настройки в системное хранилище общих настроек конфигурации
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастройки, ТекущиеНастройки);
КонецПроцедуры
Шаг 2. Восстановление настроек при открытии формы.
Теперь нужно гарантировать, что при открытии формы сохраненные настройки будут принудительно применены к динамическому списку. Для этого используем обработчик события ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Формируем ключи для поиска сохраненных данных
КлючОбъекта = "НастройкиФормыСписка_" + ИмяФормы;
КлючНастройки = "Пользователь_" + ПараметрыСеанса.ТекущийПользователь.Имя;
// Загружаем настройки из хранилища общих настроек
СохраненныеНастройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастройки);
Если СохраненныеНастройки <> Неопределено Тогда
// Загружаем настройки в компоновщик нашего списка документов
Список.КомпоновщикНастроек.ЗагрузитьНастройки(СохраненныеНастройки);
КонецЕсли;
КонецПроцедуры
Этот простой обходной путь позволяет полностью исключить влияние сбоев кэша платформы на конкретную форму, поскольку настройки теперь хранятся централизованно в базе данных. Для администрирования, очистки и восстановления данных системного хранилища форм можно использовать обработку для управления хранилищем настроек пользователей.
Если в вашей конфигурации уже есть регистр сведений для хранения пользовательских настроек (например, в старых типовых решениях это часто регистр СохраненныеНастройки), логично задействовать его потенциал. Это позволит администраторам централизованно управлять настройками пользователей, копировать их между сотрудниками или сбрасывать некорректные конфигурации экранов. Для централизованного сохранения настроек форм без доработки метаданных можно использовать внешнюю обработку для сохранения настроек формы для всех пользователей.
Для интеграции управляемой формы с таким регистром выполните следующие действия:
Список.КомпоновщикНастроек.ПолучитьНастройки().ХранилищеЗначения, связав запись измерениями с пользователем и метаданными формы.ХранилищеЗначения и применяйте их методом Список.КомпоновщикНастроек.ЗагрузитьНастройки().Если дорабатывать конфигурацию программно нет возможности, проблему можно существенно минимизировать правильной настройкой операционной системы на терминальном сервере и регламентами работы:
%APPDATA%\1C\1Cv8
%LOCALAPPDATA%\1C\1Cv8
Проанализируем также поведение самой платформы 1С. Поскольку на релизе 8.3.15.1656 наблюдались внутренние ошибки кэширования настроек управляемых форм в многопоточном режиме работы сервера приложений, настоятельно рекомендуется выполнить обновление технологической платформы.
Переход на актуальные стабильные релизы веток 8.3.18, 8.3.20 или старше позволяет решить данную проблему без изменения программного кода, так как в этих версиях разработчики 1С оптимизировали синхронизацию кэша системных хранилищ между рабочими процессами rphost сервера приложений.