<?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='\
Написана по просьбе Че…
Для каких целей это используется, я не представляю 🙂
А что, потом ОбработкаВнешнегоСобытия сработает? Если так, то мне как раз это надо!
(2) Конечно, для этого и сделано.
Большое ЧЕ ловеческое спасибо!
При добавлении события с уже существующим именем происходит остановка раннего события и замещения его на новое, с новыми параметрами.
(5) Ну прямо в точку, чего хотелось. В декабре. Но и сейчас не поздно.
Оно, конечно, круто отдельную ВК для внешних событий, но осмелюсь заметить
http://infostart.ru/projects/3142/ (лежит с декабря)
(и Арчибальду тоже), что в
есть метод DoEvent(Событие,Данные)
(7) Ну эт как бы не просто сгенерить, а с заданным интервалом ;))))
(8) бе-бе-бе 😉 а 1С никак нисся по таймеру вызывать? ;)))
(9) Не комильфо! 🙂
(7)А я скачал. Правда, тогда забыл плюсик поставить. Исправился. Но таки не сообразил, как смоделировать несколько параллельных ОбработокОжидания.
(11)>не сообразил, как смоделировать несколько параллельных ОбработокОжидания.
Уговорил 😉 В новой версии Miracle таймеров можно насоздавать, как у дурака махорки. Хотя можно обойтись и одной ОбработкойОжидания, достаточно в качестве процедуры подцепить что-нибудь типа «ДиспетчерОбработок», а уж в нем рулить как хошь
(12) Обработка ожидания не наш метод! По-моему в 1С-ке только один экземпляр обработки ожидания можно создавать (в 7-ке точно так было)?
(13) Ну дык я про то же:
«достаточно в качестве процедуры подцепить что-нибудь типа «ДиспетчерОбработок», а уж в нем рулить как хошь»
Я еще в младенчестве так выполнял разные и с разным интервалом 😉
(12)Да выкрутиться-то всегда можно. Даже на машине Тьюринга. Я и выкрутился уже, но коряво получилось — таблица состояний системы, варианты переходов — черт ногу сломит. Душа красоты просит…
(13) Именно не наш. Мало того, что один экземпляр, он еще и полсекунды не понимает.
(13) Обработка ожидания наш метод.
FormEx (и класс Таймер в 1С++) позволяют создавать сколько угодно таймеров с интервалом от 1мс (это и для (16) и для (12) ответ).
Работают и в модальном окне, и при свернутом окне 1С.
Процессор не грузят, так как их обработка идет в idle-time.
А тов. Че, как всегда, идет своим путем.
(16)>он еще и полсекунды не понимает.
Из хэлпа ВК всех времен и народов (Formex ;))
ОбработкаОжидания(<?>,)
Синтаксис:
ОбработкаОжидания(<Имя>,<Интервал>)
Назначение:
Вызывает глобальную процедуру с заданным интервалом в милисекундах.
Параметры:
<Имя> — строка с именем глобальной процедуры (если в качестве параметра передается
‘пустая строка’, то ранее запущенный процесс прекращается);
<Интервал> — интервал вызова в миллисекундах (если в качестве параметра передается
‘пустая строка’ или 0, то ранее запущенный процесс прекращается).
Пример:
Сервис = СоздатьОбъект(«Сервис»);
Сервис.ОбработкаОжидания(«глПолучитьНовыеЗаявки»,200);
(18) > Из хэлпа ВК всех времен и народов (Formex ;))
Ё!!! Как согласуется с «Программы бывают двух видов — мои и куевые»?
(19) Исключения только подтверждаю правила, чи ты не в курсе? :))))
Вот придет Че и все расставит на свои места :)))
(20) А вообще приятно слышать (видеть) такое от мэтра 😉
ЗЫ. Ты для меня тоже входишь в первую тройку исключений.
А фраза «Программы бывают…» должна быть аксиомой для настоящего неперенумератора.
(21) Если кто и изобретет вечный двигатель, так это тот, кто физику не учил, и не знает, что нельзя;)
А может я API расширил, в отличии от FormEx’а, типа управлять можно событиями и статусы ловить 🙂
(24) А мы разве про тебя? :)))
Ты тут с какого бока? Мы про Че ;))))))))
(24) Статусы в смысле обрабатываешь очередь событий?
(26) Да и это можно добавить при желании-то 🙂
(27) А сейчас, без добавления, что ты имел ввиду?
Как бы посмотреть активные или нет хотя бы 😉
(18)Я в 16 об 1С говорил. Мне что, хелп от 1С процитировать?
(30) А для меня давно уже 1С без 1С++ и FormEx это не 1С.
(29) Тов. Че похоже идет опять своей дорогой. Подозреваю, что он рассчитывает на юзера, сканирующего что-то с космической скоростью.
Так вроде сам механизм асинхронной обработки событий предполагает очередь.
(31)Похоже, 1С существует вне Вашего сознания. Ничего, они за это поплатятся!
Для 77 мой Таймер позволяет работать асинхронно и в качестве обработчика назначать почти все что угодно 🙂 — процедуру глобальника, процедуру модуля формы, метод любого объекта, в т.ч. и объектов классов 1С++, и т.д.
(21)Воистину без Че не разберешься.
Мне такая фишка нужна была, чтобы смоделировать асинхронный поток событий от внешних устройств (в том числе, пока что физически не существующих), на этой основе оценить защищенность будущей системы «от дурака» и сделать вывод о работоспособности в онлайновом режиме. Сама система работает с 2001 г., т.е. без формекса, миракля и ++. Другие решения, как приведенные в обсуждении, так и не приведенные, тоже способны решить задачу. Решение Душелова — подходит сразу.
(17) Товарищ Че идет своим путем только потому, что не имеет в «доступном» виде репозитарий материалов по 1С++, а шарить по форуммам месяц, чтобы самому все сделать как оно должно быть по уму — у меня хватает пока работы и без этого 😉
Попавший ко мне в руки около года назад репозитарий классов и обработок 1С++ — редкостное гуано (сорри!) — валится на синтакисческих ошибках и представляет из себя именно «кучу»… может с тех пор что-то и изменилось…? сорри, мне как больше прикладнику — необходимы готовые и относительно вылизанные инструментарии… Василий готовую к работе ВК сваял по моему запросу практически мгновенно — вот в чем преимущество… И! очень большой вес имеет то, что контакт с разработчиком — живой!
Угумс, мне это нужно было для решения некоторых специфических задач:
— ввиду того, что складская база не разнесена от менеджерской — представляется нецелесообразным каждое сканирование писать в базу сразу — могут быть клинчи из-за нагрузок;
— обработку ожидания, которая могла бы решить проблемы периодического слива сканов в базу — применить не удалось из-за особенностей работы с формой (на тот момент);
— юзеры сканирую с приличной скоростью (с расчетом того, что сервер — это и не сервер вообще)…
Ну не доходят у меня руки до 1С++ в полной мере — не доходят…
На данный момент у меня, например, есть весьма востребованная для меня задача (обсуждал я ее уже):
— требуется одному терминальному сеансу 1Ски получить «сообщение» о событии из другого терминального сеанса 1Ски, при этом: минимум исправлений в структуре конфиги; запрет на использование ОбработкиОжидания.. ну и еще по мелочи…
(34) > Решение Душелова — подходит сразу.
потому что оно — жизненно! т.е. решает явную задачу…
(35-39) А где плюс-то твой? 😉
(40) мне вот непонятна эта ваша тяга к регалиям…
😉
(41) А я тут при чем? Сделано для тебя, быстро, устраивает — поощряй.
Пиво, ктр. ты поставишь Василию, никто не увидит, а плюсик — все 😉
как это «пиво никто не увидит» — а сам Василий???
Увижу, увижу 🙂
(35) Ты различай прикладные решения по 1С++ и саму ВК 1С++ — это разные вещи.
Проблемы прикладных решений не являются проблемами 1С++ !
Сама ВК 1С++ достаточно документирована и отлажена/проверена/протестирована.
А вот у прикладных решений, например, тот же репозитарий классов 1С++, могут быть и есть проблемы, к моему сожалению.
Юзай 1С++ в чистом виде, пиши свои классы и нет никаких проблем.
(45)>пиши свои классы и нет никаких проблем.
Сейчас Серега спросит:
«пап, а ты с кем разговаривал?» 😉
Ну вы ещё подеритесь, настоящие финские парни )))
(45) спок! я различаю! 😉
смысл в том, что 1С++ и прикладные решения на этой основе можно рассматривать по аналогии как 1С и типовые конфигурации. Соответственно, голая «платформа» сама по себе мало что дает, точно так же мало что дает набор кривых ублюдочных решений (я утрирую, так что не обижайтесь 😉
(48) Вот как раз подобная аналогия и не очень верна 🙁
Тем более, что все-таки существует огромная куча решений сторонних разработчиков, не 1С, в коде 1С, никак не связанных с типовыми конфами.
Еще — эта ВК Василия также идет без доп. решений, примеров и т.д. Если утрировать (при этом никому не нагрубив), ты ее также не можешь применять.
ЗЫ прошу больше не применять утрированных выражений типа «ублюдочных, гуано» и т.д. к решениям, которые ты не юзаешь, а многие другие успешно и не первый год юзают 🙁 — например, 1С++ и т.п.
Иначе обижусь сильно 🙂
(49) спакуха! я 1с++ тоже юзаю, и помогает иногда очень сильно.
так что не обижайтесь!
А Василий, кстати, все свои ВК иллюстрирует содержательными показательными примерами!
..а
аналогия, в какой-то мере, не очень верна, но весьма похожа. В том числе и в плане «в коде 1С, никак не связанных с 1С» — как раз в том плане, что ряд разработок всяких контор уже можно считать «типовыми», а остальное — одноразовые решения, которые для использования в другом месте — или надо драчевым енапильником обрабатывать, или проще сразу пристрелить и свое написать.. 😉
(39)И я ж о том. МОЮ задачу решает — от меня плюс. Это при том, что в системе использоваться не будет — только при оценке рисков.
Жаль, что с пивом для Василия у меня проблемы…
(51) деньги на пиво для Василия можешь кинуть мне на вебмани (в профиле), а я уже при встрече Василию проставлюсь
(52)Смотрел профиль, не нашел ничего. Кинь номер в личку что ли. Ну бестолковый я, может быть…
(34) > Решение Душелова — подходит сразу.
Подтверждаю! Хотя применял и для другой задачи! 😉
Добавил:
— ДобавитьПоВремени(ИмяСобытия, Данные, ДатаВремя) //ДатаВремя — строка, вида «Дата Время»
Срабатываеп единожды по таймеру.
(55): Строка ДатаВремя (д/77 интересуюсь) в каком формате?.. неплохо бы ГГГГММДДhhmmss, а?.. ну или в настраиваемом?..
а «ДобавитьПоТаймауту(ИмяСобытия,Данные,ТаймаутМилисекунд)» — не было мыслей?..
ЗЫ: и в (7) ссылка в никуда…
(56) Формат сейчас «20.09.2009 12:59:27».
Настраиваемое — все можно. Но не считаю нужным, да и времени нет свободного.
(57) У Абадонны все разработки удалены.
(58)> Но не считаю нужным, да и времени нет свободного.
Одобряю! 😉 Хотельщики пусть сами пишут.
Поэтому «У Абадонны все разработки удалены.»
Доброго времени суток.
Пробовал использовать ВК для передачи событий из одного сеанса ИБ в другой — не сработало. У кого-нибудь получалось?
(60) и не сработает, но решения — есть
Василий, установлена мелкая трабла в компоненте:
глГенераторСобытий.Добавить(«WMSЗАКРЫТЬПОНЕАКТИВНОСТИ»,»wms_ПАРОЛЬ»,600000); //10 мин
глГенераторСобытий.Старт(«WMSЗАКРЫТЬПОНЕАКТИВНОСТИ»);
— вот так не срабатывает, если интервал уменьшить до 300000 — т.е. 5 мин — то ок. Типа где-то что-то «переполняется».
.
настоятельно призываю вернуть компоненту к жизни — с меня угощение на тусняке!
(60)http://infostart.ru/public/19355/
(62) Это уже мне придется писать заново, так что как время появится, с коим у меня пока проблема…
(63) по (60) у Садовникова сделано можно без серверного приложения — но надо заниматься «поддержкой» — пример на РиКцентре есть.. на NetaInet сделано.
(63) по (62) — я в курске, я ж не задарма! — пиво с закусем по-любому обломится 😉 по факту готовности сабжа (когда время будет) — готов даже красивую доку написать, еще бы конечно без привязки a фреймворку это все работало (но это уже сверхотелка)
(64) С серверном лучше, проще и дешевле всего, ибо не нужен инет.
(65) Без фреймворка — неее, C# основан на нем, на другом принципиально не пишу, а по остальному — вполне.
(66) ну так короче — я побежал пиво в холодильник ставить?
(67) Ну, грубо говоря, да 🙂
(62) Посмотритеhttp://infostart.ru/public/60232/
Весь код включен в обработку и легко настраивается через 1С.
(69) я не сторонник тянуть слона если нужен всего его хвостик 😉 но спасибо, посмотрю поплдробнее…
Объясните, на уровне “ЦерковноПриходскойШколы“ как сгенерить внешнее событие в одной базе ,дабы другая его восприняла?
А можно ли заставить ее работать на Упр.формах?
Вызываю весь код на клиенте, выдает ошибку «Ошибка создания объекта внешней компоненты: «
А можно ли заставить ее работать на Упр.формах?
Вызываю весь код на клиенте, выдает ошибку «Ошибка создания объекта внешней компоненты: «
У меня тоже возник такой вопрос. И вот как я его решил:
1. Делаем управляемую форму (описывать процесс не буду, думаю вы в курсе что и как);
2. Добавляем макет типа «Двоичные данные»;
3. В макет загружаем zip-архив, в котором должны быть 2 файла:
— внешняя компонента Dushelov.ExtEventGen.dll
— файл манифеста manifest.xml
4. В форме обработки в процедуре «ПриОткрытии» пишем примерно такой код:
Показать
Обратите внимание на объявление переменной в модуле управляемой формы.
В прикрепленном файле образец переделанной мной обработки.
Ну вот собственно и все.
Еще вопрос к автору разработки —
можно ли как то устанавливать свое имя источника события в этой внешней компоненте?
Подозреваю что пока что нельзя. Но было бы очень здорово если бы вы сделали такую возможность.
Оченно пригодилась!
классика , очень занимательно
Скачал, прокомментирую после анализа. Надеюсь, поможет. Вообще, я ищу шаблон внешней компоненты для c#, чтобы форма c# вызывалась как дочерняя 1С, а не как отдельное окно
Нужна такая обработка.
Попробовал зарегистрировать в Windows 7, получил ошибку
RegAsm : Error RA0000 » Не удалось найти входную сборку «Dushelov.ExtEventGen.dll» или одну из ее зависимых сборок
Через regsvr32 выдает что «Модуль … загружен, но точка входаDLLRegisterServer не найдена. Проверьте, что … является правильным DLL или OCX и повторите попытку
Windows 7 Prof 64 Bit
Соответственно при запуске Тест.epf из 1С выдает
Ошибка создания объекта внешней компоненты: AddIn.ExtEventGen
Что делать?
Исходник на c# всего этого безобразия
https://drive.google.com/open?id=1E9moeRE7qgrz3ykNDkPP2aQFK91OGDTN
вдруг кому то пригодится
(79) А откуда исходники достались? в наследство от Василия?
компоненту я использовал, работает. только фреймворк требует и регистрацию. и есть ограничение серху на таймаут. указываемый как параметр в методе генерации собятия.
а так — можно это же все по идее получить «штатным» Формексом — есть и объект «таймер» и генерация внешних событий.
Название статьи не соответствует действительности, так как генерятся не внешние события, а внутренние, которые видны только внутри того клиента 1С, который их сгенерировал. Только в заблуждение вводит. То же самое можно через «Оповещение» сделать.