Почему в 1С возникает ошибка «Ожидается определение процедуры/функции» при использовании Асинх через веб-сервер?

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

В практике разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда один и тот же программный код идеально работает в толстом или тонком клиенте при прямом подключении к базе, но выдает критическую ошибку при попытке запуска через веб-сервер. Особенно остро эта проблема проявилась с внедрением асинхронного программирования. Рассмотрим детально ситуацию, когда при открытии формы или выполнении обработки система сообщает об отсутствии определения процедуры, хотя визуально в модуле всё описано верно.

Анализ проблемы и симптомов

Разберем типичный сценарий: у нас есть процедура, помеченная ключевым словом Асинх (Async). Она предназначена для работы с файловой системой или другими неблокирующими операциями. При запуске через веб-клиент или через тонкий клиент, подключенный по протоколу HTTP/HTTPS, система выдает ошибку: «Ожидается определение процедуры/функции». При этом поиск по тексту модуля подтверждает наличие метода.

Выясним причину такого поведения. Ключевое слово Асинх было введено в платформу для поддержки современной модели асинхронности (начиная с версии 8.3.18). Когда клиент обращается к базе через веб-сервер, за интерпретацию и передачу кода отвечает модуль расширения веб-сервера (например, isapi_1glw.dll для IIS или wsap24.dll для Apache). Если версия этого модуля «старше», чем версия платформы, на которой написан код, или если веб-клиент не может транслировать этот код в JavaScript, возникает синтаксическая ошибка еще на этапе загрузки модуля.

Проанализируем пример кода, который может вызвать подобное поведение:


&НаКлиенте
Асинх Процедура НайтиСтраницу(НазваниеКаталога, ОргинальноеИмя, Файлы, Путь)
    Результат = Ждать ВопросАсинх("Продолжить поиск?", РежимДиалогаВопрос.ДаНет);
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Логика поиска
    КонецЕсли;
КонецПроцедуры

Если веб-сервер использует устаревшие компоненты, он «спотыкается» на слове Асинх, не понимает его и считает, что определение процедуры вообще отсутствует.

Решение 1: Проверка и обновление расширения веб-сервера

Первым делом проверим соответствие версий. Часто администраторы обновляют серверную часть 1С и платформу на рабочих станциях, но забывают обновить публикацию на веб-сервере. В итоге веб-сервер продолжает использовать библиотеки от старого релиза, который ничего не знает про Асинх.

Выполним следующие шаги для актуализации публикации:

  1. Запустим Конфигуратор от имени администратора.
  2. Перейдем в меню Администрирование — Публикация на веб-сервере....
  3. В открывшемся окне обратим внимание на путь к расширению. Он должен указывать на папку с текущей (актуальной) версией платформы.
  4. Нажмем кнопку Опубликовать. Система перезапишет файлы конфигурации веб-сервера и обновит ссылки на библиотеки.

Проверим файл default.vrd. В нем должна быть указана корректная строка подключения. Иногда стоит полностью удалить публикацию из списка веб-сервера (например, в консоли управления IIS) и создать её заново из 1С.

Решение 2: Очистка серверного кэша и перезапуск служб

Если обновление публикации не помогло, проанализируем ситуацию с кэшированием. Веб-серверы (особенно IIS) агрессивно кэшируют скомпилированные модули. Даже после изменения кода в базе, сервер может пытаться отдать клиенту старую версию «бинарного» представления модуля.

Рассмотрим порядок полной очистки временных файлов на стороне сервера:

  1. Остановим службу веб-сервера (например, World Wide Web Publishing Service для IIS или службу Apache).
  2. Перейдем в каталог временных файлов пользователя, под которым запущен пул приложений 1С. Обычно это C:\Windows\Temp\1C или профиль локальной службы.
  3. Удалим все папки с именами вида v8remote_... и содержимое папок кэша.
  4. Очистим сеансовые данные в консоли администрирования сервера 1С:Предприятие.
  5. Запустим службу веб-сервера снова.

Посмотрим на ситуацию с точки зрения IIS. Рекомендуется также зайти в консоль управления IIS, выбрать ваш пул приложений (Application Pool) и выполнить команду Recycle (Переработка). Это принудительно завершит рабочие процессы и создаст их заново с чистой памятью.

Решение 3: Контекст исполнения и режим совместимости

Выясним, не связана ли проблема с режимом совместимости конфигурации. Если в проблемной базе установлен режим совместимости с версиями ниже 8.3.18, использование Асинх может вести себя непредсказуемо, особенно в веб-клиенте. Платформа может блокировать использование новых синтаксических конструкций, чтобы обеспечить работу на старых движках.

Проанализируем настройки:

  1. В Конфигураторе откроем свойства корневого объекта Конфигурация.
  2. Найдем свойство Режим совместимости.
  3. Если он ниже 8.3.18, а вы используете асинхронные методы, это и есть причина ошибки. Нужно либо повысить режим совместимости, либо отказаться от использования Асинх в пользу стандартных процедур обратного вызова через ОписаниеОповещения.

Важно помнить, что веб-клиент — это, по сути, трансляция кода 1С в JavaScript. Если вы поместили процедуру с Асинх в модуль, который не предназначен для веб-клиента или имеет некорректные флаги компиляции (например, только «Сервер» без «Клиент (управляемое приложение)»), интерпретатор веб-браузера не сможет корректно построить дерево вызовов.

Решение 4: Диагностика конкретного рабочего места

Если ошибка воспроизводится только в одной базе на одном сервере, но работает в других, сравним файлы default.vrd. Рассмотрим пример структуры этого файла:


<vrs:point xmlns:vrs="http://v8.1c.ru/8.2/virtual-resource-system"
        base="/MyBase"
        ib="Srvr="MyServer";Ref="MyBase";">
    <vrs:standardOdata enable="false"/>
    <vrs:analytics enable="false"/>
</vrs:point>

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

Подведем итог: чаще всего проблема «невидимости» асинхронных процедур через веб-сервер кроется в несоответствии версии модуля расширения веб-сервера фактической версии платформы или в зависшем кэше пула приложений. Регулярная перепубликация базы после обновлений и контроль режима совместимости позволяют избежать подобных ошибок.

← На главную