Разработка внешних обработок для современных конфигураций на базе 1С:Предприятие 8.3, таких как Управление торговлей 11, часто преподносит сюрпризы начинающим и даже опытным разработчикам. Типичная ситуация: вы создаете обработку, пишете процедуру с директивой &НаСервере, нажимаете кнопку, но... ничего не происходит. Кажется, что программа просто игнорирует серверный вызов. В этой статье мы подробно разберем, почему возникает эффект "неработающего кода" и как правильно настроить среду разработки для полноценной работы.
Прежде чем углубляться в настройки сервера, нам необходимо выяснить: код действительно не выполняется или мы просто не видим его выполнения в конфигураторе? Проанализируем простейший способ проверки. Если точка останова "не ловится", это еще не значит, что процессор не заходил в процедуру.
Рассмотрим использование метода Сообщить(). Это самый быстрый способ понять, работает ли серверный контекст. Давайте попробуем вставить в код следующий блок:
&НаКлиенте
Процедура КомандаВыполнить(Команда)
Сообщить("Вызов с клиента выполнен успешно");
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
Сообщить("Серверная процедура запущена!");
// Здесь ваш основной код
КонецПроцедуры
Если после нажатия кнопки вы видите оба сообщения, значит, код выполняется, и проблема заключается исключительно в настройках отладки. Если же сообщение с сервера не появилось, проблема может быть глубже — в механизме вызова или правах доступа.
В клиент-серверном варианте работы (SQL) по умолчанию отладка на сервере часто выключена из соображений производительности. Разберем по шагам, как включить возможность "останавливаться" в серверном коде.
Вариант 1: Отладка по протоколу TCP/IP (через реестр Windows)
Если ваш сервер работает под управлением Windows, выполним следующие действия:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3...ImagePath. В строке запуска в самом конце, после всех кавычек, добавим пробел и флаг -debug.Теперь конфигуратор сможет "подцепляться" к серверным вызовам, и ваши точки останова в процедурах &НаСервере начнут работать.
Вариант 2: Использование HTTP-отладки
Начиная с платформы 8.3.7, компания 1С рекомендует использовать HTTP-отладку. Она работает стабильнее, особенно если сервер находится за брандмауэром. Чтобы ее включить, сервер должен быть запущен с ключом -http. Настройку подключения в самом Конфигураторе мы можем найти в меню Сервис — Параметры — Отладка, выбрав протокол HTTP.
В конфигурациях на базе БСП (Библиотека стандартных подсистем), к которым относится УТ 11, внешние обработки часто запускаются в Безопасном режиме. Это критически важный момент, который часто путают с "невыполнением кода".
Проанализируем ситуацию: если ваша обработка подключена через справочник "Дополнительные отчеты и обработки", система накладывает на нее ограничения. В безопасном режиме запрещены:
Если ваш код на сервере пытается выполнить одно из этих действий, система может молча прервать операцию или вызвать исключение, которое не всегда очевидно при обычном запуске. Чтобы решить эту проблему, в карточке регистрации обработки необходимо снять флаг Безопасный режим или настроить профили безопасности в конфигурации.
Иногда внешняя обработка в УТ 11 инициирует длительные операции, которые выполняются в фоновых заданиях. Выясним причину, почему отладчик их игнорирует. Даже если флаг -debug установлен, вы не попадете в код фонового задания автоматически.
Рассмотрим, как настроить подключение:
Теперь при запуске серверного метода через механизм ФоновыеЗадания.Выполнить() отладчик автоматически перехватит выполнение в нужной точке.
Часто программисты путают директивы &НаСервере и &НаСервереБезКонтекста. Посмотрим на пример ситуации, когда код кажется неработающим из-за потери данных:
&НаСервереБезКонтекста
Процедура РассчитатьДанные(Знач СсылкаНаОбъект)
// Здесь мы не имеем доступа к реквизитам формы напрямую!
// Если мы напишем Объект.Сумма = 100, это вызовет ошибку,
// так как "Объект" не определен в этом контексте.
КонецПроцедуры
Если вы используете &НаСервереБезКонтекста, вы должны передавать все необходимые данные в параметрах и возвращать результат через возвращаемое значение функции. Если разработчик обращается к данным формы в такой процедуре, код может "вылетать" до того, как выполнит полезную нагрузку.
Проанализируем еще одну техническую ловушку. При работе с механизмом "Дополнительные отчеты и обработки" 1С кэширует файл обработки во временном хранилище на сервере. Если вы внесли изменения в модуль объекта, сохранили файл на диске, но не обновили его в справочнике УТ 11, то при запуске система подтянет старую версию из кэша.
В этом случае вам будет казаться, что новый серверный код не выполняется, хотя на самом деле выполняется старый код, в котором ваших изменений еще нет. Всегда перепривязывайте файл в справочнике после правок в конфигураторе.
Если отладка по каким-то причинам недоступна, а Сообщить() не помогает (например, при обрыве соединения), используем самый надежный метод — Журнал регистрации. Рассмотрим пример записи:
&НаСервере
Процедура МояСервернаяОперация()
ЗаписьЖурналаРегистрации("ВнешняяОбработка.Диагностика",
УровеньЖурналаРегистрации.Информация,
,
,
"Серверный метод вызван успешно. Параметры: ...");
Попытка
// Сложный код
Исключение
ЗаписьЖурналаРегистрации("ВнешняяОбработка.Ошибка",
УровеньЖурналаРегистрации.Ошибка,
,
,
ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
После запуска обработки вы сможете открыть Журнал регистрации в интерфейсе "1С:Управление торговлей" и точно увидеть, заходила ли система в процедуру и с каким результатом она завершилась. Это исключает любые гадания на тему "выполняется код или нет".
Подводя итог, можно сказать, что в 90% случаев "невыполнение" серверного кода связано с тем, что программист просто не видит процесс выполнения из-за отсутствия флага -debug или неправильной настройки подключения к фоновым заданиям. В оставшихся 10% виноваты ограничения безопасного режима или кэширование старых версий обработки в информационной базе. Используя методы Сообщить() и ЗаписьЖурналаРегистрации(), вы всегда сможете локализовать проблему и убедиться в работоспособности вашего алгоритма.