Инструкция. Устанавливаем выделенный сервер для 1С:Предприятия и PostgreSQL 8.4 на Ubuntu Server 10.04 LTS




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

38 Comments

  1. zabaluev

    А можно ли поставить сервер V8.1 32бит и V8.2 32бит на Ubuntu64x. На fedora 11 64x сервер V81 32bit ставиться и работает без проблем. А на Ubuntu64x не стартует.

    Reply
  2. fishca

    (1) Честно сказать даже и не пробовал, т.к. у самого только 32 битная система.

    Reply
  3. zabaluev

    Не понял, что у вас 32бит. Все пакеты 64битные :1с-ка «1c-enterprise82-server_8.2.11-229_amd64.deb» и «postgresql-contrib-8.4_18.4.4-ailant-0ubuntu10.04_amd64.deb».

    Reply
  4. V_V_V

    Подымал сервер 1С (8.2.10.77) под Ubuntu 9.10, было еще несколько нюансов, интересно исправили ли их в последующих сборках?

    Во-первых, скрипты установки Postgres в Ubuntu не прописывали пользователя и группу postgres. Надо было делать

    groupadd -g 5026 -o -r postgres

    useradd -g postgres -o -r -d /var/lib/pgsql -s /bin/bash -c «PostgreSQL Server» -u 5026 postgres

    Во-вторых, нужно было делать ссылки на необходимые серверу библиотеки (Ubuntu 9.10 x86_64)

    ln -s /lib/libreadline.so.6.0 /lib/libreadline.so.4

    ln -s /lib/libncurses.so.5.7 /lib/libtermcap.so.2

    В-третьих, менялся пароль на postgres после правки pg_hba.conf

    psql -U postgres -d template1 -c «ALTER USER postgres PASSWORD ‘new_pass'»

    В-четвертых, неправильно прописывались права на папки /opt и /opt/1c, ставились 500:500 и нужно было делать

    chown root:root /opt

    chown -R usr1cv82:grp1cv82 /opt/1C

    Неужто это все поправили и теперь сервер влетает без проблем?

    Кстати, по работе PostgreSQL никаких вопросов не возникало, а вот к серверу 1С 8.2.10.77 претензии имелись — регулярно падал на ровном месте без видимых причин и записей в логах. Уже стабильнее работает?

    Reply
  5. fishca

    (3) это у автора статьи 64 бита

    (4) взлетел 8.2.12.80 только что, правда кластер и рабочие сервер и процесс добавил руками через консоль 1С

    Reply
  6. V_V_V

    (5) Спасибо, буду пробовать…

    Где бы еще почитать хорошее описание тонкой настройки самого PostgreSQL (файл postgresql.conf) на современных серверах именно под задачи 1С, а не в общих чертах…

    Reply
  7. fishca

    (6) есть еще статейка на http://www.lissyara.su/articles/freebsd/programms/1c_8.1+postgresql/ по установке 8.1 на FreBSD

    Прикрепляю оттуда файл postgresql.conf

    Reply
  8. fishca

    (6)

    Еще вариант от Харина Олега

    Reply
  9. V_V_V

    (7) Я себе брал за основу именно эти настройки Лиса (в основном благодаря хорошим комментариям по-русски). При этом учитывал, что моя машина в разы мощнее (почему и спрашивал настройки для современных серверов), соответственно некоторые параметры существенно увеличил (тут то и не уверен где правильно, а где нет). И в его настройках есть один момент — нельзя прописывать stats_row_level (в самом конце его файла), ругается что нет такой опции и сервер под Ubuntu вообще не запускается (может эта фишка только для FreBSD).

    А вариант от Олега Харина еще не видел, спасибо, посмотрю…

    Reply
  10. Dimka74

    Классно! Вот бы ещё такое подробное описание, на подъем терминального сервера с 1с-кой на Убунте 10.04. 😉

    Reply
  11. alex_rav

    «4. Входим в этот каталог. Затем копируем наши патчи в каталог «/debian/patches/»» — вот этот каталог «/debian/patches/» нужно создать или он должен быть? (а то у меня его нету)

    Reply
  12. fishca

    (11) при закачивании исходников постгреса, там этот каталог появляется автоматом, он расположен в каталоге posgres-№версии/debian/patches/

    Reply
  13. coch

    (0)

    Дальше необходимо доставить несколько пакетов:

    apt-get install imagemagick msttfcorefonts libgsf-1-114 texlive-binaries

    не

    msttfcorefonts

    , а msttcorefonts

    Reply
  14. fishca

    (13)спасибо, подправил 🙂

    Reply
  15. coch

    (14) ещё было бы очень даже не лишним указать какой пользователь и пароль по умолчанию в PostgreSQL.

    Reply
  16. fishca

    (15) postgres/postgres — по стандарту 🙂

    Reply
  17. coch

    (0)

    Работоспособность проверяется с любой windows-машины, подключением консоли серверов «1С:Предприятия» к нашему серверу на заданный порт (1540 или 11540).

    Консоль подключилась, но при добавлении базы выскакивает ошибка:

    Ошибка соединения с рабочим процессом
    Ошибка получения IP адреса по символическому адресу:
    server_addr=tcp://nikolas-desktop:1562 descr=Ошибка сетевого доступа к серверу
    (Windows Sockets — 11004(0x00002AFC). Запрошенное имя верно, но данные запрошенного типа не найдены. ) line=568
    file=.SrcDataExchangeTcpClientImpl.cpp
    

    Платформа W7 максималка.

    Убунту ставил под VirtualBox, но Desktop 64 (надеюсь отличие только в предустановленном софте).

    Ставил чётко по инструкции.

    в добавлении ИБ указывал как IP так и имя сервера, ошибка одна и таже

    Есть какие-нибудь мысли?

    Reply
  18. coch

    (17) решилось после установки Samba

    (0) надо ещё добавить в статью

    Компилировать PostgreSQL необходимо с ключом «—disable-integer-datetimes», иначе при загрузке данных в СУБД через 1С:Предприятие 8 может вылететь ошибка про timestamp.

    С ошибкой уже столкнулся.

    Reply
  19. cleaner_it
    pbuilder create

    может не работать, если прокси не настроен. Используется wget

    В терминале выполняем sudo gedit /etc/wgetrc, и правим строчки:

    #https_proxy = http://proxy.yoyodyne.com:18023/

    #http_proxy = http://proxy.yoyodyne.com:18023/

    #ftp_proxy = http://proxy.yoyodyne.com:18023/

    Reply
  20. markers

    Отменная статья! Побольше бы таких! Глядишь и я всё-таки освою линукс дальше тупого юзера….

    ЗЫ: Хотя чисто 8.1 сервер ставил, и даже в ручную запускался :)) Но потом я как-то загубил линукс (начал глючить со звуком/сетью)…. Дело было в виртуалке.

    Reply
  21. milliondeneg

    (19.)

    pbuilder create

    может не работать, если прокси не настроен. Используется wget

    В терминале выполняем sudo gedit /etc/wgetrc, и правим строчки:

    #https_proxy = http://proxy.yoyodyne.com:18023/

    #http_proxy = http://proxy.yoyodyne.com:18023/

    #ftp_proxy = http://proxy.yoyodyne.com:18023/

    У меня это неработает.

    Прописал так:

    pbuilder create — http-proxy http://proxy.yoyodyne.com:18023/

    или можно в /etc/pbuilder-config.sh

    добавить строку http-proxy = http://proxy.yoyodyne.com:18023/

    тогда команда pbuilder create у меня заработала

    Но вылезла проблема которую немогу победить 🙁

    1. запускаю pbuilder create, все проходит на ура

    2. запускаю pdbuild он начинает шуршать после чего говорит что не может стянуть с сайта ru.archive.ubuntu.com пакеты т.е. прокси не видит 🙁 apt wget настроены.

    а для команты pdbuild параметра прокси нет 🙁 что делать?

    Reply
  22. andersen

    Каким образом лучше разбить диски, подскажите ?

    Reply
  23. cleaner_it

    (21) У меня pdbuild тоже отработал не полностью (может потому, что не серверный релиз — Ubuntu Desktop 10.4?), но сервер приложений работает. На рабочем сервере буду добиваться 100% результата

    Reply
  24. kadaber

    не подскажете как обновлять платформу 1С на Ubuntu?

    можно просто скачать новые .deb с сайта 1С и поставить сверху?

    или лучше удалить предыдущую версию платформы?

    Reply
  25. Nigelist
    fishca пишет:

    Кстати, при использовании в конфигурациях «1С:Предприятия 8» управляемых блокировок, скорость работы СУБД PostgreSQL в ряде случаев бывает даже выше, чем у MS SQL (под которую изначально и был заточен 1С). Но это все относится к правильной оптимизации запросов, которые в версии 8.2 можно очень гибко настраивать.

    fishca, очень хотелось бы увидеть статью и на эту тему. Уж очень интересует грамотная оптимизация связки PostgreSQL и сервера 1С:Предприятие 8.2

    coch пишет:

    , а msttcorefonts

    Не msttcorefonts, а ttf-mscorefonts-installer

    zabaluev пишет:

    А можно ли поставить сервер V8.1 32бит и V8.2 32бит на Ubuntu64x. На fedora 11 64x сервер V81 32bit ставиться и работает без проблем. А на Ubuntu64x не стартует.

    Конечно можно, но не нужно. Для Ubuntu64x существуют дистрибутивы написанные под эту ОС. Но если вы хотите попробовать в целях эксперимента, то можно добавить поддержку 32-битных приложений:

    apt-get install ia32-libs
    Reply
  26. coch

    (25)

    Nigelist пишет:

    Не msttcorefonts, а ttf-mscorefonts-installer

    Из описания пакетов не совсем понял, в чем разница?

    По данной инструкции 2 раза ставил сервер на 10.04 и на 10.10

    Reply
  27. Nigelist
    coch пишет:

    Из описания пакетов не совсем понял, в чем разница? По данной инструкции 2 раза ставил сервер на 10.04 и на 10.10

    А вы пробовали устанавливать используя название пакет которое вы предложили:

    apt-get install msttcorefonts

    У меня не получилось. Да и правильно название пакета можно узнать здесь.

    Reply
  28. coch

    (27) В том то и дело, что два раза установил успешно, когда ставил первый раз на 10.04 нашел ошибку в инструкции.

    практически все команды набирались способом копи-паст

    Кстати, а почему правильное название пакета нельзя узнать здесь?

    Reply
  29. Nigelist
    coch пишет:

    В том то и дело, что два раза установил успешно, когда ставил первый раз на 10.04 нашел ошибку в инструкции.

    практически все команды набирались способом копи-паст

    Кстати, а почему правильное название пакета нельзя узнать здесь?

    Вы считаете себя самым хитрым? Посмотрите для какого дистрибутива это название. Перейдите по ссылке на правильный дистрибутив (который здесь рассматривается), тогда и увидите правильное название… И откуда я знаю почему у вас поставился? Может вы старые репозитории подключили. В репозиториях на lucid такого названия пакета нету.

    Reply
  30. Dimonis

    а Db2 вместо PostgreeSQL ставить не пробовали ?

    Reply
  31. Kolobok

    Здравствуйте!

    Долго эксперементировал с установками, в итоге написал сценарий на bash, Если кому надо, моу выложить

    Reply
  32. Dimonis

    Db2 к сожалению ставить прийдется.

    Связано с некорректным формированием результатов запросов при полном внешнем соединении

    (столкнулся при работе конфигурации Штрих-М торгового предприятия на Postgree-SQL).

    Reply
  33. swamp
    Переходим в каталог исходников и

    pdebuild

    Сборка началась…

    Что-то у меня скачивать метров 500 как описано в руководстве не стало, и остановилось через пару минут на таком сообщении:

    dpkg-buildpackage: error: unable to determine source changes by

    dpkg-buildpackage: source package postgresql-8.4

    dpkg-buildpackage: source version 18.4.4-aliant-0ubuntu10.04

    ЧЯДНТ?

    Reply
  34. swamp

    (33) swamp, виноват

    1) Файл «changelog». Отвечает за правильное наименование пакетов после сборки. Добавляем туда следующие строки в начало файла любым текстовым редактором (например, через mc):

    postgresql-8.4 (18.4.4-ailant-0ubuntu10.04) lucid; urgency=low * Apply 1C patch for PostgreSQL (from 8.4.1 version) — add mchar, fulleq, fasttrun — Igor Vershinin <ivershinin@ailant.com.ru> Fri, 04 Jun 2010 00:53:03 +0400

    привел в визуальное соответствие с этим файлом и все завелось.

    Reply
  35. stark.temp

    Классная статейка, очень пригодиласмь! Ставлю + вам!

    Reply
  36. fishca

    (35) спасибо!

    Reply
  37. BAPPKAH

    Классная статейка, очень пригодилась!

    Reply
  38. unknownDaemon

    Чтобы не ловить такие ошибки постгресса:

    ERROR: timestamp out of range

    нате патчик (host@user$ git diff -u -r bda3c2defb7bc 71a8c2d2a591a82):

    diff —git a/debian/rules b/debian/rules
    index de84b55..67e6607 100755
    — a/debian/rules
    +++ b/debian/rules
    @@ -28,7 +28,7 @@ DEB_CONFIGURE_EXTRA_FLAGS := —mandir=$${prefix}/share/postgresql/$(MAJOR_VER)/
    —bindir=$${prefix}/lib/postgresql/$(MAJOR_VER)/bin \r
    —includedir=$${prefix}/include/postgresql/ \r
    —enable-nls \r
    —  —enable-integer-datetimes \r
    +  —disable-integer-datetimes \r
    —enable-thread-safety \r
    —enable-debug \r
    —disable-rpath \r
    

    Показать

    Reply

Leave a Comment

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