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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *