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