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