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

В этой статье мы систематизируем все актуальные способы сохранения реквизитов формы: от встроенных свойств до программного управления через ХранилищеНастроек и ХранилищеЗначений. Особое внимание уделим типичным ошибкам, которые приводят к потере данных, и нюансам работы в управляемом и обычном приложении. Если вы разрабатываете конфигурации на 1С 8.3 или поддерживаете устаревшие решения на 8.2, здесь найдете рабочие решения для обоих случаев.

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

Прежде чем переходить к практике, важно понять ключевое отличие: сохранение значений реквизитов формы может быть временным (на время работы формы) или постоянным (между сеансами). Первый случай решается свойствами самой формы, а второй требует involvement систем хранения платформы. Разберем оба варианта.

1. Стандартные свойства формы: сохранение без программирования

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

Основные свойства, отвечающие за сохранение:

  • 📌 СохранятьЗначение — если установлено в Истина, значение реквизита будет сохраняться между открытиями формы в текущем сеансе.
  • 🔄 СохранятьПозицию — актуально для табличных частей: сохраняет позицию курсора.
  • 💾 ХранитьНастройку — сохраняет значение реквизита в настройках формы (работает между сеансами).

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

  1. Откройте форму в конфигураторе.
  2. Выделите нужный реквизит в дереве элементов.
  3. В палитре свойств найдите свойство СохранятьЗначение и установите его в Истина.
  4. Для сохранения между сеансами также установите ХранитьНастройку = Истина.

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

⚠️ Внимание: Значения реквизитов с типом ДвоичныеДанные, ХранилищеЗначения или сложные объекты (например, таблицы значений) через стандартные свойства сохраняться не будут. Для них потребуется программный код.
📊 Какой тип реквизитов вам чаще всего нужно сохранять?
Простые (строка, число, дата)
Справочники и документы
Табличные части
Флажки и переключатели
Другое

2. Использование ХранилищеНастроек для долговременного сохранения

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

Основные преимущества ХранилищеНастроек:

  • 🔐 Данные привязываются к конкретному пользователю и компьютеру.
  • 📁 Поддерживает иерархическую структуру (можно создавать разделы).
  • 🔄 Автоматически синхронизируется между тонким клиентом и веб-клиентом.

Пример кода для сохранения и чтения значения:

&НаКлиенте

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

Хранилище = ХранилищеНастроек.Получить("МоиНастройки/ФормаДокумента");

Хранилище.Вставить("ПоследнийФильтр", Значение);

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

&НаКлиенте

Функция ПолучитьНастройку()

Хранилище = ХранилищеНастроек.Получить("МоиНастройки/ФормаДокумента");

Возврат Хранилище.Получить("ПоследнийФильтр");

КонецФункции

Важные нюансы работы с ХранилищеНастроек:

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

Для отладки хранилища настроек используйте встроенный отчет Администрирование → Поддержка и обслуживание → Настройки пользователей. Там можно увидеть все сохраненные значения и при необходимости очистить их.

3. ХранилищеЗначений для сложных данных

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

ХранилищеЗначения позволяет сериализовать почти любой объект платформы и сохранить его в двоичном виде. Основные сценарии применения:

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

Пример сохранения таблицы значений:

&НаКлиенте

Процедура СохранитьТаблицу(Таблица)

Хранилище = Новый ХранилищеЗначения(Таблица);

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

Запись.ЗаписатьXML(Хранилище);

Файл = Новый Файл(ПутьКФайлу);

Запись.Записать(Файл);

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

&НаКлиенте

Функция ВосстановитьТаблицу()

Чтение = Новый ЧтениеXML;

Файл = Новый Файл(ПутьКФайлу);

Чтение.ОткрытьФайл(Файл);

Хранилище = Чтение.ПрочитатьXML();

Возврат Хранилище.Восстановить();

КонецФункции

⚠️ Внимание: Объекты, сохраненные в ХранилищеЗначения, привязаны к конкретной версии конфигурации. При обновлении структуры объектов (например, добавлении новых реквизитов в справочник) восстановление может завершиться ошибкой. Всегда проверяйте совместимость при изменении метаданных.
Как обойти ограничение на размер ХранилищеЗначения?

Если объект слишком большой (например, таблица с тысячами строк), разбейте его на части и сохраните в несколько файлов. В 1С 8.3.20+ можно использовать ПотокВПамяти для оптимизации работы с большими данными.

4. Сохранение в реквизиты объекта (документа, справочника)

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

Преимущества этого подхода:

  • 🔗 Данные автоматически сохраняются при записи объекта.
  • 📎 Легко реализовать версионность (история изменений через журнал документов).
  • 🔍 Возможность поиска и отчетов по сохраненным значениям.

Пример реализации:

  1. Добавьте в документ служебный реквизит (например, ДополнительныеНастройки типа Строка или ХранилищеЗначения).
  2. В модуле формы обработайте событие ПередЗаписью:
&НаКлиенте

Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

Объект.ДополнительныеНастройки = СериализоватьНастройки(ЭлементыФормы);

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

&НаСервере

Функция СериализоватьНастройки(Элементы)

Настройки = Новый Структура;

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

Настройки.Вставить("ТолькоАктивные", Элементы.ТолькоАктивные.Значение);

Возврат Новый ХранилищеЗначения(Настройки);

КонецФункции

При восстановлении формы данные читаются из объекта в событии ПриСозданииНаСервере или ПриОткрытии.

⚠️ Внимание: Если реквизит объекта используется для хранения пользовательских настроек, добавьте его в список "Служебные реквизиты" в свойствах объекта. Это предотвратит отображение поля в формах по умолчанию и упростит поддержку.

5. Работа с настройками формы через XML

Платформа 1С:Предприятие позволяет сохранять и восстанавливать полное состояние формы (включая положение элементов, ширину колонок, видимость панелей) в XML-файл. Это полезно для сложных форм с большим количеством элементов управления.

Основные методы работы:

  • 📤 ЗаписатьНастройки() — сохраняет текущие настройки формы в XML.
  • 📥 ПрочитатьНастройки() — восстанавливает настройки из XML.
  • 🗃 НастройкиПоУмолчанию() — сбрасывает настройки к стандартным.

Пример сохранения и восстановления настроек:

&НаКлиенте

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

Настройки = Новый ЗаписьXML;

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

Файл = Новый Файл(КаталогВременныхФайлов() + "НастройкиФормы.xml");

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

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

&НаКлиенте

Процедура ВосстановитьНастройкиФормы(Команда)

Чтение = Новый ЧтениеXML;

Файл = Новый Файл(КаталогВременныхФайлов() + "НастройкиФормы.xml");

Чтение.ОткрытьФайл(Файл);

ЭтаФорма.ПрочитатьНастройки(Чтение);

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

Этот метод сохраняет:

  • Положение и размер формы.
  • Ширину и порядок колонок в таблицах.
  • Состояние раскрытия групп в дереве элементов.
  • Видимость/невидимость панелей и закладок.

Однако есть и ограничения:

  • ❌ Не сохраняются значения реквизитов (только визуальные настройки).
  • ❌ Не работает для динамических элементов, созданных в коде.
  • ❌ В разных версиях платформы формат XML может отличаться.

☑️ Подготовка к сохранению настроек формы

Выполнено: 0 / 4

6. Альтернативные способы: файлы, регистры, БД

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

МетодПреимуществаНедостаткиКогда использовать
Файлы (TXT, JSON, XML) ✅ Простота реализации
✅ Не зависит от платформы
❌ Низкая безопасность
❌ Проблемы с многопользовательским доступом
Для временных данных или однопользовательских решений
Регистры сведений ✅ Встроенная версия
✅ Поддержка транзакций
✅ Быстрый доступ
❌ Усложняет структуру базы
❌ Требует прав на запись
Для хранения настроек, привязанных к объектам конфигурации
Внешняя БД (SQLite, PostgreSQL) ✅ Высокая производительность
✅ Масштабируемость
❌ Сложность интеграции
❌ Дополнительные затраты на инфраструктуру
Для распределенных систем или больших объемов данных

Пример использования регистра сведений для хранения пользовательских настроек:

&НаСервере

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

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

НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь());

НаборЗаписей.Отбор.ИмяНастройки.Установить(ИмяНастройки);

НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() = 0 Тогда

НоваяЗапись = НаборЗаписей.Добавить();

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

НоваяЗапись.ИмяНастройки = ИмяНастройки;

Иначе

НоваяЗапись = НаборЗаписей[0];

КонецЕсли;

НоваяЗапись.Значение = Значение;

НаборЗаписей.Записать();

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

Для работы с внешними файлами удобно использовать формат JSON, который легко сериализуется и десериализуется:

&НаКлиенте

Функция СохранитьВJSON(Данные, ПутьКФайлу)

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

Запись.УстановитьСтроку(Новый Структура("Данные", Данные));

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

Текст.Записать(ПутьКФайлу, КодировкаТекста.UTF8);

КонецФункции

💡

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

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

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

1. Потеря данных при обновлении конфигурации

Если вы сохраняете объекты в ХранилищеЗначения, а затем изменяете структуру метаданных (например, добавляете реквизит в справочник), при восстановлении возникнет ошибка "Несоответствие версии данных".

Решение:

  • Используйте версионирование хранилищ (добавьте номер версии в ключ).
  • Реализуйте механизм миграции данных при обновлении.

2. Конфликты в многопользовательском режиме

При одновременном сохранении настроек несколькими пользователями возможны конфликты (последний записавший перезаписывает данные других).

Решение:

  • Для критических данных используйте РегистрыСведений с установкой отбора по пользователю.
  • Реализуйте механизм блокировок при записи.

3. Утечка памяти при работе с ХранилищеЗначения

Частое создание объектов ХранилищеЗначения без освобождения может приводить к росту потребления памяти.

Решение:

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

// ... работа с хранилищем

Хранилище = Неопределено; // Освобождение памяти

4. Проблемы с правами доступа

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

Решение:

  • Проверяйте права программно через ПраваДоступа.Проверка().
  • Используйте Попытка...Исключение для обработки ошибок доступа.

5. Несовместимость между клиентами

Настройки, сохраненные в тонком клиенте, могут не корректно восстанавливаться в веб-клиенте и наоборот.

Решение:

  • Тестируйте работу формы во всех поддерживаемых клиентах.
  • Для критических данных используйте универсальные форматы (JSON, XML).
💡

Чтобы избежать проблем с совместимостью, создайте тестовый сценарий, который проверяет сохранение и восстановление данных во всех поддерживаемых клиентах (тонкий, веб, мобильный).

8. Оптимизация и лучшие практики

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

1. Разделение данных по уровням

  • 📌 Локальные настройки (в рамках сеанса) — используйте свойства формы (СохранятьЗначение).
  • 📌 Пользовательские настройкиХранилищеНастроек.
  • 📌 Общие настройки — регистры сведений или внешние хранилища.

2. Минимизация объема сохраняемых данных

  • Сохраняйте только те реквизиты, которые действительно нужны пользователю.
  • Для больших объектов (таблиц) сохраняйте только изменения, а не весь объект.
  • Используйте сжатие для текстовых данных (например, СжатьДанные()).

3. Безопасность и контроль доступа

  • Для чувствительных данных (пароли, токены) используйте ХранилищеПараметровСеанса с шифрованием.
  • Ограничивайте доступ к общим настройкам через РЛС.
  • Регулярно очищайте устаревшие данные (например, через регламентное задание).

4. Тестирование и отладка

  • Проверяйте работу механизмов сохранения на разных клиентах (тонкий, веб, мобильный).
  • Используйте ЖурналРегистрации для отслеживания ошибок сохранения.
  • Реализуйте механизм резервного копирования критических настроек.

5. Документирование

  • Описывайте в комментариях к коду, какие данные сохраняются и где.
  • Создавайте инструкции для пользователей о том, как восстановить настройки при сбое.
  • Ведите журнал изменений в механизмах сохранения (особенно важно для тиражных решений).

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

Пример оптимизированного кода для сохранения настроек с контрольными проверками:

&НаКлиенте

Процедура БезопасноеСохранениеНастройки(Имя, Значение)

Попытка

Хранилище = ХранилищеНастроек.Получить("МояКонфигурация/НастройкиФорм");

Хранилище.Вставить(Имя, Значение);

Исключение

ЗаписатьЖурналРегистрации(

НСтр("ru = 'Ошибка сохранения настройки'"),

УровеньЖурналаРегистрации.Ошибка,

,

,

ПодробноеОписаниеОшибки(ИнформацияОбОшибке())

);

КонецПопытки;

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

💡

Всегда реализуйте резервный механизм сохранения для критических данных. Например, дублируйте настройки в регистр сведений и в ХранилищеНастроек.

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

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

Как сохранить значение реквизита формы между разными сеансами 1С?

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

Хранилище = ХранилищеНастроек.Получить("МоиНастройки");

Хранилище.Вставить("ПоследнийФильтр", ЗначениеРеквизита);

Для привязки к объекту (например, документу) сохраняйте данные в реквизиты самого объекта.

Почему не сохраняются значения реквизитов с типом "Таблица значений"?

Стандартные механизмы (СохранятьЗначение, ХранилищеНастроек) не поддерживают сложные типы. Используйте ХранилищеЗначения:

Хранилище = Новый ХранилищеЗначения(ТаблицаЗначений);

ЗаписьXML.ЗаписатьXML(Хранилище, ПутьКФайлу);

Или сериализуйте таблицу в JSON/XML и сохраняйте как строку.

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

Используйте методы формы ЗаписатьНастройки() и ПрочитатьНастройки():

Настройки = Новый ЗаписьXML;

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

Настройки.Записать(ПутьКФайлу);

Эти методы сохранят положение, размер, ширину колонок и другие визуальные параметры.

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

Да, при получении ХранилищеНастроек передайте третий параметр Истина:

Хранилище = ХранилищеНастроек.Получить("ОбщиеНастройки", , Истина);

Также можно использовать РегистрыСведений без отбора по пользователю или внешние файлы в общей папке.

Как очистить все сохраненные настройки формы?

Для очистки ХранилищеНастроек:

Хранилище = ХранилищеНастроек.Получить("МоиНастройки");

Хранилище.Очистить();

Для сброса визуальных настроек формы:

ЭтаФорма.НастройкиПоУмолчанию();

В 1С 8.3.18+ можно использовать отчет Администрирование → Настройки пользователей для массовой очистки.