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