1С в нормальном окне терминала без Citrix’а




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

45 Comments

  1. cuba8

    Хорошая фишка. Плюс. Тоже используем терминал, в этом режиме есть одна нехорошая вещь для 1С, когда пользователь закрывает окно терминала нажатием на «крестик» всплывающей верхней полоски терминала. При этом окно терминала закрывается, сессия 1С остается открытой на сервере. В сети был способ редактирования файла mstsc.exe (терминальный ехе-шник), после которого при нажатии на «крестик» полоски терминала появлялось сообщение типа: «Сначала закройте 1С». Правда, редактирование файлов Windows это нарушение закона! Так же в сети есть способ изменения стартера 1С, т.е. при закрытии 1С в терминале – закрывается и терминальная сессия, удобно и пользователи не вредят.

    Reply
  2. tulke

    Прикольно. Только у меня 1440 х 900 поставил 1438 х 850

    Reply
  3. ACE$

    действительно, вещь хорошая… Но если пользователей больше сотни, и все «хотят», это всем выставлять ручками?

    Конечно это можно допилить политиками… Или еще лучше, расчитывать высоту экрана терминальной сессии исходя из высоты рабочей области клиентского экрана.

    А если набрать в командной строке «mstsc /?» то можно увидеть еще много чего интересного

    Reply
  4. Арчибальд

    Простенько и со вкусом.

    Reply
  5. nafa

    (1) Насчет закрытия пользователем окна терминала вместо 1С — в свойствах пользователя на сервере выставляем кому что надо: для понимающих — чтобы сессия отключалась, для непонимающих — чтобы закрывалась.

    (3) Если пользователей много — лучше всего ставить Citrix. Вышеописанное — для ситуации когда его по каким-то причинам поставить нельзя.

    Reply
  6. 12345678999

    (5) Ситуация эта когда нет желания платить за доп лицензии цитрикса 😀

    когда можно обойтись стандартным рдп клиентом

    ПС плюс в копилку

    Reply
  7. JohnyDeath

    (1) помогает вот это: http://infostart.ru/public/14344/

    Reply
  8. begemot

    Все гениальное просто…. Плюс….

    Reply
  9. ACE$

    могу сказать, что цитрикс сам по себе вещь весьма не дешевая… Посему у нас как рез те самые 100+ зверей сидят под стандартным mstsc

    Reply
  10. delete009

    а при закрытие 1 с сессия остается активная, т.е. 1с закрываеться а терминальное окно нет остается просто синий экран который приходиться выключать через админа. Это как можно решить.

    Reply
  11. nafa

    (10) Надо понять причину незакрытия. Их бывает несколько.

    1. 1С запускает какую-то другую (невидимую) программу, которая не закрывается. Например, внешняя компонента защиты конфигурции доп. ключом (не путать с ключем самой 1С). Дело в том что если Вы логинитесь на рабочий стол, то выбор в Эксплорере завершения работы — это именно завершение работы (однако если просто убить процесс эксплорера завершения работы не произойдет).Если у Вас стоит запуск конкретной программы — то ее закрытие это не есть закрытие сессии, которое происходит при заверении всех запущенных программ. Проверяется анализом запущенных процессов. Попробуйте также вместо 1с запускать блокнот — будет сессия закрываться или нет.

    2. Просто не закрывается сессия — по аналогии с тем, как бывает что при выборе завершения работы windows окошко «завершение работы» горит несколько минут и потом в системном журнале находим сообщения «неудалось сохранить реестр» и пр. Причины по моему самые разнообразные — левый софт, сбоит железо, винда криво активировалсь и пр.

    Reply
  12. OneS

    Размер окна терминала легко задаётся ключами /w: (ширина) и /h: высота.

    Команды смотрятся mstsc /?

    Reply
  13. Dimasik2007

    Если у Вас Windows Server 2008, то рекомендую технологию RemoteApp.

    «Terminal Services RemoteApp™ (TS RemoteApp) – это технология, позволяющая пользователям получать доступ к удаленным приложениям через службы терминалов. Удаленные приложения на базе технологии TS RemoteApp ведут себя так, будто они запущены на локальном компьютере пользователя. Пользователи могут запускать эти приложения бок о бок с локальными. Если пользователь запускает на одном сервере терминалов несколько удаленных приложений, все они выполняются в рамках одного общего сеанса служб терминалов. Вы можете использовать веб-доступ к службам терминалов (TS Web Access), являющийся ролью служб терминалов, для обеспечения пользователям доступа к приложениям TS RemoteApp с помощью веб-обозревателя.»

    Инструкции: http://www.oszone.net/5542/ и здесь http://gotch.techfaq.ru/archives/282

    Reply
  14. annak2980

    (12) спасибо за совет насчет /w: и /h:

    я часто смотрю и подправляю базы по интернету через mstsc, а когда

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

    Reply
  15. Сашулик

    Спасибо! Очень познавательная статья.Мне, как буха,перебивающегося на подножном корме,очень пригодится!!!

    Reply
  16. imagoman

    однозначно плюс — удобно!

    Reply
  17. kobol

    Вот и решина проблема старых принтеров 🙂 при подключение в терминал, а то старые принтеры под 2008 и 2008 R2 не робят 😥 , драйверов нет,

    может кто знает как запустить Canon LBP-810, xerox 3110, напишите kobol74@ya.ru 😉

    Огромные плюсы +++++++++++++++++++++++++++++++++++++++++

    Reply
  18. cuba8

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

    Reply
  19. vlas

    Плюс и только плюс, спасибо очень облегчили жизнь!

    Reply
  20. s-kuchin

    +

    Reply
  21. Sir12

    Странно — ниогда с полосами прокрутки в терминале не сталкивался. Работаю с 8-кой из под ХР

    Reply
  22. dobraleks

    Однозначно +.

    Попробую реализовать у себя такое..

    Reply
  23. nikolega

    Юзайте бесплатную программу http://remotedesktopmanager.com/

    И никакой головной боли с размерами экрана и черными полосами не будет 🙂

    Reply
  24. Sph1nX

    То что надо. ❗

    Reply
  25. Valerich

    огромный плюс.

    Reply
  26. iov

    Citrix отказались от данного решения (в пользу стандартных функций)

    Проблем нет полет нормальный. А в качестве минусов решения всех рубить из терминала могу привести пример когда бухия запустила проведение на ночь.. А тут их.. А утром Вас… Сома софтина полезная забрал на всякий…

    Но вот еще проблема а у меня из инета на терминал ходють, с домашних компов. (ну правда и этот вопрос решен был подключением всех «домашних» на отдельный сервак, но не у всех есть «отдельный» сервак для этих целей.)

    Reply
  27. iov

    сори ссылка на софтину порерялась

    http://infostart.ru/public/14344/?PAGEN_1=2#comm

    Reply
  28. mammon

    очень даже спасибо огромное, меня бухгалтерия ужо зако….ла.

    Так что еще раз огромное спасибо

    Reply
  29. Oleg_46

    Удобно и практично.

    Reply
  30. bestbat

    Однозначный +

    Reply
  31. mcbase

    Вещь то удобная но вот что-то мне подсказывает, что таким образом у бедного Админа останется куча запущенных 1с в терминале… ТК пользователи, наверняка будут просто закрывать Окно терминала не вырубив 1с — следовательно можно забыть про автоматический бекап баз))

    Reply
  32. nafa

    (31) Эта проблема как раз решена — см. конец статьи — «Дополнение от 23.12.2009» и последний скринштот. Видимо что-то глюкануло и вам выдалась первоначальная версия статьи, где этого дополнения не было!

    Просто ставите «проблемным» клиентам программу HideRDPxButtoN и никто после этого «не то окно» не закроет.

    Reply
  33. mcbase

    )) А ну тогда — все ок… Соглашусь со всеми, вещь удобная, спасибо…

    HideRDPxButtoN я уже давно качал, а то уже не знал что с пользователями делать..

    Reply
  34. fotov

    кстати, можно использовать ещё параметры запуска mstsc

    /w и /h (ширина и высота соответственно)

    интересно — а можно ли сделать так чтобы окно mstsc запускалось без заголовка стандартного — на него бездарно расходуется экранное пространство

    Reply
  35. nafa

    (34)

    интересно — а можно ли сделать так чтобы окно mstsc запускалось без заголовка стандартного — на него бездарно расходуется экранное пространство

    Раньше (на CRT мониторах) можно было картинку немного растянуть по вертикали и сместить вверх.

    Reply
  36. rasswet

    полезная штука! спасибо!

    Reply
  37. bsa1968

    Нужная и полезная вещь! Спасибо!

    Reply
  38. vladimir_makarov

    (1) Даже если пользователь закрыл окно терминала (при запущенной 1с), всегда есть возможность открыть его с того же места. И дать пользователю П…! Иначе Админ всегда (хоть по ходу работы) может вмешаться в сеанс пользователя так, что тот будет 2!!! мыши на экране видеть! Али я не прав? росто следить за ними надо! А то начинают с «Косынки», а кончают… сервер не справляется. Я имею ввиду прокси…

    Reply
  39. dardroze

    Поставил 974 (1024 — 50) все подошло.

    Спасибо, стало гораздо удобней

    Reply
  40. voyger_men

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

    Reply
  41. vladimir_makarov

    (40)… а можно просто ПОЛНЫЙ доступ на сервер дать, который ограничен правами пользователя. Это подходит для тех, к кому у админа есть доверие!!! А для сети меньше загрузка, и пользователям можно машинки попроще ставить!

    P.S. Сам свои слова извращением считаю! Ибо!!! Для пользователя сервер — это что-то далёкое, недоступное и святое! Иначе админ будет должен одновременно над всеми с плёткой стоять! Всё равно накосячат!!!…

    Reply
  42. iotkin

    Написано доступно и понятно. А главное актуально для нашего предприятия. Огромное спасибо!!!

    Reply
  43. VictorK

    Однозначно нужная и полезная вещь! Спасибо! Ставлю +.

    Reply
  44. nirbolz

    Да крутая фишка) а я еще делаю чтобы клиенту автоматом 1ска запускалась через настройку на сервере.

    Reply
  45. PiccaHut001

    очень полезная статья

    Reply

Leave a Comment

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