Работа с формами в 1С:Предприятие часто требует сохранения значений реквизитов между сеансами, при переоткрытии или после обновления конфигурации. Например, пользователь ввел фильтр в отчете, выбрал настройки отображения таблицы или заполнил поля в справочнике — и хочет, чтобы эти данные не сбрасывались при следующем открытии. В этой статье разберем 5 рабочих способов запомнить значения реквизитов: от стандартных механизмов платформы до программных решений с примерами кода.
Проблема актуальна как для разработчиков, так и для пользователей, которые хотят оптимизировать рутинные операции. Мы рассмотрим варианты для управляемых и обычных форм, обсудим плюсы и минусы каждого подхода, а также типичные ошибки, которые приводят к потере данных. Особое внимание уделим сохранению значений в пользовательских настройках — самом универсальном и безопасном методе, который работает даже после обновления конфигурации.
1. Стандартные механизмы платформы: когда 1С сохраняет значения сама
Платформа 1С:Предприятие 8 имеет встроенные механизмы сохранения некоторых реквизитов форм без дополнительного программирования. Это работает для:
- 📌 Параметров отчетов и обработок (например, период, организация, фильтры)
- 📌 Пользовательских настроек списков (сортировка, группировка, видимость колонок)
- 📌 Значений реквизитов форм справочников и документов, если они привязаны к объекту метаданных
Чтобы проверить, сохраняется ли значение автоматически:
- Откройте форму в режиме
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С мои настройки сбрасываются, хотя я использую ПользовательскиеНастройки?
Вероятные причины:
- Вы работаете в файловом варианте и файл базы (
1Cv8.1CD) был заменен или поврежден. - В коде неверно указано имя формы или имя реквизита при сохранении/чтении.
- Настройки сохраняются в
ПередЗакрытием, но форма закрывается аварийно (например, по кресту), и событие не срабатывает. В этом случае используйтеПриИзменениидля критичных реквизитов.
Проверьте логику сохранения с помощью отладчика или добавьте вывод сообщений в ЖурналРегистрации.
Как сохранить табличную часть формы (например, список выбранных товаров в документе)?
Для табличных частей удобнее использовать:
- Регистр сведений — если нужно хранить долго и с привязкой к пользователю.
- JSON-файл — для внешних обработок.
Пример сериализации табличной части в строку:
ТекстJSON = ЗаписьJSON.Записать(ТабличнаяЧасть.Выгрузить());
Для восстановления:
ТабличнаяЧасть.Загрузить(ЧтениеJSON.Прочитать(ТекстJSON));
Можно ли сохранить состояние формы (размер, положение, видимость колонок) без программирования?
Да, для управляемых форм платформа 1С:Предприятие сохраняет:
- Размер и положение окна.
- Ширину и порядок колонок в таблицах.
- Видимость колонок (если пользователь скрыл/показал их через контекстное меню).
Это работает автоматически, если:
- Форма является управляемой.
- В настройках формы (
Свойства формы → Хранение настроек) включеноАвтосохранение положения и размера.
Для обычных форм эти настройки не сохраняются — потребуется программная доработка.
Как сделать, чтобы настройки сохранялись не для каждого пользователя, а общедоступными (например, фильтр по умолчанию для всех)?
Используйте:
- Константы — если настройка редко меняется и одинакова для всех.
- Регистр сведений без привязки к пользователю — если нужно гибко управлять настройками.
- Файл в каталоге шаблонов — для внешних обработок.
Пример с константой:
Константы.ФильтрПоУмолчанию.Установить(ЗначениеРеквизитаФормы("Фильтр"));
⚠️ Внимание: Общие настройки могут конфликтовать, если пользователи работают с разными данными. Например, фильтр по организации не должен быть общим, если в базе несколько организаций.