[8.2] Универсальная обработка "Регистрация изменений для обмена" (управляемые формы)




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

37 Comments

  1. Душелов

    В очередной раз понадобилось, а от 1С пока ничего такого нет.

    Сделал свой аналог, который был для 8.1

    Reply
  2. СергейКа

    Пока не качаю, но на заметку беру

    Reply
  3. Reaper_1C

    (1) Зачем людей обманывать? В релизе конвертации 2.1.2.1 все уже давно есть.

    Reply
  4. Душелов

    (3) Точно? Уверены? Под 8.2 на управляемых формах?

    Вы, случаем, сами никого не обманываете?

    Reply
  5. aipnnov

    Надо добавить и удаление регистрации, как в 8.1.

    Reply
  6. Душелов

    (5) А как в 8.1?

    Reply
  7. aipnnov

    (6) Посмотри обработку «ОбработкаРегистрацияИзменненийДляОбмена» типовой конфы УТ, там все есть.

    Reply
  8. Душелов

    (7) Я смотрел. Что именно «Надо добавить и удаление регистрации, как в 8.1.» ?

    По-моему одной произвольной регистрации запросом предостаточно.

    Reply
  9. aipnnov

    (8) У тебя есть удаление всей регистрации, но может надо добавить удаление отдельного элемента регистрации, который не нужен для обмена?

    Я это имел в виду.

    Reply
  10. Душелов

    (9) А, понятно. Сделаю произвольное снятие регистрации 🙂

    Reply
  11. сингер

    Здравствуйте. Извените, я не профи, но довольно с большим опытом самоучки… Обычно у меня не было проблем с выгрузкой/загрузкой данных в 1Сv8.1, но вот, перешла на 8.2 Версия 8.2.10.77 конф. Упр. небольшой фирмой и немогу вообще разобраться.Мне неоходимо выгрузить справочники из УТ (есть на платф. 8.1, и есть уже сконвертированная под 8.2) — неполучается, пишет ошибку: при загрузке номенклатуры — пишет не найден родитель наименования…

    Reply
  12. Душелов

    (11) Этот вопрос лучше задать на форуме. Так быстрее получится.

    Reply
  13. tmh_mazin_p

    чёт не открывается обработка. Со всеми управляемыми формами:)

    Reply
  14. volens-nolens
    Reaper_1C пишет:

    (1) Зачем людей обманывать? В релизе конвертации 2.1.2.1 все уже давно есть.

    Для управляемых форм одинес до сих пор ничего не написал.

    Reply
  15. volens-nolens

    если пытаться зарегистрировать сразу все «Справочники» или «Документы» и т.д. — вылетает ошибка.

    Reply
  16. ikot

    У меня работает на все 100. Спасибо!

    Reply
  17. Поручик

    В модуле формы после строки

    Процедура ПоказатьОбъекты(ИндексСтроки = Неопределено, Уровень = 0)

    добавить

     Если Не ЗначениеЗаполнено(УзелОбмена) Тогда
    Возврат;
    КонецЕсли;
    

    Иначе при выборе вида плана обмена выдаётся ошибка

    {Форма.Форма.Форма(75)}: Ошибка при вызове метода контекста (ВыбратьИзменения)

    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)
    Reply
  18. trumanl

    Спасибо за обработку! Работает только довольно долго..

    Reply
  19. trumanl

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

    В модуле формы строки кода

     Если ИндексСтроки = Неопределено ИЛИ Уровень = 0 Тогда
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);
    Иначе
    ТекСтрока = ДанныеОбмена.НайтиПоИдентификатору(ИндексСтроки);
    Фильтр = Новый Массив;
    Если Уровень = 2 Тогда
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ТекСтрока.Название + «.» + ТекСтрока.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    ИначеЕсли Уровень = 1 Тогда
    Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Стр.Название + «.» + Стр.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    КонецЦикла;
    КонецЕсли;
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1, Фильтр);
    КонецЕсли;

    Показать

    заменить на

     Если ИндексСтроки = Неопределено ИЛИ Уровень = 0 Тогда
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1);
    // очистка
    Для Каждого СтрКонф Из ДанныеОбмена.ПолучитьЭлементы() Цикл
    Для Каждого СтрТип Из СтрКонф.ПолучитьЭлементы() Цикл
    Для Каждого Стр Из СтрТип.ПолучитьЭлементы() Цикл
    Стр.ПолучитьЭлементы().Очистить();
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    Иначе
    ТекСтрока = ДанныеОбмена.НайтиПоИдентификатору(ИндексСтроки);
    Фильтр = Новый Массив;
    Если Уровень = 2 Тогда
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ТекСтрока.Название + «.» + ТекСтрока.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    // очистка
    ТекСтрока.ПолучитьЭлементы().Очистить();
    ИначеЕсли Уровень = 1 Тогда
    Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
    МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(Стр.Название + «.» + Стр.Объект);
    Фильтр.Добавить(МетаданныеОбъекта);
    // очистка
    Стр.ПолучитьЭлементы().Очистить();
    КонецЦикла;
    КонецЕсли;
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, УзелОбмена.НомерОтправленного + 1, Фильтр);
    КонецЕсли;

    Показать

    Reply
  20. Motor24

    Спасибо за обработку

    Reply
  21. CnupT
    trumanl пишет:

    Выявил еще один несущественный баг.
    Поручик пишет:

    В модуле формы после строки ….

    Скажите, внесены ли исправления, указанные коллегами Поручиком и trumanl? Можно ли рекомендовать

    данную обработку конечным пользователям без допиливания?

    Reply
  22. Para_1987

    Номальная обработка, помогла)

    Reply
  23. Izolda

    Классная обработка. Только не работает для снятия с плана обмена конкретного объекта конфигурации.

    Reply
  24. a4a

    С надеждой, что эта обработка выручит в тяжелой борьбе с настройкой обмена из Ут11 БП2.0

    Reply
  25. bobmaxm

    Очень удобно настраивать обмен. Без нее никак не взлетал. Спасибо!!!

    Reply
  26. ogeniv

    Обработке уж два года, а от 1с до сих пор нет внятного аналога. Спасибо большое

    Reply
  27. Поручик

    Сообщество не будет возражать, если выложу модифицированный вариант отдельной публикацией? Кроме исправления указанных багов, добавил изменение номеров сообщений.

    Reply
  28. Поручик

    + Добавлена возможность для регистрации обработки в справочнике «Дополнительные обработки» для конфигураций на БСП.

    Reply
  29. SANILLA

    (28) Поручик, конечно выкладывай, посмотрим 🙂

    Reply
  30. SANILLA

    (19) trumanl, да действительно очень долго выполняет …

    щас исправлю этот баг

    Reply
  31. Поручик

    (30) Уже год как выложено и развилось в самостоятельную работу с добавленными фичами. Луркайте поиск

    Reply
  32. SANILLA

    (32) Поручик, понял, спасибо большое, щас найду.

    Reply
  33. Поручик

    (30) Если разуть глаза, то ссылка есть прямо в описании.

    Reply
  34. SANILLA

    (33) Поручик, да вижу, благодарю.

    Reply
  35. webdimon

    Спасибо за обработку.

    Reply
  36. Katarina_Proza

    Скачала Проверяю

    Reply
  37. AndrewVVS

    При переходе на платформу 8.3.5 столкнулся с тем, что перестали выгружаться базы через выгрузку в .dt. Нашел на форумах, что дело может быть в планах обмена, если они есть,то их нужно почистить (удалить) регистрацию + предлагаются самописные обработки :). Я так понимаю, что для удаления регистрации подойдет типовая обработка «ОбработкаРегистрацияИзменненийДляОбмена» конфигураций на обычных формах УТ 10.3, ЗУП 2.5, БП 2.0. Пишу здесь, возможно кому информация пригодится…

    Reply

Leave a Comment

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