Загрузка номенклатуры по штрихкоду из Excel в 1С:Розница




Принцип обмена данными из 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. user594029_angelina-vl

    Добрый день!

    А опишите поконкретнее, как работает?

    Будет ли работать на 2.2.4?

    Reply
  2. SaschaL

    (1) ну судя по описанию и картинке написано по управляемое приложение, следовательно по Розницу 2.2.4 работать должно без проблем

    Reply
  3. wolfalan

    (1) Добрый день!

    1. Работает следующим образом:

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

    -оператор редактирует колонки эксель формы, чтобы они соответствовали соответствовали колонкам табличной части обработки (занимает не более 5 минут)

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

    -одновременно с заполнением происходит проверка на наличие возможных ошибок дальнейшей загрузки (например: не найден «вид номенклатуры», не найдена «единица измерения»)

    -чтобы исправить ошибки необходимо подправить исходный эксель файл и перезаполнить табличную часть обработки

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

    -при необходимости оператор в ручном режиме дозаполняет необходимые реквизиты созданной номенклатуры в ручном режиме

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

    Примечание: во главу угла данной обработки ставились два фактора:

    а).уникальность штрихкода в справочнике номенклатуры, чтобы минимизировать количество пересортов в учете (в том числе чтобы избежать путаницы при проведении инвентаризации и на рабочем месте кассира при продаже).

    б).ускорение заведение номенклатуры и штрихкодов в базу. Ранее накладные по 50 новых товарных позиций обрабатывались 2-4 часа и допускались ошибки при внесении. Сейчас аналогичные накладные обрабатываются 5-15 минут.

    2. На версии 2.2.4 не тестировалось, но думаю, что взлететь должно. Если не взлетит, то готов поправить бесплатно на Вашей базе.

    P.S. Если есть какие-то пожелания по обработке, то я готов к обсуждению и адаптации под Ваши задачи.

    Reply
  4. ssn5810

    почему нет загрузки (.xls) только xlsx, поля преопределены ??? тупняк !!!!

    Reply
  5. wolfalan

    1) Загрузка *.xls добавлена

    2) Поля предопределены целенаправленно:

    -пользователи зачастую знают и понимаю Эксель лучше, чем 1с,

    -поэтому пользователю зачастую проще «подогнать» Эксель под нужды 1с, чем настраивать 1с,

    -целевая аудитория для данной обработки именно те пользователи, которые хотят минимизировать свои действия в 1с,

    3) «тупняк !!!!» — это не конструктив или это самокритика?!

    Reply
  6. user624378_fyodorovn

    Существует ограничение на 3000 строк?

    p.s.:

    Office 2010

    Розница, редакция 2.2 (2.2.7.39) (http://v8.1c.ru/retail/)

    1С:Предприятие 8.3 (8.3.10.2667)

    Reply
  7. wolfalan

    (6) Николай, добрый день!

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

    Но если есть необходимость загружать за раз более 3000 строк, то могу снять ограничение.

    Reply
  8. ansonat

    иерархия не переносится?

    Reply
  9. wolfalan

    Не переносится. Если необходимо, то можно добавить.

    Reply
  10. Lex=)

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

    Скажите, учитывает ли обработка характеристики цвет и размер?

    Если нет, сможете ли добавить?

    Reply
  11. wolfalan

    (10) Добрый день!

    Представленная обработка загрузку характеристик не поддерживает.

    В ближайших планах доработка обработки не планируется ввиду моей загруженности.

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

    Возможно на Инфостарте есть подходящие Вам обработки.

    Reply
  12. Elmira0385

    Добрый день.

    Можете подсказать откуда обработка берет значение в поле «Вид номенклатуры»?

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

    Заранее благодарю.

    Reply
  13. wolfalan

    (12) Добрый день.

    Предлагаю следующий вариант всем у кого возникли сложности в работе в обработкой: 1. обменяться контактными данными (в личку). 2. я подключусь удаленно к Вашей базе и вместе с Вами сделаю загрузку. 3. по результатам общения с Вами доработаю обработку и перевыложу на инфостарт

    Reply
  14. allexx

    За обработку конечно спасибо. Пригодилась. Но как раз с «Видом номенклатуры» там такой сумбур, как будто автор специально хотел всех запутать.

    Reply
  15. glushkovdimas

    Добрый день.

    Возникли сложности с обработкой на релизе 2.2.12.30 : Проблема с Видом номенклатуры — выдает ошибку на этом столбце и не загружает новую номенклатуру.

    Reply
  16. wolfalan

    Добрый день!

    Могу исправить по удаленке.

    Наберите мне 8-926-026-60-60

    Reply

Leave a Comment

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