При переходе с файловой базы на клиент-серверный вариант работы программисты часто сталкиваются с тем, что привычные механизмы, такие как ПодключитьОбработчикОжидания, перестают вести себя предсказуемо. Процедуры не вызываются, точки останова игнорируются, а диагностика проблемы осложняется разделением контекстов выполнения. Разберем подробно, почему так происходит и как заставить ваш код работать стабильно.
Первым делом проанализируем, где именно находится вызываемая процедура. Согласно требованиям платформы «1С:Предприятие», процедура, подключаемая через обработчик ожидания, должна удовлетворять жестким правилам. Она должна располагаться либо в модуле управляемого приложения (или обычного приложения), либо в глобальном общем модуле. Процедура обязательно должна быть экспортируемой и не иметь параметров.
Рассмотрим важный нюанс с именованием. Если ваш общий модуль не помечен свойством Глобальный, то обращение к процедуре по короткому имени "Куку" работать не будет. В этом случае необходимо указывать полное имя, включающее название модуля. Посмотрим на пример правильного вызова для неглобального модуля:
// Если общий модуль называется "РаботаСФайламиКлиент"
ПодключитьОбработчикОжидания("РаботаСФайламиКлиент.Куку", 10);
Если же вы используете короткое имя, убедитесь, что в свойствах общего модуля стоят галочки Глобальный и Клиент (управляемое приложение) или Клиент (обычное приложение). Если флаг Глобальный не установлен, система просто не «увидит» процедуру в глобальном контексте и вызов будет проигнорирован без вывода ошибки.
Проанализируем ситуацию, когда код физически выполняется, но не делает того, что от него ожидается (например, не видит файл). В клиент-серверном режиме крайне важно понимать, где выполняется код. Обработчик ожидания всегда запускается на клиенте. Это означает, что если внутри процедуры Куку вы проверяете наличие файла, путь к нему должен быть доступен именно с локального компьютера пользователя.
Если вы используете Толстый клиент, убедитесь, что все необходимые библиотеки (DLL) зарегистрированы на клиентской машине. Рассмотрим типичную ошибку: проверка пути, который существует на сервере, но недоступен клиенту. Для диагностики рекомендуем добавить в код временный вывод сообщений, так как отладчик может подвести. Выясним причину отсутствия реакции с помощью метода Сообщить():
Процедура Куку() Экспорт
Сообщить("Обработчик сработал в: " + ТекущаяДата());
// Ваш код проверки файла
Путь = "C:\Temp\faks.txt";
ВыбФайл = Новый Файл(Путь);
Если ВыбФайл.Существует() Тогда
Сообщить("Файл найден!");
КонецЕсли;
КонецПроцедуры
Теперь разберем, почему точка останова может не срабатывать, даже если код выполняется. В клиент-серверной базе существует два разных «предмета отладки»: процесс сервера и процесс клиента. Если вы успешно отлаживаете серверные процедуры, это не означает, что отладчик подключен к клиентскому сеансу.
Выполним следующие шаги для настройки отладки:
1560–1591.-debug).Выясним еще одну важную деталь: ПодключитьОбработчикОжидания не гарантирует выполнение секунда в секунду. Платформа 1С является однопоточной в плане интерфейса. Это значит, что обработчик сработает только тогда, когда система находится в состоянии «покоя» — когда не выполняются другие длительные операции на встроенном языке и не открыты модальные окна.
Рассмотрим ситуацию: если вы вызвали ПодключитьОбработчикОжидания, а затем сразу запустили тяжелый цикл или открыли модальный вопрос пользователю (Вопрос(), Предупреждение() в старом стиле), обработчик будет «стоять в очереди» до тех пор, пока окно не закроется или цикл не завершится. В клиент-серверных базах, где задержки сети могут быть значительными, это проявляется острее.
Для надежной работы системы мониторинга файлов (например, для кассового оборудования), следуйте этим советам:
Посмотрим на пример безопасного включения/выключения:
Процедура ПриОткрытии()
ПодключитьОбработчикОжидания("ПроверитьФайлыДляПечати", 10);
КонецПроцедуры
Процедура ПроверитьФайлыДляПечати() Экспорт
ОтключитьОбработчикОжидания("ПроверитьФайлыДляПечати");
Попытка
// Логика работы с файлом и DLL
Исключение
ЗаписьЖурналаРегистрации("Ошибка печати", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
ПодключитьОбработчикОжидания("ПроверитьФайлыДляПечати", 10);
КонецПроцедуры
Подводя итог, можно сказать, что «молчание» обработчика ожидания в серверной базе чаще всего вызвано либо неверным указанием имени процедуры (модуля), либо тем, что отладчик просто не видит клиентский процесс из-за сетевых ограничений. Проверьте настройки портов и используйте Сообщить() для первичной проверки факта запуска кода.