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