Почему HTTP-сервис 1С выдает ошибку при записи файлов и как это исправить?

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

Рассмотрим ситуацию, с которой сталкиваются многие разработчики при переносе или обновлении веб-сервисов: казалось бы, рабочий код внезапно начинает выдавать странные ошибки, причем иногда на английском языке, например, object procedure called as function. Разберем по шагам, как выявить причину и настроить работу сервиса корректно.

Анализ проблемы: поиск корня неполадок

Чаще всего, когда мы видим ошибку при выполнении кода в HTTP-сервисе, мы склонны винить логику программы. Однако, если код ранее работал, а после переноса базы на другой сервер перестал, проблема почти всегда кроется не в программных строках, а в окружении.

В нашей ситуации автор столкнулся с ошибкой при попытке записи файла через ТекстовыйДокумент.Записать(ИмяФайла). Ошибка object procedure called as function в данном случае является побочным эффектом: платформа не может штатно завершить метод, так как операционная система «отбивает» запрос на запись из-за ограничений прав.

Шаг 1: Проверяем права пользователя ОС

Важно помнить, что HTTP-сервис исполняется на стороне сервера не под тем пользователем, который открыл конфигуратор, а под учетной записью, от имени которой запущена служба сервера 1С:Предприятия. По умолчанию в Windows это часто USR1CV8.

Что нужно сделать в первую очередь:

  1. Узнать, от какого пользователя запущена служба 1C:Enterprise Server Agent.
  2. Проверить наличие у этого пользователя прав на запись в целевую директорию. В примере автора использовался путь КаталогВременныхФайлов(), который разворачивается в профиль пользователя USR1CV8. Если после переезда сервера профиль был пересоздан или права в нем сбросились, серверу 1С будет отказано в доступе.

Шаг 2: Анализируем код на наличие ошибок

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


Функция DocValidPOST(HTTPСервисЗапрос)
    Попытка
        Результат = HTTPСервисЗапрос.ПолучитьТелоКакСтроку();
        ИмяФайла = КаталогВременныхФайлов() + "zzz_txt_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_ччММсс") + ".txt";
        Док = новый ТекстовыйДокумент;
        Док.УстановитьТекст(Результат);
        Док.Записать(ИмяФайла); // Здесь происходит ошибка доступа
    Исключение
        ЗаписьЖурналаРегистрации("Запрос ", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    КонецПопытки;
    // ... дальнейшая логика
КонецФункции

Если при выполнении метода Записать мы получаем отказ, отладчик может вести себя непредсказуемо. Если вы подозреваете права, попробуйте временно предоставить полные права на папку Temp для пользователя службы. Если после этого ошибка исчезнет, значит, мы точно нашли «виновника».

Шаг 3: Оптимизация работы с временными файлами

Использование системного КаталогВременныхФайлов() для веб-сервисов — это часто не самое лучшее решение. Рассмотрим более надежный подход:

  1. Создайте отдельную папку на диске сервера (например, C:\ExchangeData\Temp).
  2. Явно выдайте права на эту папку (чтение и запись) пользователю USR1CV8.
  3. Используйте этот путь в коде вместо динамического поиска временной папки профиля. Это сделает ваш сервис независимым от настроек профиля пользователя службы.

Шаг 4: Анализ диагностических данных

Если простые проверки не помогают, проанализируем системные журналы:

Важное примечание: При настройке HTTPS могут накладываться дополнительные политики безопасности веб-сервера (IIS или Apache). Убедитесь, что пул приложений веб-сервера имеет те же права доступа, что и служба 1С, так как они работают в связке.

Следуя этим рекомендациям, мы сможем быстро локализовать проблему с правами и настроить стабильную работу нашего HTTP-сервиса, избегая непонятных ошибок платформы в будущем.

← На главную