Программное обращение к внешней обработке




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

28 Comments

  1. binex

    Мощный отжиг.

    Reply
  2. acapulco

    Зачем, спрашивается, помещать обработку во внешние обработки, когда ее можно включить в конфигурацию?

    Чем обоснована эта необходимость?

    Да и зачем изгаляться с внешними обработками, когда ее можно разместить на диске и по такой же схеме открывать, указав путь к файлу на диске.

    Reply
  3. TODD22

    (3) acapulco,

    спрашивается, помещать обработку во внешние обработки, когда ее можно включить в конфигурацию?

    Для того что бы не включать режим редактирования конфигурации.

    Чем обоснована эта необходимость?

    Тем что база с включенным режимом редактирования будет дольше обновляться. А если его не включать то в обновление пройдёт автоматическом режиме.

    Да и зачем изгаляться с внешними обработками, когда ее можно разместить на диске и по такой же схеме открывать, указав путь к файлу на диске.

    Для того что бы обработка выгружалась в резервную копию вместе с базой. То есть хранилась в самой базе данных.

    Reply
  4. h00k

    (0) Круто. Теперь ждем цикл статей как подключить обработку из справочника без создания временного файла на диске…

    Reply
  5. h00k

    (3) acapulco,

    Да и зачем изгаляться с внешними обработками, когда ее можно разместить на диске и по такой же схеме открывать, указав путь к файлу на диске.

    Ну ка, расскажите нам не сведущим, как обработку/ отчет размещенную на диске подключить к конфигурации, добавив команды открытия в нужные разделы интерфейса, указав конкретного пользователя/ группу имеющую право запускать эту обработку или просто настроить запуск по расписанию.

    (5) TODD22, на мой взгляд удобное назначение права доступа более веская причина, хотя да, хранение обработки в базе тоже причина достаточно важная.

    Reply
  6. lonlilokli

    (3) acapulco, собственно задачка простенькая, особенно я так понимаю для Вас. Нужно формировать отчет с разными настройками для менеджеров. Менеджеров 50 настроек тоже. Если можно расскажите как бы Вы это реализовали.

    Reply
  7. karpik666

    (0) Это троллинг, или автор действительно называет это «Публикацией»?

    Reply
  8. Kolyasik

    а на ИТС разве нет описания работы с внешними отчетами обработками?

    Reply
  9. lonlilokli

    (10) Kolyasik, Ок, посмотрю. Иногда бывает нет под рукой. А если можно подскажите как это там найти.

    Reply
  10. acapulco

    (10) Kolyasik, конечно есть http://its.1c.ru/db/metod8dev#content:3556:hdoc

    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    //Помещаем обработку во временном хранилище
    АдресХранилища = «»;
    Результат = ПоместитьФайл(АдресХранилища, «C:ВнешняяОбработка.epf», , Ложь);
    ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
    
    // Откроем форму подключенной внешней обработки
    ОткрытьФорму(«ВнешняяОбработка.»+ ИмяОбработки +».Форма»);
    
    КонецПроцедуры
    
    &НаСервере
    Функция ПодключитьВнешнююОбработку(АдресХранилища)
    
    Возврат ВнешниеОбработки.Подключить(АдресХранилища);
    
    КонецФункции 

    Показать

    Reply
  11. lonlilokli

    (12) acapulco, Ок ! Спасибо! У меня просто стояла задачка брать обработки сохраненные во внешних в 1с предприятии.

    А так тоже надо было, но не смог найти. А оказалось точно просто набираешь в поиске на итс «открыть внешнюю обработку» и на тебе пожалуйста.

    Сколько раз уже на эти грабли натыкался, ищешь часами в нет, нет что бы просто в синтакспомощник заглянуть :))

    Reply
  12. karpik666

    (13) а еще можно в конфигураторе найти справочник «ВнешниеОбработки» и глянуть как в форме списка открываются внешние обработки. Обработчик события при выборе:

    Справочники.ВнешниеОбработки.ВыполнитьВнешнююОбработку(ВыбраннаяСтрока);
    
    …
    
    Процедура ВыполнитьВнешнююОбработку(ВнешняяОбработкаСсылка) Экспорт
    
    ЭтоОбработка = ?(ВнешняяОбработкаСсылка.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка, Истина, Ложь);
    ЭтоОтчет = ?(ВнешняяОбработкаСсылка.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет, Истина, Ложь);
    
    Если НЕ (ЭтоОбработка ИЛИ ЭтоОтчет) Тогда
    Возврат;
    КонецЕсли;
    
    ИмяФайла = КаталогВременныхФайлов() + ВнешняяОбработкаСсылка.УникальныйИдентификатор() + «.tmp»;
    ДвоичныеДанные = ВнешняяОбработкаСсылка.ХранилищеВнешнейОбработки.Получить();
    ДвоичныеДанные.Записать(ИмяФайла);
    
    Если ЭтоОбработка Тогда
    
    Форма = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
    
    Иначе
    
    Форма = ВнешниеОтчеты.ПолучитьФорму(ИмяФайла);
    
    КонецЕсли;
    
    Если Не Форма = Неопределено Тогда
    
    Форма.Открыть();
    
    Иначе
    
    Если ЭтоОбработка Тогда
    ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяФайла, Не ВнешняяОбработкаСсылка.ОтключитьБезопасныйРежим);
    Иначе
    ВнешнийОтчет = ВнешниеОтчеты.Создать(ИмяФайла, Не ВнешняяОбработкаСсылка.ОтключитьБезопасныйРежим);
    Форма = ВнешнийОтчет.ПолучитьФорму();
    Если Форма <> Неопределено Тогда
    Форма.Открыть();
    КонецЕсли;
    КонецЕсли;
    
    КонецЕсли;
    
    КонецПроцедуры
    
    

    Показать

    Но наверное это было сложно сделать.

    P.S. Нет возможности заглянуть в синтакс-помощник, зато есть время такое публиковать.

    Reply
  13. lonlilokli

    (14) karpik666, Ты добрый малый! А если не секрет что тебя так задевает? Ну опубликовал такую фигню. Тебе от этого плохо? Или я тебе чем-то помешал. Вообще не слишком ли много чести,зачем ты потратил стока своего драгоценного времени?

    Reply
  14. lonlilokli

    (14) karpik666, А собственно. Вопрос все равно остался. Пусть обработка или отчет есть в конфе. У отчета есть n-ное количество пользовательских настроек. Нужно программно вызывать все эти настройки, и формировать отчеты.

    Reply
  15. h00k

    (8) Вот я не понимаю, отчет ведь для какой-то конфигурации, правильно?

    Неужели в этой конфигурации нет ни одного объекта/ формы сохраняющего свои настройки?!

    Поищите в этой конфигурации либо в синтаксис помощнике

    ХранилищеОбщихНастроек.Сохранить
    ХранилищеОбщихНастроек.Загрузить
    

    Метод работает как для объектов в составе конфигурации, так и для внешних отчетов/обработок хранящихся на диске, главное не промахнуться с ключами объекта и настроек.

    П.С.: Ну и незнание некоторых методов — это не повод писать «мусорные статьи» в надежде получить ответ в комментариях, лучше просто задать вопрос на форуме…

    Reply
  16. karpik666

    (16) Извини, если мои комментарии были грубые, но меня задевает, что нет премодерации по содержанию, а только по оформление, что инфостарт уже какая-то свалка, чтобы найти что-то стоящее нужно часами копаться. И в данном случае твоя статья не содержит в себе ничего, с таким же успехом можно было справку из синтакс-помощника здесь разместить. А хотелось бы, чтобы инфостарт был похож на хабр, какой он сейчас, где каждая статья содержит в себе ценность.

    Reply
  17. karpik666

    (16) в типовых конфигурациях на обычных формах есть регистр сведений «сохраненные настройки», если отчет был сделан на универсальном отчете, то настройки попадают туда, чтобы посмотреть как эти настройки загружаются из этого регистра нужно открыть «универсальный отчет» модуль объекта процедура «восстановить настройки». Если на скд, то настройки попадают в «хранилище общих настроек», но тут я не смогу подсказать, потому как сам не знаю.

    Reply
  18. h00k

    (19) karpik666,

    то настройки попадают в «хранилище общих настроек», но тут я не смогу подсказать, потому как сам не знаю.

    В (17) я показал «как они туда попадают», остается только посмотреть в синтаксис помощнике методы объекта ХранилищеОбщихНастроек и воспользоваться ими…

    Reply
  19. vasyak319

    (15) удали фигню. Это проще и правильнее, чем фигню публиковать.

    Reply
  20. lonlilokli

    (21) vasyak319, А все-таки не такая уж и фигня, как кажется, если в поисковиках на первом месте и 100 просмотров.

    Reply
  21. vasyak319

    (22) у блюющего котёнка на ТыТрубе вообще 15 миллионов просмотров. И что?

    Reply
  22. lonlilokli

    (23) vasyak319, о эко тебя, но ты то, что здесь искал если не секрет. Еще поражает столь сильное Ваше внимание к столь не нужной теме. А может ты просто так зарабатываешь:) тогда ок!

    Reply
  23. apostal86

    А теперь еще сделаем одну обработку для открытия описанной в публикации обработки с тем же кодом и так далее — по циклу… бесконечно. Похоже, что автор просто хотел поделиться наработкой.

    Reply
  24. lonlilokli

    (25) apostal86, ну да именно так запускаем обработку и выполняем отчеты. Для Вас задачка я так понимаю простенькая. Может подскажите как выполнять отчет для n-ного количества сотрудников, соответственно каждому с его настройкой и отправлять на мыло?

    Reply
  25. h00k

    (26)

    Для Вас задачка я так понимаю простенькая.

    Эта задачка для любого «простенькая». Или начните пользоваться головой по назначению или наймите программиста.

    Reply
  26. lonlilokli

    короче, у вас есть решение хотите продать? Или я у Вас хлеб отнимаю, от того такая неприязнь? Чем Вам я конкретно мешаю? Может Вы хотите чтобы я оценил Ваши публикации? Ну так прямо бы и сказали. Каждый конечно выживает по своему.

    Reply
  27. vasyak319

    (28)

    от того такая неприязнь? Чем Вам я конкретно мешаю?

    Вам уже отвечали на этот вопрос. Вы загаживаете сайт нашего сообщества мусором, плюс начинаете юродствовать, когда вам на это указывают, отсюда и отношение.

    Reply
  28. lonlilokli

    (29) vasyak319, Дорогой мой человек! Спасибо за столь внимательное отношение к теме. Но наверно есть более простые способы удалять не нужные публикации. Вы являетесь модератором? Просто удалите её. Или может если не являетесь, то обратитесь к модератору и он удалит. Может быть есть публикация и я повторил её, укажите это модератору. А Вы настолько уверены в себе, что можете утверждать, что Ваши публикации ничего не засоряют? Или может у Вас их нет? Не знаю, что Вы имеете ввиду говоря «юродствовать» , объяснитесь. Но на самом деле не допускаете ли мысли, что это и есть тот случай?

    Reply

Leave a Comment

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