Печать ценников и этикеток




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

47 Comments

  1. slava-fa

    Заинтриговала обработка, но в УТП для Укр не пошла((

    Reply
  2. igyo

    (1) Ну я думаю там переделать не много 🙂

    Reply
  3. Трактор

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

    Reply
  4. igyo

    Спасибо, сегодня буду дорабатывать, заказчик попросил добавить еще одну фишку. К вечеру или завтра выложу новую версию.

    Reply
  5. igyo

    Новая версия ждет Вас! Качать обязательно! Много исправлено и доработано.

    Reply
  6. betepon

    Вопрос. Как вы решаете проблему с печатью ценников на непрерывной ленте с использованием термопринтера.

    1С выдает принтеру данные постранично. Когда принтер начинает искать конец страницы на непрерывной ленте…

    Reply
  7. igyo

    На термопринтере мы не печатаем этой обработкой.

    Reply
  8. igyo

    Доступна новая версия. Все качаем и наслаждаемся!

    Reply
  9. personazh

    Насколько я понял, эта обработка является немного измененным вариантом http://infostart.ru/projects/1887/ Неплохо бы указать ссылку на первоисточник в описании.

    Reply
  10. igyo

    Возможно, я ее делал год назад и использовал разные приемчики.

    Reply
  11. Hazer1
    Reply
  12. igyo

    Я ж писал что работает под 10.2 и предупредил что есть изменения в конфе.

    Reply
  13. shtucer-igor

    очень заинтерисовало

    а тоже самое под 10,3 можно ?

    Reply
  14. Петька77

    Не знаю ошибка или нет — при заполнении из документа не контролирует штрихкоды остальных позиций, тупо подставляет из тех что проверил, возможно потому что по 10,3 юзаю (((.Скорее всего касается внутренних кодов, сгенерированых 1С, хотя закономерности пока не нашел.

    Reply
  15. Novoross11

    Доработал, теперь работает на релизе 3.7.8. Правда сканер ШК не могу проверить, т.к. нет сканера. Куда тут выложить?

    Reply
  16. igyo

    Кидай мне код, выложу новую поправленую версию…

    Reply
  17. yakutin

    Здравствуйте igyo! У меня к Вам есть интересное предложение. Поговорим? yakutin33@mail.ru

    Reply
  18. zenz

    1.Дата документа из которого печатаются цены в формы ценников не помешала бы.

    2. Выбор что печатать — краткие или полные наименования

    Reply
  19. igyo

    zenz: 1 — ценник получается заграможденным, заказчику это не надо было, хотя согласен, было бы удобнее. 2 — печатем только краткие наименования так как полные слишком большие и будут не влазить в ценник, а если уменьшать шрифт то убдет очень мелко. Собственно для этого и была сделана возможность переименования наименования, дабы сократить длинные названия убрав то что не нужно на ценнике.

    Reply
  20. Novoross11

    Можно еще сделать, чтобы на весовой товар цену печатать «за 100 гр.», а также добавить параметр ПЛУ (код товара в весах) в макет ценника.

    Reply
  21. Novoross11

    Для более корректной работы предлагаю еще заменить процедуру «ТоварыВыбор» следующим кодом:

    Процедура ТоварыВыбор(Элемент,ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

    Если Колонка.Имя=»Выб» Тогда

    ВыбраннаяСтрока.Выб = Не ВыбраннаяСтрока.Выб;

    КонецЕсли;

    Если Колонка.Имя=»КолВо» Тогда

    Если ВвестиЧисло(ВыбраннаяСтрока.КолВо,»Кол-во ценников для печати»,10,) Тогда

    Если (ВыбраннаяСтрока.КолВо=0) или (ВыбраннаяСтрока.КолВо<0) Тогда

    Товары.Удалить(ВыбраннаяСтрока);

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    КонецПроцедуры

    Reply
  22. igyo

    Всем спасибо за спасибо 🙂 Скоро выйдет версия под новые релизы конфигураций, а именно: Розница, УТ, УПП, КА, может и Бухгалтерию.

    Натолкнула данная обработка.

    Reply
  23. standart

    24. Обработка хорошая, но не работает с товарами у которых есть характеристики (Цвет, рост, размер и т.д.). Не переносится цена из документов и объединяются товары по наименованию, но с разными характеристиками. Может доработаете в будущем?

    Reply
  24. nfoc

    Подойдет для 1с предприятие 8.1 базовая?

    Reply
  25. provnick

    Папка PrintFormsCennikEtiket в каталоге базы и формы там, но

    Предупреждение(«Не обнаружено ни одной печатной формы!!!

    |Проверьте правильность установки обработки!!!

    Прошу помочь

    Reply
  26. provnick

    Нашел, в каталоге 8 форм

    Reply
  27. provnick

    Не работает в SQL, подскажите пож. как прописать пути для другого каталога?

    Reply
  28. provnick

    Так и не дождался помощи, пришлось самому решать, если автор не против, могу выложить для обсуждений и дополнений

    Reply
  29. provnick

    Тихо сам с собой веду беседу, дело в том, что обработку эту не стал скачивать, а пользовался предыдущей версией, а там каталог форм был привязан к файловому варианту, теперь все понятно, новый вариант уже открывается по другому

    Reply
  30. Dosaev

    добрый день, не могу скачать … кинь те люди добрые в личку кто может поделиться… плиз…

    Reply
  31. odin_wolk

    Было бы хорошо если работало для Украины и выводило две цены на ценник

    Reply
  32. mihenius

    УТ 10.3.6.8

    Версия для УТ

    {Форма.Основная(685)}: Деление на 0

    ЦенаВалютная=ЦенаРублевая*КурсВалютыВыбран.Кратность/КурсВалютыВыбран.Курс;

    Reply
  33. mihenius

    Поспешил )

    Не заполняются значениями по умолчанию валюта и склад.

    Всего лишь )

    Reply
  34. Iwan777

    Подскажите пожалуйста, как установить?

    УТ 10.3.11.4

    Выбираю Сервис->Внешние печатные формы и обработки->Внешние обработки

    далее выбираю файл и выдаёт ошибку «Выбранный файл не является внешней обработкой. Либо, данная обработка не предназначена для запуска в этой конфигурации»

    Reply
  35. lsm22

    Подскажите пожалуйста, как установить? на

    «Управление торговлей», редакция 10.3 (10.3.8.9)

    ошибка {Справочник.ВнешниеОбработки.Форма.ФормаЭлемента(189)}: Ошибка при вызове метода контекста (Создать): Ошибка при выполнении файловой операции

    «Выбранный файл не является внешней обработкой. Либо, данная обработка не предназначена для запуска в этой конфигурации» 🙁

    Reply
  36. lsm22

    1С:Предприятие 8.1 (8.1.15.14)

    Подскажите пожалуйста, как установить? на

    «Управление торговлей», редакция 10.3 (10.3.8.9)

    ошибка {Справочник.ВнешниеОбработки.Форма.ФормаЭлемента(189)}: Ошибка при вызове метода контекста (Создать): Ошибка при выполнении файловой операции

    «Выбранный файл не является внешней обработкой. Либо, данная обработка не предназначена для запуска в этой конфигурации»

    Reply
  37. vt007

    А можно попросить автора поправить обработку под 8.2 Розница ?

    Очень хочется ценники нормальные напечатать…

    Reply
  38. vt007

    Попробовал запустить в 8.2 УТ 10.3, предварительно сконвертив встроенными средствами 1С.

    При попытке добавления номенклатуры, любым способом, выдает ошибку:

    {Форма.Основная.Форма(359)}: Значение не является значением объектного типа (КолВо)

    НайденнаяСтрока.КолВо = НайденнаяСтрока.КолВо+1;

    Как можно поправить ?

    Reply
  39. neonzzz

    У меня в 10.3 буквы вместо шк баркод установлен

    Reply
  40. malikov_pro

    (40) надо поставить шрифт eangnivc

    Reply
  41. malikov_pro

    (38) В 1С:Розница достаточно развитый механизм печати этикеток, с возможностью из пользовательского интерфейса изменения шаблонов этикеток

    Reply
  42. Kvint77

    Здравствуйте! У меня при попытке загрузить обработку ошибка «Выбранный файл не является внешней обработкой. Либо, данная обработка не предназначена для запуска в этой конфигурации». 1С 8.2 (8.2.13.205) УТ 2.3.3.4. Подскажите,что не так делаю?

    Reply
  43. Alex_Pet

    (43) Открыть в конфигураторе, переконвертировать и сохранить.

    Но под 8.2 KA не работает.

    Reply
  44. спасибо тебе добрый человек!

    Reply
  45. dsadsadsa

    Отличная обработка! Попробуем.

    Reply
  46. bvk

    Не работает в 10.3. Обидно, хотя в описании написано.

    Reply
  47. smirnoffs

    В конфигурации УТП для Укрины обработка не работает 🙁

    Reply

Leave a Comment

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