Организация хранения промежуточных данных

Организация хранения промежуточных данных в процедуре сверки.

Не могу сказать, как часто вопросы такого рода  возникают перед разработчиками, но мне он встретилась и вот как я на него ответил.

Была поставлена задача реализовать обработку для сверки данных, которые присылал внешний контрагент, с данными, которые хранятся во внутренней учетной системе. Информация от контрагента поступала в виде таблицы в формате Excel. При  этом часть активов однозначно идентифицировалась по уникальному коду, а для других могли быть разночтения. По этой причине процедура сверки состояла из нескольких этапов. На первом происходило чтение исходного файла и заполнялась таблица соответствия активов, на втором этапе пользователь выставлял соответствие между внешними и внутренними активами, для которых оно не было найдено и на заключительном этапе происходило построение отчета. Приступив к работе, я обнаружил, что мне надо организовать промежуточное хранение  данных из внешнего файла, которые я читаю на первом шаге. То есть, на первом шаге я получаю некую таблицу значений, которую затем использую для построения итогового отчета. Вот эту таблицу мне и надо было хранить. Для этой цели я создал реквизит формы  ДанныеСпецДепа c типом ТаблицаЗначений. Состав колонок данного реквизита изначально неизвестен, мы можем его получить только после того, как прочитаем внешний файл.

 

Теперь немного кода.  У формы есть команда Load (загрузить). Она выполняет следующие действия.

&НаКлиенте
Процедура Load(Команда)
mFile=new File(Объект.глФайлОбмена);
ОписаниеОповещения = Новый ОписаниеОповещения("ПередатьФайлНаСерверЗавершение", ЭтаФорма,mFile.Расширение);

НачатьПомещениеФайла(ОписаниеОповещения,,Объект.глФайлОбмена,Ложь,УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПередатьФайлНаСерверЗавершение(Знач Успешно, Адрес, Знач ВыбранноеИмяФайла, Знач ДополнительныеПараметры) экспорт
LoadНаСервере(Адрес,ДополнительныеПараметры);
КонецПроцедуры

 Файл помещается во временной хранилище на сервере, затем вызывается обработчик оповещения. Теперь приведем код процедуры LoadНаСервере.

&НаСервере
Процедура LoadНаСервере(Адрес,Расширение)
//....................................
//Шаг 1.
//....................................
lib=РеквизитФормыВЗначение("Объект")    ;
DepoList=РеквизитФормыВЗначение("СписокДепозитов");
vt=lib.Main(Адрес,Расширение,DepoList)            ;
//....................................
//Шаг 2.
//....................................
//редактируем колонки у реквизита ДанныеСпецдепа
приемник=РеквизитФормыВЗначение("ДанныеСпецДепа");
мУдалить=новый массив;
для каждого кол из приемник.Колонки цикл
если vt.Колонки.Найти(кол.Имя)=неопределено тогда
мУдалить.Добавить("ДанныеСпецДепа."+кол.Имя);
конецесли;
конеццикла;
мДобавить=новый массив;
для каждого кол из vt.Колонки цикл
если приемник.Колонки.Найти(кол.Имя)=неопределено тогда
НоваяКолонка = Новый РеквизитФормы(Кол.Имя,Кол.ТипЗначения, "ДанныеСпецДепа");
мДобавить.Добавить(НоваяКолонка);
конецесли;
конеццикла;
ИзменитьРеквизиты(мДобавить,мУдалить);
//....................................
//Шаг 3.
//....................................
ЗначениеВРеквизитФормы(vt,"ДанныеСпецДепа");
ЗначениеВРеквизитФормы(DepoList,"СписокДепозитов");

ЗначениеВРеквизитФормы(lib,"Объект")
КонецПроцедуры

Пояснение к приведенному фрагменту кода. На первом шаге вызывается процедура из модуля объекта, в которой происходит чтение исходного файла и формирование таблицы значений с данными. На втором шаге состав колонок реквизита формы ДанныеСпецДепа делается аналогичным составу колонок таблицы vt. На заключительном шаге мы копируем таблицу vt в реквизит формы ДанныеСпецДепа. Теперь эти данные можно использовать при построении итогового отчета. Задача промежуточного хранения решена. Разумеется, изложенное решение не является единственным. Поэтому статья и размещена в категории "Теория программирования".

1 Comment

  1. VmvLer

    изложение грамотное — это однозначно плюс.

    правда, я не понял чем не устроило хранилище или помещение тз в менеджер временных таблиц набор данных запрос(или набор данных объект) отчета?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *