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

17 Comments

  1. serg75

    Здравствуйте. У меня на счету остаток 4$m. Пополнить не могу. Сбавьте цену, сразу куплю.

    Reply
  2. Кукуруза

    Поддерживаю. за 4$

    Reply
  3. SvSoft

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

    Вопрос 1: При попытке открыть ответ на запрос номенклатуры производителя, выскакивает сообщение об ошибке:



    Curl — в папку Windows скопирован. С ответами на запросы, обрабатываемыми без Curl-а , проблем нет.

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

    На компе с УТМ Windows server 2008 standart, УТМ боевой.

    Вопрос 2: Вы добавили 2 реквизита в Справочник «Партии», которые заполняются, если Поступление загружать через обработку (судя по коду, проверить пока не могу — тестового ключа нет, а в боевом УТМ еще нет ни одного прихода).

    Но больше в конфигурации нигде они не используются. Это задел на будущее и вообще планируется дальнейшее развитие обработки? Тем более с пивом до сих пор толком не ясно как поступать

    Reply
  4. SvSoft



    что-то картинка не вставилась

    Reply
  5. Atom74

    1. Нужен Curl соответствующий версии ОС. http://curl.haxx.se/download.html

    2. Реквизиты используются при отправке документов покупателям.

    Обработка будет дописывается по мере личной эксплуатации.

    Reply
  6. psfond

    При отправке любого запроса полчаю предупреждение «Не удалось загрузить документ. Возможно он удален или служба УТМ не запущена»

    Прверила статус 500 ( Server Error). В чем проблема?

    Reply
  7. Atom74

    (6) psfond, Проблема в УТМ.

    Reply
  8. SvSoft

    (5) Пардон вопрос № 1 решился. Просто пробовал на вашей тестовой базе, а в ней уже присутвует curl. А в папку Windows скопировал уже оригинналный скачанный с оффсайта. В боевой все ОК.

    Reply
  9. SvSoft

    (5) Про реквизиты в справочнике Партии…

    Что-то отправку я еще не смотрел. Они при продаже в розницу или при возврате поставщику тоже используются(то бишь в акте расхождения)?

    Reply
  10. psfond

    (7)

    Если я получаю список документов от УТМ, и запросы командой curl -F отравляются из той же 1с, то мне кажется что проблема все таки не в УТМ! Но попробую установить заново…

    Reply
  11. Atom74

    (10) psfond, Тогда не УТМ, проверьте в настройках «УТМ URL».

    Reply
  12. psfond

    (11)

    утм url указан правильно, утм открывается по этому адресу

    все это установила уже на другой машине, так же не отправляется ни один запрос

    Reply
  13. Atom74

    (12) psfond, http://localhost:8080/opt/out — по этой ссылке чего возвращает УТМ?

    Reply
  14. ProIT

    Такая же фигня, запрос по остаткам только работает, по остальным выдает сообщение «Не удалось загрузить документ. Возможно он удален или служба УТМ не запущена», потом если Curl-ом сгенерированый файл post.xml без BOUNDARY по заданному адресу URL выгрузить, то все уходит в УТМ без проблем. Тестировал уже на боевом.

    Reply
  15. Atom74

    (14) ProIT, В процедуре «Инициализация()» установите переменную «ВсегдаИспользоватьCurl» = 1;

    Если ошибка останется разбирайтесь с Curl-ом из каталога Windows. Иначе проблема в этом «WinHttp=СоздатьОбъект(«WinHttp.WinHttpRequest.5.1″);», похоже не получается создать объект.

    Запустите 1с с правами администратора.

    Проверялось на тестовом и рабочем УТМ.

    Reply
  16. Atom74

    Та(14) ProIT, Возможно чего-то не заполнено в документах к отправки.

    Reply
  17. Nick2c

    Подскажите, уже реализован Чек ККМ ?

    Reply

Leave a Comment

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