При внедрении модулей интеграции между 1С и внешними системами, такими как Битрикс24, специалисты часто сталкиваются с проблемами совместимости. Особенно это актуально, когда модуль, изначально разработанный для одной конфигурации (например, 1С:Управление торговлей 10.3), переносится в другую (например, 1С:Управление производственным предприятием 1.3). Одной из самых распространенных ошибок в таких случаях является сообщение: «Неправильный формат параметра ИмяЭкспортнойПроцедуры», возникающее в общем модуле ДлительныеОперации.
В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем механизм работы фоновых заданий и выясним, как правильно модифицировать код, чтобы восстановить работоспособность обмена в реальном времени.
Давайте рассмотрим ситуацию: при включении режима обмена данными в реальном времени система выдает ошибку в строке кода общего модуля ДлительныеОперации. Ошибка указывает на то, что параметр ИмяЭкспортнойПроцедуры имеет неверный формат. Выясним, почему это происходит.
Проанализируем участок кода, который инициирует запуск обмена:
РезультатВыполненияЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
"ВыгрузкаВРеальномВремениВФоне",
ПараметрыЗапуска,
НаименованиеФоновогоЗадания);
В данном примере в качестве имени процедуры передается строка "ВыгрузкаВРеальномВремениВФоне". Основная проблема заключается в том, что подсистема «Длительные операции», входящая в состав Библиотеки Стандартных Подсистем (БСП), предъявляет строгие требования к именованию вызываемых процедур. Если процедура передается без указания имени общего модуля, платформа не может однозначно определить, где именно находится исполняемый код, и выбрасывает исключение о неправильном формате параметра.
Первым делом нам необходимо выяснить, в каком именно общем модуле расположена процедура ВыгрузкаВРеальномВремениВФоне. Поскольку мы используем модуль обмена с Битрикс24, нам следует искать в модулях, чье имя начинается на Б24_, Битрикс24_ или Бит_.
Выполним следующие действия:
Процедура ВыгрузкаВРеальномВремениВФоне.Экспорт.Допустим, процедура нашлась в модуле Б24_ОбменДанными.
Теперь, когда мы знаем точное местоположение процедуры, нам нужно изменить формат передачи параметра. Вместо простого имени функции мы должны указать «ПолноеИмяОбщегоМодуля.ИмяПроцедуры».
Рассмотрим, как должен выглядеть исправленный код:
// Было:
// "ВыгрузкаВРеальномВремениВФоне"
// Стало (пример):
ИмяПроцедурыДляФона = "Б24_ОбменДанными.ВыгрузкаВРеальномВремениВФоне";
РезультатВыполненияЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
ИмяПроцедурыДляФона,
ПараметрыЗапуска,
НаименованиеФоновогоЗадания);
Важный нюанс: В некоторых старых версиях БСП, которые часто встречаются в УПП 1.3, механизм проверки имен может быть еще более жестким. Если после добавления имени модуля ошибка сохраняется, проверьте, не содержит ли строка лишних пробелов или спецсимволов.
Даже если имя указано верно, фоновое задание может не запуститься, если свойства общего модуля настроены неправильно. Поскольку фоновые задания выполняются исключительно на стороне сервера, модуль, содержащий процедуру выгрузки, должен отвечать следующим требованиям:
Проанализируем свойства найденного модуля Б24_ОбменДанными (или аналогичного) и при необходимости проставим недостающие галочки.
Если после исправления имени параметра система выдает ошибку тайм-аута или «Выполнение завершилось с ошибкой» без подробностей, нам потребуется отладка. В обычных формах (УПП, УТ 10.3) отладка фоновых заданий имеет свои особенности.
Для того чтобы «поймать» ошибку внутри фонового задания, выполним следующие рекомендации:
РежимОтладки.ДлительныеОперации.ЗапуститьВыполнениеВФоне подсистема часто проверяет наличие этого параметра. Если он передан, система может попытаться выполнить код в текущем сеансе, а не в фоновом, что позволит нам увидеть ошибку через обычную точку останова.Часто после запуска задания используется метод ДлительныеОперации.ОжидатьЗавершения. Если вы видите ошибку «При ожидании завершения заданий наступил таймаут», это не всегда означает, что программа «зависла». Это может быть следствием того, что фоновое задание упало с критической ошибкой в самом начале (например, из-за отсутствия прав или неверных параметров инициализации), и менеджер заданий просто не успел вернуть статус.
Посмотрим на пример правильной обработки ожидания:
ПараметрыОжидания = ДлительныеОперации.ПараметрыОжидания(500); // Увеличиваем таймаут
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
Попытка
РезультатОжидания = ДлительныеОперации.ОжидатьЗавершения(РезультатВыполненияЗадания.ИдентификаторЗадания, ПараметрыОжидания);
Исключение
ЗаписатьЛогСобытий("Ошибка при ожидании фонового задания: " + ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
Увеличение таймаута (например, до 500 секунд) помогает только в том случае, если данных для выгрузки действительно много. Если же ошибка «Неправильный формат параметра» не устранена, никакое увеличение времени ожидания не поможет, так как задание даже не начнет выполняться.
Подводя итог, можно выделить основной алгоритм решения проблемы:
Модуль.Процедура для фоновых вызовов.ВыгрузкаВРеальномВремениВФоне.ЗапуститьВыполнениеВФоне.Соблюдение этих шагов позволит успешно адаптировать модуль обмена под специфику вашей конфигурации и обеспечить стабильную работу интеграции в реальном времени.