Программное создание скриншотов из 1С




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

19 Comments

  1. set5553

    Интересно. а как дальше допустим по почте передавать, если «создается временный файл, а потом удаляется»? УФ тестировали?

    Reply
  2. terroristish

    Файл скриншота создаётся в каталоге временных файлов. После создания он загружается в элемент формы (поле картинки) и удаляется из каталога временных файлов за ненадобностью. Это логично, т.к. данная обработка не является законченным решением, а лишь служит примером, того как можно сделать скриншот программно.

    По поводу использования в УФ, могу сказать, что точно так же сделать не получится. В виду того, что согласно синтаксис-помощнику, если картинка задается программно, то может быть установлена либо пустая картинка, либо или картинка из библиотеки. Конечно можно выкрутиться и всё равно, его (скриншот) отобразить, например с помощью HTML.

    Сейчас добавлю пример для УФ.

    Reply
  3. eugeniezheludkov

    <Зануда>

    Возможное приминение:

    <Зануда>

    Reply
  4. terroristish

    (3) eugeniezheludkov, спасибо! Поправил.

    Reply
  5. Yashazz

    Это знаете где хорошо применять? Я такое делал, когда меня попросили распечатывать яндекс-карту из 1С. Выяснилось, что API яндекса печатать не умеет, они сами-то долго мучались и через static api сделали, а в 1С вилы. В результате я выводил карту в форму, открытую модально в режиме рабочего стола (обычный интерфейс, не УФ), её скриншотил, а уж рисунок распечатывал. Тоже через WScript делал, кстати.

    Reply
  6. PrinzOfMunchen

    (2) а с помощью этого скрипта можем сделать скриншот определенной области? А вообще, можно ли как нибудь табличный документ сконвертировать в картинку другим способом?

    Reply
  7. xaozai

    Есть ВК, которая скрины делает: http://infostart.ru/public/172868/

    PowerShell не у всех есть.

    Reply
  8. terroristish

    (6) PrinzOfMunchen, «а с помощью этого скрипта можем сделать скриншот определенной области?» — с помощью представленного мною скрипта — нет. Нужно скрипт править.

    «можно ли как нибудь табличный документ сконвертировать в картинку» — на мой взгляд, этот вопрос, никак не связан с данной публикацией. Стандартными средствами платформы табличный документ нельзя сохранить в картинку. Смотрите в СП ТабличныйДокумент метод Записать() и/или ТипФайлаТабличногоДокумента.

    Reply
  9. terroristish

    (7) xaozai, Спасибо за ссылку. Особенно ценно, что компонента разработана по технологии Native API. Что PowerShell не у всех есть — согласен.

    Всё таки очевидный плюс моего решения, заключается в отсутствии необходимости использования сторонних ВК.

    Reply
  10. echo77

    Рекомендую, все таки проверить опечатки вордом

    Не все пользователи занают,
    Reply
  11. zekrus

    Добрый день!

    Тема весьма актуальная.

    Было бы здорово организовать скриншот распакованной формы обработки (в формате внутренней строки).

    Пример:

    «{2,

    {36,0,0,0,0,1,0,1,00000000-0000-0000-0000-000000000000,1,

    {1,1,

    {«ru»,»(вер 1.1)»}

    },0,0,1,1,1,0,0,0,

    {1,3ccc650e-f631-4cae-8e33-3eaac610b5f9,»ПриОткрытии»},

    {0},1,

    {19,

    {-1,02023637-7868-4a5f-8576-835a76e0c9ba},0,0,1,

    {0,

    {0,

    {«B»,1},0}

    },9,»ФормаКоманднаяПанель»,

    {1,0},

    {1,0},0,1,0,0,0,2,2,

    {3,4,

    {0}



    П.С.: Цель автоматическая генерация документации файла внешней обработки или отчета, парсер кода есть.

    С уважением

    Reply
  12. Boneman

    Интересна только идея, за это звезда.

    Но с практической стороны, вроде бы и бесполезная фигня. Везде где работал, у пользователей куча разношерстных баз, и типовых и нетиповых. А скриншоты в основном нужны, например когда база крашится, или вываливает ошибку, где нужно еще нажать «подробно»…и смысл наворотов вроде как бесполезен в зоопарке. Тут внешняя среда исполнения нужна, в винде.

    Reply
  13. feva

    Reply
  14. feva

    (12)По большей части Вы правы.

    Но нашёл применение на практике.

    Есть одна большая база (овер 1000 продаж в день, 150+ юзверей бъют копытцами по клавиатуе весь день). Сделал пул самых опасных и прикрутил к парсеру нагрузки сервера отправку на клиент команды для лепки скриншота после чего грохаю сеанс. Потом админ с вещ. доком идёт бить по лицу.

    Reply
  15. terroristish

    (14) Годное приминение

    Reply
  16. user932670

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

    Reply
  17. quares

    А как передать команду, чтобы делался скриншот только активного экрана? У меня их несколько. Это возможно?

    Reply
  18. Kaco

    Как убрать черное окно со скриншота?

    Reply
  19. bimy22

    Блин,вещь действительно крутая! Почему не было этой темы, когда я пыталась что-то подобное реализовывать 🙁

    Reply

Leave a Comment

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