1. Выгрузить все необходимые поля из системы источника (ключевые поля) в файл Excel.
Предварительно должна быть загружена вся необходимая НСИ (или хотя бы основная её часть).
2. На стороне системы приемника 1С, прочитываем файл Excel и его сохраняем в массиве колонок.
ЛистЭксель = ДокументExcel.Sheets(НомерЛиста);
Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки, НомерПервойКолонки), ЛистЭксель.Cells(НомерПоследнейСтроки, НомерПоследнейКолонки));
Данные = Область.Value.Выгрузить();
Данная конструкция за несколько секунд загрузит файл с миллионом строк.
3. На форму обработки загрузки добавляем Таблицу значений с количеством колонок, как в файле Excel.
4. Выполняем заполнение таблицы значений на форме, через временную таблицу значений (чтобы можно увидеть результат считывания из файла Excel заранее и возможно что-то подправить).
Каждый элемент массива считанного файла Excel, содержат данные колонки по номеру.
//временная таблица значений
ТаблицаЗВрем = Новый ТаблицаЗначений;
ТаблицаЗВрем.Колонки.Добавить("Колонка1");
ТаблицаЗВрем.Колонки.Добавить("Колонка2");
ТаблицаЗВрем.Колонки.Добавить("Колонка3");
//создаем количество строк соответствующее количеству строк Excel
Для Н=1 По Данные[0].Количество() Цикл
ТаблицаЗВрем.Добавить();
КонецЦикла;
//загружаем колонки из прочитанного файла Excel в таблицу значений
ТаблицаЗВрем.ЗагрузитьКолонку(Данные[0], "Колонка1");
ТаблицаЗВрем.ЗагрузитьКолонку(Данные[1], "Колонка2");
ТаблицаЗВрем.ЗагрузитьКолонку(Данные[2], "Колонка3");
//выполняем необходимые преобразования данных из Excel
Для Н=0 По ТаблицаЗВрем.Количество()-1 Цикл
ТаблицаЗВрем[Н].Колонка1= СтрЗаменить(ТаблицаЗВрем[Н].Колонка1, Символы.НПП, "");
ТаблицаЗВрем[Н].Колонка2= СтрЗаменить(ТаблицаЗВрем[Н].Колонка2, Символы.НПП, "");
КонецЦикла;
//загружем таблицу на форму
ТаблицаЗНаФорме.Загрузить(ТаблицаЗВрем);
5. После того, как файл Excel загружен и проверен, его можно загрузить в регистр сведений используя следующей код:
Запрос = Новый Запрос("ВЫБРАТЬ
| ТЧВрем.Колонка1 КАК Колонка1,
| ТЧВрем.Колонка2 КАК Колонка2,
| ТЧВрем.Колонка3 КАК Колонка3
|ПОМЕСТИТЬ ТЧВрем
|ИЗ
| &ТЧВрем КАК ТЧВрем
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЧВрем.Колонка1 КАК Колонка1,
| ПервичныйДокумент.Ссылка КАК Документ
|ИЗ
| ТЧВрем КАК ТЧВрем
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПервичныйДокумент КАК ПервичныйДокумент
| ПО ТЧВрем.Колонка1 = ПервичныйДокумент.Номер
| И ТЧВрем.Колонка2 = ПервичныйДокумент.Дата
|ГДЕ
| ТЧВрем.Колонка1 <> """"");
Запрос.УстановитьПараметр("ТЧВрем", ТЧВрем.Выгрузить());
ТЧРезультат = Запрос.Выполнить().Выгрузить();
НужныйРегистр = РегистрыСведений.НужныйРегистр.СоздатьНаборЗаписей();
НужныйРегистр.Загрузить(ТЧРезультат );
НужныйРегистр.Записать(ИСТИНА);
Данный код также выполняется достаточно быстро.
Сама загрузка происходит около часа, что является достаточно быстрым результатом.
Для примера рабочее место загрузки:
В рабочем месте выбираем, от и до какой строки загружаем.
По кнопке - Заполнить, выполняется пункт 4, предварительно выбрав файл.
По кнопке - Сформировать, выполняется пункт 5.
Данное решение имеет ряд ограничений:
1) Yаличие 64битной платформы и достаточного количества оперативной памяти (от 32 Гб).
2) На стороне источника - система должна уметь выгрузить в формат Excel, а на стороне приемника 1С - должна быть установлена Excel.
3) Должна быть загружена вся НСИ (или хотя бы основная часть, некоторую часть можно сразу загружать в данной обработке - но тогда будет потрачено дополнительное время загрузки).
4) Поиск ссылочных объектов по GUID (при загрузке данных в регистр сведений лучше определять ссылочные данные по полям поиска, если это не возможно сделать, то перед загрузкой в регистр сведений. Нужно определить ссылочные объекты по GUID - но тогда будет потрачено дополнительное время загрузки).
Применять можно на любой конфигурации.