Перенос документов и справочников между разными конфигурациями 1С 7.7




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

35 Comments

  1. TrinitronOTV

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

    Reply
  2. v_id
    Этой обработке больше 10 лет, но я продолжаю ее использовать.

    Зачем? Универсаму, наверное, не меньше, однако он на порядок фукциональнее.

    Reply
  3. alexeyburtsev

    Зачем? — хотел посмотреть «unloadtoexcel.zip», сказали, что надо что-то выложить.

    Спасибо за ссылку на Универсам, не знал (или, скорее, уже забыл).

    А если по существу — eximdocs совсем другой.

    Да, он не умеет синхронизацию по реквизитам, да еще подчиненные подчиненным справочники. Но через файл, не через OLE, быстр, прост.

    Вот и выложил, мешает — давайте уберу.

    Reply
  4. Boroda

    Зачем убирать? Новое — хорошо забытое старое. Тоже им порой пользуюсь. В большинстве случаев очень даже неплох и хорошо помогал.

    Reply
  5. okanat

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

    Reply
  6. alexeyburtsev

    (5) okanat, не очень понял вопрос. Если в базе-источнике был документ Выписка №1 от 01.01.01, то в базе-приемнике появится Выписка №1 от 01.01.01, (или может от другой даты, в зависимости от правил уникальности номера документа Выписка). Если такой Выписка №1 уже был, то его содержимое будет заменено.

    Reply
  7. alexeyburtsev

    (1) TrinitronOTV, Согласен, конечно, единицы в типовых торговлях (без кода и наименования) сразу ставят в тупик. Но когда я ее писал, таких торговель еще не было, а потом до «расширения функционала» руки уже не дошли. Рассуждал так — кто захочет — перекодирует)

    Reply
  8. TrinitronOTV
    alexeyburtsev пишет:

    (1) TrinitronOTV, Согласен, конечно, единицы в типовых торговлях (без кода и наименования) сразу ставят в тупик. Но когда я ее писал, таких торговель еще не было, а потом до «расширения функционала» руки уже не дошли. Рассуждал так — кто захочет — перекодирует)

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

    Reply
  9. PBL

    Спасибо хоть и за «старую» обработку. Очень нужна была

    Reply
  10. dicwork

    Перенос документов производится через текстовый файл? И, если я правильно понял комментарии, если документа с таким номером не было в базе, то он добавляется, а если был заменяется?

    Reply
  11. alexeyburtsev

    (10) dicwork, 1) через текстовый или dbf. dbf по идее для больших объемов лучше, но получается ограничение на длину реквизита. 2) Да, правильно.

    Reply
  12. YuriFm

    Спасибо, нужная вещь!

    Reply
  13. dicwork

    Я хотел уточнить. Если в документе имеется ссылка на какие-то справочники, то выгружаются и загружаются и все эти справочники? Как мне сделать, чтобы из базы в базу перенеслись, только документы.

    Reply
  14. vovkakursk

    Очень нужная обработка!

    Reply
  15. lemaxs

    Если в документе имеется ссылка на какие-то справочники, то выгружаются и загружаются и все эти справочники? Как мне сделать, чтобы из базы в базу перенеслись, только документы. Тот же вопрос.

    Reply
  16. alexeyburtsev

    (13) dicwork, для выгрузки есть галка «Рекурс», от слова рекурсивно. Если она стоит, то выгружаются и элементы справочников, необходимые для заполнения документа. Если галку не ставим, выгружаются только коды-наименования справочников, тогда в базе-приемнике, если там таких нет, в загруженных документах будут пустые поля.

    Reply
  17. alexeyburtsev

    (15) lemaxs, Тот же и ответ — можно документы + «все необходимое», можно только документы и будь что будет…

    Reply
  18. ivn75

    А что будет если в справочники контрагентов одновременно в разных базах вносятся новые записи. Каким образом произойдет синхронизация по кодам и наименованиям

    Reply
  19. alexeyburtsev

    (18) ivn75, Это односторонний перенос. Если выгрузили контрагента, он будет создан в другой базе. Если с таким кодом уже был, будет записан «поверх». (Ну или выдаст ошибку, если какой-нибудь конфликт, например, в базе приемнике этот код принадлежит группе).

    Reply
  20. 2112861

    А можно ли переносить документ (отгрузка товаров) из одной базы 1 С 7.? в другую, и как это сделать при помощи данной обработки

    Reply
  21. unao

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

    Reply
  22. alexeyburtsev

    (20) 2112861, скорее всего можно, там есть описание и кнопка «Пример», может они вместе помогут разобраться.

    Reply
  23. alexeyburtsev

    (21) unao, ну если записать число 1,2345 в поле с двумя знаками после запятой, то получится 1,23.

    Reply
  24. LipinAA

    Обработка Весьма полезна, особенно с галочкой «Рекурсивно»

    ivn75 пишет:

    А что будет если в справочники контрагентов одновременно в разных базах вносятся новые записи. Каким образом произойдет синхронизация по кодам и наименованиям

    а для этого лучще использовать распределенные базы.

    Reply
  25. yuri_ochichenko

    ну дык она ж в стандартном наборе обработок для 1С 7.7. есть, какой смысл её выкладывать сюда?

    Reply
  26. alexeyburtsev

    (25) yuri_ochichenko, кто, как называется?

    Reply
  27. klen17

    Я в стандартном наборе вижу Выгрузку и загрузку справочников tranref.ert а для документов — не вижу

    Reply
  28. Alex_vk

    в свое время использовал это

    Универсал 2.7

    очень понравилось

    Reply
  29. Twirus

    Спасибо, пригодиться.

    Reply
  30. lemaxs

    (4) Boroda,

    Цитата»Зачем убирать? Новое — хорошо забытое старое. Тоже им порой пользуюсь. В большинстве случаев очень даже неплох и хорошо помогал.» Присоединяюсь с комменту)))

    Reply
  31. Мать Тереза

    Зачем убирать-кому-то может и пригодиться ,скажет автору спасибо.

    Reply
  32. 2011b11

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

    Reply
  33. dexxxqqq

    Подскажите, пожалуйста. Умеет ли обработка перетаскивать подчиненные справочники? Мне надо перетащить контрагентов из тис в бух, сохранив при этом коды и чтобы как минимум еще инн перетащились (они в ТиСе лежат в справочнике «сторонние юр.лица».

    Reply
  34. alexeyburtsev

    Можно, нельзя подчиненный подчиненному.

    Reply
  35. pavel_pss

    потестим. спасибо

    Reply

Leave a Comment

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