[Расширение] для подключения мобильного устройства к УТ11.4/ КА 2/ERP 2 для работы с ордерным складом на базе Simple WMS. Для автоматизации склада нужен только телефон




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

20 Comments

  1. akadelpher@gmail.com

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

    1) Считать штрих код

    2) Проверить есть ли изображение

    Загрузить изображение?

    Да — включаем камеру

    Нет — пропускаем

    Reply
  2. informa1555

    (1) Хорошая идея.Это можно сделать да, прога это поддерживает, в демке есть пример.

    Reply
  3. mybox-games

    Добрый день! А поиск в Simple WMS по наименованию есть при пересчете товаров?

    Reply
  4. mybox-games

    Еще вопрос несколько человек в пересчете товаров могут работать?

    Reply
  5. informa1555

    (3) Здравствуйте! Simple wms — это конструктор где можно сделать все что угодно, эта публикация это пример на этом конструкторе. Конкретно тут нет поиска, но чтобы его сделать надо на экране поиска товара расположить поле строки и прописать в обработчике что поиск будет по наименованию. 5 минут работы.

    Reply
  6. informa1555

    (4) со стороны симпл ВМС да. При вводе количества захватывается объект и пишется строка. Возможна блокировка если одновременно это сделают конечно. Но такая уж у 1С архитектура этого документа.

    Reply
  7. Pim

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

    Где можно посмотреть требования к мобильному устройству? Не хочет устанавливаться на ТСД Honeywell…

    Reply
  8. informa1555

    (7) здравствуйте! А в чем это выражается? Какой там андроид?

    Reply
  9. Pim

    (8). Какой пока не знаю. В маркете пишет не подходит для данного устройства. И всё.

    Reply
  10. informa1555

    (9) На хоневеллах отлично работает. Минимальный уровень API — 14, это андроид 4.0 (IceCreamSandwich)

    Reply
  11. Pim

    (10). Модель EDA50-011. Android 7.1.1

    Reply
  12. informa1555

    (11) Странно. Попробуйте apk скачать и его поставить.

    Reply
  13. Pim

    (12) Скаченный апк получилось установить.

    Наконец-то запустил. Только предопределенная настройка не хочет работать: выдаёт ошибку при выборе ордера (не найдено поле … контрагент, если не ошибаюсь). Придётся лесть в конфигуратор…

    Нет более подробного описания? В каких режимах (при каких настройках) УТ работает поставляемая настройка?

    Reply
  14. informa1555

    (13) УТ 11.4, ордерный склад. Приходные и расходные ордера со статусами. Пришлите ошибку я подскажу что поменять для вашей настройки

    Reply
  15. Pim

    (14). Создаю приходный ордер (п. 1). Пишет выберите номер прихода. Выбираю любой пишет {(20)}: Поле объекта не обнаружено (Партнер).

    Reply
  16. informa1555

    (15) А у Вас в регистре ТоварыКПоступлению по этому распоряжению ДокументПоступления какого типа документ?

    Reply
  17. Pim

    (16) Примерно разобрался: придётся сильно попотеть, чтобы прикрутить ваше приложение. Надо будет подготовить и адаптировать нашу базу.

    Можете ответить на вопрос:

    1. почему ваше приложение работает с аппаратными сканерами любых ТСД? А приложения на 1С либо требуют доп. модулей или работают только с камерой.

    2. Как решается вопрос с потерей связи в вашем приложении? Потеряются ли сканированные товары ордера?

    Reply
  18. informa1555

    (17) 1. через перехват клавиш (те котрые умеют эмулировать нажатия клавиш при считывании штрихкода (например хонейвелл) либо, если не умеют то через отправку строки с энтером (CR,LF). Если не располагать на таком экране поле ввода то отрабатывает незаметно в фоне. Если расположить поле ввода (например когда надо либо ш/к либо артикул на одном экране), то тогда можно чрез него.

    2. При потере связи запрос не отправится. если у вас запись в ордер идет после каждого ввода количества то строчка на которой связь потерялась не сохраниться.Остальные сохранятся.

    Reply
  19. mybox-games

    Добрый день! А поиск номенклатуры по голосу присутствует? Как было описано в Публикация № 976636.

    Reply
  20. informa1555

    (19) Добрый день! Нет, также как нет озвучки, но это же конструктор — можете добавить

    Reply

Leave a Comment

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