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