Печать ценников 1С УТ 8.1




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

26 Comments

  1. Korol_off

    УТ 10.3.7.9 при попытке сформировать ценники выдает:

    {Форма.Форма.Форма(82)}: Получение элемента по индексу для значения не определено

    Область.Параметры.ПечАртикул=Лев(Колонка,3)+»: «+СокрЛП(Строка.Номенклатура[Колонка]);

    Reply
  2. Alexsisit

    (1) Ок, обновил )

    Reply
  3. YsGSM

    1С v 8.1 УТ 10.3 выводит ошибку {Форма.ФормаНастройки(26,31)}: Переменная не определена (РаботаСФайлами)

    ДиалогОткрытияФайла.Фильтр = <<?>>РаботаСФайлами.ПолучитьФильтрИзображений();

    Reply
  4. Alexsisit

    (3) значить у вас старый релиз, и нету общего модуля РаботаСФайлами.

    Обновите конфигурацию или перенесите вручную общий модуль.

    Reply
  5. burkov

    Указана страна.В подборе отображается. Во всех цениках надпись отсутствует. Артикул в подборе пусто, а в ценике показывает код. Помогите с страной происхождения.

    Reply
  6. Alexsisit

    (5) в настройках констант необходимо проверить «Дополнительную колонку печатных форм документов», что там указано, то и будет выводиться. Вывод страны поправил, можете скачать.

    Reply
  7. burkov

    Alexsisit «в настройках констант необходимо проверить «Дополнительную колонку печатных форм документов», что там указано, то и будет выводиться.»

    Все верно там указан Код. Он и выводится в ценике. Он не показывается в подборе в колонке артикул пусто. Спасибо Alexsisit.

    Reply
  8. Alexsisit

    (7) Я в эту колонку и не подразумевал код выводить, в основном используеться аритикул (у наспо крайней мере), поэтому статично эту колонку и сделал ))

    Reply
  9. burkov

    Да и в правду оказалось лучше артикул использовать, с кодом почему то интерфейс кассира и не работает.

    Reply
  10. НатальяС

    УТ 10.3.9.4.

    Почему нет цены в колонке «Цена» (и нет возможности ввести цену?)

    Reply
  11. Alexsisit

    (10) Все зависит от токого какой у вас склад. Если склад «Розничный» — тогда дожна быть сделана розничная переоценка для данного склада. Если склад «Оптовый» — тогда достаточно установки розничной цены.

    А блокировка колонки «цена» была сделана из соображений безопасности. Эта обработка может импользоваться не только ответственным лицом но и простым оператором.

    Reply
  12. 0xana

    (11) у нас нет на оптовом складе розничной цены…

    может есть смысл добавить возможность выбора типа цен?

    Reply
  13. Alexsisit

    (12) Как и просили, добавил в настройке выбор Типа цены.

    Так же добавил удаление всех строк таблицы.

    Reply
  14. 0xana

    спасибо!:)

    Reply
  15. Strannik99

    Очень удобная обработка, спасибо автору большое. Маленький проблем.( к сожалению сам пока не силён разобраться )

    УТ 10.3.13.2, оптового склада нет, товар поступает сразу на розничный склад, тип цен розничные, при выборе из переоценки товаров в рознице (док. есть и проведён), не заполняется табличная часть, соответственно не формирует ценники. Если заполнять по «установке цен номенклатуры»

    ошибка «Поле объекта не обнаружено (основной склад)»,но таблица заполняется без поля количество и единица.

    Reply
  16. cool.vlad4

    Ого, не то что я мучился с этими ценниками в 1с, а сейчас уже для меня не актуально, через 1С — com — CrystalReports сделал.

    Reply
  17. Alex_Pet

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

    Reply
  18. Alexsisit

    Обновил обработочку. Количество убиралось из-за отсутствия цены и остатков. Сейчас будет убираться только галочка.

    Reply
  19. ddust

    Большое спасибо за обработку. То что искал!

    Reply
  20. Steps78

    Спасибо большое. Удобная в пользовании и настройке обработка. Единственное что (может я не до конца понял), но мне пришлось изменить размеры шаблона большого ценника (35мм Х 22мм), (у нас уже готовые ценникодержатели), и теперь приходиться каждый раз разворачивать лист бумаги в положение ланшафт, в виду того что в портретном режиме при печати 3х и больше больших ценников они сжимаются до средних а только потом переносятся на новую строку. А на ланшафтном размещении влазит 3 больших и потом переносятся на другую строку.

    Reply
  21. smirnoffs

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

    Особенное спасибо за то что обработка спрашивает перед попыткой закрыть по Esc о том надо закрыть обработку или нет. Вообще считаю, что это должно быть поведением всех обработок по-умолчанию. Но почему-то до этого додумались только вы.

    Reply
  22. vlanik

    Хорошая обработка для печати.

    Reply
  23. smirnoffs

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

    Reply
  24. Alexsisit

    (23)Конечно нужен. Надо поставить компоненту 1С Печать штрих-кодов.

    Reply
  25. smirnoffs

    (24) оо, посыпаю голову пеплом. Даже стыдно немного. Поставил компоненту, все стало отлично печататься. Спасибо!

    Reply
  26. Boudybuilder

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

    Reply

Leave a Comment

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