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