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

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

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

Основы асинхронного выбора данных

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

Для корректной обработки результата нам необходимо использовать объект ОписаниеОповещения. Это своего рода «конверт» с инструкцией, в котором мы указываем имя процедуры, которая должна быть вызвана системой после закрытия диалогового окна.

Пошаговая реализация процедуры выбора

Давайте разберем, как правильно вызвать диалог выбора:


// Создаем список значений
ВидыЕды = Новый СписокЗначений;
ВидыЕды.Добавить(ПредопределенноеЗначение("Перечисление.ВидыЕды.Овощи"));
ВидыЕды.Добавить(ПредопределенноеЗначение("Перечисление.ВидыЕды.Фрукты"));

// Определяем процедуру-обработчик
Оповещение = Новый ОписаниеОповещения("ПослеВыбораЭлемента", ЭтотОбъект);

// Вызываем диалог выбора
ВидыЕды.ПоказатьВыборЭлемента(Оповещение, "Выберите вид еды");

Теперь рассмотрим, как должна выглядеть процедура-обработчик, которая примет результат выбора пользователя:


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

    // Получаем значение из элемента списка
    ЗначениеДляЗаписи = ВыбранныйЭлемент.Значение;

    // Работаем с выделенными строками табличной части
    ОбработатьВыделенныеСтроки(ЗначениеДляЗаписи);
КонецПроцедуры

Обработка выделенных строк табличной части

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

Разберем процесс обновления данных пошагово:

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

Процедура ОбработатьВыделенныеСтроки(НовоеЗначение)
    // Получаем массив выделенных идентификаторов
    МассивИдентификаторов = Элементы.Товары.ВыделенныеСтроки;

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

Почему возникают ошибки?

Чаще всего ошибки типа «Поле объекта не обнаружено» возникают по двум причинам:

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

← На главную