Как исправить ошибку при создании объекта обработки в обработчике ожидания?

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

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

Анализ причин возникновения ошибок

Первая и самая очевидная причина ошибки — синтаксическая неточность. В платформе 1С глобальная коллекция называется Обработки (во множественном числе). Обращение через Обработка (в единственном числе) приведет к ошибке, так как система будет пытаться найти переменную с таким именем, которая не определена в данном контексте.

Вторая, более глубокая причина, кроется в клиент-серверной архитектуре управляемого приложения. Проанализируем доступность метода Создать() для объектов типа ОбработкаМенеджер. Этот метод доступен только на сервере, в толстом клиенте или во внешнем соединении. В тонком клиенте, где обычно выполняется модуль управляемого приложения и работают формы, коллекция Обработки практически не имеет функционала для создания объектов.

Рассмотрим по шагам, как правильно выстроить взаимодействие между клиентом и сервером при работе с обработчиком ожидания.

Шаг 1. Настройка модуля управляемого приложения

Процедура, которую мы подключаем через ПодключитьОбработчикОжидания, всегда должна находиться на стороне клиента (обычно это модуль управляемого приложения или модуль формы). Это связано с тем, что сам механизм ожидания работает в контексте клиентского сеанса пользователя.

Пример инициализации в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    // Подключаем процедуру "ПроверкаСтатусовНаКлиенте" с интервалом 20 секунд
    ПодключитьОбработчикОжидания("ПроверкаСтатусовНаКлиенте", 20);
КонецПроцедуры

Процедура ПроверкаСтатусовНаКлиенте() Экспорт
    // Здесь нельзя писать Обработки.ИмяОбработки.Создать()!
    // Мы должны вызвать процедуру из серверного модуля.
    ПроверкаСтатусовСервер.ВыполнитьПроверку();
КонецПроцедуры

Шаг 2. Создание и настройка серверного общего модуля

Выясним причину, по которой даже после переноса кода в общий модуль может возникнуть ошибка "Переменная не определена" при обращении к имени модуля. Это происходит из-за неправильной настройки свойств (галочек) общего модуля. Чтобы клиентская часть кода "увидела" серверный модуль, необходимо соблюсти следующие условия:

  1. Сервер: Флаг должен быть установлен, так как создание объекта обработки возможно только здесь.
  2. Вызов сервера: Этот флаг критически важен. Он позволяет обращаться к процедурам этого модуля из клиентского контекста (из нашего обработчика ожидания).
  3. Клиент (управляемое приложение): Рекомендуется также установить этот флаг, чтобы модуль был виден компилятору на стороне клиента, иначе при проверке кода в тонком клиенте система выдаст ошибку "Переменная не определена".

Важное замечание: Внутри общего модуля нельзя использовать директивы компиляции типа &НаСервере или &НаКлиенте. Контекст выполнения общего модуля определяется исключительно его свойствами в дереве конфигурации. Если установлен флаг "Сервер", то весь код модуля по умолчанию считается серверным.

Шаг 3. Реализация серверной логики

Теперь проанализируем, как должен выглядеть код внутри серверного общего модуля (например, с именем ПроверкаСтатусовСервер). Здесь мы уже можем свободно работать с объектами базы данных и коллекцией Обработки.


// В общем модуле "ПроверкаСтатусовСервер"
// Свойства модуля: Сервер, Вызов сервера, Клиент (упр. прил.)

Процедура ВыполнитьПроверку() Экспорт
    // Теперь мы на сервере, создание объекта разрешено
    ОбработкаОбъект = Обработки.ПроверкаСтатусовЗаказов.Создать();
    
    // Вызываем экспортный метод обработки, выполняющий основную логику
    ОбработкаОбъект.ВыполнитьДействие();
КонецПроцедуры

Оптимизация: Использование фоновых заданий

Разберем ситуацию, когда проверка статусов занимает длительное время (более 1–2 секунд). Если вызывать такую процедуру напрямую через ПодключитьОбработчикОжидания, интерфейс пользователя будет "замирать" каждые 20 секунд на время выполнения серверного кода. Это крайне негативно сказывается на комфорте работы.

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

Пример использования фонового задания:


Процедура ПроверкаСтатусовНаКлиенте() Экспорт
    // Запускаем процедуру общего модуля в фоновом режиме
    // Это не блокирует работу пользователя
    ФоновыеЗадания.Выполнить("ПроверкаСтатусовСервер.ВыполнитьПроверку");
КонецПроцедуры

В этом случае пользователь даже не заметит, что система выполняет тяжелые вычисления в фоновом режиме. Однако стоит помнить, что фоновые задания нельзя запускать слишком часто, чтобы не перегрузить сервер 1С.

Альтернатива: Регламентные задания

Если ваша задача (например, проверка статусов заказов) должна выполняться независимо от того, открыта ли программа у конкретного пользователя, правильнее будет использовать Регламентные задания. Рассмотрим преимущества этого метода:

Для реализации регламентного задания достаточно создать новый объект в ветке "Общие -> Регламентные задания", указать метод общего модуля (наш ВыполнитьПроверку) и настроить расписание.

Резюме и рекомендации

Подведем итоги нашего анализа. Для корректной работы с обработчиком ожидания и объектами обработок необходимо:

  1. Использовать правильное имя коллекции — Обработки.
  2. Всегда разделять клиентскую логику (запуск обработчика) и серверную (создание объекта).
  3. Правильно настраивать свойства общих модулей, не забывая про флаг "Вызов сервера".
  4. Избегать использования директив &НаСервере в общих модулях.
  5. Для тяжелых операций отдавать предпочтение фоновым или регламентным заданиям, чтобы не блокировать работу пользователей.

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

← На главную