DBF-база штрихкодов продуктового магазина (290777 записей)




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

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

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

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

42 Comments

  1. Арчибальд

    Файлы прикрепи, потом публикуйся

    Reply
  2. Рязанский

    название: продкутового — продуктового

    А своя база — это хорошая идея…

    Reply
  3. hrom

    Рязанский,

    исправил 🙂

    Ну как? Штрихкода то находятся?

    В эту DBF-ку легко штрихкода из своей базы добавлять с помощью моих внешних обработок, так силами сообщества infostart.ru можно довести её до всеобъемлющих размеров 🙂

    Reply
  4. FERMER111

    «Для того, чтобы «прикрутить» СоздатьНоменклатуруПоШК.epf к УТ надо добавить в модуль формы документа такой код»

    Можно поконкретней? Модуль формы какого документа? И как это работает на примере ввода нового поступления.

    Reply
  5. hrom

    FERMER111,

    Я пробовал на «Управлении торглвей 10.3»

    Конфигуратор, Документ «ПоступлениеТоваровУслуг», модуль формы «ФормаДокумента», там ищешь функцию «СШКНеизвестныйКод(Штрихкод, ТипКода, СШК)», существующий код функции комментишь и заменяешь на текст, приведенный мной в описании (ну или вносишь руками нужные изменения в существующий код). Сохраняешь изменения в конфигурации.

    По адресу: «КаталогПрограммы()+»СоздатьНоменклатуруПоШК.epf»»(обычно C:Program Files1cv81in), кладешь мою обработку- «СоздатьНоменклатуруПоШК.epf».

    В составе этой обработки есть экспортная процедура «ДобавитьНеизвестныйШтрихкод(ТипКода, Штрихкод, 1, Этаформа)», эта процедура вызвается конфигурацией при внешнем событии ввода штрихкода, если введенный штрихкод не найден в регистре сведений «Штрихкода». Только штатно это процедура вызвается из встроенной обработки «Обработки.ИдентификацияШтрихкодов», а её вызвыаю из моей внешней обработки. Кстати, можешь встроенную «заменить на внешний отчетобработки» из моего файла «СоздатьНоменклатуруПоШК.epf» и тогда не придется вносить изменения в текст функции «СШКНеизвестныйКод» в каждом документе, но мне кажется это извращение и сам я его не пробовал. По мне лучше в каждом документе внести изменения руками, чтобы понимать в каких документах мне нужен автоматический ввод штрихкода из моей DBF базы, а в каких луше оставить штатную обработку неизвестного штрихкода.

    В обработке «СоздатьНоменклатуруПоШК.epf» надо зайти на вкладку «Настройки», заполнить соответствующие поля и «сохранить настройку», тогда вновь создаваемая номенклатура будет создавать в отдельно выделенной для этих целей группе, также там можно изменить лимит строк в документе (чтбы юзер не плодил документы по тысяче строк) и обязательно указать путь к DBF-кам, в которых нужно искать штрихкод. Количество DBF-ок не ограничено. Но обработка ищет сначала в тех DBF-ках, которые идут в начале списка, как только находит соответсвующий штрихкод, поиск прерывается. Если один и тот же штрихкод встречается в нескольких DBF-ках, его можно найти по кнопке «Найти похожие штрихкода», если нужный штрихкод не найдется, то моя обработка предложит для заполнения соседние штрихкода (это только по кнопке «Найти похожие штрихкода»).

    Reply
  6. FERMER111

    Замечательно!! +++ Все получилось. Правда, пока еще нет возможности проверить в отделе, завтра обязательно пущу в дело. А как создавать свои DBF-ки, например от поставщика?

    Reply
  7. Abadonna

    Если база работает на скуле, то ловчее и стороннюю базу сделать на SQL, а не на DBF.

    Помню делал стороннюю, которая фиксировала все изменения в особо важных объектах (например, Справочник Контрагенты). Очень удобно, а чем лучше скуль — индексы у него не ломаются и можно напрямую из 1С через ADO подключиться

    Reply
  8. hrom

    FERMER111,

    Чтобы создать свою DBF-ку запусти внешнюю обработку ВыгрузкаШКвДБФизУТ.epf в 1С81 (или ВыгрузитьШКизТиС.ert для 1С77), там есть три кнопки: «выгрузить базу», «объединить с текущей базой», «тест чтения»

    1. «выгрузить базу» — задаёшь имя файла выгрузки, нажимаешь кнопку «выгрузить базу» и все штрихкода сливаются в файл выгрузки — получаются два файла *.DBF, *.CDX

    2. «объединить с текущей базой» — указываешь путь к существующему файлу DBF (в том же самом поле, что и в п.1 — т.е. имя файла выгрузки), нажимаешь «объединить с текущей базой». Штрихкод из 1С-ки сначала ищется в указанной DBF-ке, если не находит, то добавляет запись в эту же DBF-ку и соответствующую запись в индексный файл.

    3. «тест чтения» — указываешь путь к существующему файлу DBF (или ничего не задаешь, если путь остался после п.1, или п.2), вводишь искомый штрихкод в поле слева от кнопки «тест чтения», нажимаешь кнопку «тест чтения». Тебе выдается сообщение с найденным названием товара, или предупреждение «штрихкод не найден».

    Reply
  9. hrom

    Abadonna,

    ну тем кто работает на SQL-е может быть и да.

    Только современные одинэсники, творящие на 1С81 этот sql дяже и не нюхали 🙂

    Вообще, идея моей базы — облегчить жизнь товароведу или кладовщику при приёмке большого количества НОВОГО товара, такое бывает, например, когда магазин только открывается. А когда магазин уже долго фунциклирует он, как правило, уже имеют свою внутреннюю базу штрихкодов и дополнительные внешние базы ему редко нужны. Пэтому ИМХО для моей внешней базы важнее быстрота подключения, простота переноса с одного компа на другой, универсальность обмена информации с другими базами. Для этих целей dbf-ки подходят больше, так как не требуют установки никакого дополнительного ПО и работают с любой базой.

    Reply
  10. Abadonna
    Только современные одинэсники, творящие на 1С81 этот sql дяже и не нюхали

    Ну чё уж ты их так 😀

    Если 1С-сервер, то, как правило, и SQL

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

    (10) Правильно он их. Видел ты восьмерочника, пользующегося прямыми запросами?

    Reply
  12. Abadonna

    (11) Видел… в зеркале 😉

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

    (12) Это был не восьмерочник. Не примазывайся к младому поколению с девственными мозгами. 🙂

    Reply
  14. Abadonna

    (13) Ну, если честно, это и не одноэсник был 😀

    Reply
  15. FERMER111

    (5) Еще раз спасибо за подробные комментарии. Все работает.

    Reply
  16. hrom

    (15) FERMER111,

    🙂

    Выкладывай прицепом DBF-ку со своими добавлениями, пусть растет и ширится.

    Если будет слишком большая, можно будет разбить на несколько файлов по диапазонам штрихкодов.

    Например:

    DBF№1 содержить кода от 8000000000000 до 8100000000000

    DBF№2 содержить кода от 8100000000001 до 8200000000000

    и так далее…

    Reply
  17. FERMER111

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

    Reply
  18. hrom

    (17) FERMER111,

    Прицепляю к этому сообщению DBF-ку со штрихкодами хозяйственного магазина: 19785 записей.

    Есть еще базы с одеждой и оптикой (очки, линзы).

    Reply
  19. FERMER111

    И снова — СПАСИБО! За хозмаг. Может еще посоветуете что-нибудь в таком вопросе: существует магазин хоз-строй товары. Заведена номенклатура в УТ 10.3, но товар не отштрихован. Сейчас планируем автоматизацию. Как упростить ввод штрихов? У меня мелькает мысль о том, что плюнуть на старую базу (очень много ошибок в наименованиях, много задвоений и т.п.), взять, скажем, Вашу базу, может быть базы поставщиков и завести все сначала через ввод остатков. Или проще будет привязка штрихов к сущ. номенклатуре. Наименований около 2500 включая многое в ассортименте.

    Reply
  20. hrom

    (19) FERMER111,

    Может в твоей ситуации немного облегчит жизнь вариант, когда ты будешь вводить штрикода сразу в регистр, а не через справочник. Открываешь меню Операции/Регистры сведений/Штрихкоды.

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

    Чтобы не вводить вручную с клавиатуры цифры штрихкода, можно настроить сканер штрихкода на режим работы «в разрыв клавитуры» (позволяют не все сканеры) и НЕ подключать его через Сервис/торговое оборудование. Тогда считанный штрихкод будет ввиде цифр вводится в то поле, которое ты предварительно выделишь мышкой.

    Наверное, такое вариант будет пошустрее работать, чем через справочник Номенклатура, или стандартную обработку «Обработки.ИдентификацияШтрихкодов».

    Reply
  21. FERMER111

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

    Reply
  22. patriarh_812

    FERMER111,

    Ну смотря какой магазин, я себе сделал удлинитель на 10 м., склад небольшой пока хватает.

    Вопрос по поводу обработки, как ее закинуть в 7.7 ТиС 9.2 ?

    Автору спасибо.

    Reply
  23. patriarh_812

    При попытке записать найденный элемент пишет

    Перед записью в элементе справочника «Номенклатура» необходимо заполнить «вид номенклатуры»!

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

    Reply
  24. CheBurator

    (23) вид номенклатуры — это не единица измерения!!!

    Reply
  25. patriarh_812

    Да точно, спасибо.

    Но номенклатуру все равно не добавляет.

    Кроме того заменил в документе ПоставлениеТоваровУслуг функцию СШКНеизвестныйКод на предложеную автором, но все равно открывается обработка ИдентификацияШтрихкодов, наведите в правильное русло=)

    И еше автор пишет Для 1С77 прилагаю фрагмент кода, по нахождению нужной записи в моей базе товаров:, если можно поподробней как эту обработку к 7.7 привязать?

    Reply
  26. CheBurator

    в 8_2_14_439 можно внешние источники данных — типа этой автономной ДБФки подсоединять и отображать и прочее типа как штатно…

    Reply
  27. patriarh_812

    у меня стоит 8.1.15.14, может быть изза версии?

    Reply
  28. zerx

    А можно файлики еще где-нибудь выложить, а то скачать не получается(

    Reply
  29. lambda-tmn

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

    А работает ли эта база на 8.2 ???

    Reply
  30. Shrek2015

    а если в SQL это залить?

    Reply
  31. lambda

    Подскажите есть ли ветка в форуме по этой обработке и базе??

    Reply
  32. Sergey Kamnev

    Добрый день, hrom.

    У меня есть несколько вопросов по базе продуктов:

    1. В базе данных содержатся розничные или оптовые товары?

    2. Товары однозначно идентифицированы названием? То есть может быть товар «Кисель», но это может быть как напиток в жидком состояние, так и в порошкообразном.

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

    Reply
  33. Sergey Kamnev

    О! Ещё забыл вопрос задать.

    В базе товары только Российского производства или импортного тоже?

    Reply
  34. allesvet

    Как скачать базу? За 50 рублей? Но какой смысл ложить сюда 500 стартмани если нужна только база. Как положить 500 стартмани????

    Reply
  35. allesvet

    Прошу прощение как положить 50!!!? стартмани.

    Reply
  36. shtepin

    Есть ли возможность выборочно проверить наличие штрих кодов в базе?

    Reply
  37. sfs1981

    Здесь готовая база Ean-13 все о потребительских товарах штрих-кодов, с API, которое подходит для 1С. 10млн. записей.

    Reply
  38. Икар

    Конечно база не плохая, но названия товаров как всегда хромает….

    То кавычки с пробелами, то названия корявые…

    Нет единого стиля написания названия товара.

    Почему бы не взять и написать

    1. Вид товара

    2. Название товара

    3. Упаковки и ед. измерения

    4. Производитель

    Получилось бы например Пиво Жигулевское 4% 0,5л Москва

    И сразу и искать проще…

    А то даже ж/б у Вас пишется и так и жб

    Reply
  39. hrom

    Обновил базу супермакета до 290777 записей.

    Написал пример обработки для УФ.

    Reply
  40. vvvalikvv

    киньте пожалуйста обработку и базы на почту valikvv@rambler.ru

    Reply
  41. Alives

    (39) привет, напиши мне на почту shadow.skens@hotmail.com

    Reply
  42. Alives

    Как связаться с автором этой темы? Срочно!!!

    Reply

Leave a Comment

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