Доброго дня, коллеги!
Обращаться к типовым решениям и вникать в подходы реализации, которые применяют разработчики 1С, бывает полезно. Так тренер курса Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3 на вопрос слушателя по теме “Форма подбора товаров в табличную часть документа” привел в пример фрагменты кода из типового решения.
Вопрос
Ответ
Для этого можно применить подход, реализованный в УТ 11 – при начале перетаскивания из поля-отправителя переопределить, какие данные перетаскиваются (сформировать массив структур, состоящий из номенклатуры и цены). Эти данные будут доступны в поле-получателе, тогда можно будет искать в корзине по паре Номенклатура+Цена. Таким образом, для таблицы формы Список создаем обработчик события НачалоПеретаскивания, в котором из перетаскиваемых строк динамического списка извлекаем номенклатуру и цену:
&НаКлиенте Процедура СписокНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение) МассивПараметров = Новый Массив; Для каждого КлючСтроки Из ПараметрыПеретаскивания.Значение Цикл ДанныеСтроки = Элемент.ДанныеСтроки(КлючСтроки); Если ДанныеСтроки = Неопределено Тогда Продолжить; КонецЕсли; ПараметрыТовара = Новый Структура("Номенклатура, Цена", ДанныеСтроки.Ссылка, ДанныеСтроки.Цена); МассивПараметров.Добавить(ПараметрыТовара); КонецЦикла; ПараметрыПеретаскивания.Значение = МассивПараметров; КонецПроцедуры
После этого в обработчик события Перетаскивание для таблицы формы Корзина в качестве параметра придет не сама перетаскиваемая номенклатура, а структура, которую мы сформировали выше:
&НаКлиенте Процедура КорзинаПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) Для каждого ПараметрыТовара Из ПараметрыПеретаскивания.Значение Цикл НайденныеСтроки = Корзина.НайтиСтроки(Новый Структура("Номенклатура, Цена", ПараметрыТовара.Номенклатура, ПараметрыТовара.Цена)); Если НайденныеСтроки.Количество() > 0 Тогда НайденныеСтроки[0].Количество = НайденныеСтроки[0].Количество + 1; Иначе НоваяСтрока = Корзина.Добавить(); НоваяСтрока.Номенклатура = ПараметрыТовара.Номенклатура; НоваяСтрока.Цена = ПараметрыТовара.Цена; НоваяСтрока.Количество = 1; КонецЕсли; КонецЦикла; КонецПроцедуры
Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3.