Загрузка накладных из Excel в 1С (для УТ 11.х, Розницы 2.х)




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

16 Comments

  1. alexxkorum

    В описании указано:

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

    А обработка может наоборот НЕ создавать номенклатуру?

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

    Reply
  2. Safon46

    Здравствуйте.

    Может. В таблице сопоставления человек может установить галочку «Найдена» и номенклатура создаваться не будет.

    Также в этой таблице возможно ручное произвольное сопоставление.

    Reply
  3. alexxkorum

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

    и после нажатия кнопки «Загрузить таблицу»,

    будут найдены соответствия которые можно найти, а которые НЕ НАШЛИСЬ, позиции не будут автоматом созданы?

    Reply
  4. alexxkorum

    Т.е. на каком этапе создается номенклатура?

    По кнопке Загрузить таблицу, или после нажатия Создать поступление товаров ?

    + еще вопрос, файлы xlsx поддерживаются ?

    Reply
  5. mybox-games

    Добрый день! Обработка не работает правда версия УТ 11.4.8.63 при нажатии создать поступления она висит и все.

    Reply
  6. Safon46

    Файлы файлы xlsx поддерживаются. При нажатии на кнопку Загрузить таблицу происходит поиск данных в БД, если есть номенклатура она ставится в колонку Номенклатура БД, если нет, то значение пустое. При нажатии Создать поступление товаров происходит автоматическое создание Номенклатуры — обработка проверяет таблицу, если столбец Номенклатура БД заполнен, то не создается, иначе создается. Ставка НДС в номенклатуре ставится без НДС, если не указан столбец НДС.

    Reply
  7. Safon46

    Для УТ проверили в чем ошибка, изменения внесли

    Reply
  8. user1137665

    Ребят вопрос: розница 2.2.11.30 при загрузке поступления не проставляется в документе поле «Всего», при том что в таблице перед загрузкой поле всего есть.. Остальное вроде подгрузилось.

    Reply
  9. Safon46

    Если документ записать или провести, поле Всего заполнитсяавтоматически для всех строк (и общий итог внизу документа).

    Reply
  10. user1030760

    отпишите в личные сообщения пожалуйста

    Reply
  11. Stason13

    Добрый день. Обработка почему то не все столбцы считывает из excel. Из 7 столбцов видит только 5.

    Reply
  12. Safon46

    (12) Пришлите пожалуйста скрин с настройкой «4. Номера колонок» до нажатия на «5. Загрузить таблицу»

    Reply
  13. Stason13

    Скрин приложил. Только не понятно, причем тут номера колонок, когда я нажимаю «прочитать файл» и в пункте 1 только 5 колонок, причем 1 пустая, а в экселе 7. Может я не правильно описал проблему))))

    Reply
  14. Safon46

    (14) Поставьте галочку Open Office и повторите

    Reply
  15. Stason13

    Пишет, что не может создать. Вероятно не установлен OpenOffice. Он как бы и не установлен. Excel 2016 установлен.

    Reply
  16. Safon46

    (16)Поле — место подписи главного бухгалтера — представлено объединением 4 колонок и представляет 1. В результате механизм обработки считает, что колонка Цена последняя с заполненными значениями. Данную ошибку исправим, могу посоветовать либо удалить строку с подписью главного бухгалтера, либо убрать объединение строк в данном поле.

    Reply

Leave a Comment

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