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