Печать ценников и этикеток для УТ 8.2




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

50 Comments

  1. Поручик

    Увидел УТ 8.2, подумал про УТ 11. Оказывается для УТ 10.3

    Reply
  2. akataev

    Написано для УТ 10.3.

    Не давно только начал разбираться с 1с8

    В основном работал с 7.7 комплексная

    Reply
  3. akataev
    Eugeneer пишет:

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

    ]

    А с каких пор первоисточник стал коммерческим. Печать этикеток 1С УТ 8.1 и автор её Alexsisit.

    Я указал кто автор первоисточника, а потом переделал под свои нужды.

    Eugeneer пишет:

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

    А интересно для чего создавался это ресурс, как не для свободного обмена информацией. Или Вы его используете только в комерческих целях и для поднятия своего рейтинга. Я понял бы если Alexsisit написал и сказал что нужно убрать эту обработку, то я её снял бы. Я про набивание рейтинга даже в мыслях небыло, а вот у Вас это наверно главное.

    Reply
  4. Alexsisit

    Ребята, давай жить дружно!!!

    Если бы я хотел, то разместил её коммерческой и закрыл код на изменение. Претензий не имею никаких. Тем более на 8.2 написана.

    Reply
  5. Yan-1986@mail.ru

    Доброе время суток! Обработка отличная, НО не могли бы указать как получить в обработке то количество товара, которое в табличной части документа. Конкретно интересует Поступление ТиУ, но для остальных тоже очень актуально. Заранее спасибо!

    Reply
  6. Ivan_82

    Вроде написано что печать ценников и этикеток а открывается только печать этикеток. Да и какой путь к сетевому принтеру нужно указать?

    Reply
  7. rush11

    хорошая обработка, очень довольны!

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

    Reply
  8. akataev

    (7) Ivan_82,

    В обработке есть настройка.

    Укажи в этой настройке принтер этикеток и размер этикетки и допустимые поля.

    Чтобы напечатать ценник или этикетку заполни табличную часть и установи V против нужного товара.

    Сформируй ценники и выбери элемент печати. При печати цеников печать пойдет на принтер, а этикетки на принтер ШК

    Reply
  9. akataev

    (6) Yan-1986@mail.ru,

    Если вопрос актуален напишите.

    Есть иправленная с количеством. Могу выложить.

    Reply
  10. provnick

    Плюс, вообще информации по настройке принтеров печати этикеток с 1С практически нет, только эмоции в основном, да и сам намучился, подбирая под каждую этикетку 2.65*0.5 или что то умножить на что то, кстати нигде не нашел описания, что это за загадочные 2.65, для TLP 2824 пришлось вообще разделить высоту этикетки на 0.4, а не умножить, чтоб влезть в размер. в этой обработке попадает размер, но если заполняю из документа, вообще выводит на печать пустую таблицу, какой бы макет не выбрал, ну и количество бы, типа кнопкой «установить для всех»

    Reply
  11. provnick

    Упс…Вот, поторопился, с документа не устанавливается количество, поэтому не выводит на печать.

    Reply
  12. tipik

    у меня артикли не выдает, что может быть? и на печать не формирует

    Reply
  13. provnick

    Добавил реквизит ТипЦены и немножко изменил запрос на:

    Если Склад.ВидСклада=Перечисления.ВидыСкладов.Розничный Тогда

    Рег=»ЦеныАТТ»;

    Фильтр=»Склад В (&Склад)»;

    Иначе

    Рег=»ЦеныНоменклатуры»;

    Фильтр=»ТипЦен В (&ТипЦены)»;

    КонецЕсли;

    и можно выбирать по типу цен, а (15) с артикулом, там если в константах 1С выводить, не код, то артикул и нужно исправить Процедура ДОбавитьЦенник………

    Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда

    ВыводитьКоды = Истина;

    Область.параметры.КодТов = СокрЛП(Строка.Номенклатура.Артикул);

    ИначеЕсли ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Код Тогда

    ВыводитьКоды = Истина;

    Область.параметры.КодТов = СокрЛП(Строка.Номенклатура.Код);

    Иначе…………..

    а это заремировать //Область.параметры.КодТов=СокрЛП(Строка.Номенклатура.Код);

    если не так, что, пусть уж автор поправит

    Reply
  14. Katerina_S

    Спасибо пригодилось!

    Reply
  15. post279

    Рабочая обработка. Спасибо автору!

    Reply
  16. mrdc

    Не работает.

    {Форма.Форма.Форма(429)}: Ошибка при вызове метода контекста (Выполнить)
    СписокШт=Запрос.Выполнить().Выгрузить();
    по причине:
    
    по причине:
    {(4, 12)}: Поле не найдено «Штрихкоды.ПредставлениеШтрихкода»
    Штрихкоды.<<?>>ПредставлениеШтрихкода
    Reply
  17. akataev

    У Вас возможно неустановлена программа 1CBarCode.exe

    Reply
  18. tehas

    вот так спасибо

    Reply
  19. Maric

    спасибо. все работает!

    Reply
  20. sige

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

    Reply
  21. Dfcz8

    в ценниках не отображается штрих-код, а в этикетках цена. Выбор сетевого принтера из обработки? — весьма сомнительная фича. Зачем? Их что? так часто меняют? Сетевые принтеры. А так , , задумка хорошая. А мои претензии, возможно только мои глюки программы. Хотя 1С-8.2.15.294 а УТ-10.3.18.3

    Reply
  22. akataev

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

    Reply
  23. smirnoffs

    Отлично работает у меня в УТ для Украины. Но хотелось бы исправить шаблоны этикеток. Попробовал шаблон «маленький со ШК», это же то что надо, но почему-то штрихкоду выделили ну очень мало места. С удовольствием бы исправил этот недочет, да что-то не могу взять в толк где и как?!

    Reply
  24. smirnoffs

    Разобрался. Настраиваются макеты прямо в конфигураторе. Единственное но, штрихкод печатается не на всю ширину этикеты, а всего на две трети, хотя в макете в когнфигураторе картинка растянута от края до края. Штрихкод и так читается, но хотелось бы побороть.

    Спасибо авторам за отличную работу.

    Reply
  25. smirnoffs

    Оказывается я могу нормально печатать только по одной этикетке. Если вывести на печать несколько этикеток, то они печатаются все на одной этикетке, две, три в ряд. Это тоже в макете в конфигураторе настраивать или есть какой-то более прямой путь?

    Reply
  26. akataev

    Нужно выбрать принтер этикеток в обработке. У Вас выставлен принтер A4. Чтобы напечатать нужное количество этикеток в форме заполните поле количество.Настройте права пользователя

    Reply
  27. smirnoffs

    (32) ага, спасибо, теперь понятно, попробую. Правда я уже наловчился печатать этикетки как на стандартный Windows-принтер. Исправил шаблон с маленьким ценником со ШК, подогнал его макет под размеры моей этикетки, сделал так чтобы в шаблоне выводились все ценники в одну колонку и печатаю на принтер этикеток 🙂

    Несколько костыльный подход, зато работает 🙂

    Reply
  28. bes-kkm

    Очень долго искала подобную обработку, спасибо большое автору!

    Reply
  29. bes-kkm

    Я почитала отзывы, а энуюти этикетки распечатываются на формате А4? И еще как я понимаю нужно привязывать как внешнюю печатную форму, этот так?

    Reply
  30. bes-kkm

    Спасибо автору еще раз, очень пригодилась обработка.

    Reply
  31. akataev

    (35) bes-kkm,

    Да. Её нужно привязать как внешнюю обработку

    Reply
  32. sova-kupda

    Топикстартер Андрей, участники — прошу прощения за наглость, неподобающую новичку, большая человеческая просьба: может ли кто-нибудь кинуть сабжевой внешней формой в почту? sova-2002@mail.ru

    Извиняйте, ежели чего не так. «Сами мы не местные» (с) 🙂

    Reply
  33. mehkkt

    (38) sova-kupda, просьба в силе?

    Reply
  34. sova-kupda

    (39) mehkkt, и даже очень! 🙂

    Буду премного благодарен.

    А то купил-скачал похожую обработку с другого сайта, но она выводит этикетки только вертикально в 1 ряд и не отображает на этикетке розничную цену, а мне допилить ее самостоятельно по-любому не судьба — нет таких талантов 🙂

    Reply
  35. mehkkt

    (2) как указать количество этикеток для вывода на печать на А4? В графе кол-во указываю количество (например, 10), а формирует 1 шт.

    Reply
  36. stoun2010

    Добрый день! Не устанавливается цена в данной обработке. 8.2 УТ 10.3. Подскажите, в чем может быть причина. Спасибо!

    Reply
  37. akataev

    Цены берутся из справочника номенклатуры.

    Reply
  38. stoun2010

    Ну это понятно, у меня оптовые и розничные цены заведены, установки цен сделаны, а цена не встает в обработке. Может где-то есть настройка, выбор типа цен или т.п.

    Reply
  39. bardash8
    Код

    {Форма.Форма.Форма(429)}: Ошибка при вызове метода контекста (Выполнить)

    СписокШт=Запрос.Выполнить().Выгрузить();

    по причине:

    по причине:

    {(4, 12)}: Поле не найдено «Штрихкоды.ПредставлениеШтрихкода»

    Штрихкоды.<<?>>ПредставлениеШтрихкода

    У меня такая же проблема. 1сbarcode.exe установлен. что делать?

    Reply
  40. bardash8

    Пожалуйста, кто-нибудь скиньте на мыло макет этикетки из конфига, у меня его деятель удалил! b_rom@inbox.ru

    Reply
  41. stoun2010

    Нашел другую не плохую обработку, на мой взгляд, более гибкую, много макетов ценников, не сложно самому перекроить под себя: ПечатьЦенниковИЭтикетокПРОФ.

    Reply
  42. mehkkt

    (48) stoun2010, ну так делись) раз нашел.

    Reply
  43. stoun2010

    ПечатьЦенниковИЭтикетокПРОФ — на инфостаре есть!

    Reply
  44. mehkkt

    (50) stoun2010, а ссылку?

    Reply
  45. stoun2010
  46. verygood

    {Форма.Форма.Форма(429)}: Ошибка при вызове метода контекста (Выполнить)

    СписокШт=Запрос.Выполнить().Выгрузить();

    по причине:

    по причине:

    {(4, 12)}: Поле не найдено «Штрихкоды.ПредставлениеШтрихкода»

    Штрихкоды.

    та же ошибка.. при коментировании этой строчки в запросе другая ошибка выскакивает : синтаксическая ошибка использования «ИЗ»

    Reply
  47. johnkz

    Есть ссылка на 1CBarCode.exe?

    Reply
  48. Boojin

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

    Обработка отличная, но у меня при подборе товара, не заполняется поле Цены. Как быть и почему, что нужно подправить?

    Заранее спасибо за ответ!

    Reply
  49. user993549

    Добрый день!

    При выборе значения (Установка цен номенклатуры) выдаёт (Поле объекта не обнаружено (количество)).

    Как исправить?

    Reply
  50. Gznbr8989

    {ВнешняяОбработка.ПечатьЦенников.Форма.Форма.Форма(79)}: Ошибка при установке значения атрибута контекста (РазмерСтраницы)

    Табл.РазмерСтраницы = РазмерЭтикетки;

    по причине:

    Несоответствие типов

    Не как не могу понять что указывать в «РазмерЭтикетки»?

    указываю 30*20 или 30х20 не подходит пишет ошибку при печати этикетки(

    Reply

Leave a Comment

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