Отчет по просроченной задолженности/задолженность по интервалам (УПП УТ 8.1, СКД)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

88 Comments

  1. anig99

    Мда… Логика…»Я не знаю, но на всякая случай минус поставлю…». В 8ке в договоре есть галочка «Контролировать число дней задолженности. Рядом с ним есть поле — число дней задолженности.

    Reply
  2. Поручик

    Да, логика. Не читал, но осуждаю.

    (1) Если не знаешь, так действительно, чего лезть. Данный параметр договора используется и в документах, при проведении, если чо.

    Reply
  3. anig99

    Единственное, что может быть — Че неправильно понял фразу «если указан 0, то из параметра «Дней отсрочки по умолчанию».». В данном случае «Дней отсрочки по умолчанию» — это параметр самого отчета, а не справочника Договоры… Просто описалово выдрал из хэлпа. В контексте самого отчета понятнее.

    Reply
  4. CheBurator

    (2) А скажите мне всезнающие люди. При изменении параметра «задолженности/отсрочки» В ДОГОВОРЕ — все данные отчета поплывут или нет?

    Reply
  5. CheBurator

    Непонятливым объясняю.

    Минус влеплен за неподобающее оформление разработки на данной странице. Отсутствие скриншотов существенно затроудняет анализ и выбор требуемой разработки пользователями. Думайте не только о себе, плиз…

    .

    вдогонку (2) > Данный параметр договора используется и в документах, при проведении, если чо.

    — очень сомневаюсь. Использование ПРИ ПРОВЕДЕНИИ документа данных, не сохраняемых в реквизитах документа — признак дурного тона программирования 1С… так что убедительная просьба знающему УТ человеку разъяснить. каким образом этот параметр договора влияет на проведение документа.. плиз..

    Reply
  6. braynt

    КонтролироватьЧислоДнейЗадолженности реквизит объекта. При оперативном проведении документа «Реализация товаров и услуг», при установленном флаге Контролировать число дней задолженности происходит контроль числа дней задолжности.

    Reply
  7. luns

    Сhe Burashka ты не прав… поставлю плюс для равновесия…

    Reply
  8. anig99

    (6) тогда нужно ваять бота, который будет на 80% опубликованых обработок «-» вешать…нетути там скриншотов. А выбор обработки осложняет не отсутсвие скриншотов, а кривые/нестандартизированые интерфейсы. У СКД интерфейс кривой, зато стандартный.

    (6) (вторая половина) вообще не в ту степь. Как указано в (7) реквизит создан 1С (вот такой у них дурной тон (: ). Создан для остановки отгрузки при превышении числа дней задолженности. На содержательную часть проведения документа не влияет — просто не дает проводить оперативно. Вся доработка конфы заключалась только в том, что это реквизит в договоре сделать не только запретительным, но и справочным (не отменяя запретительную функцию). Просто была отменены условия видимости/невидимости этого поля и его обнуления.

    (5) поплывут, но отчет по просроченной задолженности требуется для оперативного анализа. И если даже в фирме заведено так, что изменяются условия УЖЕ заключенного договора (тут, кстати, вообще куча всякой гадости вылезает), а не правильным заключением дополнительных соглашений, то оперативная составляющая отчета тут не повредиться, а продолжит выполнять свою функцию. А если уж так хочется стабильности и независимости, то есть отчет по интервалам, но там уж «одна норма» на всех.

    Reply
  9. anig99

    Поплывут — изменится распределение просроченная/непросроченная задолженность.

    Reply
  10. anig99

    И ещё раз касательно (7). Число дней задолженности именно тот показатель, который требуется для данного отчета. Если в организации используется 2 даты — «дата предупреждения» и «дата запрета», то дата предупреждения или хранится в дополнительном реквизите, или держится в голове. В первом случае я не телепат и пусть кто там дополнительные поля ваял, то отчет и подправит (все открыто и понятно). А во втором — или отчет по интервалам, или добавка 1 строчки с обнулением в код отчета.

    Reply
  11. CheBurator

    Господа, скажите, плиз, есть в документе заявка/отгрузка реквизит типа «дата оплаты»…???

    Reply
  12. anig99

    В заявке есть 2 реквизита Отгрузка и Оплата…а в отгрузке…точнее реализации товаров и услуг и реализации отгруженных товаров таких параметров и не было (токо что ещё раз проверил… не… точно нет (% ). Весь смысл этого отчета получить задолженность вне зависимости от ведения расчетов по заказам/сделкам и ошибок закрытия заказов/сделок… Если в организации правильно ведется учет по сделкам, то этот отчет не нужен, достаточно стандартных средств 1с. Должен напомнить, что много уже говорилось о «идеальном» предприятии 1с и реальности. Актуальный и достоверный отчет по логике 1с требует ежечасного контроля над взаиморасчетами.

    Reply
  13. Поручик

    >>>> Актуальный и достоверный отчет по логике 1с требует ежечасного контроля над взаиморасчетами.

    И здесь подписываюсь. Особенно если несколько элементов договоров, и необходимо

    следить за правильной расстановкой в платёжных, отгрузочных доках.

    Reply
  14. Поручик

    Сам отчёт пока не юзал, сейчас нет возможности, типа не читал, но одобряю. Но за идею плюс. По возможности посмотрю работу.

    Reply
  15. anig99

    (16) Календарные дни. Традиционно используем только календарные, поэтому писать алгоритм расчета банковских дней только как «плюшки», не хотелось. Если очень нужно, подскажи алгоритм, добавлю.

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

    (17) Долг расчитывается по алгоритму схожему с FIFO. Подробнее. Находится общая сумма долга (по контрагенту, договору, сделке). С конечной даты в обратном порядке перебираются все документы взаиморасчетов. Документы увеличивающие задолженность уменьшают сумма нераспределенной задолженности и так до нуля. Попутно заполняются данные сумма долга, сумма просроченного долга, оплата (оплата не привязана к документу реализации, нужна справочно, чтобы видеть что по клиенту есть движения) и т.д. В результате имее таблицу с документами, которую передаем в СКД. Таким образом, мы не зависим от распределений сумм средствами 1с.

    Reply
  16. anig99

    возвраты в этом случае — уменьшают задолженность.

    Reply
  17. ZLENKO

    (20) Я в своем отчете по просроченной задолженности недавно реализовал расчет отсрочки по календарным либо рабочим дням и разбиение суммы документа на предоплату и отсрочку по % предоплаты в договоре — кому надо — обращайтесь.

    Reply
  18. ZLENKO

    (22) да — про него

    Reply
  19. ZLENKO

    (24) 🙂 Вообще то у меня ник «Z», но тут на инфостарте надо было минимум 3 символа — пришлось дополнить. Позднее придумал такой вариант «Z-z-z» — мне он показался более прикольным.

    Reply
  20. looxxx

    как настроить отчет чтобы показывал группировку по дням, неделям или месяцам?

    Reply
  21. anig99

    А что именно? Просроченный долг или интервалы?

    Reply
  22. MariP

    ПЛЮС!!!

    Есть клиенты с разными отсрочками, поэтому очень пригодится отчет.

    СПАСИБО

    Reply
  23. macsol

    Протестировал твою обработку. делал так: создал переменную счетчик, и при каждой команде Запрос.Выполнить(), увеличивал её на 1.

    Результат 2 248 ( и возможно я еще не все запросы обложил счетчиком).

    Это не иначе как изнасилованием сервера не назовешь. Впечатление жуткое. Все эти данные можно получить с помощью одного запроса и нескольких строчек кода.

    Я изменил свою обработку, посмотри.

    Reply
  24. anig99

    Количество запросов равно количеству контрагентов(договоров). Можно заменить и на 1 запрос, но тогда придется хранить ВСЮ таблицу взаиморасчетов для этих контрагентов в виде таблицы значений и оттуда уже выбирать нужное. Вопрос только что же всё-таки лучше: 1 большой запрос или много маленьких. Между прочим, мой код открыт — можно модифицировать в сторону уменьшения кол-ва запросов.

    Кроме того, показателей всё-таки у меня поболе, чем в твоей. Но это не минус тебе.

    Reply
  25. macsol

    (30) По запросам. Один большой — выполняется 1.5 секунды. Если сунуть туда отборы меньше.Напомню что база данных предназначается не для разработчика а для бухгалтеров, по этому при программировании необходимо понимать что ты не один. Если все начнут писать запросы в циклах, мы за день всем заводом будем проводить один документ.

    ВСЯ таблица взаиморасчетов — хранится в оперативке, у меня окромная база, а результат запроса всего 9000 строк(если без отборов). Для клиентской машины средней производительности — как два пальца … (Опять же стоит подумать о других пользователях и не перегружать их машины)

    На мой взгляд, в реализации этой задачи, ты изначально пошел не тем путем, поэтому (это только мое мнение) проще заново сделать чем модифицировать.

    А код я закрыл, потому что в предыдущем случае ты не нашел в нем ничего нового и интересного..

    Reply
  26. anig99

    (: Посмотрим (: Весь код писался именно под легкость модификации.

    Reply
  27. macsol

    Почитал твою тему на форуме. Если получится ускорить отчет с помощью маленьких простых запросов, напиши плиз, хочется посмотреть и сравнить. Я выложил вторую версию отчета, куда воткнул отборы. Некоторое ускорение есть, но это предел. Быстрее он уже не станет.

    Reply
  28. anig99

    Я пошел в другом направлении. Всё в одном запросе. Через пакетные запросы. В чистом виде пока быстрее, чем у тебя.

    Reply
  29. macsol

    (34) Ты пошел в моем направлении 🙂

    Reply
  30. looxxx

    (27) просроченный

    Reply
  31. anig99

    (36) Там участвуют два основных параметра связанных с датой — число дней просроченной задолженности (и его производные) и дата регистратора. Какой именно параметр группировать в периоды? Или чтобы было — вот этот долг возник в таком-то месяце, это в таком-то и т.д.? Можно добавить поле, которое вычисляет дату возникновения долга и группировать по нему с периодом в месяц, день и т.д. Просто не возникало задач по группировке просроченной задолженности по периодам вообще, поэтому точное описание требуется.

    Reply
  32. macsol

    Как ты считаешь нарастающий итог, если несколько документов по одному договору проведены в одной секунде? Я на этом голову сломал.

    Reply
  33. macsol

    Плюс я поставил за смену подхода.

    Есть недоработки

    1 Проверяй запрос ( остаток на дату отчета у некоторых контрагентов не сходится с ведомостью по взаиморасчетам и с остатком по регистру «В-ты с к-ми» на дату.

    2 Желательно получать данные в разрезе организаций, потому как часто в одной базе несколько организаций.

    Reply
  34. anig99

    (38) Дополнительной проверкой по ссылке.

    ВЫБОР

    КОГДА ПериодыРегистратор.Период < УвеличениеРегистратор.Период

    ТОГДА ИСТИНА

    ИНАЧЕ ВЫБОР

    КОГДА ПериодыРегистратор.Период = УвеличениеРегистратор.Период

    ТОГДА ПериодыРегистратор.Регистратор <= УвеличениеРегистратор.Регистратор

    ИНАЧЕ ЛОЖЬ

    КОНЕЦ

    КОНЕЦ

    Reply
  35. anig99

    (39) 1. Это особенности реализации подхода. Сегодня-завтра выведу закономерности и на примерах покажу.

    2. учту. Я этот запрос мучаю для второй версии отчета.

    Reply
  36. anig99

    ВАЖНОЕ ЗАМЕЧАНИЕ! Если у Вы думаете, что общая задолженность по моему запросу не совпадает с ведомостью по взаиморасчетам и отчетом по задолженности, то вы скорее всего ошибаетесь. Объясню почему. Дело в том, что типовые отчеты построены так, что вне зависимости какую группировку Вы выбираете (контрагент, договор и т.д.), те отборы, которые включены (например Сумма>0) действуют на нижнем уровне самого отчета, а не на выбранной группировке.

    Ситуация. У контрагента есть два договора А и Б, взаиморасчеты по которым ведутся вцелом по договору(можно и по-другому, просто пример легче). По первому договору у клиента долг 100 000, по второму переплата 50 000. Теперь пробуем получить ведомость по взаиморасчетам. Выберем группировку по договорам — выйдет всё красиво и верно. Теперь выберем группировку только по контрагентам — в результате получим цифру 50 000 долга — опять верно. А теперь добавим условие сумма остатка >0 и бац!!!! Остаток — 100 000! Как! Почему! А потому, что сначала фильтруются записи, а потом строится группировка. Такая же фигня для отчета по задолженностям… Видимо, чтобы такая фигня не бросалась в глаза из отчета по взаиморасчетов убрали возможность получать отчет в разрезе документов-регистраторов.

    Как же проверить данные? Нужно не задавать отборов на сумму, а получить отчет сгруппированый как нужно и кинуть его в ексель или calc чтобы убрать суммы меньше 0. Ну или написать свой отчет с нужными группировками (:

    Reply
  37. Valerich

    плюсанул.

    Маленький совет

    вместо

    стр1.ВидСравнения=стр.ВидСравнения;

    стр1.Использование=стр.Использование;

    стр1.ЛевоеЗначение=стр.ЛевоеЗначение;

    стр1.ПравоеЗначение=стр.ПравоеЗначение;

    стр1.Представление=стр.Представление;

    стр1.Применение=стр.Применение;

    стр1.РежимОтображения=стр.РежимОтображения;

    и т.д. проще использовать ЗаполнитьЗначенияСвойств( Стр1, Стр ) — больше шансов, что ничего не пропустишь 🙂

    Reply
  38. anig99

    спасибо. это мой первый опыт работы с скд, поэтому отлавливать баги так было легче, но исправлю

    Reply
  39. anig99

    (46) Конечная дата нужна для получения дополнительных данных (оплата за период и продажи за период) — с получением долгов никак не связано.

    Во втором отчете — демонстрация запроса. Никакой гибкости не предусмотрено. Просто я пересмотрел алгоритм и переделываю основной отчет. Причем не только алгоритм, но и юзабилити, и функционал, поэтому его ещё здесь нет.

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

    (45) Настройки очень просты. Если ты хоть немного разбираешься в СКД. Галочки у параметров не меняем, сами параметры менять можно. Чтобы отобрать контрагентов — задаем отбор по контрагентам (любой отбор без групповых условий). Задаем нужные группировки и вперед. Если хочешь, чтобы менеджеры не мучались, то создаешь все настройки — сохранеяшь их в xml (чтобы не потерялись) и вперед. У меня менеджеры просто нажимают кнопку.

    (45) описал мой первый алгоритм. Второй быстрее.

    Reply
  40. ZLENKO

    (46) (47) Вот поэтому я и пользуюсь для написания отчетов платформой универсального отчета, а не СКД — настройки универсального отчета понятные, привычные пользователям и очень «гибкие».

    Reply
  41. anig99

    (48) На самом деле почти одинаковые что универсальный, что СКД. Только расположение элементов разное (можно поправить). Те кто РАЗБИРАЕТСЯ в универсальном, разберется и в СКД. А кто запоминает — будет дальше тренировать память. С другой стороны, я сейчас в СКД вынес основные настройки на закладку формы. А остальное… тут сидят такие, что и в универсальном не разберуться. Поэтому готовлю инструкцию по использованию СКД.

    Reply
  42. ZLENKO

    (34) А по сравнению с моим отчетом у Вас быстрее ?

    Reply
  43. anig99

    (50) на моей базе УПП — мой отчет намного быстрее… даже по 1 клиенту. Брал демо отчет

    Reply
  44. ZLENKO

    (51) Хм.. а в цифрах «намного» как выражается ?

    Reply
  45. ZLENKO

    Посмотрел новый запрос — суть не «вкурил», но количество создаваемых временных таблиц впечатлило.

    Reply
  46. anig99

    (52) минут 10 твой отчет точно получается.

    (53) как раз эти временные таблицы и оптимизируют расчеты.

    Reply
  47. ZLENKO

    (54) что то тут не то… по всем контрагентам (на реальных базах за 2 года работы компаний) я не видел чтобы больше 30 секунд строился. Сколько документов по контрагенту ?

    Reply
  48. anig99

    (55) база больше 3 лет. сколько документов не знаю. позже погоняю ещё отчет — ща сервера заняты

    Reply
  49. Alex_will

    доработаю под БП….такое же надо…но толкового на сайте не нашел

    Reply
  50. ZLENKO

    (57) Чем мой отчет не устраивает ? При желании его можно переделать под БП.

    Reply
  51. Alex_will

    (58) я ж написал что «доработаю под БП». не нашел готовый под БП

    Reply
  52. Yul_kat

    А как сделать отбот по организации?

    Reply
  53. Yul_kat

    отбор

    Reply
  54. anig99

    (60). В какой именно обработке? В принципе, ни в одной из этих не предусморен учет нескольких организаций, но доработать их можно. Но реализованы они по разному, поэтому и нужно знать версию.

    Кроме того, есть платная версия, где организации учтены и есть много чего ещё.

    Можно в личку.

    Reply
  55. murin

    Пользуюсь этим отчетом, неплохой отчет. Плюс поставил. Добавлял группировку по договорам (после контрагентов) и делал отбор по «виду договора» — выходит ошибка :(, а если добавляю группировку «виду договора» в верхний уровень, то отбор работает.

    Reply
  56. anig99

    (63)Отчет бесплатный и узкоспециализированый. Проблема скорее всего в неправильной отработке предварительного отбора.

    Reply
  57. anig99

    (63) попробуйте «Новый запрос».

    Reply
  58. WKBAPKA

    а как насчет «развернуть по иерархии»… задача простая, нужно вывести контрагентов, договора контрагентов, сделки и документы расчета + регистраторы по которым есть долг и разбросать этот долг между текущей просроченной и лояльной с учетом итогов по иерархии… что то в ваших реализациях я этого не увидел…

    Reply
  59. anig99

    (66) в полной версии это возможно. http://infostart.ru/public/21672/

    Reply
  60. Ant-1905

    спасибо, понравился отчетик! 😉

    Reply
  61. WKBAPKA

    а если использовать простой алгоритм… делаем запрос по долгам и группируем по дням. опосля чего используем следующую формулу, отсчитываем количество дней отсрочки и смотрим, если остаток на конец больше чем остаток на начало + кво дней отсрочки за который могла быть отгрузка, значит просроченная дебеторская задолженность все же есть… т.е. идея такая, что остаток на конец всегда должен стремиться к нулю! немного сумбурно, но приблизительно идея понятна?

    Reply
  62. anig99

    (69) идею пока не вкурил. можно поподробнее формулу на языке математики или алгоритм.

    Reply
  63. WKBAPKA

    2(70): допустим есть договор с отсрочкой платежа в 7 дней. отгрузили товар. через 7 дней товар должен быть оплачен. соответственно через 7 дней долг должен равняться нулю. Но так как в этот период могут быть еще отгрузки, а также оплаты, то сумма долга на конец должна быть меньше суммы долга на начало (т.е. конец период — 7 дней) + отгруженный товар за этот период, что означает, что в этот период было уменьшение долга, т.е. он не вырос. Если сумма долга больше — это и есть просроченный долг. Правда тут не подсчитать количество дней просрочки, вернее можно, но нужно ли !

    Reply
  64. WKBAPKA

    соответственно если на конец есть остаток, а за период не было отгрузок и остаток на конец = остатку на начало, то тоже считается просроченным долгом, т.к. за этот период отсрочки долг не уменьшился

    Reply
  65. anig99

    (72) Ага. Тогда 4 замечания:

    1. Таким способом можно получить только сумму просроченного долга, но никак не его структуру и свойства.

    2. Алгоритм проверки можно сократить. В Вашем случае получаем Сумма долга на дату -7дней, сумма отгрузки и сумма долга на текущую дату. Можно обойтись суммой долга на дату -7дней и суммой оплаты за этот период. Т.е. Просроченный долг = СуммаДолга[-7д] — СуммаОплатыЗаПериод[7д]

    3. Без кодинга такой подход можно реализовать только в рамках СКД — параметрическая связь НаборовДанных (как в отчете по продажам в определенных ценах)

    4. Алгоритм невозможно модернизировать для случаев, когда количество дней просрочки устанавливается для каждого документа разные

    Reply
  66. WKBAPKA

    2(3): без кодинга действительно нельзя. Зато одним запросом.

    по поводу п.4 как раз этот алгоритм и применяется когда количество дней просрочки либо в договоре либо в документе могут быть разные.

    по понкту 2, не можем. Особенно, если отсрочка устанавливается для каждого документа,а платежи не разносятся по документам!

    можно также высчитать и глубину долга…

    Reply
  67. WKBAPKA

    т.е. я хотел сказать, что разница между началом и концом показывает нам увеличение/уменьшение долга… а это могут быть как проплаты, так и возвраты и т.п. без кодирования не обойтись как раз потому, что для каждого договора могут быть разные условия отсрочки, и делать на каждого клиента запрос можно было бы, помещая во временную таблицу, только вот как быстро это будет работать?

    Reply
  68. ivan07

    Отчет пригодился нашим бухам, Спасибо большое

    Reply
  69. evgeniy.bilyk

    Спасибо, полезный отчет, пригодился

    Reply
  70. francisco

    Попробуем, должно быть не плохо.

    Reply
  71. volga1

    Возможно посчитать просрочку по такой схеме с помощью запроса?

    Пример:

    период 01.04.2012 по 20.05.2012

    Контрагент (Число дней допустимое 14)

    Сумма долга начало -100р

    Реализация №1 от (01.04.2012) 200р просрочено 21день

    Реализация №2 от (05.05.2012) 150р не просрочено

    Приходник №1 от (05.05.2012) -150р

    ВозвратТовара №1 от (06.05.2012) -100р

    получается только к концу периода просроченные реализации видно а как в течении периода просроченные реализации видеть как здесь

    этот пример за период не показывает просрочку по фифо, нужно чтобы Реализация №1 показывалась как просроченная(хотя и оплачена но с опозданием на 21день).

    Какой должен быть алгоритм запроса?

    Reply
  72. anig99

    (80) я это сделал объединяя отчеты за каждый день периода (программно) в одну таблицу.

    Reply
  73. volga1

    (81)

    Вы предлагаете не запросом это реализовать, то есть запросом не реально?

    Reply
  74. anig99

    (82) мой запрос основывается на регистре взаиморасчеты с контрагентами, который не подразумевает закрытие по документам расчета. По нему можно узнать остатки и движения, но не какой документ и когда был оплачен. Запрос действует из предположения, что документы закрываются по фифо, но сам расчет фифо не производит, а только получает однозначно ещё не закрытые по оплате документы. Получать данные о долгах в разрезе периода можно только имея информацию о том, когда реализация была оплачена. Это возможно 2 способами:

    1. написать простой отчет по регистру взаиморасчеты по документам расчетов, но для этого регистр нужно всегда держать в порядке

    2. получить неоплаченные долги за каждый день периода и уже эти данные объединить в 1 таблицу, которую можно проанализировать дальше.

    Reply
  75. volga1

    (83)

    1.(взаиморасчеты по документам расчетов) — не приемлемо т.к. договоры не учитываются, контрагент может покупатель и поставщик одновременно быть, даже число дней на контрагента прописал.

    2 вариант попробую.

    Ваше мнение — если в регистр (взаиморасчеты с контрагентами) добавить ресурс или вообще новый регистр создать и документами в него расчет делать а после для отчета данные брать из него?

    Reply
  76. anig99

    (84) зачем что-то дописывать в конфе? Напишите обработку, которая будет рассчитывать взаиморасчеты по fifo и писать их в регистр взаиморасчеты по документам расчетов. Т.е. у Вас будет отключен основной механизм движения по этому регистру, но Ваша обработка будет писать туда данные как нам нужно по fifo с привязкой по документам. При ручном перепроведении этого документа движения пропадут и таким образом можно будет вычислять период, с которого нужно делать перерасчет (граница последовательности). Если же менять конфу, то можно точно также обойтись этим же регистром и подпиской на событие запись документа. Тогда движения не будут пропадать при ручном перепроведении, но надо будет где-нибудь хранить границу последовательности.

    Reply
  77. volga1

    (85)

    Сделал (просрочка в течении периода просроченные не оплаченные и просроченные оплаченные реализации видно)

    Reply
  78. mari0210

    надо для бюджета((((((кредиторскую и дебиторскую просроченную задолженность в разрезе договоров….очень надо….не могу найти…

    Reply
  79. Ламия

    Большое спасибо автору

    Reply
  80. zforall

    Отличный отчет. Только я не могу почему-то настроить вывод по договорам контрагента. Подскажите, пожалуйста как расположить группировки чтобы увидеть данные по договорам.

    Reply
  81. anig99

    (90) чтобы заработало по договорам нужно указать в настройках, которые на закладке отдельное, группировка: по договорам (выпадающий список). Это сформирует исходные данные для отчета в разрезе договоров, а не контрагента. После этого нужно в настройках, которая по кнопке сверху (открывается отдельное окно) добавить в группировку внешнего вида отчета Договор контрагента.

    Reply
  82. zforall

    Подскажите в каком направление надо рыть чтобы отчет считал не по календарным а по банковским дням. Заранее спасибо.

    Reply
  83. anig99

    (92) в этом отчете нет такой настройки. В более поздних вариантах, которые я не публиковал, есть привязка к производственному календарю, что и дает банковские дни.

    Reply
  84. zforall

    И как же можно получить для тестирования неопубликованный вариант? 🙂

    Reply
  85. anig99

    (94) попробую на выходных выслать. Скиньте почту в личку.

    Reply
  86. mr_AntA

    Можно ли переделать так, чтобы показывал не только долги, но и переплаты?

    Reply
  87. anig99

    (96) Вообще — можно. Через какое-то время буду писать такой отчет. Когда точно — не скажу, но до нового года, скорее всего

    Reply
  88. 028

    Как сделать чтобы отчет учитывал остатки перенесенные с прошлого года

    в базе они отражаются через документ ввод начальных остатков? Раздел учета: Расчеты с покупателями и заказчиками (счета 1210, 3510)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *