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

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

1. Стандартные механизмы платформы: когда 1С сохраняет значения сама

Платформа 1С:Предприятие 8 имеет встроенные механизмы сохранения некоторых реквизитов форм без дополнительного программирования. Это работает для:

  • 📌 Параметров отчетов и обработок (например, период, организация, фильтры)
  • 📌 Пользовательских настроек списков (сортировка, группировка, видимость колонок)
  • 📌 Значений реквизитов форм справочников и документов, если они привязаны к объекту метаданных

Чтобы проверить, сохраняется ли значение автоматически:

  1. Откройте форму в режиме 1С:Предприятие (не в конфигураторе!).
  2. Измените значение реквизита (например, выберите организацию в фильтре отчета).
  3. Закройте форму и откройте заново.
  4. Если значение сохранилось — платформа делает это сама. Если нет — потребуется доработка.

⚠️ Внимание: Автоматическое сохранение работает только для управляемых форм и только если реквизит привязан к ХранилищуНастроек. Для обычных форм (тонкий клиент, толстый клиент) этот механизм не действует.

📊 Какой тип форм вы чаще используете в 1С?
Управляемые формы
Обычные формы (тонкий клиент)
Оба типа примерно одинаково
Не знаю, в чем разница

2. Сохранение в пользовательских настройках: универсальный способ

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

// В модуле формы (при закрытии)

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

ПользовательскиеНастройки = ПользовательскиеНастройкиОбщие.Получить();

НастройкиФормы = ПользовательскиеНастройки.НастройкиФормы[ИмяФормы()];

НастройкиФормы.Вставить("МояНастройка_ФильтрПоДате", ЗначениеРеквизитаФормы("ФильтрПоДате"));

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

// В модуле формы (при открытии)

Процедура ПриОткрытии()

ПользовательскиеНастройки = ПользовательскиеНастройкиОбщие.Получить();

Если ПользовательскиеНастройки.НастройкиФормы.Свойство(ИмяФормы()) Тогда

НастройкиФормы = ПользовательскиеНастройки.НастройкиФормы[ИмяФормы()];

Если НастройкиФормы.Свойство("МояНастройка_ФильтрПоДате") Тогда

ЗначениеРеквизитаФормы("ФильтрПоДате", НастройкиФормы.МояНастройка_ФильтрПоДате);

КонецЕсли;

КонецЕсли;

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

Преимущества метода:

  • 🔹 Работает для любых типов форм (управляемых и обычных).
  • 🔹 Сохраняет данные между сеансами и после обновления конфигурации.
  • 🔹 Поддерживает многопользовательский режим — настройки не пересекаются.

⚠️ Внимание: Если вы используете 1С:Предприятие в файловом варианте, настройки хранятся в файле 1Cv8.1CD. При переносе базы на другой компьютер или восстановлении из резервной копии они могут потеряться. Для клиент-серверного варианта данные хранятся в базе и переносятся вместе с ней.

Имя настройки уникально для формы|Значение сериализуемо (не содержит сложных объектов)|Обработчики ПриОткрытии и ПередЗакрытием подключены|Права пользователя позволяют записывать настройки-->

3. Хранение в регистрах сведений: для сложных данных

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

  • 📊 Сохранения состояния фильтров в отчетах с большим количеством параметров.
  • 📊 Хранения пользовательских предпочтений (например, настройки интерфейса).
  • 📊 Временных данных, которые нужно передавать между сеансами.

Пример структуры регистра сведений:

Имя реквизита Тип Описание
Пользователь СправочникСсылка.Пользователи Ссылка на пользователя, для которого сохраняются настройки
ИмяФормы Строка(255) Идентификатор формы (например, "Документ.ЗаказПокупателя.ФормаОбъекта")
ИмяРеквизита Строка(255) Имя реквизита формы (например, "ФильтрПоДате")
Значение Произвольный Сериализованное значение реквизита (используйте ЗначениеВСтрокуВнутр())

Код для записи в регистр:

Процедура СохранитьВРегистр(ИмяФормы, ИмяРеквизита, Значение)

Запись = РегистрыСведений.НастройкиПользователей.СоздатьЗапись();

Запись.Пользователь = Пользователи.ТекущийПользователь();

Запись.ИмяФормы = ИмяФормы;

Запись.ИмяРеквизита = ИмяРеквизита;

Запись.Значение = ЗначениеВСтрокуВнутр(Значение);

Запись.Записать();

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

⚠️ Внимание: При использовании регистров сведений обязательно очищайте устаревшие записи, иначе база будет разрастаться. Добавьте периодическую процедуру очистки (например, через РегламентноеЗадание) для удаления записей старше 1 года.

💡

Для удобства создайте общий модуль с функциями СохранитьНастройку() и ПолучитьНастройку(), чтобы не дублировать код в каждой форме.

4. Использование временных хранилищ: для данных внутри сеанса

Если нужно сохранять значения только на время сеанса (например, при переходе между формами), подойдет ВременноеХранилище. Это аналог "куки" в веб-разработке. Пример:

// Сохранение значения

ВременноеХранилище = Новый ВременноеХранилищеЗначений();

ВременноеХранилище.Вставить("МояНастройка_ТекущийФильтр", ЗначениеРеквизитаФормы("Фильтр"));

// Получение значения в другой форме

ВременноеХранилище = Новый ВременноеХранилищеЗначений();

Если ВременноеХранилище.Свойство("МояНастройка_ТекущийФильтр") Тогда

ТекущийФильтр = ВременноеХранилище.МояНастройка_ТекущийФильтр;

КонецЕсли;

Особенности метода:

  • ⏳ Данные хранятся только в рамках одного сеанса (до закрытия 1С).
  • 🔄 Можно передавать сложные объекты (таблицы значений, структуры).
  • 🚫 Не подходит для долговременного хранения.

Типичная ошибка: попытка сохранить во ВременноеХранилище данные, которые нужно передать между разными сеансами (например, при работе в веб-клиенте с перезагрузкой страницы). В этом случае значения теряются.

5. Сохранение в файлах: для внешних обработок и отчетов

Если вы работаете с внешними обработками или отчетами, которые не привязаны к конфигурации, можно сохранять настройки в JSON-файлах на диске. Этот способ подходит для:

  • 💾 Внешних печатных форм, где нужно запомнить последние параметры.
  • 💾 Обработок загрузки/выгрузки данных с настройками путей к файлам.
  • 💾 Универсальных отчетов, которые используются в нескольких базах.

Пример кода для сохранения в файл:

Процедура СохранитьНастройкиВФайл(ИмяФайла, Настройки)

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.ЗаписатьJSON(Настройки);

ТекстJSON = ЗаписьJSON.Закрыть();

ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);

ЗаписьТекста.ЗаписатьСтроку(ТекстJSON);

ЗаписьТекста.Закрыть();

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

⚠️ Внимание: При работе с файлами учитывайте:

  • 🔒 Права доступа: в клиент-серверном варианте файлы на сервере могут быть недоступны.
  • 📂 Путь к файлу: используйте КаталогВременныхФайлов() или КаталогДокументов() для кросс-платформенности.
  • 🔄 Конфликты: если обработка используется несколькими пользователями, организуйте раздельное хранение (например, добавляйте имя пользователя в имя файла).
Как защитить файлы настроек от изменения пользователем?

Используйте бинарный формат вместо JSON или шифруйте данные с помощью ШифрованиеСтроки(). Также можно добавлять в файл контрольную сумму (хэш) для проверки целостности данных.

6. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при сохранении значений реквизитов. Вот самые распространенные ошибки и способы их решения:

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

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

  • 🏷️ Используйте полные имена форм (например, "Документ.ЗаказПокупателя.ФормаОбъекта.ФильтрПоДате").
  • 🏷️ Добавляйте префиксы для групп настроек (например, "Отчет_ВедомостьПоТоварам_").
  • 🏷️ Для внешних обработок включайте в ключ имя файла обработки.
💡

Всегда проверяйте, существует ли настройка, перед ее использованием. Это предотвратит ошибки при первом открытии формы, когда настроек еще нет.

FAQ: Частые вопросы по сохранению реквизитов

Можно ли сохранить значение реквизита формы, если она не привязана к объекту метаданных (например, произвольная форма в обработке)?

Да, для этого подойдут:

  • ПользовательскиеНастройки (универсальный способ).
  • ВременноеХранилище (если нужно сохранить на время сеанса).
  • Регистр сведений или файл (для долговременного хранения).

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

Почему после перезапуска 1С мои настройки сбрасываются, хотя я использую ПользовательскиеНастройки?

Вероятные причины:

  1. Вы работаете в файловом варианте и файл базы (1Cv8.1CD) был заменен или поврежден.
  2. В коде неверно указано имя формы или имя реквизита при сохранении/чтении.
  3. Настройки сохраняются в ПередЗакрытием, но форма закрывается аварийно (например, по кресту), и событие не срабатывает. В этом случае используйте ПриИзменении для критичных реквизитов.

Проверьте логику сохранения с помощью отладчика или добавьте вывод сообщений в ЖурналРегистрации.

Как сохранить табличную часть формы (например, список выбранных товаров в документе)?

Для табличных частей удобнее использовать:

  • Регистр сведений — если нужно хранить долго и с привязкой к пользователю.
  • JSON-файл — для внешних обработок.

Пример сериализации табличной части в строку:

ТекстJSON = ЗаписьJSON.Записать(ТабличнаяЧасть.Выгрузить());

Для восстановления:

ТабличнаяЧасть.Загрузить(ЧтениеJSON.Прочитать(ТекстJSON));
Можно ли сохранить состояние формы (размер, положение, видимость колонок) без программирования?

Да, для управляемых форм платформа 1С:Предприятие сохраняет:

  • Размер и положение окна.
  • Ширину и порядок колонок в таблицах.
  • Видимость колонок (если пользователь скрыл/показал их через контекстное меню).

Это работает автоматически, если:

  • Форма является управляемой.
  • В настройках формы (Свойства формы → Хранение настроек) включено Автосохранение положения и размера.

Для обычных форм эти настройки не сохраняются — потребуется программная доработка.

Как сделать, чтобы настройки сохранялись не для каждого пользователя, а общедоступными (например, фильтр по умолчанию для всех)?

Используйте:

  • Константы — если настройка редко меняется и одинакова для всех.
  • Регистр сведений без привязки к пользователю — если нужно гибко управлять настройками.
  • Файл в каталоге шаблонов — для внешних обработок.

Пример с константой:

Константы.ФильтрПоУмолчанию.Установить(ЗначениеРеквизитаФормы("Фильтр"));

⚠️ Внимание: Общие настройки могут конфликтовать, если пользователи работают с разными данными. Например, фильтр по организации не должен быть общим, если в базе несколько организаций.