При разработке и кастомизации конфигураций на платформе 1С:Предприятие 8 разработчики часто сталкиваются с типовой проблемой: при создании документа на основании другого объекта точка останова в процедуре ОбработкаЗаполнения игнорируется отладчиком. Программа открывает форму нового документа, реквизиты заполняются (или не заполняются из-за ошибки в коде), но отладчик просто проходит мимо установленной точки останова.
Давайте подробно разберем, почему так происходит, как устроена клиент-серверная архитектура в этот момент и какие шаги необходимо предпринять, чтобы гарантированно поймать выполнение кода в процедуре ОбработкаЗаполнения.
Главная причина кроется в архитектуре платформы 1С:Предприятие 8.3. Процедура ОбработкаЗаполнения выполняется исключительно на стороне сервера. Когда пользователь нажимает кнопку «Создать на основании», на клиенте еще нет самого объекта документа. Платформа обращается к серверу, создает там экземпляр нового документа, инициализирует его и вызывает процедуру ОбработкаЗаполнения в модуле объекта. Только после того, как объект заполнен, его данные передаются обратно на клиент для отображения в форме.
По умолчанию конфигуратор подключается только к клиентскому сеансу пользователя. Чтобы отладчик мог перехватывать серверные вызовы, сервер 1С должен быть запущен в специальном режиме, а конфигуратор — настроен на автоматическое подключение к серверным процессам.
Рассмотрим пошагово все действия, которые необходимо выполнить для решения этой проблемы.
Если ваша база данных развернута в клиент-серверном варианте (на SQL-сервере), то первым делом необходимо проверить, запущен ли сам сервер 1С:Предприятия с разрешением отладки. По умолчанию в целях оптимизации производительности этот режим выключен.
Для серверов под управлением ОС Windows:
services.msc в строке выполнения Windows).-debug.regedit.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent (название ветки может немного отличаться в зависимости от версии платформы).ImagePath.-debug через пробел. Исходная строка выглядит примерно так:"C:\Program Files\1cv8\8.3.XX.XXXX\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo""C:\Program Files\1cv8\8.3.XX.XXXX\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debugДля серверов под управлением ОС Linux:
Если серверная часть системы работает на Linux, то реестра Windows у нас нет. Нам нужно отредактировать конфигурационный файл службы:
srv1cv83. В зависимости от дистрибутива он может находиться по пути /etc/sysconfig/srv1cv83 (для RedHat/CentOS) или /etc/default/srv1cv83 (для Ubuntu/Debian).SRV1CV8_DEBUG= и установим ей значение 1 (раскомментировав ее при необходимости):SRV1CV8_DEBUG=1systemctl restart srv1cv83Даже если сервер запущен с ключом -debug, Конфигуратор не начнет автоматически отлаживать серверный код, пока мы явно не укажем ему это делать. Настроим автоматическое подключение:
Теперь при запуске отладки (клавишей F5) Конфигуратор будет автоматически цепляться ко всем серверным вызовам, происходящим в рамках вашего сеанса.
Современные версии платформы 1С:Предприятие 8.3 поддерживают два типа протоколов для обмена данными отладки: классический TCP/IP и более современный HTTP (через локальный или удаленный сервер отладки dbg). Если протокол, настроенный на сервере, отличается от протокола в Конфигураторе, точки останова работать не будут.
Проанализируем настройки в Конфигураторе:
-http). Если используется классическая отладка, убедимся, что на сервере 1С не включен принудительный HTTP-режим. Протоколы должны совпадать!При отладке по протоколу TCP/IP сервер 1С должен иметь возможность инициировать обратное сетевое подключение к компьютеру разработчика. Для этого используется стандартный диапазон портов (по умолчанию 1560–1591).
Если вы работаете удаленно или сервер 1С находится на отдельном физическом компьютере в локальной сети, брандмауэр (Firewall) на вашем рабочем компьютере может блокировать входящие пакеты от сервера 1С. Выясним, открыты ли порты, и добавим разрешающее правило:
1560-1591 (для TCP/IP отладки) или конкретный порт отладки для HTTP (обычно 1550).Если все сетевые настройки выполнены верно, но точка останова все равно выглядит блеклой или перечеркнутой (красный кружок с вопросительным знаком), проблема может заключаться в самом коде. Проверим правильность объявления процедуры ОбработкаЗаполнения.
Про процедуру важно знать следующее:
Рассмотрим правильный пример объявления процедуры в модуле объекта документа:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Проверим тип входящих данных
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
// Алгоритм заполнения реквизитов нового документа
Автор = ПараметрыСеанса.ТекущийПользователь;
Сделка = ДанныеЗаполнения;
Контрагент = ДанныеЗаполнения.Контрагент;
ДоговорКонтрагента = ДанныеЗаполнения.ДоговорКонтрагента;
// Заполнение табличной части "Товары"
Для Каждого СтрокаИсточника Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Обратите внимание на параметр ДанныеЗаполнения. Именно в него платформа передает ссылку на объект-основание (в нашем примере это ЗаказПокупателя), из которого мы программно переносим данные в наш новый документ.
Бывают ситуации, когда вы только что написали процедуру, поставили точку останова, нажали F5, но отладчик не останавливается. Возможно, конфигурация базы данных просто не была обновлена. Нажмите клавишу F7 в Конфигураторе или синюю кнопку на панели инструментов («Обновить конфигурацию базы данных»), чтобы изменения вступили в силу.
Если даже после обновления точка останова выглядит неактивной, попробуйте очистить кэш конфигурации. Для этого можно перезапустить службу сервера 1С или временно удалить базу из списка запуска 1С и добавить её заново — это приведет к очистке локального кэша метаданных на компьютере разработчика.
Для успешной отладки процедуры ОбработкаЗаполнения нам необходимо помнить три золотых правила разработчика 1С:
-debug.