Почему не работают команды Post и Unpost через oData в 1С на веб-сервере Apache под Linux?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции систем с базами данных 1С через протокол oData разработчики часто сталкиваются со странным поведением веб-сервисов при смене операционной системы. Типичная ситуация: настроенная связка на Windows работает безупречно, но при переносе веб-сервера Apache на Linux (например, CentOS или Ubuntu) команды проведения Post и отмены проведения Unpost начинают возвращать ошибку HTTP Status 500 с кодом -1 и сообщением Error running processor - 'ОбработкаУдаленияПроведения' (или аналогичным для проведения).

В этой статье мы подробно разберем, почему возникает данная проблема, как настроить инструменты диагностики и какие конкретные шаги необходимо предпринять для успешного проведения и распроведения документов через oData в среде Linux.

В чем кроется корень проблемы?

Проанализируем архитектурные различия работы веб-компонентов 1С на Windows и Linux. При отправке запросов проведения или отмены проведения по стандарту oData используются методы POST:

Эти запросы по своей логике не требуют передачи каких-либо данных в теле (payload) — все управляющие параметры передаются непосредственно в строке URL. Здесь и возникает ключевое различие в поведении веб-серверов:

  1. Обработка пустого POST-запроса: Веб-сервер IIS и Apache под управлением Windows корректно обрабатывают POST-запросы с нулевой длиной контента. Однако Apache на Linux, работая совместно с проприетарным модулем расширения 1С wsap24.so, крайне чувствителен к отсутствию тела запроса. При получении пустого POST-запроса Linux-версия веб-расширения некорректно инициализирует контекст вызова на сервере 1С. Это приводит к потере параметров сеанса или искажению потока данных, из-за чего сервер приложений 1С выбрасывает системное исключение внутри обработчиков проведения.
  2. Чувствительность к регистру (Case Sensitivity): В отличие от Windows, операционная система Linux полностью чувствительна к регистру символов. Если в Windows-окружении обращение к методу /unpost или документу document_накладная (в нижнем регистре) могло быть успешно обработано платформой, то в Linux малейшее несовпадение регистра гарантированно вызывает сбой маршрутизации или внутреннее исключение среды выполнения с кодом -1.
  3. Системное окружение и локаль: Процесс Apache в Linux запускается под определенным системным пользователем (обычно apache или www-data). Если для этого пользователя или для службы в целом не задана корректная языковая локаль (например, используется системный по умолчанию POSIX/C вместо ru_RU.UTF-8), то при выполнении кода в транзакции проведения могут некорректно интерпретироваться даты, числа с плавающей точкой или строковые функции встроенного языка 1С.

Шаг 1. Исправление пустого тела (payload) в POST-запросах

Самый эффективный и быстрый способ решить проблему с ошибкой 500 при вызове Post / Unpost — это принудительная передача непустого тела запроса со стороны вашего oData-клиента. Даже если данные передавать не требуется, мы должны сформировать корректный пустой JSON-объект.

Обязательно добавьте в заголовки вашего HTTP-запроса следующие параметры:

А в качестве тела запроса передайте две фигурные скобки, обозначающие пустой 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 корректно обработает входящий поток, не потеряет контекст авторизации и передаст вызов на сервер приложений без искажений.

Шаг 2. Настройка локали для службы веб-сервера в Linux

Если после передачи непустого тела запроса проведение все равно завершается ошибкой, проверим настройки окружения Apache. Убедимся, что процессы веб-сервера работают с поддержкой кириллицы и правильных региональных стандартов.

Разберем, как задать локаль для веб-сервера Apache, управляемого через systemd (в дистрибутивах CentOS, RedHat, Ubuntu):

  1. Откроем для редактирования конфигурационный файл службы веб-сервера с помощью команды в терминале Linux: sudo systemctl edit httpd (Примечание: в Ubuntu/Debian используйте имя службы apache2 вместо httpd).
  2. В открывшемся конфигурационном файле добавим секцию, переопределяющую переменные окружения:
    
    [Service]
    Environment="LANG=ru_RU.UTF-8"
    Environment="LC_ALL=ru_RU.UTF-8"
    
  3. Сохраним изменения и перезапустим службу веб-сервера для применения новых настроек:
    
    sudo systemctl daemon-reload
    sudo systemctl restart httpd
    

Это исключит любые ошибки преобразования типов, форматов дат и чисел во встроенном коде 1С, когда проведение запускается из-под сессии веб-сервера Linux.

Шаг 3. Детальная диагностика с помощью Технологического Журнала (ТЖ)

Если стандартный Журнал Регистрации 1С фиксирует лишь события начала и завершения сеанса oData, не раскрывая деталей ошибки 500, нам потребуется настроить Технологический Журнал на сервере 1С. Это позволит увидеть точный стек вызова (stack trace) исключения непосредственно в момент выполнения обработчика ОбработкаУдаленияПроведения.

Разберем процесс настройки ТЖ по шагам:

  1. Перейдем на сервер, где установлен сервер приложений 1С:Предприятие.
  2. В каталоге настроек (для Linux это обычно /opt/1C/v8.3/x86_64/conf/ или /opt/1cv8/conf/, для Windows — C:\Program Files\1cv8\conf\) создадим или отредактируем файл конфигурации ТЖ под названием logcfg.xml.
  3. Запишем в файл 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 и выше).

← На главную