При разработке интерфейсов на платформе «1С:Предприятие 8.3» часто возникает задача минимизировать повторные действия пользователя. Одной из таких задач является сохранение состояния формы (для этого есть панель быстрых фильтров для управляемых форм списков): выбранных значений реквизитов, установленных переключателей и заполненных таблиц. Рассмотрим подробно, как реализовать этот функционал, используя как стандартные возможности платформы, так и программные методы для сложных случаев.
Платформа 1С предоставляет мощный встроенный механизм, который позволяет сохранять данные без написания кода. Проанализируем основные свойства формы, которые отвечают за этот процесс. Для настройки нам необходимо открыть редактор управляемой формы и перейти в палитру свойств самой формы.
Разберем ключевые свойства, используя встроенную палитру свойств формы:
Однако просто включить эти свойства недостаточно. Выясним, как указать системе, какие именно поля мы хотим запоминать. Перейдем на закладку Реквизиты в редакторе формы. В списке реквизитов есть колонка Сохранение. Необходимо проставить отметки (галочки) напротив тех реквизитов, значения которых должны «выживать» после закрытия формы.
Важно помнить, что этот метод идеально подходит для простых типов данных: Строка, Число, Дата, Булево или ссылки на объекты базы данных. Для более сложных структур данных, таких как таблицы, этот метод требует дополнений.
Иногда стандартного «флажка» недостаточно. Например, если нам нужно предварительно обработать данные перед сохранением или если мы работаем с динамическими структурами. Для этого в управляемой форме предусмотрены специальные серверные обработчики событий — ускорить настройку поможет конструктор серверных обработчиков событий без программирования. Рассмотрим их подробнее.
Событие ПриСохраненииДанныхВНастройкахНаСервере(Настройки) вызывается в момент записи данных в хранилище. В параметр Настройки (тип Соответствие) система уже поместила значения всех реквизитов, у которых стоит галочка «Сохранение». Здесь мы можем программно добавить свои данные.
Событие ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) срабатывает при открытии формы. Мы можем извлечь из параметра Настройки наши специфические значения и распределить их по реквизитам формы.
Многие разработчики сталкиваются с тем, что стандартная галочка «Сохранение» в колонке реквизитов не работает для таблиц (ТаблицаЗначений или ТабличнаяЧасть). Проанализируем ситуацию: платформа не может автоматически сериализовать всю таблицу без четких указаний. Рассмотрим эффективный программный способ решения этой задачи.
Для сохранения таблицы нам потребуется выгрузить ее в объект, который платформа умеет хранить, а затем восстановить. Посмотрим на пример кода, который реализует сохранение табличной части:
&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
// Выгружаем таблицу в массив или структуру для сохранения
// В данном примере сохраняем через промежуточное соответствие
Настройки.Вставить("ДанныеМоейТаблицы", Объект.Товары.Выгрузить());
КонецПроцедуры
&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
// Проверяем наличие ключа в настройках
ЗначениеТаблицы = Настройки.Получить("ДанныеМоейТаблицы");
Если ТипЗнч(ЗначениеТаблицы) = Тип("ТаблицаЗначений") Тогда
Объект.Товары.Загрузить(ЗначениеТаблицы);
КонецЕсли;
КонецПроцедуры
Обратите внимание: если ваша конфигурация работает в режиме, где прямая передача ТаблицаЗначений в настройки ограничена, рекомендуется использовать преобразование в строку или XML. Проанализируем вариант с использованием системного хранилища настроек данных форм напрямую, как это часто делают в сложных отчетах или обработках:
&НаСервере
Процедура СохранитьНастройкиНаСервере()
Настройки = Новый Соответствие;
ТЗ = Объект.ТоварыЗаказа.Выгрузить();
// Сериализуем таблицу во внутреннюю строку для надежности
Настройки.Вставить("ТабличнаяЧастьТовары", ЗначениеВСтрокуВнутр(ТЗ));
// Используем КлючОбъекта и КлючНастроек
ХранилищеНастроекДанныхФорм.Сохранить("МояОбработкаЗаказов", "НастройкиТаблицы", Настройки);
КонецПроцедуры
Выясним, где именно хранятся эти данные. Платформа 1С записывает настройки в системную таблицу SystemSettings. Это бинарное хранилище в базе данных SQL. Разберем важный нюанс: если каждый пользователь будет сохранять в настройках формы таблицы на десятки тысяч строк, это приведет к значительному росту системных таблиц и замедлению процесса авторизации пользователей, так как многие настройки считываются при входе.
Рекомендация: Для хранения действительно больших объемов данных (архивы, логи, тяжелые таблицы) лучше использовать специализированные Регистры Сведений, а в настройках формы хранить только ключи или фильтры для доступа к этим данным.
При использовании метода ХранилищеНастроекДанныхФорм.Сохранить() важно правильно выбрать параметры:
Рассмотрим ситуацию, когда настройки «перестали сохраняться». Выделим основные причины:
ПриЗагрузкеДанныхИзНастроекНаСервере вызывается после ПриСозданииНаСервере. Если вы в коде создания жестко прописываете значения реквизитов, механизм сохранения их перезапишет.Подведем итог: для простых форм мы используем стандартные свойства СохранениеДанныхВНастройках и галочки в реквизитах. Для работы с таблицами и сложной логикой — переходим к обработчикам ПриСохранении... и ПриЗагрузке..., используя ХранилищеНастроекДанныхФорм. Такой комбинированный подход сделает работу пользователя максимально комфортной и быстрой.