Установка сервера 1С на Linux (описание варианта установки и настройки)




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

    Однозначно нужная статья!

    Reply
  2. Арчибальд

    Все же посоветую переделать файл в формат .doc — с учетом того, что 2007 версия еще не очень юзается. А статья хорошая.

    Reply
  3. sashacd

    А вот еще для создания БД приходилось подправить

    26) Редактирую файл /etc/rc.d/init.d/postgres

    добавляю в команду создания DB «—locale ru_RU.UTF-8 -E UTF8» :

    $SU -l postgres -c «$PGENGINE/initdb —locale ru_RU.UTF-8 -E UTF8 —pgdata=’$PGDATA’ —auth=’ident sameuser'» >> «$PGLOG» 2>&1 < /dev/null

    27) Проверяем что получилось создать базу с кодировкой UTF8:

    /etc/rc.d/init.d/./postgresql start

    su postgres

    psql -l И вижу что кодировка UTF8!

    Reply
  4. venger

    (2) А еще лучше, чтоб не качать, а читать сразу с экрана;-)

    Reply
  5. Denis_Viktorovich

    ОТЛИЧНАЯ Статья! Спасибо.

    Reply
  6. StreamLVM

    Статья отличная. Еще можно добавить ссылки на etersoft.ru — там сборки постгреса для 1С с нужными патчами посвежее.

    Reply
  7. highlander

    а это же только для 7-ки реально?

    Reply
  8. iceflash

    Для 7-ки нет. по ряду причин. одна из основных- нет 3-х уровненвой архитектуры, и из СУБД работает она только с ms sql

    Reply
  9. CheBurator

    Автору рекомендуется паралельно выложить полностью текст статьи прямо на этой странице.

    Reply
  10. malikov_pro

    статья нужная

    но некоторые вещи можно сделать проще и красивее, сам пользуюсь инструкцией с

    http://blog.unixstyle.ru/index.php?/archives/79-1C-8.1-Linux-CentOS.html

    если не устанавливать параметр stats_row_level = off к чему может привести?

    просто его нет в самом конфиге (Postgres 8.4.1)

    Reply
  11. malikov_pro

    самба нужна для определения DNS имени linux сервера в в локальной сети

    без нее обратиться к хосту по имени а не по IP можно прописав его в hosts, но это муторно

    настроить можно чз графический интерфейс (поставив соотв пакет)

    и не забыть ей запустить

    service smb start

    и прописать в «автозагрузку»

    chkconfig smb on

    еще заморочка при установке этого набора что с users.v8.1c.ru пакеты идут упакованные RAR ом а в базовом варианте CentOS его не поддерживает

    решить задачку можно скачав соот пакет из

    http://packages.sw.be/rar/

    актуальная версия Postgres 8.4.3-3.1C

    автору: выдели команды которые нужно вводить в linux выдели тегами

    CODE

    будет более читаемо

    Reply
  12. erem

    (10) Опыта установки Postgres 8.4 не имею, но собираюсь попробовать…

    stats_row_level = off — встречал такую рекомендацию в инструкциях по установки Postgres 8.2

    Reply
  13. erem

    (11) Если клиентских компов не много, то не сложно прописать и в hosts. В больших организациях обязательно есть сервер DNS. А использовать WINS самбы для опеределения имен в Linux — неуважительно для операционной системы 🙂 Самбу устанавливал, но для удобства переноса установочных файлов 1C и Postgres на Linux.

    Reply
  14. Durko

    Помогите пожалуйста, в чем может быть проблема? система — Mandriva 2010 spring — порты открыты, файервол отключен на обоих машинах. Сервисы стартуют и слушают порты как в мануале. Пингуется нормально, имя определяется. Телнет к порту 1540 подключается спокойно. (к постгре c помощью pgAdmin подключаюсь нормально). Но вот консоль не создает кластера и выдает такую ошибку


    Reply
  15. Durko

    Помогите пожалуйста, в чем может быть проблема? система — Mandriva 2010 spring — порты открыты, файервол отключен на обоих машинах. Сервисы стартуют и слушают порты как в мануале. Пингуется нормально, имя определяется. Телнет к порту 1540 подключается спокойно. (к постгре c помощью pgAdmin подключаюсь нормально). Но вот консоль не создает кластера и выдает такую ошибку

    http://j.imagehost.org/0229/1_123.jpg

    Reply
  16. Durko

    Помогите пожалуйста, в чем может быть проблема? система — Mandriva 2010 spring — порты открыты, файервол отключен на обоих машинах. Сервисы стартуют и слушают порты как в мануале. Пингуется нормально, имя определяется. Телнет к порту 1540 подключается спокойно. (к постгре c помощью pgAdmin подключаюсь нормально). Но вот консоль не создает кластера и выдает такую ошибку

    http://j.imagehost.org/0229/1_123.jpg

    Reply
  17. erem

    (15) С такой ошибкой не сталкивался, но вот что нашел здесь: http://www.gilev.ru/1c/support/tasks/10064.htm: В настройках кластера режим безопасного соединения с режимом безопасности ТОЛЬКО СОЕДИНЕНИЕ перевыбрать «отключено» на нужное

    Консоль — Центральные серверы — Ваш сервер — Кластеры — 1541 — Свойства

    Но может и файервол не полностью выключен. Доступен ли порт 1560 на сервере?

    Reply
  18. Durko

    спасибо! разобрался, оказывается запускал консоль 8.1 — через консоль 8.2 все пошло… Но база не создалась — выругалась на mchar… мучался мучался — решил поставить 1совскую версию — но не ставятся пакеты требуют то libreadline.so.4, libssl.so.4… блин… уже устал

    Reply
  19. fastwriter

    Плюсую за использование технологий open source.

    Reply
  20. Dimonis

    а вместо PostgreeSQL можно поставить Db2 (причем по-возможности чтобы Db2

    ставить не методом

    apt-get install db2cc

    а предварительно скачанный с сайта Db2 ?

    Reply
  21. Dimonis

    Присоединяюсь к 20 комментарию насчет Db2.

    А еще было-бы здорово ставить НЕСКОЛЬКО баз на Db2Express-c который скачан с сайта 1с

    (или если это нереально — ставить несколько экземпляров Db2).

    И по возможности на Ubuntu Server

    Reply
  22. 1977

    До двенадцати пользователей могут работать без ключа! Справедливо для версии 1С 8.1.11

    Прошу прокоментировать! Для версии 8.2 не катит?

    Reply
  23. erem

    (22) 1977, На 8.1.11 точно работало 10 пользователей (у клиента больше не было) без ключа на сервер приложений… На более новых версиях не проверял, но на партнерском форуме пишут что «В linux-версии сервера предприятия при одном рабочем процессе и до 12 подключений ключ сервера не проверяется. При добавлении второго рабочего процесса в кластер, а также при подключении более 12 пользователей, ключ проверяется.

    Однако это чисто техническое решение, и несмотря на него, ключ сервера необходим в любом случае, будет он проверяться или нет. В лицензионном соглашении однозначно сказано, что работа сервера безусловно допускается только при наличии лицензии на него, коей как раз и является ключ сервера» (Леонов Александр) 02.05.2010

    Reply
  24. Dragonva

    Хм интересный вариант настройки! Попробую! Хотя жесть как скриншотов не хватает!

    Reply
  25. vprus

    За статью спасибо.

    Так кто-нибудь проверял работу IBM DB2 Express под Linux?

    Точно ли, что Сервер приложений под 8.2 позволяет работать 12 пользователям?

    Reply
  26. vovafr1

    А Возможна работа без сервера 1с и sql?

    Reply
  27. starik-2005

    (26) vovafr1, файловая база работает без сервера, но для небольшого числа пользователей.

    Reply
  28. chump0000

    Есть ли возможность запустить 2 сервера 1С разных версий на linux? как должны выглядеть команды регистрации/запуска сервисов в этом случае?

    Reply

Leave a Comment

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