При разработке в среде 1С:Предприятие 8.3 с использованием механизма расширений программисты часто сталкиваются с двумя типами проблем. Первая — чисто техническая: «потеря» фокуса отладчика, когда точки останова в расширении просто игнорируются. Вторая — архитектурная: как правильно реализовать зависимые фильтры, чтобы при выборе одного значения (например, категории) список выбора другого поля автоматически ограничивался. В этой статье мы подробно разберем обе ситуации, опираясь на практический опыт и внутренние механизмы платформы.
Разберем по шагам, почему при попытке зайти в процедуры ПриСозданииНаСервере или ПриОткрытии формы, созданной в расширении, отладчик может не срабатывать. Проанализируем основные причины этой проблемы:
ОткрытьФорму(), проверьте, как указано имя. Если вы создали новую форму в расширении, её путь может выглядеть так: Справочник.ВашСправочник.Форма.ФормаВыбора.Расширение1. Если же вы используете типовое имя, убедитесь, что форма в расширении установлена как Основная форма выбора или она замещает типовую.&Вместо, &Перед или &После, проверьте точность написания имени перекрываемой процедуры. Ошибка в одном символе приведет к тому, что платформа не свяжет ваш код с событием, и отладчик в него не попадет.Рассмотрим практическую задачу: в расширении есть справочник ТарифыИтс, а в типовой конфигурации — справочник Договоры. В договоре есть поле Тариф и поле Категория. Нам нужно сделать так, чтобы при выборе тарифа пользователь видел только те записи, у которых Категория совпадает с уже выбранной в договоре.
Это наиболее правильный и производительный метод, так как он работает на уровне платформенных механизмов без написания лишнего кода. Разберем, как это настроить:
Договоры (или само поле в дереве метаданных расширения).Тариф.Отбор.Категория (здесь «Категория» — это имя реквизита в справочнике ТарифыИтс, по которому идет фильтрация).Объект.Категория).После этой настройки платформа автоматически при открытии формы выбора тарифа передаст туда параметр отбора. Если в справочнике ТарифыИтс настроено автозаполнение динамического списка, фильтр применится мгновенно.
Иногда логика фильтрации сложнее, чем простое равенство реквизитов. В этом случае мы можем управлять параметрами программно. Рассмотрим пример кода в модуле формы договора, который выполняется при изменении категории:
&НаКлиенте
Процедура КатегорияПриИзменении(Элемент)
// Формируем массив параметров выбора
НовыйПараметр = Новый ПараметрВыбора("Отбор.Категория", Объект.Категория);
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НовыйПараметр);
// Создаем фиксированный массив для передачи в свойства элемента
НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
// Устанавливаем параметры для поля Тариф
Элементы.Тариф.ПараметрыВыбора = НовыеПараметры;
КонецПроцедуры
В этом примере мы используем объект ПараметрВыбора, который принимает имя отбора и значение. Обратите внимание, что свойство ПараметрыВыбора элемента формы принимает только ФиксированныйМассив. Этот метод позволяет динамически менять условия поиска в зависимости от действий пользователя.
Если нам нужно полностью контролировать процесс открытия формы выбора, проанализируем использование события НачалоВыбора. Это полезно, когда нужно открыть не стандартную форму, а какую-то специфическую или передать очень сложный набор параметров.
&НаКлиенте
Процедура ТарифНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное открытие формы
СтандартнаяОбработка = Ложь;
// Формируем структуру параметров
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Отбор", Новый Структура("Категория", Объект.Категория));
ПараметрыОткрытия.Вставить("ЗакрыватьПриВыборе", Истина);
// Открываем форму выбора справочника ТарифыИтс
ОткрытьФорму("Справочник.ТарифыИтс.ФормаВыбора", ПараметрыОткрытия, Элемент);
КонецПроцедуры
Здесь важно помнить: если вы переопределяете СтандартнаяОбработка = Ложь, вы берете на себя всю ответственность за передачу параметров и возврат выбранного значения в поле ввода.
Посмотрим на ситуацию со стороны формы выбора. Чтобы вышеуказанные способы (особенно первый) работали корректно, основная таблица формы выбора (обычно это Список типа ДинамическийСписок) должна иметь:
Категория), присутствует в выборке и не является вычисляемым полем со сложной логикой, которая может конфликтовать с автоматическим отбором.Таким образом, мы выяснили, что для успешной работы в расширении необходимо следить за настройками отладки в конфигураторе и активно использовать механизмы связей параметров выбора, которые минимизируют объем кода и упрощают поддержку конфигурации.