Почему не работает отладка подписки на событие проведения из управляемой формы 1С 8.3?

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

При разработке и отладке конфигураций на управляемых формах (особенно типовых решений, таких как «Бухгалтерия предприятия 3.0», «ERP Управление предприятием» или «Комплексная автоматизация») программисты часто сталкиваются с загадочным поведением платформы. Мы создаем подписку на событие, например, на ОбработкаПроведения для документа. Пытаемся проверить ее работу: открываем форму документа, нажимаем кнопку «Провести», но отладчик упорно игнорирует точку останова, хотя документ успешно проводится и делает движения по регистрам. При этом, если провести тот же самый документ из формы списка через контекстное меню, отладка срабатывает моментально. Разберем подробно, почему так происходит, и как решить эту проблему раз и навсегда.

В чем кроется причина: особенности проведения документов в БСП

Давайте проанализируем ситуацию. На первый взгляд поведение системы кажется системным сбоем или багом платформы 1С:Предприятие. На самом деле мы имеем дело с комбинацией архитектурных особенностей Библиотеки стандартных подсистем (БСП) и настроек сетевой безопасности вашей операционной системы.

В современных управляемых формах типовых конфигураций стандартные кнопки «Записать», «Провести» и «Провести и закрыть» — это не просто стандартные команды платформы. БСП переопределяет их поведение для оптимизации работы интерфейса. Рассмотрим разницу в механизмах проведения:

  1. Проведение из управляемой формы: Когда пользователь нажимает кнопку проведения в форме, БСП запускает этот процесс асинхронно с помощью механизма длительных операций. На сервере создается отдельное фоновое задание, которое в изолированном сеансе выполняет проведение документа и запись движений. Это предотвращает «зависание» интерфейса клиента на время тяжелых транзакций.
  2. Проведение из списка документов: В этом случае проведение чаще всего выполняется синхронно, непосредственно в контексте текущего серверного сеанса пользователя, без привлечения механизмов длительных операций и фоновых заданий.

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

Почему брандмауэр блокирует отладку фоновых заданий по TCP/IP

При классическом протоколе отладки TCP/IP подключение между Конфигуратором (клиентом отладки) и сервером 1С (предметом отладки) работает по принципу обратного вызова (обратного соединения):

  1. Ваш локальный Конфигуратор сообщает серверу о готовности принимать подключения для отладки.
  2. Когда на сервере стартует фоновое задание проведения, серверный процесс пытается инициировать новое входящее TCP-соединение к вашему рабочему компьютеру.
  3. По умолчанию для этого обратного соединения используется динамический диапазон TCP-портов 1560–1591.
  4. Если на вашем локальном компьютере включен брандмауэр (Windows Firewall) или работает антивирус с сетевым экраном, эти входящие пакеты от сервера к вашему Конфигуратору безжалостно блокируются.

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

Решение 1. Настройка правил брандмауэра на локальном компьютере

Для того чтобы входящие подключения от сервера 1С могли беспрепятственно доходить до вашего Конфигуратора, необходимо настроить локальный сетевой экран. Выполним следующие шаги:

  1. Откройте «Монитор брандмауэра защитника Windows в режиме повышенной безопасности» (команда wf.msc в строке выполнения).
  2. Перейдите в раздел Правила для входящих подключений и выберите «Создать правило».
  3. Выберите тип правила Для программы. Нажмите «Далее».
  4. Укажите путь к исполняемому файлу вашей платформы 1С. Обычно он находится по пути: C:\Program Files\1cv8\8.3.X.XXXX\bin\1cv8.exe (где вместо X.XXXX укажите ваш релиз платформы). Рекомендуется создать правило для всех используемых версий платформы или разрешить входящий трафик для конкретных портов.
  5. Если вы решите настраивать правило для портов, выберите тип правила Для портов, укажите протокол TCP и в поле «Определенные локальные порты» введите диапазон: 1560-1591.
  6. Выберите действие Разрешить подключение.
  7. Укажите профили сети (Доменный, Частный), в которых правило будет активно (для публичных сетей активировать не рекомендуется в целях безопасности).
  8. Задайте правилу понятное имя, например, «1C Debug TCP», и сохраните его.

Решение 2. Настройка автоматического подключения фоновых заданий

Даже при открытых портах Конфигуратор может игнорировать фоновые процессы, если в настройках отладки не задано их автоматическое подключение. Проверим эту настройку:

  1. В главном меню Конфигуратора перейдите в раздел Отладка -> Подключение...
  2. В открывшемся окне найдите и нажмите кнопку Автоматическое подключение.
  3. В списке доступных типов объектов установите флажок напротив пункта Фоновые задания.
  4. Нажмите «ОК» для сохранения параметров.

Теперь при старте любого фонового процесса проведения на сервере отладчик автоматически подключит его к текущему сеансу отладки.

Решение 3. Использование параметра запуска «РежимОтладки»

Если у вас нет прав администратора для настройки брандмауэра или сетевые политики компании строго запрещают открытие входящих портов, вы можете временно отключить асинхронное проведение документов средствами самой БСП. Разработчики библиотеки предусмотрели специальный режим работы приложения.

Для активации этого режима выполните следующие действия:

  1. В Конфигураторе откройте меню Сервис -> Параметры.
  2. Перейдите на вкладку Запуск 1С:Предприятия, далее выберите подвкладку Дополнительные.
  3. В поле «Параметр запуска» введите команду: /C РежимОтладки (обратите внимание на заглавную букву "C" в параметре — она должна быть латинской).
  4. Нажмите кнопку «Применить».

При запуске пользовательского сеанса из Конфигуратора с этим параметром БСП определит его наличие и перенаправит все фоновые задачи (включая проведение документов, формирование отчетов и печатных форм) на выполнение в синхронном режиме в рамках вашего текущего сеанса. Фоновые задания создаваться не будут, транзакция пройдет линейно, и ваша точка останова в подписке на событие гарантированно сработает без изменения каких-либо сетевых настроек.

Также данный режим можно включить непосредственно в режиме «1С:Предприятие» (если это предусмотрено версией вашей БСП): перейдите в раздел Администрирование -> Поддержка и обслуживание -> Отчеты и обработки и установите флаг Режим отладки.

Решение 4. Современная альтернатива — HTTP-отладка

Начиная с версии платформы 8.3.7, фирма 1С добавила альтернативный и более прогрессивный протокол отладки — по протоколу HTTP. В отличие от классического TCP/IP, этот протокол не использует обратные вызовы от сервера к клиенту, что полностью снимает проблему заблокированных брандмауэром портов.

При HTTP-отладке схема взаимодействия выглядит следующим образом:

  1. На сервере приложений 1С (или на отдельном хосте) запускается специальная служба — локальный сервер отладки dbgs.
  2. И Конфигуратор, и фоновые задания на сервере сами отправляют исходящие HTTP-запросы к этому серверу отладки.
  3. Поскольку все запросы являются исходящими, локальные брандмауэры разработчиков не блокируют этот трафик, так как стандартные правила безопасности обычно разрешают любые исходящие веб-соединения.

Для перевода вашей базы на HTTP-отладку необходимо запустить службу сервера 1С с ключом локального сервера отладки (параметр -http) и в настройках Конфигуратора (меню Сервис -> Параметры -> Запуск 1С:Предприятия -> Отладка) выбрать тип отладки по протоколу HTTP, указав адрес вашего сервера отладки.

Мы настоятельно рекомендуем использовать HTTP-отладку при работе в клиент-серверных вариантах баз данных, так как это решает целый класс сетевых проблем и избавляет разработчиков от рутинной настройки портов на локальных рабочих станциях.

← На главную