При переходе с платформы 1С 7.7 на 1С 8.3 программисты часто сталкиваются с тем, что привычные конструкции перестают работать. Одной из самых частых проблем является попытка создания объекта Excel старым способом. Разберем, почему возникает эта ошибка, как ее правильно исправить и какие современные методы работы с табличными данными существуют в актуальных версиях платформы.
Выясним причину возникновения ошибки Процедура или функция с указанным именем не определена (СоздатьОбъект). В платформе 1С:Предприятие 8.x (включая версии 8.2 и 8.3) метод СоздатьОбъект был полностью заменен на оператор Новый. Попытка использовать старый синтаксис в модуле управляемого приложения или на сервере приведет к тому, что компилятор просто не найдет такую функцию в глобальном контексте.
Рассмотрим правильный синтаксис для создания связи с Excel через COM-технологию:
&НаСервере
Процедура ВыгрузитьВЭксельНаСервере()
Попытка
// Правильный синтаксис для 1С 8.3
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки() + ". Программа Excel не установлена на сервере!");
Возврат;
КонецПопытки;
// Дальнейшая работа с объектами Excel
Книга = Эксель.WorkBooks.Add();
Лист = Книга.Sheets.Add();
// Пример заполнения данными
Счетчик = 0;
Для каждого Стр Из Объект.Остаток Цикл
Счетчик = Счетчик + 1;
Лист.Cells(Счетчик, 1).Value = Стр.Номенклатура;
КонецЦикла;
Попытка
Книга.SaveAs("C:\Temp\Остатки.xlsx");
Исключение
Сообщить("Ошибка при сохранении: " + ОписаниеОшибки());
КонецПопытки;
// Обязательно закрываем приложение, чтобы Excel не висел в процессах
Эксель.Quit();
КонецПроцедуры
Проанализируем ситуацию, когда код выполняется в процедуре с директивой &НаСервере. Хотя синтаксическое исправление решит проблему запуска, возникнут серьезные инфраструктурные риски. Использование Excel.Application через COM на сервере официально не поддерживается Microsoft по следующим причинам:
Excel.exe. Если в коде произойдет ошибка до вызова метода Quit(), процесс останется в памяти. Со временем это может привести к полной неработоспособности сервера из-за нехватки ОЗУ.USR1CV8), часто не имеет прав на запуск DCOM-компонентов или не имеет созданного профиля рабочего стола (Desktop), без которого Excel не может инициализироваться.Посмотрим на более надежный и кроссплатформенный способ решения задачи. В 1С 8.3 есть встроенный объект ТабличныйДокумент, который позволяет формировать файлы Excel напрямую, не требуя установки самого Microsoft Office. Это работает быстрее, стабильнее и поддерживается даже на Linux-серверах.
Разберем алгоритм по шагам:
&НаСервере
Процедура СформироватьФайлНативно()
// Создаем пустой табличный документ
ТабДок = Новый ТабличныйДокумент;
// Заполняем его данными аналогично печатной форме
Для каждого Стр Из Объект.Остаток Цикл
НоваяСтрока = ТабДок.КоличествоСтрок() + 1;
ТабДок.Область(НоваяСтрока, 1).Текст = Стр.Номенклатура;
КонецЦикла;
// Сохраняем сразу в формате XLSX
ПутьКФайлу = "C:\Temp\Выгрузка.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
Этот метод считается «золотым стандартом» в современной разработке на 1С, так как он полностью исключает зависимость от внешних программных компонентов.
Проанализируем вопрос доступности технологий на разных операционных системах. Технология COM является проприетарной разработкой Microsoft и доступна исключительно в среде Windows. Если ваша база данных работает на сервере под управлением Linux, код с Новый COMОбъект("Excel.Application") выдаст ошибку во время выполнения.
Для Linux-серверов рекомендуются следующие подходы:
ТабличныйДокумент.Записать().Если вы все же решили использовать COM на Windows-сервере, необходимо убедиться, что у службы сервера 1С есть необходимые права. Выясним, что нужно настроить:
Во-первых, создайте папку Desktop в системных профилях, так как Excel ищет их при запуске:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopВо-вторых, через утилиту dcomcnfg (Настройка служб компонентов) нужно предоставить пользователю USR1CV8 права на «Локальный запуск» и «Локальную активацию» для компонента Microsoft Excel Application.
Подводя итог, можно сказать следующее: ошибка автора сообщения 0 вызвана использованием устаревшего синтаксиса СоздатьОбъект. Исправление на Новый COMОбъект решит проблему лишь поверхностно. Для профессиональной разработки в среде 1С 8.3 крайне рекомендуется отказаться от COM-объектов в пользу ТабличногоДокумента. Это обеспечит высокую производительность, стабильность серверных процессов и кроссплатформенность вашего решения.