Сегодня приведу пример того как можно сериализировать и сохранить табличные части в файле. Это может пригодиться в тех случаях когда вы пишите внешнюю обработку, забиваете табличные части и в какой-то момент понимаете, что нужно добавить некоторую функцию, но закрывать внешнюю обработку нельзя, т.к. обработка содержит данные, которые нам нужно сохранить.
Для начала определимся какие у нас есть варианты.
- Вывести список, сохранить его в xls или другой файл. Потом написать процедуру загрузки.
При этом мы сохраняем данные и продолжаем ими пользоваться после закрытия/открытия обработки
К минусам можно отнести трудоемкость подобной разработки, а к плюсам то, что не надо заранее продумывать вариант, при котором вы можете потерять данные. Сомнительный плюс. Не правда ли? Но это еще не все. Если у вас в табличной части поля ссылочного типа — вам придется восстанавливать их по наименованию или представлению. Что тоже малоувлекательное занятие. - Сериализовать табличные части и сохранить их в файл
Так же сохраняем данные и пользуемся ими после закрытия/открытия обработки
С плюсами и минусами тут все наоборот. При этом варианте надо сначала подумать, а потом писать, но зато здесь присутствует красота и изящность кода, а так же более быстрая разработка по сравнению с первым вариантом. Ну конечно поля ссылочного типа встанут на свои места, т.к. для сериализации будет использована функция «ЗначениеВСтрокуВнутр»
Я определился. Мне 2 вариант больше подходит. Если и вам он подошел — тогда начнем
Надеюсь, что мои читатели уже умеют делать команды и кидать кнопки на формы, поэтому этот шаг я пропущу и перейду сразу к коду.
Кнопка «Сохранить табличные части» имеет простой код:
1 |
ВыбратьФайлИСохранить("cat", "Категории"); |
Тут «cat» — это имя файла, а «Категории» — имя табличной части, которую нам надо сохранить. Если нам нужно сохранить 2 или более табличных частей — просто добавляем ВыбратьФайлИСохранить(«tov», «Товары»); И так для всех табличных частей.
Напрашивается код процедуры ВыбратьФайлИСохранить и некоторых других, которые нам будут помогать в этом деле.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
&НаКлиенте Процедура ВыбратьФайлИСохранить(ИмяФайла, ИмяТЧ) Режим = РежимДиалогаВыбораФайла.Сохранение; ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытия.ПолноеИмяФайла = ИмяФайла; Фильтр = НСтр("ru = 'Текст'") + "(*.txt)|*.txt"; ДиалогОткрытия.Фильтр = Фильтр; ДиалогОткрытия.МножественныйВыбор = Ложь; ДиалогОткрытия.Заголовок = "Выберете файл для сохранения"; ОписаниеОповещения = Новый ОписаниеОповещения("ПослеСохраненияФайла",ЭтаФорма,ИмяТЧ); ДиалогОткрытия.Показать(ОписаниеОповещения); КонецПроцедуры &НаКлиенте Процедура ПослеСохраненияФайла(ВыбранныеФайлы, Параметры) Экспорт Если Не ЗначениеЗаполнено(ВыбранныеФайлы) Тогда Возврат; КонецЕсли; Текст = Новый ТекстовыйДокумент; Текст.УстановитьТекст(ПолучитьТЧКакСтроку(Параметры)); Текст.НачатьЗапись(,ВыбранныеФайлы[0]); КонецПроцедуры &НаСервере Функция ПолучитьТЧКакСтроку(ИмяТЧ) Возврат ЗначениеВСтрокуВнутр(Объект[ИмяТЧ].Выгрузить()); КонецФункции |
Теперь мы удачно сохранили файлы и нам их нужно загрузить обратно.
Вешаем на кнопку «Загрузить табличные части» такой код:
1 2 |
ЗагрузитьТекстовыйФайл("cat", "Категории"); ЗагрузитьТекстовыйФайл("tov", "Товары"); |
И так для всех тч, которые мы хотим загрузить.
Код, который нам в этом поможет:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
&НаКлиенте Процедура ЗагрузитьТекстовыйФайл(ИмяФайла, ИмяТЧ) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытия.ПолноеИмяФайла = ИмяФайла + ".txt"; Фильтр = НСтр("ru = 'Текст'") + "(*.txt)|*.txt"; ДиалогОткрытия.Фильтр = Фильтр; ДиалогОткрытия.МножественныйВыбор = Ложь; ДиалогОткрытия.Заголовок = "Выберете файл для загрузки"; ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла", ЭтаФорма, ИмяТЧ); ДиалогОткрытия.Показать(ОписаниеОповещения); КонецПроцедуры &НаКлиенте Процедура ПослеЗагрузкиФайла(ВыбранныеФайлы, Параметры) Экспорт Если Не ЗначениеЗаполнено(ВыбранныеФайлы) Тогда Возврат; КонецЕсли; ТекстДок = Новый ТекстовыйДокумент; ПараметрыЧтения = Новый Структура("ТекстДок, ИмяТЧ", ТекстДок, Параметры); ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЧтенияФайла", ЭтаФорма, ПараметрыЧтения); ТекстДок.НачатьЧтение(ОписаниеОповещения, ВыбранныеФайлы[0]); КонецПроцедуры &НаСервере Процедура ЗагрузитьВТЧНаСервере(РеквизитСтрока, ИмяТЧ) Объект[ИмяТЧ].Загрузить(ЗначениеИзСтрокиВнутр(РеквизитСтрока)); КонецПроцедуры &НаКлиенте Процедура ПослеЧтенияФайла(Параметры) Экспорт РеквизитСтрока = Параметры.ТекстДок.ПолучитьТекст(); ЗагрузитьВТЧНаСервере(РеквизитСтрока, Параметры.ИмяТЧ); КонецПроцедуры |
Вот так просто в 70 строк кода мы решили проблему, которая может сэкономить нам от нескольких минут до нескольких часов.
Я, например, пользуюсь этим когда делаю парсинг сайтов. Чтобы не было необходимости заливать по новой категории, потом товары, потом цены.
Сохранил тч в файл, добавил функций в обработку, загрузил. И опять продолжаю с того места на котором остановился.