<?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='\
А как же тонкий клиент? Веб-клиент?
(1) Я с ними, на данный момент, не работаю. В статье подход описан. заточить под свои нужды, я думаю, не проблема.
(1)
1. Миракл со всеми бантиками вполне благополучно работает в тонком клиенте (рис.)
2. Тонкий клиент 1С, по большому счету, — изврат, все нормальные люди в терминале работают, а он и есть тонкий клиент. Даже железо «тонкий клиент» уже есть.
(3) Abadonna,
Изврат не изврат. Все равно к этому все идет. Посадят на управляемые формы, хочешь или нет.
+ за компоненту
Я что-то решил у своих сделать не через Загрузить…
Функция ЗагрузитьMiracleV8() Экспорт
Попытка
ПодключитьВнешнююКомпоненту(«AddIn.MiracleV8»);
Miracle=Новый COMОбъект(«AddIn.MiracleClass»);
Исключение
Miracle=Неопределено;
Сообщить(«Не удалось подключить MiracleV8»,СтатусСообщения.Информация);
КонецПопытки;
Возврат Miracle;
КонецФункции
(3) Хм… тогда может сможете подсказть, как решить такую проблему:
имеем 10 пользователей, у каждого сканер штрихкодов, принтер штрихкодов, и обычный принтер.
Как это всё дело заставить нормально работать в терминале, без головной боли для админа?
Сейчас все в толстом клиенте, без терминала — но хотелось бы больше нагрузки перенести на сервер.
Тонкий клиент это решит, а вот как сделать такую схему управляемой (и расширяемой до произвольного количества пользователей) при использовании терминала? Да, каждый СШК работает как виртуальный COM-порт.
Спрашиваю не из праздного любопытства, реально есть такая проблема.
P.S. А то, что Миракл работает и в тонком клиенте — не знал, спасибо за информацию.
(7)
Вообще-то она открытым текстом лежит прям в кратком описании, где ей и положено
Сервис-М MiracleV8 😉
Для сканеров ШК надо родную ПолучитьИмяКомпьютераТО() заменить на
// Функция возвращает строку c именем компьютера для нужд торгового оборудования.
//
// Возвращаемое значение:
// Строка — имя компьютера для торгового оборудования.
//
Функция ПолучитьИмяКомпьютераТО() Экспорт
WSS = Новый COMОбъект(«WScript.Shell»);
WSSE = WSS.Environment(«Process»);
мИмяКомпьютера = ВРег(WSSE.Item(«ClientName»));
Если ПустаяСтрока(мИмяКомпьютера) Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
КонецЕсли;
Если мИмяКомпьютера = «CONSOLE» Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()
Тогда вернется имя компа, с которого проброшен порт в терминал (их родной вернет имя самого терминала)
Могу сказать, что спокойненько тестировал новый СШК из нашего офиса, подключившись через VPN на терминал клиента.
(8) Просто последний раз смотрел на Miracle давно-давно, как только она была выложена тут.
//
Спасибо, хороший вариант!
А номер порта какой получится? У каждого клиента будут свои COM1, COM2 и т.д., или нумерация сквозная?
Спасибо огромное долго искал что то подобное 🙂
Ничего не имею против данной реализации, но почему-то подумалось,а что в 1с не понимают,что подобный «сервис» необходим? А так «вламывать» в конфу черт-знает что- смысл? За что деньги плачены?
(11) Lukich66, 1с поступает правильно. Если бы они всякий функционал встраивали, то нам, программистам, нечего будет есть )
(11) Lukich66,
В свое время мне подумалось: а что им стоит сделать наипростейший индикатор прогресса на форме 7.7?
Это было еще на 13-ом релизе движка. Вышел и 27-й, а ведь так и не сделали!
Именно из-за этого прогресс-бара я и начал писать ВК ;)))
Или вот: что им стоит сделать в 8.2 индикатор раскладки клавиатуры? В Конфигураторе есть (на фиг там не нужен), а вот в самой проге — нет, хотя в терминальном режиме бывает нужен.
Уровень активности сообщества 1с по 5-ти бальной шкале=1.5, думаю со временем мы сможем заставить «трудяг-производителей» сделать нам «красиво»- вроде все как бы к этому идет,ну с «отскоками» конечно, неоспоримо 8.2>8.1>8.0>7.7>6.0>2.0проф- явно прослеживаются парралели с MicroSoft Win- азарт и прыть оч.похожи. А нам «сообщникам» дел хватит и без «глобальных» замахов.
В принцепе неплохо
Неплохая идея, надо попробовать, а то вечно пользователь ничего не видит и не читает
Конечно круто, но у меня более 700 челов в 1ске регистрить dll каждому на компе… да меня свора наших сисадминов обгладает…
Не совсем понимаю, а чтобы с SQL выгоняло надо компоненту у каждого пользователя регестрировать или вообще всем админские права давать?
надо попробовать
(17),(18), Если пользователи в терминале, то достаточно один раз на сервере(ах) 1С с админскими правами запустить.
А вот если по сети, тогда на каждом компе надо регить.
Помогите, пожалуйста
Все сделал, как написано автором, но при завершении работы возникает следующая ошибка
—————————
{Обработка.ТОСервер(3321)}: Ошибка при вызове метода контекста (Найти): Неверное имя колонки
ТО = Оборудование.Найти(Источник, «ИмяИсточникаВнешнегоСобытия»);
по причине:
Неверное имя колонки
—————————
До возникновения ошибки в переменной источник содержится след инфа “ MiracleV8 ”
(21) Добавь условие, что если Источник = “ MiracleV8 ”
не вызывался этот метод.
(18) bissov,
Забавно, что новая генерация «чистых восьмерочников» задает вопросы, которые на сто рядов обсосаны семерочниками года эдак с 2000-го. Подключение ВК хоть к семерке, хоть к восьмерке а равно и проблема с правами по большому счету вообще к 1С отношения не имеют. Любой COM (ActiveX) обязан прописаться в реестре Windows, если у пользователя таких локальных прав нема — то и свободен он, как птица в полете;)
неплохая выгонялка! только вот окно маловатенькое библиотеки, пользователи поначалу не замечали ее
(24) Окно таймера? Нормальное окно. в глаза сразу бросается. очень сложно его не заметить.
(25) ну видимо пользователи слепые такие, им надо окно на полэкрана чтобы выскакивало наверное
(24) denj,
А сделай его побольше, эти [цензура] сразу начнут жаловаться, что оно мешает.
Плавали — знаем!
При загрузке компоненты выскакивает сообщение об ошибке, что не найден файл bass.dll. Поиск что это за файл и в какой пакет входит результатов не принес. Что это за файл никто не в курсе?
(28)Читайте последний комментарий на страничке ВК.
Короче, более старую версию надо загрузить.
Интересная вешь…….
Для 1С 7.7 работать не будет случаем?
Хороший которого не хватало. Спасибо!
(31) Эта ВК поддерживает 1С 7.7 так, что работать будет. код только переделать нужно.
Идея хорошая, но мне к сожалению не помогла.
Сервер на линуксе. СОМ-объекты и регистрация dll не по адресу.
а на windows 7 не работает? почему то пишет что не подключена библиотека, хотя лежит в папке где полагается..
(35) Для регистрации библиотеки первый раз нужно запустить 1С от имени Администратора.
(36) ну я и есть администратор
(37) В Win7 если ты работаешь под учеткой администратора, не значит, что ПО у тебя от имени администратора запускается. Либо ПКМ -> «Запуск от имени администратора», либо отключить UAC, что крайне не рекомендуется.
Я правильно понимаю, что для работы этой вещи необходимо наличие оной компоненты на каждом компьютере каждого пользователя?
(39) AlX0id, Если 1С сетевая и запускается у каждого пользователя локально — да. если работа идет в терминальном режиме — одна компонента на сервере.
(40)
тады не вариант.. эт за каждым компом следить надо будет.. перерегистрировать ее в случае чего..
(41)Ну дык, платформу то так и так на всех обновляешь. при обновлении ее просто в новую папку перекинуть надо.
(42)
.. и еще десяток компонент обновишь — так что ли?
Я не в претензии, конечно — просто указываю недостатки подобного подхода.
— выгоняет всех «без вопросов»(модальные окна не помеха);
У меня не выгоняет, например, если пользователь нажал перед этим Справка/О программе…
или
Просто запустил базу, вылетело окно «Итоги в информационной базе рассчитаны по…» и пользователь больше к базе не прикасался так и не закрыв окно.
Не понравилось, что если начать выгонять пользователей, а потом отменить секунд через 30, то все равно выгонит, хотя константа уже обнулена.