К статье
Практический материал

Разработка и Конфигурация · 10 мин

СохранитьЗначение в 1С: куда сохраняется значение и как его найти

Разбираем, куда 1С сохраняет значения через СохранитьЗначение: хранилище общих настроек, регистр сведений, права доступа, типичные ошибки и способы проверки.

Функция СохранитьЗначение встроенного языка 1С — один из самых часто используемых механизмов хранения пользовательских настроек: выбранной организации, последнего периода отчёта, параметров обработки. При этом у разработчиков и администраторов регулярно возникает вопрос: куда физически записывается значение, где его найти, почему настройки «теряются» и как их перенести между базами.

Короткий ответ: значение сохраняется не в отдельный файл и не в произвольное место, а в специальную системную таблицу информационной базы — хранилище общих настроек. Конкретная таблица зависит от режима совместимости конфигурации и от того, работаете вы в файловой или клиент-серверной базе. Ниже разберём механику сохранения, расположение данных, ограничения и типичные проблемы.

Что делает СохранитьЗначение и как устроен механизм

Функция СохранитьЗначение(Ключ, Объект, Значение, ОписаниеНастроек) помещает переданное значение в хранилище общих настроек. Параметры «Ключ» и «Объект» формируют уникальный адрес записи: по этой паре система потом находит значение при вызове ВосстановитьЗначение. Если запись с такой парой уже существует, она перезаписывается без предупреждения.

Важная особенность: сохранение выполняется в контексте текущего пользователя. Два разных пользователя, вызвавшие СохранитьЗначение с одинаковыми ключами, создадут две независимые записи. Именно поэтому настройки отчёта у одного сотрудника не влияют на настройки другого — и именно поэтому «у меня работает, а у коллеги нет» является типичной ситуацией.

Куда физически записывается значение

В клиент-серверном варианте значения попадают в служебную таблицу СУБД, обслуживающую хранилище настроек (в зависимости от версии платформы и режима совместимости это таблицы вида _SystemCommonSettingsStorage или аналогичные). В файловой базе данные хранятся внутри файла 1Cv8.1CD — отдельного каталога или файла настроек не создаётся.

Само значение сериализуется: перед записью платформа преобразует его во внутренний формат (фактически — в XML-представление через механизм, аналогичный ЗначениеВСтрокуВнутр). Поэтому в таблице хранится не «живой» объект, а его текстовое представление, которое при восстановлении разворачивается обратно в значение нужного типа.

Практическое следствие: напрямую читать и править эти таблицы средствами SQL или внешними утилитами не рекомендуется. Это служебные структуры платформы, и ручное вмешательство может привести к повреждению настроек или всей базы.

Что можно и чего нельзя сохранять

Через СохранитьЗначение корректно сохраняются примитивные типы (строка, число, дата, булево), ссылки на объекты базы, а также сериализуемые коллекции — массивы, структуры, таблицы значений, если все их элементы в свою очередь сериализуются. Ссылки сохраняются как ссылки: при восстановлении вы получите ссылку на тот же объект, если он ещё существует.

Ограничения существенны. Нельзя сохранить несериализуемые объекты: например, COMОбъект, временные файловые потоки, объекты, привязанные к текущему сеансу. Попытка сохранить такое значение вызовет ошибку либо приведёт к потере данных при восстановлении. Также не стоит хранить большие объёмы данных — хранилище настроек не предназначено для мегабайтных таблиц, это замедляет работу механизма.

Сохранение ссылок и риск «битых» значений

Если сохранить ссылку на элемент справочника, а затем этот элемент удалить, при восстановлении вы получите ссылку на несуществующий объект. Код, который сразу обращается к реквизитам такой ссылки, упадёт с ошибкой. Правильный шаблон — после ВосстановитьЗначение проверять результат на Неопределено и на пустую/битую ссылку.

bsl
Значение = ВосстановитьЗначение("МояОбработка/ОсновнаяОрганизация");
Если Значение = Неопределено
    Или Не ЗначениеЗаполнено(Значение) Тогда
    Значение = Справочники.Организации.ПустаяСсылка();
КонецЕсли;

Где найти и как проверить сохранённое значение

Самый простой способ убедиться, что значение записалось, — сразу после сохранения вызвать ВосстановитьЗначение с теми же ключом и объектом и сравнить результат. Если возвращается Неопределено, запись не выполнилась: чаще всего из-за отсутствия прав у пользователя или ошибки сериализации значения.

Для просмотра всех настроек пользователя в типовых конфигурациях есть стандартные инструменты: в управляемых приложениях настройки форм и отчётов доступны через меню «Ещё» формы, а для общих настроек разработчики используют специализированные внешние обработки, читающие ХранилищеОбщихНастроек. Через менеджер хранилища можно выбрать список настроек по отбору и увидеть сохранённые ключи.

Порядок проверки сохранения
  1. 1
    Вызовите СохранитьЗначение с заданными ключом и объектом в контексте нужного пользователя
  2. 2
    Сразу выполните ВосстановитьЗначение с теми же параметрами
  3. 3
    Сравните восстановленное значение с исходным по типу и содержимому
  4. 4
    Проверьте поведение под другим пользователем — записи должны быть независимыми
  5. 5
    При необходимости очистите тестовые данные через УдалитьНастройки хранилища

Почему настройки теряются: типичные сценарии

Наиболее частая причина «пропажи» значений — смена пользователя или вход под другой учётной записью. Поскольку запись привязана к пользователю, настройки не переносятся автоматически. Вторая причина — изменение ключа или объекта в коде после обновления: старые записи остаются в базе, но код читает уже по новому адресу и получает Неопределено.

Третья группа причин — перенос базы. При выгрузке/загрузке через dt настройки обычно переносятся, а вот при обмене данными или частичной загрузке — нет. Также настройки могут очищаться регламентными операциями или обработками «чистки» базы, если администратор удаляет устаревшие данные хранилищ.

Типичные ошибки
01
Использование в ключе изменяемых данных (дат, представлений документов) — при каждом запуске создаётся новая запись, старые накапливаются мусором
02
Чтение значения без проверки на Неопределено — при первом запуске или после очистки настроек код падает
03
Сохранение больших таблиц значений целиком — хранилище разрастается, запись и чтение замедляются
04
Ожидание, что настройки общие для всех пользователей — записи строго персональны, для общих параметров нужны константы или регистры сведений

Когда СохранитьЗначение не подходит: альтернативы

Механизм хранилища настроек предназначен именно для пользовательских предпочтений. Если значение должно быть общим для всех пользователей, участвовать в обменах, иметь историю изменений или быть доступным в отчётах — нужны другие инструменты.

Сравнение вариантов хранения

СохранитьЗначение / ХранилищеОбщихНастроек

Подходит для персональных настроек: последние значения, параметры отчётов и обработок. Ограничение: привязка к пользователю, нет доступа из запросов и отчётов

Константа

Единое значение на всю базу: налоговые ставки, параметры учёта. Ограничение: одно значение, нет разрезов по пользователям и датам

Регистр сведений

Настройки в разрезе пользователей, организаций, периодов; доступны в запросах и обменах. Ограничение: требует проектирования структуры в конфигураторе

Дополнительные сведения (БСП)

Произвольные свойства объектов без доработки конфигурации. Ограничение: привязка к конкретным объектам, не подходит для глобальных настроек

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

Права доступа и безопасность

Запись в хранилище общих настроек требует у пользователя права «Сохранение данных пользователя» — оно есть у большинства ролей, но в усечённых интерфейсах (например, у внешних пользователей) может отсутствовать. При недостатке прав вызов СохранитьЗначение завершится ошибкой, которую стоит перехватывать, если настройка некритична.

Не храните через этот механизм пароли и другие секреты в открытом виде. Данные хранилища доступны администратору и при определённых условиях могут быть прочитаны обработками. Для секретов используйте защищённые механизмы: в типовых решениях — безопасное хранилище данных БСП.

Контрольные точки

Как проверить результат

Восстановление сразу после записи
Норма

Возвращается значение того же типа и содержимого

Тревожный признак

Возвращается Неопределено — запись не выполнилась или нет прав

Повторный вход пользователя
Норма

Настройка восстанавливается после перезапуска сеанса

Тревожный признак

Значение сбрасывается — проверяйте ключ и контекст сохранения

Другой пользователь
Норма

У коллеги свои независимые значения

Тревожный признак

Настройки «переезжают» между людьми — значит, используется общий механизм, а не хранилище настроек

FAQ

Можно ли посмотреть сохранённые значения без программирования?

Штатного пользовательского интерфейса для произвольных ключей нет. Настройки отчётов и форм видны через меню «Ещё» соответствующих объектов, а для просмотра произвольных записей хранилища используют внешние обработки, работающие с менеджером ХранилищеОбщихНастроек.

Переносятся ли настройки при выгрузке базы в dt?

Да, полная выгрузка/загрузка информационной базы через dt-файл включает системные таблицы хранилищ настроек. Не переносятся настройки при обменах данными и при частичной загрузке через правила конвертации.

Как удалить старые настройки конкретного пользователя?

Через метод ХранилищеОбщихНастроек.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя) в коде. Массовую очистку удобно выполнять обработкой, перебирая список настроек с помощью метода ПолучитьСписок и удаляя ненужные записи.

Почему СохранитьЗначение работает в толстом клиенте, но не в тонком?

Сам механизм работает везде, но код мог выполняться в контексте, недоступном на сервере, или тип сохраняемого значения не сериализуется в клиент-серверном режиме. Проверьте директивы компиляции и тип значения.

Есть ли ограничение на размер сохраняемого значения?

Жёсткого документированного лимита нет, но хранилище рассчитано на небольшие настройки. Сохранение крупных таблиц или двоичных данных заметно замедляет запись и чтение; для таких объёмов подходят регистры сведений или хранилище значений в реквизитах объектов.

Чем СохранитьЗначение отличается от ХранилищеОбщихНастроек.Сохранить?

СохранитьЗначение — устаревший упрощённый интерфейс, оставленный для совместимости; он обращается к тому же хранилищу. Методы менеджера хранилища дают больше контроля: загрузку, удаление, получение списка настроек и работу с описанием настройки.

Итог

Что важно запомнить

СохранитьЗначение пишет данные в системное хранилище общих настроек базы, привязывая их к ключу, объекту и текущему пользователю. Значения сериализуются, не видны в запросах и не переносятся обменами. Для проверки используйте ВосстановитьЗначение, для общих настроек — константы и регистры сведений, а системные таблицы напрямую не редактируйте.