При интеграции платформы 1С:Предприятие 7.7 с порталом Электронных счетов-фактур (ЭСЧФ) Республики Беларусь (vat.gov.by) программисты часто сталкиваются с неочевидным поведением компоненты EInvVatService. Типичная ситуация: на одном и том же рабочем месте развернуты две базы данных 1С 7.7. В одной базе обмен работает идеально, а во второй — процесс авторизации на портале проходит успешно (выводится сообщение «Подключение успешно»), но при попытке получить список документов методом GetList сервер возвращает ошибку Error 404 NOT_FOUND.
В этой статье мы подробно разберем, почему возникает эта ошибка, как диагностировать скрытые опечатки в адресах подключения и какие дополнительные системные настройки необходимы для стабильного обмена ЭСЧФ на платформе 1С 7.7.
Рассмотрим проблемный участок кода, который используется для инициализации подключения и запроса входящих ЭСЧФ:
// 1. Определение адреса и инициализация подключения
АдресСервера = СокрЛП(Константа.АдресСервераОбменаЭСЧФ);
Если ПустоеЗначение(АдресСервера) = 1 Тогда
АдресСервера = "https://ws.vat.gov.by:443/InvoicesWS/services/InvoicesPort";
КонецЕсли;
Если EVatService.Connect(АдресСервера) = 0 Тогда
Сообщить("Подключение успешно");
Иначе
Сообщить("Ошибка подключения: " + EVatService.LastError);
Возврат;
КонецЕсли;
// 2. Запрос списка поступивших счетов-фактур
Попытка
InvList = EVatService.GetList(ПреобразоватьДату(НаДату) + "T00:00:00Z");
Исключение
Сообщить("Не удалось получить список ЭСЧФ: " + EVatService.LastError);
Возврат;
КонецПопытки;
При выполнении этого кода в проблемной базе первая часть отрабатывает штатно: метод Connect возвращает 0, что сигнализирует об успешном соединении. Однако на шаге вызова GetList программа уходит в ветку исключения и выдает html-ответ от сервера:
HTTP ERROR: 404
Problem accessing /Invoices/InvoicesPort. Reason: NOT_FOUND
Powered by Jetty://
Возникает логичный вопрос: как веб-служба может успешно авторизовать пользователя, но затем утверждать, что запрашиваемый ресурс (метод получения списка) не найден?
Проанализируем детально структуру адресов, используемых порталом ЭСЧФ. Портал предоставляет два независимых контура для работы: тестовый и промышленный (боевой). Адреса точек подключения к ним различаются структурой путей:
https://ws.vat.gov.by:443/InvoicesWS/services/InvoicesPorthttps://ws.vat.gov.by:443/Invoices/InvoicesPort (или аналогичные вариации в зависимости от версии API)Основная проблема заключается в том, что в рабочей базе адрес считывался напрямую из кода (где он был зашит по умолчанию в жестком виде), а в проблемной базе (например, УСН) значение считывалось из периодической константы Константа.АдресСервераОбменаЭСЧФ. В этой константе была допущена критическая опечатка — адрес вел на тестовый контур или содержал некорректный путь без сегментов WS/services/.
Почему проходила авторизация? Авторизация по сертификату открытого ключа шифрования (через ПО «Авест») происходит на уровне TLS-рукопожатия (клиентский сертификат предъявляется при установлении защищенного HTTPS-соединения с веб-сервером). Веб-сервер успешно принимает сертификат и одобряет соединение (метод Connect завершается успешно). Но когда дело доходит до вызова конкретного SOAP-метода GetList, запрос отправляется по некорректному пути, где веб-служба обработки документов просто не развернута. В результате сервер Jetty возвращает стандартную ошибку веб-сервера 404 NOT_FOUND.
Чтобы решить эту проблему, необходимо тщательно проверить значение константы в проблемной базе данных и привести ее к единому стандарту:
// Правильное значение константы для боевого портала:
https://ws.vat.gov.by:443/InvoicesWS/services/InvoicesPort
Для того чтобы избежать других скрытых проблем при работе с компонентой EVatService в среде 1С 7.7, разберем ключевые настройки операционной системы и криптографического ПО.
Для валидации структуры XML-документов перед отправкой и после получения компоненте требуются схемы XSD. Если схемы отсутствуют или устарели, то метод GetList может возвращать пустые списки документов либо выдавать неинформативные ошибки без кода.
Выясним, как правильно разместить схемы:
eInvVat.zip).xsd.[КаталогБазы]\ExtForms\xsd\.Очень часто обмен ЭСЧФ внезапно прекращает работать с ошибкой «Нет доверия к сертификату» или «Срок действия СОС истек». Это связано с тем, что персональные сертификаты шифрования ЗАО «Авест» требуют регулярного обновления списков отзыва.
Для решения этой проблемы настроим автоматическое обновление через планировщик задач Windows:
C:\Program Files (x86)\Avest\AvPCM_nces\get_crl.bat.Поскольку компонента EVatService работает через защищенные сетевые сокеты, защитные механизмы ОС могут блокировать сетевую активность устаревшего движка 1С 7.7 (файлы 1cv7.exe или 1cv7s.exe).
Рассмотрим, на что обратить внимание при администрировании рабочего места:
TLS 1.1 и TLS 1.2, так как именно на системные библиотеки Windows опирается транспортный уровень компоненты обмена.Если при попытке инициализировать объект обмена возникает системная ошибка «Не удалось создать объект EInvVatService.Connector», это свидетельствует о проблемах регистрации ActiveX-компоненты в системном реестре.
Выполним ручную регистрацию библиотеки по шагам:
regsvr32 "C:\Program Files (x86)\EInvVatService\EInvVatService.dll"
Платформа 1С 7.7 критична к объему используемой оперативной памяти. Если запрашивать большой объем данных за длительный период, то при вызове метода GetList и последующем разборе XML-документов программа может аварийно завершиться с ошибкой нехватки памяти.
Чтобы этого избежать, рекомендуем сохранять параметр ToDate (возвращаемый объектом списка документов) в константу или специальный регистр настроек после каждого успешного сеанса обмена. При следующем запуске передавайте эту дату-время в качестве входящего параметра. Это позволит скачивать только новые документы, минимизируя нагрузку на систему:
// Пример оптимизированного запроса с использованием сохраненной метки времени
ПоследняяДатаЗапроса = Константа.ДатаВремяПоследнегоПолученияЭСЧФ; // Формат: "YYYY-MM-DDTHH:MM:SSZ"
Если ПустаяСтрока(ПоследняяДатаЗапроса) = 1 Тогда
ПоследняяДатаЗапроса = ПреобразоватьДату(РабочаяДата()) + "T00:00:00Z";
КонецЕсли;
Попытка
InvList = EVatService.GetList(ПоследняяДатаЗапроса);
// Обработка списка документов...
// Сохранение метки времени для следующего сеанса обмена
Константа.ДатаВремяПоследнегоПолученияЭСЧФ = InvList.ToDate;
Исключение
Сообщить("Ошибка запроса документов: " + EVatService.LastError);
КонецПопытки;
Используя предложенные методики настройки адресов и системного окружения, вы обеспечите стабильную и бесперебойную работу механизмов обмена ЭСЧФ в любых конфигурациях на платформе 1С 7.7.