Как правильно сохранять данные реквизитов управляемой формы и где они хранятся физически?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с управляемыми формами начинающие разработчики часто сталкиваются с путаницей: где заканчивается «интерфейсное» сохранение настроек и начинается реальная запись данных в базу. Разберем ситуацию на примере таблицы значений (ТЗ), добавленной на форму бизнес-процесса. Выясним, почему флаг Сохраняемые данные не записывает информацию в таблицу объекта, как работает автоматическое сохранение настроек и как правильно организовать хранение данных, чтобы они были доступны из общих модулей.

Разбираемся с флагом Сохраняемые данные

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

Проанализируем алгоритм работы платформы:

  1. Когда пользователь изменяет значение в реквизите (например, добавляет строку в таблицу значений), платформа проверяет наличие флага Сохраняемые данные.
  2. Если флаг установлен, свойство формы Модифицированность автоматически принимает значение Истина.
  3. При попытке закрыть форму 1С «видит», что данные были изменены, и выводит стандартный диалог: «Данные были изменены. Сохранить?».

Таким образом, этот флаг нужен лишь для того, чтобы пользователь случайно не потерял введенные данные. Если же вы хотите, чтобы данные физически попали в базу при нажатии кнопки «Записать», одного этого флага недостаточно.

Автоматическое сохранение данных в настройках

Иногда разработчики замечают «магию»: форма закрывается, открывается заново, и данные в ТЗ остаются на месте, хотя в объекте бизнес-процесса никаких таблиц не создавалось. Выясним причину этого поведения. Это результат работы свойств формы:

В этом случае данные сохраняются в системную таблицу базы данных (в клиент-серверном варианте это таблица SystemSettings). Платформа сериализует содержимое реквизита в XML или JSON и привязывает его к паре Пользователь + Путь к форме. Рассмотрим подробнее, почему этот метод не подходит для хранения бизнес-данных:

  1. Данные не связаны с объектом: Если один пользователь заполнил таблицу в бизнес-процессе №1, а потом открыл бизнес-процесс №2, он может увидеть те же самые данные, так как настройка привязана к форме, а не к конкретной ссылке на документ.
  2. Недоступность извне: Получить эти данные из общего модуля, имея только ссылку на бизнес-процесс, крайне сложно и архитектурно неправильно.
  3. Риск потери: При очистке настроек пользователя администратором (например, через «Настройки пользователей и прав») вся информация будет безвозвратно удалена.

Как программно работать с хранилищем настроек

Если вам все же необходимо извлечь данные, которые форма «запомнила» для себя, можно воспользоваться менеджером ХранилищеНастроекДанныхФорм. Проанализируем пример кода, который позволяет прочитать сохраненные настройки:


// Пример получения сохраненных настроек формы программно
КлючОбъекта = "БизнесПроцесс.Согласование.Форма.ФормаОбъекта";
Пользователь = ИмяПользователя();
ДанныеНастроек = ХранилищеНастроекДанныхФорм.Загрузить(КлючОбъекта, "", Пользователь);

Если ТипЗнч(ДанныеНастроек) = Тип("Структура") Тогда
    // Обработка полученных данных
    ТзИзНастроек = ДанныеНастроек.НазваниеВашегоРеквизита;
КонецЕсли;

Важно: Помните, что использование ХранилищеНастроекДанныхФорм для хранения важных данных бизнес-логики считается плохим тоном (антипаттерном) в разработке на 1С. Для интерактивного анализа, восстановления и сброса сохраненных параметров подойдёт обработка для просмотра и очистки хранилища настроек пользователей.

Правильная архитектура: Табличные части и Регистры сведений

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

Подход №1: Добавление табличной части в объект. Это самый правильный способ. Если вам нужно хранить строки данных, создайте полноценную табличную часть (ТЧ) в метаданных бизнес-процесса. В этом случае:

Подход №2: Использование регистра сведений. Если по каким-то причинам изменять структуру самого бизнес-процесса нельзя, используем регистр сведений. Ключом (измерением) в нем должна выступать ссылка на ваш бизнес-процесс. Посмотрим на пример кода записи данных в регистр при закрытии формы:


&НаСервере
Процедура СохранитьДанныеВРегистрНаСервере()
    
    МенеджерЗаписи = РегистрыСведений.ДополнительныеДанныеБП.СоздатьМенеджерЗаписи();
    
    Для Каждого СтрокаТЗ Из Объект.ВашаТаблицаФормы Цикл
        МенеджерЗаписи.БизнесПроцесс = Объект.Ссылка;
        МенеджерЗаписи.ИмяРеквизита  = СтрокаТЗ.ИмяРеквизита;
        МенеджерЗаписи.Значение      = СтрокаТЗ.Значение;
        МенеджерЗаписи.Записать();
    КонецЦикла;
    
КонецПроцедуры

Проблема типов данных при заполнении из запроса

Часто возникает ситуация, когда при заполнении таблицы на форме данными из запроса (через ЗначениеВРеквизитФормы) типы колонок «слетают» в строку. Разберем, как этого избежать.

Выясним причину: если в результате запроса колонка содержит NULL или данные неопределенного типа, 1С может автоматически типизировать колонку на форме как Строка. Чтобы жестко задать тип данных (например, справочник), проанализируем пример правильного запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ВЫРАЗИТЬ(Данные.Ссылка КАК Справочник.Контрагенты) КАК Контрагент,
    |   Данные.Сумма КАК Сумма
    |ИЗ
    |   Справочник.ВременныеДанные КАК Данные";

РезультатЗапроса = Запрос.Выполнить();
// Перед выгрузкой убедитесь, что структура ТЗ совпадает со структурой реквизита формы
ЗначениеВРеквизитФормы(РезультатЗапроса.Выгрузить(), "ИмяТЗНаФорме");

Применение функции ВЫРАЗИТЬ гарантирует, что колонка в ТаблицеЗначений будет иметь тип ссылки, а не составной тип или строку. Это критически важно для корректного отображения данных в элементах управления формой. Для решения практических задач динамического формирования интерфейса можно использовать решение для программного вывода произвольной таблицы значений на форму.

Заключение и рекомендации

Подведем итоги нашего анализа работы с сохраняемыми данными:

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

← На главную