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




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

34 Comments

  1. Stety

    Осталось скрестить со своей доработанной, которая грузит в страницы докуменктов «Перенос данных» (он же «Корректировка записей регистров») и счастье будет полным.

    Reply
  2. pri_hod

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

    Reply
  3. looxxx

    Почему нет выбора Загрузка в регистр накоплений? Если не сложно, добавьте.

    Reply
  4. looxxx

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

    Reply
  5. looxxx

    (4) документ «Корректировка записей регистров», а не «Корректировка регистров накопления»

    Reply
  6. pri_hod

    будет время постараюсь сделать

    Reply
  7. grigr

    аналогичный проект: http://infostart.ru/projects/5647/

    Загрузка данных из Табличного Документа + загрузка в Движения Документа

    Reply
  8. abora

    Не работает (8.1.14 УТ10.3.8.9) — при записи в документ реализации выдаёт, а если пр проверке были ошибки, то не ставит примечания

    Метод объекта не обнаружен (Записать)

    При добавлении строки 1 возникли ошибки.

    , а если при проверке были ошибки, то не ставит примечания.

    Reply
  9. mr_ivan_nikonov

    Есть ли аналогичная обработка которая позволяет СОЗДАВАТЬ И ГРУППЫ в справочнике тоже???

    Reply
  10. kirillkr

    А как числовые поля копировать?

    Reply
  11. DERL

    при загрузке в справочник, где указывается что тот или иной элемент это группа???

    вообще не понятно как загружать иерархический справочник?

    Reply
  12. Tur_gad

    Хорошая обработка, но мне кажется нужно еще по работать над ней и можно смело просить позолотить ручку.

    Reply
  13. pri_hod

    согласен, но нет времени заниматся

    Reply
  14. Doubl

    Огромное спасибо! Очень помогло. Самим писать времени не было, а тут вовремя попалась) Продолжайте дальше, будем ждать!

    Reply
  15. phen1x

    В УТ 10.3.14.5 8.2 не загружает в справочник номенклатура:

    Метод объекта не обнаружен (Записать)

    Reply
  16. eli1984

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

    Reply
  17. Tur_gad

    Подскажите пожалуйста как используя вашу обработку можно загрузить данный в документ и в табличную часть одновременно? Если не сложно пожалуйста ОЧЕНЬ надо?)

    Reply
  18. pri_hod

    одновременно этой обработкой не получится. Загружайте раздельно.

    Reply
  19. bolush

    Прошу не судит строго, все таки чайник начинающий,

    вообщем у меня ошибка такая вылазит: Для объекта не определена форма по умолчанию

    опишите пожалуйста как устранить ошибку!

    Reply
  20. bolush

    аа ВСЕ НАШЕЛ!

    Reply
  21. baralgin1003

    прикольная обработка)) через нее устарнил падение части товаров на нулевой счет при переходе с 7,7 на 2.0.

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

    Reply
  22. lsa2008

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

    Reply
  23. Fake333

    Доброго времени суток.

    Долго искал программу для импорта данных в 1с из Excel, в итоге нашёл конфигурацию. И почти во всём разобрался, но возникли проблемы с открытием документа Excel. Файл весит 1.9 Мб, при открытии выскакивает ошибка, что невозможно открыть файл

    Reply
  24. pri_hod

    так а в чем вопрос? вы пытаетесь открыть файл ексель через обработку?

    Reply
  25. Ольга_tmp

    Уважаемый, позволяет ли эта обработка добавлять данные в существующие элементы справочника?

    Reply
  26. nw35

    Подскажите пожалуйста, как загрузить в документ табличную часть. Я создал документ, теперь есть его номер, надо используя этот номер добавить табличную часть, при ее выборе в обработке остаются только колонки табличной части(как и в обычной обработке) и некуда привязать номер документа. Ошибка

    {ВнешняяОбработка.ЗагрузкаИзТабличногоДокумента.МодульОбъекта(1085)}: Ошибка при вызове метода контекста (Область)
    ПредыдущееЗначениеПриИзмененииДляНовогоДокумента = СокрЛП(ТабличныйДокумент.Область(«R»+Формат(К,»ЧГ=»)+»C»+Формат(КолонкаПриИзмененииДляНовогоДокумента,»ЧГ=»)).Текст);
    по причине:
    Область не найдена: R2C
    

    Также в настройках есть «Колонка для нового документа», совсем не понятно, что она делает.

    Reply
  27. PovAndy

    Будет ли работать Ваша обработка под 1С 8.2 Розница 2.0?

    Есть ли такая возможность?

    Reply
  28. pri_hod

    думаю будет работать это ж под обычные формы

    Reply
  29. remmers

    Скачал вашу обработку. При настройке колонок выдает ошибку: «Значение не является значением объектного типа (Тип)». Конфигурация 1с 8.2 УНФ 1.4

    Reply
  30. pri_hod

    Естественно, в управляемых формах не работает.

    Reply
  31. stas1kbob

    чет у меня ошибка, говорит с пустым полем «контрагент» не загружает, а я его заполнил, но системе все равно. И колонки пронумеровал вручную. Как бороться?

    Reply
  32. valafan

    (9) (11), Настройка — События… — Перед записью, пишем

    ОтменитьТранзакцию();
    Группа = Справочники.Номенклатура.СоздатьГруппу();
    Группа.Наименование = Объект.Наименование;
    Попытка
    Группа.Записать();
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
    НачатьТранзакцию();
    
    Отказ = Истина;

    Показать

    Reply
  33. Dilshod1977

    (26) Вы решили с ответом? У меня тоже такая ситуация:

    {ВнешняяОбработка.ЗагрузкаИзТабличногоДокумента.МодульОбъекта(1085)}: Ошибка при вызове метода контекста (Область)

    ПредыдущееЗначениеПриИзмененииДляНовогоДокумента = СокрЛП(ТабличныйДокумент.Область(«R»+Формат(К,»ЧГ=»)+»C»+Формат(КолонкаПриИзмененииДляНовогоДокумента,»ЧГ=»)).Текст);

    по причине:

    Область не найдена: R2C

    Reply
  34. bimy22

    (8) С такой же ошибкой падает, нашли решение проблемы?

    Reply

Leave a Comment

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