Как в 1С 7.7 при выборе строки табличной части открыть справочник в нужной папке?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Разберем детально, как реализовать такое поведение в платформе 1С:Предприятие 7.7 с помощью встроенного языка.

Причина стандартного поведения платформы

По умолчанию при интерактивном клике на кнопку выбора в ячейке таблицы 1С 7.7 открывает список с верхнего уровня (корня), если для текущей строки значение еще не выбрано. Если предыдущие строки были заполнены программно, стандартный механизм не запоминает контекст предыдущего выбора.

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

Основное решение: перехват события ПриНачалеВыбораЗначения

Рассмотрим по шагам реализацию через предопределенную процедуру модуля формы документа ПриНачалеВыбораЗначения и метод ИспользоватьРодителя.

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

Посмотрим на пример программного кода в модуле формы документа:


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

Особенности и режимы работы метода ИспользоватьРодителя

Проанализируем параметры метода ИспользоватьРодителя(Родитель, Режим), так как второй параметр существенно влияет на поведение интерфейса:

  1. Режим 1 (жесткое ограничение): вызов Конт.ИспользоватьРодителя(Род, 1) открывает указанную папку и полностью блокирует возможность подняться вверх по дереву каталогов. Пользователь может выбирать только элементы внутри заданной ветки.
  2. Режим 0 (мягкое позиционирование): вызов Конт.ИспользоватьРодителя(Род, 0) открывает форму внутри нужной папки, но оставляет пользователю доступ к кнопке перехода на уровень выше и навигации по всему справочнику.

Обработка возврата выбранного значения

Когда мы отменяем стандартный выбор через СтатусВозврата(0), автоматическая подстановка выбранного значения в активную строку табличной части может не сработать при обычном закрытии окна. Для корректной фиксации результата выбора используем предопределенную процедуру формы документа ОбработкаВыбораЗначения:


Процедура ОбработкаВыбораЗначения(ВыбЗнач, ИдентЭлемДиалога, Флаг)
    Если ИдентЭлемДиалога = "ОС_Новый" Тогда
        ОС_Новый = ВыбЗнач;
        // Флаг = 1 разрешает стандартное завершение интерактивного выбора
        Флаг = 1;
    КонецЕсли;
КонецПроцедуры

Альтернативный вариант: передача родителя через параметр формы

Выясним, как сделать решение более универсальным без прямого обращения к контексту открытой формы. Можно передать нужную папку вторым параметром метода ОткрытьФорму, а логику позиционирования разместить в модуле самого справочника.

В модуле формы документа вызываем открытие с параметром:


Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога)
    Если ИдентЭлемДиалога = "ОС_Новый" Тогда
        Если ПустоеЗначение(ОС_Шапка.Родитель) = 0 Тогда
            СтатусВозврата(0);
            ОткрытьФорму("Справочник.ОсновныеСредства", ОС_Шапка.Родитель);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

В модуле формы списка справочника ОсновныеСредства в событии ПриОткрытии обрабатываем входящий параметр:


Процедура ПриОткрытии()
    Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
        Если Форма.Параметр.ЭтоГруппа() = 1 Тогда
            ИспользоватьРодителя(Форма.Параметр, 0);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Такой подход позволяет централизованно управлять открытием справочника в нужных иерархических разрезах из любых документов конфигурации.

← На главную