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

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

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

Почему автоматическое сохранение не всегда работает для таблиц?

Рассмотрим стандартный механизм. Когда мы устанавливаем в свойствах формы флаг АвтоматическоеСохранениеДанных и отмечаем галочкой Сохранение у конкретного реквизита типа ТаблицаЗначений, платформа пытается сериализовать этот объект автоматически. Однако ТаблицаЗначений на форме представлена типом ДанныеФормыКоллекция. Прямая запись этого объекта в хранилище настроек часто дает сбой, так как платформа требует явного преобразования коллекции в «чистую» таблицу значений для корректной упаковки в структуру настроек.

Разбор решения через системные обработчики

Для реализации надежного сохранения нам необходимо задействовать два ключевых серверных события формы: ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере. В этих процедурах основным рабочим инструментом является параметр Настройки, который представляет собой структуру. Именно в эту структуру мы будем вручную помещать нашу таблицу.

Проанализируем алгоритм сохранения. Нам нужно преобразовать данные формы в объект, который может быть сериализован, и поместить его в структуру под определенным ключом.


&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    
    // Преобразуем реквизит формы (ДанныеФормыКоллекция) в реальную Таблицу Значений
    ТаблицаДляСохранения = РеквизитФормыВЗначение("ТабЗнач", Тип("ТаблицаЗначений"));
    
    // Явно вставляем таблицу в структуру настроек
    Настройки.Вставить("КлючМоейТаблицы", ТаблицаДляСохранения);
    
КонецПроцедуры

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


&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
    
    // Проверяем наличие наших данных в структуре настроек
    Если Настройки.Свойство("КлючМоейТаблицы") Тогда
        
        // Получаем объект ТаблицаЗначений из настроек
        ЗагруженнаяТЗ = Настройки["КлючМоейТаблицы"];
        
        // Загружаем данные в реквизит формы
        // Вариант 1: Через ЗначениеВРеквизитФормы
        ЗначениеВРеквизитФормы(ЗагруженнаяТЗ, "ТабЗнач");
        
        // Вариант 2: Если данные должны попасть в таблицу объекта (например, документа)
        // Объект.ТаблицаКолонок.Загрузить(ЗагруженнаяТЗ);
        
    КонецЕсли;
    
КонецПроцедуры

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

Выясним одну из самых скрытых причин, почему таблица может не сохраняться. Механизм сохранения настроек использует XDTO-сериализацию. Это означает, что все значения, находящиеся внутри ячеек вашей таблицы, должны поддерживать преобразование в строку или XML. Если в вашей таблице значений есть колонки с типами:

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

Использование механизма «Список значений»

Если в свойствах формы СохранениеДанныхВНастройках выбрано значение Использовать список значений, пользователю становится доступна кнопка «Сохранить параметры» и «Восстановить параметры». Это позволяет создавать именованные наборы настроек (например, «Настройка для понедельника», «Отчет по регионам»).

В этом сценарии крайне важно, чтобы в процедуре ПриЗагрузкеДанныхИзНастроекНаСервере вы всегда проверяли свойство Настройки, так как при переключении между вариантами платформа будет вызывать этот обработчик с новыми данными. Если вы забудете прописать ручную загрузку ТЗ, то при выборе новой настройки из списка ваша таблица будет просто очищаться.

Практические советы по отладке

  1. Проверьте галочку «Сохранение»: Убедитесь, что в дереве реквизитов формы у реквизита ТабЗнач стоит флаг в колонке с пиктограммой дискеты. Без этого обработчики могут не получать доступ к данным этого реквизита автоматически.
  2. Модифицированность формы: Платформа инициирует сохранение настроек при закрытии формы, если флаг АвтоматическоеСохранениеДанных установлен в Истина. Однако иногда требуется принудительно вызвать сохранение. Для этого можно использовать метод ЭтаФорма.СохранитьДанныеВНастройках().
  3. Очистка кэша настроек: Если вы изменили состав колонок в конфигураторе (добавили новую колонку или удалили старую), старые сохраненные данные в хранилище пользователя могут конфликтовать с новой структурой. В процессе разработки рекомендуется очищать настройки пользователя через «Администрирование» — «Настройки пользователей и прав», чтобы убедиться в чистоте эксперимента.

Итоги

Для корректной работы с таблицами значений в настройках 1С необходимо отказаться от надежды на полную автоматику платформы. Рассмотренный нами метод с использованием РеквизитФормыВЗначение и явной вставкой в структуру Настройки является наиболее надежным и гибким. Он позволяет контролировать, какие именно данные сохраняются, и избегать ошибок, связанных с типами данных в ячейках таблицы.

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

← На главную