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