При разработке механизмов интеграции часто возникает ситуация, когда код, идеально работающий на локальной файловой базе, внезапно «падает» с ошибкой «No such interface supported» при переносе на сервер. Эта проблема особенно характерна для операций загрузки данных из Microsoft Excel через COM-соединение. Проанализируем причины этого поведения и разберем пошагово все возможные способы решения задачи.
Ошибка инициализации интерфейса чаще всего связана с тем, что серверная служба 1С работает в изолированном контексте, отличном от пользовательского сеанса. Основные факторы включают в себя разную разрядность приложений (например, 64-битный сервер 1С и 32-битный Microsoft Office), отсутствие необходимых прав доступа у системной учетной записи USR1CV8, а также отсутствие необходимых папок профиля рабочего стола для COM-объекта Excel. Разберем, как мы можем обойти эти ограничения или настроить систему корректно.
Самый простой и очевидный способ — это запуск процесса загрузки непосредственно на компьютере пользователя. В этом случае 1С будет использовать ресурсы локальной машины и установленный на ней Excel в интерактивном режиме. Рассмотрим, как правильно структурировать такой вызов.
Для этого нам необходимо разделить логику: выбор файла и создание COM-объекта оставить на клиенте, а обработку полученных данных (поиск номенклатуры, создание документов) передать на сервер.
&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
// Создаем объект Excel на клиенте
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось запустить Excel. Возможно, он не установлен.");
Возврат;
КонецПопытки;
// Открываем книгу
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);
// Получаем данные в массив или таблицу значений
// И передаем эти данные на сервер для обработки
ДанныеДляЗагрузки = ПолучитьДанныеИзЛиста(Лист);
ЗагрузитьДанныеНаСервере(ДанныеДляЗагрузки);
Excel.Quit();
КонецПроцедуры
Этот метод хорош тем, что он не требует сложной настройки сервера. Однако помните: если файлов много или они огромные, передача больших объемов данных между клиентом и сервером может замедлить работу.
Проанализируем более профессиональный подход, который рекомендует фирма «1С». Вместо того чтобы пытаться заставить сервер «увидеть» файл на диске пользователя, мы передаем сам файл в специальное временное хранилище. Это универсальный способ, работающий даже в веб-клиенте.
Алгоритм действий следующий:
&НаКлиенте
Процедура НачатьЗагрузку(Команда)
// Помещаем файл во временное хранилище
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПутьКФайлу);
ПередаваемыеФайлы = Новый Массив;
ПередаваемыеФайлы.Добавить(ОписаниеФайла);
НачатьПомещениеФайлов(Новый ОписаниеОповещения("ЗавершитьЗагрузку", ЭтотОбъект), ПередаваемыеФайлы, , Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьЗагрузку(Результат, АдресХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ЗагрузитьНаСервере(АдресХранилища);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Теперь на сервере есть локальная копия файла, с которой можно работать
// Но помните про настройку DCOM, если используете COM-объект на сервере!
КонецПроцедуры
Если вы твердо решили использовать Новый COMОбъект("Excel.Application") именно в серверном коде (&НаСервере), вам придется выполнить системную настройку ОС Windows на сервере. Без этого ошибка интерфейса не исчезнет.
Шаг 1. Создание папок профиля. Excel требует наличия папки Desktop для инициализации, даже если он работает в фоновом режиме. Выясним, где их нужно создать:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopВажно: папку Desktop нужно создать вручную, если она отсутствует.
Шаг 2. Настройка компонента через dcomcnfg.
Win + R, введите dcomcnfg и нажмите Enter.USR1CV8).Рассмотрим самый современный и безопасный метод, который не требует установленного Excel на сервере и не зависит от COM-технологий. Начиная с версии 8.3, платформа 1С умеет самостоятельно читать файлы Excel.
Этот метод значительно быстрее и стабильнее. Проанализируем пример кода:
&НаСервере
Процедура ПрочитатьФайлExcelБезCOM(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Перебираем строки и колонки табличного документа
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
ЗначениеЯчейки = ТабДок.Область(НомерСтроки, 1).Текст;
// Ваша логика обработки данных...
КонецЦикла;
КонецПроцедуры
Преимущества этого метода:
excel.exe в памяти сервера.Если вы все же используете COM-объект, крайне важно правильно завершать его работу. В противном случае ваш сервер через неделю превратится в «кладбище» заброшенных процессов Excel, которые поглотят всю оперативную память.
Всегда используйте блок Попытка...Исключение и закрывайте приложение в любом случае:
Excel = Новый COMОбъект("Excel.Application");
Попытка
// Основной код обработки
Книга = Excel.Workbooks.Open(ПутьКФайлу);
// ... логика ...
Книга.Close(Ложь); // Закрываем без сохранения изменений
Исключение
Сообщить("Произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;
Excel.Quit(); // Обязательная команда выхода
Excel = Неопределено; // Очистка переменной
Подведем итог: для современных конфигураций на управляемых формах оптимальным решением является использование ТабличныйДокумент.Прочитать() или передача файла через временное хранилище. Использование COM на сервере допустимо только в крайних случаях при специфических требованиях к форматированию файлов, и требует тщательной настройки прав доступа и папок профиля Windows.