Разработка и Конфигурация · 10 мин
СохранитьЗначение в 1С: куда сохраняется значение и как его найти
Разбираем, куда 1С сохраняет значения через СохранитьЗначение: хранилище общих настроек, регистр сведений, права доступа, типичные ошибки и способы проверки.
Функция СохранитьЗначение встроенного языка 1С — один из самых часто используемых механизмов хранения пользовательских настроек: выбранной организации, последнего периода отчёта, параметров обработки. При этом у разработчиков и администраторов регулярно возникает вопрос: куда физически записывается значение, где его найти, почему настройки «теряются» и как их перенести между базами.
Короткий ответ: значение сохраняется не в отдельный файл и не в произвольное место, а в специальную системную таблицу информационной базы — хранилище общих настроек. Конкретная таблица зависит от режима совместимости конфигурации и от того, работаете вы в файловой или клиент-серверной базе. Ниже разберём механику сохранения, расположение данных, ограничения и типичные проблемы.
Что делает СохранитьЗначение и как устроен механизм
Функция СохранитьЗначение(Ключ, Объект, Значение, ОписаниеНастроек) помещает переданное значение в хранилище общих настроек. Параметры «Ключ» и «Объект» формируют уникальный адрес записи: по этой паре система потом находит значение при вызове ВосстановитьЗначение. Если запись с такой парой уже существует, она перезаписывается без предупреждения.
Важная особенность: сохранение выполняется в контексте текущего пользователя. Два разных пользователя, вызвавшие СохранитьЗначение с одинаковыми ключами, создадут две независимые записи. Именно поэтому настройки отчёта у одного сотрудника не влияют на настройки другого — и именно поэтому «у меня работает, а у коллеги нет» является типичной ситуацией.
Куда физически записывается значение
В клиент-серверном варианте значения попадают в служебную таблицу СУБД, обслуживающую хранилище настроек (в зависимости от версии платформы и режима совместимости это таблицы вида _SystemCommonSettingsStorage или аналогичные). В файловой базе данные хранятся внутри файла 1Cv8.1CD — отдельного каталога или файла настроек не создаётся.
Само значение сериализуется: перед записью платформа преобразует его во внутренний формат (фактически — в XML-представление через механизм, аналогичный ЗначениеВСтрокуВнутр). Поэтому в таблице хранится не «живой» объект, а его текстовое представление, которое при восстановлении разворачивается обратно в значение нужного типа.
Практическое следствие: напрямую читать и править эти таблицы средствами SQL или внешними утилитами не рекомендуется. Это служебные структуры платформы, и ручное вмешательство может привести к повреждению настроек или всей базы.
Что можно и чего нельзя сохранять
Через СохранитьЗначение корректно сохраняются примитивные типы (строка, число, дата, булево), ссылки на объекты базы, а также сериализуемые коллекции — массивы, структуры, таблицы значений, если все их элементы в свою очередь сериализуются. Ссылки сохраняются как ссылки: при восстановлении вы получите ссылку на тот же объект, если он ещё существует.
Ограничения существенны. Нельзя сохранить несериализуемые объекты: например, COMОбъект, временные файловые потоки, объекты, привязанные к текущему сеансу. Попытка сохранить такое значение вызовет ошибку либо приведёт к потере данных при восстановлении. Также не стоит хранить большие объёмы данных — хранилище настроек не предназначено для мегабайтных таблиц, это замедляет работу механизма.
Сохранение ссылок и риск «битых» значений
Если сохранить ссылку на элемент справочника, а затем этот элемент удалить, при восстановлении вы получите ссылку на несуществующий объект. Код, который сразу обращается к реквизитам такой ссылки, упадёт с ошибкой. Правильный шаблон — после ВосстановитьЗначение проверять результат на Неопределено и на пустую/битую ссылку.
Значение = ВосстановитьЗначение("МояОбработка/ОсновнаяОрганизация");
Если Значение = Неопределено
Или Не ЗначениеЗаполнено(Значение) Тогда
Значение = Справочники.Организации.ПустаяСсылка();
КонецЕсли;Где найти и как проверить сохранённое значение
Самый простой способ убедиться, что значение записалось, — сразу после сохранения вызвать ВосстановитьЗначение с теми же ключом и объектом и сравнить результат. Если возвращается Неопределено, запись не выполнилась: чаще всего из-за отсутствия прав у пользователя или ошибки сериализации значения.
Для просмотра всех настроек пользователя в типовых конфигурациях есть стандартные инструменты: в управляемых приложениях настройки форм и отчётов доступны через меню «Ещё» формы, а для общих настроек разработчики используют специализированные внешние обработки, читающие ХранилищеОбщихНастроек. Через менеджер хранилища можно выбрать список настроек по отбору и увидеть сохранённые ключи.
- 1Вызовите СохранитьЗначение с заданными ключом и объектом в контексте нужного пользователя
- 2Сразу выполните ВосстановитьЗначение с теми же параметрами
- 3Сравните восстановленное значение с исходным по типу и содержимому
- 4Проверьте поведение под другим пользователем — записи должны быть независимыми
- 5При необходимости очистите тестовые данные через УдалитьНастройки хранилища
Почему настройки теряются: типичные сценарии
Наиболее частая причина «пропажи» значений — смена пользователя или вход под другой учётной записью. Поскольку запись привязана к пользователю, настройки не переносятся автоматически. Вторая причина — изменение ключа или объекта в коде после обновления: старые записи остаются в базе, но код читает уже по новому адресу и получает Неопределено.
Третья группа причин — перенос базы. При выгрузке/загрузке через dt настройки обычно переносятся, а вот при обмене данными или частичной загрузке — нет. Также настройки могут очищаться регламентными операциями или обработками «чистки» базы, если администратор удаляет устаревшие данные хранилищ.
Когда СохранитьЗначение не подходит: альтернативы
Механизм хранилища настроек предназначен именно для пользовательских предпочтений. Если значение должно быть общим для всех пользователей, участвовать в обменах, иметь историю изменений или быть доступным в отчётах — нужны другие инструменты.
Сравнение вариантов хранения
Подходит для персональных настроек: последние значения, параметры отчётов и обработок. Ограничение: привязка к пользователю, нет доступа из запросов и отчётов
Единое значение на всю базу: налоговые ставки, параметры учёта. Ограничение: одно значение, нет разрезов по пользователям и датам
Настройки в разрезе пользователей, организаций, периодов; доступны в запросах и обменах. Ограничение: требует проектирования структуры в конфигураторе
Произвольные свойства объектов без доработки конфигурации. Ограничение: привязка к конкретным объектам, не подходит для глобальных настроек
Выбор простой: персональное и служебное — в хранилище настроек, общее и учётное — в объекты конфигурации. Смешивать подходы не стоит: попытки хранить учётные данные через СохранитьЗначение заканчиваются потерей данных при обменах и невозможностью построить по ним отчёт.
Права доступа и безопасность
Запись в хранилище общих настроек требует у пользователя права «Сохранение данных пользователя» — оно есть у большинства ролей, но в усечённых интерфейсах (например, у внешних пользователей) может отсутствовать. При недостатке прав вызов СохранитьЗначение завершится ошибкой, которую стоит перехватывать, если настройка некритична.
Не храните через этот механизм пароли и другие секреты в открытом виде. Данные хранилища доступны администратору и при определённых условиях могут быть прочитаны обработками. Для секретов используйте защищённые механизмы: в типовых решениях — безопасное хранилище данных БСП.
Как проверить результат
Возвращается значение того же типа и содержимого
Возвращается Неопределено — запись не выполнилась или нет прав
Настройка восстанавливается после перезапуска сеанса
Значение сбрасывается — проверяйте ключ и контекст сохранения
У коллеги свои независимые значения
Настройки «переезжают» между людьми — значит, используется общий механизм, а не хранилище настроек
FAQ
Можно ли посмотреть сохранённые значения без программирования?
Штатного пользовательского интерфейса для произвольных ключей нет. Настройки отчётов и форм видны через меню «Ещё» соответствующих объектов, а для просмотра произвольных записей хранилища используют внешние обработки, работающие с менеджером ХранилищеОбщихНастроек.
Переносятся ли настройки при выгрузке базы в dt?
Да, полная выгрузка/загрузка информационной базы через dt-файл включает системные таблицы хранилищ настроек. Не переносятся настройки при обменах данными и при частичной загрузке через правила конвертации.
Как удалить старые настройки конкретного пользователя?
Через метод ХранилищеОбщихНастроек.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя) в коде. Массовую очистку удобно выполнять обработкой, перебирая список настроек с помощью метода ПолучитьСписок и удаляя ненужные записи.
Почему СохранитьЗначение работает в толстом клиенте, но не в тонком?
Сам механизм работает везде, но код мог выполняться в контексте, недоступном на сервере, или тип сохраняемого значения не сериализуется в клиент-серверном режиме. Проверьте директивы компиляции и тип значения.
Есть ли ограничение на размер сохраняемого значения?
Жёсткого документированного лимита нет, но хранилище рассчитано на небольшие настройки. Сохранение крупных таблиц или двоичных данных заметно замедляет запись и чтение; для таких объёмов подходят регистры сведений или хранилище значений в реквизитах объектов.
Чем СохранитьЗначение отличается от ХранилищеОбщихНастроек.Сохранить?
СохранитьЗначение — устаревший упрощённый интерфейс, оставленный для совместимости; он обращается к тому же хранилищу. Методы менеджера хранилища дают больше контроля: загрузку, удаление, получение списка настроек и работу с описанием настройки.
Что важно запомнить
СохранитьЗначение пишет данные в системное хранилище общих настроек базы, привязывая их к ключу, объекту и текущему пользователю. Значения сериализуются, не видны в запросах и не переносятся обменами. Для проверки используйте ВосстановитьЗначение, для общих настроек — константы и регистры сведений, а системные таблицы напрямую не редактируйте.