Печать этикеток и ценников. Быстрее. Быстрее. Быстрее.




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

31 Comments

  1. spectator

    Еще бы компоненту BARCODE.BarcodeCtrl здесь же вывожить! 💡

    Reply
  2. spectator

    Еще бы компоненту BARCODE.BarcodeCtrl здесь же выложить! 💡

    Reply
  3. alexk-is

    (1) Форма предназначена для ТиС и Комплексной 7.7, а в каждом дистрибутиве этих конфигураций эта компонента есть в виде файла barcode.ocx. Если компонента по каким-то причинам не зарегистрирована, то нужно выполнить команду: regsvr32 barcode.ocx

    Reply
  4. Валерий_

    Не работает в 1С:Торговля и склад 7.7 с зарегистрированным баркодом.

    Пишет: Возможно существуют штрих-коды на товаре…

    Выводит на печать этикетки без штрихкодов.

    Reply
  5. alexk-is

    (4) Проблема скорее всего только в отображении на экране. При печати должно быть все нормально, т.к. у принтеров количество точек на дюйм больше чем на экране. Для просмотра на экране можно изменить масштаб, например, как это сделано на скриншоте. Изменение масштаба на печать никак не влияет.

    Reply
  6. spectator

    Уже приколбасил обработку к своей конфе, просто не знал что в ТиС и Комплексной barcode.ocx есть, а сейчас уже реально работает 😀

    Reply
  7. alexk-is

    (6) Ну, и как работает? Быстро?

    Reply
  8. Валерий_

    (5) Да действительно, всё работает, дорабатываю на лист А4 — 10 столбцов, 26 строк, мне видится, что эта обработка будет основной.

    Однозначно ПЛЮС.

    Reply
  9. osferon

    Обработки можно вызывать из справочника Номенклатура и из документов ПеремещениеТМЦ, ПоступлениеТМЦ, ИнвентаризацияТМЦ, ПереоценкаРозница.

    А как их вызвать, где они регистрируются? записал файлы в каталог ExtForms, а как этикетки напечатать не могу понять… в справочнике «номенклатура» как и было до этого этикетку можно напечатать нажав кнопку печать-> этикетки, типовой этикетки которая была до этого, одна на листе, без цены. подскажите как вызвать эту обработку, она мне очень нужна 🙁

    Reply
  10. alexk-is

    (9) Копировать нужно как указано в описании в каталог ExtFormsPrnForms

    Reply
  11. sadko11

    Отличная обработка, молодец! 😀

    Reply
  12. CheBurator

    в 7-ке есть проблема падения проги при больших плотных мокселях… то есть тупо например 100 листов этиакеток 65 вывести на печать — падает… приходится порциями по 30 листов.. — рекомендую предусмотреть такую возможность

    Reply
  13. alexk-is

    (12) Вот так всегда. Обычно вначале смотрят, а потом комментируют… Там все с самого начала бьется блоками по 10 листов.

    Бить по 30 листов это нормально для ценников, а для мелких этикеток уже многовато. Начинает подтормаживать.

    Reply
  14. alexk-is

    (12) Ну, вот. Одной интригой стало меньше.

    Reply
  15. CheBurator

    мы просто разошлись в оценке важности моментов… 😉

    Reply
  16. CheBurator

    в таких обработках зачастую полезно иметь возможность перепечатать часть «пакета»

    Reply
  17. alexk-is

    (16) Порядковый номер набора листов указывается в заголовке. Наверное не совсем корректно будет писать о том, что на моем ПК 10000 этикеток (по 50-ти номенклатурным позициям 200 шт. на каждую позицию) формируются всего за 7 секунд. Ведь это может ввести в некоторое заблуждение — у меня то хороший компьютер. 🙂

    Reply
  18. detec

    Интересно, а многие ли пытаются печатать этикетки с штрих-кодами на языке принтера? Ведь barcode.ocx — это растровая виндовая печать, которая, пусть и чисто теоретически, не может быть быстрее «родной», на кодах, на сколь-нибудь значительных объёмах печати (тысячи этикеток в сутки).

    Reply
  19. omut

    (18) Пробовали для зебры 2824 lp. подключение через COM-порт, скорость возрастает раза в два, т.к. печать идет непрерывно, пауз на позиционирование и переход на новую страницу не требуется. Ну и т.д. Очень рекомендую. Язык простой, формирование этикетки сложностей не вызывает.

    Reply
  20. Olegir

    Хотел бы попросить Вас доработать на коммерческой основе некоторые Ваши обработки под мою специфику. Это возможно?

    Reply
  21. MasterCifra
    alexk-is пишет:

    (9) Копировать нужно как указано в описании в каталог ExtFormsPrnForms

    Скопировал в C:Program Files1Cv77DBExtFormsPrnForms, но все равно в справочнике открывается только стандартная обработка(

    Reply
  22. MasterCifra

    (9)извините за остолопство) все работает, но не вмещается на этикетку шириной 3 см и длиной 1,9 см.

    Подскажите пожалуйста как изменить обработку, что бы можно было печатать на этикетках:

    30х19 мм и 58х40 мм

    Reply
  23. alexk-is

    (23) Обработки оптимизированы под производительность, поэтому программного изменения размера макета в них нет. Для изменения размера этикетки нужно изменить макет.

    Reply
  24. che666

    + автору, реально работает быстрее

    Reply
  25. n949eo

    Вот это офигенная штука должна быть. Давно нечто похожее искал. Спасибо автору.

    Reply
  26. va11ey

    Автору спасибо. Работает просто супер. Вот только один вопрос, как сделать чтобы на этикетку выводилось ПолнНаименование, а не сокращенное??? Помогите плиз…

    Reply
  27. alexk-is

    (27) Необходимо заменить строку:

    Секция.ПечТовар = СокрЛП(Товар);

    на строку

    Секция.ПечТовар = СокрЛП(Товар.ПолнНаименование);

    Reply
  28. Manoo

    Добрый день, подключил обработки, все устраивает. Только при отправке на печать в свойствах принтера указаны размеры ширина 76 высота 297, если их выставить по размерам этикетки и напечатать то все нормально, но если выбрать другой товар то настройки слетают на указанные выше, что делать???? прилагаю скриншот

    Reply
  29. Manoo

    Добрый день, подключил обработки, все устраивает. Только при отправке на печать в свойствах принтера указаны размеры ширина 76 высота 297, если их выставить по размерам этикетки и напечатать то все нормально, но если выбрать другой товар то настройки слетают на указанные выше, что делать???? прилагаю скриншот

    Reply
  30. serg1983

    (30)В восьмерке есть сохранение настроек, в семерке то же по моему есть припоминаю. Посмотрите код

    Reply
  31. Gtli

    Размеры этикеток можно любые выводить на печать?

    Reply

Leave a Comment

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