В начало

Перенос из Икселя в «Дома»

 

            Необходимо перенести данные из файла формата XLSX в справочник «Дома» при условии, если в справочнике «Дома» есть элемент с заданным реквизитом «Код». У справочника «Дома» есть табличная часть «КодыВнешнихСистем», в которую, по причудливому стечению обстоятельств нужно также записывать реквизит «КодВнешнейСистемы».

Рис. Структура справочника «Дома»

 

            Далее приведена структура файла Иксель, данные из которого идут на заполнение справочника «Дома». Первая колонка содержит наименование реквизитов для заполнения.

Рис. Фрагмент Иксель-файла с исходными данными

 

 

            Создаем внешнюю обработку.

Рис. Структура внешней обработки «ПереносИзИкселяВДома»

 

            Добавляем форму обработки. На форме размещаем команду и табличную часть «ТабДок», для визуализации.

Рис. Форма внешней обработки

 

            Далее привожу содержимое модуля формы обработки.

 

Листинг. Модуль формы обработки

&НаСервере

Процедура ОбработатьВыборФайла(ПомещенныеФайлы, ДополнительныеПараметры)

            Если ПомещенныеФайлы = Неопределено Тогда

                        Возврат;

            КонецЕсли;

           

            Для каждого ПереданныйФайл Из ПомещенныеФайлы Цикл                 

                        РасширениеФайла = "";

                        МассивСтрок = СтрРазделить(ПереданныйФайл.Имя, ".", Ложь);

                        Если МассивСтрок.Количество() > 1 Тогда

                                   РасширениеФайла = МассивСтрок[МассивСтрок.Количество() - 1];

                        КонецЕсли;

                       

                        ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПереданныйФайл.Хранение);       

                        ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);

                        ДвоичныеДанные.Записать(ИмяВременногоФайла);                                    

                       

                        ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла);  

            КонецЦикла;

КонецПроцедуры

 

 

&НаСервере

Процедура ОбработатьВыборФайлаНаСервере(ИмяВременногоФайла) Экспорт           

            ТабличныйДокумент = Новый ТабличныйДокумент;

            ТабличныйДокумент.Прочитать(ИмяВременногоФайла);

           

            Построитель = Новый ПостроительЗапроса;

            Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

            Построитель.Выполнить();

           

            ТЗ = Построитель.Результат.Выгрузить();

           

            //Добавляем колонки в "ТабДок"

            Для НомерКолонки = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл

                        КолонкаВШапке = СокрЛП(ТабличныйДокумент.Область(1, НомерКолонки).Текст);

                        КолонкаВШапкеБезПробелов = СтрЗаменить(КолонкаВШапке, " ", "");

                       

                        Если Элементы.Найти(КолонкаВШапкеБезПробелов) = Неопределено Тогда

                                  

                                   нРеквизиты = Новый Массив;

                                   нРеквизиты.Добавить(Новый РеквизитФормы(КолонкаВШапкеБезПробелов, Новый ОписаниеТипов("Строка"), "Объект.ТабДок", КолонкаВШапке, Истина));

                                   ИзменитьРеквизиты(нРеквизиты);

                                  

                                   нЭлемент = Элементы.Добавить(КолонкаВШапкеБезПробелов, Тип("ПолеФормы"), Элементы.ТабДок);

                                   нЭлемент.Вид = ВидПоляФормы.ПолеВвода;  

                                  

                                   нЭлемент.ПутьКДанным = "Объект.ТабДок." + КолонкаВШапкеБезПробелов;

                        КонецЕсли

            КонецЦикла;

           

            //Загружаем "ТЗ" в "ТабДок"

            Объект.ТабДок.Загрузить(ТЗ);

           

            //Обрабатываем данные

            Для НомерСтроки = 2 По ТабличныйДокумент.ВысотаТаблицы Цикл

                        //Считываем колонки в текущей строке

                        ТекКод = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, 1).Текст);

                        ТекНаименование = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, 2).Текст);

                        ТекКодФИАС = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, 3).Текст);

                        ТекКодВнешнейСистемы = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, 4).Текст);

                       

                        //Ищем элемент справочника по реквизиту "Код"

                        ТекСсылка = Справочники.Дома.НайтиПоКоду(ТекКод);

                        Если НЕ ТекСсылка.Пустая() Тогда

                                   Об = ТекСсылка.ПолучитьОбъект();

                                   Об.Код = ТекКод;

                                   Об.Наименование = ТекНаименование;

                                   Об.КодФИАС = ТекКодФИАС;

                                   Об.КодВнешнейСистемы = ТекКодВнешнейСистемы;

                                  

                                    //Обходим табличную часть документа

                                   Если Об.КодыВнешнихСистем.Количество() = 0 Тогда

                                               Строка = Об.КодыВнешнихСистем.Добавить();

                                               Строка.РЦ = "АИС";

                                               Строка.КодВнешнейСистемы = ТекКодВнешнейСистемы;

                                              

                                   ИначеЕсли Об.КодыВнешнихСистем.Количество() > 0 Тогда

                                               //Проверяем, есть ли такой КодВнешнейСистемы

                                               Для Каждого Эл Из Об.КодыВнешнихСистем Цикл

                                                           Если Эл.КодВнешнейСистемы <> ТекКодВнешнейСистемы Тогда

                                                                       Строка = Об.КодыВнешнихСистем.Добавить();

                                                                       Строка.РЦ = "АИС";

                                                                       Строка.КодВнешнейСистемы = ТекКодВнешнейСистемы;                                                               

                                                           КонецЕсли;    

                                               КонецЦикла;

                                              

                    КонецЕсли;

                                   Об.Записать();

                        КонецЕсли;

            КонецЦикла;   

           

КонецПроцедуры

 

 

&НаКлиенте

Процедура ЗагрузитьИксель(Команда)

            ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

            ДиалогОткрытияФайла.МножественныйВыбор = Ложь;

            ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Лист Microsoft Excel'; en = 'Лист Microsoft Excel'") + "(*.xlsx)|*.xlsx;*.xls";

           

            ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтаФорма);   

            НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);

КонецПроцедуры

 

            Запускаем пользовательский режим и тестируем обработку.

Рис. Форма обработки в пользовательском режиме

 

            Проверяем, что заполнилось в справочнике «Дома». Изначально в нем был один элемент, которому был присвоен код «000000000013579», т.е. первой строчки Иксель-файла.

Рис. Форма списка справочника «Дома»

 

            Далее проверяем, как заполнилась табличная часть элемента справочника «Дома».

Рис. Форма элемента справочника «Дома»

 

            Все вроде заполняется. Конечно, тут есть некий перебор с заполнение одноименных реквизитов, но мало ли что творится в объектах метаданных. Короче, на всякий случай проверили, как заполняются реквизиты объекта и реквизиты табличной части.