Расчетная ведомость сравнительная (черно — белая, с возможностью подключения к другой базе)




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

14 Comments

  1. GalinaK

    Добрый день! Подскажите, в чём может быть проблема — тестовое подключение срабатывает нормально, а при нажатии «Подключиться и сформировать» выходит ошибка :

    !! «Не удалось подключиться с заданными настройками!{Форма.ФормаОтчета.Форма(63)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V82.COMConnector.»

    или !!»Не удалось подключиться с заданными настройками!{Форма.ФормаОтчета.Форма(63)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (1C:Enterprise 8.2.19.68): Неверные или отсутствующие параметры соединения с информационной базой»

    Reply
  2. SinglCOOLer

    (1) GalinaK, как правило такие ошибки бывают когда не верно указан путь к базе, особенно если база серверная

    Reply
  3. GalinaK

    (2) путь верный и тестовое подключение это подтверждает

    Reply
  4. SinglCOOLer

    (3) GalinaK, тогда нужно больше информации, какая конфигурация, какой тип базы (файловая, серверная), версия платформы

    Reply
  5. GalinaK

    (4) 1С:Предприятие 8.2 (8.2.19.68), Зарплата и Управление Персоналом, редакция 2.5 (2.5.72.2) — базы идентичны, базы файловые

    Reply
  6. GalinaK

    (4) попробовала на ДЕМО, сделала копию — ДЕМО 2, то есть базы 100% одинаковые (и платформа и релиз) и на другом ПК с другой ОС… результат тот же, ошибки те же…

    Reply
  7. SinglCOOLer

    (6) GalinaK, дело в том что я маленько про другое спрашивал, демо базы есть почти у всех конфигураций, версия платформы 8.2… какая конфигурация Зарплата и управление персоналом 2.5..?

    Reply
  8. GalinaK

    (7) Зарплата и Управление Персоналом, редакция 2.5 (2.5.72.2) — проф

    Reply
  9. gala2009

    как сложно все

    Reply
  10. SinglCOOLer

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

    Reply
  11. sergeyshik

    хочу взять вашу расчетную ведомость за основу сравнения данных в БП и ЗУП,а именно получить данные из подчиненного зуп, но даже на одинаковых базах выскакивает ошибка, ошибка при создании комсоединения(у меня серверные базы). А дело все в:

    1)Стр 63 БазаИсточник = V8.Connect(СтрокаСоединения); Синтакс-помошник:

    метод Connect (Connect)

    Синтаксис:

    Connect(<СтрокаСоединения>)

    Параметры:

    <СтрокаСоединения> (обязательный)

    Тип: Строка.

    Строка параметров (Строка соединения), используемая 1С:Предприятием для соединения с информационной базой.

    Возвращаемое значение:

    Тип: Булево.

    Истина — инициализация прошла удачно, Ложь — в противном случае.

    2) БазаИсточник.NewObject(«Запрос»); -естественно будет ошибка, так как в БазеИсточник записано булевское значение

    Reply
  12. sergeyshik

    Поэтому надо возвращать из функции выполнить подключение «V8» ,а не БазаИсточник

    Reply
  13. SinglCOOLer

    (13) sergeyshik, странно конечно, но она до сих пор работает в таком виде, может от платформы зависит?

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

    Менеджер COM-соединений (COM connector)

    Connect (Connect)

    Синтаксис:

    Connect(<СтрокаСоединения>)

    Параметры:

    <СтрокаСоединения> (обязательный)

    Тип: Строка.

    Строка параметров (Строка соединения), используемая 1С:Предприятием для соединения с информационной базой.

    Возвращаемое значение:

    Тип: Внешнее соединение.

    Описание:

    Создает соединение с информационной базой 1С:Предприятия 8.

    Устанавливает соединение с информационной базой 1С:Предприятия 8 и возвращает ссылку на объект Внешнее соединение.

    Установка соединения выполняется по следующему алгоритму:

    1. Внешнее соединение с требуемыми параметрами ищется в пуле соединений. Если найдено, то используется оно.

    2. Если Внешнее соединение с требуемыми параметрами не найдено, то анализируется не исчерпан ли лимит по числу одновременно существующих соединений. Если не исчерпан, то создается новое Внешнее соединение.

    3. Если лимит исчерпан, но при этом в пуле имеются неиспользуемые Внешнее соединение, то соединение, дольше всех находящееся в пуле, удаляется и создается новое Внешнее соединение.

    4. Если никаким способом найти подходящее или создать новое Внешнее соединение не удалось, то происходит ожидание освобождения Внешнее соединение другим потоком, после чего весь процесс повторяется, начиная с пункта 1.

    Доступность:

    Интеграция.

    Пример:

    // Создается объект-коннектор

    cntr = Новый COMObject(«V82.COMConnector»);

    // создается объект COM-соединение

    connection = cntr.Connect(«File=»»c:InfoBasesTrade»»;

    Usr=»»Director»»;»)

    Reply
  14. sergeyshik

    (14) все равно спасибо, все что мне нужно я подчерпнул:)

    Reply

Leave a Comment

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