Рассмотрим ситуацию, с которой сталкиваются многие разработчики при переносе или обновлении веб-сервисов: казалось бы, рабочий код внезапно начинает выдавать странные ошибки, причем иногда на английском языке, например, object procedure called as function. Разберем по шагам, как выявить причину и настроить работу сервиса корректно.
Чаще всего, когда мы видим ошибку при выполнении кода в HTTP-сервисе, мы склонны винить логику программы. Однако, если код ранее работал, а после переноса базы на другой сервер перестал, проблема почти всегда кроется не в программных строках, а в окружении.
В нашей ситуации автор столкнулся с ошибкой при попытке записи файла через ТекстовыйДокумент.Записать(ИмяФайла). Ошибка object procedure called as function в данном случае является побочным эффектом: платформа не может штатно завершить метод, так как операционная система «отбивает» запрос на запись из-за ограничений прав.
Важно помнить, что HTTP-сервис исполняется на стороне сервера не под тем пользователем, который открыл конфигуратор, а под учетной записью, от имени которой запущена служба сервера 1С:Предприятия. По умолчанию в Windows это часто USR1CV8.
Что нужно сделать в первую очередь:
1C:Enterprise Server Agent.КаталогВременныхФайлов(), который разворачивается в профиль пользователя USR1CV8. Если после переезда сервера профиль был пересоздан или права в нем сбросились, серверу 1С будет отказано в доступе.Рассмотрим типичный фрагмент кода, который вызывает затруднения:
Функция DocValidPOST(HTTPСервисЗапрос)
Попытка
Результат = HTTPСервисЗапрос.ПолучитьТелоКакСтроку();
ИмяФайла = КаталогВременныхФайлов() + "zzz_txt_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_ччММсс") + ".txt";
Док = новый ТекстовыйДокумент;
Док.УстановитьТекст(Результат);
Док.Записать(ИмяФайла); // Здесь происходит ошибка доступа
Исключение
ЗаписьЖурналаРегистрации("Запрос ", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
// ... дальнейшая логика
КонецФункции
Если при выполнении метода Записать мы получаем отказ, отладчик может вести себя непредсказуемо. Если вы подозреваете права, попробуйте временно предоставить полные права на папку Temp для пользователя службы. Если после этого ошибка исчезнет, значит, мы точно нашли «виновника».
Использование системного КаталогВременныхФайлов() для веб-сервисов — это часто не самое лучшее решение. Рассмотрим более надежный подход:
C:\ExchangeData\Temp).USR1CV8.Если простые проверки не помогают, проанализируем системные журналы:
Access Denied).ProcMon (Process Monitor) от Sysinternals. Запустите ее, отфильтруйте по процессу rphost.exe, и вы увидите в реальном времени, к какому именно файлу пытается обратиться 1С и какой статус возвращает файловая система.Важное примечание: При настройке HTTPS могут накладываться дополнительные политики безопасности веб-сервера (IIS или Apache). Убедитесь, что пул приложений веб-сервера имеет те же права доступа, что и служба 1С, так как они работают в связке.
Следуя этим рекомендациям, мы сможем быстро локализовать проблему с правами и настроить стабильную работу нашего HTTP-сервиса, избегая непонятных ошибок платформы в будущем.