Разрабатывая внешние обработки или отчеты в среде 1С:Предприятие, программисты часто сталкиваются с задачей сохранения пользовательских данных между сеансами работы. Если для простых реквизитов (строки, числа, даты) в свойствах формы достаточно установить один флажок, то с табличными частями и таблицами значений все обстоит сложнее. Платформа не позволяет напрямую «в один клик» сохранять табличные данные через стандартные свойства.
В этой статье мы подробно разберем, как решить данную задачу. Мы проанализируем различные подходы — от классических методов для обычных форм до современных платформенных механизмов управляемого приложения, работы с системными хранилищами настроек, Библиотекой Стандартных Подсистем (БСП), а также сериализации данных во внешние файлы XML и JSON.
Начнем с самого элегантного и современного способа, который предоставляет нам платформа 1С:Предприятие 8.3 для управляемых форм. Этот метод не требует наличия БСП в конфигурации и работает полностью в рамках штатных механизмов формы.
Суть метода заключается в том, чтобы задействовать стандартные события сохранения и загрузки настроек формы, которые отрабатывают автоматически при закрытии и открытии. Выполним настройку по шагам:
Использовать (или Использовать список, если требуется хранить несколько вариантов настроек пользователя).ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере.Теперь напишем код для этих обработчиков. Так как данные на форме хранятся в виде специального типа (ДанныеФормыКоллекция), перед сохранением нам необходимо преобразовать их в обычную таблицу значений, которую платформа умеет сериализовать.
&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
// Преобразуем коллекцию данных формы в стандартную Таблицу Значений
ТаблицаДляСохранения = РеквизитФормыВЗначение("ИмяВашейТабличнойЧасти");
// Записываем полученную таблицу в структуру настроек формы под уникальным ключом
Настройки.Вставить("МояСохраненнаяТаблица", ТаблицаДляСохранения);
КонецПроцедуры
&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
// Извлекаем таблицу значений из сохраненных настроек
ТаблицаДляВосстановления = Настройки.Получить("МояСохраненнаяТаблица");
Если ТипЗнч(ТаблицаДляВосстановления) = Тип("ТаблицаЗначений") Тогда
// Загружаем данные обратно в реквизит управляемой формы
ЗначениеВРеквизитФормы(ТаблицаДляВосстановления, "ИмяВашейТабличнойЧасти");
КонецЕсли;
КонецПроцедуры
Преимущество метода: Данный способ максимально лаконичен, не перегружает базу лишним кодом и автоматически привязывает сохраненные настройки к текущему пользователю операционной системы.
Если вам требуется сохранять таблицу программно в произвольный момент времени (например, по нажатию специальной кнопки «Сохранить»), а не только при закрытии формы, можно обратиться напрямую к системному объекту платформы ХранилищеОбщихНастроек. Этот метод универсален и отлично подходит для внешних обработок.
Рассмотрим пример реализации процедур сохранения и восстановления данных:
&НаСервере
Процедура СохранитьТаблицуВХранилище()
// Конвертируем данные формы в таблицу значений
ТаблицаЗначений = РеквизитФормыВЗначение("ИмяВашейТабличнойЧасти");
// Сохраняем объект напрямую в системную базу данных 1С
ХранилищеОбщихНастроек.Сохранить(
"ИмяНашейОбработкиДляИдентификации",
"КлючТаблицыЗначений",
ТаблицаЗначений
);
КонецПроцедуры
&НаСервере
Процедура ВосстановитьТаблицуИзХранилища()
// Загружаем объект из системного хранилища
ТаблицаЗначений = ХранилищеОбщихНастроек.Загрузить(
"ИмяНашейОбработкиДляИдентификации",
"КлючТаблицыЗначений"
);
// Проверяем корректность полученного типа данных
Если ТипЗнч(ТаблицаЗначений) = Тип("ТаблицаЗначений") Тогда
ЗначениеВРеквизитФормы(ТаблицаЗначений, "ИмяВашейТабличнойЧасти");
КонецЕсли;
КонецПроцедуры
Данный подход гарантирует стабильную работу кода в любой современной конфигурации 1С независимо от наличия в ней дополнительных библиотек.
В типовых конфигурациях 1С (таких как 1С:Бухгалтерия, 1С:ERP, 1С:Управление торговлей) широко применяется интеграция с БСП. Мы можем использовать готовые функции общего модуля ОбщегоНазначения для быстрого сохранения настроек в системное хранилище.
Проанализируем программный код, который решает эту задачу с использованием механизмов БСП:
&НаСервере
Процедура СохранитьНастройкиБСП()
КлючОбъекта = "ВнешняяОбработкаЗагрузкиДанных";
КлючНастроек = "НастройкиТаблицыПользователя";
// Выгружаем данные табличной части во временную Таблицу Значений
ТаблицаДляСохранения = Объект.ИмяВашейТабличнойЧасти.Выгрузить();
// Упаковываем данные в Соответствие (или Структуру)
Настройки = Новый Соответствие;
Настройки.Вставить("СохраненнаяТЧ", ТаблицаДляСохранения);
// Вызываем стандартный метод БСП для записи в базу
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки);
КонецПроцедуры
&НаСервере
Процедура ВосстановитьНастройкиБСП()
КлючОбъекта = "ВнешняяОбработкаЗагрузкиДанных";
КлючНастроек = "НастройкиТаблицыПользователя";
// Загружаем сохраненную структуру настроек через БСП
ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек);
Если ТипЗнч(ЗначениеНастроек) = Тип("Соответствие") Тогда
// Загружаем сохраненные строки обратно в табличную часть объекта
Объект.ИмяВашейТабличнойЧасти.Загрузить(ЗначениеНастроек.Получить("СохраненнаяТЧ"));
КонецЕсли;
КонецПроцедуры
Этот способ крайне удобен, если вы ведете разработку внутри существующей развитой экосистемы прикладного решения от 1С.
Если вы поддерживаете старые конфигурации или работаете в режиме обычного приложения, вам пригодятся классические методы глобального контекста СохранитьЗначение и ВосстановитьЗначение. Они позволяют быстро записать структуру данных в локальный профиль пользователя операционной системы.
Рассмотрим, как это реализовать:
// В обычной форме при закрытии обработки
Процедура ПриЗакрытии()
// Выгружаем строки табличного поля в Таблицу Значений и сохраняем ее на диск
ТаблицаДляСохранения = НужнаяТабличнаяЧасть.Выгрузить();
СохранитьЗначение("СохраненнаяТаблицаУникальныйИдентификатор", ТаблицаДляСохранения);
КонецПроцедуры
// В обычной форме при открытии обработки
Процедура ПриОткрытии()
// Восстанавливаем объект из локального хранилища настроек пользователя
ВосстановленнаяТЗ = ВосстановитьЗначение("СохраненнаяТаблицаУникальныйИдентификатор");
Если ВосстановленнаяТЗ <> Неопределено Тогда
НужнаяТабличнаяЧасть.Загрузить(ВосстановленнаяТЗ);
КонецЕсли;
КонецПроцедуры
Важное предупреждение: Помните, что методы СохранитьЗначение и ВосстановитьЗначение не поддерживаются в тонком клиенте управляемого приложения. Использовать их в современном коде крайне не рекомендуется.
Что делать, если сохраненную таблицу необходимо физически перенести на другой компьютер, передать коллеге или загрузить в совершенно другую информационную базу? В этом случае хранилища настроек внутри одной базы данных нам не помогут. Оптимальным решением станет сериализация таблицы в 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С. Подведем итоги:
ХранилищеОбщихНастроек).