При разработке и администрировании систем на платформе «1С:Предприятие 8» часто возникает необходимость понять, куда именно записываются данные, когда мы используем методы СохранитьЗначение и ВосстановитьЗначение. Эти механизмы традиционно используются в обычных формах для сохранения пользовательских настроек: состояний фильтров, выбранных дат, положений окон и других параметров сеанса. Разберем подробно внутреннее устройство этого хранилища, научимся находить эти данные в базе и узнаем, как исправлять ошибки, если настройки перестали сохраняться.
Многие ошибочно полагают, что эти настройки хранятся в файлах профиля пользователя Windows или в локальном кэше на компьютере. На самом деле, платформа 1С сохраняет эти значения непосредственно в базе данных. Проанализируем физическую структуру хранения:
Files. Внутри этой таблицы настройки каждого пользователя упакованы в бинарное поле.Files внутри файла базы данных. Для доступа к ней «снаружи» требуются специализированные утилиты, такие как Tool1CD.Рассмотрим подробнее механизм именования. В таблице Files записи идентифицируются по полю FileName. Настройки конкретного пользователя хранятся в файле, имя которого соответствует его уникальному идентификатору (UID) с расширением .pfl. Например: 071523a4-516f-4fce-ba4b-0d11ab7a1893.pfl.
Чтобы понять, какая именно запись в таблице Files принадлежит нужному нам сотруднику, сначала необходимо выяснить его внутренний идентификатор. Разберем по шагам, как это сделать в консоли SQL Server Management Studio:
Выясним UID пользователя с помощью встроенного языка 1С:
УИДпользователя = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ").УникальныйИдентификатор;
Сообщить(УИДпользователя);
Теперь, зная этот идентификатор, мы можем найти соответствующую строку в SQL-таблице Files. Имя файла будет выглядеть как УИД.pfl. Проанализируем типичный формат данных внутри такого «файла»:
Содержимое представляет собой текстовую сериализацию внутреннего формата 1С. В нем хранятся пары «Ключ — Значение». Выглядит это примерно так:
{"имя_переменной", {"S", "строковое_значение"}}
Где литералы "S", "N", "B" обозначают типы данных: Строка (String), Число (Number) или Булево (Boolean). Если сохраняются сложные объекты (например, Структура или Список значений), они записываются в виде вложенных массивов с описанием типов.
Иногда возникает задача скопировать настройки интерфейса или заполнения документов от одного опытного пользователя всем новичкам. Зная структуру таблицы Files, мы можем выполнить это прямым SQL-запросом. Рассмотрим пример копирования настроек от «Образцового пользователя» к «Новому пользователю»:
UPDATE [Files]
SET [BinaryData] = (SELECT [BinaryData] FROM [Files] WHERE [FileName] = 'UID_ОБРАЗЦА.pfl'),
[DataSize] = (SELECT [DataSize] FROM [Files] WHERE [FileName] = 'UID_ОБРАЗЦА.pfl')
WHERE [FileName] = 'UID_НОВОГО_ПОЛЬЗОВАТЕЛЯ.pfl'
Важное примечание: Настройки записываются в базу данных 1С в момент штатного завершения работы пользователя. Если вы внесли изменения в таблицу SQL, пока пользователь находится в системе, его настройки могут перезаписаться старыми данными при его выходе. Поэтому подобные манипуляции следует проводить при отключенных сеансах.
Бывают ситуации, когда пользователи жалуются: «Я настраиваю список, а при следующем входе все пропадает». Выясним причину: чаще всего это происходит из-за логического повреждения таблицы Files. Разберем два пути решения проблемы.
Это самый безопасный метод. Мы можем использовать метод встроенного языка, который корректно удалит «битые» настройки пользователя, не прибегая к SQL. Создадим простую обработку с кодом:
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ОчиститьНастройкиПользователя(ТекущийПользовательИБ);
Сообщить("Настройки успешно сброшены. Перезайдите в систему.");
Этот метод полностью очищает файл .pfl пользователя в таблице Files, позволяя платформе создать его заново «с чистого листа».
Если проблема носит массовый характер и тестирование/исправление (ТиИ) не помогает, можно прибегнуть к низкоуровневому лечению базы данных. Рассмотрим последовательность команд для MS SQL Server. Если же требуется настроить регулярное техническое обслуживание нескольких баз без участия администратора, стоит использовать инструмент для архивации, тестирования и обновления 1С по расписанию.
ALTER DATABASE [Имя_Базы] SET EMERGENCY;
ALTER DATABASE [Имя_Базы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB('Имя_Базы', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE [Имя_Базы] SET MULTI_USER;
Стоит отметить, что в современных конфигурациях (на управляемых формах) вместо СохранитьЗначение чаще используются системные хранилища настроек. Проанализируем ситуацию: если ваша конфигурация написана на базе 8.2/8.3, данные могут находиться не только в Files, но и в таблице SystemSettings.
Чтобы увидеть список всех сохраненных параметров программно, мы можем использовать менеджеры хранилищ. Рассмотрим пример получения списка ключей настроек:
Выборка = ХранилищеСистемныхНастроек.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Ключ: " + Выборка.КлючОбъекта + " | Пользователь: " + Выборка.Пользователь);
КонецЦикла;
Мы выяснили, что механизм СохранитьЗначение — это не магия и не локальные файлы, а четко структурированные записи в таблице Files внутри базы данных. Знание этого факта позволяет системному администратору или ведущему разработчику оперативно решать проблемы с «пропадающими» настройками, переносить рабочие окружения между пользователями и чистить базу от «мусора» (записей давно уволенных сотрудников), который может замедлять вход в систему.
Помните, что любое прямое вмешательство в таблицы базы данных через SQL является крайней мерой. Всегда делайте резервную копию перед выполнением запросов UPDATE или DELETE в системных таблицах 1С.