Всем доброго времени суток, столкнулся с такой ситуацией:
Руководство хочет работать с двумя валютами одновременно (грн. и usd), чтобы документы были в валюте товара.
Имея на руках типовую УТ 10.3 и поковыряв её понял что штатными средствами этого не сделать.
Штатная УТ может создать, сохранить и распечатать документ в валюте договора контрагента.
Но задача есть задача....
Вот код обработки:
Функция ПолучитьСтрЦЕны(Номенклатура,ТипЦен,Дата)
стрРез = Новый Структура;
стрРез.Вставить("Валюта","");
стрРез.Вставить("Цена",0);
//стрРез.Вставить("Валюта","");
З = Новый Запрос;
Т = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Валюта,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура,
| ЦеныНоменклатурыСрезПоследних.ТипЦен,
| ЦеныНоменклатурыСрезПоследних.Период
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &Дата,
| ТипЦен = &ТипЦен
| И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних";
З.УстановитьПараметр("Номенклатура",Номенклатура);
З.УстановитьПараметр("ТипЦен",ТипЦен);
З.УстановитьПараметр("Дата",Дата);
З.Текст = Т;
выб = З.Выполнить().Выбрать();
Если выб.Следующий() Тогда
стрРез.Валюта = выб.Валюта;
стрРез.Цена = выб.Цена;
КонецЕсли;
Возврат стрРез;
КонецФункции
Функция НайтиДоговорКОнтрагента(Контрагент, Валюта)
рез = "";
З = Новый Запрос;
Т = "ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец = &Владелец
| И НЕ ДоговорыКонтрагентов.ПометкаУдаления
| И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора
| И ДоговорыКонтрагентов.ВалютаВзаиморасчетов = &ВалютаВзаиморасчетов";
З.Текст = Т;
З.УстановитьПараметр("Владелец",Контрагент);
З.УстановитьПараметр("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
З.УстановитьПараметр("ВалютаВзаиморасчетов",Валюта);
выб = З.Выполнить().Выбрать();
Если выб.Следующий() Тогда
рез = выб.Ссылка;
//Иначе
// сО = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
// сО.Наименование = "С покупателем (ГРН)";
// сО.Владелец = Контрагент;
// сО.ВалютаВзаиморасчетов = Справочники.Валюты.НайтиПоКоду("980");
// сО.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
// сО.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом;
// сО.СхемаНалоговогоУчета = Справочники.СхемыНалоговогоУчетаПоДоговорамКонтрагентов.ПоПервомуСобытию;
// сО.Записать();
// рез = сО.Ссылка;
КонецЕсли;
Возврат рез;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
дО = выбЗаказ.ПолучитьОбъект();
тз = дО.Товары.Выгрузить();
тз.Колонки.Добавить("Валюта");
тз.Колонки.Добавить("ЦенаВал");
тз.Колонки.Добавить("СуммаВал");
тз.Колонки.Добавить("Договор");
Для каждого стр из тз Цикл
стрЦены = ПолучитьСтрЦЕны(стр.Номенклатура,дО.ТипЦен,дО.Дата);
стр.Валюта = стрЦены.Валюта;
стр.ЦенаВал = стрЦены.Цена;
стр.СуммаВал = стр.Цена * стр.Количество;
стр.Договор = НайтиДоговорКОнтрагента(дО.Контрагент,стр.Валюта);
КонецЦикла;
тзНаФОрме = тз;
ЭлементыФОрмы.тзНаФОрме.СоздатьКолонки();
дО_грн = Документы.ЗаказПокупателя.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(дО_грн,дО,,"Номер");
дО_грн.ДоговорКонтрагента = НайтиДоговорКОнтрагента(дО_грн.Контрагент,Справочники.Валюты.НайтиПоКоду("980"));
Для каждого стр из тз Цикл
Если стр.Валюта.код = "980" Тогда
НоваяСтрока = дО_грн.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСТрока,стр);
НоваяСтрока.ЦЕна = стр.ЦЕнаВал;
НоваяСтрока.Сумма = стр.СуммаВал;
КонецЕсли;
КонецЦикла;
ф = дО_грн.ПолучитьФорму("ФормаДокумента");
ф.Открыть();
//дО_грн = Документы.ЗаказПокупателя.СоздатьДокумент();
//дО_грн.ДоговорКонтрагента = НайтиДоговорКОнтрагента(дО_грн.Контрагент,Справочники.Валюты.НайтиПоКоду("980"));
//ЗаполнитьЗначенияСвойств(дО_грн,дО,,"Номер");
дО.Товары.Очистить();
Для каждого стр из тз Цикл
Если стр.Валюта.код = "840" Тогда
НоваяСтрока = дО.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСТрока,стр);
НоваяСтрока.ЦЕна = стр.ЦЕнаВал;
НоваяСтрока.Сумма = стр.СуммаВал;
КонецЕсли;
КонецЦикла;
ф = дО.ПолучитьФорму("ФормаДокумента");
ф.Открыть();
КонецПроцедуры
тоесть имея у контрагента 2 договора, в данном случае гривна и доллар, при нажатии на кнопку обработка уберет из документа позиции, которые не соответсвуют валюте договора и создаст документ с ними в нужной валюте.
тестировалась на УТ 10.3 (обычное приложение)
думаю для УТП и УПП тоже подойдёт. На других - тестите, главное условие : наличие у контрагента двух договоров с разными валютами и коды валют должны братся из класификатора, в противном случае прийдется немного допилить.
а вот собственно и обработка, пароль стандартный:
DelenieZakazovPokupatelya.zip ( 7,81 килобайт )
Кол-во скачиваний: 22
Сообщение отредактировал Vofka - 11.10.18, 16:37