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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *