Как правильно сохранить и восстановить данные табличной части в обработке 1С через универсальные механизмы?

Программист 1С v8.3 (Обычные формы)
← На главную

В процессе разработки на платформе 1С (особенно в конфигурациях на обычных формах, таких как УПП 1.3 или КА 1.1) часто возникает задача сохранения пользовательских настроек. Одной из самых трудоемких задач является корректное сохранение и последующее восстановление данных табличных частей или таблиц значений. Проанализируем типичную ситуацию: программист сохраняет структуру настроек при закрытии формы, но при открытии или изменении параметров данные таблицы оказываются Неопределено или просто не загружаются. Разберем по шагам, как решить эту проблему и какие методы платформы следует использовать.

Разбор основной ошибки: ЗаполнитьЗначенияСвойств против Загрузить

Рассмотрим ситуацию, с которой столкнулся автор темы. Для восстановления данных таблицы он пытался использовать метод ЗаполнитьЗначенияСвойств. Это принципиальная методическая ошибка. Выясним причину: метод ЗаполнитьЗначенияСвойств предназначен для копирования простых значений свойств между объектами (например, из реквизита документа в реквизит формы), чьи имена совпадают. Однако табличная часть или ТаблицаЗначений являются коллекциями строк.

Важно помнить: этот метод не умеет автоматически создавать строки в таблице-приемнике и наполнять их данными из таблицы-источника. Для работы с коллекциями данных в 1С предусмотрены специализированные методы Выгрузить() и Загрузить().

Проанализируем правильный подход. При сохранении мы создаем копию данных таблицы в памяти:


// В процедуре сохранения настроек
СохраненнаяНастройка = Новый Структура;
СохраненнаяНастройка.Вставить("УстановкаДолей", УстановкаДолей.Выгрузить()); 

При восстановлении мы должны не "заполнять свойства", а полностью заместить текущее содержимое табличной части данными из сохраненной структуры:


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

Настройка параметров "УниверсальныхМеханизмов"

В типовых конфигурациях на обычных формах за сохранение отвечает модуль УниверсальныеМеханизмы. Чтобы система понимала, как и когда применять настройки, необходимо правильно заполнить управляющую структуру. Посмотрим на важные флаги:

  1. ИспользоватьПриОткрытии: Если установить значение Истина, система автоматически попытается восстановить настройки при инициализации формы. Если Ложь — программист должен вызвать восстановление вручную (например, при выборе конкретного документа).
  2. СохранятьАвтоматически: Этот флаг определяет, будет ли система перезаписывать "Основную" настройку без участия пользователя при каждом закрытии.
  3. ИмяОбъекта: Должно строго соответствовать имени обработки или документа в дереве метаданных.

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


Процедура ПриЗакрытии()
    СохраненнаяНастройка = Новый Структура;
    СохраненнаяНастройка.Вставить("НачалоГода", Документ.НачалоГода);
    СохраненнаяНастройка.Вставить("УстановкаДолей", УстановкаДолей.Выгрузить());
    
    СтруктураНастройки = Новый Структура;
    СтруктураНастройки.Вставить("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
    СтруктураНастройки.Вставить("ИмяОбъекта", "ГенерацияДвижений");
    СтруктураНастройки.Вставить("НаименованиеНастройки", "Основная");
    СтруктураНастройки.Вставить("СохраненнаяНастройка", СохраненнаяНастройка);
    СтруктураНастройки.Вставить("ИспользоватьПриОткрытии", Истина); // Для автоматического восстановления
    СтруктураНастройки.Вставить("СохранятьАвтоматически", Истина);
    
    УниверсальныеМеханизмы.СохранитьНастройку(СтруктураНастройки);
КонецПроцедуры

Проблема сериализации и "Неопределено"

Почему в некоторых случаях УстановкаДолей возвращает Неопределено? Выясним причину. Когда 1С сохраняет настройки в базу данных (обычно в регистр сведений "Сохраненные настройки"), она преобразует объекты в строку или двоичные данные. Это называется сериализацией.

Рассмотрим ограничения: если в вашей таблице значений есть колонки с типами данных, которые нельзя сериализовать (например, ссылки на объекты, которые были удалены, или специфические COM-объекты), вся таблица может не сохраниться. Однако чаще всего проблема в том, что при чтении настройки структура СохраненнаяНастройка просто не содержит нужного ключа или ключ был записан с опечаткой.

Чтобы избежать ошибок, всегда проверяйте наличие ключа в структуре перед обращением к нему:


Если СтруктураНастройки.СохраненнаяНастройка.Свойство("УстановкаДолей") Тогда
    // Работаем с данными
КонецЕсли;

Обновление интерфейса после загрузки данных

После того как мы выполнили УстановкаДолей.Загрузить(ТаблицаИзНастроек), данные в объекте изменятся, но визуально на форме табличное поле может остаться пустым или не обновиться. Рассмотрим, как принудительно обновить экран. В обычных формах для этого достаточно вызвать метод Модифицированность = Истина или напрямую обновить элемент управления, если он связан с таблицей:


// Если УстановкаДолей — это табличная часть обработки
ЭлементыФормы.УстановкаДолей.ОбновитьСтроки();

Использование встроенных возможностей платформы

Проанализируем альтернативный вариант. Если вам не нужно хранить настройки в разрезе документов, а достаточно сохранять их для конкретного пользователя, можно воспользоваться встроенным свойством формы "Сохранять значения". Для этого выполним следующие действия:

  1. Откроем свойства формы в конфигураторе.
  2. Установим галочку "Сохранять значения".
  3. В списке "Выбираемые значения" отметим нужную таблицу значений или реквизиты.
  4. Установим галочку "Восстанавливать значения при открытии".

Этот метод работает без единой строки кода. Однако он менее гибкий, чем использование УниверсальныеМеханизмы, так как настройки сохраняются локально в системном хранилище пользователя и их сложно перенести другому человеку или связать с конкретным бизнес-процессом.

Резюме решения

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

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

← На главную