В процессе разработки и поддержки конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с наследием предыдущих версий. Функции СохранитьЗначение и ВосстановитьЗначение являются классическим примером такого «атавизма», пришедшего еще из версии 7.7. Несмотря на свою простоту, они имеют ряд особенностей хранения данных, которые могут приводить к трудностям при необходимости массовой очистки настроек или при возникновении интерфейсных ошибок.
В этой статье мы подробно разберем, как устроены эти механизмы, где физически хранятся данные и какими способами можно выполнить их очистку, чтобы избежать проблем с отображением элементов управления на экране.
Прежде чем приступать к удалению данных, проанализируем, где именно система их хранит. В отличие от современных механизмов, использующих базу данных, функции СохранитьЗначение и ВосстановитьЗначение работают локально. В толстом клиенте эти данные записываются в файл профиля пользователя на конкретном рабочем месте. Обычно это файл с расширением .pfl, расположенный в каталоге кэша пользователя по пути:
%AppData%\1C\1cv8\[ID базы]\[ID пользователя]\
Такой подход накладывает серьезные ограничения: мы не можем централизованно очистить эти значения для всех пользователей сразу программным кодом с сервера, так как физически данные разбросаны по локальным дискам рабочих станций или терминальных серверов.
Если нам необходимо «удалить» конкретное значение по известному ключу (имени), мы не можем использовать метод Удалить(), так как его просто не существует для данного глобального контекста. Рассмотрим, как можно имитировать удаление значения. Мы можем перезаписать существующую настройку пустым значением или значением Неопределено.
Разберем пример кода для очистки конкретной настройки:
// Очистка конкретного значения по имени ключа
ИмяНастройки = "НастройкаРабочегоСтола_ШиринаКолонки";
СохранитьЗначение(ИмяНастройки, Неопределено);
После выполнения этого кода функция ВосстановитьЗначение(ИмяНастройки) будет возвращать Неопределено. Это эффективно решает задачу обнуления данных, но запись о самом ключе в локальном файле профиля может остаться.
Рассмотрим ситуацию, когда нам нужно очистить абсолютно все значения, сохраненные этим методом. Поскольку в платформе отсутствует метод «ОчиститьВсеСохраненныеЗначения», мы вынуждены использовать один из следующих подходов:
СохранитьЗначение. Это радикальный, но самый действенный метод при возникновении критических ошибок интерфейса.Выясним причину возникновения визуальных артефактов, которые часто называют «дырами на экране». Это происходит, когда через СохранитьЗначение записываются координаты окон, размеры панелей или состояние разделителей (сплиттеров). Если программно очистить значение (установить в Неопределено) или если в файл записались некорректные данные, при следующем открытии формы система может считать «пустые» координаты.
В результате элемент формы может получить нулевую ширину или высоту, либо окно откроется за пределами видимой области экрана. Для решения этой проблемы рекомендуется:
ВосстановитьЗначение вернуло Неопределено или тип, отличный от ожидаемого.Пример безопасного восстановления параметров:
ШиринаПанели = ВосстановитьЗначение("ШиринаЛевойПанели");
Если ТипЗнч(ШиринаПанели) <> Тип("Число") Или ШиринаПанели <= 0 Тогда
ШиринаПанели = 200; // Устанавливаем стандартное значение
КонецЕсли;
ЭлементыФормы.ПанельЛевая.Ширина = ШиринаПанели;
Чтобы навсегда избавиться от проблем с локальными файлами и отсутствием возможности централизованного управления, проанализируем переход на использование ХранилищаСистемныхНастроек или ХранилищаОбщихНастроек. Эти механизмы хранят данные непосредственно в информационной базе, что позволяет администратору управлять ими через консоль или программно для любого пользователя.
Разберем, как выглядит современный способ сохранения и удаления настроек:
// Сохранение настройки в системное хранилище
ХранилищеСистемныхНастроек.Сохранить("ОбщаяНастройкаПользователя", "КлючНастройки", ЗначениеНастройки);
// Программное удаление (очистка) всех настроек по ключу объекта
ХранилищеСистемныхНастроек.Удалить("ОбщаяНастройкаПользователя", Неопределено, "ИмяПользователя");
Использование метода Удалить() в системных хранилищах позволяет полностью стереть данные из базы данных, не оставляя «мусора». Кроме того, этот механизм доступен и в тонком клиенте, в отличие от устаревших функций.
Подводя итог, можно сказать: если вы столкнулись с необходимостью массовой очистки значений, созданных функциями СохранитьЗначение, и это вызывает ошибки интерфейса — оптимальным путем будет точечная перезапись значений в Неопределено или полная очистка кэша пользователя. В долгосрочной перспективе рекомендуется перевести такие механизмы на использование системных хранилищ настроек 1С.