При интеграции 1С со сторонним оборудованием и сервисами через внешние компоненты разработчики нередко сталкиваются с ситуацией, когда заявленный в документации метод объекта вызывает ошибку времени выполнения: «Обращение к процедуре объекта как к функции». Подобное часто происходит при попытке получить данные, например, вызвать метод ПолучитьВерсиюКомпоненты().
Проанализируем причины возникновения этой ошибки, разберем способы ее устранения, а также рассмотрим нюансы перехвата внешних событий от подключаемого оборудования и АТС.
Рассмотрим, почему платформа 1С воспринимает метод внешней компоненты как процедуру, несмотря на то, что в описании API он заявлен как функция с возвращаемым значением:
pHasRetVal функции GetNParams. Если разработчик библиотеки выставил значение false или реализовал обработчик через вызов CallAsProc вместо CallAsFunc, платформа 1С считает данный метод процедурой. Аналогично в COM-компонентах метод может быть объявлен с типом возврата void.Наиболее надежным решением является замена некорректно скомпилированной внешней компоненты на актуальный релиз, в котором исправлены интерфейсные вызовы. Разберем порядок действий:
Попытка
// Подключение и инициализация компоненты
Версия = ВнешняяКомпонента.ПолучитьВерсиюКомпоненты();
Сообщить("Версия компоненты: " + Строка(Версия));
Исключение
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если возможность обновить внешнюю компоненту отсутствует, проверим альтернативный вариант вызова. Некоторые разработчики библиотек реализуют возврат значений через выходные параметры. Попробуем вызвать метод как процедуру, передав переменную для записи результата:
Попытка
Версия = "";
ВнешняяКомпонента.ПолучитьВерсиюКомпоненты(Версия);
Сообщить("Полученная версия: " + Строка(Версия));
Исключение
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если вызов отрабатывает без ошибки и переменная Версия заполняется строковым значением, значит, в текущей сборке метод реализован именно как процедура с передачей значения по ссылке.
После устранения ошибки с вызовом методов разработчики часто сталкиваются со следующей проблемой: компонента не генерирует внешние события в реальном времени (например, событие входящего звонка), либо все события приходят с большой задержкой «пачкой». Разберем основные причины такого поведения:
IAsyncEvent в системную очередь сообщений клиентского приложения. Если в 1С открыто модальное окно, выполняется длительный тяжелый цикл или синхронный вызов, обработка очереди приостанавливается. Как только поток освобождается, процедура ОбработкаВнешнегоСобытия получает сразу весь накопленный буфер событий.ExternalEvent возможна только в интерактивном клиентском сеансе. В фоновых заданиях на сервере внешние события не поддерживаются платформой.Если внешняя компонента работает нестабильно или проект перестал поддерживаться разработчиком, рассмотрим современные альтернативы интеграции:
HTTPСоединение для прямого взаимодействия с сервером по регламентному расписанию или по требованию.