Как запустить HTTP-сервис из расширения 1С без перепубликации и остановки Apache

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

При работе с высоконагруженными системами или сервисами, которые постоянно обмениваются данными, полная перепубликация информационной базы на веб-сервере крайне нежелательна. Это приводит к разрыву текущих соединений, сбросу сессий и потенциальной потере передаваемых данных. Однако при разработке новых функций в расширениях часто возникает необходимость оперативно внедрить новый HTTP-сервис. Рассмотрим, как решить эту задачу, используя механизмы «мягкого» перезапуска веб-сервера Apache и ручную корректировку конфигурационных файлов 1С.

Анализ проблемы и принципы публикации расширений

По умолчанию при публикации базы через конфигуратор или утилиту webinst, 1С формирует файл default.vrd. Если мы добавляем новый сервис в основную конфигурацию, перепубликация неизбежна. Но для расширений предусмотрен более гибкий механизм. Проблема автора заключается в том, что по умолчанию платформа 1С не публикует HTTP-сервисы из расширений автоматически, если это не указано в настройках публикации. Разберем по шагам, как активировать сервисы расширений вручную.

Шаг 1: Настройка файла публикации default.vrd

Файл default.vrd является основным дескриптором публикации вашей информационной базы. Чтобы веб-сервер «увидел» HTTP-сервисы внутри расширений, нам необходимо отредактировать этот XML-файл. Проанализируем два способа настройки.

Способ А: Глобальная публикация всех расширений

Если мы хотим, чтобы все текущие и будущие расширения автоматически публиковали свои сервисы, необходимо добавить атрибут publishExtensionsByDefault="true" в секцию httpServices. Это избавит от необходимости править файл при добавлении новых расширений в будущем.

Пример структуры файла:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/MyBase"
       ib="Srvr=ServerName;Ref=BaseName;">
    <httpServices publishExtensionsByDefault="true">
        <service name="MyStandardService" rootUrl="std" />
    </httpServices>
</point>

Способ Б: Точечная публикация конкретных расширений

Для повышения безопасности и контроля рекомендуется публиковать только нужные расширения. Для этого внутри элемента <point> добавим дочерний элемент <extensions>. Это позволит системе точно знать, какие расширения должны участвовать в обработке HTTP-запросов.


<extensions>
    <extension name="ИмяВашегоРасширения" active="true"/>
</extensions>

Шаг 2: Применение изменений без разрыва соединений (Graceful Restart)

После того как мы внесли изменения в default.vrd, веб-сервер Apache должен их перечитать. Обычная команда restart полностью останавливает все рабочие процессы и запускает их заново, что обрывает активные HTTP-сессии. Для предотвращения этого воспользуемся режимом graceful.

Для операционных систем семейства Linux:

Команда graceful дает сигнал родительскому процессу Apache оповестить дочерние процессы о необходимости завершения работы после обслуживания текущего запроса. Новые запросы при этом сразу начинают обрабатываться новыми процессами с обновленной конфигурацией.

sudo apache2ctl graceful

Если ваша система использует System V или старые версии дистрибутивов, можно применить следующую команду:

sudo service apache2 graceful

Для операционных систем Windows:

В среде Windows работа с Apache осуществляется через исполняемый файл службы. Для мягкого перезапуска выполним команду в командной строке (cmd), запущенной от имени администратора, перейдя в папку bin установленного Apache:

httpd.exe -k restart

Или, если исполняемый файл называется иначе:

apache.exe -k restart

Шаг 3: Проверка URL-адреса сервиса расширения

Важно помнить, что структура URL для HTTP-сервисов, находящихся в расширениях, отличается от стандартных сервисов основной конфигурации. Если мы обратимся по старому шаблону, то получим ошибку 404. Рассмотрим правильный формат формирования пути:

http://{Сервер}/{Имя_Публикации}/hs/{Имя_Расширения}/{Корневой_URL_Сервиса}/{Относительный_Путь}

Проанализируем пример: если база опубликована как trade, расширение называется Integration, а корневой URL сервиса — v1, то запрос должен уходить на адрес: http://server/trade/hs/Integration/v1/getData.

Дополнительные рекомендации и нюансы

Рассмотрим несколько важных технических моментов, которые часто упускаются из виду при ручной правке конфигурации:

  1. Права доступа (Linux): При ручном редактировании default.vrd через nano или vi под учетной записью root, права на файл могут измениться. Убедитесь, что пользователь, от которого запущен Apache (например, www-data), имеет права на чтение этого файла. Проверим права командой: ls -l default.vrd.
  2. Версия Apache 2.2: Поскольку используется устаревшая версия 2.2, обратите внимание на логи ошибок. Если изменения не подхватились, проанализируем лог: tail -f /var/log/apache2/error.log
  3. Кэширование модулей: В редких случаях модуль mod_1c может удерживать состояние конфигурации. Если graceful не помог, попробуйте временно переименовать файл default.vrd, обратиться к серверу (получить ошибку), вернуть имя обратно и снова выполнить graceful.
  4. Заголовки авторизации: Для Apache 2.2 часто требуется явно разрешить передачу заголовка Authorization в конфигурационном файле httpd.conf, иначе 1С не сможет аутентифицировать пользователя HTTP-сервиса: SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

Таким образом, мы выяснили, что добавление нового сервиса из расширения не требует прерывания работы пользователей. Достаточно корректно настроить XML-структуру файла публикации и отправить веб-серверу сигнал на мягкое обновление конфигурации. Это позволяет поддерживать высокую доступность сервисов 1С даже в процессе активной разработки и внедрения новых функций.

← На главную