В процессе интеграции 1С с внешними системами через WEB-сервисы разработчики часто сталкиваются с ситуацией, когда фоновые задания обмена периодически «вешаются». Сеансы перестают завершаться, обмен данными останавливается, а при попытке открыть форму внешнего обработчика в тонком клиенте пользовательский интерфейс полностью замирает. Временным «лечением» становится рестарт службы сервера 1С:Предприятие, однако спустя несколько дней проблема повторяется вновь.
Проанализируем основные причины возникновения этой неисправности, разберем записи технологического журнала и рассмотрим практические способы полного устранения зависаний.
Выясним, какие технические факторы вызывают подобное поведение системы:
WSОпределения и создании WSПрокси платформа 1С выполняет синхронные сетевые запросы. Если внешний сервис зависает, испытывает сетевые проблемы или не закрывает соединение, рабочий процесс 1С (rphost) остается в бесконечном ожидании ответа сокета.ERROR: syntax error at or near "application" LINE 1: lock table pg_class in application share mode. Стандартный PostgreSQL не поддерживает режим блокировок APPLICATION SHARE, что приводит к сбоям транзакций и блокировкам таблиц.TIME_WAIT, вызывая ошибки вида NetDataExchangeException: Address already in use.ВнешниеОбработки.Подключить() на сервере без явного освобождения ресурсов приводит к накопительному росту сеансовых данных в памяти rphost.Разберем самый оперативный способ предотвращения зависания потоков. При создании сетевых объектов необходимо явно задавать ограничение времени ожидания ответа в секундах.
Рассмотрим пример кода, в котором выполняется подключение к WEB-сервису с установкой таймаута:
// Инициализация WSDL-определений с указанием таймаута (например, 9 секунд)
Определения = Новый WSОпределения(
"http://example.com/ws/service.1cws?wsdl",
СокрЛП(Настройки.Логин),
СокрЛП(Настройки.Пароль),
,
9
);
// Создание WSПрокси с явной передачей таймаута в шестом параметре конструктора
Прокси = Новый WSПрокси(
Определения,
"ControlOfExternalModules",
"WSImportDate",
"WSImportDateSoap",
,
9
);
Прокси.Пользователь = СокрЛП(Настройки.Логин);
Прокси.Пароль = СокрЛП(Настройки.Пароль);
// Также допускается отдельное присвоение свойства (если прокси создан без конструктора WSDL):
// Прокси.Таймаут = 9;
Результат = Прокси.ImportDate(СтруктураДанныхОтправки);
Важное замечание: Передача таймаута в шестой параметр конструктора WSПрокси или установка свойства Прокси.Таймаут гарантирует, что при сетевом сбое фоновое задание не повиснет бессрочно, а завершится по ошибке через указанное количество секунд, освободив рабочий процесс rphost.
Посмотрим на пример процедурной работы с динамически подключаемыми модулями. Чтобы избежать утечки оперативной памяти и зависания сеансовых данных, после завершения работы с обработкой необходимо явно вызывать метод УдалитьИзВременногоХранилища().
Процедура ОповеститьОбработчик(ВнешнийОбработчик, Событие, ОбъектСобытия, ДанныеДляОбработки, ВнешнееСобытие) Экспорт
Менеджер = ВнешниеОбработки;
Попытка
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ВнешнийОбработчик.ХранилищеОбработки.Получить());
ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , Ложь);
Исключение
ЗаписьЖурналаРегистрации("Создание внешнего модуля: ОШИБКА! '" + ОписаниеОшибки() + "'", УровеньЖурналаРегистрации.Предупреждение);
ИмяОбработки = Неопределено;
КонецПопытки;
Если НЕ ИмяОбработки = Неопределено Тогда
ОбработкаОбъект = Менеджер.Создать(ИмяОбработки);
// Передача настроек в обработку
Настройки = Новый Структура;
Настройки.Вставить("СсылкаНаМодуль", ВнешнийОбработчик.Ссылка);
ОбработкаОбъект.Настройки = Настройки;
Если НЕ ВнешнееСобытие Тогда
ОбработкаОбъект.ОбработатьВнутреннееСобытие(СокрЛП(Событие), ОбъектСобытия);
Иначе
ОбработкаОбъект.ОбработатьВнешнееСобытие(ДанныеДляОбработки);
КонецЕсли;
КонецЕсли;
// Обязательная очистка временного хранилища для предотвращения утечек памяти
УдалитьИзВременногоХранилища(АдресВоВременномХранилище);
КонецПроцедуры
Проанализируем ошибки СУБД, зафиксированные в технологическом журнале. Наличие записи ERROR: syntax error at or near "application" LINE 1: lock table pg_class in application share mode свидетельствует о том, что используемая база данных PostgreSQL не содержит специальных патчей от фирмы «1С».
Для исправления проблемы выполним следующие действия:
Чтобы окончательно стабилизировать работу сервисных обменов, учтем следующие архитектурные рекомендации:
WSОпределения рекомендуется импортировать WSDL-схему напрямую в конфигурацию в объект «WS-ссылки». Это исключит лишние HTTP-запросы на получение структуры сервиса..cfe).rphost и интервал его превышения, чтобы кластер перезапускал процессы со сниженной производительностью без остановки всей службы.