Отчёт по просроченной дебиторской задолженности для бухгалтерии (ФИФО)




Принцип обмена данными из 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='\

19 Comments

  1. ildarovich

    У меня вопрос:

    Будет полезен, если:

    не ведутся взаиморасчёты по документам расчёта (то есть на 62-м только субконто контрагент и договор).

    а разве такое когда-нибудь бывает?

    Reply
  2. AZel84

    (1) ildarovich, если это не риторический вопрос :), то вот скрин из БП 3.0

    Reply
  3. ildarovich

    (2) ничего из этого скрина не понял. На мой взгляд, он показывает, что третье (документы взаиморасчетов) субконто на 62-м счете есть. Его нельзя отключить в настройках. Значит, взаиморасчеты по документам ведутся в БП всегда и отчет по ФИФО в этой конфигурации не нужен.

    Вопрос не риторический. Я хотел свою разработку ускоренного ФИФО применить в БП, но решил, что там этот метод будет бесполезен, поскольку незакрытые отгрузки видны сразу из ОСВ по счету. А значит, просроченные долги определяются очень просто без всякого ФИФО.

    Ну и лозунги на скриншоте абсолютно неуместны в контексте данного обсуждения.

    Reply
  4. CheBurator

    (3) По моему можно отключить ведение взаиморасчетов в разрезе расчетных документов.

    Reply
  5. ildarovich

    (4) CheBurator, в Бухгалтерии 2.0 и Бухгалтерии 3.0 такой возможности я не нашел.

    Reply
  6. AZel84

    (5) ildarovich, ведение взаиморасчётов в разрезе расчётных документов явно в БП не отключается. Это зависит от учётной политики организации, а именно от способа оценки стоимости МПЗ при выбытии (на закладке запасы). Там 2 варианта «по средней» и «ФИФО». Если ведётся «по средней», то 3-е субконто будет оставаться пустым при проведении документов.

    Кстати в метаданных конфигурации изначально не заполнено 3-е субконто на 60-м и 62-м. Оно заполняется при создании новой базы и отключить его заполнение нельзя. По коду видно, что ранее это субконто заполнялось только если для любой из организаций выбран способ «ФИФО».

    Отчёт писался для комплексной конфигурации 1.1.48.1 релиза. В базе 3-е субконто пустое. Кстати не смотря на то, что выбран способ «ФИФО»…

    В общем для БП такой отчёт может понадобиться, если не ведётся учёт в разрезе расчётных документов (выбран способ учёта «по средней»).

    Reply
  7. ildarovich

    (6) я еще проверю, но пока кажется, что способ оценки стоимости МПЗ при выбытии не должен влиять на проведение документов по 62-му счету.

    Какая тут связь?

    Теоретически это скорее относится к 10, 41, 43-му. Там тоже есть третье субконто. Которое может быть пустым при проведении по этим счетам, но не по 62-му.

    Там это субконто всегда задействовано (не бывает пустым).

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

    Так что пока остаюсь при своем мнении — для типовых конфигураций бухгалтерий 2.0 и 3.0 отчет «взаиморасчеты по ФИФО» не нужен.

    Reply
  8. AZel84

    (7) ildarovich, действительно, вчера вечером уже смотрел, ошибся. Настройка в запасах никак не влияет на взаиморасчёты (это и логично). Так что, похоже вы правы, для типовых БП отчёт в этом виде не нужен.

    Ещё раз повторюсь, делал для комплексной, причём для такой, где иначе отчёт написать было нельзя.

    Reply
  9. AZel84

    Вообще меня смутил этот код:

    Функция ПроверитьАналитикуПередЗаписью()
    
    Если СпособОценкиМПЗ = Перечисления.СпособыОценки.ФИФО Тогда
    
    // Проверка ведения партионного учета
    Сч41 = ПланыСчетов.Хозрасчетный.Товары.ПолучитьОбъект();
    ПартионныйУчет = ?(Сч41.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Партии, «ВидСубконто») = Неопределено, Ложь, Истина);
    
    Сч60 = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками.ПолучитьОбъект();
    УчетПоРасчетнымДокументам = ?(Сч60.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами, «ВидСубконто») = Неопределено, Ложь, Истина);
    
    Если НЕ ПартионныйУчет ИЛИ НЕ УчетПоРасчетнымДокументам Тогда
    
    Если НЕ РольДоступна(«ПолныеПрава») Тогда
    
    Предупреждение(«Для указанных параметров учетной политики необходимо включаение дополнительных разрезов аналитического учета.
    |Недостаточно прав для изменения разрезов аналитического учета. Учетная политика не может быть записана!»);
    
    Возврат Истина;
    
    КонецЕсли;
    
    Если НЕ ПартионныйУчет Тогда
    ТекстСообщения = » партионный учет МПЗ.»;
    КонецЕсли;
    Ответ = Вопрос(«Для указанных параметров учетной политики необходимо включить дополнительные разрезы аналитического учета.», РежимДиалогаВопрос.ОКОтмена, , КодВозвратаДиалога.ОК, «»);
    
    Если Ответ = КодВозвратаДиалога.ОК Тогда
    Если НЕ ПартионныйУчет Тогда
    СкладскойУчет = НЕ (Сч41.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады, «ВидСубконто») = Неопределено);
    СуммовойУчет = ?(СкладскойУчет, Сч41.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады, «ВидСубконто»).Суммовой, Ложь);
    ОбщегоНазначения.ПрименитьПараметрыАналитикиМПЗ(Истина, СкладскойУчет, СуммовойУчет,);
    КонецЕсли;
    
    Если НЕ УчетПоРасчетнымДокументам Тогда
    ОбщегоНазначения.ПрименитьПараметрыАналитикиРасчетов(Истина,);
    КонецЕсли;
    
    Иначе
    Возврат Истина;
    КонецЕсли;
    КонецЕсли;
    
    КонецЕсли;
    
    Возврат Ложь;
    
    КонецФункции

    Показать

    Эта процедура вызывается при записи учётной политики.

    Выполняется процедура ОбщегоНазначения.ПрименитьПараметрыАналитикиРасчетов(Истина,)

    Если СпособОценкиМПЗ = Перечисления.СпособыОценки.ФИФО

    Reply
  10. AZel84

    Ещё вспомнил немаловажный момент. Учёт на 62-м счёте в разрезе документов расчётов ведётся при условии корректно восстановленной последовательности документов.

    Восстановление последовательности часто проводится лишь при закрытии месяцев. Следовательно данные в подобных отчётах могут постоянно меняться. При расчёте долга по ФИФО изменения в отчёте отражаются сразу, так как распределение оплат происходит каждый раз заново.

    Так что даже при наличии 3-го субконто, отчёт имеет место быть.

    Так же обнаружил ещё одну базу БП 2.0, где учёт по документам расчёта не ведётся.

    Reply
  11. @Sonya

    Отчет работает как надо, спасибо. Применяю на СКАТе.

    Замечания:

    1) Если по документу просрочки еще нет, отрицательное число хорошо бы обнулить

    2) Если задолженность отрицательная, можно было бы ее не показывать. Мы ведь дебиторку подразумеваем?

    (у себя исправила)

    Reply
  12. Salty

    Очень полезный отчет, работает замечательно. Большое спасибо.

    Reply
  13. AnneF

    Как вставить «Дней отсрочки» для БУ 2.0. Из справочника Договора не берется.

    Reply
  14. AnneF

    Для бухгалтерии 3.0 совсем не работает

    Reply
  15. olegale

    Как я понял работает только от календарных дней отсрочки.А как же рабочие дни?

    Reply
  16. AZel84

    (15) olegale, да, только количество дней отсрочки. Для нужд многих клиентов этого достаточно.

    Можете доработать. Использовать производственный календарь, который должен быть заполнен. Примеры на инфостарте есть.

    Reply
  17. zmo

    Для 1С 8.2 Бухгалтерия предприятия, редакция 2.0 (2.0.65.7)

    не подтягивается «Дней отсрочки»

    как быть?

    Reply
  18. SlaSla

    Возвраты каким образом отображаются в этом отчете?

    Reply
  19. Degtjarev

    Таблица не найдена : РегистрСведений.ЗначенияСвойствОбъектов

    БП КОРП (3.0.49.28) 1С:Предприятие 8.3 (8.3.9.2233)

    Как это исправить ??

    Reply

Leave a Comment

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