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

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

Как сохранить значение реквизита формы в 1С на обычных формах

Как сохранить значение реквизита формы в 1С на обычных формах: СохранитьЗначение, ВосстановитьЗначение, автоcохранение при закрытии, примеры кода и типичные ошибки.

В обычных формах 1С (платформа 8.2–8.3, режим обычного приложения) реквизиты формы существуют только в памяти: после закрытия формы их значения теряются. Чтобы пользователь при следующем открытии видел ранее введённые данные — например, выбранный период, склад, настройки отбора — значения нужно сохранить в хранилище настроек и восстановить при открытии формы.

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

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

Где физически хранятся сохранённые значения

Оба механизма используют хранилище общих настроек — стандартное системное хранилище, которое платформа ведёт автоматически. В файловой базе настройки лежат в таблице хранения настроек внутри файла базы, в клиент-серверном варианте — в соответствующей таблице СУБД. Доступ к ним из кода идёт через объект ХранилищеОбщихНастроек, но процедуры СохранитьЗначение() и ВосстановитьЗначение() являются удобной обёрткой над ним.

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

Способ 1: СохранитьЗначение и ВосстановитьЗначение

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

Типовой код модуля формы выглядит так:

Процедура ПриОткрытии()

СохраненноеЗначение = ВосстановитьЗначение("МояФорма_Склад");

Если СохраненноеЗначение <> Неопределено Тогда

Склад = СохраненноеЗначение;

КонецЕсли;

КонецПроцедуры

Процедура ПриЗакрытии()

СохранитьЗначение("МояФорма_Склад", Склад);

КонецПроцедуры

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

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

bsl
// Сохранение группы реквизитов одним ключом
Настройки = Новый Структура;
Настройки.Вставить("Склад", Склад);
Настройки.Вставить("Организация", Организация);
СохранитьЗначение("МояФорма_Настройки", Настройки);

Способ 2: автосохранение реквизитов без кода

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

То же самое можно сделать программно:

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

СохранениеЗначенийПриЗакрытии = Истина;

СохраняемыеЗначения.Вставить("Склад", Истина);

СохраняемыеЗначения.Вставить("Организация", Истина);

КонецПроцедуры

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

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

СохранитьЗначение / ВосстановитьЗначение

Полный контроль: можно сохранять в любой момент, под любым ключом, с предобработкой значения. Требует написания кода и ручной проверки на Неопределено.

СохранениеЗначенийПриЗакрытии

Настраивается без кода в конфигураторе. Подходит для простого запоминания реквизитов. Не позволяет управлять моментом сохранения и обработкой значений.

ХранилищеОбщихНастроек напрямую

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

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

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

Ключевой риск — битые ссылки. Если сохранена ссылка на элемент справочника, который позже удалили из базы физически (например, при свёртке или очистке), после восстановления реквизит будет содержать ссылку на несуществующий объект. Перед использованием восстановленной ссылки проверяйте её существование запросом или через ПолучитьОбъект() с обработкой результата.

Проверка результата и отладка

После внедрения кода проверьте сценарий полностью: откройте форму, заполните реквизит, закройте форму штатной кнопкой, откройте снова — значение должно появиться. Затем повторите проверку под другим пользователем: у него форма должна открыться с пустым (или своим собственным) значением, что подтвердит корректную разметку по пользователям.

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

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

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

Повторное открытие формы
Норма

Реквизит заполнен значением из прошлого сеанса

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

Реквизит пуст или содержит значение по умолчанию

Открытие под другим пользователем
Норма

У нового пользователя своё или пустое значение

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

Чужие настройки видны всем — ключи настроек общие

Восстановленная ссылка
Норма

Ссылка открывается, объект существует

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

Ошибка обращения к объекту или битая ссылка

Очистка и перенос сохранённых настроек

Накопленные настройки иногда нужно удалить — например, после изменения структуры сохраняемых данных, когда старый формат вызывает ошибки. Удаление выполняется через ХранилищеОбщихНастроек.Удалить() с указанием ключа объекта и пользователя, либо через стандартную обработку управления настройками, если она есть в конфигурации. При обновлении формата настроек хорошей практикой является добавление версии в ключ: "МояФорма_Настройки_2" — тогда старые данные просто перестанут использоваться.

Имейте в виду: при копировании базы настройки копируются вместе с ней, а при загрузке данных через выгрузку бизнес-данных (например, конвертацией) — обычно нет. Если пользователи жалуются на «слетевшие» настройки после переезда базы, причина, скорее всего, в этом.

Типичные ошибки
01
Разные ключи при сохранении и восстановлении — значение молча не находится, ошибки не возникает
02
Отсутствие проверки на Неопределено после ВосстановитьЗначение — реквизит получает неверный тип
03
Сохранение в ПриЗакрытии при аварийном завершении сеанса — данные последнего сеанса теряются
04
Восстановление значения до инициализации списка выбора — поле показывает значение, которого нет в списке
05
Использование общего ключа для разных форм — формы затирают настройки друг друга

Когда обычные механизмы не подходят

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

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

Итог

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

Для сохранения реквизита обычной формы используйте СохранитьЗначение/ВосстановитьЗначение с уникальным ключом и проверкой на Неопределено, либо включите СохранениеЗначенийПриЗакрытии для простых сценариев. Настройки хранятся в разрезе пользователей, не шифруются и не предназначены для бизнес-данных и секретов.

Частые вопросы

Почему ВосстановитьЗначение возвращает Неопределено, хотя сохранение точно выполнялось?

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

Можно ли сохранить значение, чтобы оно было общим для всех пользователей?

Штатные механизмы хранят настройки в разрезе пользователей. Для общего значения либо используйте процедуру восстановления с явным указанием одного «технического» пользователя через ХранилищеОбщихНастроек.Загрузить(), либо перенесите значение в константу или регистр сведений — это надёжнее.

Сохранятся ли значения при аварийном завершении сеанса?

Нет. Сохранение выполняется в момент вызова СохранитьЗначение() или при штатном закрытии формы. Если важно не терять данные, вызывайте сохранение в обработчике изменения реквизита, а не только при закрытии.

Как сохранить таблицу значений с формы?

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

Где посмотреть все сохранённые настройки пользователя?

Через код — методами ХранилищеОбщихНастроек (например, ПолучитьСписок). В типовых конфигурациях на БСП есть раздел администрирования с очисткой пользовательских настроек. Прямого просмотра таблиц настроек в режиме Предприятия без специальных обработок нет.

Работает ли этот код в управляемых формах?

СохранитьЗначение/ВосстановитьЗначение доступны и там, но для управляемых форм правильнее использовать автоматическое сохранение данных формы в настройках (свойство формы «АвтоматическоеСохранениеДанныхВНастройках») или ХранилищеНастроекДанныхФорм.