Регистры и регистраторы




Принцип обмена данными из 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. wguki@yandex.ru

    Простенькая такая, приятненькая обработочка 🙂

    Reply
  2. n0ther

    {Форма.Форма(291)}: Ошибка при вызове метода контекста (Содержит): Несоответствие типов (параметр номер ‘1’)

    Если ТекущийДокумент.Движения.Содержит(ТекущийРегистр) Тогда

    по причине:

    Несоответствие типов (параметр номер ‘1’)

    Reply
  3. YVolohov

    (2) Я бы исправил, но не могу смоделировать ситуацию возникновения ошибки. Тестировал на нескольких конфигурациях, работает нормально.

    Reply
  4. maloi_a

    «Отметка по подсистемам» не учитывает объекты, включаемые во все подсистемы — их просто пропускает, а по подмножеству подсистем выбирает. Логика должна быть наоборот, если выбираются все подсистемы.

    Reply
  5. Serjik78

    {Форма.Форма(291)}: Ошибка при вызове метода контекста (Содержит): Несоответствие типов (параметр номер ‘1’)

    Если ТекущийДокумент.Движения.Содержит(ТекущийРегистр) Тогда

    по причине:

    Несоответствие типов (параметр номер ‘1’)

    Посмотрел модуль, исправил строчку следующим образом: Если ТекущийРегистр <> Неопределено И ТекущийДокумент.Движения.Содержит(ТекущийРегистр) Тогда

    Заработало 😉

    Reply
  6. Serjik78

    Мня, на другой конфигурации выдало следующую ошибку:

    {Форма.Форма(331)}: Значение не является значением объектного типа (ПолноеИмя)

    ВидРегистра = СтрЗаменить(МдТекущийРегистр.ПолноеИмя(),

    В общем надо везде проверки на «Неопределено» понатыкать 🙂

    Reply
  7. YVolohov

    (5) Спасибо за тестирование. Где то возникает ошибка, причем проявляется она не на всех конфигурациях. По обох ошибках видно, что 1с не может найти объект метаданных регистра по его имени и возвращает Неопределено. Причем имя регистра берется из этой же конфигурации, а значит не может быть неправильным. Т.е. объект метаданных должен находится всегда. Если Вас не затруднит, не могли бы Вы сбросить на файлообменник (например zalil.ru) конфигурацию, на которой возникает ошибка (только *.cf без данных).

    (4) Спасибо за подсказку. Я посмотрю что можно сделать и в ближайшее время обновлю обработку.

    Reply
  8. RailMen

    Хорошая идейка. Помогает. Плюс.

    Reply
  9. YVolohov

    (8) Не было ошибок при формировании отчета? А то появилась какая то странная весчь, на одних конфигурациях вылазит на других нет.

    Reply
  10. Ish_2

    Не скачивал. Но идея проста и наглядна.

    Reply
  11. Serjik78

    (7) Конфигурацию скинуть не могу, меня расстреляют за разглашение коммерческой тайны. Это факт, я не шучу.

    Просто нужна проверка на Неопределено.

    Reply
  12. stasyan

    (11) У меня такая же ошибка. Конфигурация на базе торговли 10.2.

    Reply
  13. YVolohov

    (11) Ну да ладно, нельзя так нельзя. Просто я сейчас далеко от дома и под руками как на зло только каркасная конфигурация для сдачи спеца, да еще несколько небольших самописных. А на них выполняется все без ошибок. Что касается проверки на Неопределено, то это сделать нетрудно. Но дело в том, что по логике Неопределено не должно возникать.

    Наверное я все таки вставлю эти проверки и обновлю файл, а попозже найду причину возникновения ошибок.

    Reply
  14. YVolohov

    (11) (12 )У меня кстати возникло одно предположение насчет природы этой ошибки. Подскажите пожалуйста, встречаеться ли в в именах регистров в тех конфигурациях на которых возникает ошибка символ подчеркивания «_».

    Reply
  15. YVolohov

    (11) (12) Причина ошибки найдена. Заменил файл. Сейчас все должно работать корректно.

    Reply
  16. vladG71

    Спасибо. Как раз пригодится при изучении новой конфигурации. Плюс

    Reply
  17. ALev

    Желательно добавить возможность вывода результатов в файл.

    Reply
  18. YVolohov

    (17) Файл какого формата? Если таблица xml то такая возможность заложена в платформе. Нужно щелкнруть мышью на любой ячейке отчета затем выбрать в меню 1с: «Файл» -> «Сохранить как».

    Reply
  19. YVolohov

    (18) xml = mxl

    Reply
  20. klen_2007

    Спасибо! Просто-ясно-удобно и СВОБОДНО!

    Reply
  21. JIGIT

    Спасибо, удобная…запустилась на дописанной УПП 😉

    Однозначно плюс 😉

    Reply
  22. sjk56

    Приятная штучка

    Reply
  23. annak2980

    Обработка полезная, идеально работает на типовых и измененных украинских БУ 81. Видны движения, особенно когда дорабатывали до тебя и бухгалтер не помнит, что и для чего заказывал, но нужно научить его этими «полезными доработками» пользоваться.

    Однако на УТП 81 для Украины возникла проблема с интерфейсом

    обработки — окно с перечнем регистров не двигается вправо. Видна только первая колонка «Всего регистров».

    Очень жаль, т.к. мне конкретно сегодня нужно было подготовить для

    клиентов памятку, какие док-ты двигают регистр накопл. «затраты» в УТП.

    Reply
  24. annak2980

    С интерфейсом на УТП украинской можно не заморачиваться,

    хоть в обработке не посмотреть, в Exel Ваша матрица отлично сохраняется.

    Спасибо.

    Reply
  25. YVolohov

    (23) Спасибо за поддержку. Обработка написана таким образом, что должна работать во всех конфигурациях предприятия 8.1, независимо от того, типовые они, или самописные.

    (24) Что касается украинского УТП, то здесь причина ошибки непонятна, нужно увидеть своими глазами. Попробуйте воспользоватся полосой прокрутки под полем отчета, может подействует.

    Reply
  26. annak2980

    (25) про воспользоваться прокрутки восприму как шутку 😀

    Она как раз в УТП и не действовала. Могу скриншот кинуть.

    Хотя в БУ и УТорговлей все отлично.

    Но для наших украинских восьмерок, такое даже и не глюк…

    Reply
  27. Bomba1911

    Спасибо. Как раз пригодится при изучении новой конфигурации. Плюс

    Reply
  28. Nelfast

    Ярослав, нет ли интереса доработать обработку под 8.2 ?

    Reply

Leave a Comment

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