В процессе разработки и сопровождения решений на платформе 1С:Предприятие 8 (особенно в режиме «Обычного приложения»), программисты часто сталкиваются с механизмом автоматического сохранения значений реквизитов формы. Когда в свойствах формы установлены флаги «Сохранять значения» и «Восстанавливать значения», система берет на себя задачу кэширования пользовательских настроек. Однако вопрос о том, где именно физически лежат эти данные и как получить к ним доступ программно, минуя интерфейс, остается для многих загадкой. Разберем эту тему подробно, опираясь на внутреннее устройство платформы и опыт экспертов.
Первое и самое распространенное заблуждение заключается в том, что данные автоматического сохранения настроек форм хранятся исключительно в локальном кэше пользователя (папки AppData/Local/1C или AppData/Roaming/1C). Проанализируем ситуацию: если мы очистим папки кэша или переподключим базу в списке под новым именем, настройки формы часто остаются на месте. Это доказывает, что платформа хранит эти данные непосредственно в базе данных (ИБ).
Рассмотрим, как менялось расположение этих данных в зависимости от версии платформы и режима работы:
1cv8.pfl, который располагался в профиле пользователя.1cv8.1cd в специализированные внутренние таблицы._SystemSettings.Таким образом, автоматическое восстановление значений — это не механизм временных файлов, а полноценное хранение данных в структуре ИБ, привязанное к уникальному идентификатору пользователя (UUID).
Если нам требуется перенести настройки от одного пользователя другому или массово их проанализировать, наиболее эффективным (хотя и не документированным) методом будет обращение к уровню СУБД (MS SQL, PostgreSQL и др.). Выясним, как устроена таблица _SystemSettings, в которой платформа прячет настройки обычных форм:
Common/Reports/ИмяВашегоОтчета/FormSettings/ИмяФормы.varbinary или image). Здесь хранится сериализованная структура настроек, сжатая внутренним алгоритмом 1С.Проанализируем причину, по которой стандартные методы типа СтандартноеХранилищеНастроекДанныхФорм.ПолучитьСписок() часто возвращают пустой результат. В обычном приложении механизмы сохранения являются «наследственными» (legacy). Они записывают данные напрямую в _SystemSettings под внутренними ключами, которые не всегда корректно сопоставляются с менеджерами хранилищ управляемого приложения.
Несмотря на то что данные лежат глубоко в системе, мы можем попытаться извлечь их программно, не открывая форму отчета. Для этого воспользуемся объектом ХранилищеСистемныхНастроек. Посмотрим на пример кода, который позволяет загрузить структуру сохраненных значений:
// Определим ключ объекта. Для обычных форм он может отличаться.
// Часто используется формат: "Отчет.ИмяВашегоОтчета/НастройкиСохраняемыхЗначений"
КлючОбъекта = "Отчет.МойОтчет/ЗначенияРеквизитов";
КлючНастройки = ""; // Пусто, если берем основную настройку
ИмяПользователя = "ИвановИИ";
// Пытаемся загрузить данные
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастройки, , ИмяПользователя);
Если ТипЗнч(Настройки) = Тип("Структура") Тогда
// Здесь будут находиться значения реквизитов, отмеченных в конфигураторе
Сообщить("Настройка успешно загружена");
КонецЕсли;
Важно понимать: чтобы узнать точный КлючОбъекта, рекомендуется один раз запустить профайлер СУБД или посмотреть содержимое таблицы _SystemSettings в момент сохранения настройки в интерфейсе. Платформа формирует этот ключ автоматически на основании метаданных объекта.
Если ваша задача — не просто найти, где лежат данные, а дополнить их своими значениями в процессе работы обычного приложения, следует использовать предопределенные процедуры модуля формы. В обычном приложении для этого предназначены ПередСохранениемЗначений и ПослеВосстановленияЗначений.
Разберем, как это работает на практике. Допустим, нам нужно сохранять дополнительный параметр мДополнениеКомментария, который не является реквизитом отчета, но важен для логики:
Процедура ПередСохранениемЗначений(Отказ)
// Метод СохранитьЗначение помещает данные в системное хранилище
// Это дополняет автоматический механизм платформы
СохранитьЗначение("ДополнениеКомментария", ДополнениеКомментария);
КонецПроцедуры
Процедура ПослеВосстановленияЗначений()
// Восстанавливаем данные после того, как платформа заполнила основные реквизиты
мДополнениеКомментария = ВосстановитьЗначение("ДополнениеКомментария");
Если мДополнениеКомментария <> Неопределено Тогда
ДополнениеКомментария = мДополнениеКомментария;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что методы СохранитьЗначение и ВосстановитьЗначение в обычном приложении работают с тем же системным механизмом, но создают записи с другими ключами, что позволяет разделять автоматические настройки формы и программные настройки разработчика.
Часто возникает бизнес-задача: «Настроить отчет для одного пользователя и растиражировать эти настройки на весь отдел». Поскольку автоматические настройки обычных форм жестко привязаны к UserUUID, простого интерфейсного решения в платформе 8.3 для этого нет. Рассмотрим варианты решения этой задачи:
INSERT INTO ... SELECT в таблицу _SystemSettings, заменяя поле _UserUUID. Это самый быстрый способ для системного администратора, но он требует осторожности, чтобы не нарушить целостность данных.ХранилищеСистемныхНастроек.Загрузить(), а затем для каждого другого пользователя вызывает ХранилищеСистемныхНастроек.Сохранить().Пример программного копирования настроек:
// Исходные данные
Ключ = "Отчет.Продажи/ЗначенияРеквизитов";
ОтКого = "Администратор";
Кому = "Менеджер1";
// Получаем структуру данных
ДанныеНастройки = ХранилищеСистемныхНастроек.Загрузить(Ключ, , , ОтКого);
Если ДанныеНастройки <> Неопределено Тогда
// Записываем другому пользователю
ХранилищеСистемныхНастроек.Сохранить(Ключ, , ДанныеНастройки, , Кому);
Сообщить("Настройки скопированы для " + Кому);
КонецЕсли;
Подводя итог нашему исследованию, можно уверенно сказать: автоматические настройки форм в обычном приложении — это надежный механизм, встроенный в ядро платформы 1С:Предприятие 8. Данные хранятся в базе данных, что обеспечивает их сохранность при смене рабочего места или очистке локального кэша.
Если вам необходимо вмешаться в этот процесс, помните следующие правила:
СохранитьЗначение и ВосстановитьЗначение.ХранилищеСистемныхНастроек._SystemSettings — ваш главный источник информации о физическом расположении данных.Изучив эти механизмы, вы сможете гибко управлять пользовательским окружением и решать сложные задачи по миграции настроек в старых конфигурациях.