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

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

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

Миф о кэше и реальность системных таблиц

Первое и самое распространенное заблуждение заключается в том, что данные автоматического сохранения настроек форм хранятся исключительно в локальном кэше пользователя (папки AppData/Local/1C или AppData/Roaming/1C). Проанализируем ситуацию: если мы очистим папки кэша или переподключим базу в списке под новым именем, настройки формы часто остаются на месте. Это доказывает, что платформа хранит эти данные непосредственно в базе данных (ИБ).

Рассмотрим, как менялось расположение этих данных в зависимости от версии платформы и режима работы:

  1. Файловый режим (старые версии 8.0/8.1): Использовался файл настроек 1cv8.pfl, который располагался в профиле пользователя.
  2. Файловый режим (современные версии 8.2/8.3): Настройки записываются внутрь файла 1cv8.1cd в специализированные внутренние таблицы.
  3. Клиент-серверный режим: Данные хранятся в системной таблице СУБД, которая обычно называется _SystemSettings.

Таким образом, автоматическое восстановление значений — это не механизм временных файлов, а полноценное хранение данных в структуре ИБ, привязанное к уникальному идентификатору пользователя (UUID).

Анализ структуры таблицы _SystemSettings в СУБД

Если нам требуется перенести настройки от одного пользователя другому или массово их проанализировать, наиболее эффективным (хотя и не документированным) методом будет обращение к уровню СУБД (MS SQL, PostgreSQL и др.). Выясним, как устроена таблица _SystemSettings, в которой платформа прячет настройки обычных форм:

Проанализируем причину, по которой стандартные методы типа СтандартноеХранилищеНастроекДанныхФорм.ПолучитьСписок() часто возвращают пустой результат. В обычном приложении механизмы сохранения являются «наследственными» (legacy). Они записывают данные напрямую в _SystemSettings под внутренними ключами, которые не всегда корректно сопоставляются с менеджерами хранилищ управляемого приложения.

Программное извлечение данных методами 1С

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


// Определим ключ объекта. Для обычных форм он может отличаться.
// Часто используется формат: "Отчет.ИмяВашегоОтчета/НастройкиСохраняемыхЗначений"
КлючОбъекта = "Отчет.МойОтчет/ЗначенияРеквизитов";
КлючНастройки = ""; // Пусто, если берем основную настройку
ИмяПользователя = "ИвановИИ";

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

Если ТипЗнч(Настройки) = Тип("Структура") Тогда
    // Здесь будут находиться значения реквизитов, отмеченных в конфигураторе
    Сообщить("Настройка успешно загружена");
КонецЕсли;

Важно понимать: чтобы узнать точный КлючОбъекта, рекомендуется один раз запустить профайлер СУБД или посмотреть содержимое таблицы _SystemSettings в момент сохранения настройки в интерфейсе. Платформа формирует этот ключ автоматически на основании метаданных объекта.

Использование событийных обработчиков формы

Если ваша задача — не просто найти, где лежат данные, а дополнить их своими значениями в процессе работы обычного приложения, следует использовать предопределенные процедуры модуля формы. В обычном приложении для этого предназначены ПередСохранениемЗначений и ПослеВосстановленияЗначений.

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


Процедура ПередСохранениемЗначений(Отказ)
    // Метод СохранитьЗначение помещает данные в системное хранилище
    // Это дополняет автоматический механизм платформы
    СохранитьЗначение("ДополнениеКомментария", ДополнениеКомментария);
КонецПроцедуры

Процедура ПослеВосстановленияЗначений()
    // Восстанавливаем данные после того, как платформа заполнила основные реквизиты
    мДополнениеКомментария = ВосстановитьЗначение("ДополнениеКомментария");
    Если мДополнениеКомментария <> Неопределено Тогда
        ДополнениеКомментария = мДополнениеКомментария;
    КонецЕсли;
КонецПроцедуры

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

Особенности переноса настроек между пользователями

Часто возникает бизнес-задача: «Настроить отчет для одного пользователя и растиражировать эти настройки на весь отдел». Поскольку автоматические настройки обычных форм жестко привязаны к UserUUID, простого интерфейсного решения в платформе 8.3 для этого нет. Рассмотрим варианты решения этой задачи:

  1. На уровне СУБД (SQL): Выполнить INSERT INTO ... SELECT в таблицу _SystemSettings, заменяя поле _UserUUID. Это самый быстрый способ для системного администратора, но он требует осторожности, чтобы не нарушить целостность данных.
  2. Программный перенос через Хранилище: Написать обработку, которая под одним пользователем вызывает ХранилищеСистемныхНастроек.Загрузить(), а затем для каждого другого пользователя вызывает ХранилищеСистемныхНастроек.Сохранить().

Пример программного копирования настроек:


// Исходные данные
Ключ = "Отчет.Продажи/ЗначенияРеквизитов";
ОтКого = "Администратор";
Кому = "Менеджер1";

// Получаем структуру данных
ДанныеНастройки = ХранилищеСистемныхНастроек.Загрузить(Ключ, , , ОтКого);

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

Выводы и рекомендации

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

Если вам необходимо вмешаться в этот процесс, помните следующие правила:

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

← На главную