В процессе разработки на платформе 1С (особенно в конфигурациях на обычных формах, таких как УПП 1.3 или КА 1.1) часто возникает задача сохранения пользовательских настроек. Одной из самых трудоемких задач является корректное сохранение и последующее восстановление данных табличных частей или таблиц значений. Проанализируем типичную ситуацию: программист сохраняет структуру настроек при закрытии формы, но при открытии или изменении параметров данные таблицы оказываются Неопределено или просто не загружаются. Разберем по шагам, как решить эту проблему и какие методы платформы следует использовать.
Рассмотрим ситуацию, с которой столкнулся автор темы. Для восстановления данных таблицы он пытался использовать метод ЗаполнитьЗначенияСвойств. Это принципиальная методическая ошибка. Выясним причину: метод ЗаполнитьЗначенияСвойств предназначен для копирования простых значений свойств между объектами (например, из реквизита документа в реквизит формы), чьи имена совпадают. Однако табличная часть или ТаблицаЗначений являются коллекциями строк.
Важно помнить: этот метод не умеет автоматически создавать строки в таблице-приемнике и наполнять их данными из таблицы-источника. Для работы с коллекциями данных в 1С предусмотрены специализированные методы Выгрузить() и Загрузить().
Проанализируем правильный подход. При сохранении мы создаем копию данных таблицы в памяти:
// В процедуре сохранения настроек
СохраненнаяНастройка = Новый Структура;
СохраненнаяНастройка.Вставить("УстановкаДолей", УстановкаДолей.Выгрузить());
При восстановлении мы должны не "заполнять свойства", а полностью заместить текущее содержимое табличной части данными из сохраненной структуры:
// В процедуре восстановления настроек
Если СтруктураНастройки.СохраненнаяНастройка.Свойство("УстановкаДолей") Тогда
ТаблицаИзНастроек = СтруктураНастройки.СохраненнаяНастройка.УстановкаДолей;
Если ТипЗнч(ТаблицаИзНастроек) = Тип("ТаблицаЗначений") Тогда
УстановкаДолей.Загрузить(ТаблицаИзНастроек);
КонецЕсли;
КонецЕсли;
В типовых конфигурациях на обычных формах за сохранение отвечает модуль УниверсальныеМеханизмы. Чтобы система понимала, как и когда применять настройки, необходимо правильно заполнить управляющую структуру. Посмотрим на важные флаги:
Истина, система автоматически попытается восстановить настройки при инициализации формы. Если Ложь — программист должен вызвать восстановление вручную (например, при выборе конкретного документа).Пример правильной подготовки структуры для сохранения:
Процедура ПриЗакрытии()
СохраненнаяНастройка = Новый Структура;
СохраненнаяНастройка.Вставить("НачалоГода", Документ.НачалоГода);
СохраненнаяНастройка.Вставить("УстановкаДолей", УстановкаДолей.Выгрузить());
СтруктураНастройки = Новый Структура;
СтруктураНастройки.Вставить("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
СтруктураНастройки.Вставить("ИмяОбъекта", "ГенерацияДвижений");
СтруктураНастройки.Вставить("НаименованиеНастройки", "Основная");
СтруктураНастройки.Вставить("СохраненнаяНастройка", СохраненнаяНастройка);
СтруктураНастройки.Вставить("ИспользоватьПриОткрытии", Истина); // Для автоматического восстановления
СтруктураНастройки.Вставить("СохранятьАвтоматически", Истина);
УниверсальныеМеханизмы.СохранитьНастройку(СтруктураНастройки);
КонецПроцедуры
Почему в некоторых случаях УстановкаДолей возвращает Неопределено? Выясним причину. Когда 1С сохраняет настройки в базу данных (обычно в регистр сведений "Сохраненные настройки"), она преобразует объекты в строку или двоичные данные. Это называется сериализацией.
Рассмотрим ограничения: если в вашей таблице значений есть колонки с типами данных, которые нельзя сериализовать (например, ссылки на объекты, которые были удалены, или специфические COM-объекты), вся таблица может не сохраниться. Однако чаще всего проблема в том, что при чтении настройки структура СохраненнаяНастройка просто не содержит нужного ключа или ключ был записан с опечаткой.
Чтобы избежать ошибок, всегда проверяйте наличие ключа в структуре перед обращением к нему:
Если СтруктураНастройки.СохраненнаяНастройка.Свойство("УстановкаДолей") Тогда
// Работаем с данными
КонецЕсли;
После того как мы выполнили УстановкаДолей.Загрузить(ТаблицаИзНастроек), данные в объекте изменятся, но визуально на форме табличное поле может остаться пустым или не обновиться. Рассмотрим, как принудительно обновить экран. В обычных формах для этого достаточно вызвать метод Модифицированность = Истина или напрямую обновить элемент управления, если он связан с таблицей:
// Если УстановкаДолей — это табличная часть обработки
ЭлементыФормы.УстановкаДолей.ОбновитьСтроки();
Проанализируем альтернативный вариант. Если вам не нужно хранить настройки в разрезе документов, а достаточно сохранять их для конкретного пользователя, можно воспользоваться встроенным свойством формы "Сохранять значения". Для этого выполним следующие действия:
Этот метод работает без единой строки кода. Однако он менее гибкий, чем использование УниверсальныеМеханизмы, так как настройки сохраняются локально в системном хранилище пользователя и их сложно перенести другому человеку или связать с конкретным бизнес-процессом.
Подведем итоги нашего разбора. Для успешного сохранения и восстановления табличных данных необходимо:
Выгрузить() при сохранении для создания независимой копии данных таблицы.Загрузить() при восстановлении для наполнения существующей таблицы данными.СохраненнаяНастройка.УниверсальныхМеханизмов внимательно настраивать флаги автоматического сохранения и использования при открытии.Соблюдение этих правил гарантирует стабильную работу механизма настроек и избавляет от досадных ошибок с потерей данных в табличных частях.