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