Механизм зачета сумм по одному контрагенту но по разным договорам в 1с БП 8.2
24.02.2015
12:46
#11
Ответ на
пост №10
Макс БУх, сделать это "механически" в конфигурации, конечно обработкой возможно. А как быть с "юридическим" аспектом таких зачетов? Это дело настолько тонкое, что даже к этому документу допускать можно не всех! 24.02.2015
12:49
#12
Ответ на
пост №10
Макс БУх, обработку выложите, ну или в личку. А в документе Корректировка долга, надо выбрать тип операции Взаимозачет и заполнить задолженности, конфигурация сама заполнить договора и счета. И потом сделает правильные проводки. 24.02.2015
12:56
#13
Ответ на
пост №9
Макс БУх, ааа, тепорь поняла 
все-таки дело не в регистре, а в алгоритме.
Ну я бы предложила следующий вариант без особых раздумий.
У вас есть таблица значений начальная - ТЗ, где долги и авансы по договорам. Допустим, там колонки Договор, Аванс, Долг.
Сначала вы проходите циклом по этой ТЗ, и в тех строках, где есть и аванс, и долг по одному договору, делаете зачет. Корректируете сумму на зачтенную. Т.е. если был долг 5000, аванс 2000, вы делаете зачет на 2000, и остается долг 3000, аванс 0.
После этого у вас в каждой строке либо обе суммы по 0, либо есть одна - аванс или долг.
Затем делите ТЗ на две другие ТЗ. Одна Договор, Аванс - ТЗАванс. Другая Договор, Долг - ТЗДолг. Каждую сортируете по убыванию колонки с суммой.
Потом нужно написать проход по этим ТЗ одновременно с зачетом сумм.
Кстати, в таких случаях мне сильно помогает нарисовать на листочке дерево возможных вариантов.
24.02.2015
12:57
#14
С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;
КонецЕсли;
КонецЦикла;
С2 = 0;
Пока С1 < ТЗАванс.Количество() И С2 < ТЗДолг.Количество() Цикл
Если ТЗАванс[С1].Аванс >= ТЗДолг[С2].Долг Тогда
СуммаЗачета = ТЗДолг[С2].Долг;
Иначе
СуммаЗачета = ТЗАванс[С1].Аванс;
КонецЕсли;
проводки на СуммуЗачета по договорам ТЗАванс[С1].Договор, ТЗДолг[С2].Договор сами впишете
ТЗДолг[С2].Долг = ТЗДолг[С2].Долг - СуммаЗачета;
ТЗАванс[С1].Аванс = ТЗАванс[С1].Аванс - СуммаЗачета;
//теперь проверяем, в какой ТЗ нужно двигаться дальше
Если ТЗАванс[С1].Аванс = 0 Тогда
С1 = С1 + 1;
КонецЕсли;
ЕслиТЗДолг[С2].Долг = 0 Тогда
С2 = С2 + 1;
КонецЕсли;
КонецЦикла;
25.02.2015
10:56
#15
Рисовод пишет:
Добрый день! Да, Вы совершенно правы по поводу юридического аспекта. Но это по общему правилу, а в ситуации, для которой понадобилась рассматриваемая методика (обработка), юридический аспект не столь важен - главное вывести хотя бы нетто суммы задолженностей и авансов.
Цитата |
---|
Ответ на пост №10 Макс БУх , сделать это "механически" в конфигурации, конечно обработкой возможно. А как быть с "юридическим" аспектом таких зачетов? Это дело настолько тонкое, что даже к этому документу допускать можно не всех! |
25.02.2015
11:01
#16
uinny пишет:
Прошу прощения за отсутствие, все-таки разработка не основная моя работа.... Пока. Попробую как Вы сказали. Признаться честно, мне тоже в голову приходила мысль о создании двух таблиц значений и работы с ними, но вот додуматься до С1+1 я бы, конечно, не смог. ТО есть, если я Вас правильно понимаю, я на основании табличного поля, которое по запросу извлекает информацию из регистра бухгалтерии, создаю две разные таблицы, условно ТаблЗначДолг и ТаблЗначАванс, потом Вашей методикой перебираю данные этих таблиц.... Попробую, отпишусь. Спасибо!
Цитата |
---|
С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; КонецЕсли; КонецЦикла; |
Ответили:
пост #18
25.02.2015
11:16
#18
Ответ на
пост №16
Макс БУх, ну да, одновременное прохождение по двум массивам со сравнением элементов и их обработкой 
25.02.2015
11:22
#19
Ответ на
пост №17
Макс БУх, я писал по другому, вместо этих соединений, можно использовать развернутое сальдо по счету группе 62. У меня была задача свернуть сальдо по покупателям(поставщикам) внутри счета 62(60). Т.е. решалась задача, когда у контрагента было сальдо и по 62.01 и по 62.02 одновременно. 25.02.2015
12:48
#20
Prikum пишет:
Да, так сделать можно, более того у меня даже получилось, чтобы просто по контрагенту, без аналитики по договорам. Но ведь хочется создать видимость правильности, чтобы с одного договора на другой:)
Цитата |
---|
Ответ на пост №17 Макс БУх , я писал по другому, вместо этих соединений, можно использовать развернутое сальдо по счету группе 62. У меня была задача свернуть сальдо по покупателям(поставщикам) внутри счета 62(60). Т.е. решалась задача, когда у контрагента было сальдо и по 62.01 и по 62.02 одновременно. |
Читают тему
(гостей: 1)