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