При настройке интеграции через HTTP-сервисы в 1С часто встречаются ситуации, когда код, успешно работающий в локальной сети, начинает выдавать ошибки при обращении извне или под учетной записью пользователя интеграции. Одной из наиболее распространенных проблем является ошибка Ошибка при вызове метода контекста (Выполнить). Давайте разберем, почему это происходит и как устранить данную проблему.
Когда вы обращаетесь к HTTP-сервису, платформа 1С выполняет код под тем пользователем, который был указан при аутентификации запроса. Если у этого пользователя недостаточно прав для выполнения запроса к базе данных, платформа блокирует выполнение метода Выполнить(). Ошибка часто возникает из-за:
Первым делом, если ваш запрос падает при попытке выборки данных, попробуйте добавить в текст запроса ключевое слово РАЗРЕШЕННЫЕ. Это позволит платформе не вызывать исключение при попытке доступа к запрещенным данным, а просто проигнорировать их в выборке.
Рассмотрим пример правильного использования:
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Док.Ссылка
|ИЗ
| Документ.ЗаказКлиента КАК Док
|ГДЕ
| Док.ID = &ID";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ID", IDДокумента);
Результат = Запрос.Выполнить();
Если после добавления этого слова запрос перестал выдавать ошибку, но возвращает пустой результат, значит, проблема точно кроется в отсутствии прав доступа. В таком случае необходимо настроить Профили групп доступа и добавить пользователю роли, соответствующие объектам, к которым происходит обращение.
Если для работы вашего HTTP-сервиса необходимо выполнять действия, которые выходят за рамки прав пользователя (например, запись в регистры или создание объектов, на которые у пользователя нет прав на изменение), рассмотрите возможность использования привилегированного модуля. Если же требуется организовать регулярный обмен данными по расписанию между базами 1С, можно воспользоваться готовым решением, работающим через веб-сервисы.
Поскольку в расширениях не всегда доступна возможность установки флага «Привилегированный» у общего модуля, вы можете вынести логику в отдельный общий модуль в основной конфигурации:
// В свойствах модуля установите флаг "Привилегированный"
Функция ВыполнитьДействиеПривилегированно(Параметры) Экспорт
// Здесь код будет выполняться без учета прав текущего пользователя
// ...
Возврат Результат;
КонецФункции
Частой причиной ошибок 500 при работе с внешними сайтами является несоответствие кодировок. Платформа 1С работает преимущественно с UTF-8. Если ваш сайт отправляет данные в кодировке Windows-1251, попытка обработки таких данных может привести к аварийному завершению работы метода.
При отладке обязательно проверяйте входящий поток данных: после запуска интеграции полезно автоматически сверить проводки между базами 1С для проверки корректности обмена.
// Пример получения строки из POST-запроса
СтрокаДанных = Запрос.ПолучитьТелоКакСтроку();
// Если данные приходят в кодировке Windows-1251, необходимо преобразование:
// (Используйте методы работы с кодировками, доступные в платформе)
Одной из главных ошибок начинающих разработчиков является отсутствие логирования. Если в Журнале регистрации ничего нет, это означает, что вы не обрабатываете ошибки явно. Используйте конструкцию Попытка-Исключение, чтобы зафиксировать причину падения:
Попытка
// Основная логика работы сервиса
Исключение
ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при обработке запроса: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
// Также можно вернуть 500 ошибку клиенту
КонецПопытки;
Для настройки отладки HTTP-сервиса убедитесь, что в консоли администрирования серверов 1С разрешена отладка (флаг Разрешить отладку), а в настройках подключения конфигуратора активировано автоматическое подключение для фоновых заданий и HTTP-сервисов.
Помните: не стоит сразу давать пользователю «полные права», так как это создает огромную дыру в безопасности вашего приложения. Используйте принцип минимальных привилегий, постепенно добавляя нужные права по мере обнаружения ошибок доступа. В ситуациях, когда настройка прав доступа для HTTP-сервисов слишком сложна, для автоматизации процессов подойдет роботизация действий пользователя в интерфейсе системы.