Загрузка метаданных в КД через COM-соединение 1.08




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

29 Comments

  1. iov

    Заранее плюс

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

    Reply
  2. korefan

    хорошо!

    Reply
  3. Totoro

    (0) Можно. Нужно выбрать существующую конфигурацию. Если установить флаг «добавлять только новые», то будут добавлены только новые объекты, старые изменены не будут. Иначе будут добавлены только отмеченные в метаданных объекты, остальные будут помечены на удаление. Потом доделаю обновления отмеченных в метаданных объектов, без изменения не отмеченных (например, обновить только справочники).

    Reply
  4. iov

    (3) А можно ли обновлять существующие? как пример изменились реквизиты один удалили — другой добавили или поменяли длину или тип реквизита?

    Reply
  5. script

    А из 77 тоже момжно загружать ?

    Reply
  6. Totoro

    1.02

    — Добавлен режим частичного обновления метаданных. Для этого нужно установить флажок «Изменять только выбранные объекты метаданных». Тогда, если свойства имеют тип, не выбранный для загрузки, то будет производиться попытка поиска этого типа в базе (в случае неудачи тип свойства не будет назначен). Удаление не найденных объектов в этом случае тоже будет производиться только для выбранных метаданных.

    Reply
  7. Totoro

    (4) Теперь можно.

    (5) Нет, там другая логика и типизация. Вообще, я 7.7 уже редко пользуюсь. В принципе, если будет достаточно желающих протестировать такую загрузку, то можно попробовать сделать и загрузку из 7.7.

    Reply
  8. Totoro

    1.03

    — При модификации конфигурации сохраняется последняя настройка метаданных для выбранной конфигурации

    Reply
  9. Totoro

    1.04 (пока только для 8.2)

    — оптимизирован алгоритм загрузки

    — возможен выбор загружаемых метаданных вплоть до объекта

    — в режиме обновления тоже возможен выбор метаданных вплоть до объекта

    Reply
  10. Totoro

    1.04

    — добавлена версия для 8.1

    Reply
  11. Totoro

    1.05 (для 8.2)

    — исправлена ошибка чтения лишних данных типов в режиме обновления

    — добавлена поддержка новой КД 2.1.4 (новый тип УникальныйИдентификатор, загрузка состава планов обмена)

    1.04 (для 8.1)

    — исправлена ошибка чтения лишних данных типов в режиме обновления

    Reply
  12. Totoro

    1.06 (для 8.2)

    — исправлена ошибка не обновления представления описания типа свойства, если при обновлении типа свойства изменился только квалификатор типа

    — исправлена ошибка загрузки квалификаторов типа Субконто у регистра бухгалтерии

    — добавлена поддержка загрузки метаданных из конфигураций с установленным вариантом встроенного языка «английский» (стандартная обработка КД этого не делает)

    — на закладке «COM-соединение» добавлена кнопка перерегистрации comctrl.dll (при возникновении ошибки о невозможности создания COMConnector)

    1.04 (для 8.1)

    — исправлена ошибка не обновления представления описания типа свойства, если при обновлении типа свойства изменился только квалификатор типа

    — исправлена ошибка загрузки квалификаторов типа Субконто у регистра бухгалтерии

    — на закладке «COM-соединение» добавлена кнопка перерегистрации comctrl.dll (при возникновении ошибки о невозможности создания COMConnector)

    Reply
  13. Abadonna

    (7)

    А из 77 тоже момжно загружать ?

    (5) Нет, там другая логика и типизация.

    95% случаев, когда я использую КД — это как раз перенос из (непечатные слова) 7.7 в 8.2

    В противном случае мне и перенос через то же OLE сделать проще.

    Reply
  14. Totoro

    (13) Если готов помочь в тестировании такой загрузки, то можно попробовать её сделать. Я сейчас уже и не помню всех тонкостей метаданных в 7.7, только если на типовых тестировать и сравнивать с типовой загрузкой.

    Reply
  15. Abadonna

    (14) Я точно не готов тестировать, аж по двум причинам 😉 :

    1. Мне самому проще написать, чем тестировать

    2. Смысла получения через COM не вижу, если честно

    P.S. А вот свой дремучий (года аж 2001-го) описатель метаданных к 7.7 (ert) могу выслать, там пример работы со всеми объектами метаданных 7.7.

    Reply
  16. Totoro

    (15) Для 7.7. я тоже особого смысла не вижу через COM загружать метаданные, во всяком случае мне это не нужно, а вот для 8 пользуюсь постоянно (мне так удобнее, да и обновить нужно иногда только один реквизит или движения у одного документа).

    ЗЫ Знания лишними не будут, спасибо 😀 Мыло в профиле.

    Reply
  17. Поручик

    (12)

    Пытаюсь выполнить обновление метаданных для УТ 11.0.6.3 на УТ 11.0.6.4.

    {Форма.ЗаполнениеПоМетаданнымДляКД.Форма(206)}: Ошибка при вызове метода контекста (NewObject)
    ОписаниеТипов = мCOMсоединение.NewObject(«ОписаниеТипов», ИмяТипа);
    по причине:
    Произошла исключительная ситуация (V82.COMConnection): Недопустимое значение параметра (параметр номер ‘1’) (ПоследовательностьСсылка.ПроведениеПоРасчетамСКлиентами)
    

    1С:Предприятие 8.2 (8.2.13.205)

    Конвертация данных, редакция 2.1 (2.1.4.1)

    Reply
  18. Totoro

    1.07 (для 8.2)

    — исправлена ошибка (17) возникающая при загрузке состава плана обмена, если он содержит последовательность.

    ЗЫ Стандартная обработка КД 2.1.4 при загрузке состава плана обмена, если он содержит перерасчет или последовательность загружается битые ссылки.

    Reply
  19. Поручик

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

    Reply
  20. artbear

    (19) Да, просто и удобно.

    Reply
  21. zzerro

    За обработку однозначно плюс, только вот попытался догрузить в конфигурацию справочник и получилось следующее:

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

    В объекте не указаны значения: «Объект», «Синоним»

    В свойствах объекта не указан «Тип»

    Может я что сделал не так?

    Reply
  22. zzerro

    Да, видимо действительно что то сделал не так, повторно все удалось, спасибо, очень пригодилась обработка!!!

    Reply
  23. нарчена

    Попробовала выполнить загрузку данных — это то, что нужно! Очень удобно!

    Reply
  24. NataLisa

    Просто спасение, когда используются конфигурации для управляемого приложения. Стандарными пользоваться крайне неудобно.

    А время загрузки (меньше минуты) радует дополнительно.

    Reply
  25. Поручик

    (0) Привет.

    Для использования с платформой 8.3 нет желания пофиксить?

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

    Код
       Если ВерсияПлатформы8 = "V8" Тогда
          ВерсияПлатформыКД = "8.0";
       ИначеЕсли ВерсияПлатформы8 = "V81" Тогда
          ВерсияПлатформыКД = "8.1";
       ИначеЕсли ВерсияПлатформы8 = "V82" Тогда
          ВерсияПлатформыКД = "8.2";
       Иначе
          ВерсияПлатформыКД = "8.3";
       КонецЕсли;

    Показать полностью

    Код
       Если ВерсияПлатформыКД = "8.0" Тогда
          ВерсияПлатформы8 = "V8";
       ИначеЕсли ВерсияПлатформыКД = "8.1" Тогда
          ВерсияПлатформы8 = "V81";
       ИначеЕсли ВерсияПлатформыКД = "8.2" Тогда
          ВерсияПлатформы8 = "V82";
       ИначеЕсли ВерсияПлатформыКД = "8.3" Тогда
          ВерсияПлатформы8 = "V83";
       Иначе
          Если Конфигурация.Приложение = Перечисления.Приложения.УправляемоеПриложение Тогда
             ВерсияПлатформы8 = "V82";
          Иначе
             ВерсияПлатформы8 = "V81";
          КонецЕсли;
       КонецЕсли;

    Показать полностью

    Reply
  26. Totoro

    (25) Да, спасибо. За выходные сделаю. Заодно и для последней КД обновлю, давно хотел.

    Reply
  27. Поручик

    (26) Она в последней КД2 прекрасно работает без каких-либо доработок. Если бы не работало, я бы давно сообщил, так у меня она один из часто используемых инструментов с первой версии.

    Reply
  28. Totoro

    Версия 1.08:

    — добавлена загрузка общих реквизитов (появилось в КД начиная с версии 2.1.6). Как и в типовой загружаются только не участвующие в разделении данных реквизиты.

    — добавлен простой диалог выбора строки подключения базы из списка локальных баз. Анализируется файл «%AppData%1C1CEStartibases.v8i»

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

    Тестировалось на 2.1.8.1.

    Reply
  29. Поручик

    Теперь удобно, особенно список баз.

    Reply

Leave a Comment

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