[Обмен Данными] Правила обмена между 1С:Бухгалтерия Предприятия 3.0 (3.0.48.19, 3.0.52.40, 3.0.61.47, 3.0.64.54, 3.0.66.70, 3.0.67.54, 3.0.68.61, 3.0.71.89, 3.0.74.63) для переноса в другую базу БП 3.0




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

    Доброго дня! Для 3.0.54.20 правила можно настроить?

    Reply
  2. MSK_Step

    (1)

    Доброго дня! Для 3.0.54.20 правила можно настроить?

    Добрый день. Можно, вы по этим пробовали? ошибки были?

    Reply
  3. child1983

    да на 54.20 были ошибки

    Reply
  4. MaxS

    Нужно всеми видами документов обмениваться или нет? Типового обмена недостаточно?

    Reply
  5. MSK_Step

    (4)Можно не всеми,

    (4)

    Типового обмена недостаточно?

    А это какой типовой?

    Reply
  6. MaxS

    (5) Если разовый обмен, то обработкой выгрузка загрузка enterprisedata — есть в БП.

    Если регулярный, настроить обмен через универсальный формат — Другая программа.

    Reply
  7. MSK_Step

    (6)каждая задача имеет свое решение, ваше решение не подходит. если надо сравнивать Контрагентов по ИНН,КПП, предусмотреть поиск договоров, предопределенных значений и т.д. Придется также править правила обмена.

    Тут решается перенос из одной базы в другую документов по организации, + справочники, которые в этих документах.

    Как вы будете переносить регламентные операции, ручные операции через enterprisedata ? По моему ваш комментарий «только ради комментария»

    Правила через КД2.0 имеют недостаток, описанный в комментарии [1], что если изменены метаданные после обновления, могут быть ошибки, тогда тоже надо править. остается только основа.

    Я пробовал разные обработки, на больших объемах самые стабильные оказалось делать через КД 2.0.

    Reply
  8. MaxS

    (7) Это не моё решение. Это функционал 1С. ))

    Выше было моё предложение. Ну не подходит если нужны такие условия и ладно. Пусть будет КД2.

    Просто в заголовке указано 3.0.48.19 — это более полугода назад. Текущая версия 3.0.54.20. Поэтому нужно как-то решать вопрос с обменом. ))

    Reply
  9. MSK_Step

    (8)

    3.0.54.20

    Версию обновили.

    Reply
  10. MSK_Step

    (1)Правила обновили

    Reply
  11. MaxS

    (9) Только почему-то 52.40, а сейчас на дворе 55.16. 😉

    Reply
  12. MSK_Step

    (11)Замечу, что ED так же старых форматов перестал поддерживаться в новой БП 3.0, хотя обещали что такого не будет и форматы будут подерживаться 😉

    А правила на новую 55.16 могут не отличаться. Проверим, если будут то пару реквизитов не проблема обновить

    Reply
  13. Upiterus

    При выгрузке данных, выбрана только Документы.Операциябух выдает:

    Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7796)}: Поле объекта не обнаружено (НаборыЗначенийДоступа)

    Подскажите, пожалуйста, куда копать?

    конфа и обработка для 3.0.54.20

    Reply
  14. MSK_Step

    (13)Исправил. Если самим в блокноте переименовать надо в УдалитьНаборыЗначенийДоступа или просто удалить блок с табличной частью НаборыЗначенийДоступа

    Reply
  15. LadyDy

    Вопрос снят

    Reply
  16. MSK_Step

    (15)оперативно)

    Reply
  17. razmochaev

    (12) С последней БП 3.0 работает по-прежнему.

    Reply
  18. pvb2003

    А где обработка обмена — в комплекте нет …

    Reply
  19. user705522_constantin_h

    (18)Наверное: Все функции->Обработки->Универсальный обмен данными в формате XML

    Reply
  20. MSK_Step

    (18)

    в комплек

    вот, ихз комлпекта ее пришлось убрать по правилам infostart

    Reply
  21. tarasoff

    Можно доработать правила для версии 3.0.60.50.

    На текущих правилах возникают ошибки.

    Reply
  22. MSK_Step

    (21)можно, пишите в л/с. У вас стандартные виды субконта и аналитика на счетах?

    Reply
  23. holemm

    Добрый день!

    А можете для БП 3.0.64.54 доработать? Готов Вас даже проспонсировать немного…) Просто срочно нужно… Или подскажите коротенько как самому поправить: я так понимаю в Конвертации вер 2. их надо править?

    Reply
  24. razmochaev

    (23) Если владеете КД 2.1, то нужно через обработку MD83Exp выгрузить метаданные конфигураций, обновить элементы справочника «Конфигурации» в КД 2.1, после этого донастроить правила. Там часть объектов получило приставку «удалить», и появились новые объекты по ЕГАИС и ВЕТИС.

    Reply
  25. MSK_Step

    (23) Так то в 24 сообщение все правильно написали, у вас какая ошибка? может я так подравлю и вам пришлю?

    Reply
  26. MSK_Step

    Правила обмена между 1С:Бухгалтерия Предприятия 3.0 (3.0.67.54)

    Reply
  27. MSK_Step

    Правила обмена между 1С:Бухгалтерия Предприятия 3.0 (3.0.71.89)

    Reply
  28. MSK_Step

    Правила обмена между 1С:Бухгалтерия Предприятия 3.0 (3.0.74.63

    Reply

Leave a Comment

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