Где передаются параметры в форму выбора реквизита и почему пуст стек вызовов?

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

Нередко при сопровождении типовых или доработке нетиповых конфигураций возникает ситуация: у реквизита в дереве метаданных (например, в табличной части) жестко задана форма выбора. При интерактивном открытии подбора в пользовательском режиме форма открывается с уже установленными отборами и контекстными данными, однако явного вызова метода ОткрытьФорму() в коде формы документа нет. Более того, если поставить точку останова в обработчике ПриСозданииНаСервере открываемой формы выбора, стек вызовов показывает только текущую строку инициализации самой формы. Разберем подробно, почему так происходит, какова внутренняя механика платформы 1С и где именно формируются эти параметры.

Выясним причину: почему стек вызовов пуст

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

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

Механизм связей параметров выбора

Проанализируем основное место, где формируются отборы. В типовых решениях (в частности, в ERP и КА при работе со спецификациями или номенклатурой) активно используется программная настройка связей параметров выбора.

Платформа предоставляет механизм СвязиПараметровВыбора. Эти связи могут задаваться как статически в дереве метаданных у реквизита, так и динамически переопределяться на уровне элемента формы. При этом свойства элемента управления на форме всегда имеют приоритет над свойствами реквизита из метаданных.

В типовых конфигурациях при открытии формы документа вызываются методы общих модулей, которые программно инициализируют связи полей ввода. Посмотрим, как это выглядит на практике:


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

Элементы.ТоварыСпецификация.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);

После применения этой настройки платформа 1С автоматически берет на себя всю рутинную работу:

  1. При нажатии на выбор в строке табличной части платформа считывает текущее значение реквизита, указанного в связи (в примере выше — Номенклатура из текущей активной строки).
  2. Формирует структуру Отбор, где ключом выступает поле отбора выбираемого справочника (например, Владелец), а значением — полученная ссылка.
  3. Помещает структуру Отбор в коллекцию Параметры открываемой формы выбора.
  4. В обработчике ПриСозданииНаСервере формы выбора эти данные становятся доступны напрямую через Параметры.Отбор.

Где еще могут определяться параметры формы выбора

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

  1. Обработчик ОбработкаПолученияФормы в модуле менеджера объекта. В модуле менеджера выбираемого объекта (например, справочника спецификаций) платформа вызывает предопределенную процедуру перед открытием формы. В нее передается параметр Параметры (структура). Разработчики часто модифицируют состав отборов именно там. Так как вызов происходит на стороне платформы, стек родительской формы там также не отображается.
  2. Стандартные параметры платформы. При интерактивном вызове платформа всегда передает служебные параметры: ТекущаяСтрока (для позиционирования курсора на уже выбранном значении), РежимВыбора (равно Истина), ЗакрыватьПриВыборе и ВыборГруппИЭлементов.

Ограничения декларативных связей и альтернативный подход

Важно помнить об ограничениях встроенного механизма связей параметров выбора:

  1. Только проверка на равенство: свойства СвязиПараметровВыбора и ПараметрыВыбора умеют накладывать отбор только с видом сравнения Равно. Установить отбор вида «В списке», «Не равно» или диапазон дат декларативно нельзя.
  2. Чувствительность к контексту строки: если связь зависит от колонки строки, а текущая строка не определена, связь передаст пустое значение, что может привести к открытию пустого списка.
  3. Пустые значения: если реквизит-источник не заполнен, в отбор формы выбора передается пустая ссылка, из-за чего список подбора часто не показывает ни одного элемента.

Если требуется нестандартный отбор (например, по нескольким условиям или списку значений), декларативный механизм отключают и используют обработчик события элемента НачалоВыбора:


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

Как отладить источник параметров

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

  1. Поставим точку останова в процедуре ОбработкаПолученияФормы модуля менеджера того объекта, чья форма выбора открывается. Проверим состав структуры Параметры.
  2. Выполним глобальный поиск по конфигурации имени реквизита или имени элемента формы (например, Спецификация) в контексте обращений к СвязиПараметровВыбора или вызовов общих модулей в обработчиках ПриСозданииНаСервере и ПриОткрытии документа.
  3. Проверим свойства самого элемента на управляемой форме в конфигураторе: поля СвязиПараметровВыбора и ПараметрыВыбора в палитре свойств.
← На главную