M_Volkov
Gold Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Цитата: Придется выборку разворачивать по регистратору - документам оплаты, чтобы последнюю оплаты брать частично. Как это лучше сделать? | Сделал отдельный запрос по оборотам Код: // По управленческому учету расчет взаиморасчетов с поставщиком по себестоимости предоплаты // Функция СебестоимостьПредоплаты(Документ) Экспорт КурсКонвертации = 0; Если Не Константы.УчитыватьКурсовыеРазницыСебестоимостьТоваровПоУправленческомуУчету.Получить() Или ТипЗнч(Документ) <> Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Или Документ.Валюта = Константы.ВалютаУправленческогоУчета.Получить() Тогда Возврат КурсКонвертации; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ РАЗРЕШЕННЫЕ | РасчетыСПоставщикамиПоДокументам.ПредоплатаОстаток, | РасчетыСПоставщикамиПоДокументам.ПредоплатаУпрОстаток, | ВЫБОР | КОГДА РасчетыСПоставщикамиПоДокументам.ПредоплатаОстаток = 0 | ТОГДА 0 | ИНАЧЕ РасчетыСПоставщикамиПоДокументам.ПредоплатаУпрОстаток / РасчетыСПоставщикамиПоДокументам.ПредоплатаОстаток | КОНЕЦ КАК КурсКонвертации |ИЗ | РегистрНакопления.РасчетыСПоставщикамиПоДокументам.Остатки( | &Дата, | ЗаказПоставщику = &ЗаказПоставщику | ИЛИ ЗаказПоставщику = &Договор) КАК РасчетыСПоставщикамиПоДокументам |"; Запрос.УстановитьПараметр("Дата", Новый Граница(Документ.МоментВремени(), ВидГраницы.Исключая)); Запрос.УстановитьПараметр("ЗаказПоставщику", ?(ЗначениеЗаполнено(Документ.ЗаказПоставщику), Документ.ЗаказПоставщику, Документ)); Если ЗначениеЗаполнено(Документ.Договор) Тогда Запрос.УстановитьПараметр("Договор", Документ.Договор); Иначе Запрос.Текст = СтрЗаменить(Запрос.Текст, "ЗаказПоставщику = &Договор", "АналитикаУчетаПоПартнерам.Контрагент = &Контрагент"); Запрос.УстановитьПараметр("Контрагент", Документ.Контрагент); КонецЕсли; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Если Выборка.ПредоплатаОстаток = Документ.СуммаДокумента Тогда КурсКонвертации = Выборка.КурсКонвертации; ИначеЕсли Выборка.ПредоплатаОстаток > 0 И Выборка.ПредоплатаОстаток < Документ.СуммаДокумента Тогда Коэффициенты = РаботаСКурсамивалютУТ.ПолучитьКоэффициентыПересчетаВалюты(Документ.Валюта, Документ.ВалютаВзаиморасчетов, Документ.Дата); КурсКонвертации = (Выборка.ПредоплатаУпрОстаток + (Документ.СуммаДокумента - Выборка.ПредоплатаОстаток) * Коэффициенты.КоэффициентПересчетаВВалютуУпр)/Документ.СуммаДокумента; ИначеЕсли Выборка.ПредоплатаОстаток > Документ.СуммаДокумента Тогда КурсКонвертации = СебестоимостьПредоплатыПревышающей(Документ, Выборка.ПредоплатаОстаток); КонецЕсли; КонецЕсли; Возврат КурсКонвертации; КонецФункции // Если остаток предоплаты превыщает сумму документа, то для расчета себестоимости предоплаты // необходимо учитывать только предоплату по документу, без суммы ее превышающей Функция СебестоимостьПредоплатыПревышающей(Документ, ПредоплатаПревышающая) Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ РАЗРЕШЕННЫЕ | РасчетыСПоставщикамиПоДокументам.ПредоплатаПриход, | РасчетыСПоставщикамиПоДокументам.ПредоплатаУпрПриход |ИЗ | РегистрНакопления.РасчетыСПоставщикамиПоДокументам.Обороты( | , | &Дата, | , | ЗаказПоставщику = &ЗаказПоставщику | ИЛИ ЗаказПоставщику = &Договор) КАК РасчетыСПоставщикамиПоДокументам | |УПОРЯДОЧИТЬ ПО | РасчетыСПоставщикамиПоДокументам.РасчетныйДокумент.Дата УБЫВ |"; Запрос.УстановитьПараметр("Дата", Новый Граница(Документ.МоментВремени(), ВидГраницы.Исключая)); Запрос.УстановитьПараметр("ЗаказПоставщику", ?(ЗначениеЗаполнено(Документ.ЗаказПоставщику), Документ.ЗаказПоставщику, Документ)); Если ЗначениеЗаполнено(Документ.Договор) Тогда Запрос.УстановитьПараметр("Договор", Документ.Договор); Иначе Запрос.Текст = СтрЗаменить(Запрос.Текст, "ЗаказПоставщику = &Договор", "АналитикаУчетаПоПартнерам.Контрагент = &Контрагент"); Запрос.УстановитьПараметр("Контрагент", Документ.Контрагент); КонецЕсли; Выборка = Запрос.Выполнить().Выбрать(); Превышение = ПредоплатаПревышающая - Документ.СуммаДокумента; Сумма = 0; СуммаУпр = 0; Пока Выборка.Следующий() Цикл Если Превышение > 0 И Выборка.ПредоплатаПриход >= Превышение Тогда Сумма = Сумма + Выборка.ПредоплатаПриход - Превышение; СуммаУпр = СуммаУпр + Выборка.ПредоплатаУпрПриход - Превышение * Выборка.ПредоплатаУпрПриход/Выборка.ПредоплатаПриход; Превышение = 0; Иначе Сумма = Сумма + Выборка.ПредоплатаПриход; СуммаУпр = СуммаУпр + Выборка.ПредоплатаУпрПриход; КонецЕсли; Если Сумма >= Документ.СуммаДокумента Тогда Прервать; КонецЕсли; КонецЦикла; Возврат ?(Сумма > 0, СуммаУпр/Сумма, 0); КонецФункции | Может их можно объединить в один по остаткам и оборотам? Добавлено: progmike progmike Цитата: Управление торговым предприятием для Украины 1.2.35.1 - бух | Это одна и та же УТ, а "бух" в смысле "белая" регламентная? |