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

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

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

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

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

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

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

Различаем реквизиты формы и реквизиты объекта

Первая ошибка новичков — путать реквизиты формы с реквизитами объекта. Реквизит объекта (справочника, документа) хранится в базе данных и записывается при вызове метода Записать(). Реквизит формы существует только в памяти, пока форма открыта, и платформа никогда не сохранит его в базу сама.

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

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

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

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

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

Включение автосохранения реквизитов
  1. 1
    Откройте форму в конфигураторе и в палитре свойств установите «АвтоматическоеСохранениеДанныхВНастройках» = Использовать
  2. 2
    В дереве реквизитов формы отметьте флажками «Сохранять» те реквизиты, которые нужно запоминать
  3. 3
    Обновите конфигурацию, откройте форму в режиме предприятия, заполните поля и закройте форму
  4. 4
    Откройте форму снова — значения должны восстановиться автоматически

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

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

Типовой приём: в событии ПриЗакрытии (или ПриСохраненииДанныхВНастройкахНаСервере) значения реквизитов упаковываются в структуру и сохраняются, а в ПриСозданииНаСервере — читаются обратно. Пример:

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Сохраненные = ХранилищеОбщихНастроек.Загрузить("МояОбработка", "ПараметрыФормы");
    Если ТипЗнч(Сохраненные) = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(ЭтаФорма, Сохраненные);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
    Если Не ЗавершениеРаботы Тогда
        СохранитьНастройкиНаСервере();
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура СохранитьНастройкиНаСервере()
    Данные = Новый Структура("Организация, Период", Организация, Период);
    ХранилищеОбщихНастроек.Сохранить("МояОбработка", "ПараметрыФормы", Данные);
КонецПроцедуры

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

Сохранение реквизитов в объект базы данных

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

Типовая схема: в событии ПередЗаписьюНаСервере или в коде команды записи присвойте Объект.ИмяРеквизита = ИмяРеквизитаФормы, а при создании формы — наоборот, прочитайте значение из объекта. Для данных, не привязанных к конкретному документу, используют константы, регистры сведений или специальный справочник настроек.

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

Программно созданные реквизиты формы

Реквизиты, добавленные методом ИзменитьРеквизиты(), существуют только в текущем экземпляре формы. При повторном открытии формы или при пересоздании формы на сервере (например, после изменения состава реквизитов) их значения теряются. Это частая причина «пропадающих» данных в динамических формах.

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

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

Как проверить, что сохранение работает

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

Для ХранилищеОбщихНастроек дополнительно проверьте сценарий первого запуска (очистите настройки пользователя через Администрирование → Пользователи → настройки) и сценарий с изменённой структурой данных — старые сохранённые значения не должны ломать новую версию обработки. Полезно хранить в структуре номер версии настроек и игнорировать устаревшие.

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

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

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

Реквизиты восстановлены в том виде, в каком были при закрытии

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

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

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

Каждый пользователь видит свои сохранённые значения

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

Настройки общие или перезаписывают друг друга

Первый запуск без настроек
Норма

Форма открывается с пустыми/дефолтными значениями без ошибок

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

Ошибка при обращении к загруженным настройкам

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

Итог

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

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

Почему реквизит формы очищается после записи документа?

Потому что запись объекта не затрагивает реквизиты формы, а форма может перечитываться с сервера. Если значение должно жить вместе с документом — перенесите его в реквизит объекта в конфигураторе и привяжите к нему поле формы.

Можно ли сохранить таблицу значений, расположенную на форме?

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

Чем ХранилищеОбщихНастроек отличается от ХранилищеПользовательскихНастроекОтчетов?

ХранилищеОбщихНастроек — универсальный механизм для любых данных разработчика. ХранилищеПользовательскихНастроекОтчетов предназначено для вариантов и настроек отчётов на СКД и управляется платформой в рамках механизма отчётов. Для произвольных реквизитов формы используйте первое.

Как очистить сохранённые настройки формы, если они испорчены?

Через метод ХранилищеОбщихНастроек.Удалить с теми же ключом объекта и настройки, либо административно: в режиме предприятия откройте управление настройками пользователя и удалите соответствующие записи. После очистки форма откроется со значениями по умолчанию.

Работает ли автосохранение в веб-клиенте и тонком клиенте?

Да, механизм сохранения данных в настройках работает во всех клиентах, так как выполняется на сервере. Ограничения касаются только объёмов данных и типов, поддерживающих сериализацию.