Дебиторская задолженность (1С:Бухгалтерия 7.7)




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

31 Comments

  1. sandlog

    Полезная обработка ❗

    Reply
  2. iw6

    Спасибо за программу, очень помогает в работе.

    Reply
  3. Лена_Лена

    Спасибо, то что нужно!

    Reply
  4. RRR1RRR

    Очень хорошо, надо бы и по кредиторской тоже. И возможность выбрать счета.

    Reply
  5. ula1c

    Прекрасно работает и в УСНО. Спасибо. Помогли при создании резервов.

    Reply
  6. SkyOrion

    Добавил возможность выбора счета и поменял печатную форму под себя. Но основа и идея осталась без изменения!!! Спасибо автору. 😉

    Reply
  7. erthia

    (6) SkyOrion, Здравствуйте, не могли бы выложить свой вариант обработки на Инфостарт? с указанием здесь ссылки. Заранее благодарю.

    Reply
  8. g26516

    Спасибо, очень полезная штучка.

    Reply
  9. g26516

    Отчет просто мечта бухгалтера.

    Reply
  10. luckardo

    для Украины работает?

    Reply
  11. skurser

    пригодилось, спасибо

    Reply
  12. kulkrise

    Мне очень важно знать будет ли эта обработка работать в УСН 1.3 (Упрощенная система налогообложения, релиз 7.70.231)? напишите пожалуйста

    Reply
  13. Milky_Way

    (12) kulkrise, извините, что сразу не ответил (был в отпуске) — должно работать, но точно сказать сразу не могу, нет под рукой УСН, да и давно это было. Но точно, что нужно сделать — это сравнить список счетов, по которым будет браться задолженность. Обработка открыта, можете зайти и посмотреть те ли счета или не те… Ну или вот:

     СписокСчетов = «60, 62, 66, 67, 75, 76.1, 76.2, 76.3, 76.5, 76.6, 76.11, 76.22, 76.55, 79.3»;

    А, и еще, возможно вот этот документ будет называться в УСН по другому:

     ДокБС = СоздатьОБъект(«Документ.БухгалтерскаяСправка»);
    Reply
  14. kulkrise

    (13)

    ДокБС = СоздатьОБъект(«Документ.БухгалтерскаяСправка»);

    Milky_Way, все дело в том, что этот документ отсутствует в УСН.

    Reply
  15. CheBurator

    а как определяется дата возникновения задолженности (в типовой БУХ на счетах нет аналитики расчетов по документам)..?

    Reply
  16. kulkrise

    (15)

    а как определяется дата возникновения задолженности

    дата возникновения задолженности и в типовой БУХ и в УСН определяется по факту совершения отгрузки, а бух. справкой (в типовой БУХ) или выпиской в БУХ либо УСН определяется дата погашения задолженности.

    (в типовой БУХ на счетах нет аналитики расчетов по документам)..?

    есть конечно

    Reply
  17. Milky_Way

    (14)

    Здравствуйте, Кристина. На сколько мне помнится, что в УСН вместо БухгСправки делается ОперацияВручную… Может чего и путаю, давно не работаю с 77, тем более в УСН :-)))

    Reply
  18. Milky_Way

    (15)

    Кристина уже ответила, не успел.

    Reply
  19. CheBurator

    (16)

    (в типовой БУХ на счетах нет аналитики расчетов по документам)..?

    есть конечно

    — это где «есть»?

    насколько я помню, в типовой бух максимум (например, на том же самом 62.1) — аналитика по договорам, мы же не будем приравнивать каждую отгрузку к отдельному «договору»..?

    Reply
  20. CheBurator

    (16) > дата возникновения задолженности и в типовой БУХ и в УСН определяется по факту совершения отгрузки

    — я СИЛЬНО сомневаюсь что есть аналитика по документам (см. предыдущий мой пост) — в итоге что, — колбасится все перебором документов?

    Reply
  21. kulkrise

    (17) да, все верно, в УСН есть документ «Операция», мы его практически не используем (за редким исключением).

    Т. е., если я Вас правильно поняла, мне надо вместо

    ДокБС = СоздатьОБъект(«Документ.БухгалтерскаяСправка»);

    поправить

    ДокБС = СоздатьОБъект(«Документ.Операция»);

    ну и далее по тексту, соответственно?

    Reply
  22. kulkrise

    (19) в том то и дело, что в основном, при создании нового документа отгрузки я нажимаю «Новый», создается новый договор типа «Счет №#### от ##.##.##»,и как Вы и говорите приравниваю

    каждую отгрузку к отдельному «договору»

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

    Reply
  23. kulkrise

    (20) в моем случае практически только так и остается, т.к. аналитика не всегда возможна (см.#20), а «ломать» конфу без вариантов.

    Reply
  24. CheBurator

    (22) нормальное решение.

    Reply
  25. CheBurator

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

    Reply
  26. kulkrise

    (25) этот вариант я упустила.

    Возможно и по скорости будет быстрее, чем выборка по документам?

    Reply
  27. CheBurator

    (26) не знаю, надо смотреть

    здесь, я бы, кстати, не заморачивался ПОКА на быстродействии (это всегода при необходимости можно ускорить — это чисто техническая задача), а заморочился тем — что работа по проводкам ГАРАНТИРОВАНО даст ВСе суммы и ничего не пропустит, в отличии от работы по документам (документ «Сторно» учли? Точно уверены что не пропустили ни одного документа? точно-точно? и ВСЕ самописные документы учли?)

    Reply
  28. CheBurator

    например та же самая отгрузка без перехода права собственности (на 45 счет) — а не налажали ли вы, включив этот документ в дебиторку..?

    ну и т.д.

    Reply
  29. vdolynsky

    За переменную «Тараканья*****» особое спс — поржал!!!

    Reply
  30. kulkrise

    ошибочно

    Reply
  31. Milky_Way

    (29) как молоды мы были, и глупость всякую несли :-)))

    Reply

Leave a Comment

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