Изменение цен при выгрузке из УНФ в БП
Клиенту нужно было, чтобы при выгрузке из УНФ в БП подменялись цены реализации на цены из заказа.
Мне была предоставлена копия баз УТ и БП.
Но мне не хотелось настраивать синхронизацию УТ и БП. К тому же в БП были не совсем полные права, там не было прав на настройку синхронизации.
Поэтому я решил делать разработку на выгрузке в Enterprise Data. Я сделал настройку на выгрузку одного документа и сохранил эту настройку, чтобы быстро восстанавливать при перезапусках:

Расширил модуль МенеджерОбменаЧерезУниверсальныйФормат, код получился несложным:
&После("ПКО_Документ_РасходнаяНакладная_Отправка_ПриОтправкеДанных") Процедура доробм_ПКО_Документ_РасходнаяНакладная_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки) Если ЗначениеЗаполнено(ДанныеИБ.Заказ) Тогда СуммаВключаетНДС = ДанныеИб.СуммаВключаетНДС; ТоварыЗаказа = ДанныеИБ.Заказ.Запасы; Для Каждого Строка ИЗ ДанныеXDTO.Товары Цикл СтруктураПоиска = Новый Структура("Номенклатура, Характеристика", Строка.Номенклатура, Строка.Характеристика); ИскСтрокиЗаказа = ТоварыЗаказа.НайтиСтроки(СтруктураПоиска); Если ИскСтрокиЗаказа.Количество() > 0 Тогда ИскСтрокаЗаказа = ИскСтрокиЗаказа[0]; ЦенаЗаказа = ИскСтрокаЗаказа.Цена; СтараяЦена = Строка.Цена; Строка.Цена = ЦенаЗаказа; Строка.Сумма = Строка.Цена * Строка.Количество; Если Строка.СтавкаНДС = "БезНДС" Тогда К = 0; ИначеЕсли Строка.СтавкаНДС = "НДС20" Тогда К = 20; ИначеЕсли Строка.СтавкаНДС = "НДС22" Тогда К = 22; ИначеЕсли Строка.СтавкаНДС = "НДС18" Тогда К = 18; ИначеЕсли Строка.СтавкаНДС = "НДС10" Тогда К = 10; ИначеЕсли Строка.СтавкаНДС = "НДС5" Тогда К = 5; ИначеЕсли Строка.СтавкаНДС = "НДС7" Тогда К = 7; КонецЕсли; Если СуммаВключаетНДС Тогда Строка.СуммаНДС = Строка.Сумма * К / (100 + К); Строка.Всего = Строка.Сумма; Иначе Строка.СуммаНДС = Строка.Сумма * К / 100; Строка.Всего = Строка.Сумма + Строка.СуммаНДС; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры
Выгрузил документ в ED, поменяв цены в первой и третьей строке:

Для очистки совести подгрузил выгруженный документ в БП, цены подставились из заказа:

UPD: странное дело, но при выгрузке через план обмена ставка НДС попадает не строкой, а структурой, пришлось написать отдельный код под это дело:
К = 0; Если ТипЗнч(Строка.СтавкаНДС) = Тип("Структура") И ТипЗнч(Строка.СтавкаНДС.Значение) = Тип("СправочникСсылка.СтавкиНДС") Тогда К = Строка.СтавкаНДС.Значение.Ставка; КонецЕсли;
Среда: УНФ 3.0.12.261, 1С 8.5.1.1302.




Идея рабочая, но хрупкая: сопоставление по номенклатуре и характеристике сломается на дублях, разных ценах, скидках, упаковках, округлениях. Правильнее закрывать это на уровне правил обмена или настроек пересчёта — а не вручную пересобирать «Цена», «Сумма», «СуммаНДС» и «Всего» прямо в обработчике выгрузки.
Там еще с новой ставкой НДС надо будет отдельно изменения вносить
где там?
Правильнее, но дороже. Вы опять пытаетесь частную задачу решить универсально.
Клиенту не нужен швейцарский нож, ему нужен перочинный.
Согласен, клиенту не всегда нужен швейцарский нож. Но перочинный нож должен резать предсказуемо — а не только если держишь его строго определённо. Я не за универсализацию ради универсализации. Я за минимальную устойчивость к очевидным кейсам: дубли строк, разные цены, скидки, упаковки, округления. Без этого — это не «частное решение», а решение, которое держится, пока данные не шалят.
Вы Виталий, возможно работаете не в том low-budget секторе. У клиента есть определенный тип задач и переплачивать за то, что ему НИКОГДА не понадобится не стоит.
Я не Баба Ванга, чтобы знать, что у него появится, в такой модели проще решать проблемы по мере роста клиента. Вырастет — тогда и будем работать.
Но возможно тогда эта модель с передачей на лету и не понадобится.