Контроль регистра сведений "Соответствие объектов информационных баз"




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

14 Comments

  1. rasdag

    Выдает ошибку, если уникальный идентификатор источника пустой:

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

    НЗ.Записать();

    по причине:

    Ошибка при выполнении обработчика — ‘ПередЗаписью’

    по причине:

    {РегистрСведений.СоответствияОбъектовИнформационныхБаз.МодульНабораЗаписей(20)}: Значение не является значением объектного типа (УникальныйИдентификатор)

    ЭтотОбъект[0][«УникальныйИдентификаторИсточникаСтрокой»] = Строка(ЭтотОбъект[0][«УникальныйИдентификаторИсточника»].УникальныйИдентификатор());

    Reply
  2. rasdag

    Решилось удалением таких строк, где уникальный идентификатор источника был пустой, вручную

    Reply
  3. Buхter

    В обработке нет особой защиты.

    Буду дорабатывать, обязательно учту данную проблему.

    Спасибо за информацию!

    Reply
  4. egvv

    Что-то не могу открыть обработку в Управлении Торговлей 10,3 (10,3,34,2) 1С пред. 8,3,7,1873. Загрузить загрузил, но не открывается мигает экран и все. В чем может быть проблема? Не подскажите?

    Reply
  5. Buхter

    Обработка сделана для управляемых форм. Чтобы заработала в обычном режиме, именно так и запускается Торговля 10.3, необходимо либо добавить обработку в конфигурацию, либо запустить программу в режиме управляемых форм.

    Если гугл не поможет это сделать, пишите в личку.

    Reply
  6. Tangram

    Добрый день!

    Попробовал вашей обработкой решить такую проблему:

    Был обмен УТ 10.3 -> БП2, перешли на БП3. Базы типовые, обновление прошло штатно.

    После этого в БП3 при обмене начали появляться карточки <Объект не найден>.

    Сначала нашел вашу обработку, она удалила несколько тысяч неверных записей в БП3 и чучуть в УТ10.3. Не помогло.

    Потом увидел что я не запустил типовую обработку конвертации обменов с 2.0.

    Загрузил ей регистр «Соответствие объектов инф. баз» в УТ 10.3. Не помогло.

    Снова почистил регистры вашей обработкой. 70 записей в БП3, 30 записей в УТ 10.3. Обмен по ночам крутится, результат завтра увижу.

    Что я вижу, анализируя «кривые» карточки:

    например есть «Степлер» (Номенклатура), который прилетел в БП3 как <Объект не найден>. Это старая карточка, которая была создана еще во времена обмена с БП2 и залетает в БП3 вместе с документом.

    Так вот, записи про этот Степлер есть в РС «Соответствие объектов для обмена» в обоих базах. но этот РС для обмена с БП2.

    А записей в РС «Соответствие объектов инф. баз» нет ни в одной базе.

    Reply
  7. Buхter

    (6)

    л типовую обработку конвертации обменов с 2.0.

    В УТ Вы перешли на новый план обмена, предназначенный именно для обмена с БП 3.0?

    Reply
  8. Tangram

    (7), конечно да.

    Reply
  9. Buхter

    (8) Объекты, которые прилетают из базы источника в приемник как «Объект не найден», выгружаются на той стороне «по ссылке».

    Значит, на той стороне программа принимает решение, что объект ранее уже выгружался.

    Контроль этого происходит по наличии записи в РС «Соответствия объектов информационных баз». Копайте туда.

    Можно и дебагом пройтись, там нет дико сложных мест для анализа…

    Reply
  10. Tangram

    (9)

    Контроль этого происходит по наличии записи в РС «Соответствия объектов информационных баз». Копайте туда.

    Можно и дебагом пройтись, там нет дико сложных мест для анализа…

    А записи в РС как раз и нет. Спасибо за совет, буду копать.

    Reply
  11. Berserk_02

    (10) Была примерно та же проблема, сделал таким образом: Почистил весь регистр на стороне БП-3, Сделал полную выгрузку справочников и загрузил в бп, позиций примерно тысяч 60. теперь все работает как надо.

    Reply
  12. JohnConnor

    Бухгалтерия предприятия, редакция 3.0 (3.0.70.50)

    При открытии обработки ТЧ не заполняется всеми записями по данному узлу

    Reply
  13. Buхter

    (12) Возможно Вы выбрали не тот узел, в плане обмена.

    Посмотрите регистр «Соответствия объектов информационных баз» на наличие записей по выбранному узлу…

    Reply
  14. Светлый ум

    +1 Взял на вооружение

    Reply

Leave a Comment

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