Запись текста модуля ert-файла из текстового файла




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

39 Comments

  1. Арчибальд

    Именно лень движет прогресс, АднАзнАчнА 😀

    Reply
  2. Serj1C

    А использование специальной конструкции

    #ЗагрузитьИзФайла g:1 декабряЗапись из текстового файла в ertМодульВыгрузки.txt

    уже не комильфо?

    Reply
  3. Rusmus

    (2) Я правильно понимаю, что такая конструкция есть только в 7.7. В этом случае не комильфо: замена модуля обработки происходит из базы Конвертация данных на 8ке.

    Reply
  4. Serj1C

    (3) ert-файл и есть 7.7. Один раз прописываешь путь и все.

    А модули для восьмерки хранятся в правилах обмена.

    А так не спорю, может и полезная программа

    Reply
  5. iov

    не программа то пригодится (например держу выгруженные модули например для массовой замены определенных параметров) приходилось извращаться .. лови плюса..

    Reply
  6. Totoro

    Мой древний вариант дял КД через GCOMP 😀 Отладка обработчиков в КД

    Правда, для последней КД не переделывал

    Reply
  7. huse

    А для 8-ки кто нить подобное делал?

    Reply
  8. Totoro

    (7) В 8 тексты обработчиков в правила в строены, а отладку недавно сделали через внешние обработки. В обработке УниверсальныйОбменДаннымиXML достаточно подробно пояснено что делать при отладке.

    Reply
  9. Abadonna

    Чтобы не спорили, как лучше, быстрее и т.д. 😉

    Просто дернул кусок из своего http://infostart.ru/public/15043/

    В результате трудозатраты составили 30 минут на поиск подходящей иконки для программы

    Reply
  10. Abadonna

    (2)

    А использование специальной конструкции

    #ЗагрузитьИзФайла g:1 декабряЗапись из текстового файла в ertМодульВыгрузки.txt

    В анонсе ж написано: для ОСОБО ленивых.

    На флеху если копировать, аж ДВА файла придется 😉 Да еще можно и забыть текстовик скинуть.

    Reply
  11. Шёпот теней

    … что? … используем принципы двойных стандартов …

    … это я по поводу оформления обработок … ???

    … ужжж … молчу по поводу содержания …

    … ВОТ …

    п.с.1. а вроде САМ — сам модератор … иииих … всЁ как в ЭрЭф-ии … ё …

    п.с.2. … и даже наш прнципиальнейший носитель-прекрасного (артбир) отметился плюсом … нууу, до чего чУден и НЕОдназначен мир …

    … простоВОТпросто …

    Reply
  12. Abadonna

    (11)Ежели честно — ни фига не понял.

    Надо было скриншот программы, у которой вообще окна нет выложить? ❓

    Чего там не хватает в содержании?

    Reply
  13. Abadonna

    +(12) Шепот, что предлагаешь добавить к исчерпывающим строчкам:

    При отработке текст из файла (первый параметр) перезаписывается в модуль файла 1С-обработки 7.7 (второй параметр). Если программа запущена в каталоге, где н
    Reply
  14. artbear

    (2) Для локальной отладки такой вариант, конечно, работает.

    Но если идти на другой комп, вариант становится нерабочим.

    Поэтому его сложно назвать универсальным в отличие от сабжа или решения на Gcomp из (6)

    (6) Так я же переделывал на последнюю для 8.1, не для 8.2

    У тебя в комментах выложил доработку 🙂

    (11) Тут фактически командная строка, что еще добавлять-то? описание КД 🙂

    Reply
  15. Шёпот теней

    … дорогие ! (я не шучу … я серьёзно … ИС без вас малоПредставляем) …

    1. читаем правила офрмления обработок … сверяем — удивлЯемся …

    2. что ? показать некоторые обработки — где они охаены и поставлены минуса — за те же самые «одна» строчка и не указанные платформы, например, … и излишнюю простоту …

    п.с.1. … смЕЕЕшно-с …

    п.с.2. … всё больше и больше ИС напоимнает «РАВНЫХ» среди «равных» … может нам поставить «мигалки» на некоторых товарищей … а что ? … и прикольно и «новая форма» повится … опять же знак РАЗличия ! ..

    … вотЗАмолк …

    Reply
  16. Abadonna

    (15)

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

    Какие на фиг платформы? Это, как и написано, программа Windows. И никакие одноэсовские платформы её не колышат.

    И никакие 1С (… непечатные слова…)конфигурации я специально не указывал. Это моя принципиальная позиция.

    Я, кстати, чуть не морду бью тем, кто посмеет меня назвать 1С-программистом 😉

    Reply
  17. Шёпот теней

    (16) … и где.жжж тогда дисциплина на ИС … если такие модераторы … ? …

    … анархия «РАВНЫХ» и демократия «равным» …

    … вотДЕВИЗис …

    Reply
  18. vasilykushnir

    (15) Сань, ты чё? Плохое настроение? Я честно говоря недоумываю, что можно еще добавить к описанию. Может разве написать: запускать только под Windows. Под VMS, Ubuntu и иже с ними даже не пытайтесь. Тогда с платформой будет все ОКеюшки.

    PS: Аркадий, допиши еще пожалуйста — «в сеть 200В НЕ ВКЛЮЧАТЬ!!!»

    Reply
  19. Abadonna

    Обрати внимание на красный квадратик на рисунке. Почему оно в заголовок не попадает — вопрос к Доржи, однако

    Reply
  20. Abadonna

    (19) см. 18

    Reply
  21. Шёпот теней

    … с моими «отцами» — я категорически СОгласен … и спорить не буду даже …

    … я высказал своё личное мнение, оно может быть и НЕправильным … кто хочет увидит … кто ЗАхочет поддержит … кто не согласен — выскажется …

    … вот …

    Reply
  22. vasilykushnir

    (21) Сань, без обид. Вот ты лично что бы еще добавил к описанию?

    Приведу пример: есть у меня приблуда (как раз Абадонны — по моему заказу сделал) запускается без окошек, в ини-файле всего три строчки (но тем не менее чрезвычайно полезна функцией, которую штатными средствами ну никак)- и какой скрин для нее выкладывать? Другой вопрос, что Аркадий считает такие вещи мелочевкой и вряд ли ее выложит здесь, а я уже ее у 5 клиентов поставил 😉

    Reply
  23. Abadonna

    Насчет

    демократия «равным» …

    Один бывший ярый сионист окрестился и свалил из Израиля. Одной из причин было то, что на попытку жить «по демократическим принципам» ему

    там ясно дали понять:

    — Ты что, — дурак? Это ж для внешнего употребления.

    Вот так, дорогой ты наш демократ 😉

    Reply
  24. Шёпот теней

    … и был ЗАбит камнями ОН … ))) … и как дружно … как дружно … ))) … и даже израиль прозвучал — типа международный масштаб у нас однако …

    … зато теперь данная обработка станет «эталоном» — и ВСЕ за неё проголосовавшие и её прокоментировавшие — наверное станут «эталонами» оценки других авторов — пишушие подобное …

    … вот …

    Reply
  25. Totoro

    (14) Конечно я помню 😀 Но, на последнюю мы не переделывали. Хотя я тут встречал пару раз мою обработку под другим именем с переделкой. Один, правда, на источник сослался.

    ЗЫ Я считаю что это тоже вариант, хоть и не универсальный, но имеющий право на работу поэтому и поставил плюс.

    (0) Я как обстоят дела с именами с пробелами, а то у GCOMP-а были с этим проблемы?

    Reply
  26. Abadonna

    (25)

    как обстоят дела с именами с пробелами, а то у GCOMP-а были с этим проблемы

    В КАВЫЧКАХ полные пути, как и написано в описании и примере

    В общем, КГБычно, как бы и в *.bat писал

    Reply
  27. O-Planet

    Очень бы такое согрело, написанное под 8.1. И к тому же в обе стороны: выгрузка модуля epf в текстовый файл и загрузка из текстового файла в модуль epf

    Reply
  28. O-Planet

    … И Шепот теней про двойные стандарты на ИС реально насмешил. Почитай сперва свои комментарии, чтобы говорить о каких-то форматах изложения мысляф… мыслей … мыслев … 😀 ВооОООоооОООооооотттт ведддьььь…..

    Reply
  29. makfromkz

    не люблю exe-шники 🙁

    Reply
  30. Abadonna

    (29)

    не люблю exe-шники

    Готовить их не умеешь.

    Reply
  31. makfromkz
    Abadonna пишет:

    (29)

    согласен, но все равно не люблю 🙂

    Reply
  32. Rustig

    (0) Приветствую! Прошу прощения, что вопрос по другой теме. Не могу написать тебе в личку. Занимался ли ты чем-нибудь подобным (?) :

    http://demo-ma.1c.ru/trade/ru/ — имеется в виду созданием общей для всех разработчиков и открытой для доступа базы?

    Я поднял тему http://infostart.ru/public/81148/ и пока горячо хотел узнать твое мнение.

    Reply
  33. Abadonna

    (32) Ответил в личку

    Reply
  34. Поручик

    Удобная вешь, сразу ert получать. Правда я использую вариант от http://forum.infostart.ru/forum24/topic36874/message403826/#message403826

    Reply
  35. IgorXml

    Был у меня вариант:

    Компонент = Новый ComОбъект(«Amber.Compound»);
    Рез=Компонент.File2Stream(СокрЛП(ИмяФайлаОбработкиВыгрузки),СокрЛП(ИмяФайлаМодуляВыгрузки),»MD Programm text»,1);
    

    Но админы права порезали. 🙂

    Спасибо тебе за другое решение.

    Reply
  36. Abadonna

    (35)

    Но админы права порезали. 🙂

    Не пущать — это их работа. Их на@@ать — наша :)))

    Reply
  37. IgorXml

    (2) Serj1C, Спасибо. Это тоже работает: #ЗагрузитьИзФайла C:….ACC77_KA11_UPP13.txt

    У меня пару минут тормозит только. И даже отладчик 77 вытаскивает такие модули, но тоже тормозит несколько минут.

    Reply
  38. doom2good

    Спасибо, вещь действительно очень полезная!

    Reply
  39. BiLBelarus

    Спасибо, сэкономил кучу времени и нервов!

    Reply

Leave a Comment

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