Не могу сказать, как часто вопросы такого рода возникают перед разработчиками, но мне он встретилась и вот как я на него ответил.
Была поставлена задача реализовать обработку для сверки данных, которые присылал внешний контрагент, с данными, которые хранятся во внутренней учетной системе. Информация от контрагента поступала в виде таблицы в формате 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 в реквизит формы ДанныеСпецДепа. Теперь эти данные можно использовать при построении итогового отчета. Задача промежуточного хранения решена. Разумеется, изложенное решение не является единственным. Поэтому статья и размещена в категории "Теория программирования".