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

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

При разработке и доработке механизмов ввода на основании в платформе 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда точка останова в коде упорно игнорируется отладчиком. Проанализируем типовую ситуацию: из документа ЗаказПокупателя вводится документ РеализацияТоваровИУслуг (конфигурация «Управление торговлей 10.3»), но выполнение не останавливается в процедуре ОбработкаЗаполнения(). Разберем по шагам, где именно выполняется алгоритм заполнения и как правильно организовать отладку.

Архитектура механизма ввода на основании

Выясним причину, по которой возникает путаница. При интерактивном или программном вводе одного документа на основании другого платформа 1С работает по строго определенному принципу: инициализируется новый (подчиненный) объект, и именно в его контексте выполняется логика переноса данных из документа-источника.

Событие ОбработкаЗаполнения() принадлежит модулю объекта создаваемого документа (в нашем случае — РеализацияТоваровИУслуг), а не документа-основания (ЗаказПокупателя). В качестве параметра в данную процедуру передается ссылка на исходный документ. Если установить точку останова в модуле объекта ЗаказПокупателя, отладчик в нее никогда не попадет, поскольку документ-основание в этом процессе выступает исключительно источником данных и его собственные события инициализации не вызываются.

Пошаговая локализация и исправление ошибки

Рассмотрим порядок действий для корректной отладки механизма заполнения:

  1. Откроем дерево метаданных конфигурации в конфигураторе.
  2. Найдем создаваемый документ: ветка Документы → РеализацияТоваровИУслуг.
  3. Откроем Модуль объекта именно этого документа.
  4. Найдем экспортную процедуру ОбработкаЗаполнения(Основание) (или ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) в зависимости от версии платформы и режима совместимости).
  5. Установим точку останова внутри данной процедуры и повторим операцию ввода на основании в пользовательском режиме.

Посмотрим на пример типовой структуры процедуры заполнения в модуле объекта документа РеализацияТоваровИУслуг:


Процедура ОбработкаЗаполнения(Основание)
    // Проверяем тип переданного документа-основания
    Если ТипЗнч(Основание) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        // Заполняем реквизиты шапки
        Сделка = Основание;
        Контрагент = Основание.Контрагент;
        ДоговорКонтрагента = Основание.ДоговорКонтрагента;
        Организация = Основание.Организация;
        Склад = Основание.СкладГруппа;
        
        // Заполняем табличную часть по данным заказа
        ЗаполнитьПоЗаказу(Основание);
    КонецЕсли;
КонецПроцедуры

Программный ввод на основании

Разберем особенности создания документов программным путем. Распространенной ошибкой является предположение, что метод СоздатьДокумент() автоматически запускает обработку заполнения. Это не так. Чтобы отработал механизм ввода на основании программно, необходимо явно передать ссылку на основание через метод Заполнить():


// Создаем экземпляр нового документа
НоваяРеализация = Документы.РеализацияТоваровИУслуг.СоздатьДокумент();

// Явно вызываем алгоритм заполнения на основании заказа
НоваяРеализация.Заполнить(СсылкаНаЗаказ);

// Открываем форму для пользователя или записываем объект
НоваяРеализация.Записать(РежимЗаписиДокумента.Запись);

Дополнительные причины, почему не срабатывает точка останова

Если точка останова установлена в модуле целевого документа (РеализацияТоваровИУслуг), но остановка все равно не происходит, проанализируем сопутствующие технические факторы:

  1. Клиент-серверный режим без отладки на сервере: Процедура ОбработкаЗаполнения() выполняется на стороне сервера. Если служба сервера 1С:Предприятия запущена без ключа -debug, точки останова в серверных процедурах срабатывать не будут.
  2. Нестандартный алгоритм ввода: В ряде конфигураций кнопка создания реализации на форме заказа может быть переопределена разработчиками. В таком случае вместо стандартного механизма платформы форма реализации открывается программно, а ее табличные части заполняются напрямую в коде формы заказа без вызова ОбработкаЗаполнения().
  3. Кэширование после динамического обновления: При частом применении механизма «Демонстрационное/динамическое обновление» кэш отладки конфигуратора может рассинхронизироваться. Решением является полный перезапуск конфигуратора и клиентского сеанса с очисткой временных файлов.
  4. Настройки метаданных: Проверим свойства документа РеализацияТоваровИУслуг. На закладке Ввод на основании в списке документов-оснований должен быть обязательно отмечен ЗаказПокупателя.

Особенности заполнения табличной части в УТ 10.3

Обратим внимание на специфику типовой конфигурации «Управление торговлей 10.3». Даже если процедура ОбработкаЗаполнения() успешно отрабатывает, табличная часть «Товары» документа реализации может оказаться пустой. В УТ 10.3 при заполнении на основании заказа платформа выполняет запрос к регистрам накопления для проверки свободных остатков и наличия резервов по указанному заказу. Если товар по заказу еще не поступил на склад, не зарезервирован или заказ уже полностью отгружен ранее, строки в реализацию добавлены не будут — это является штатным поведением типовой бизнес-логики, а не ошибкой платформы.

Альтернативные способы расширения логики без изменения типового кода

Если требуется добавить собственные правила переноса данных из заказа в реализацию, не снимая типовой документ с поддержки, рассмотрим использование механизма Подписок на события:

  1. Создаем в дереве метаданных новый объект ПодпискаНаСобытие.
  2. В свойстве Источник указываем ДокументОбъект.РеализацияТоваровИУслуг.
  3. В свойстве Событие выбираем ОбработкаЗаполнения.
  4. В свойстве Обработчик указываем процедуру в нетиповом общем серверном модуле.

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

← На главную