При интеграции 1С с Microsoft Excel часто требуется программно объединить несколько файлов или перенести конкретный лист из одной рабочей книги в другую. Записанный в Excel макрос на языке VBA использует синтаксис с именованными аргументами, например, After:=Workbooks("Прием.xls").Sheets(3). Однако при попытке перенести эту строку напрямую в модуль 1С платформа выдает синтаксическую ошибку. Разберем, как устроен вызов методов COM-объектов в 1С и как правильно перенести лист в нужное место книги.
В Visual Basic for Applications (VBA) параметры методов могут передаваться по имени через конструкцию ИмяПараметра:=Значение, причем вызов процедуры допускается без круглых скобок. В языке 1С работа с COM-объектами подчиняется стандартным правилам платформы: параметры передаются строго позиционно в круглых скобках через запятую.
Проанализируем сигнатуру метода Copy объекта листа Excel (Worksheet.Copy):
Метод принимает два необязательных параметра:
Before — лист книги, перед которым будет вставлена копия.After — лист книги, после которого будет вставлена копия.Если мы передаем только один аргумент в скобках, например Лист.Copy(Книга.Worksheets(1)), 1С интерпретирует его как первый позиционный параметр Before, из-за чего лист всегда помещается в начало книги перед указанным листом. Чтобы передать параметр After, первый аргумент необходимо просто пропустить, поставив запятую:
// Вставка листа ЛистИсточник ПОСЛЕ третьего листа книги КнигаПрием:
КнигаИсточник.Sheets("ЛистИсточник").Copy(, КнигаПрием.Sheets(3));
Если вызвать метод вообще без параметров ЛистИсточник.Copy(), Excel автоматически создаст новую отдельную книгу и скопирует лист туда.
Рассмотрим практическую задачу: нам нужно перенести лист из файла-источника и гарантированно разместить его в самом конце книги-приемника, независимо от исходного количества листов в ней. Для этого в качестве параметра After передадим ссылку на последний лист через свойство Count коллекции Sheets.
Разберем полный рабочий пример кода с открытием файлов, копированием листа и сохранением результата:
// Создаем экземпляр приложения Excel
ПриложениеExcel = Новый COMОбъект("Excel.Application");
ПриложениеExcel.Visible = Ложь;
ПриложениеExcel.DisplayAlerts = Ложь;
Попытка
ПутьИсточник = "C:\Temp\Источник.xlsx";
ПутьПриемник = "C:\Temp\Приемник.xlsx";
// Открываем рабочие книги
КнигаИсточник = ПриложениеExcel.Workbooks.Open(ПутьИсточник);
КнигаПриемник = ПриложениеExcel.Workbooks.Open(ПутьПриемник);
// Получаем исходный лист
ЛистИсточник = КнигаИсточник.Sheets("Лист1");
// Копируем лист в конец целевой книги
КоличествоЛистов = КнигаПриемник.Sheets.Count;
ЛистИсточник.Copy(, КнигаПриемник.Sheets(КоличествоЛистов));
// Получаем созданный лист (он стал последним) и при необходимости переименовываем
НовыйЛист = КнигаПриемник.Sheets(КнигаПриемник.Sheets.Count);
НовыйЛист.Name = "ИмпортированныеДанные";
// Сохраняем изменения и закрываем файлы
КнигаПриемник.Save();
КнигаПриемник.Close(Истина);
КнигаИсточник.Close(Ложь);
// Завершаем работу процесса Excel
ПриложениеExcel.Quit();
ПриложениеExcel = Неопределено;
Исключение
// В случае ошибок обязательно освобождаем процесс в памяти
Если ПриложениеExcel <> Неопределено Тогда
ПриложениеExcel.Quit();
ПриложениеExcel = Неопределено;
КонецЕсли;
ВызватьИсключение "Ошибка при обработке файлов Excel: " + ОписаниеОшибки();
КонецПопытки;
Выясним распространенные технические нюансы, с которыми сталкиваются разработчики при автоматизации работы с электронными таблицами:
Close() и обнуления переменной недостаточно. Процесс EXCEL.EXE продолжит висеть в памяти Windows. Всегда вызывайте метод Quit() и дублируйте его вызов в блоке Исключение.\ / ? * [ ] :. Нарушение этих правил приведет к аварийному завершению операции.Excel.Application требует совпадения разрядности 1С и установленного пакета Microsoft Office. Если 1С запущена в 64-битном режиме, а Office установлен в 32-битной версии, инициализация COM-объекта завершится ошибкой.ТабличныйДокумент с методами Прочитать() и Записать().