Версия 2. Управление принтерами внутри 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. jaroslav.h

    На 10-ке список получен, все остальное не канает.

    Reply
  2. vasilev2015

    Коллеги, напишите: что еще нужно добавить в эту обработку ? Идеи есть ?

    Reply
  3. vasilev2015

    (1) Объясните значение «не канает»: «не работает» или «не интересует» ?

    Reply
  4. jaroslav.h

    (3) не работает, ошибка «Неприпустимі аргументи»

    Reply
  5. jaroslav.h

    (2) на мой взгляд что самое ценное это получить список принтеров, т.е. имя принеторв, что бы это имя присвоить при программной печати из 1С. За способ получения списка спасибо, не знал о таком объекте в винде какой получает информацию о принтерах, находил только скриптами поллучения.

    Reply
  6. vasilev2015

    (4) у меня работает на Windows Server 2008 R2 Enterprise, Windows Server 2012 R2 Datacenter. Много пользователей, ежедневно. Проверьте, что служба диспетчера печати запущена. Недопустимые аргументы — это ошибка Windows или ошибка 1С в какой-то строке ?

    Reply
  7. jaroslav.h

    (6) винда показывает ошибку. spooler запущен, но это не принципиально, я брал обработку из-за инфы как получить список принтеров, все остальное, было бы желание, нашлося б решение.

    Reply
  8. vasilev2015

    Посмотрите еще https://technet.microsoft.com/library/ee176792.aspx

    может, не запущена служба, поддерживающая WScript или какие-то настройки безопасности ?

    Способ получения принтеров таким образом для 1С встречается с 2005 года. (Больше 10 лет). Все новое — хорошо забытое старое.

    Reply
  9. kraynev-navi

    (2) получить/выбрать лотки бумаги (входящие/исходящие) реализовано?

    Reply
  10. vasilev2015

    (9) Если это свойство принтера, то в окне свойств можно.

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

    Reply
  11. buddha667

    Я решил подобную проблему (в 1с 7.7) таким образом:

    //—————————————
    Процедура глОткрытьНастройкиПринтеров()
    ЗапуститьПриложение(«explorer.exe shell:PrintersFolder»);
    КонецПроцедуры

    Не так красиво, но просто)

    Reply
  12. kraynev-navi

    (10) не скачивал, поэтому не понял сразу. Судя по скриншоту — просто вызов окна свойств без всякого программного взаимодействия на уровне считать/установить? Надеялся как раз на программное взаимодействие.

    Reply
  13. vasilev2015

    можно разные темы поднять. Например, сделать табличную часть две колонки имя свойства-значение свойства заполнять ее свойствами принтера например Дуплекс-Истина и потом записывать обратно в принтер. Вам это интереснее будет ?

    Только за запись поручиться не смогу: например у меня не всегда отрабатывает SetDefaultPrinter объекта WScript. Это все из-за винды )))

    Reply
  14. Yashazz

    Баян баяном…

    Reply
  15. vasilev2015

    (14) Приведите пример аналогичной публикации на infostart, доступной за sm ? )))

    Лично мне из всех моих статей больше нравится http://infostart.ru/public/534444/ а остальные — гораздо меньше. Но коллеги оценивают противоположно.

    Reply
  16. Yashazz

    (15) А я даже не об ИС говорю. Ещё на ИТлэнде в своё время было. Была книжка, автора не помню, про работу с WSH, AD и всяким таким системным, для 7.7/8.0 ещё. И вот когда она вышла, был прямо шквал разработок на эту тему.

    Reply
  17. kraynev-navi

    (13) изначально поднимал тему: http://forum.infostart.ru/forum28/topic169460/ (первая фраза: без предпросмотра выбрать лоток печати). Интерес остался.

    Reply
  18. vasilev2015

    (16) В этом смысле соглашусь с Вами. Об этом же в пункте 8.

    Вспомните Екклезиаста

    9 Что было, то и будет; и что делалось, то и будет делаться, и нет ничего нового под солнцем.

    10 Бывает нечто, о чем говорят: «смотри, вот это новое»; но это было уже в веках, бывших прежде нас.

    )))

    Reply
  19. vasilev2015

    (17) я не думаю, что у меня получится лучше, чем у Вас, но посмотрю. Вчера с удивлением узнал, что бумага в лотках наших принтеров поднимается типа как в лифте. Не пружинами, а именно электроприводами )))

    Reply
  20. vasilev2015

    (17) Кстати, выбирать принтеры гораздо легче, чем лотки. Можно печатать четные страницы на одном принтере, нечетные — на другом. Или у Вас тоже огромный объем печати и лотки на электроприводе ?

    Reply
  21. kraynev-navi

    (20) Нет, у нас другая проблема: печать на защищенных носителях. Поэтому брак должен быть минимальным.

    Reply
  22. vasilev2015

    (21) Специально для kraynev-navi добавил табличную часть со свойствами.

    Предлагаю в 1С не делать установку лотков принтера, а проверять перед печатью установленный лоток. Чтобы не брать на себя ответственность за «защищенные носители»

    Reply
  23. aspirator23

    (16)Михайлов 🙂

    Reply
  24. kraynev-navi

    (22) респект за желание помочь. +

    Скачаю новую версию, посмотрю.

    Reply
  25. kraynev-navi

    Посмотрел обработку — до этих свойств уже добирался ранее, увы, этого мало.

    Установка в нашем случае должна быть по любому.

    Reply
  26. vasilev2015

    Посмотрите код в отладчике. Там еще есть свойства у com-объекта, но мне они показались малозначимыми. Пожалуй, это все чем могу Вам помочь.

    Reply

Leave a Comment

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