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