Проверка создание счетов-фактур введенных на основании реализаций




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

24 Comments

  1. gutentag

    А проверка сч-ф выписанных на других онованиях — ненужна совсем? 🙂

    Reply
  2. levran

    (1) На данный момент ненужна, но в принципе код открытый, дописать имхо пару пустяков.

    Reply
  3. Арчибальд

    (1) Вот так! (это я про второй коммент). Откуда посетителям знать, что им нужно?!

    Reply
  4. levran

    (3) Я выкладываю обработки, которые создаю в процессе ежедневной работы. Специально затачивать пока нет времени, да и особого желания. Если есть нужда, можно договорится, как говорят: любой каприз за ваши деньги =)

    PS. Если посетитель не знает что ему нужно, то это проблема посетителя, а не моя. Как то так.

    Reply
  5. Мощный

    Договариваться тут не про что — вещь довольно убогая, обычная дефектовка, коих пишешь десятками В ПРОЦЕССЕ и ценна ну разве что тем, что создает реестр накладных с отсутствующими счетами-фактурами, а вот создавать выданные счета-фактуры… ? вам не кажется это.. несколько ?.. как бы это помягче сказать..

    Reply
  6. Tatitutu

    (5) Прежде чем осуждать, поделись своим. Ты хоть скачал, посмотрел или так …за компанию, составил мнение по комментариям.

    (3) первую фразу хорошо сказал

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

    «PS. Если посетитель не знает что ему нужно, то это проблема посетителя, а не моя. Как то так.» — а вот это ты в корне не прав. На то ты и программист автоматизатор , чтобы улавливать на лету желание клиента.

    Reply
  7. Мощный

    (6) Коллега ! Вы считаете что, то чем вы «поделились» дает вам право на такой тон ?.. бесплатно.. совершенно..

    Как бы это сказать помягче..

    Лично я бы такими поделками «делиться» просто б постеснялся..

    И еще — можно я оставлю за собой право высказывать свое отношение ?

    Reply
  8. Tatitutu

    (7) Чем Вам мой тон не понравился ?

    В чем я не прав ?

    Он выложил «свой труд» бесплатно.

    Может на данном этапе для него это высший пилотаж.

    У тебя все сразу получалось ?

    Я автора тоже осудил за его комментарии.

    У пользователя должен быть выбор.

    А автор сдесь делает себе свое имя.

    Reply
  9. Мощный

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

    ЗЫ

    А вот автору, на мой взгляд, «делать имя» стоило бы нормальными работами, а не профанацией, то бишь реестрами.. Но советовать не буду, надеюсь и сам он разберется, в чем пожелаю ему удачи..

    Reply
  10. Ish_2

    (9) Ничего страшного. Мы все тут учимся.

    Это как бы сказать помягче… деликатности.

    Reply
  11. Мощный

    (9) Да, конечно.. Только деликатность это нечто иное.. Скорей всего Вы имели в виду элементарную вежливость при общении..

    Reply
  12. Tatitutu

    (9) нагрубить я никому не хотел.

    Если Вы восприняли мое замечание, как оскорбление — извините.

    Разрушать всегда легче, чем создавать.

    Reply
  13. Мощный

    (12) Ну потрясающе.. Вы бы просто извинились и «делу» конец.. Вместо этого начинаете толковать о моем восприятии.. Мож лучше не надо ? А ?

    Бл.., думал хоть на Инфостарте публика поадекватней .. Да где там :((

    Как же вы с клиентами работаете ? Вы считаете себя большим авторитетом в 1С ? От рейтинга в зобу дыханье спирает ?

    Ну ладно, хорош.. Можете не отвечать, все понятно..

    Reply
  14. Tatitutu

    (13) О Вашем восприятии я не толковал.

    Это мысль была обращена ко всем.

    Что Вы так близко все к себе воспринимаете ?

    В (6) я высказал ОБЩУЮ МЫСЛЬ — ничего личного.

    В последнее время просто здесь — не успел человек выложить что-то

    его облаили…и ждут следующего.

    Это как раз и относится к «Разрушать всегда легче, чем создавать.»

    Ну уж точно не к ВАМ.

    Reply
  15. Ish_2

    (13),(14) Именно так.

    Мы тут все учимся деликатности.

    Reply
  16. levran

    (6) Наверное надо уточнить. Для меня на текущий момент: клиент — это моя бухгалтерия. Что они мне заказывают, то я и делаю. Пока проблем с угадыванием желаний не было =) А сюда я обработки выкладываю, для лично фана так сказать =). Поэтому если кому-то кажется что данные обработки есть «фи» и не стоят внимания, чтож просто не обращайте на это тогда внимания. Конструктивную критику принимаю, а вот комментарии типа «вам не кажется это.. несколько ?»… Нет, не кажется.

    Reply
  17. levran

    Последнее предложение это PS. =)))

    Reply
  18. Мощный

    (16) «Поэтому если кому-то кажется что данные обработки есть «фи» и не стоят внимания, чтож просто не обращайте на это тогда внимания.»

    Ну и скажи тогда.. А зачем ты это выставляешь ? Раз полез на публику, то и к реакции готовься самой разнообразной, в том числе объективной и не самой лицеприятной.. И потом, твою бухгалтерию это удовлетворяет.. Ну и ладушки.. Но удовлетворяют ли твою бухгалтерию нумерация счетов-фактур, полученных таким образом ? Я даже не сомневаюсь, я уверен, что не удовлетворяет.. Наверное, в премануале стоило бы сказать об этом..

    Reply
  19. levran

    (18) Зачем я это делаю уже написал выше, мою бухгалтерию все целиком и полностью удовлетворяет, и это я считаю главным показателем в работе программиста, если клиент доволен — остальное вторично. А насчет объективности критики сильно сомневаюсь. Имхо, есть конструктив, когда тебе говорят, вот тут работает не так, вот тут не оптимально, а есть просто базлание и сотрясание воздуха, типа «кто виноват?» и «что делать?».

    Reply
  20. Мощный

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

    А насчет обьективности критики зря сомневаешься — тут даже критиковать нечего.. ты мне абсолютно неизвестен, т.е. ничего личного, просто назвал твою поделку тем, чем она является, функционально в том числе.. Профанация он и есть профанация..

    ЗЫ.. про «базлание» отдельно.. это просто детское, не стоит переходить на оскорбления..

    Reply
  21. levran

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

    Reply
  22. rasswet

    ну народ.. Вы отвлеклись от темы уже..

    Reply
  23. freed

    похоже на косячок-с)

    докСчет.СтавкаНДС =ТекДок.Товар.ставкаНДС.получить(датаДок); // Получаем ставку НДС

    Reply
  24. kwg

    (4)

    Ваша обработка не учитывает, что для документов типа Реализация (комиссия) сч/фактура не выписывается!

    Reply

Leave a Comment

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