Работа с PostgreSQL в 1С 7.7




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

21 Comments

  1. sasok

    Не забываем ставить +

    Reply
  2. Kataklysm

    а транслятор SELTA@etersoft нужно использовать? 🙂

    Reply
  3. passerg

    Спасибо, +

    Reply
  4. sasok

    SELTA@Etersoft выполняет трансляцию SQL-запросов из диалекта T-SQL (MS SQL Server) в PgSQL (PostgreSQL), что позволяет программам, предназначенным только для работы с MS SQL Server, функционировать и с PostgreSQL. На практике это означает, что теперь «1С: Предприятие 7.7 SQL» может хранить данные в PostgreSQL. Решение SELTA@Etersoft предназначено для работы как в MS Windows, так и под GNU/Linux (при использовании WINE@Etersoft SQL).

    Reply
  5. sasok

    Транслятор реализован в виде ODBC-драйвера PostgreSQL, который представляется как ODBC-драйвер сервера MS SQL, и разбирает запросы, обращения к системным таблицам, адаптируя их для PostgreSQL. Таким образом не требуется вмешательства ни в сам сервер, ни в клиентскую программу. ODBC-драйвер выполнен в виде DLL-библиотеки, что позволяет использовать данное решение как в WINE@Etersoft под GNU/Linux, так и в Windows.

    Reply
  6. Crush

    Убери пробелы.. Все таки есть и пользователи Firefox-а

    Reply
  7. sasok

    WINE@Etersoft не ставил так подключаюсь к базе и меняю реквизиты.

    У меня postgreSQL как процессинг, там хранятся данные о дисконтных картах:

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

    Reply
  8. imssyzran

    Спасибо!

    Reply
  9. barust67

    Спасибо!

    Попробую установитью

    Reply
  10. ksa-nsk

    Автору.

    у меня в БД на sql один справочник огромного размера и постоянно растет (программа собирает информацию из интернета). На сегодня в нем более 1000000 эл-тов. SQL иногда сбоит, друг посоветовал поставить PostgreSQL.

    Если возможно, в двух словах, будет ли толк и как использовать Вашу обработку для этого. Спасибо.

    Reply
  11. sasok

    Это просто пример установки содинения с БД под управлением pgSQL, в дальнейшем получение и изменение дынных необходимо дописывать учитывая специфику конфигурации.Данные можно получать так же как и при работе с SQL — sql запросами или использовать recordset. Соответственно есть методы и для записи.

    Reply
  12. ksa-nsk

    Я пока слабоват в применении sql-запросов, т.е. для работы с базой PostgreSQL придется в конфигурации переписывать все обращения на командах PostgreSQL? Если да, то интересно (для примера), как будет выглядеть какая-либо команда и где лучше почерпнуть справочные данные? Но самый важный вопрос — до какого объема информации можно спокойно работать с БД?

    На сегодня проблема в том, что на сервер (MS Server 2003) я поставил 8 гиг, винда отдает 7 гиг, но sql на работу больше 4 гиг вроде как не может взять (насколько я понял из настроек). Может, поэтому сотрудники периодически вываливаются из БД. Сервис пак поставили четвертый (на sql). Суть в том, что информация из этого здорового спр-ка нужна в основном последняя, а старая очень очень редко. Может (вроде где-то читал), разделить данные на несколько баз, а потом при необходимости из рабочей БД подсоединять необходимые БД и формировать запросы к ним, рез-ты складывать в ТЗ, а потом в отчет?Интересно будет узнать Ваше мнение. Спасибо.

    Reply
  13. sasok

    Честно сказать я не силен по отношению SQL серверов, думаю , что для работы с pgSQL совместно с 1с тебе нужно в инете поискать информацию о SELTA@Etersoft. SELTA@Etersoft — программный продукт, выполняющий трансляцию SQL-запросов из диалекта T-SQL (базы данных MS SQL Server) в PgSQL (база данных PostgreSQL). Я пишу на 1с и немного на delphi, а по поводу pgSQL у меня просто был опыт интеграции с нашей кассовой программой. Суть ТЗ была в том, что информация о дисконтных картах хранится в базе под управлением pgSQL и мне необходимо быо при предоставлении скидки брать информацию из нее, что я и сделал. Просто, основная проблема — это установка соединения с базой, точнее главное правильно настроить источники данных ODBC, тобиш драйвера ADO, отвечающие за соединение с БД, через которые в дальнейшем методами 1с «коннектишся к базе» и выполняешь все необходимые тебе операции(проблема в 1с — это правильно задать строку инициализации при подключении, кодировки ANSI или OEM,порт и т.д.). Это и привело к написанию этой обработки. Естественно все козыри в ней я в ней не раскрыл, написал простенькую обработочку в помощь людям(эта доработка все таки стоит денег и не маленьких), просто подумал, что люди которые работают с SQL могут написать стандартные SQL запросы и т.д. Но если что могу тебе скинуть другой примерчик обработки, выполняющей изменения в БД под управлением pgSQL.

    Reply
  14. sasok

    Еще: думаю, что у тебя стоит 32 — битная система? Вот для нее заявлено, что SQL Server поддерживает работу до 16 гигов! Но в реале 3,5 гига! Если хочешь больше ставь 64 — битную.

    Reply
  15. ksa-nsk

    (14)

    Спасибо, надо обдумать, а вообще, критический объем БД для SQL не подскажешь?

    Reply
  16. sasok

    ты б хотябы плюс то мне поставил

    Reply
  17. Artemyyy

    а где взять дрова под постгри 8.2.3 и как их корректно настроить? а то я для ХР воспользовался http://www.citforum.ru/database/postgres/windows.shtml — и что-то не подключается по данной обработке. Если кто знает-ответьте плиз в асько200471583

    Reply
  18. sasok

    при установке самой постгрии дровни сами должны стать просто надо настроить доступ через источники данных(ODBC).

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

    Reply
  19. Lexus

    «соединение» — это, конечно, хорошо… а есть ли в этой обработке пример получения данных (по запросу), например, в таблицу значений?

    (у меня с рейтингом туго и как-то не радует качать только чтобы убедиться нужно или нет)

    Reply
  20. pakko

    Интересуети альтернативный вариант.

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

    Reply
  21. Antoska

    (19) Lexus, собственно, в таблицу значений оно и выгружает. Мне вот любопытен как раз вариант выгрузки данных из 1С в базу постгреса. Не сталкивался ли кто-нибудь? Подозреваю, что ODBC драйвер из этого примера не даст возможности внести данные в базу постгреса… Буду пробовать.

    P.S. Понимаю, что некропостинг, но вопрос актуален, может кто и ответит…

    Reply

Leave a Comment

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