При интеграции систем с базами данных 1С через протокол oData разработчики часто сталкиваются со странным поведением веб-сервисов при смене операционной системы. Типичная ситуация: настроенная связка на Windows работает безупречно, но при переносе веб-сервера Apache на Linux (например, CentOS или Ubuntu) команды проведения Post и отмены проведения Unpost начинают возвращать ошибку HTTP Status 500 с кодом -1 и сообщением Error running processor - 'ОбработкаУдаленияПроведения' (или аналогичным для проведения).
В этой статье мы подробно разберем, почему возникает данная проблема, как настроить инструменты диагностики и какие конкретные шаги необходимо предпринять для успешного проведения и распроведения документов через oData в среде Linux.
Проанализируем архитектурные различия работы веб-компонентов 1С на Windows и Linux. При отправке запросов проведения или отмены проведения по стандарту oData используются методы POST:
/Post?PostingModeOperational=false/UnpostЭти запросы по своей логике не требуют передачи каких-либо данных в теле (payload) — все управляющие параметры передаются непосредственно в строке URL. Здесь и возникает ключевое различие в поведении веб-серверов:
wsap24.so, крайне чувствителен к отсутствию тела запроса. При получении пустого POST-запроса Linux-версия веб-расширения некорректно инициализирует контекст вызова на сервере 1С. Это приводит к потере параметров сеанса или искажению потока данных, из-за чего сервер приложений 1С выбрасывает системное исключение внутри обработчиков проведения./unpost или документу document_накладная (в нижнем регистре) могло быть успешно обработано платформой, то в Linux малейшее несовпадение регистра гарантированно вызывает сбой маршрутизации или внутреннее исключение среды выполнения с кодом -1.apache или www-data). Если для этого пользователя или для службы в целом не задана корректная языковая локаль (например, используется системный по умолчанию POSIX/C вместо ru_RU.UTF-8), то при выполнении кода в транзакции проведения могут некорректно интерпретироваться даты, числа с плавающей точкой или строковые функции встроенного языка 1С.Самый эффективный и быстрый способ решить проблему с ошибкой 500 при вызове Post / Unpost — это принудительная передача непустого тела запроса со стороны вашего oData-клиента. Даже если данные передавать не требуется, мы должны сформировать корректный пустой JSON-объект.
Обязательно добавьте в заголовки вашего HTTP-запроса следующие параметры:
Content-Type: application/jsonContent-Length: 2А в качестве тела запроса передайте две фигурные скобки, обозначающие пустой JSON-объект:
{}
Посмотрим на пример структуры правильного HTTP-запроса для отмены проведения документа:
POST /Base1C/odata/standard.odata/Document_РеализацияТоваровУслуг(guid'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')/Unpost HTTP/1.1
Host: your-linux-server.local
Authorization: Basic dXNlcjpwYXNzd29yZA==
Content-Type: application/json
Content-Length: 2
{}
Передача тела {} гарантирует, что модуль веб-расширения 1С под Linux корректно обработает входящий поток, не потеряет контекст авторизации и передаст вызов на сервер приложений без искажений.
Если после передачи непустого тела запроса проведение все равно завершается ошибкой, проверим настройки окружения Apache. Убедимся, что процессы веб-сервера работают с поддержкой кириллицы и правильных региональных стандартов.
Разберем, как задать локаль для веб-сервера Apache, управляемого через systemd (в дистрибутивах CentOS, RedHat, Ubuntu):
sudo systemctl edit httpd
(Примечание: в Ubuntu/Debian используйте имя службы apache2 вместо httpd).
[Service]
Environment="LANG=ru_RU.UTF-8"
Environment="LC_ALL=ru_RU.UTF-8"
sudo systemctl daemon-reload
sudo systemctl restart httpd
Это исключит любые ошибки преобразования типов, форматов дат и чисел во встроенном коде 1С, когда проведение запускается из-под сессии веб-сервера Linux.
Если стандартный Журнал Регистрации 1С фиксирует лишь события начала и завершения сеанса oData, не раскрывая деталей ошибки 500, нам потребуется настроить Технологический Журнал на сервере 1С. Это позволит увидеть точный стек вызова (stack trace) исключения непосредственно в момент выполнения обработчика ОбработкаУдаленияПроведения.
Разберем процесс настройки ТЖ по шагам:
/opt/1C/v8.3/x86_64/conf/ или /opt/1cv8/conf/, для Windows — C:\Program Files\1cv8\conf\) создадим или отредактируем файл конфигурации ТЖ под названием logcfg.xml.logcfg.xml следующую конфигурацию, которая будет отслеживать все исключения (EXCP) и запросы к веб-сервисам (WEBSV):
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="/var/log/1c/logs" history="24">
<event>
<eq property="Name" value="EXCP"/>
</event>
<event>
<eq property="Name" value="WEBSV"/>
</event>
<property name="All"/>
</log>
</config>
Убедитесь, что у пользователя, под которым запущен сервер приложений 1С (обычно это пользователь usr1cv8), есть права на запись в каталог логов /var/log/1c/logs. После совершения ошибочного запроса oData проанализируем файлы логов ТЖ. Там будет содержаться исчерпывающая информация о том, на какой конкретно строке встроенного кода 1С произошло исключение.
Стоит отметить, что в старых релизах технологической платформы 1С:Предприятие 8.3 (особенно в ветках 8.3.12, 8.3.14 и ранних сборках 8.3.16) содержались задокументированные ошибки веб-расширения под Linux, связанные с десериализацией параметров oData и утечками памяти в транзакциях проведения. Если вышеописанные методы настройки запроса и окружения не привели к устранению проблемы, настоятельно рекомендуется обновить платформу 1С (как сервер приложений, так и модули веб-сервера на Linux) до актуальных стабильных релизов (ветки 8.3.22 и выше).