Макс БУх, сделать это "механически" в конфигурации, конечно обработкой возможно. А как быть с "юридическим" аспектом таких зачетов? Это дело настолько тонкое, что даже к этому документу допускать можно не всех!
Макс БУх, сделать это "механически" в конфигурации, конечно обработкой возможно. А как быть с "юридическим" аспектом таких зачетов? Это дело настолько тонкое, что даже к этому документу допускать можно не всех!
Макс БУх, обработку выложите, ну или в личку. А в документе Корректировка долга, надо выбрать тип операции Взаимозачет и заполнить задолженности, конфигурация сама заполнить договора и счета. И потом сделает правильные проводки.
Макс БУх, ааа, тепорь поняла
все-таки дело не в регистре, а в алгоритме.
Ну я бы предложила следующий вариант без особых раздумий.
У вас есть таблица значений начальная - ТЗ, где долги и авансы по договорам. Допустим, там колонки Договор, Аванс, Долг.
Сначала вы проходите циклом по этой ТЗ, и в тех строках, где есть и аванс, и долг по одному договору, делаете зачет. Корректируете сумму на зачтенную. Т.е. если был долг 5000, аванс 2000, вы делаете зачет на 2000, и остается долг 3000, аванс 0.
После этого у вас в каждой строке либо обе суммы по 0, либо есть одна - аванс или долг.
Затем делите ТЗ на две другие ТЗ. Одна Договор, Аванс - ТЗАванс. Другая Договор, Долг - ТЗДолг. Каждую сортируете по убыванию колонки с суммой.
Потом нужно написать проход по этим ТЗ одновременно с зачетом сумм.
Кстати, в таких случаях мне сильно помогает нарисовать на листочке дерево возможных вариантов.
С1 = 0; // с нуля же у нас в таблице значений идет отсчет строк, правильно?
С2 = 0;
Пока С1 < ТЗАванс.Количество() И С2 < ТЗДолг.Количество() Цикл
Если ТЗАванс[С1].Аванс >= ТЗДолг[С2].Долг Тогда
СуммаЗачета = ТЗДолг[С2].Долг;
Иначе
СуммаЗачета = ТЗАванс[С1].Аванс;
КонецЕсли;
проводки на СуммуЗачета по договорам ТЗАванс[С1].Договор, ТЗДолг[С2].Договор сами впишете
ТЗДолг[С2].Долг = ТЗДолг[С2].Долг - СуммаЗачета;
ТЗАванс[С1].Аванс = ТЗАванс[С1].Аванс - СуммаЗачета;
//теперь проверяем, в какой ТЗ нужно двигаться дальше
Если ТЗАванс[С1].Аванс = 0 Тогда
С1 = С1 + 1;
КонецЕсли;
ЕслиТЗДолг[С2].Долг = 0 Тогда
С2 = С2 + 1;
КонецЕсли;
КонецЦикла;
Рисовод пишет:
Цитата |
---|
Ответ на пост №10 Макс БУх , сделать это "механически" в конфигурации, конечно обработкой возможно. А как быть с "юридическим" аспектом таких зачетов? Это дело настолько тонкое, что даже к этому документу допускать можно не всех! |
uinny пишет:
Цитата |
---|
С1 = 0; // с нуля же у нас в таблице значений идет отсчет строк, правильно? С2 = 0; Пока С1 < ТЗАванс.Количество() И С2 < ТЗДолг.Количество() Цикл Если ТЗАванс[С1].Аванс >= ТЗДолг[С2].Долг Тогда СуммаЗачета = ТЗДолг[С2].Долг; Иначе СуммаЗачета = ТЗАванс[С1].Аванс; КонецЕсли; проводки на СуммуЗачета по договорам ТЗАванс[С1].Договор, ТЗДолг[С2].Договор сами впишете ТЗДолг[С2].Долг = ТЗДолг[С2].Долг - СуммаЗачета; ТЗАванс[С1].Аванс = ТЗАванс[С1].Аванс - СуммаЗачета; //теперь проверяем, в какой ТЗ нужно двигаться дальше Если ТЗАванс[С1].Аванс = 0 Тогда С1 = С1 + 1; КонецЕсли; ЕслиТЗДолг[С2].Долг = 0 Тогда С2 = С2 + 1; КонецЕсли; КонецЦикла; |
Макс БУх, ну да, одновременное прохождение по двум массивам со сравнением элементов и их обработкой
Макс БУх, я писал по другому, вместо этих соединений, можно использовать развернутое сальдо по счету группе 62. У меня была задача свернуть сальдо по покупателям(поставщикам) внутри счета 62(60). Т.е. решалась задача, когда у контрагента было сальдо и по 62.01 и по 62.02 одновременно.
Prikum пишет:
Цитата |
---|
Ответ на пост №17 Макс БУх , я писал по другому, вместо этих соединений, можно использовать развернутое сальдо по счету группе 62. У меня была задача свернуть сальдо по покупателям(поставщикам) внутри счета 62(60). Т.е. решалась задача, когда у контрагента было сальдо и по 62.01 и по 62.02 одновременно. |