Настройка удаленного хранилища 1C 8.2 на Apache




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

33 Comments

  1. 7690255

    😀 Речь шла про Apache, а то количество ссылок достойных людей

    , которые потратили свое время писавши их, могут эту стаью только дополнить.

    Reply
  2. Chif13

    (1) gilev, я все кончно понимаю, но это уже не первый раз, когда вы пытаетесь упрекнуть людей, пытающихся поделиться СВОИМ опытом в том, что Вы (несомненно умный человек) написали эти статьи вперед. Есть понятия как «конкуренция» и «альтернатива», будьте добры давать людям высказывать и рассказывать про свой опыт, а не тыкать их носом в свои статьи. Можно было бы поступить корректней и просто указать ссылки на свои статьи как альтернативу или дополнение, высказать обоснованное замечание, это больше соответсвует действиям умного человека, чем то как действуете Вы. С уважением, Chif13

    Reply
  3. fastwriter

    За Apache — однозначный плюс. Да и вообще, статья полезная.

    Reply
  4. luns

    (1) тоже кстати не понял, где там по ссылка есть подобная инфа?

    слова «хранилище конфигурации» встречаются это правда.

    ссылки на другие ресурсы есть (может там инфа?).

    но статьи на инфостарте про настройку апача не нашел.

    так что думаю что в (3) очень правильную мысль выразили.

    Reply
  5. alex_77

    Под linux, кто нибуть делал?

    Reply
  6. anton.fly7

    Привет

    у меня почему то некорректно отражается текст, который надо писать в httpd.conf

    а текст для repository.1ccr вообще не видно…

    Reply
  7. iiceberg



    Господа, а есть ли у кого инфа по сабжу, но для OS Linux?

    Reply
  8. Zealot

    Уважаемый автор, некорректно описаный код для вставки в apache (прикрепите свой апач-конфиг, тот кусок который относится к описанному выше) + не видно в статье что писать в файле repository.1ccr !

    Reply
  9. 7690255

    Zealot — Стасибо за замечание поправилв статье.

    Reply
  10. yrtyevg

    да и в п.1 косяки неплохо бы исправить.

    Reply
  11. lustin
    Reply
  12. webdimon

    E:/Storage-1C/»> — почему только одна кавычка?

    Имя Вашей Конфигурации — в какой момент указывается ? Где?

    E:/Storage-1C/ — путь к самой базе? или к каталогу web публикации?

    repository.1ccr — где данный файл надо создать?

    Сыро написано, не понятно!

    Reply
  13. webdimon

    Ответьте на мои вопросы.

    В момент подключения пишет вот что

    Неклассифицированная ошибка работы с хранилищем конфигурации.

    по причине:

    HTTP: Internal server error

    Ошибка при работе с ресурсом

    Reply
  14. NCCSOFT
    Reply
  15. alekckuc

    Все сделал как написано получаю ошибку:

    Неклассифицированная ошибка работы с хранилищем конфигурации.

    по причине:

    HTTP: Forbidden

    Ошибка при работе с ресурсом

    В логах apacha:

    — — [24/Oct/2011:05:46:46 +0400] «POST /storage/repository.1ccr HTTP/1.1» 403 225

    может кто подскажет в чем дело ?

    Reply
  16. ratinc

    Здесь однозначно имеем дело с ошибкой в настройке апача.

    Нужно посмотреть error.log на предмет записи типа client denied by server configuration: D:/hran/repository.1ccr

    Обычно такое бывает если пытаешься обратиться к директории которая отличается от корневой для апача

    В моем случае для апача версии 2.2 рабочий конфиг приведен ниже

    LoadModule _1cws_module «C:/Program Files (x86)/1cv82/8.2.14.519/bin/wsap22.dll»

    AddHandler 1cws-process .1ccr

    #1c publication

    Alias /storage «D:/hran»

    <Directory «D:/hran»>

    AllowOverride All

    DirectorySlash off

    SetHandler 1cws-process

    Order allow,deny

    Allow from all

    </Directory>

    Это работает только в том случае если не переопределялись другие параметры в конфиге.

    Reply
  17. alekckuc

    Ура все заработало помог последний комментарий !!!!!

    Reply
  18. Ksu

    Спасибо за полезную статью.

    Я бы еще обратила внимание на то, что апач критичен к регистру. И если в настройках апача ввели алиас на Storage с большой буквы, то и подключаться надо так же.

    Reply
  19. kapustinag

    (19) Ksu, Не совсем так.

    Не Apache чувствителен к регистру, а операционная система или чувствительна к регистру, или нет. То есть, если мы настраиваем Apache на любом Unix-е — регистр очень важно соблюдать. А на Windows — неважно.

    Reply
  20. ratinc

    Вы всерьез думаете что девушка настраивает апач и хранилище на юникс-лайк системе?

    Если это так, то снимаю шляпу.

    А по теме могу сказать что на юниксах в отличие от виндовсов ещё и слеши в написаниях путей к папкам в разные стороны указываются.

    Сюда же относятся и маки. Они же тоже на BSD подобной системе построены. Вдруг девушка апач на маковском сервере ставит.

    Reply
  21. borrman

    Блин.

    А у меня по http не работает

    по tcp работает, а http — нет

    client denied by server configuration: E:/Repository/repos.1ccr

    чего ему надо?

    в конфе прописал

    AllowOverride All

    DirectorySlash off

    SetHandler 1cws-process

    Order allow,deny

    Allow from all

    права на файл, папки есть

    чего ему не хватает?

    Reply
  22. borrman

    пришлось прописать:

    <directory />

    AllowOwerride All

    Order allow,deny

    Allow from all

    <directory>

    Сервер локальный и без доступа из вне

    я так понимаю, если его открывать наружу — то это жуткая дыра, верно?

    А без этого не заработало хранилище по http

    Reply
  23. borrman

    Вот тут

    Alias /storage «C:/Www/Web/NCC/1c/»

    <Location «C:/Www/Web/NCC/1c/»>

    DirectorySlash Off

    SetHandler 1cws-process

    Allow from all

    </Location>

    заменил

    <Location> на <Directory>

    Reply
  24. dave2000

    (15)

    4) Создаем файл «repository.1ccr» в папке ХРАНИЛИЩА с содержимым

    («pavel» — имя вашего компа, или IP-адрес вашего компа):

    <?xml version=»1.0″ encoding=»UTF-8″?>

    <repository connectString=»tcp://pavel»/>

    Внимаение!!! Касается тех, у кого сервер 1С (и соответственно сервер хранилища) работают на нестандартном порту (отличном от 1540).

    Например, если вы используете порт 1640 и сервер хранилища у вас запускается на порту 1642, то в файле repository.1ccr нужно обязательно указать этот порт:

    <repository connectString=»tcp://pavel:1642«/>

    Я долго танцевал в попытках заставить работать сервер через веб, но пока не добавил порт, нифига не получалось.

    Reply
  25. MstrSa

    При подключении через http в локальной сети и также через из изтернета возникает ошибка:

    1C:Enterprise 8 application error:

    Ошибка выполнения запроса Ошибка при выполнении запроса GET к ресурсу :

    by reason:

    server_addr=tcp://srv-srads1 descr=10054(0x00002746): Удаленный хост принудительно разорвал существующее подключение. line=1584 file=srcDataExchangeTcpClientImpl.cpp

    Заметил, что при подключении к хранилищу перезагружается служба которая отвечает за веб хранилище:

    Служба 1C:Enterprise 8.3 Configuration Repository Server была неожиданно завершена. Это произошло 37 раз(а). Следующее корректирующее действие будет предпринято через 10000 мсек: Перезапуск службы.

    Может кто то сталкивался?

    Релиз 1с 8.3.9.2170, Apache 2.2.4, Windows Server 2008 R2

    Reply
  26. d.menyailov@ngslab.ru

    При установке на Apache 2.4 возникает ошибка:

    «Неклассифицированная ошибка работы с хранилищем конфигурации.

    по причине:

    Forbidden

    You don’t have permission to access /storage/storage.1ccr

    on this server.»

    В логах апача пишется следующее:

    ….AH01630: client denied by server configuration: E:/Repositary/

    Решение:

    В конфигурационный файл виртуального хоста в секцию <Directory /> необходимо добавить строку:

    Require all granted

    Reply
  27. krylovim

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

    Поясню вопрос:

    1. Есть 2 сервера хранилища — под разные версии платформы. (вертятся на 1542 и 1642 портах)

    2. Есть 2 файла .1ccr, в каждом из которых прописан доступ к каждому серверу

    Нужно только увязать каждый .1ccr файл с wsap2x.dll соответствующих версий.

    На iis такая конфигурация настраивается довольно просто с помощью webconfig, в котором создается handler для каждого .1ccr файла с привязкой к wsisapi.dll нужной версии.

    Как можно настроить httpd подобным образом?

    Reply
  28. Tangram

    Очень полезная тема. Практически каждое сообщение чем-то помогло.

    Но у меня вылезла ошибка, которая здесь еще не описывалась:

    После того как я указал правильные настройки Апача, появился доступ к хранилищу, хранилище ругнулось на разные версии платформы,

    вылезло такое простое:

    Ошибка соединения с хранилищем конфигурации по адресу:

    http://*.*.*.144/storage/storage-se.1ccr/trade

    и все.

    Ни в ЖР 1С, ни в логах апача ничего понятного нет.

    У апача в логе access такая строка:

    *.*.0.106 — — [04/Oct/2018:13:11:27 +0300] «POST /storage/storage-se.1ccr HTTP/1.1» 200 691

    Возможно где-то нет прав на запись в файл. Служба сервера хранилища стартует под USR1CV8, у него полные права на папку с хранилищем.

    Как лечить?

    P.S. и такая же точно ошибка при подключении с локальной машины через tcp

    Reply
  29. Tangram

    Добавлю еще: в Безопасности папки добавляю — Все — Полный доступ — тоже самое.

    Reply
  30. Tangram

    Предыдущие 2 поста решил (у службы 1с был неправильный путь к папке хранилища, а она работала и молчала), теперь другая напасть.

    По tcp с локальной машины соединяется, по http не хочет цепляться ни из сети, ни с локальной машины.

    Ошибка XML-протокола при работе с удаленным хранилищем конфигурации.

    по причине:

    Ошибка преобразования данных XML

    Reply
  31. Tangram

    по http хранилище заработало так (для Apache 2.2):

    # storage publication

    AddHandler 1cws-process .1ccr

    Alias /storage «E:/storage/»

    <Directory «E:/storage/»>

    AllowOverride All

    Options None

    Order allow,deny

    Allow from all

    DirectorySlash Off

    SetHandler 1cws-process

    </Directory>

    для Apache 2.4 могут быть другие настройки параметров.

    Reply
  32. IRLes

    (15) для apache 2.4 рабочий вариант такой


    LoadModule _1cws_module «C:/Program Files/1cv8/8.3.13.1644/bin/wsap24.dll»

    AddHandler 1cws-process .1ccr

    #1c publication

    Alias /storage «C:/www/REPOSITORY/»

    <Directory «C:/www/REPOSITORY/»>

    AllowOverride All

    DirectorySlash off

    Options None

    Require all granted

    SetHandler 1cws-process

    </Directory>

    Показать

    Reply
  33. IRLes

    (35) только в строке

    Alias /storage «C:/www/REPOSITORY/»

    нужно

    Alias /REPOSITORY «C:/www/REPOSITORY/»
    Reply

Leave a Comment

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