Итак.
Почему-то разработконфигурациичики 11-ой редакции конфигурации "Управление торговлей" решили, что данная обраб внешние компонентыотка не особо востребована и не стали заморачиваться с ее включением в доступный функционал. Как показывает практика, да и по опыту исследования отзывов пользователей, такое исключение оказалось серьезным упущением. На infostarte подобного функционала не обнаружил, и когда заказчик попросил внедрить обраб внешние компонентыотку, которая была в торговых (да и других) конфигурациях на платфорконсоль отчетов мотчетые 7.7, 8.0, 8.1, был вынужден взяться за кисти и краски.
На суд общественности предлагаю то, что удалось сваять. Думаю удастся кому-нибудь помочь и облегчить сосуществование с управляемыми формами в торговле.
Прложенная обраб внешние компонентыотка НЕ ВНЕШНЯЯ, сделать ее таковой не представляется возможным, исходя из того, что это не обраб внешние компонентыотка заполнения, а обраб внешние компонентыотка изменения имеющейся в таб. части информации. Ее необходимо включить в метаданные, воспользовавшись в конфигураторе в дереве метаданных командой "Вставить внешнюю обраб внешние компонентыотку, отчет...".
Обработконфигурациика разрабатывалась на платфорконсоль отчетов мотчетые 8.2.13.219.
Возможности, включенную в обраб внешние компонентыотку (обраб внешние компонентыотчики):
- - Изменить цены на %,
- - Распределить сумму по суммам,
- - Распределить сумму по количеству,
- - Установить ставку НДС,
- - Установить ручную скидку, %,
- - Округлить цены до,
- - Удалить помеченные строки,
- - Добавить из документа.
Это тот функционал, который потребовался заказчику. Обработконфигурациичик "Добавить из документа" заказчика особо интересовал, но решил включить и его из спортивного интереса. Дополнение и модификация функционала исключительно приветствуется.
Особенности такие:
1) форма обраб внешние компонентыотки открывается в модальном режиме,
2) идентификация и сопоставление строк исходной таб. части и новой осуществляется по реквизиту "НомерСтроки", для новых строк, добавленных в режиме "Добавить из документа" этот реквизит будет иметь значение на 1 большее исходного количества строк в табличной части,
3) в форме обраб внешние компонентыотки редактирование строк недоступно (этим можно заняться в основной форме документа), из стандартных действий с табличной частью есть возможность Удаления и Упорядочивания,
4) Система запоминает последнее использованное в обраб внешние компонентыотке действие и предлагает именно его при повторном открытии обраб внешние компонентыотки.
Теперь касаемо того, как вызвать эту внедренную в метаданные обраб внешние компонентыотку из документов системы...
1) В форму документов, требующих изменения механизмами, заложенными в обраб внешние компонентыотку, добавляется в командную панель товаров Кнопка с обраб внешние компонентыотчиком вида:
&НаКлиенте
Процедура автИзменитьТабличнуюЧасть(Команда)
Отказ = Ложь;
Если Отказ Тогда
Возврат программу 1С ;
Конец управленияЕсли;
ПараметрЗаголовок = НСтр("ru = 'Изменение табличной части товаров в %Документ%'");
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрЗаголовок = СтрЗаменить(ПараметрЗаголовок, "%Документ%", Объект.Ссылка);
Иначе
ПараметрЗаголовок = СтрЗаменить(ПараметрЗаголовок, "%Документ%", "заказе клиента");
Конец управленияЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
ПараметрыФормы.Вставить("Товары", Объект.Товары);
ПараметрыФормы.Вставить("Заголовок", ПараметрЗаголовок);
ОткрытьФорму("Обработконфигурациика.автОбработконфигурациикаТабличнойЧастиТовары.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
Конец управленияПроцедуры // автИзменитьТабличнуюЧасть()
Приведенный код использовался для документа "ЗаказКлиента". Для других документов замены потребует часть кода, содержащая "заказе клиента".
2) Результат обраб внешние компонентыотки, возвращаемый в документ, естественно, следует обраб внешние компонентыотать в событии "ОбработконфигурациикаВыбора" формы:
&НаКлиенте
Процедура ОбработконфигурациикаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Перем ВыполняемаяОперация;
Если ИсточникВыбора.ИмяФормы = "Обработконфигурациика.автОбработконфигурациикаТабличнойЧастиТовары.Форма.Форма" Тогда
//-->
автОбработконфигурациикаВыбораЗаполненияТЧТовары(ВыбранноеЗначение);
Конец управленияЕсли;
Конец управленияПроцедуры // ОбработконфигурациикаВыбора()
&НаКлиенте
Процедура автОбработконфигурациикаВыбораЗаполненияТЧТовары(ВыбранноеЗначение)
//-->
автОбработконфигурациикаВыбораЗаполненияТЧТоварыНаСервере(ВыбранноеЗначение);
Конец управленияПроцедуры // автОбработконфигурациикаВыбораЗаполненияТЧТовары()
&НаСервере
Процедура автОбработконфигурациикаВыбораЗаполненияТЧТоварыНаСервере(ВыбранноеЗначение)
ТаблицаТоваров = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище);
КолВоСтрокИсх = Объект.Товары.Количество();
МассивУдалить = Новый Массив;
Для Каждого СтрокаТовар Из Объект.Товары Цикл
Если ТаблицаТоваров.Найти(СтрокаТовар.НомерСтроки, "НомерСтрокиТЧ") = Неопределено Тогда
МассивУдалить.Добавить(СтрокаТовар);
Конец управленияЕсли;
Конец управленияЦикла;
Для каждого СтрокаТовара Из ТаблицаТоваров Цикл
Если СтрокаТовара.НомерСтрокиТЧ > КолВоСтрокИсх Тогда
СтрокаТовараТЧ = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТовараТЧ, СтрокаТовара);
Иначе
СтрокаТовараТЧ = Объект.Товары.Получить(СтрокаТовара.НомерСтрокиТЧ - 1);
ЗаполнитьЗначенияСвойств(СтрокаТовараТЧ, СтрокаТовара, "Цена, Сумма, СтавкаНДС, СуммаНДС, ПроцентРучнойСкидки, СуммаРучнойСкидки, ПроцентАвтоматическойСкидки, СуммаАвтоматическойСкидки");
Конец управленияЕсли;
Конец управленияЦикла;
Для Каждого СтрокаТовар Из Объект.Товары Цикл
Если МассивУдалить.Найти(СтрокаТовар) = Неопределено Тогда
ОбработконфигурациикаТабличнойЧастиТоварыКлиентСервер.ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТовар, Объект.ЦенаВключаетНДС);
Конец управленияЕсли;
Конец управленияЦикла;
Для Каждого ЭлМас Из МассивУдалить Цикл
Объект.Товары.Удалить(ЭлМас);
Конец управленияЦикла;
ОбработконфигурациикаТабличнойЧастиТоварыСервер.ЗаполнитьТипНоменклатурыВТаблице(Объект.Товары);
ПродажиКлиентСервер.РассчитатьИтоговыеПоказателиЗаказа(Объект, ЭтаФорма);
ОбработконфигурациикаТабличнойЧастиТоварыСервер.ЗаполнитьПризнакИспользованияХарактеристик(Объект.Товары);
Элементы.КартинкаНесколькоСкладов.Картинка = ОбщегоНазначенияУТКлиентСервер.ПолучитьКартинкуНесколькоСкладов(Объект.Товары, СкладГруппа, Истина);
Конец управленияПроцедуры // автОбработконфигурациикаВыбораЗаполненияТЧТовары()
Приведенный код использовался для документа "ЗаказКлиента". Для других документов наполнение процедуры "автОбработконфигурациикаВыбораЗаполненияТЧТовары" будет незначительно изменено, а именно:
- - для приходных документов в перечне свойств процедуры "ЗаполнитьЗначенияСвойств" убираются "ПроцентАвтоматическойСкидки", "СуммаАвтоматическойСкидки", в виду отсутствия соответствующих реквизитов в таб. части "Товары";
- - последние строки процедуры настраиваются под каждый конкретный документ индивидуально.
Например, для документа "РеализацияТоваровУслуг" концовка будет следующая:
...
ОбработконфигурациикаТабличнойЧастиТоварыКлиентСервер.ЗаполнитьСуммуВсегоВТаблице(Объект.Товары, Объект.ЦенаВключаетНДС);
ПродажиКлиентСервер.РассчитатьИтоговыеПоказателиРеализации(Объект, ЭтаФорма);
ОбработконфигурациикаТабличнойЧастиТоварыСервер.ЗаполнитьПризнакИспользованияХарактеристик(Объект.Товары);
ОбработконфигурациикаТабличнойЧастиТоварыСервер.ЗаполнитьТипНоменклатурыВТаблице(Объект.Товары);
Элементы.КартинкаНесколькоСкладов.Картинка = ОбщегоНазначенияУТКлиентСервер.ПолучитьКартинкуНесколькоСкладов(Объект.Товары, СкладГруппа);
Для документа "ПоступлениеТоваровУслуг" концовка будет следующая:
ОбработконфигурациикаТабличнойЧастиТоварыСервер.ЗаполнитьТипНоменклатурыВТаблице(Объект.Товары);
ЗакупкиКлиентСервер.РассчитатьИтоговыеПоказателиПоступления(Объект, ЭтаФорма);
ОбработконфигурациикаТабличнойЧастиТоварыСервер.ЗаполнитьПризнакИспользованияХарактеристик(Объект.Товары);
Элементы.КартинкаНесколькоСкладов.Картинка = ОбщегоНазначенияУТКлиентСервер.ПолучитьКартинкуНесколькоСкладов(Объект.Товары, СкладГруппа);
У себя внедрял вызов этой обраб внешние компонентыотки в документы:
- - Заказ клиента,
- - Заказ поставщику,
- - Коммерческое предложение клиенту,
- - Поступление товаров услуг,
- - Реализация товаров услуг.
P.S.
Спасибо за внимание, удачных внедрений.
Скриншоты
Обработчик "Добавить из документа"
Выбор списка документов с товарами для добавления
и другие обработчики