Взаимодействие платформы 1С 8.2 с системой ЭТРАН ОАО РЖД




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

94 Comments

  1. hogik

    Поясните, пожалуйста.

    Т.е. АСУ, реализованное на «1С 7.7», перестало существовать?

    Или решена задача «данные придется вбивать дважды» на стыке «ЭТРАН»-«1С 8.х», а в АСУ на «1С 7.7» данные вбиваются повторно?

    Или всё АСУ клиента переведено с «1С 7.7» на «1С 8.х»?

    Reply
  2. milanse

    (1) 7.7 существует и работает, новый функционал реализуется в 8.2 и постепенно переносится из 7.7 существующий.

    на счет двойного ввода — пока вбиваются повторно, сейчас пытаемся управление процессом отгрузки сделать в 8.2, попутно можно будет сделать импорт, либо экспорт документов в ЭТРАН

    Reply
  3. hogik

    (2)

    Переход на 8.х с 7.7 дело полезное и, думаю, неизбежное.

    Но заходить на этот переход со стороны «ЭТРАН» — смелое решение.

    Или хороший повод…

    Дело за малым — перевести всё остальное на 8.х. 😉

    Reply
  4. belchonokh

    Занимаюсь той же проблемой, однако нашим старым решением была именно работа через SOAP, задача стояла только в чтении накладных. При переходе на 1С встала проблема невозможности достучаться до веб-сервиса ЭТРАН, т.к. 1С не поддерживает работу с веб-сервисом через прокси сервер. Статья довольно полезная, но поскольку никогда не работал с DCOM не совсем понятно как это настраивать.

    >># На рабочем месте устанавливается COM объект компонента для доступа к ЭТРАН, настраиваются параметры доступа к ней через DCOM.

    где взять установщик? в документации к ЭТРАНу по этому поводу ничего не написано.

    >># На сервере 1С создается экземпляр DCOM объекта «EtranASUGO», с указанием, что объект будет «жить» на рабочем месте ЭТРАН.

    можно узнать поподробнее как это делается?

    желательно с примерами, хотелось бы конечно посмотреть на саму конфигурацию 🙂 , думаю в скором времени данная проблема будет актуальна не только для нас, но и по всей России.

    Reply
  5. milanse

    (3) Было интересно решить эту задачу и на половину ее решили.

    Reply
  6. milanse

    (4) Функция возвращающая COM для работы с ЭТРАН:

    Функция ПолучитьСоединенеиеЭтран() Экспорт
    СоединенеиеЭтран  = Новый COMОбъект(«EtranASUGO.EtranASUGO»,Константы.ждИмяКомпьютераЭТРАН.Получить());
    СоединенеиеЭтран.Connect(Константы.ждАдресСервераЭТРАН.Получить(),Константы.ждПользовательЭТРАН.Получить(),Константы.ждПарольЭТРАН.Получить());
    Возврат СоединенеиеЭтран;
    КонецФункции // ПолучитьСоединенеиеЭтран()
    
    

    А про COM объект узнал из документации, нашел случайно.

    Дело в том что компания разработчик ЭТРАН, продает свое решение для интеграции с АСУ грузоотправителя, собственно в РЖД на все вопросы об интеграции посылают к ним.

    Ну а вообще про DCOM наверное надо почитать на специализированных форумах, я в нем не силен.

    Reply
  7. belchonokh

    >>А про COM объект узнал из документации, нашел случайно.

    я про него давно знаю, а вот найти до сих пор не получилось, интернет по этому поводу молчит.

    Reply
  8. milanse

    (7) Думаю надо теребить РЖД, для работы в режиме АСУ-АСУ подписывается доп. соглашение, оно бесплатно, думаю копать нужно оттуда.

    Правда я этого соглашения не видел.

    Reply
  9. milanse

    В принципе, говорят что 8.2 работает и через SOAP, тогда немного меняется логика работы и обращаться к ЭТРАН нужно непосредственно с рабочего места.

    Reply
  10. $erg

    Присоединяюсь к (4)

    Reply
  11. belchonokh

    (10) Есть такая идея, самому написать некое подобие прокси-веб-сервиса, т.е. веб-сервис, который будет установлен на машине рабочего места ЭТРАН и будет редиректить запросы на сервис и отдавать ответы в 1С.

    Reply
  12. milanse

    (11) А в чем смысл этого сервиса будет ??? Выложить его в веб — очень опасно, а внутри сети COM объект самое то, в настройках безопасности можно ограничить доступ одним компьютером.

    И даже наличие веб сервисва не решает проблему взаимодействия с 1С.

    На одном из наших филиалов сделали на флексе форму для формирования и отправки заявок в этран — прекрасно работает, но опять же нет связи с корпоративной системой, в которой эти заявки уже вбиты менеджерами.

    Reply
  13. kanavo

    Здравствуйте, у меня стоит аналогичная задача по загрузке данных из Этрана в 1С 8.2 транспортной накладной, скажите могли бы вы помочь с написанием этого кода? Вся программа полностью нам не нужна, так как имеется самостоятельная программа со своим функционалом и нужна загрузка одного документа.

    Reply
  14. Awarder
    kanavo пишет:

    скажите могли бы вы помочь с написанием этого кода?

    Ну, допустим, это десяток строк кода — просто вызов COM-объекта. А дальше как вы собираетесь сапортить эту часть вашей конфигурации? Поделка Интелекса весьма специфична. Лично я потратил пару-тройку месяцев своей жизни на написание логики отработки _ошибок_ в выдаче из Этрана. А что собираетесь делать вы?

    kanavo пишет:

    Вся программа полностью нам не нужна, так как имеется самостоятельная программа со своим функционалом и нужна загрузка одного документа.

    Вы даже не понимаете что именно вам нужно =) Если вы убеждены, что просто выкачать накладную вам будет достаточно, то, как минимум, вы заблуждаетесь. Ибо выборку можно делать по внутреннему ID (а это просто порядковый номер сущности, а вам будет нужен именно ID накладной), плюс забавный механизм сторнирования и внесения правок (частенько забывают одновить дату изменения и изменять operID), ну и т.д. И как вы собираетесь объяснять клиенту странности работы конфигурации? =))

    Другими словами: дерзайте, вы молоды и энергичны =)

    Reply
  15. kanavo

    Согласна пока я плохо себе представляю как реально организовать выгрузку данных из Этрана. Ну а ваши предложения, стоимость?

    Reply
  16. reflexfx
    belchonokh пишет:

    Есть такая идея, самому написать некое подобие прокси-веб-сервиса, т.е. веб-сервис, который будет установлен на машине рабочего места ЭТРАН и будет редиректить запросы на сервис и отдавать ответы в 1С.

    если есть желание, могу предложить решение, позволяющие организовать шлюз а ЭТРАН(замена ASUGO интрефейса), работает с пулом запросом, можно распараллеливать запросы — все настраивается в конфиге. Со стороны клиента можно использовать прилагающуюся COM-DLL, использовать SOAP либо CLR Assembly для MSSQL сервера.

    Awarder пишет:

    Вы даже не понимаете что именно вам нужно =) Если вы убеждены, что просто выкачать накладную вам будет достаточно, то, как минимум, вы заблуждаетесь. Ибо выборку можно делать по внутреннему ID (а это просто порядковый номер сущности, а вам будет нужен именно ID накладной)

    Ошибаетесь, можно запрашивать данные и invoiceID и по invNumber(номер накладной) и по номеру вагона, причем ,повторюсь, в различных режимах —

    только прибытие, только отправление, все, валидные и т.д. А если уж хотите зрить в корень, то прикручивайте получение данных по списанию денег с ЕЛС и выкачивайте накладные, даже если будет сторно, то логика тут не трехэтажная…

    kanavo пишет:

    Согласна пока я плохо себе представляю как реально организовать выгрузку данных из Этрана. Ну а ваши предложения, стоимость?

    вопрос в какой момент времени вам нужна эта накладная, режим АСУ-АСУ предусматривает несколько вариантов и режимов запроса данных накладных.

    PS: если будут вопросы(по существу конечно) пишите в личку — постараюсь помочь.

    Reply
  17. reflexfx

    UP:

    хочу заметить, есть еще одни неприятные грабли — если посылать запросы в ЭТРАН через АСУГО или SOAP — не всегда возвращаются валидные xml….

    Reply
  18. belchonokh

    Не рабзобрался как отправить личку…

    reflexfx пишет:

    если есть желание, могу предложить решение, позволяющие организовать шлюз а ЭТРАН(замена ASUGO интрефейса), работает с пулом запросом, можно распараллеливать запросы — все настраивается в конфиге. Со стороны клиента можно использовать прилагающуюся COM-DLL, использовать SOAP либо CLR Assembly для MSSQL сервера.

    очень интересно, хотелось бы услышать стоимость, можно в личку =)

    Reply
  19. Awarder
    reflexfx пишет:

    Ошибаетесь, можно запрашивать данные и invoiceID и по invNumber(номер накладной) и по номеру вагона, причем ,повторюсь, в различных режимах —

    ок, есть invoiceID ‘A000001’, было сторнировано перед запросом 10 накладных. и? =) не помню как звучит отлуп (под рукой этрана нет) но что-то типа укажите точно что выбирать.. только список из чего выбирать не предлагает..

    belchonokh пишет:

    Есть такая идея, самому написать некое подобие прокси-веб-сервиса, т.е. веб-сервис, который будет установлен на машине рабочего места ЭТРАН и будет редиректить запросы на сервис и отдавать ответы в 1С.

    можно использовать любой портфорвардер.

    Reply
  20. Awarder

    господа, а где, собссна, у этрана soap шлюз находится? хочу спрыгнуть с com-объекта =)

    из доки:

    http://xxx.xxx.xxx.xxx:xxxx/EtranServer/EtranLR.dll/soap <- 404 not found

    http://xxx.xxx.xxx.xxx:xxxx/EtranServer/EtranLR.dll <- начинается закрузка длл =)

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

    Reply
  21. reflexfx
    Awarder пишет:

    ок, есть invoiceID ‘A000001’, было сторнировано перед запросом 10 накладных. и? =) не помню как звучит отлуп (под рукой этрана нет) но что-то типа укажите точно что выбирать.. только список из чего выбирать не предлагает..

    A000001 — такой нумерации нет, если что

    ответ на ваш вопрос — <useValid/>

    вопросы по поводу сотрудничества прошу присылать на reflex2[собака]list.ru

    Reply
  22. Awarder
    reflexfx пишет:

    A000001 — такой нумерации нет, если что

    есть — оффбоард порожняк.. ну это так, к слову =)

    Reply
  23. reflexfx
    Awarder пишет:

    есть — оффбоард порожняк.. ну это так, к слову =)

    Рекомендую почитать матчасть….

    <getInvoice version=»1.0″>
    <!— ID накладной —>
    <!— * тип данных: ЦЕЛОЕ ЧИСЛО —>
    <invoiceID value=»»/>
    <!— Номер накладной —>
    <!— * тип данных: строка (до 8 символов) —>
    <invNumber value=»»/>
    <!— Использование 6-значных кодов станций и грузов в ответе —>
    …..

    Показать

    Reply
  24. Awarder

    ну а что ж не почитать? =)

    reflexfx пишет:

    * тип данных: строка (до 8 символов)

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

    Reply
  25. reflexfx

    Послушайте… Вы приводите пример:


    ок, есть invoiceID ‘A000001’, …..

    так вот, в invNumber — хоть черта лысого рисуйте(тип строка), а я Вам ответил что invoiceID тип данных ЦЕЛОЕ ЧИСЛО. От Вас много претензий — читайте что пишите….могли бы поблагодарить за ответ на Ваш вопрос по поводу того как получить одну накладную вместо списка.

    Reply
  26. dvim

    Так все таки, где найти и у кого просить этот ASUGO ?

    Reply
  27. belchonokh

    (26) dvim, мы в итоге реализовали через протокол SOAP, всё шикарно работает, даже через прокси-сервер.

    Reply
  28. milanse

    (27) belchonokh, а прокси сервер каким боком тут ? Как у вас сервер 1С общается с компьютером на котором стоит рабочее место ЭТРАН ?

    (26) нужно трясти тех с кем заключали договор (скорее всего ваша дорога, ДЦФТО) и приложение о работе в режиме АСУ-АСУ. У рждшников есть и дока и приложение для взаимодействия. Но так как у разработчика системы (Интелекс со товарищи) есть своя разработка для работы в режиме АСУ-АСУ, то рждники продвигают ее, может быть имеют с этого что-то, а может просто ничего не понимают.

    Reply
  29. milanse

    (19) Awarder, видимо имеется ввиду Номер накладной

    не

    >>ок, есть invoiceID ‘A000001’

    а

    ок, есть invNumber ‘A000001’

    тогда на самом деле надо выбрать useValid

    А вообще запросы сделаны просто и логично, за исключением пары моментов с получения статусов документов 😉

    Reply
  30. dvim

    Пример какой нибудь на SOAP eсть?

    Я правильно понимаю, что этот код надо будет запускать на компьютере с Этраном?.

    Просто пока только подходим к этой задаче.

    Reply
  31. Awarder

    логично спроектировано начало, нелогично местами работает =)

    а насчет соапа — ну не знаю, у меня точка входа не работает, приходится через ком-объект =(

    Reply
  32. milanse

    (31) Awarder, попробуй дельфевым соапом, может он работает, потому как етран на дельфе или Цбилдере.

    Reply
  33. Awarder

    (32)

    у меня по дефолтному пути длл выгружается =) тут не принципиально чем обращаться

    Reply
  34. belchonokh

    (28) на рабочем месте с ЭТРАНом стоит прокси (потому как ставить VipNet на сервер 1С равносильно самоубийству сервера), сервер соответственно посылает запрос на прокси, он перенаправляет в сеть VPN и возвращает ответ в виде XML запроса, запросы проходят по регламентному заданию по расписанию.

    (33) Awarder, у них для АСУ-АСУ отдельный сервер, на котором по данному пути возвращается описание, правда у нас не на всех компьютерах оно возвращалось, на некоторых так же сохранялась dll (не знаю от чего это зависит), но всё равно работает на всех компьютерах.

    Про протокол SOAP. Штатный формат 1С (WS-ссылки) не работает, в виду я так понимаю не полной поддержки всех форматов SOAP.А если подумать, SOAP — это всего лишь надстройка над протоколом HTML (в сети есть описание стандарта, формат сообщений и заголовков). Т.е. нужно просто слать сообщения в формате XML через HTTP. Поначалу мы хотели выкрутиться штатными средствами 1С, есть там HTTP-соединение или что-то в этом духе, но там нашелся глюк, либо фитча, в 1С http-запрос не дает формировать строку заголовка с двумя двоеточиями в ней, несмотря на то, что второе двоеточие используется уже в кавычках. В общем взяли COM объект входящий в windows и организующий такой же http-запрос только без лишних заморочек и проверок. Формат посылаемых сообщений на сервер приложений подсмотрели (правильно подсказывают) у Delphi. Дальше реализовали нужные сообщения по той документации, что предоставили в РЖД. Я к чему это рассказываю, возможно из-за той разработки, которую продвигают рждшники, возможно по незнанию, но нам сказали, что у нас ничего не выйдет, что доступ АСУ-АСУ работает только с их разработкой, очень неохотно давали нам адреса серверов АСУ-АСУ. Вот и хочется сказать, всё отлично работает!!! Пусть 1С конфигураций работающих напрямую с ЭТРАНом будет больше, описанная выше технология отлично работает! Их дорогая и тяжеловесная разработка никому не нужна, зачем иметь ещё одну прокладку между системами, если можно всё хранить прямо 1С-ке.

    Reply
  35. Awarder

    (34) belchonokh,

    а адреса серверов (и пути) подсказать можете? (если я правильно понимаю закладка туннель в «сервер шлюз этран»)

    Reply
  36. serhenry
    belchonokh пишет:

    В общем взяли COM объект входящий в windows и организующий такой же http-запрос только без лишних заморочек и проверок

    Расскажите по подробней что за объект????

    Reply
  37. belchonokh

    (36) serhenry, COMОбъект(«Microsoft.XMLHTTP») — это для windows 7 или Server 2008, как пользоваться в сети есть, например _http://forum.infostart.ru/forum14/topic30957/

    (35) Awarder, насколько я помню, закладка туннель, там где надо галку ставить «использовать виртуальный адреса», сам адрес требуйте у дороги, если вы платите по договору за АСУ-АСУ, то вам должны дать этот адрес (мы его долго пытались получить, в итоге нам дали телефон некоего программиста в РЖД, который знает вообще знает, что есть такие адреса, кстати с удивлением обнаружили что этот адрес уже был забит в VipNet параллельно с основным, так что можете попробовать проверить все адреса, которые там забиты).

    Reply
  38. belchonokh

    (35) Awarder, пути уже давали выше, http://xxx.xxx.xxx.xxx:xxxx/EtranServer/EtranLR.dll/soap

    Reply
  39. serhenry

    Спасибо за ответ, очень помог (37).

    Только не совсем понятно про формат посылаемых сообщений на сервер приложений, как это посмотреть????

    belchonokh пишет:

    Формат посылаемых сообщений на сервер приложений подсмотрели (правильно подсказывают) у Delphi
    Reply
  40. reflexfx

    (39) serhenry, формат сообщений соответствует стандарту SOAP 1.1

    вы можете использовать SOAPToolkit (правда Microsoft прекратил его поддержку из-за введения WCF )

    Сервис = Новый COMОбъект(«MSSOAP.SoapClient30»);

    Сервис.MSSoapInit(«ТУТ URL Сервера ЭТРАН»);

    …….

    Если этот вариант не устраивает, то можете взять за основу «Microsoft.XMLHTTP», в этом случае описание стандарта SOAP есть тут и тут

    belchonokh пишет:

    А если подумать, SOAP — это всего лишь надстройка над протоколом HTML (в сети есть описание стандарта, формат сообщений и заголовков)

    При всем уважении, протокола HTML нет, это стандарт. А вот SOAP считается протоколом, хотя с сильной натяжкой, я бы отнес его к стандарту вызова удаленных процедур или функций(RPCRFC) поверх транспорта (как то HTTP, HTTPS, SMTP и т.д.)

    belchonokh пишет:

    закладка туннель, там где надо галку ставить «использовать виртуальный адреса»

    Должно работать и с тунелированием и без.

    Еще раз повторюсь, коллеги, при использовании SOAP проверяйте все ли ответы корректные, сталкивался с тем что приходящий XML соержит левые спецсимволы, из-за которых xml-документ становится не валидным для парсера.

    Reply
  41. belchonokh

    (39) serhenry, нужно написать простейшую программку на Delphi, которая используя метод GetBlock отправляет какой-нибудь простейший запрос (по документации к ЭТРАН) и куда-нибудь выводит ответ. Затем берете отладчик и проваливаетесь глубоко в модули Delphi, где на низком уровне формируется заголовок и само сообщение в XML, смотрите в отладчике содержимое этих переменных и в 1С формируете всё то же самое (у нас на разбор ушло около двух дней)

    P.S. Кодом не помогу, коммерческая тайна как-никак, итак много рассказал =)

    Reply
  42. belchonokh

    (40) reflexfx,

    reflexfx пишет:

    При всем уважении, протокола HTML нет, это стандарт

    Извиняюсь, опечатался, имел ввиду именно http

    reflexfx пишет:

    Еще раз повторюсь, коллеги, при использовании SOAP проверяйте все ли ответы корректные, сталкивался с тем что приходящий XML соержит левые спецсимволы, из-за которых xml-документ становится не валидным для парсера

    Подтверждаю, приходится в приходящей строке пройтись СтрЗаменить, иначе парсер сыпет ошибками, правда сталкивались только на нескольких справочниках, как мне показалось в значениях полей этих справочников.

    Reply
  43. reflexfx

    (41) belchonokh,

    что же секретно в реализации SOAP over HTTP и куске кода выдранном из VCL?

    (39) serhenry,

    вот ссылка на подробное описание SOAP HTTP Binding

    Reply
  44. reflexfx
    belchonokh пишет:

    Подтверждаю, приходится в приходящей строке пройтись СтрЗаменить, иначе парсер сыпет ошибками, правда сталкивались только на нескольких справочниках, как мне показалось в значениях полей этих справочников.

    Не только при запросе справочников, частенько происходит при запросе данных накладных и заявок на перевозку.

    Reply
  45. serhenry

    (43) reflexfx, (41) belchonokh, благодарю, огромное спасибо очень помогли 😉

    Reply
  46. Awarder

    (38) belchonokh,

    404 — not found..

    можете сказать адрес на другом конце тунеля?

    Reply
  47. belchonokh

    (46) Awarder, постараюсь посмотреть, а так требуйте от РЖД, если у вас заключен договор АСУ-АСУ вам обязаны его предоставить, а если не заключен, то у вас туда не будет доступа, скорее всего будет NOT FOUND (это моё предположение)

    Reply
  48. dvim

    Самая большая проблема -учтите саппорт любого АСУ АСУ сильно платный у РЖД.

    Стоимость ~ 28 тыс в мес.

    Для нас стало неожиданным — процесс затормозился.

    Часть руководителей считает, что «андроида» нанять дешевле

    Reply
  49. Diversus

    (2) Скажите пожалуйста, каковы успехи с данной разработкой?

    Тоже поставили подобную задачу, нужно пару отчетов по ЭТРАН что погрузили, когда, дата и время прибытия на станцию, время подачи и сколько осталось погрузить вагонов.

    Т.е. данный отчет это объединение данных по накладным, заявки на перевозку и ведомости подачи/уборки.

    Не могли бы Вы показать Вашу реализацию или подсказать куда копать.

    Спасибо.

    Reply
  50. dvim

    Первое куда копать — согласовать 30 тыс/мес … (У нас с этим встали проблемы. Андроида нанять дешевле, по крайней мере пока)

    Второе — в ИВЦ дают ASUGO + примеры запросов.

    Далее берем и пишем.

    Reply
  51. Diversus

    +(2) ну и конечно было бы здорово иметь пример подключения и работы с ЭТРАН в 1С.

    Reply
  52. Diversus

    (51) А 30 тыс/мес это за что? Просто у нас уже есть ЭТРАН и в нем работает 3 пользователя. Просто хотят отчет по вагонам.

    Второе — в ИВЦ дают ASUGO + примеры запросов.

    А вот это уже интересней. Если программа уже стоит, где взять?

    Reply
  53. milanse

    (52) для доступа в режиме асу-асу необходимо дополнительное рабочее место, такое рабочее место стоит 30 т. в месяц.

    Взять у тех, с кем договор на рабочее заключите (ваша дорога, видимо)

    Reply
  54. dvim

    У нас тоже есть …

    За саппорт именно АСУ АСУ режима.

    У меня тема и провисла ибо было рассчитано, что за нанятый за половину суммы андроид выгрузит в Ексель за 2-3 часа все необходимые данные,а далее — скриптом закачиваем в Конфу.

    Просто совет — сначала согласовать сумму , а потом уже думать о технике

    Reply
  55. Diversus

    (53)(54) Понял, спасибо.

    Думаю, может тоже через Excell?

    Reply
  56. dvim

    Тут выбор простой — либо «по правилам», но за большие деньги.

    Либо — криво, но бесплатно.

    Слышал про 3 вариант- программу, которая достает и экспортирую данные из «памяти» клиента этрана.

    Но по ней — данных нет

    Reply
  57. Starikova

    Интересует опыт внедрения данного продукта для промышленного предприятия с оборотом вагонов от 400 шт в месяц. Требуется возможность отслеживания через Этран отправленных в наш адрес вагонов, контроль операций в местах обработки вагонов и, особенно, контроль штрафов за простои и определение виновников данных простоев.

    Reply
  58. dvim

    Какого данного?.

    Здесь обсуждается технология общения с АСУ АСУ.

    Это технология позволяет привязать данные Этран к ВАШЕЙ системе

    Продуктов я знаю 2. Первый это интеллексовский (от самих разработчиков Этрана). Цена у него большая, функционал широкий, но подробно я я его не рассматривал.

    Второй — вот. Ни разу не реклама . цена у конфы приемлемая, судя по описанию и функционалу — все вполне внедряемо.

    Нас остановило (надеюсь временно) необходимость тратить 30тыс/мес за сам обмен. Дорого это — и не так просто согласуется. Советую начать с этого вопроса, а не наоборот (может впустую работа быть).

    Reply
  59. dvim

    Ps

    Сама интеграция с этраном есть у многих крупных компаний и перевозчиков.

    Reply
  60. reflexfx

    (57) Starikova, День добрый!

    Вы уверены что Вам нужен именно ЭТРАН, данных АСОУП не будет достаточно?

    Если у Вас средний оборот 400 вагонов — то по затратам это будет гараздо выгоднее чем платить за АСУ-АСУ(правда провозной платы в этих данных не будет, НО если нужны деньги, то всегда есть возможность обратиться в ГВЦ и заключить договор на САО(система абонентского обслуживания, они настроят для вас формирование и передачу данных по отправкам и прибытию вагонов в ваш адрес) ).

    Контроль операций в местах обработки вагонов — чем вам поможет ЭТРАН в этом вопросе?

    Reply
  61. dvim

    АСОУП — это слежение. У него кстати много альтернативных поставщиков (техноцентр, гдевагон)

    В нем — данные по движению вагонов и поездов.

    в Этране же данные по финансовым расчетам с РЖД

    Reply
  62. reflexfx

    (61) dvim, информацией из АСОУП, бесспорно, торгуют все кому не лень(даже я:)).

    Требуется возможность отслеживания через Этран отправленных в наш адрес вагонов, контроль операций в местах обработки вагонов и, особенно, контроль штрафов за простои и определение виновников данных простоев.

    Эту задачу можно решать по разному, а по скольку вводных для понимания ситуации мало, то предложил варианты,

    а именно:

    АСОУП(автоматизированная система оперативного управления парком) — если штрафы рассчитываются по условиям договоров с экспедиторами, то этих данных достаточно, подходы есть, определение простоев в пути(и причин этих простоев) можно реализовать.

    САО — система ГВЦ для получения не только оперативных данных, но и данных по отправкам(основной минимум реквизитов из накладной с суммами), только в этом случае вы не платите фиксировано 25-30т.р., а платите только за объем переданной вам информации.

    Reply
  63. milanse

    информацию по финансовым расчетам мы берем в ЦФТО — оригиналы счетов фактур, и их копии в электронном виде. Ну и все начисления попавшие в расчет.

    ЭТРАН по сути документооборот — согласование, изменение статусов, факты отправки, раскредитации.

    У нас, например, 1 ЕЛС и несколько филиалов. Накопительные ведомости согласуются в 1С (потому как филиалы их не видят), а потом эти статусы переносятся в ЭТРАН.

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

    Ну и побочный продукт это возможность видеть историю движения вагонов, потому как данные отправлений/прибытий из АСОУП мягко говоря не очень достоверны. Я сам обработкой этих данных не занимаюсь, но сверял загруженный результат с данными ЭТРАН — не все совпадает.

    Reply
  64. reflexfx

    (63)

    потому как данные отправлений/прибытий из АСОУП мягко говоря не очень достоверны. Я сам обработкой этих данных не занимаюсь, но сверял загруженный результат с данными ЭТРАН — не все совпадает.

    Я бы сказал наоборот — АСОУП как раз таки показывает самую реальную картинку движения вагонов, это один из китов РЖД(и вагон в 99.9% случаев не сдвинется с места без отражения соответствующего макета в базе дорог), а ЭТРАН показывает искаженные данные по движению(Вы верно заметили —

    ЭТРАН по сути документооборот

    ).

    Reply
  65. dvim

    Расскажите подробней о САО а то вообще о нем ничего не знаю.

    Там есть расход на 1 вагон в поезде (групповой отправке) ?

    Reply
  66. reflexfx

    (65) dvim, для примера информация из сао



    Screenshot

    Накладная + Вагон + Тариф

    Reply
  67. milanse

    (65) dvim, ну не знаю, деньги вам выставляются на основании данных ЭТРАН. Может быть у нас не полные данные по отправлениям/прибытиям (очень может быть) но построить по ним картину движения вагона затруднительно. Не редка картина: есть отправка — нет прибытия, есть прибытие — нет отправки. В общем не слабо матерятся диспетчера, когда делают отчеты по груженым отправкам и сверяют с данными которые показывают филиалы.

    Reply
  68. folegv

    milanse, как связаться с вами по интеграции с этран

    Reply
  69. milanse

    (64) reflexfx, Можно говорить наоборот, но у меня из наших данных по отправлениям и прибытиям не удалось построить картины движения. То есть только отправления, то есть только прибытия, то кадого по 2-3-4-5 раз, а иногда в ЭТРАН есть накладная а в данных гвц нет, если это называется 99.9, то я извиняюсь.

    Reply
  70. reflexfx

    (69)

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

    не очень понял про картину движения по данным отправления и прибытия, имхо картину движения нужно по данным АСОУП строить.

    То есть только отправления, то есть только прибытия, то кадого по 2-3-4-5 раз, а иногда в ЭТРАН есть накладная а в данных гвц нет, если это называется 99.9, то я извиняюсь.

    Есть отправления и нет прибытия — такие случаи возможны, в любой ИС есть огрехи. Я свожу два источника отпрприб + данные ЭТРАН чтобы снизить вероятность ошибки. Про 2-3-4-5 — там есть вполне объяснимая логика — какие то записи корректировочные(уточни у поставщика). А вот про отсутствие и наличие данных в том или ином источнике можно говорить долго, например это неправильное оформление накладных через АСУ-АСУ, например, в накладной указано правильно ОКПО и правильное наименование получателя(для случая если в твой адрес идут вагоны и в контексте видимости накладной ты являешься только получателем) а ИД организации пустое т.е. не выбрано из ПУЖТ, то в этом случае накладной ты не увидишь. И опять же эти данные только для фин.расчетов. А для движения использую данные АСОУП и ничего более — диспетчер должен видеть реальную картину положения вещей.

    Reply
  71. dvim

    Вопрос всем.

    С чтением данных — разобрались. Из нюансов — XML разьирать лучше руками, он не всегда валидный с точки зрения XML

    Но у нас проблемы с записью

    Возвращается ошибка

    «Количество контейнеров должно соответствовать планируемому количеству контейнеров !»

    Хотя — все совпадает…

    Reply
  72. belchonokh

    (71) Для того что бы XML стал валидным нужно со стокой XML сделать следующее (установлено экспериментально):

    Если СтрДанныеРазбора <> «» Тогда
    СтрДанныеРазбора = СтрЗаменить(СтрДанныеРазбора, «& #28;», » «);//Убрать пробел между & # — не дает напечатать сайт
    СтрДанныеРазбора = СтрЗаменить(СтрДанныеРазбора, «& #2;», » «);
    Возврат СтрДанныеРазбора;
    Иначе
    Возврат «Ошибка»;
    КонецЕсли; 

    После этого работает метод

    ЧтениеXML = Новый ЧтениеXML;
    Попытка
    ЧтениеXML.УстановитьСтроку(СтрДанныеРазбора);
    Исключение
    Возврат;
    КонецПопытки;
    
    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

    После этого можно пользоваться конструкциями типа

    ОбъБД = ЖдНакладная.ПолучитьОбъект();
    ОбъБД.invoiceID = ОбъектXDTO.invoiceID.value;

    Теперь по поводу планируемого количества, в документации сказано, что если не указывать, оно будет равно фактическому. Возможно у Вас указан не верный тип накладной. Единственное что я нашел у себя про планирование так это типы контейнеров (надеюсь поможет):

    // Форматная xml-строка для получения списка накладных.
    НакладнаяЖД = Обработки.ЭТР_ЗагрузкаНакладных.ПолучитьМакет(«XMLinvoiceDirectLoad»).ПолучитьТекст();
    
    
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%frontEndId%»,Формат(ЖдНакладная.Номер, «ЧГ=0″) );
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invTypeID%»,»1″); //НакладнаяНаПогрузку
    
    Если ЖдНакладная.invCont.Количество() > 0 Тогда
    
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invSendKindID%»,»8″); //Контейнера комплектом на вагон
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invPlanContTonnage%»,Формат(ЖдНакладная.invCont[0].contTonnage.TONNAGE, «ЧГ=0″)); //Контейнера
    
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invContPlanSizeBig%»,Формат(ЖдНакладная.invCont[0].contSizeBig.CODE, «ЧГ=0″)); //Контейнера
    
    ИначеЕсли ЖдНакладная.invCar.Количество() > 1 Тогда
    
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invSendKindID%»,»4″); //Групповая
    
    Иначе
    
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invSendKindID%»,»1″); //Повагонная
    
    КонецЕсли;
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invPlanContTonnage%»,»»); //Повагонная
    НакладнаяЖД = СтрЗаменить(НакладнаяЖД,»%invContPlanSizeBig%», «»);
    

    Показать

    Reply
  73. dvim

    У вас — чтение накладной. С этим проблем никаких нет.

    Проблемы с попыткой записать в Этран свою накладную .

    Количество — совпадает, заявка по которой формируем действующая…

    Reply
  74. JetBrain

    Добрый день.

    на текущий момент данный пост еще актуален? запрос возвращает «иероглифы», может кто пример скинуть отправки и возврата xml? сейчас делаю так:

    QueryFileName = GetTempFileName();

    RecordObject = New XMLWriter;

    XMLWriterSettings = New XMLWriterSettings(«windows-1251», , False);

    RecordObject.OpenFile(QueryFileName, XMLWriterSettings);

    RecordObject.WriteXMLDeclaration();

    RecordObject.WriteStartElement(«getNSI»);

    RecordObject.WriteAttribute(«version», «1.0»);

    RecordObject.WriteStartElement(«tableName»);

    RecordObject.WriteAttribute(«value», «DF_DANGER»);

    RecordObject.WriteEndElement(); //tableName

    RecordObject.WriteEndElement(); //getNSI

    RecordObject.Close();

    SoapClient = Новый COMОбъект(«mssoap.SoapClient»);

    SoapClient.MSSOAPInit(«http://ххххх:ххххх@10.248.35.9:8092/EtranServer/EtranHttpSrvr.dll»,»IEtranSysservice»,»IEtranSysPort»);

    ResultFile = GetTempFileName();

    ResultFile = SoapClient.GetBlock(«ххххх», «ххххх», QueryFileName);

    ЧтениеXML = Новый ЧтениеXML;

    ЧтениеXML.ОткрытьФайл(ResultFile);

    Пока ЧтениеXML.Прочитать() Цикл

    Сообщить(ЧтениеXML.Значение);

    КонецЦикла;

    ЧтениеXML.Закрыть();

    SoapClient = Undefined;

    Reply
  75. batyrkin

    Господа, подскажите, как же все таки сделать так, чтоб можно было с сервера 1С отправлять запросы на машину с установленным EtranASUGO и VipNet-ом?

    Если запускать как то так:

    Функция ПолучитьСоединенеиеЭтран() Экспорт
    СоединенеиеЭтран     = Новый COMОбъект(«EtranASUGO.EtranASUGO»,Константы.ждИмяКомпьютераЭТРАН.Получить());
    СоединенеиеЭтран.Connect(ждАдресСервераЭТРАН,ждПользовательЭТРАН,ждПарольЭТРАН);
    Возврат СоединенеиеЭтран;
    КонецФункции // ПолучитьСоединенеиеЭтран()

    непосредственно с клиента (машины с VipNet-ом), то все работает. А вот как сделать чтоб запрос с сервера 1С уходил на другой комп с VipNet-ом, там выполнялся и возвращался результат обратно на сервер 1С — не понимаю. Как (чем)запрос можно отредиректить?

    Reply
  76. belchonokh

    (74) st-ty@ngs.ru, Я работаю с ЭТРАНом через другой объект

    // С помощью COM-объекта создать соединение с веб-сервисом ЭТРАН.

    WinHttp = Новый COMОбъект(«Microsoft.XMLHTTP»);

    WinHttp.Open(«POST», СокрЛП(Константы.ЭТР_АдресВебСервиса.Получить()), 0);

    WinHttp.SetRequestHeader(«Accept-Language», «ru»);

    WinHttp.setRequestHeader(«Content-Language», «ru»);

    WinHttp.SetRequestHeader(«Accept-Charset»,»UTF-8″);

    WinHttp.setRequestHeader(«SOAPAction», «»»urn:SysEtranInt»»»);

    WinHttp.setRequestHeader(«Content-Type»,»text/xml; charset=UTF-8″);

    // Запрос, отправляемый веб-сервису с параметрами, заданными переданным параметром. Данные для авторизации — из констант.

    Запрос = «<?xml version=»»1.0″»?>

    | <SOAP-ENV:Envelope xmlns:SOAP-ENV=»»http://schemas.xmlsoap.org/soap/envelope/»» xmlns:xsd=»»http://www.w3.org/2001/XMLSchema»» xmlns:xsi=»»http://www.w3.org/2001/XMLSchema-instance»» xmlns:SOAP-ENC=»»http://schemas.xmlsoap.org/soap/encoding/»»>

    | <SOAP-ENV:Body SOAP-ENV:encodingStyle=»»http://schemas.xmlsoap.org/soap/encoding/»»>

    | <NS1:GetBlock xmlns:NS1=»»SysEtranInt»»>

    | <Login xsi:type=»»xsd:string»»>» + СокрЛП(Константы.ЭТР_Пользователь.Получить()) + «</Login>

    | <Password xsi:type=»»xsd:string»»>» + СокрЛП(Константы.ЭТР_ПарольПользователя.Получить()) + «</Password>

    | <Text xsi:type=»»xsd:string»»> »

    + ЗапросПараметр + »

    | </Text>

    | <ECP xsi:type=»»xsd:string»»></ECP>

    | <TSP xsi:type=»»xsd:string»»></TSP>

    | </NS1:GetBlock>

    | </SOAP-ENV:Body>

    |</SOAP-ENV:Envelope>»;

    WinHttp.Send(Запрос);// Параметром передать POST-данные веб-сервису.

    // Получен ответ — забрать из него строку ответа.

    ЧтениеXML = Новый ЧтениеXML;

    Тхт = WinHttp.ResponseText();

    ЧтениеXML.УстановитьСтроку(Тхт);

    (75) batyrkin, сначала я использовал прокси-сервер (3proxy), запрос уходил и возвращался нормально, потом мне сказали что это не хорошо с точки зрения безопасности, сейчас у меня на машине с VipNetом заданием запускается 1С-ка от имени другого пользователя (что бы не было видно на экране, а-ля служба), задания на загрузку-выгрузку из ЭТРАНа лежат в регистре, считываем, отправляем, получаем.

    Reply
  77. belchonokh

    (73) dvim, у меня тоже запись, планируемое количество контейнеров мы не отправляем, ЭТРАН сам считает и возвращает в записанной накладной.

    Reply
  78. sir

    (76) belchonokh, Большой респект , как раз искал как XMLHTTP запрос сделать и тут ты :))

    У меня вопрос, такой запрос только с машины где защищенный канал настроен прокатит или можно пытаться с любой ?

    П.С.

    ЗапросПараметр = »

    |<getInvoice version=»»1.0″»>

    |<invNumber value=»»910105″»

    |<useMod11/>

    |</getInvoice>»;

    такой делаю.

    Reply
  79. belchonokh

    (78) sir, если не настроен прокси на защищенной машине, то прокатит только на той машине. Если настроен прокси на той машине, достаточно в IE настроить использование этого прокси, и ком объект будет сам через него работать.

    П.С. Запрос правильный =).

    Reply
  80. sir

    (79) belchonokh, ясн, спс.

    а вот еще вопрос — Урл правильный какой будет

    вида «http://ххх.ххх.ххх.ххх:ххххх@10.32.0.112:8092/EtranServer/EtranLR.dll/soap»

    или «http://ххх.ххх.ххх.ххх:ххххх/EtranServer/EtranLR.dll/soap»

    Reply
  81. belchonokh

    (80) sir, у нас используется такой http://ххх.ххх.ххх.ххх:ххххх/EtranServer/EtranLR.dll/soap

    Reply
  82. sir

    Не хочет почему то работать :

    » Ошибка при вызове метода контекста (send): Произошла исключительная ситуация (msxml3.dll): Системная ошибка: -2146697211.» (

    Reply
  83. belchonokh

    (82) Скорее всего у вас недоступен адрес, попробуйте в браузере набрать http://ххх.ххх.ххх.ххх:ххххх/EtranServer/EtranLR.dll — даёт скачать ДЛЛ ?

    Reply
  84. sir

    (83) belchonokh, похоже, пишет «соединение закрыто удаленным сервером».

    Reply
  85. belchonokh

    (84) sir, нужно помнить, что адрес куда цепляется клиент и адрес для АСУ-АСУ — ЭТО РАЗНЫЕ адреса. На сервере клиента скорее всего доступ закрыт. Требуйте адрес для АСУ-АСУ от РЖД, деньги то немалые берут за подключение.

    Reply
  86. dvim
    А вот как сделать чтоб запрос с сервера 1С уходил на другой комп с VipNet-ом, там выполнялся и возвращался

    Мы просто поставили на комп с VipNet IIS и сделали прослойку, которая публикует методы Этрана в локальную сеть.

    Reply
  87. milanse

    (85) belchonokh, http прокси (free proxy, например) поставил и норм. В принципе сом объект это и делает, объект создается на машине с этраном, а работаешь ты с ним как с локальным объектом.

    Reply
  88. admin@gerkules.ru

    Ребята подскажите у кого-нибудь работает система выгрузки данных этрана в 1с?

    Reply
  89. Программе

    Добрый день, как можно получить модуль? Как можно узнать на что он на текущий момент способен? Можно ли связаться с разработчиком на прямую? Сколько стоит?

    Reply
  90. milanse

    (89) Добрый, на распространение и поддержку не имеется времени.

    Reply
  91. gradi

    Данные о дислокации вагонов можно через ЭТРАН получать?

    Reply
  92. milanse

    (91) Нет, ЭТРАН для работы с документами и ЭП, сейчас хотят даже получение базовой НСИ о вагонах сделать платным. Дислокацию много кто другой дает получать )

    Reply
  93. dvim

    «у кого-нибудь работает система выгрузки данных этрана в 1с» — работает, только код на C# а не на 1С.

    При этом работает не только выгрузка, но и создание накладных на УКП ( на формирование целого поезда)

    По дислокации полно предложений. Если платформы постоянные, то 100-200 руб/ мес, либо по 5-8 руб в сутки.

    Reply
  94. milanse

    (93) На 1с тоже все прекрасно работает и создание накладных и заявок и подписание эп.

    Reply

Leave a Comment

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