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