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

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

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

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

Выясним причину проблемы

В платформе 1С стандартный механизм оповещения формы-владельца встроен только для элементов управления, связанных с ДинамическийСписок. Когда в таблице формы используется реквизит типа ТаблицаЗначений, платформа не знает, из какой именно колонки и в какой момент требуется взять значение для возврата.

Простой вызов процедуры Закрыть(Значение) или попытка передать данные в событии ПриАктивизацииСтроки не активирует механизмы заполнения поля. Для передачи данных требуется явно использовать предназначеные для этого методы платформы.

Способ 1. Использование метода ОповеститьОВыборе и указание владельца формы

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

Шаг 1. Переопределение начала выбора в форме-владельце

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


&НаКлиенте
Процедура НоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", , Элемент);
КонецПроцедуры

Шаг 2. Обработка выбора в пользовательской форме

В форме выбора для таблицы формы настраиваем событие Выбор (срабатывающее при двойном клике или нажатии клавиши Enter). В нем получаем данные выбранной строки и передаем нужный реквизит платформе:


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

При вызове метода ОповеститьОВыборе() платформа автоматически передает значение в поле-владелец, закрывает форму выбора и активирует событие ПриИзменении для заполненного поля.

Способ 2. Вызов через ОписаниеОповещения

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

В форме-владельце подготавливаем асинхронное описание оповещения и открываем форму:


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

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

Организация множественного выбора из Таблицы Значений

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

Проанализируем особенности работы с множественным выделением строк в таблице формы:

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

Реализуем процедуру отправки массива выбранных значений по кнопке «Перенести в документ»:


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

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

Особенности работы на мобильной платформе

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

← На главную