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

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

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

Различие между фильтрацией и позиционированием: ИспользоватьРодителя vs АктивизироватьОбъект

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

Рассмотрим два ключевых метода:

  1. АктивизироватьОбъект(Элемент) — этот метод предназначен исключительно для визуального позиционирования курсора на конкретном элементе списка. Если мы передадим в этот метод группу (папку), система просто выделит эту папку синим цветом в текущем окне списка, но не зайдет внутрь нее. Пользователь останется на прежнем уровне иерархии.
  2. ИспользоватьРодителя(Группа, ФлагИзменения) — это полноценный метод фильтрации отображения списка. Он заставляет форму списка показать исключительно содержимое указанной группы. Более того, данный метод позволяет жестко заблокировать пользователю возможность выхода из этой группы «вверх» по иерархии, если использовать второй параметр.

Таким образом, для решения нашей задачи основным инструментом будет именно метод ИспользоватьРодителя.

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

---

Способ №1: Реализация подбора через кнопку на форме документа

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

Напишем процедуру обработчика нажатия кнопки подбора в модуле формы документа. Обратим внимание на очень важную тонкость работы с контекстом формы в 1С 7.7:


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

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


Процедура ОбработкаПодбора(ВыбранныйЭлемент, КонтекстФормыПодбора)
    // Добавляем новую строку в табличную часть документа и заполняем реквизит
    НоваяСтрока();
    Товар = ВыбранныйЭлемент;
    
    // Здесь можно вызвать стандартные обработчики пересчета цен и сумм, если это необходимо
    // Например: ПриЗаписиТовара();
КонецПроцедуры

---

Способ №2: Перехват выбора непосредственно из ячейки табличной части

Часто пользователи предпочитают вводить данные без использования кнопки подбора, просто кликая дважды по пустой ячейке колонки «Товар» в табличной части документа (или нажимая кнопку с многоточием «...» в этой ячейке). По умолчанию система просто откроет справочник номенклатуры с корня или с того места, где пользователь находился в прошлый раз.

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

Разберем по шагам реализацию этого механизма в модуле формы документа:


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

Теперь нам необходимо настроить саму форму выбора справочника «Номенклатура», чтобы она умела правильно реагировать на переданный ей параметр. Откроем конфигуратор, найдем справочник «Номенклатура», перейдем к его формам списка и откроем модуль ФормыВыбора (или той формы, которую вы указали в методе ОткрытьФорму).

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


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

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

---

Важные рекомендации по оптимизации поиска и поддержке кода

Проанализируем структуру написанного кода. Использование жестко прописанного кода папки (так называемый «хардкод» вида "10350") в теле программы считается плохой практикой разработки. Если в процессе эксплуатации базы данных код папки будет случайно изменен пользователем или при переносе данных будет создана новая группа с другим кодом, программа перестанет корректно работать.

Чтобы избежать подобных проблем и сделать конфигурацию более гибкой, рекомендуем использовать следующие альтернативные подходы:

Применяя данные подходы, мы получаем надежное, отказоустойчивое решение, которое значительно упрощает ежедневную работу пользователей с заполнением документов в системе 1С 7.7.

← На главную