При разработке интеграционных решений на базе 1С:ERP 2 или других современных конфигураций программисты часто сталкиваются с ситуацией, когда стандартная бизнес-логика (например, версионирование объектов, проверки заполнения или дополнительные подписки на события) мешает корректной работе HTTP-сервисов. В процессе проведения документа, созданного или измененного через API, могут возникать ошибки, специфичные для интерактивного режима работы, которые совершенно не нужны при программном обмене.
В этой статье мы подробно разберем, как правильно идентифицировать выполнение кода в контексте HTTP-соеднения и как грамотно обходить стандартные механизмы, такие как версификация (версионирование) объектов, чтобы обеспечить стабильную работу обмена.
Рассмотрим ситуацию, когда при проведении документа через HTTP-сервис возникает ошибка в механизме версионирования. Это происходит потому, что подсистемы БСП (Библиотеки стандартных подсистем) пытаются получить данные о текущем пользователе или его рабочем месте, которые в контексте веб-соединения могут быть не определены или иметь специфический формат.
Проанализируем самый быстрый и эффективный способ отключения этой проверки. Мы можем использовать механизм ДополнительныеСвойства, который есть у любого объекта информационной базы. Перед тем как вызвать метод Записать() или Записать(РежимЗаписиДокумента.Проведение), мы добавим специальный флаг:
// В коде HTTP-сервиса перед записью объекта
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// ... заполнение реквизитов ...
НовыйДокумент.ДополнительныеСвойства.Вставить("ПропуститьЗаписьВерсииОбъекта", Истина);
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Этот флаг анализируется подписками на события подсистемы "Версионирование объектов". Если он установлен, система просто пропустит создание новой версии, что позволит избежать ошибок верификации. Однако стоит учитывать, что в разных версиях конфигураций имя этого свойства может незначительно отличаться. Посмотрим на наиболее распространенные варианты:
ПропуститьЗаписьВерсииОбъектаОтключитьВерсионированиеОбъектаЗагрузкаДанныхИногда нам нужно не просто отключить конкретную функцию, а в целом изменить логику работы программы, если вызов идет через HTTP. Как выяснилось, стандартная директива компиляции #Если ВнешнееСоединение Тогда в данном случае не работает, так как HTTP-сервис выполняется на стороне сервера под обычным сеансом, но со специфическими параметрами.
Выясним, как программно определить, что мы находимся внутри HTTP-запроса. Для этого проанализируем текущий сеанс информационной базы с помощью метода ПолучитьТекущийСеансИнформационнойБазы(). У объекта сеанса есть свойство ИмяПриложения. При работе через веб-сервисы или HTTP-сервисы оно принимает значение "WSConnection".
Разберем пример функции, которую можно разместить в общем модуле для использования во всем проекте:
Функция ЭтоHTTPСоединение() Экспорт
Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
Возврат Сеанс.ИмяПриложения = "WSConnection";
КонецФункции
Используя эту проверку в модуле объекта (например, в процедуре ПередЗаписью), мы сможем гибко управлять логикой:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоHTTPСоединение() Тогда
// Отключаем лишние проверки для API
ЭтотОбъект.ДополнительныеСвойства.Вставить("ПропуститьЗаписьВерсииОбъекта", Истина);
КонецЕсли;
КонецПроцедуры
Поскольку ERP 2 построена на базе БСП, мы можем воспользоваться встроенными инструментами библиотеки. Рассмотрим функцию ОбщегоНазначения.ЭтоСеансВебСервиса(). Несмотря на название, во многих редакциях она корректно возвращает Истина и для HTTP-сервисов, так как технически они используют те же механизмы публикации на веб-сервере (IIS или Apache).
Также проанализируем возможность использования глобального флага ОбменДанными.Загрузка. Если ваш сервис предназначен для массовой загрузки данных из другой системы, установка этого свойства в значение Истина — это "золотой стандарт" разработки на 1С.
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.Записать();
Важно понимать: установка Загрузка = Истина отключает почти все проверки в модуле объекта и подписки на события. Это гарантирует отсутствие ошибок версионирования, но перекладывает ответственность за целостность данных полностью на ваш код HTTP-сервиса.
Рассмотрим еще один надежный архитектурный подход. Для работы HTTP-сервиса рекомендуется создать отдельного служебного пользователя (например, с именем "Service_Exchange"). Это позволяет не только легко отслеживать действия в журнале регистрации, но и ограничивать логику программно. Для комплексного контроля таких вызовов можно использовать расширение для логирования данных HTTP-сервисов.
Проанализируем, как это можно проверить в коде:
ПараметрыСеанса.ТекущийПользователь. Мы сравниваем текущего пользователя с заранее определенным шаблоном или ищем его по имени."ИспользованиеHTTPОбмена", назначаем ее только пользователю сервиса и проверяем наличие этой роли методом РольДоступна(). Это дополняет общие механизмы управления доступом к формам.Посмотрим на пример кода с проверкой роли:
Если РольДоступна("ИнтеграцияБезВерсионирования") Тогда
ЭтотОбъект.ДополнительныеСвойства.Вставить("ПропуститьЗаписьВерсииОбъекта", Истина);
КонецЕсли;
Этот метод считается более гибким, так как позволяет управлять правами и поведением системы без изменения программного кода при добавлении новых узлов обмена.
Подводя итоги, отметим, что для решения проблемы с ошибками версификации в ERP 2 при использовании HTTP-сервисов лучше всего использовать комбинацию методов. Если вам нужно разовое решение для конкретного документа — используйте ДополнительныеСвойства. Если же вы строите масштабную систему обмена, лучше реализовать проверку ИмяПриложения == "WSConnection" или выделить специального пользователя с уникальной ролью.
Помните, что корректная обработка сеансов веб-сервисов позволяет избежать множества трудноотлавливаемых ошибок, связанных с отсутствием интерактивного контекста (диалоговых окон, параметров клиента или настроек рабочего места). Для отладки и анализа входящих и исходящих запросов можно использовать встроенный сниффер HTTP-трафика для 1С.