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

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

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

В этой статье мы подробно разберем, как решить данную задачу. Мы проанализируем различные подходы — от классических методов для обычных форм до современных платформенных механизмов управляемого приложения, работы с системными хранилищами настроек, Библиотекой Стандартных Подсистем (БСП), а также сериализации данных во внешние файлы XML и JSON.

Метод 1. Использование встроенного механизма сохранения настроек управляемой формы (без БСП)

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

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

  1. Откроем управляемую форму нашей обработки в конфигураторе.
  2. В окне свойств формы найдем свойство Сохранение данных в настройках и установим его в значение Использовать (или Использовать список, если требуется хранить несколько вариантов настроек пользователя).
  3. В свойствах формы перейдем к списку событий и создадим два серверных обработчика: ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере.

Теперь напишем код для этих обработчиков. Так как данные на форме хранятся в виде специального типа (ДанныеФормыКоллекция), перед сохранением нам необходимо преобразовать их в обычную таблицу значений, которую платформа умеет сериализовать.


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

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

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

Метод 2. Прямая работа с системным Хранилищем Общих Настроек

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

Рассмотрим пример реализации процедур сохранения и восстановления данных:


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

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

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

Метод 3. Использование функций БСП (Библиотеки Стандартных Подсистем)

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

Проанализируем программный код, который решает эту задачу с использованием механизмов БСП:


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

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

Этот способ крайне удобен, если вы ведете разработку внутри существующей развитой экосистемы прикладного решения от 1С.

Метод 4. Традиционный подход для Обычных Форм (1С 8.2 / 8.3)

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

Рассмотрим, как это реализовать:


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

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

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

Метод 5. Сохранение во внешний XML-файл для максимальной переносимости

Что делать, если сохраненную таблицу необходимо физически перенести на другой компьютер, передать коллеге или загрузить в совершенно другую информационную базу? В этом случае хранилища настроек внутри одной базы данных нам не помогут. Оптимальным решением станет сериализация таблицы в XML-формат.

Платформа 1С содержит мощный механизм работы со стандартной сериализацией XDTO. Выясним, как преобразовать таблицу значений в XML-файл и прочитать ее обратно:


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

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

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

Ограничения использования старых функций сериализации

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

Итоги и рекомендации

Мы проанализировали основные современные сценарии сохранения табличных данных в 1С. Подведем итоги:

← На главную