Почему отладчик не заходит в форму выбора в расширении и как настроить фильтрацию по категории?

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

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

Часть 1. Почему отладчик «игнорирует» код в расширении

Разберем по шагам, почему при попытке зайти в процедуры ПриСозданииНаСервере или ПриОткрытии формы, созданной в расширении, отладчик может не срабатывать. Проанализируем основные причины этой проблемы:

  1. Флаг «Отладка» в управлении расширениями. Это самая частая причина. В окне «Расширения конфигурации» (меню Конфигурация — Расширения) для каждого конкретного расширения есть колонка «Отладка». Если эта галочка не установлена, платформа не будет загружать отладочную информацию для этого модуля, и точки останова останутся «пустыми» кружками.
  2. Режим безопасности. Рассмотрим ситуацию, когда расширение подключено с установленным флажком «Безопасный режим». Это может накладывать ограничения на выполнение определенных операций. Хотя это не блокирует отладку напрямую, это может изменять логику вызова процедур, из-за чего выполнение кода идет по иному пути.
  3. Использование протокола HTTP для отладки. В современных версиях платформы (начиная с 8.3.15+) по умолчанию часто используется HTTP-отладка. Иногда возникает задержка между обновлением кода в расширении и обновлением конфигурации в сеансе отладчика. В таких случаях рекомендуется выполнить команду «Очистить кэш» в настройках подключения базы или перезапустить службу сервера 1С.
  4. Явное указание имени формы. Выясним причину, связанную с программным вызовом. Если форма открывается методом ОткрытьФорму(), проверьте, как указано имя. Если вы создали новую форму в расширении, её путь может выглядеть так: Справочник.ВашСправочник.Форма.ФормаВыбора.Расширение1. Если же вы используете типовое имя, убедитесь, что форма в расширении установлена как Основная форма выбора или она замещает типовую.
  5. Аннотации методов. Если вы используете механизмы &Вместо, &Перед или &После, проверьте точность написания имени перекрываемой процедуры. Ошибка в одном символе приведет к тому, что платформа не свяжет ваш код с событием, и отладчик в него не попадет.

Часть 2. Реализация зависимых фильтров в формах выбора

Рассмотрим практическую задачу: в расширении есть справочник ТарифыИтс, а в типовой конфигурации — справочник Договоры. В договоре есть поле Тариф и поле Категория. Нам нужно сделать так, чтобы при выборе тарифа пользователь видел только те записи, у которых Категория совпадает с уже выбранной в договоре.

Способ 1. Использование «Связей параметров выбора» (Рекомендуемый)

Это наиболее правильный и производительный метод, так как он работает на уровне платформенных механизмов без написания лишнего кода. Разберем, как это настроить:

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

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

Способ 2. Программная установка параметров выбора

Иногда логика фильтрации сложнее, чем простое равенство реквизитов. В этом случае мы можем управлять параметрами программно. Рассмотрим пример кода в модуле формы договора, который выполняется при изменении категории:


&НаКлиенте
Процедура КатегорияПриИзменении(Элемент)
    
    // Формируем массив параметров выбора
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Категория", Объект.Категория);
    
    НовыйМассив = Новый Массив();
    НовыйМассив.Добавить(НовыйПараметр);
    
    // Создаем фиксированный массив для передачи в свойства элемента
    НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
    
    // Устанавливаем параметры для поля Тариф
    Элементы.Тариф.ПараметрыВыбора = НовыеПараметры;
    
КонецПроцедуры

В этом примере мы используем объект ПараметрВыбора, который принимает имя отбора и значение. Обратите внимание, что свойство ПараметрыВыбора элемента формы принимает только ФиксированныйМассив. Этот метод позволяет динамически менять условия поиска в зависимости от действий пользователя.

Способ 3. Перехват события НачалоВыбора

Если нам нужно полностью контролировать процесс открытия формы выбора, проанализируем использование события НачалоВыбора. Это полезно, когда нужно открыть не стандартную форму, а какую-то специфическую или передать очень сложный набор параметров.


&НаКлиенте
Процедура ТарифНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие формы
    СтандартнаяОбработка = Ложь;
    
    // Формируем структуру параметров
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("Отбор", Новый Структура("Категория", Объект.Категория));
    ПараметрыОткрытия.Вставить("ЗакрыватьПриВыборе", Истина);
    
    // Открываем форму выбора справочника ТарифыИтс
    ОткрытьФорму("Справочник.ТарифыИтс.ФормаВыбора", ПараметрыОткрытия, Элемент);
    
КонецПроцедуры

Здесь важно помнить: если вы переопределяете СтандартнаяОбработка = Ложь, вы берете на себя всю ответственность за передачу параметров и возврат выбранного значения в поле ввода.

Важные нюансы при работе с динамическими списками

Посмотрим на ситуацию со стороны формы выбора. Чтобы вышеуказанные способы (особенно первый) работали корректно, основная таблица формы выбора (обычно это Список типа ДинамическийСписок) должна иметь:

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

← На главную