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