Механизм зачета сумм по одному контрагенту но по разным договорам в 1с БП 8.2

Новая тема
Показывать по сообщений
Ответ на пост №10
Макс БУх, сделать это "механически" в конфигурации, конечно обработкой возможно. А как быть с "юридическим" аспектом таких зачетов? Это дело настолько тонкое, что даже к этому документу допускать можно не всех!
Ответ на пост №10
Макс БУх, обработку выложите, ну или в личку. А в документе Корректировка долга, надо выбрать тип операции Взаимозачет и заполнить задолженности, конфигурация сама заполнить договора и счета. И потом сделает правильные проводки.
Ответ на пост №9
Макс БУх, ааа, тепорь поняла  :)  
все-таки дело не в регистре, а в алгоритме.
Ну я бы предложила следующий вариант без особых раздумий.
У вас есть таблица значений начальная - ТЗ, где долги и авансы по договорам. Допустим, там колонки Договор, Аванс, Долг.
Сначала вы проходите циклом по этой ТЗ, и в тех строках, где есть и аванс, и долг по одному договору, делаете зачет. Корректируете сумму на зачтенную. Т.е. если был долг 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;
КонецЕсли;
КонецЦикла;
Прошу прощения за отсутствие, все-таки разработка не основная моя работа.... Пока. Попробую как Вы сказали. Признаться честно, мне тоже в голову приходила мысль о создании двух таблиц значений и работы с ними, но вот додуматься до С1+1 я бы, конечно, не смог. ТО есть, если я Вас правильно понимаю, я на основании табличного поля, которое по запросу извлекает информацию из регистра бухгалтерии, создаю две разные таблицы, условно ТаблЗначДолг и ТаблЗначАванс, потом Вашей методикой перебираю данные этих таблиц.... Попробую, отпишусь. Спасибо!
Ответили: пост #18
Prikum, обработку выкладываю. только строго не судите, в ней много лишнего, так сказать работа мысли)))
Ответили: пост #19
Ответ на пост №16
Макс БУх, ну да, одновременное прохождение по двум массивам со сравнением элементов и их обработкой :)
Ответ на пост №17
Макс БУх, я писал по другому, вместо этих соединений, можно использовать развернутое сальдо по счету группе 62. У меня была задача свернуть сальдо по покупателям(поставщикам) внутри счета 62(60). Т.е. решалась задача, когда у контрагента было сальдо и по 62.01 и по 62.02 одновременно.
Prikum пишет:
Цитата

      
                   
                   Ответ на
                   пост №17
             
      
Макс БУх , я писал по другому, вместо этих соединений, можно использовать развернутое сальдо по счету группе 62. У меня была задача свернуть сальдо по покупателям(поставщикам) внутри счета 62(60). Т.е. решалась задача, когда у контрагента было сальдо и по 62.01 и по 62.02 одновременно.
Да, так сделать можно, более того у меня даже получилось, чтобы просто по контрагенту, без аналитики по договорам. Но ведь хочется создать видимость правильности, чтобы с одного договора на другой:)

Читают тему

(гостей: 1)

Быстрый переход