Выборочная регистрация справочников и документов в плане обмена




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

23 Comments

  1. crystaleye

    а чем она лучше той, которая на ИТС?

    Reply
  2. oberonm

    а регистрация движений документа?

    Reply
  3. tomvlad

    (1) О какой именно обработке из универсальных на диске ИТС идет речь?

    * Настройка технологического журнала

    * Конвертация внешних обработок

    * Консоль системы компоновки данных (управляемое приложение)

    * Свертка информационной базы

    * Выгрузка данных в реляционные структуры

    * Загрузка данных из табличного документа

    * Изменение конфиденциальной информации

    * Консоль запросов

    * Поиск и замена значений

    * Раскрашивание кода

    * Универсальные подбор и обработка объектов

    * Форматирование текста

    * Полнотекстовый поиск в данных

    * Консоль заданий (Новый раздел!)

    (2) Для меня регистрация движений документов не актуальна, т.к. РИБ не использую. Если необходимо можете сами дописать данный функционал, тем более что по времени это займет не более 5 минут.

    Reply
  4. almas

    http://infostart.ru/public/21540/ — аналогично Вам понравится.

    >а чем она лучше той, которая на ИТС?, — на сарае … , а там дрова лежат.

    молодец.

    Reply
  5. crystaleye

    (3) действительно, почему то в универсальных обработках на диске ИТС уже отсутствует обработка, позволяющая управлять регистирацией объектов к обмену…странно…

    я до сих пор пользуюсь ей, брал именно с ИТС года 2 назад.

    Reply
  6. gaglo

    (5) … не потому ли, что обработка сия включена в состав «Конвертации данных»?

    Reply
  7. arteast

    Я использовал вариант отсюда с некими своими доработками. Очень помог.

    Но и этот имеет право на жизнь)

    Reply
  8. Istur

    При открытии твоей обработки в УТ 10.3.7.8 Выдает ошибку:

    «{Форма.Форма(223)}: Ошибка при установке значения атрибута контекста (Текст): {(43, 2)}: Неоднозначное поле «ВидОбъекта.Ссылка»

    <<?>>ВидОбъекта.Ссылка КАК Ссылка

    Построитель.Текст = «ВЫБРАТЬ ВложенныйЗапрос.Ссылка ИЗ (» + ТекстЗапроса + «) КАК ВложенныйЗапрос»;

    по причине:

    {(43, 2)}: Неоднозначное поле «ВидОбъекта.Ссылка»

    <<?>>ВидОбъекта.Ссылка КАК Ссылка»

    Reply
  9. tomvlad

    (8) Исправил

    Reply
  10. Istur

    (0) Ты не мог бы добавить свою обработку также в раздел «Каталог → УПРАВЛЕНИЕ ДАННЫМИ, ОБРАБОТКА → Обмен данными»? (Дополнительный раздел) Я по нему искал..

    А вообще — отличная разработка у тебя. Она универсальная, моя просто под конкретные задачи, твоя же более широкая, из-за этого лично для меня она менее удобна, но если бы нашел ее, то конечно свою бы не создавал))

    Reply
  11. v1n1
    {ВнешняяОбработка.ВыборочнаяРегистрацияОбъектовДляОбмена(23)}: Ошибка при вызове метода контекста (Выполнить): {(6, 2)}: Неоднозначное поле «Кассы.Ссылка»

    <<?>>Кассы.Ссылка <> &ЭтотУзел

    Результат = Запрос.Выполнить();

    по причине:

    {(6, 2)}: Неоднозначное поле «Кассы.Ссылка»

    <<?>>Кассы.Ссылка <> &ЭтотУзел

    Reply
  12. tiniji

    Обработка хорошая. Но нужно сделать транзакции по количеству объектов, чтобы можно было ввести количество объектов в одной транзакции. Если запустить эту обработку сейчас, остальные пользователи будут простаивать с блокировками.

    Reply
  13. drkhaired

    Если выбрать все документы и попытаться отобрать из например за пол года (УПП) то возникает ошибка переполнения sql таблиц в запросе (>256), а так обработка полезная.

    Reply
  14. nika14

    Обработка полезная, спасибо автору

    Reply
  15. zavyzka

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

    Reply
  16. AzzZ

    (1) crystaleye,

    drkhaired пишет:

    Если выбрать все документы и попытаться отобрать из например за пол года (УПП) то возникает ошибка переполнения sql таблиц в запросе (>256), а так обработка полезная.

    Собственно вопрос а как можно это дело обойти?

    За обработку плюс, спасибо.

    Reply
  17. dymkis

    Хотел сделать регистрацию договоров контрагентов с отбором по владельцу (контрагенту). Не получается. Отбор: Ссылка.владелец.Код — выставляю — отбираю — перехожу в окно отобранных элементов. Там все договора, что есть в базе — отбор не сработал. Возвращаюсь на главную страницу — строка с отбором исчезает — отбор пустой.

    Тестировалась на УТ для Украины.

    Reply
  18. a_a

    очень неплохая обработка, но остается очень большой полигон для доработки и творчества

    Reply
  19. ak0710

    Thanks, очень помогла как раз были расхождения в доках в голове и дочке

    Reply
  20. Necytij

    Спасибо большое. Быстрый отбор внизу формы очень приятная вещь. Потому что каждый раз формировать запрос и задавать параметры бывает очень муторно, если нужно зарегистрировать, например, несколько видов документов из определенного временного промежутка и конкретным контрагентом… Не хватает, пожалуй, метода регистрации «ТОЛЬКО движения документов».

    Reply
  21. koliaff

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

    Пусть у нас есть база «1» и база «2»

    Так вот, если в базе «1» создали документ, потом перегрузили его в базу «2», затем в базе «1» этот документ пометили на удаление и удалили. А потом за этот период сделали в «1» базе «отмену регистрации изменений» для документов, то удаленный документ все равно остается в очереди на выгрузку, т.е. удалится и во «2» базе после обмена. А это не есть гуд.

    Reply
  22. tiger_x

    Для любой конфигурации подходит?

    Reply
  23. fomix

    Работает. Свое название оправдывает на все 100%

    Reply

Leave a Comment

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