Как правильно организовать выбор элемента подчиненного справочника в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с особенностью работы подчиненных справочников. Стандартное поведение системы при нажатии кнопки выбора в поле ввода иногда заставляет пользователя вручную выбирать владельца, даже если он уже указан в другом поле формы. Это происходит потому, что форма выбора подчиненного справочника «не знает» о контексте основной формы без дополнительных настроек. Разберем детально, как автоматизировать этот процесс и сделать работу пользователя комфортной.

Способ 1. Использование свойства «Связать с» в Конфигураторе

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

В Конфигураторе откройте форму, в которой расположен реквизит подчиненного справочника. Зайдите в свойства элемента диалога (поля ввода) и перейдите на вкладку «Дополнительно». Там вы найдете поле с названием «Связать с» (в некоторых версиях может называться «Связан с»).

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

Способ 2. Программное управление через ПриНачалеВыбораЗначения

Рассмотрим ситуацию, когда стандартной связи недостаточно — например, если владелец определяется сложной логикой или его нужно подставить динамически. В этом случае мы используем предопределенную процедуру ПриНачалеВыбораЗначения. Выясним причину, по которой у автора вопроса не получалось «поймать» выбранное значение.

Когда мы устанавливаем ФлагСтандОбр = 0, мы полностью берем управление процессом выбора на себя. Если использовать обычную функцию ОткрытьФорму, система открывает форму асинхронно, и основной программный поток не ждет выбора пользователя. Чтобы вернуть значение в реквизит, лучше всего использовать модальный вызов. Посмотрим на правильный пример реализации:


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

Важный нюанс: в 1С 7.7 при вызове формы справочника через ОткрытьФорму или ОткрытьФормуМодально, если третьим параметром передается ссылка на элемент (владелец), система автоматически устанавливает фильтр в открываемой форме. Это позволяет избежать появления системного окна «Выберите владельца».

Способ 3. Настройка формы списка подчиненного справочника

Иногда требуется произвести дополнительную настройку в самой форме списка, которая открывается для выбора. Проанализируем ситуацию, описанную в сообщениях форума, где используется метод ИспользоватьВладельца. Проблема заключается в том, что процедура ПриОткрытии срабатывает уже после того, как система попыталась инициализировать список. Если владелец не передан «снаружи» (через параметры открытия), 1С сначала выведет запрос на выбор владельца, а только потом зайдет в процедуру ПриОткрытии.

Чтобы метод ИспользоватьВладельца работал корректно без лишних вопросов от системы, мы должны передать владельца через механизм параметров формы. Разберем по шагам:

  1. В вызывающей форме используем: ОткрытьФорму("Справочник.Нужный", КонтекстВладелец).
  2. В вызываемой форме (справочника) в процедуре ПриОткрытии пишем:

Процедура ПриОткрытии()
    // Получаем переданный параметр
    Парам = Форма.Параметр;
    
    Если ПустоеЗначение(Парам) = 0 Тогда
        // Устанавливаем владельца для фильтрации списка
        ИспользоватьВладельца(Парам);
    КонецЕсли;
    
    // Включаем иерархию, если нужно
    ИерархическийСписок(1, 0);
КонецПроцедуры

Почему не срабатывает ОбработкаВыбораЗначения?

Разберем ситуацию, когда отладчик не останавливается в процедуре ОбработкаВыбораЗначения. В 1С 7.7 эта процедура в форме элемента срабатывает только при интерактивном выборе из формы, открытой стандартным способом (когда ФлагСтандОбр = 1). Если же вы открыли форму программно через ОткрытьФорму и при этом не организовали возврат значения, система «теряет» связь между двумя формами.

Совет: Если вам принципиально нужно использовать немодальное открытие формы (чтобы пользователь мог переключаться между окнами), вам придется использовать глобальные переменные или передавать контекст основной формы (Контекст) в открываемую форму, чтобы из нее напрямую заполнять реквизит владельца с помощью конструкции Конт.ИмяРеквизита = ТекущийЭлемент().

Подведем итог: наиболее стабильным и рекомендуемым способом для 1С 7.7 является связывание реквизитов через свойства в Конфигураторе. Это минимизирует количество кода и снижает вероятность ошибок при обновлении конфигурации. Если же требуется гибкость, используйте модальное открытие формы с передачей владельца третьим параметром функции ОткрытьФормуМодально.

← На главную