<?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='\
Все-таки в чем отличие от оригинальной обработки?
Из описания это непонятно, поясни.
(1) в основном изменения каснулись визуальной части, сделано ИМХО более удобней и наглядней, например имя приложения запущенное вместо 1СМ = Предприятие, Designer = Конфигуратор, …Job = Фоновое задание. и у каждого приложения свои иконки. У пользователя под которым запущена эта обработка значёк приложения в виде человечка означающая что это «я». Переставлены местами для удобства колонки. Отделено пользователь;ПолноеИмя по разным колонкам.
Ну и исправлена проблема выгона пользователя из-за которой возникала ошибка у меня (при вызове функции авторизации на сервере передавались пустые логин/пас). Вроде всё.
За «красивости» плюс! Молодец! У меня как-то ни времени, ни желания не было все «причесать» данный проект…
По поводу ужасной 🙂 ошибки из-за которой у тебя не работало, таки не понял… Это вот это что-ли?
Агент.Authenticate(Кластер,»»,»»);
Вроде никто больше не жаловался, обычно у админа кластера аутентификацию ОС ставят (тогда пароля не требуется, как я понял)… Я даже из типовой консоли, кажись, этот кусочек выдернул…
(3) Да тот кусок, он действителен если нет пароля на сервер, в второй версии сделал через попытку вход с паролем и без.
+(3) У меня есть пожелание еще! 🙂
В Висте net send не работает (я слышал), там какой-то другой, аналогичной командой заменили. Хотелось бы, что бы в зависимости от ОС админа, который отправляет сообщение, выбиралась правильная команда.
(4) А юзер/пароль админа кластера откуда берешь?… Просишь ввести?
Дыг он и так просится ввести один раз, у меня они совпадают, его же и подставляю
(7) Хм ) Ну далеко не факт, что у остальных админ кластера совпадает с администратором ИБ )
(8) Согласен, но так всё-же больше шансов 🙂
(5)
На тему NetSend, он вообще ограниченый, прежде всего (и проще) сделать отправку сообщение через ЗадачиПользователям, а потом есть ещё команда msg виндовская, насколько она пашет в висте, без понятия.
(10) Какие-такие «Задачи»? ) Обработка должна работать в не типовой конфигурации, ИМХО.
msg в Висте работает, вроде (проверить пока не могу).
(11) msg это для терминала.
Виста тут при чем?
(12) Я не сказал ведь однозначно, я просто знаю что она есть и что она подойдёт для терминала.
Да кстати счас проверил: msg /SERVER:Server * проверка отправляет всем
Удобно было бы сделать еще следующие фишки:
1. Кнопку «Прервать все, кроме выделенного» (кроме текущего, кроме себя… на выбор)
2. Установку блокировки соединений (по аналогии с консолью серверов 1с)
(14)
1) Сейчас при убийстве всех, себя не убивает. Насчёт кроче выбранного, если будет время, сделаю
2) Её можно делать из предприятия, в УТ точно есть встроенно, подскажите есть ли данная обработка во всех конфах или её полностью интегрировать в эту обработку?
(15) 2. Для универсальности решения имеет смысл реализовать в этой обработке. Было бы удобно сразу выставить блокировку, убить все сеансы кроме себя и спокойно заниматься монопольными вещами. Хотя на ваше усмотрение конечно.
(15)
Я, если честно, считаю пункт, который вышвыривает всех ненужным (чисто из практических соображений). Вместо него необходим пункт «вышвырнуть всех, кроме меня». Про блокировку установки соединений — очень удобная и нужная вещь!
Я в снеговике ноль, подскажите как исправить:
//**********************
{Форма.Форма(76)}: Поле объекта не обнаружено (ПиктограммаФайла_1С)
ОформлениеСтроки.Ячейки.ИмяПриложения.УстановитьКартинку(БиблиотекаКартинок.ПиктограммаФайла_1С);
//***********************
В целом «+», работает, только ошибку эту выдает 🙁
(17) Сказали же уже! Даже в исходной обработке (моей) пункт «Прервать все» именно так и работает.
Соглашусь с (16) кнопочки с «УстановитьБлокировкуУстановкиСоединений()» не хватает…
И нужно, конечно же, все используемые картинки поместить внутрь обработки, что бы не было ошибок, типа (18)!…
(20)
Да нужно согласен! Пока ещё не дошли руки, много чего хочу ещё дореализовать. Потому пока-что предупредил в описании что если не будет работать замените иконки ну или закоментите! Позже сделаю всё!
Обновлена обработка! Подробности читай в описании!
(22) Иконки можно непосредственно в модуле сохранить, в виде base64-строки…
(23)
Сделано! И в целом чуть-чуть обновлена обработка! Прольба прочитайте описание и выскажите своё мнение! Оно очень важно! Спасибо за вашу поддержку!
Подскажите, что это за крендель ???
{Форма.Форма(168)}: Ошибка при вызове метода контекста (ConnectAgent): Произошла исключительная ситуация (V81.COMConnector.1): server_addr=tcp://:1540 descr=Ошибка сетевого доступа к серверу
(Windows Sockets — 10061(0x0000274D). Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение. ) line=567 file=.srcDataExchangeTcpClientImpl.cpp
и письма не шлёт ((
(25)
Не похоже что у вас запущено через сервер 1С. а работает в файловом режиме.
Не шлёт скорей-всего потому-что служба сообщений на компьютерах выключена
тыыык, со службой разобрался СПС(!), а с режимами подскажи (для дровосека) что делать ?
(28) «а с режимами подскажи (для дровосека) что делать ?» простите непонял?
Поделитесь плиз своими мнениями, впечатлениями! Плохие ли они иль хорошие, выскажите! Скажите что ещё хотели бы увидеть в обработке? с нетерпением жду ваших комментариев!
Тoбишь, что сделать чтобы заработала основная функция утилиты — завершение работы пользователей ?
(30) Чтобы заработала основная функция, нужно чтоб информационная база работала через сервер 1С предприятия, больше ни-как! Поищите есть вариант на данном сайте для файлового режима работы Информационной базы… Пойми, принцип данной обработки исключает работу кроме как через сервер 1С предприятия (Обработка подключается к серверу 1С предприятия и убивает там пользователей).
(29) А почему убрали слово «Прочее» из колонки «Приложения»? Раньше было лучше — хоть какое-нибудь слово, а щас вообще ничего… И еще, можно ли какую-нибудь картинку поставить там где «Прочее»? (Все строки, как строки — красивые, а строки, например, с Com соединениями — беспонтовые) 🙂
(32) Убрал прочее чтоб выяснить в каком контексте появляется это прочее, чтоб добавить название своё. Если вы сделаете снимок и скажите что может скрыватся под пустотой я добавлю в код. Заранее спасибо!
(33) Ну, в моем случае — «Прочее» — это Ком-соединение! (Кстати, в обработке от coder1cv8 писалось что-то типа «ComConnector» или «ComConnection») Так что… Дерзайте! 😉 Вот скрин:http://files.mail.ru/D6R2E1
(34)
ок! В ближайшее время подправлю! Большушее спасибо! Кстати какой цвет для них поставить?
(35) Пожалуйста! (Ну, не знаю… Светло-зеленый можно…? 🙂 )
(36) Попробую! Хотя 1С к цветам как-то странно относится, я ставил вообще по светлей цвета, а получились темней.
(36)
Обновил обработку, сделал желаемые изменения! Проверь пожалуйста!
(0) Получил ошибку:
Скачал только последний вариант только,
в нетиповой базе, работающей через сервер 1С, запускаю обработку, все нормально, пользователей вижу,
но далее выбираю установку блокировки базы и получаю
{Форма.УстановкаБлокировкиСоединений(50,7)}: Переменная не определена (УстановитьБлокировкуСоединений)
Если <<?>>УстановитьБлокировкуСоединений Тогда
{Форма.УстановкаБлокировкиСоединений(53,26)}: Переменная не определена (ОкончаниеБлокировки)
Если ЗначениеЗаполнено(<<?>>ОкончаниеБлокировки) и НачалоБлокировки > ОкончаниеБлокировки Тогда
{Форма.УстановкаБлокировкиСоединений(53,69)}: Переменная не определена (ОкончаниеБлокировки)
Если ЗначениеЗаполнено(ОкончаниеБлокировки) и НачалоБлокировки > <<?>>ОкончаниеБлокировки Тогда
{Форма.УстановкаБлокировкиСоединений(79,56)}: Переменная не определена (ОкончаниеБлокировки)
НастройкаПериода.УстановитьПериод(НачалоБлокировки, ?(<<?>>ОкончаниеБлокировки = ‘0001-01-01’, ОкончаниеБлокировки, КонецДня(ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений(79,92)}: Переменная не определена (ОкончаниеБлокировки)
НастройкаПериода.УстановитьПериод(НачалоБлокировки, ?(ОкончаниеБлокировки = ‘0001-01-01’, <<?>>ОкончаниеБлокировки, КонецДня(ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений(79,122)}: Переменная не определена (ОкончаниеБлокировки)
НастройкаПериода.УстановитьПериод(НачалоБлокировки, ?(ОкончаниеБлокировки = ‘0001-01-01’, ОкончаниеБлокировки, КонецДня(<<?>>ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений(53,50)}: Переменная не определена (НачалоБлокировки)
Если ЗначениеЗаполнено(ОкончаниеБлокировки) и <<?>>НачалоБлокировки > ОкончаниеБлокировки Тогда
{Форма.УстановкаБлокировкиСоединений(79,36)}: Переменная не определена (НачалоБлокировки)
НастройкаПериода.УстановитьПериод(<<?>>НачалоБлокировки, ?(ОкончаниеБлокировки = ‘0001-01-01’, ОкончаниеБлокировки, КонецДня(ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений(71,2)}: Процедура или функция с указанным именем не определена (УстановитьБлокировку)
<<?>>УстановитьБлокировку();
(39) УПс, скоро проверю, исправлю!
(39, 40) Да, действительно если ошибки и серьёзные (Надо больше тестить)… Я обновил файл (версия таже), в связи с невозможностью проверить в боевых условий, убедительная просьба, скачайте файл и проверьте! Заранее спасибо!
Плюсанул
(38) Проверил! Красиво! 😉
(43)
Блокировка соединений реально ставится или нет?
спасибо, нужная вещь, но есть одно «но», появляющееся при попытке выкинуть пользователя:
{Обработка.АктивныеПользователи.Форма.Форма(237)}: Ошибка при вызове метода контекста (GetInfoBaseConnections): Произошла исключительная ситуация: Недостаточно прав пользователя на информационную базу ari2009sql
что бы это могло значить?
(45) А пользователя выкидывает??? Если нет, то введённый логин/пароль не имеет прав администрирования (роль). Если нету прав администрирования, ничем помочь не могу, т.к. обработка использует механизмы 1С для выброса пользователей которые (и правильно) требуют прав администрирования.
(46) пользователя не выкидывает. Права администрирования есть
может ли проблема быть связана с тем, что у нас MS SQL 2005 Express?
(45, 47, 48)
http://infostart.ru/projects/1836/ ….
Да вряд-ли из-за БД…. к сожалению проверить не могу. Есть одна мысль, проверьте пожалуйста оригинальную обработку
Заранее спасибо!
markers
ох торможу 🙂 просто логин надо было поменять, делов-то..
(50) Бывает 🙂
{Форма.Форма(237)}: Помилка при виклику методу контексту (GetInfoBaseConnections): Відбулася виняткова ситуація: Недостатньо прав користувача на інформаційну базу IBOX_FIN_SQL
это если я захожу удаленно,т.е. админ не дает мне полные права. а обработка хорошая
(52) «против лома нет приёма» (с)пёр.
Коль прав нет, ничего не сделаешь, это даже дело не в комментировании проверки на права в коде моём/автора оригинала, а в том что обработка делает вызовы методов сервера 1С который в случае отсутствия прав обламывается с такой вот, как Вы написали, ошибкой.
За хорошие слова, спасибо!
МолодеЦ! Я уже сам хотел переделывать обработку и наткнулся на твою! однозначно плюс++++
Лучше обойтись без реквизитов обработки «УстановитьБлокировкуСоединений», «ОкончаниеБлокировки» и т.д., а просто всегда проверять блокировку функцией ПолучитьБлокировкуУстановкиСоединений(), так лучше и надежнее, не надо каждый раз привязываться к этим реквизитам.
(53) Так а все же какие права необходимо дать пользователю на выполнение метода «GetInfoBaseConnections» ?
Стоит sql 2008 когда выкидываю юзера он на его сеансе пишет ощибку: Рассогласование транспорта интерфейса. И перезапустить или закрыть приложение. Полагаю что так не должно быть, но где копать почему так не пойму пока. Может кто с талкивался с такой ошибкой?
(57) это не ошибка, так и должно быть. Такое происходит при разрыве соединения с сервером приложений 1С
Мелочь, конечно, но
В момент подсоединения пользователя, то есть когда программу уже запустили, но она еще запустилась 🙂 ругается на строчку:
НовСтр.Пользователь = Соединение.Пользователь.Имя;
крутотень!!! спасибо!
Подскажите что за ошибка
{Форма.Форма(224)}: Ошибка при вызове метода контекста (ConnectAgent): Произошла исключительная ситуация (V81.COMConnector.1): descr=Сервер недоступен (Не отвечает, завершается аварийно или порт занят другим приложением) line=512 file=.srcRemoteCreatorImpl.cpp
Разобрался)))) оказывается в том клиенте где эта обработка запускается, в параметрах информационной базы наименование сервера указывается без наименования кластера
Большое Спасибо!
Очень полезная обработка
Да за ради такой обработки не грех и коммент оставить! Спасибо!
Спасибо,взял на вооружение.
А Вы уверены что ИБ работает под сервером?
Что это означает. ИБ лежит на сервери, пользуемся ей через удаленый рабочий стол
Часто юзаю, вещь более удобная в использовании чем «консоль администрирования 1с…».
Хотел использовать для отправки сообщений пользователям в локальной сети, но не получилось, соответствующие службы на компах домена не настроены должным образом.
Так и не удалось воспользоваться.
При блокировке:
———————
{Форма.УстановкаБлокировкиСоединений.Форма(50,7)}: Переменная не определена (УстановитьБлокировкуСоединений)
Если <<?>>УстановитьБлокировкуСоединений Тогда
{Форма.УстановкаБлокировкиСоединений.Форма(53,26)}: Переменная не определена (ОкончаниеБлокировки)
Если ЗначениеЗаполнено(<<?>>ОкончаниеБлокировки) и НачалоБлокировки > ОкончаниеБлокировки Тогда
{Форма.УстановкаБлокировкиСоединений.Форма(53,69)}: Переменная не определена (ОкончаниеБлокировки)
Если ЗначениеЗаполнено(ОкончаниеБлокировки) и НачалоБлокировки > <<?>>ОкончаниеБлокировки Тогда
{Форма.УстановкаБлокировкиСоединений.Форма(79,56)}: Переменная не определена (ОкончаниеБлокировки)
НастройкаПериода.УстановитьПериод(НачалоБлокировки, ?(<<?>>ОкончаниеБлокировки = ‘0001-01-01’, ОкончаниеБлокировки, КонецДня(ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений.Форма(79,92)}: Переменная не определена (ОкончаниеБлокировки)
НастройкаПериода.УстановитьПериод(НачалоБлокировки, ?(ОкончаниеБлокировки = ‘0001-01-01’, <<?>>ОкончаниеБлокировки, КонецДня(ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений.Форма(79,122)}: Переменная не определена (ОкончаниеБлокировки)
НастройкаПериода.УстановитьПериод(НачалоБлокировки, ?(ОкончаниеБлокировки = ‘0001-01-01’, ОкончаниеБлокировки, КонецДня(<<?>>ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений.Форма(53,50)}: Переменная не определена (НачалоБлокировки)
Если ЗначениеЗаполнено(ОкончаниеБлокировки) и <<?>>НачалоБлокировки > ОкончаниеБлокировки Тогда
{Форма.УстановкаБлокировкиСоединений.Форма(79,36)}: Переменная не определена (НачалоБлокировки)
НастройкаПериода.УстановитьПериод(<<?>>НачалоБлокировки, ?(ОкончаниеБлокировки = ‘0001-01-01’, ОкончаниеБлокировки, КонецДня(ОкончаниеБлокировки)));
{Форма.УстановкаБлокировкиСоединений.Форма(71,2)}: Процедура или функция с указанным именем не определена (УстановитьБлокировку)
<<?>>УстановитьБлокировку();
———————
При попытке Прервать соединение(любое):
———————
{Форма.Форма.Форма(220)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса: Недопустимая строка с указанием класса
———————
Что я делаю не так?
проверено работает всё как в описании сообщения в терминалке не пашут нужная обработка убивать непослушных юзеров:)
неплохая публикация) понравилось)
Полезная штука.
На 8.2 пашет? Запустил, сообщения не отсылает. Дальше даже смотреть не стал.