Имя: Пароль:
1C
 
Нужна помощь с распределение сумм
0 ivan123123
 
26.05.15
14:33
Добрый день. Создал процедуру по распределению (см ниже). В ходе распределения образуется расхождение в несколько копеек между базой распределения и суммой распределения.
https://yadi.sk/i/obO9heW-grQG9
Подскажите как это подправить, если можно на конкретном примере.

Процедура РаспределениеСчета20(СтруктураШапкиДокумента, Отказ, Ошибки)

// ПОДГОТОВКА ПРОВЕДЕНИЯ ПО ДАННЫМ ДОКУМЕНТА

ПараметрыПроведения = Документы.РегламентнаяОперация.ПодготовитьПараметрыУчетЗатрат(СтруктураШапкиДокумента, Отказ);
Если Отказ Тогда
Возврат;
КонецЕсли;

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
|    СУММА(ХозрасчетныйОбороты.СуммаОборотДт) КАК СуммаОборотДт,
|    ПравилаРаспределенияСчета20.ДопНоменклатурнаяГруппа,
|    СУММА(ХозрасчетныйОбороты.СуммаНУОборотДт) КАК СуммаНУОборотДт
|ПОМЕСТИТЬ База
|ИЗ
|    РегистрСведений.ПравилаРаспределенияСчета20 КАК ПравилаРаспределенияСчета20
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачало, &ДатаКонец, , Счет = &Счет, , Организация = &Организация, , ) КАК ХозрасчетныйОбороты
|    ПО ПравилаРаспределенияСчета20.ОснНоменклатурнаяГруппа = ХозрасчетныйОбороты.Субконто1
|
|СГРУППИРОВАТЬ ПО
|    ПравилаРаспределенияСчета20.ДопНоменклатурнаяГруппа
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|    ПравилаРаспределенияСчета20.ОснНоменклатурнаяГруппа,
|    ХозрасчетныйОбороты.СуммаОборотДт / База.СуммаОборотДт КАК Коэфициент,
|    ПравилаРаспределенияСчета20.ДопНоменклатурнаяГруппа,
|    ХозрасчетныйОбороты.СуммаНУОборотДт / База.СуммаНУОборотДт КАК КоэфициентНУ
|ПОМЕСТИТЬ Коэфициенты
|ИЗ
|    РегистрСведений.ПравилаРаспределенияСчета20 КАК ПравилаРаспределенияСчета20
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачало, &ДатаКонец, , Счет = &Счет, , Организация = &Организация, , ) КАК ХозрасчетныйОбороты
|    ПО ПравилаРаспределенияСчета20.ОснНоменклатурнаяГруппа = ХозрасчетныйОбороты.Субконто1
|    ВНУТРЕННЕЕ СОЕДИНЕНИЕ База КАК База
|    ПО ПравилаРаспределенияСчета20.ДопНоменклатурнаяГруппа = База.ДопНоменклатурнаяГруппа
|ГДЕ
|    ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотДт / База.СуммаОборотДт, 0) <> 0
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|    Коэфициенты.ОснНоменклатурнаяГруппа КАК СубконтоДт1,
|    ХозрасчетныйОбороты.Субконто2 КАК СубконтоДт2,
|    ХозрасчетныйОбороты.СуммаОборотДт * Коэфициенты.Коэфициент КАК Сумма,
|    ХозрасчетныйОбороты.Счет КАК СчетДт,
|    ХозрасчетныйОбороты.Организация,
|    ХозрасчетныйОбороты.Валюта КАК ВалютаДт,
|    ХозрасчетныйОбороты.Подразделение КАК ПодразделениеДт,
|    ХозрасчетныйОбороты.Субконто3 КАК СубконтоДт3,
|    Коэфициенты.ДопНоменклатурнаяГруппа КАК СубконтоКт1,
|    ХозрасчетныйОбороты.Субконто2 КАК СубконтоКт2,
|    ХозрасчетныйОбороты.Субконто3 КАК СубконтоКт3,
|    ХозрасчетныйОбороты.Подразделение КАК ПодразделениеКт,
|    ХозрасчетныйОбороты.Валюта КАК ВалютаКт,
|    ХозрасчетныйОбороты.Счет КАК СчетКт,
|    ХозрасчетныйОбороты.СуммаНУОборотДт * Коэфициенты.КоэфициентНУ КАК СуммаНУДт,
|    ХозрасчетныйОбороты.СуммаНУОборотДт * Коэфициенты.КоэфициентНУ КАК СуммаНУКт
|ИЗ
|    Коэфициенты КАК Коэфициенты
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачало, &ДатаКонец, , Счет = &Счет, , Организация = &Организация, , ) КАК ХозрасчетныйОбороты
|    ПО Коэфициенты.ДопНоменклатурнаяГруппа = ХозрасчетныйОбороты.Субконто1
|ГДЕ
|    ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотДт * Коэфициенты.Коэфициент, 0) <> 0";

Запрос.УстановитьПараметр("ДатаНачало", СтруктураШапкиДокумента.НачДата);
Запрос.УстановитьПараметр("ДатаКонец", СтруктураШапкиДокумента.КонГраница);
Запрос.УстановитьПараметр("Организация", СтруктураШапкиДокумента.Организация);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ОсновноеПроизводство);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

// ФОРМИРОВАНИЕ ДВИЖЕНИЙ
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Проводка = Движения.Хозрасчетный.Добавить();
ЗаполнитьЗначенияСвойств(Проводка, ВыборкаДетальныеЗаписи);
Проводка.Регистратор = СтруктураШапкиДокумента.Ссылка;
Проводка.Период = СтруктураШапкиДокумента.Дата;

Для НомерСубконто = 1 По 3 Цикл
// Дт
БухгалтерскийУчет.УстановитьСубконто(
Проводка.СчетДт,
Проводка.СубконтоДт,
НомерСубконто,
ВыборкаДетальныеЗаписи["СубконтоДт" + НомерСубконто]);
// Кт
БухгалтерскийУчет.УстановитьСубконто(
Проводка.СчетКт,
Проводка.СубконтоКт,
НомерСубконто,
ВыборкаДетальныеЗаписи["СубконтоКт" + НомерСубконто]);
КонецЦикла;

КонецЦикла;

Движения.Хозрасчетный.Записывать = Истина;

КонецПроцедуры
1 kosts
 
26.05.15
14:36
Бросай копейки на самую большую сумму.
2 Злопчинский
 
26.05.15
14:37
(0) какой ты хочешь пример?
как решишь делать - так и будет правильно.
"НДС от суммы не равен сумме НДС слагаемых"
та же самая "проблема".
.
относи набежавшую погрешность на последнюю операцию
3 ivan123123
 
26.05.15
14:38
Как это сделать. Что-то не разберусь.
4 Cyberhawk
 
26.05.15
14:39
Упорядочь запрос по возрастанию суммы, перед циклом запомни значение "НадоРаспределить", а в цикле:
- накапливай уже распределенную сумму в переменной "УжеРаспределено"
- проверяй - если текущая итерация равна количеству строк в запросе, т.е. это последняя итерация, то вместо суммы из выбоки присваивай разницу между "НадоРаспределить" и "УжеРаспределено"
5 Cyberhawk
 
26.05.15
14:39
+(4) вместо "количеству строк в запросе" следует читать "количеству строк в результате запроса"
6 Timon1405
 
26.05.15
14:41
2 + 2 = 3.9999999999999999999999999999999...