Как автоматически вызвать форму выбора справочника при добавлении новой строки в табличную часть?

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

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

Метод 1. Использование события «ПриНачалеРедактирования»

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

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


Перем ФормаВыбораСпр;

Процедура ТабличнаяЧасть1ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    // Проверяем, что это именно новая строка, а не редактирование старой
    Если НоваяСтрока Тогда
        ФормаВыбораСпр = Справочники.МоёИмяСправочника.ПолучитьФормуВыбора();
        ФормаВыбораСпр.ВладелецФормы = Элемент.ТекущаяКолонка; // Указываем владельцем колонку ТЧ
        ФормаВыбораСпр.Открыть();
    КонецЕсли;
КонецПроцедуры

Процедура ОбновлениеОтображения()
    // Метод для принудительного вывода формы выбора на передний план
    Если ФормаВыбораСпр <> Неопределено И ФормаВыбораСпр.Открыта() Тогда    
        ФормаВыбораСпр.Активизировать();        
        ФормаВыбораСпр = Неопределено; // Сбрасываем переменную после активации
    КонецЕсли; 
КонецПроцедуры

В данном примере мы используем событие ОбновлениеОтображения, чтобы гарантировать, что форма выбора получит фокус после того, как платформа завершит все стандартные действия по отрисовке новой строки. Это надежный, хотя и несколько «громоздкий» способ.

Метод 2. Использование события «ПередНачаломДобавления»

Этот метод считается более профессиональным и «чистым». Его преимущество в том, что мы можем вызвать форму выбора еще до того, как строка фактически будет добавлена в табличную часть. Если пользователь передумает и закроет форму выбора, в табличной части не останется «мусорной» пустой строки.

Разберем алгоритм реализации:

  1. Устанавливаем СтандартнаяОбработка = Ложь, чтобы отменить автоматическое добавление пустой строки.
  2. Вызываем форму выбора модально или с обработкой оповещения.
  3. Если значение выбрано, программно добавляем строку и заполняем реквизит.

Пример кода для реализации этого подхода:


Процедура ТабличнаяЧасть1ПередНачаломДобавления(Элемент, Отказ, Копирование, ТекстУзла, НоваяСтрока)
    СтандартнаяОбработка = Ложь;
    Отказ = Истина; // Отменяем стандартное добавление
    
    // Вызываем форму выбора модально (для обычных форм это допустимо)
    ВыбранноеЗначение = Справочники.МоёИмяСправочника.Выбрать();
    
    Если ВыбранноеЗначение <> Неопределено Тогда
        НоваяСтрокаОбъект = ТабличнаяЧасть1.Добавить();
        НоваяСтрокаОбъект.ИмяРеквизита = ВыбранноеЗначение;
        // Передаем фокус в нужную колонку
        ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока = НоваяСтрокаОбъект;
    КонецЕсли;
КонецПроцедуры

Метод 3. Программная имитация нажатия кнопки выбора

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

Рассмотрим, как это выглядит в коде:


Процедура ТабличнаяЧасть1ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    Если НоваяСтрока Тогда
        // Имитируем нажатие кнопки выбора в текущей ячейке
        ЭлементыФормы.ТабличнаяЧасть1.ВыполнитьКнопкуВыбора();
    КонецЕсли;
КонецПроцедуры

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

Важные настройки свойств колонки

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

Особенности работы с составными типами данных

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

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

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

← На главную