При разработке и отладке конфигураций в среде «1С:Предприятие» программисты часто сталкиваются с ситуацией, когда расставленные в коде точки останова упорно игнорируются системой. При этом сама программа работает, а если совершить в коде синтаксическую ошибку, платформа незамедлительно сообщает о ней при компиляции или запуске. Такая ситуация может поставить в тупик даже того, кто уже имеет базовый опыт программирования.
В этой статье мы подробно разберем, почему возникает такое поведение системы, детально проанализируем основную причину, описанную на форуме, а также рассмотрим другие глубокие технические аспекты платформы 1С, которые могут приводить к «неработающей» отладке.
Рассмотрим классическую ситуацию. Разработчик создает новую форму элемента справочника и вручную пишет в ее модуле следующий код:
Процедура ПриОткрытии()
Наименование=".";
НоменклатураИсходная=Справочники.Номенклатура.НайтиПоКоду("n000003776");
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
й=1;
КонецПроцедуры
Затем в тексте этих процедур устанавливаются точки останова. Мы запускаем сеанс «1С:Предприятие», открываем элемент справочника или пытаемся его записать, но отладчик не реагирует. При этом, если специально допустить синтаксическую ошибку (например, написать й=;), система выдаст предупреждение. Почему так происходит?
Дело в том, что компилятор 1С проверяет синтаксис всего модуля формы целиком при его загрузке. Именно поэтому любая синтаксическая ошибка сразу «ругается» при попытке обращения к форме. Однако сами процедуры ПриОткрытии и ПередЗаписью при этом не выполняются. Платформа просто не знает, что их нужно вызвать, так как они не связаны с событиями формы.
Выясним, как правильно связать написанный код с событиями интерфейса по шагам:
ПриОткрытии) или Перед записью (для процедуры ПередЗаписью).Важный совет: чтобы избежать подобных ошибок в будущем, никогда не пишите заготовки обработчиков событий вручную с нуля. Всегда создавайте их через палитру свойств формы или контекстное меню элементов управления. В этом случае платформа автоматически пропишет правильные имена, параметры процедур, необходимые директивы компиляции (такие как &НаКлиенте или &НаСервере) и гарантированно свяжет их с нужными событиями.
Помимо банальной непривязки событий в свойствах формы, в экосистеме «1С:Предприятие» существует целый ряд других причин, из-за которых точки останова могут не срабатывать. Проанализируем их подробнее.
Если ваша база данных работает в клиент-серверном режиме (на базе MS SQL Server, PostgreSQL и др.), то значительная часть кода (включая серверные процедуры модулей управляемых форм, модули менеджеров и объектов) выполняется на стороне сервера 1С.
По умолчанию сервер «1С:Предприятия» запускается без разрешения отладки в целях оптимизации производительности. Если этот режим выключен, любые точки останова, установленные в серверном коде, будут просто игнорироваться отладчиком.
Для исправления этой ситуации выполним следующие действия:
regedit), перейдем к ветке службы сервера 1С (обычно это HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent...). Найдем параметр ImagePath и добавим в конец строки запуска ключ -debug. После этого перезапустим службу сервера приложений./etc/sysconfig/srv1cv83 или соответствующий unit-файл в systemd), раскомментируем или добавим переменную SRV1CV8_DEBUG=1, после чего выполним перезапуск службы.Современные типовые конфигурации часто выносят длительные операции (проведение документов, сложные расчеты, заполнение реквизитов) в фоновые задания, чтобы не блокировать интерфейс пользователя.
По умолчанию конфигуратор не перехватывает выполнение кода в фоновом режиме, так как эти задания запускаются в изолированных сессиях на сервере. Чтобы отладчик начал реагировать на точки останова в фоновом задании, выполним настройку автоматического подключения:
После этого отладчик будет автоматически перехватывать все новые фоновые процессы, инициализированные из вашего текущего сеанса.
При использовании классической отладки по протоколу TCP/IP между компьютером разработчика и сервером 1С устанавливается прямое сетевое соединение.
Если брандмауэр (файрвол) на локальном компьютере или на сервере блокирует сетевые пакеты, отладчик может видеть запущенные сеансы, но при попытке остановить выполнение на строке кода соединение сбросится, и точка останова не сработает.
Для решения этой проблемы необходимо открыть диапазон портов (по умолчанию для отладки выделяется пул портов в диапазоне 1560–1591) для входящих и исходящих соединений как на стороне сервера приложений, так и на локальном компьютере разработчика.
В современных версиях платформы 1С (начиная с версии 8.3.7) активно применяется инновационный механизм отладки по протоколу HTTP. Он работает через специальную службу публикации отладки (модуль dbgs). Это критически важно при отладке мобильных приложений, веб-клиентов или баз, опубликованных на веб-серверах IIS/Apache.
Если база опубликована на веб-сервере, точки останова могут не работать, если параметры отладки не прописаны в конфигурационном файле публикации default.vrd. Убедимся, что внутри тега <point> вашего файла публикации прописана строка, разрешающая отладку, например:
<debug enable="true" url="http://localhost:1560" />
Также в самом конфигураторе в меню Сервис — Параметры — вкладка Запуск 1С:Предприятия — Отладка должен быть выбран верный протокол отладки (HTTP вместо TCP/IP).
Динамическое обновление (так называемое «демоническое» обновление конфигурации без отключения пользователей) — очень удобный инструмент, но у него есть неприятный побочный эффект. Локальный кэш конфигурации на компьютере пользователя или сервере может рассинхронизироваться.
В этом случае платформа физически продолжает исполнять старую версию программного кода, в которой вашей точки останова просто не существовало, либо «съезжают» номера строк, из-за чего отладчик промахивается мимо нужного участка.
Решить эту проблему можно следующими способами:
%LocalAppData%\1C\1Cv8 и %AppData%\1C\1Cv8).Если в вашей информационной базе установлены расширения, они могут кардинально менять логику выполнения кода стандартных справочников. Если в расширении создана процедура-перехватчик с аннотацией &Вместо для того же события (например, ПередЗаписью) и внутри нее не вызывается метод ПродолжитьВызов(), то оригинальный код основной конфигурации никогда не получит управление. Соответственно, точка останова в вашем основном модуле формы не сработает.
Всегда проверяйте список активных расширений в меню Конфигурация — Расширения конфигурации и анализируйте их программный код на предмет перехвата управления.