Как в управляемой форме 1С перейти в другую ячейку таблицы с открытием формы выбора и отбором?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Разберем стандартный и наиболее чистый механизм платформы 1С:Предприятие. Если между реквизитами уже настроена связь параметров выбора, открывать форму программно через ОткрытьФорму() необязательно — платформа умеет делать это автоматически.

Для реализации этого подхода выполним следующие настройки:

  1. В свойствах реквизита или элемента формы Спецификация настроим Связи параметров выбора: укажем отбор по владельцу через связь Отбор.Владелец(Элементы.Продукция.ТекущиеДанные.Номенклатура).
  2. Для элемента формы (колонки спецификации) включим автоматический выбор: установим свойство АвтоВыборНезаполненного в значение Истина, а также укажем РежимВыбораНезаполненного = РежимВыбораНезаполненного.ПриАктивизации.
  3. В обработчике события ПриИзменении первой ячейки программно передадим фокус в ячейку спецификации.

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


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

&НаКлиенте
Процедура УстановитьФокусНаСпецификацию()
    ТекущийЭлемент = Элементы.ПродукцияСпецификация;
    Элементы.Продукция.ИзменитьСтроку();
КонецПроцедуры

Обратим внимание на вызов ПодключитьОбработчикОжидания(): в управляемом интерфейсе прямое переключение ТекущийЭлемент внутри события ПриИзменении может перебиваться стандартной логикой перехода по нажатию клавиши Enter. Минимальная асинхронная задержка гарантирует корректную передачу фокуса.

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

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

Разберем по шагам вызов формы:


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

Чтобы выбранное значение записалось в текущую строку табличной части, подключим событие таблицы ОбработкаВыбора:


&НаКлиенте
Процедура ПродукцияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    СтрокаТаблицы = Элементы.Продукция.ТекущиеДанные;
    Если СтрокаТаблицы <> Неопределено И ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Спецификации") Тогда
        СтандартнаяОбработка = Ложь;
        СтрокаТаблицы.Спецификация = ВыбранноеЗначение;
        
        // Устанавливаем фокус на колонку спецификации и активируем редактирование строки
        ТекущийЭлемент = Элементы.ПродукцияСпецификация;
        Элементы.Продукция.ИзменитьСтроку();
    КонецЕсли;
КонецПроцедуры

Способ 3. Оптимизация ввода через автоматическое заполнение

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

  1. В обработчике ПриИзменении вызываем серверную функцию, которая считывает основную спецификацию номенклатуры.
  2. Если спецификация одна или задана основная, сразу подставляем ее в строку без вызова диалоговых окон.
  3. Если спецификаций несколько и основная не определена, инициируем переход в ячейку с открытием выбора.

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

← На главную