Часто возникает потребность прочитать данные из таблицы MS
Excel или из источника 1С записать (выгрузить) данные в книгу MS Excel. Можно ли средствами 1С решить эти задачи? Ответ прост - можно и это не особо затруднительно.
Чтение данных по большому счету вообще не представляет больших проблем. При выгрузке данных в MS Excel возможны некоторые трудности, что может быть связано с особенностями VBA.
Для выгрузки данных из 1С в MS Excel можно воспользоваться заранее созданным шаблоном или, если состав данных не известен до самой выгрузки, создать файл MS Excel на ходу.
Здесь будет приведен пример чтения данных из файла MS Excel и выгрузки данных с созданием файла.
Допустим, стоит задача прочитать данные из файла MS Excel, каким-то образом их обработать и выгрузить полученный результат в другой файл MS Excel.
Открываем конфигуратор и создаем новую внешнюю обработку.
Добавляем форму обработку и на нее помещаем две кнопки: Загрузить данные и Выгрузить данные. Поскольку цель данного примера показать приемы работы с загрузкой и выгрузкой данных в файл MS Excel, то на форму промежуточные данные выводить не будем.
Они будут помещены в таблицу значений и затем выгружены из нее.

Теперь поместим в обработчики кнопкок "Загрузить данные" и "Выгрузить данные"функционал чтения данных из файла MS Excel.
В обработчиках кнопок получается следующий код:
Процедура ЗагрузитьДанныеНажатие(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите имя файла для чтения";
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Файл MS Excel (.xlsx)| *.xlsx";
Если Не Диалог.Выбрать() Тогда
Сообщить("Файл для обработки не выбран!");
Иначе
ФайлДанных = Диалог.ПолноеИмяФайла;
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ФайлДанных);
Состояние("Обработка файла Microsoft Excel...");
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
Excel.Sheets(1).Select();
Исключение
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл " + Строка(ФайлДанных) + " не соответствует необходимому формату! Первый лист не найден!");
Возврат;
КонецПопытки;
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" Тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
КонецЕсли;
ТЗ.Очистить();
Попытка
Для Сч = 2 По ФайлСтрок Цикл
Состояние("Обрабатывается строка " + Строка(Сч) + " из " + Строка(ФайлСтрок));
Если НЕ СокрЛП(Excel.Cells(Сч, 1).Value) = "" Тогда
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.НомерПоПорядку = СокрЛП(Excel.Cells(Сч, 1).Value);
НоваяСтрока.ТестовыйТекст = СокрЛП(Excel.Cells(Сч, 2).Text);
НоваяСтрока.ТестовоеЧисло1 = СокрЛП(Excel.Cells(Сч, 3).Value);
НоваяСтрока.ТестовоеЧисло2 = СокрЛП(Excel.Cells(Сч, 4).Value);
НоваяСтрока.ТестовоеЧисло3 = СокрЛП(Excel.Cells(Сч, 5).Value);
НоваяСтрока.ТестовоеЧисло4 = СокрЛП(Excel.Cells(Сч, 6).Value);
НоваяСтрока.ТестовоеЧисло5 = СокрЛП(Excel.Cells(Сч, 7).Value);
НоваяСтрока.ТестовоеЧисло6 = СокрЛП(Excel.Cells(Сч, 8).Value);
НоваяСтрока.ТестовоеЧисло7 = СокрЛП(Excel.Cells(Сч, 9).Value);
НоваяСтрока.ТестоваяДата = СокрЛП(Excel.Cells(Сч, 10).Value);
КонецЕсли;
КонецЦикла;
Исключение
Excel.ActiveWorkbook.Close();
Excel.Quit();
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
Сообщить("Файл Excel прочитан!");
Excel.Quit();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Процедура ВыгрузитьДанныеНажатие()
Для Каждого ТекСтрока Из ТЗ Цикл
ТекСтрока.ТестовоеЧисло5 = ТекСтрока.ТестовоеЧисло5 - Число(ТекСтрока.НомерПоПорядку);
КонецЦикла;
Если ТЗ.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите имя файла для сохранения";
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Файл MS Excel *.xlsx)| *.xlsx";
Если Диалог.Выбрать() Тогда
ФайлДанных = Диалог.ПолноеИмяФайла;
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
Книга = Excel.WorkBooks.Add();
Лист = Книга.WorkSheets(1);
Лист.Name = "Выгрузка данных";
Excel.ActiveWindow.View = 2;
Excel.ActiveWindow.Zoom = 100;
Лист.PageSetup.Orientation = 2;
Лист.Columns(1).ColumnWidth = 10;
Лист.Columns(2).ColumnWidth = 25;
Лист.Columns(10).ColumnWidth = 13;
Лист.Columns(11).ColumnWidth = 13;
Лист.Cells(1, 1).Value = "Номер по порядку";
Лист.Cells(1, 2).Value = "Выгружаемый текст";
Лист.Cells(1, 3).Value = "Выгружаемые числа";
Лист.Cells(1, 10).Value = "Выгружаемая дата";
Лист.Cells(1, 11).Value = "Программная формула";
Лист.Cells(2, 3).Value = "Число 1";
Лист.Cells(2, 4).Value = "Число 2";
Лист.Cells(2, 5).Value = "Число 3";
Лист.Cells(2, 6).Value = "Число 4";
Лист.Cells(2, 7).Value = "Число 5";
Лист.Cells(2, 8).Value = "Число 6";
Лист.Cells(2, 9).Value = "Число 7";
Лист.Range("A1:A2").MergeCells = Истина;
Лист.Range("A1:A2").WrapText = Истина;
Лист.Range("B1:B2").MergeCells = Истина;
Лист.Range("B1:B2").WrapText = Истина;
Лист.Range("J1:J2").MergeCells = Истина;
Лист.Range("J1:J2").WrapText = Истина;
Лист.Range("K1:K2").MergeCells = Истина;
Лист.Range("K1:K2").WrapText = Истина;
Лист.Range("C1:I1").MergeCells = Истина;
Лист.Range("C1:I1").WrapText = Истина;
Лист.Range("A1:K2").Borders.Linestyle = 1;
Лист.Range("A1:K2").HorizontalAlignment = 3;
Лист.Range("A1:K2").VerticalAlignment = 2;
Лист.Range("A1:K2").Font.Bold = 1;
СчетчикСтрок = 3;
Для Каждого ТекСтрока Из ТЗ Цикл
Лист.Cells(СчетчикСтрок, 1).Value = ТекСтрока.НомерПоПорядку;
Лист.Cells(СчетчикСтрок, 2).Value = ТекСтрока.ТестовыйТекст;
Лист.Cells(СчетчикСтрок, 3).Value = ТекСтрока.ТестовоеЧисло1;
Лист.Cells(СчетчикСтрок, 4).Value = ТекСтрока.ТестовоеЧисло2;
Лист.Cells(СчетчикСтрок, 5).Value = ТекСтрока.ТестовоеЧисло3;
Лист.Cells(СчетчикСтрок, 6).Value = ТекСтрока.ТестовоеЧисло4;
Лист.Cells(СчетчикСтрок, 7).Value = ТекСтрока.ТестовоеЧисло5;
Лист.Cells(СчетчикСтрок, 8).Value = ТекСтрока.ТестовоеЧисло6;
Лист.Cells(СчетчикСтрок, 9).Value = ТекСтрока.ТестовоеЧисло7;
Лист.Cells(СчетчикСтрок, 10).Value = ТекСтрока.ТестоваяДата;
Лист.Cells(СчетчикСтрок, 11).Formula = "=F" + Строка(СчетчикСтрок) + "+G" + Строка(СчетчикСтрок);
СчетчикСтрок = СчетчикСтрок + 1;
КонецЦикла;
СчетчикСтрок = СчетчикСтрок - 1;
Лист.Range("A3:K" + Строка(СчетчикСтрок)).Borders.Linestyle = 1;
Лист.Range("A3:K" + Строка(СчетчикСтрок)).VerticalAlignment = 2;
Для НомерСтроки = 3 По СчетчикСтрок Цикл
Для Столбец = 4 По 9 Цикл
Лист.Cells(НомерСтроки, Столбец).NumberFormat = "0.00";
КонецЦикла;
Лист.Cells(НомерСтроки, 11).NumberFormat = "0.00";
КонецЦикла;
Исключение
Excel.Quit();
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
Книга.SaveAs(ФайлДанных);
Сообщить("Файл " + ФайлДанных + " успешно сохранен");
Исключение
Сообщить(ОписаниеОшибки() + " Файл не сохранен!");
Возврат;
КонецПопытки;
Попытка
Excel.Quit();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
В результате получилась обработка, в которой сначала из файл
считываются данные, а затем - по нажатию кнопки выгрузки данных как-то
обрабатываются и выгружаются в файл. Либо в пустой, либо указанный
пользователем. При этом существующий файл пересоздается. При выгрузке показаны
некоторые примеры форматирования файла.
На этом пока все.
Пример обработки и файла для чтения данных можно скачать
тут
|