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

Новая тема
Показывать по сообщений
Макс БУх, так у меня с аналитикой долги закрываются.
Prikum пишет:
Цитата

      
      
Макс БУх , так у меня с аналитикой долги закрываются.
Интересно:) Там как получается: закрываются долги в аналитике по договорам и контрагентам. Посмотрите, если есть долги по разным договорам, то они не закрываются или если закрываются, то по одному какому-то договору (это я там выборку ставил по субконто 1, а проводки все равно формируются неправильно в части договоров, если проще, то закрываются долги в аналитике по договору, на котором висит аванс, а в ОСВ долг по другому договору так и продолжает висеть).
Ответили: пост #23
Ответ на пост №22
Макс БУх, я вот все не могу понять, а Вы хоть пробовали вручную сначала закрыть одного контрагента? Остатки по нему до закрытия и после закрытия сможете выложить?
Prikum пишет:
Цитата

      
                   
                   Ответ на
                   пост №22
             
      
Макс БУх , я вот все не могу понять, а Вы хоть пробовали вручную сначала закрыть одного контрагента? Остатки по нему до закрытия и после закрытия сможете выложить?
Да, вручную пробовал. Но вручную очень много работы, даже, как Вы правильно, надо признать, говорите, по корректировке долга. Тут в базе, о корой я говорю, больше сотни контрагентов, это только по 62 счету, плюс у каждого несколько договоров, так что работа, мягко говоря, та еще... Остатки, боюсь, выложить по реальному контрагенту не смогу, мало ли чего: клиент-то непростой и кому может не понравиться, что даже упоминание о его контрагентах появится в сети. Но для понимания процесса будем считать, что мы друг друга понимаем. Но все же приведу пример: У контрагента А есть долги и есть незакрытые по данным учета авансы. С этим контрагентом работы велись, для упрощения, по двум договорам: дог. 1 и дог. 2. По дог.1 одновременно на конец какого-то периода существует и аванс и долг в сумме 5000 и 10000 руб соответственно. Более того, по дог. 2 есть аванс в сумме 5000 руб. Варианты действий в таком случае какие? Мое видение: 1) вариант самый правильный - по движениям контрагента выявить момент незачета по дог. 1, зачесть или скорректировать записи и запросить сверку по дог. 2. Однако, в силу ограничений этот вариант невозможен к исполнению (см. выше почему); 2) вариант-середнячок - по дог.1 зачесть руками через корр.долга или операцией (кому как удобно), причем без вникания в суть (может аванс вообще неверно разнесен). Тогда получаем дог. 1 с долгом и дог. 2 с авансом. Все вроде хорошо, но в силу все того же ограниченного времени и очень большой "клиентской" базы вариант тоже маловыполнимый; 3) то, о чем я тут и спрашиваю - по дог. 1 зачесть аванс, а остаток, в нашем примере 5000 долга и 5000 аванса, закрыть. Клиент сам так захотел, так как находится в процессе ликвидации, а учет восстанавливать никто не собирается, поэтому хоть бы не показывать бешенных задолженностей управляющему в случае банкротства или проверяющим из налоговой. Опять же и третий вариант требует достаточного объема времени, что является непозволительной роскошью, вот и пытаюсь "спекулировать" по поводу обработки, которая все это сделала бы за меня, а я бы занялся другими вещами.
Ответили: пост #25
Ответ на пост №24
Макс БУх, я писал обработку по автоматическому формированию документов "Корректировка долга" для закрытия расчетов с контрагентами.
Prikum пишет:
Цитата

      
                   
                   Ответ на
                   пост №24
             
      
Макс БУх , я писал обработку по автоматическому формированию документов "Корректировка долга" для закрытия расчетов с контрагентами.
А я вот дальше того, что Вам рассказываю, не додумался, увы))) Допер только до обработки по формированию операций.
[CODE][/CODE]
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;
КонецЕсли;
КонецЦикла;


uinny, сделал как Вы сказали, но ничего не получилось: формируется непонятная проводка на сумму 1 рубль.

Для каждого строка из ТаблицаСумм цикл
    ЧЗ = новый ТаблицаЗначений;
    чз.Колонки.Добавить("Контрагент"  ;)  ;
    Чз.Колонки.Добавить("Договор"  ;)  ;
    чз.Колонки.Добавить("Кредиторка"  ;)  ;
    строкаЧЗ=чз.Добавить();
    строкачз.контрагент=строка.контрагент;
    строкаЧз.договор=строка.Договор;
    СтрокаЧз.Кредиторка=Строка.Кредиторка;
    НЧЗ=новый ТаблицаЗначений;
    нчз.Колонки.Добавить("Контрагент"  ;)  ;
    нчз.Колонки.Добавить("Договор"  ;)  ;
    нчз.Колонки.Добавить("Дебиторка"  ;)  ;
    строканчз=нчз.Добавить();
    строканчз.контрагент=строка.контрагент;
    строканчз.договор=Строка.Договор;
    строканчз. *** . *** ;
    конеццикла;
   /// по методике с форума: СтрокаЧЗ=0 и СтрокаНЧЗ=0, потом перебор черех пока...цикл
   СтрокаЧЗ=0;
   СтрокаНЧЗ=0;
   Пока СтрокаЧЗ<ЧЗ.Количество() и СтрокаНЧЗ<ЧЗ.Количество() цикл
    Если ЧЗ[СтрокаЧЗ].Кредиторка>=НЧЗ[СтрокаНЧЗ]. ***  тогда
      СуммаЗачета=НЧЗ[СтрокаНЧЗ]. *** ;
    Иначе
      СуммаЗачета=ЧЗ[СтрокаЧЗ].Кредиторка;
    КонецЕсли;
    //// формируем проводки
    Запись.СчетДТ = этаФорма.ЭлементыФормы.СчетУчетаКЗ.Значение;
    Запись.СубконтоДт.Контрагенты = ЧЗ[СтрокаЧЗ].Контрагент;
    Запись.СубконтоДт.Договоры=ЧЗ[СтрокаЧЗ].Договор;
    Запись.Содержание = "Получилось ли?";
    Запись.Организация=Выборг;
    Запись.Период=ВыбДок.Дата;
    Запись.Активность=Истина;
    Запись.СчетКт=Этаформа.ЭлементыФормы.СчетУчетаДЗ.Значение;
    Запись.СубконтоКт.Контрагенты=НЧЗ[СтрокаНЧЗ].Контрагент;
    Запись.СубконтоКт.Договоры=  НЧЗ[СтрокаНЧЗ].Договор;
    Запись.Сумма=мин(НЧЗ[СтрокаНЧЗ]. *** ,СуммаЗачета=ЧЗ[СтрокаЧЗ].Кредиторка);
    /// далее проверяем в какой таблице значений двигаться дальше
    Чз[СтрокаЧЗ].Кредиторка=Чз[СтрокаЧЗ].Кредиторка-СуммаЗачета;
    НЧЗ[СтрокаНЧЗ]. ***  НЧЗ[СтрокаНЧЗ]. *** -СуммаЗачета;
    Если ЧЗ[СтрокаЧЗ].Кредиторка= 0 тогда
      СтрокаЧЗ = СтрокаЧЗ+1;
    КонецЕсли;
    Если НЧЗ[СтрокаНЧЗ]. ***  тогда
      СтрокаНЧЗ=СтрокаНЧЗ+1;
    КонецЕсли;
    КонецЦикла;
Подскажите, пожалуйста, бедолаге что не так. Формирует проводку, кстати говоря, только по последнему контрагенту в Табличном поле. Заранее огромное спасибо!
Ответили: пост #28
Ответ на пост №27
Макс БУх, эммм...
Ну что сразу в глаза кинулось - почему вы в цикле создаете таблицу значений ЧЗ и НЧЗ? На каждой итерации. В них по итогу по одной строке что ли на конец цикла?

Запись.Сумма=мин(НЧЗ[СтрокаНЧЗ]. *** ,СуммаЗачета=ЧЗ[СтрокаЧЗ].Кредиторка);
в этой строке не должно быть выбора. Вы уже записали в переменную СуммаЗачета минимальное из значений, зачем опять сравнивать? Нужно просто писать Запись.Сумма = СуммаЗачета.
Ответили: пост #29 , пост #30
Ответ на пост №28
uinny, во-первых, от души спасибо за участие. Правда.
Теперь по делу. Таблица сумм - это Табличное поле в обработке, которое формируется по запросу из регистра бухгалтерии. Изначально у меня было так, что проводки формировались исходя из записей в этой таблице (ТаблицеСумм). Таблицы значений я делаю на основании ТаблицыСумм. А вот про цикл и по одной строке не совсем понял, извините. То есть Вы хотите сказать, что я неправильно формирую сами ТЗ (кстати, ЧЗ - это то, что Вы называли ТЗАванс, НЧЗ - ТЗДолг).? Я то по наивности думал, что задавая Для каждого из ... цикл перебираю все строки в ТаблицеСумм, а на их основании формирую проводки по тому порядку, что Вы мне предложили. Запись.Сумма - я так и писал в самом начале, а потом понесла нелегкая)))
В итоге, опишу Вам как я все делаю.
1. По запросу заполняю ТаблицуСумм. С эти проблем нет, слава Богу.
2. На основании ТаблицыСумм через Для каждого строка из ТаблицаСумм цикл формирую Таблицы значений. Видимо здесь моя ошибка, ведь получается что под каждую строчку из ТаблицыСумм я формирую отдельную Таблицу значений, не так ли? Может использовать Пока...цикл? Или вообще отдельно создавать таблицы значений?
3. Ну и потом как Вы советовали пытаюсь перебирать значения из каждой Таблицы.
Ответ на пост №28
uinny, сейчас просмотрел процедуру отобрать и понял, что ТаблицаСумм - это тоже ТаблицаЗначений. А как иначе) Но это таблица значений, которая принадлежит форме обработки, ее бы убирать не хотелось. Сейчас попробую без цикла явно по запросу заполнить ТЗдолг и ТЗ аванс и сразу напишу
Спасибо!
Ответили: пост #31
Читают тему
(гостей: 1)

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