• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Изменение долга контрагента

  • Автор темы KateBakly
  • Дата начала
K

KateBakly

Здравствуйте! Это снова я. У меня мало опыта (извините), но большое желание познать 1с.
Подскажите, пожалуйста, хоть направьте, в каком направлении думать.
1с 7.7 ТиС (9.2), можно ли сделать так, чтобы долг контрагента изменялся автоматически по прошествии заданного времени (день, неделя,...) на заданную величину (процент)? Подскажите, хоть где искать эти или подобные данные в типовой конфигурации?
 
V

vbs

Долг покупателя меняется автоматически при создании документов "Реализация", а долг поставщику - при создании документов "ПоступлениеТМЦ" и пр.
В чем проблема ?

Добавлено: Если есть желание, скажем, навешивать на покупателя штрафные санкции, тогда другое дело
 
K

KateBakly

Есть у нас, скажем, покупатель, у которого долг. Ждем 7 дней, пока он не оплатит. Если не оплатил, то накручиваем процент, например, за каждый просроченный день.
Это делать изменения в глобальном модуле в процедуре глТекующийДолг?
 
E

evgenyatam

Долги хранятся в регистрах. Регистры изменяются ТОЛЬКО ДОКУМЕНТАМИ. Дальше делаем выводы.
 
K

KateBakly

Я так поняла, что надо делать изменения в документе Реализация (в моем случае). Я в Процедуру РасчетТекущегоДолга добавляю цикл вроде такого:
Если дата оплаты < ТекущаяДата() Тогда
КолДней = ТекущаяДата() - дата оплаты;
ТекущийДолг = ТекущийДолг + Окр(ТекущийДолг * КолДней * 0.01,2); // 1% накручивать за 1 день (это я пока для примера такое значение взяла)
КонецЕсли;

Только как обратиться именно к нужной дате оплаты? Датой оплаты должна быть дата, когда покупатель получил долг, да плюс еще семь дней.
Когда вместо даты оплаты попробовала ввести конкретное значение (для теста), процент накрутился.
 
V

vbs

Можно пропробовать использовать для расчета реквизиты справочника "Договоры" (СуммаКредита и ГлубинаКредита)
ДатаОплаты = ДатаОтгрузки + ГлубинаКредита //(ДатаОтгрузки = ДатаДок)
Если задается СуммаКредита, можно анализировать Сумму отгрузки (СуммаВзаиморасчетов) на превышение Суммы кредита.
При этом ТекущийДолг - вещь в себе, эта переменная живет только при открытой форме документа,
так что, похоже, придется написать обработку, которая и будет учитывать штрафные санкции.
Как вариант, завести в справочнике "Контрагенты" периодический реквизит ТекущийДолг и/или скорректировать отчет ВедомостьПоКонтрагентам
 
P

Pro

стоит сделать отдельный документ со злобным названием "Проценты Просрочки", выполнять его раз в день утром и он будет на всех покупашек подвешивать что нужно... для простото ты поиска, что откуда брать посмотр.... в Корректиовкадолга
 
K

KateBakly

Сделала документ ПроцентыПросрочки. Хочу, чтобы по нажатии на кнопку он искал всех покупателей с долгом, затем находил документ, когда они этот долг получили, проверяли давность времени и при необходимости (прошло больше 7 дней) прибавляли определенный процент.
Я сделала так, что должники находятся. Теперь, как я понимаю, надо составить запрос, чтобы найти документ, когда был получен долг. То есть это должен быть документ, после которого долг с меньшего или равного нулю сменился на положительный.
Не поможете с запросом, хоть как приблизительно его здесь надо задавать?

Вот как я нахожу должников:
СпрКонтрА = СоздатьОбъект("Справочник.Контрагенты");
СпрКонтрА.НайтиПоНаименованию("Покупатели");
Покупатели = СпрКонтрА.ТекущийЭлемент();
СпрКонтрА.ИспользоватьРодителя(Покупатели);
СпрКонтрА.ВыбратьЭлементы();
Пока СпрКонтрА.ПолучитьЭлемент() = 1 Цикл
СпрДоговоры = СоздатьОбъект("Справочник.Договоры");
СпрДоговоры.ИспользоватьВладельца(СпрКонтрА.ТекущийЭлемент());
Если СпрДоговоры.НайтиПоНаименованию("Основной договор") = 1 Тогда
Договор = СпрДоговоры.ТекущийЭлемент();
КонецЕсли;
ТекущийДолг = глТекущийДолг(Фирма, Договор, "покупатель");
Если ТекущийДолг > 0 Тогда
// здесь надо запрос делать
КонецЕсли;
КонецЦикла;
 
V

vbs

Рекомендую искать расходные документу по Договору.
Док = СоздатьОбъект("Реализация"); // или какой нужно
Док.ВыбратьПоЗначению()
 
V

vitfil

Ой, не в ту сторону вы копаете, не в ту...
Долг не может автоматически увеличиваться. Проценты начисляются либо по предъявлению претензии и подписанию оной д*цензура*ором, либо по удовлетворенному судом исковому заявлению кредитора.
 
K

KateBakly

Извините, я видно не совсем понимаю...
Можно ли так написать, в чем ошибка? Пишу:
Док = СоздатьОбъект("Документ.Реализация");
Пока Док.ВыбратьПоЗначению(Договор, "Основной договор")=1 Цикл //я так понимаю, это искать по Основному договору
....
КонецЦикла;
Пишет: Недостаточное число параметров передано при вызове функции/процедуры объекта
Вроде же в ВыбратьПоЗначению начальную и конечную даты можно не передавать

Может искать надо по контрагенту? Например, Док.ВыбратьПоЗначению(Контрагент, СпрКонтрА.ТекущийЭлемент())
Ошибку, понятно, это не уберет...
 
V

vitfil

Вроде же в ВыбратьПоЗначению начальную и конечную даты можно не передавать
Можно_не_передавать = передача пустого параметра, т.е. необходимо запятые ставить.
Док.ВыбратьПоЗначениею(,,Договор,"ОсновнойДоговор");
Причем, насколько я помню, нельзя выбирать по значению в документах определенного вида.
Лучше воспользуйтесь запросом.
Текст запроса будет что-то типа такого:
Код:
Период С НачДата По КонДата
ОбрабатыватьДокументы Проведенные;
Док = Документ.Реализация.ТекущийДокумент;
Дог = Документ.Реализация.ТекущийДокумент.Договор;
Условие (Дог = Договор);
Что-то типа такого.
НачДата - Дата, с которой действует договор.
КонДата - Точка актуальности.
И еще совет на будущее... Даты можно не передавать не означает, что это хорошо делать. Поверьте, это моветон. Кроме этого, если случаи, когда это будет вызывать значительное торможение системы. Например, в случае с методом ВыбратьПодчиненныеДокументы
 
K

KateBakly

Спасибо, действительно, здесь нельзя было выбирать по значению.
Составила запрос, вроде того, что вы написали, только добавила еще группировку по дате.
Теперь надо получить последнюю в каждой группировке...

Получила номер и дату последнего документа реализации.
Но как теперь получить долг покупателя на эту этот последний документ?
 
V

vbs

Возможны варианты.
1. Если оплата привязана к расходному документу или договору - это просто (известны даты документа отгрузки и документа оплаты, а в договоре
может быть глубина кредита, либо она общая для всех - зависит от политики Вашей организации).
2. Если нет, можно раскручивать общий долг в обратном порядке документов и анализировать состояние взаиморасчетов на позицию каждого расходного документа.
Я это делаю так (не претендую на абсолютную истину, но заказали мне в одной из фирм именно это) :
Простой пример :
Скажем, общий долг контрагента 100 руб. Анализируем последнюю накладную (на 10 руб.), выясняем, что оплата по ней не просрочена, остается для анализа 90 руб.
Предпоследняя накладная (20 руб.) не оплачена в срок (просрочка 2 дня), начисляем штраф 40коп. и т.д.

Проценты начисляются либо по предъявлению претензии и подписанию оной д*цензура*ором, либо по удовлетворенному судом исковому заявлению кредитора

Это позволит СОСЧИТАТЬ штрафные санкции, но никак не ПРЕДЪЯВИТЬ. Vitfil совершенно прав - это прерогатива как минимум арбитражных органов, а то и суда.
 
K

KateBakly

Спасибо, все получилось, долги рассчитала, процент нашла.
Теперь не пойму, как документ провести, чтобы он отражался в ведомости по контрагентам...
Я написала так:
ДокПроцентыПросрочки = СоздатьОбъект("Документ.ПроцентыПросрочки");
ПрефДок = "ПП";
ДокПроцентыПросрочки.Новый();
ДокПроцентыПросрочки.УстановитьНовыйНомер(ПрефДок + "-");
ДокПроцентыПросрочки.ДатаДок = ДатаДок;
ДокПроцентыПросрочки.Контрагент = СпрКонтрА.Наименование;
ДокПроцентыПросрочки.Договор = ТекДоговор;
ДокПроцентыПросрочки.Фирма = Фирма;
ДокПроцентыПросрочки.Курс = Курс;
ДокПроцентыПросрочки.Валюта = Валюта;
ДокПроцентыПросрочки.Кратность = Кратность;
ДокПроцентыПросрочки.Сумма = Сумма;
ДокПроцентыПросрочки.Записать();
ДокПроцентыПросрочки.Провести();

Это надо процедуру ОбработкаПроведения делать?
 
V

vitfil

KateBakly
Попробую повторить свою мысль... Ваши расчеты - это НЕ долг контрагента, а потенциальная задолженность, которая признается за контрагентом либо добровольно, либо принудительно. И только после факта признания она может принимать участие во взаиморасчетах. Если хотите показывать "реальный долг", реализуйте это в виде отчета. Ну, или в форме списка контрагента динамическую колонку добавьте.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!