Как сохранить и восстановить значения табличной части в обработке 1С?

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

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

Вариант 1: Использование механизма Хранилища настроек

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

Рассмотрим реализацию сохранения:


&НаСервере
Процедура СохранитьНастройки()
    КлючНастроек = "МояУникальнаяОбработка";
    Настройки = Новый Соответствие;
    Настройки.Вставить("МояТЧ", Объект.ИмяВашейТабличнойЧасти.Выгрузить());
    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ИмяОбъекта", КлючНастроек, Настройки);
КонецПроцедуры

Теперь рассмотрим восстановление данных при открытии обработки:


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

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

Вариант 2: Использование событий формы (современный подход)

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

Разберем реализацию по шагам:

  1. В модуле формы используйте процедуру ПриСохраненииДанныхВНастройкахНаСервере для выгрузки данных.
  2. Используйте ПередЗагрузкойДанныхИзНастроекНаСервере для обратной загрузки.
  3. Не забывайте при изменении данных в таблице вызывать СохраняемыеВНастройкахДанныеМодифицированы = Истина, чтобы платформа поняла, что нужно выполнить сохранение.

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    Настройки.Вставить("МояТЧ", Объект.ИмяВашейТабличнойЧасти.Выгрузить());
КонецПроцедуры

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

Вариант 3: Сериализация в строку (устаревший, но возможный способ)

Иногда программисты используют методы ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр. Этот метод позволяет превратить таблицу значений в строку неограниченной длины и записать её в какой-либо реквизит или регистр сведений.

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

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

Рекомендации по реализации

Анализируя ситуацию, мы рекомендуем придерживаться следующих правил:

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

← На главную