Экспорт данных из 1С (Универсальная обработка)




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

47 Comments

  1. mobile742

    Пока не проверял но описано многообещающе.

    Reply
  2. egles

    попробовал из ТИСа выгрузить документы — облом не выгружает ошибка говорит

    Reply
  3. neoo

    Спасибо, за обработку. очень помогла при переносе из одной базы 1С в другую документов за определенный период.

    Reply
  4. Viking

    Супер !!! выгружает все !!!

    Reply
  5. Genchik

    ООООГромнейший респект!!!!

    Reply
  6. Эдуард

    Пока не смотрел, но нужна

    Reply
  7. gidro

    Спасибо за обработку! только у меня после загрузки оборот приемника получился больше, чем оборот источника. Чем это вызвано? и ещё в обработке импорта нету опции «Восстанавливать последовательности документов», хотя в описании она есть. Подскажите, пожалуйста, где можно скачать import77.ert c этой нужной опцией?

    Reply
  8. volk

    Отличная обработка! Раньше постоянно использовал ExImDocs( спасибо Ankey), так как ничего путёвого не находил кроме неё, чтобы осуществлялась рекурсивная выгрузка-загрузка справочников. Но эта — ни в чём не уступает! По времени обработки данных сравнить не успел с ExImDocs, но в любом случае доволен результатом! Спасибо!

    Reply
  9. volk

    Хорошо-бы объединить Импорт и Экспорт в одну обработку, хотя это можно и самому сделать… Но всё-же! С наступающими всех!

    Reply
  10. vasilykushnir

    >Отличная обработка! Раньше постоянно использовал ExImDocs( спасибо Ankey), так как ничего путёвого не находил кроме неё, чтобы осуществлялась рекурсивная выгрузка-загрузка справочников. Но эта — ни в чём не уступает! По времени обработки данных сравнить не успел с ExImDocs, но в любом случае доволен результатом! Спасибо!

    Дай ссылку на ExImDocs, коль упоминаешь ее. И еще ExImDocs наверняка выгрузка и загрузка в одном стакане, а это весьма важно.

    Reply
  11. isaveliev
  12. Blackbytes

    Спасиба можно забросить свою недописанную и маленько отдохнуть!!

    Reply
  13. Irk

    Это просто жесть, очень удобно, просто и доступно. Спасибо!

    Reply
  14. Karina

    плиз, подскажите как импортировать данные

    Reply
  15. dimon777

    Пока не успел посмотреть но вещь полезная

    Reply
  16. vasilykushnir

    (16) Можешь не сомневатся — уже проверил.

    Reply
  17. UncleVader

    Может я че не понял…

    У меня при первой попытке выгрузки одного документа сразу вылетел баг

    Проводки=?(Объект.Вид()=Метаданные.ДокументОперации.Идентификатор, 1, 0);

    {D:EXPORT77.ERT(453)}: Поле агрегатного объекта не обнаружено (Идентификатор)

    Я так понимаю идет попытка обратиться к объекту бух.итогов. Но у меня нет этой компоненты, у меня только регистры в конфе….

    Reply
  18. mvntula

    В ТиС 941 при выгрузке документов сразу вываливается:

    Проводки=?(Объект.Вид()=Метаданные.ДокументОперации.Идентификатор, 1, 0);

    {D:…EXPORT77.ERT(453)}: Поле агрегатного объекта не обнаружено идентификатор)

    Если… убрать из текста в стр.453, и в след. строке поставить ставишь «0» в «проводках», то из ТиС д-ты выгружает

    Reply
  19. UncleVader

    Не, ну что где поправить, это понятно, гнлавное чтобы автор намотал на ус 😉

    Reply
  20. Sol

    UncleVader, какой афтор? По описанию, названию и даже по ошибке — это обработки с диска ИТС.

    И ведь нигде это не сказано. Особенно подпись в конце описания нравится.

    Reply
  21. liwo

    Спасибо!

    Reply
  22. Ferrari

    Спасибо!

    Reply
  23. mmaya1

    подскажите пож-та а возможно ли из Бухгалтерии 7 выгружать товарные наклвдные и с/ фактуры в бухгалтерию 8.

    заранее спасибо за ответ

    Reply
  24. manitu

    спаисбо

    Reply
  25. Rebel2007

    Спасибо.

    Использовал обработки для объединения двух БД.

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

    Reply
  26. slash26

    Товарищи! Подскажите, как бы исключить выгрузку документов-оснований ?

    а то они полюбому включаются в выгрузку вместе с выбранными..

    искал искал.. глаза чуть не сломал!

    Хелп!

    Reply
  27. slash26

    а усе! разобрался

    Reply
  28. Seon

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

    Еще неплохобы иметь возможность выгружать по условиям…

    Reply
  29. Seon

    При выгрузке неплохо бы формирвоать таблицу с ходом выгрузки а не валить все сообщениями.

    И показывать эту таблицу, по окончании либо при ошибках через исключение…

    Reply
  30. Seon

    При выгрузке подчиненных справочников надо сообщать владельцев.

    У меня выгружаются единицы измерения. Подчинены Товарам. Почти у всех товаров единица измерения КГ.

    вот что видно в сообщениях:

    Выгружен объект: Справочник.ЕдиницыИзмерения кг

    Выгружен объект: Справочник.ЕдиницыИзмерения кг

    Выгружен объект: Справочник.ЕдиницыИзмерения кг

    Reply
  31. Seon

    Я чето не понял…

    А периодические данные чтоли не выгружаются? :О

    Reply
  32. Seon

    В конце надо хотябы знать сколько всего объектов выгружено…

    Reply
  33. Seon

    Тут надо чуть подправить чтобы нормально везде работало…

    Процедура ВыгрузитьОбъектСпособом(Объект, Способ, Ссылка)

    Если Способ=»Константы» Тогда

    ВыгрузитьКонстанты();

    ИначеЕсли Способ=»Справочник» Тогда

    ВыгрузитьСправочник(Объект, Ссылка);

    ИначеЕсли Способ=»Документ» Тогда

    Попытка

    Проводки = ?(Объект.Вид()=Метаданные.ДокументОперации.Идентификатор, 1, 0);

    Исключение

    Проводки = 0;

    КонецПопытки;

    ВыгрузитьДокумент(Объект, Ссылка, Проводки);

    Иначе

    Сообщить(«ВыгрузитьОбъектСпособом(): неверный Способ «+Способ);

    КонецЕсли;

    КонецПроцедуры // ВыгрузитьОбъектСпособом()

    Reply
  34. Seon

    Поиск=?((МетаДокумент.КонтрольУникальности=1) и (МетаДокумент.ПериодичностьНомера=»Все»), «», «?»);

    {\EXTFORMSEXPORT77.ERT(365)}: Поле агрегатного объекта не обнаружено (КонтрольУникальности)

    Reply
  35. Lara Croft

    покп не смотрела,но такую долго искала))спасибо

    Reply
  36. O-Planet

    (36) Анжелина? Это Вы? 0_о

    Reply
  37. Volyana

    Всё нормально выгрузилось. Потом с помощью Импорта загрузилось в базу с другой конфигурацией.

    Теперь о 2х2=4, которое нигде не упоминается. Файл обработки открывается в монопольном режиме программы: Файл > Открыть > (выбрать Export77.ert).

    Reply
  38. zedo

    Стандартная обработка с диска ИТС

    Reply
  39. Рыжая

    А где взять импорт , выложен только экспорт, или я чего то не доганяю

    Reply
  40. Len4

    Объект.Записать();

    {C:путь к файлуIMPORT77.ERT(167)}: Код не уникальный! — это что это такое при загрузке выскакивает ??? и загрузки нет???

    Reply
  41. Buhgalter

    Выгружаются и загружаются документы и сами справочники нормально.

    А как быть с историей? 😮

    ОСы выгружал… так с ОСами выгрузился первый ОСодержатель.

    Reply
  42. validat

    Спасибо за обработку. Буду пробовать.

    Reply
  43. Twirus

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

    Reply
  44. Lyuba-Lyuba

    Полезная штука! Обязательно попробую.

    Reply
  45. nvilku

    а из зарплаты и кадры корректно документы выгружаются? а то у меня ошибки выдает, не хочет выгружать

    Reply
  46. Мать Тереза
    Reply
  47. Мать Тереза

    Извините ,случайно полностью скопировала ,вот сам кусочек проблемы:

    Записан объект: Документ.РеализацияРозница Реализация (розница) мг00003534 (28.03.12)

    Записан объект: Справочник.Проекты Кочанов

    Отменено удаление объекта: Справочник.Проекты Стройка

    Записан объект: Справочник.Проекты Стройка

    Объект.Записать();

    {C:DOCUMENTS AND SETTINGSРАБОЧИЕ БАЗЫРЕВИЗИЯEXTFORMSIMPORT77.ERT(167)}: Код не уникальный!

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

    Reply

Leave a Comment

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