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

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

Как сохранить значение реквизита формы в 1С (управляемые формы)

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

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

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

Важно понимать разницу между реквизитом формы и реквизитом объекта. Реквизит объекта (например, Объект.Организация в форме документа) сохраняется при записи объекта автоматически. Реквизит формы — это временное поле, которое платформа никуда не записывает: забота о его сохранении полностью лежит на разработчике.

Определяем, какой сценарий сохранения вам нужен

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

Маршрут решения

Как выбрать механизм

Значение нужно запомнить для текущего пользователя между сеансами (последний склад, период, флажок)Используйте ХранилищеОбщихНастроек.Сохранить/Загрузить
Значение нужно передать в открываемую формуПередайте через структуру параметров ОткрытьФорму() или через Оповестить()
Значение — учётные данные, доступные другим пользователям и отчётамЗаписывайте в реквизит объекта, регистр сведений или константу
Настройки должны быть общими для всех пользователейИспользуйте константу или регистр сведений, а не хранилище настроек

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

Сохранение через хранилище общих настроек

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

&НаСервере

Процедура СохранитьНастройкиНаСервере()

ХранилищеОбщихНастроек.Сохранить(

"МояОбработка", // ключ объекта

"ОсновнойСклад", // ключ настройки

ОсновнойСклад); // сохраняемое значение

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

&НаКлиенте

Процедура ПриЗакрытии(ЗавершениеРаботы)

Если Не ЗавершениеРаботы Тогда

СохранитьНастройкиНаСервере();

КонецЕсли;

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

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

&НаСервере

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

СохраненноеЗначение = ХранилищеОбщихНастроек.Загрузить(

"МояОбработка", "ОсновнойСклад");

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

ОсновнойСклад = СохраненноеЗначение;

Иначе

ОсновнойСклад = Справочники.Склады.НайтиПоНаименованию("Основной");

КонецЕсли;

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

У метода Сохранить() есть четвёртый параметр — имя пользователя. Если его не указывать, настройка сохраняется для текущего пользователя. Это удобно для персональных предпочтений, но не подходит для общих параметров работы.

Автоматическое сохранение реквизитов формы

У управляемой формы есть встроенный механизм: свойство формы АвтоматическоеСохранениеДанныхВНастройках и список СохраняемыеВНастройкахДанныеФормы. Если установить автоматическое сохранение в режим «Использовать» и пометить нужные реквизиты, платформа сама сохранит их при закрытии и восстановит при открытии — без единой строки кода.

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

Сравнение способов

Автоматическое сохранение

Без кода, но нет контроля над значениями по умолчанию и моментом записи. Подходит для простых форм

ХранилищеОбщихНастроек вручную

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

Параметры формы

Значение живёт только пока открыта форма, передаётся между формами. Не переживает закрытие сеанса

Запись в базу (константа, регистр)

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

Передача значения между формами

Когда значение реквизита нужно не «запомнить навсегда», а передать в другую форму, используются два механизма. Первый — параметры при открытии: вы формируете структуру и передаёте её в ОткрытьФорму(), а в открываемой форме читаете Параметры.ИмяПараметра в ПриСозданииНаСервере.

&НаКлиенте

Процедура ОткрытьПодбор(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ТекущийСклад", ОсновнойСклад);

ОткрытьФорму("Обработка.ПодборТоваров.Форма", ПараметрыФормы, ЭтотОбъект);

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

Второй механизм — возврат результата при закрытии. Форма, открытая через ОткрытьФорму() с указанием владельца, может вызвать Закрыть(Результат), а форма-владелец получит значение в обработчике ОбработкаВыбора или через описание оповещения, переданное в ОткрытьФорму(). Альтернатива — Оповестить() и обработчик ОбработкаОповещения, когда формы не связаны отношением владелец–подчинённая.

Порядок действий для запоминания реквизита
  1. 1
    Определите, кому принадлежит настройка: пользователю, всем, другой форме
  2. 2
    Для пользовательской настройки добавьте вызов ХранилищеОбщихНастроек.Сохранить() при закрытии формы
  3. 3
    Добавьте ХранилищеОбщихНастроек.Загрузить() в ПриСозданииНаСервере со значением по умолчанию
  4. 4
    Проверьте сценарий первого запуска, когда настройки ещё нет
  5. 5
    Проверьте, что значение восстанавливается после перезапуска сеанса

Сохранение значения в базу данных

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

&НаСервере

Процедура СохранитьВКонстантуНаСервере()

Константы.СкладПоУмолчанию.Установить(ОсновнойСклад);

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

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

Проверка результата и типичные ошибки

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

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

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

Первый запуск формы
Норма

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

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

Реквизит пуст или ошибка обращения к нему

Повторное открытие после изменения значения
Норма

Отображается последнее сохранённое значение

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

Подставляется значение по умолчанию

Вход под другим пользователем
Норма

У него свои настройки или значения по умолчанию

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

Он видит чужие настройки (или наоборот, общие данные разошлись)

Часто задаваемые вопросы

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

Да, если включить у формы свойство «АвтоматическоеСохранениеДанныхВНастройках» и добавить нужные реквизиты в список сохраняемых. Платформа сама запишет значения при закрытии и восстановит при открытии. Минус — нет контроля над значениями по умолчанию и моментом сохранения.

Где физически хранятся настройки, сохранённые через ХранилищеОбщихНастроек?

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

Почему значение сохраняется, но не восстанавливается?

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

Как сохранить сразу несколько реквизитов формы?

Соберите значения в структуру и сохраните её одним вызовом: ХранилищеОбщихНастроек.Сохранить("МояОбработка", "НастройкиФормы", СтруктураНастроек). При загрузке распакуйте структуру и присвойте значения реквизитам, проверяя наличие каждого ключа через Свойство().

Чем отличается сохранение в хранилище настроек от записи в константу?

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

Как передать значение из закрывающейся формы обратно в открывшую её?

Откройте форму через ОткрытьФорму() с указанием владельца или с описанием оповещения. В закрываемой форме вызовите Закрыть(Результат) — значение вернётся в обработчик ОбработкаВыбора владельца или в процедуру оповещения. Для несвязанных форм используйте Оповестить() и ОбработкаОповещения.

Итог

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

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