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