Взаимодействие платформы 1С 8.2 с системой ЭТРАН ОАО РЖД
Функциональные - Документооборот и делопроизводство (СЭД)
Что такое ЭТРАН
Начнем с того что же такое ЭТРАН (электронная транспортная накладная). Это система безбумажного документооборота между ОАО РЖД и ее контрагентами (грузоотправители, грузополучатели, экспедиторы...). РЖД довольно активно продвигает систему и в настоящий момент многие организации активно ее используют.
Для клиента ЭТРАН это рабочее место в окне браузера, подключенное по впн каналу к серверу РЖД. В системе можно формировать и корректировать заявки на перевозку, накладные и совершать другие операции. При наличии цифровой подписи можно работать действительно без использования бумажных документов, либо свести их к минимуму.
Взаимодействие в режиме АСУ-АСУ
Если у клиента есть своя АСУ, то при наличии еще и ЭТРАН, данные придется вбивать дважды - сначала а свою систему, потом в ЭТРАН, либо наоборот. Для облегчения взаимодействия система ЭТРАН предоставляет программный доступ к своим данным в режиме АСУ-АСУ. Остановимся на этом поподробнее.
Так как ЭТРАН построена на базе веб технологий, то доступ предоставляется посредством SOAP запросов к web сервису. В документации описано 2 способа подключения к web сервису:
- прямые SOAP запросы;
- работа через обертку - COM объект предоставляющий интерфейс для выполнения запросов.
Видимо разработчики системы неспроста предоставили 2 способа, потому что с первым у меня ничего не получилось. Не буду здесь описывать мои мучения, но скажу, что представления о SOAP у borland и microsoft разные ;).
Что мы имеем
АСУ построенная на базе платформы 7.7 (в своем далеком прошлом комплексная конфигурация)
десяток филиалов работающих в этой системе
механизм передачи и консолидации данных в управлении
необходимость переход от оформления бумажных накладных к работе с ЭТРАН
Что хочется видеть
Распределенную систему
Желательно доступ филиалов через web к общим данным
Обмен данными с системой ЭТРАН
Переходим на новые технологии
После ознакомления с возможностями платформы 1С 8.2, стало понятно, что это как раз то что нам нужно. Было принято решение о заморозке разработки в семерке и постепенном переносе функционала на 8.2. Попробовать как работает 8.2 решил на куске взаимодействия с системой ЭТРАН.
Итак, для взаимодействия в режиме АСУ-АСУ ЭТРАН предоставляет COM объект, принимающий запросы и возвращающий результат в синхронном режиме. Так как рабочее место подключено к ЭТРАН через VPN, то доступ к ней (для пущей безопасности) желательно осуществлять с этого рабочего места. Я не сильно знаком с технологиями COM, но то что существует DCOM знаю, и, даже, занимался разработкой библиотеки которая такой доступ предоставляет, поэтому сразу стало понятно как достучаться до рабочего места ЭТРАН через локальную сеть.
Как получилось
Общая схема работы механизма доступа к системе ЭТРАН:
- От рабочего места ЭТРАН до сервера поднимается VPN канал.
- На рабочем месте устанавливается COM объект компонента для доступа к ЭТРАН, настраиваются параметры доступа к ней через DCOM.
- На сервере 1С создается экземпляр DCOM объекта "EtranASUGO", с указанием, что объект будет "жить" на рабочем месте ЭТРАН.
- Посылаем запросы и получаем ответы от объекта EtranASUGO.
Кратко о программной реализации.
Программно все это реализовано в виде конфигурации на платформе 1С 8.2. Созданы объекты метаданных, для отображения предоставляемых системой ЭТРАН данных:
- документы "Заявка", "Накладная", "Акт общей формы", "Ведомость подачи-уборки", "Накопительная ведомость";
- справочники "Вагоны", "Контрагенты", "Станции", прочая НСИ;
- перечисления;
Реализован набор процедур для загрузки данных из системы ЭТРАН. Система позволяет запрашивать данные документов измененных за определенный период. Таким образом можно получать и поддерживать в актуальном состоянии все документы к которым у вас есть доступ. Вместе с документами по ссылкам загружаются и обновляются справочники (НСИ в терминах системы ЭТРАН)
Загрузка данных идет в фоне через механизм регламентных заданий.
COM объект создается в серверной процедуре в модуле с флажком "Повторное использование возвращаемых значений" - "На время сеанса". Таким образом отпадает необходимость создания объекта при каждом обращении к системе ЭТРАН.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Бухгалтер Пользователь Руководитель проекта 1С:Предприятие 8 Управленческий учет Платные (руб)
Организуйте правильный оборот документов на вашем предприятии в 1С. Ведение учета и хранения документов. Управление потоками документации между подразделениями. Работа с договорами в компании. Автоматизация процессов подготовки, согласования и подписания документов. Сократите время и объем ошибок с 1С:Документооборот! Покупайте в Инфостарт и получайте 15% бонусов на наши услуги, сервисы и мероприятия!
63100 руб.
19.02.2016 116441 169 5
Внешние источники данных Разработчик Аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)
Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.
35000 руб.
15.11.2022 33785 53 49
1С:Предприятие 8 Платные (руб)
"1С:Архив" – это универсальная система для надежного долговременного хранения документов с гарантией юридической значимости на неограниченный срок. Решение разработано на основе нормативно-правовых актов по архивному делу, поддерживает операции хранения документов: от попадания в архив до уничтожения, и не имеет ограничений на объем хранимых данных. "1С:Архив" сопровождается методологической поддержкой в виде организационных документов по хранению, входящих в состав "Комплекта нормативных документов" к "Методике управления документами и совместной работой", разработанной специалистами фирмы "1С". Использование "1С:Архива" позволяет организовать единое хранилище всех бумажных и электронных документов из разных информационных систем, вести архивный учет в соответствии с требованиями Росархива и снизить нагрузку на учетные системы. С 1 апреля 2026 года стоимость изменится на 14%, успейте купить решение по цене 2025 года!
117000 руб.
24.10.2022 8734 17 1
Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)
Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.
85400 руб.
05.10.2022 14552 17 8
SALE! 35%
Загрузка и выгрузка в Excel Учет документов Распознавание документов и образов Бухгалтер Пользователь 1С:Предприятие 8 1С 8.3 1С 8.5 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)
Программа для распознавания сканов или фотографий товарных документов в 1С. Просто выбираете файл (PDF, XML, JPG, DOC, XLS, HTML) и нажимаете кнопку "Распознать и загрузить".
8540
5551 руб.
04.06.2019 127911 384 183
Розничная торговля Внешние источники данных Разработчик Бухгалтер 1С:Предприятие 8 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Бухгалтерский учет Управленческий учет Платные (руб)
Загрузка данных продаж и инкассаций из сервисов Kit Vending/Kit Shop в 1С. Реализовано в виде Расширения. Мониторинг состояний торговых автоматов.
12200 руб.
10.06.2019 34632 49 25
Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)
Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.
122000 руб.
19.08.2020 30606 28 3
Внешние источники данных Зарплата Бюджетный учет Разработчик Бухгалтер 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)
Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.
85400 руб.
24.04.2017 57637 99 165
Т.е. АСУ, реализованное на "1С 7.7", перестало существовать?
Или решена задача "данные придется вбивать дважды" на стыке "ЭТРАН"-"1С 8.х", а в АСУ на "1С 7.7" данные вбиваются повторно?
Или всё АСУ клиента переведено с "1С 7.7" на "1С 8.х"?
на счет двойного ввода - пока вбиваются повторно, сейчас пытаемся управление процессом отгрузки сделать в 8.2, попутно можно будет сделать импорт, либо экспорт документов в ЭТРАН
Тоже поставили подобную задачу, нужно пару отчетов по ЭТРАН что погрузили, когда, дата и время прибытия на станцию, время подачи и сколько осталось погрузить вагонов.
Т.е. данный отчет это объединение данных по накладным, заявки на перевозку и ведомости подачи/уборки.
Не могли бы Вы показать Вашу реализацию или подсказать куда копать.
Спасибо.
А вот это уже интересней. Если программа уже стоит, где взять?
>># На рабочем месте устанавливается COM объект компонента для доступа к ЭТРАН, настраиваются параметры доступа к ней через DCOM.
где взять установщик? в документации к ЭТРАНу по этому поводу ничего не написано.
>># На сервере 1С создается экземпляр DCOM объекта "EtranASUGO", с указанием, что объект будет "жить" на рабочем месте ЭТРАН.
можно узнать поподробнее как это делается?
желательно с примерами, хотелось бы конечно посмотреть на саму конфигурацию :) , думаю в скором времени данная проблема будет актуальна не только для нас, но и по всей России.
Функция ПолучитьСоединенеиеЭтран() Экспорт
СоединенеиеЭтран = Новый COMОбъект("EtranASUGO.EtranASUGO",Константы.ждИмяКомпьютераЭТРАН.Получить());
СоединенеиеЭтран.Connect(Константы.ждАдресСервераЭТРАН.Получить(),Константы.ждПользовательЭТРАН.Получить(),Константы.ждПарольЭТРАН.Получить());
Возврат СоединенеиеЭтран;
КонецФункции // ПолучитьСоединенеиеЭтран()
А про COM объект узнал из документации, нашел случайно.
Дело в том что компания разработчик ЭТРАН, продает свое решение для интеграции с АСУ грузоотправителя, собственно в РЖД на все вопросы об интеграции посылают к ним.
Ну а вообще про DCOM наверное надо почитать на специализированных форумах, я в нем не силен.
И даже наличие веб сервисва не решает проблему взаимодействия с 1С.
На одном из наших филиалов сделали на флексе форму для формирования и отправки заявок в этран - прекрасно работает, но опять же нет связи с корпоративной системой, в которой эти заявки уже вбиты менеджерами.
я про него давно знаю, а вот найти до сих пор не получилось, интернет по этому поводу молчит.
скажите могли бы вы помочь с написанием этого кода?
Ну, допустим, это десяток строк кода - просто вызов COM-объекта. А дальше как вы собираетесь сапортить эту часть вашей конфигурации? Поделка Интелекса весьма специфична. Лично я потратил пару-тройку месяцев своей жизни на написание логики отработки _ошибок_ в выдаче из Этрана. А что собираетесь делать вы?
Вся программа полностью нам не нужна, так как имеется самостоятельная программа со своим функционалом и нужна загрузка одного документа.
Вы даже не понимаете что именно вам нужно =) Если вы убеждены, что просто выкачать накладную вам будет достаточно, то, как минимум, вы заблуждаетесь. Ибо выборку можно делать по внутреннему ID (а это просто порядковый номер сущности, а вам будет нужен именно ID накладной), плюс забавный механизм сторнирования и внесения правок (частенько забывают одновить дату изменения и изменять operID), ну и т.д. И как вы собираетесь объяснять клиенту странности работы конфигурации? =))
Другими словами: дерзайте, вы молоды и энергичны =)
Есть такая идея, самому написать некое подобие прокси-веб-сервиса, т.е. веб-сервис, который будет установлен на машине рабочего места ЭТРАН и будет редиректить запросы на сервис и отдавать ответы в 1С.
если есть желание, могу предложить решение, позволяющие организовать шлюз а ЭТРАН(замена ASUGO интрефейса), работает с пулом запросом, можно распараллеливать запросы - все настраивается в конфиге. Со стороны клиента можно использовать прилагающуюся COM-DLL, использовать SOAP либо CLR Assembly для MSSQL сервера.
Вы даже не понимаете что именно вам нужно =) Если вы убеждены, что просто выкачать накладную вам будет достаточно, то, как минимум, вы заблуждаетесь. Ибо выборку можно делать по внутреннему ID (а это просто порядковый номер сущности, а вам будет нужен именно ID накладной)
Ошибаетесь, можно запрашивать данные и invoiceID и по invNumber(номер накладной) и по номеру вагона, причем ,повторюсь, в различных режимах -
только прибытие, только отправление, все, валидные и т.д. А если уж хотите зрить в корень, то прикручивайте получение данных по списанию денег с ЕЛС и выкачивайте накладные, даже если будет сторно, то логика тут не трехэтажная...
Согласна пока я плохо себе представляю как реально организовать выгрузку данных из Этрана. Ну а ваши предложения, стоимость?
вопрос в какой момент времени вам нужна эта накладная, режим АСУ-АСУ предусматривает несколько вариантов и режимов запроса данных накладных.
PS: если будут вопросы(по существу конечно) пишите в личку - постараюсь помочь.
если есть желание, могу предложить решение, позволяющие организовать шлюз а ЭТРАН(замена ASUGO интрефейса), работает с пулом запросом, можно распараллеливать запросы - все настраивается в конфиге. Со стороны клиента можно использовать прилагающуюся COM-DLL, использовать SOAP либо CLR Assembly для MSSQL сервера.
очень интересно, хотелось бы услышать стоимость, можно в личку =)
Ошибаетесь, можно запрашивать данные и invoiceID и по invNumber(номер накладной) и по номеру вагона, причем ,повторюсь, в различных режимах -
ок, есть invoiceID 'A000001', было сторнировано перед запросом 10 накладных. и? =) не помню как звучит отлуп (под рукой этрана нет) но что-то типа укажите точно что выбирать.. только список из чего выбирать не предлагает..
Есть такая идея, самому написать некое подобие прокси-веб-сервиса, т.е. веб-сервис, который будет установлен на машине рабочего места ЭТРАН и будет редиректить запросы на сервис и отдавать ответы в 1С.
можно использовать любой портфорвардер.
не
>>ок, есть invoiceID 'A000001'
а
ок, есть invNumber 'A000001'
тогда на самом деле надо выбрать useValid
А вообще запросы сделаны просто и логично, за исключением пары моментов с получения статусов документов ;)
ок, есть invoiceID 'A000001', было сторнировано перед запросом 10 накладных. и? =) не помню как звучит отлуп (под рукой этрана нет) но что-то типа укажите точно что выбирать.. только список из чего выбирать не предлагает..
A000001 - такой нумерации нет, если что
ответ на ваш вопрос - <useValid/>
вопросы по поводу сотрудничества прошу присылать на reflex2[собака]list.ru
есть - оффбоард порожняк.. ну это так, к слову =)
Рекомендую почитать матчасть....
<getInvoice version="1.0">
<!-- ID накладной -->
<!-- * тип данных: ЦЕЛОЕ ЧИСЛО -->
<invoiceID value=""/>
<!-- Номер накладной -->
<!-- * тип данных: строка (до 8 символов) -->
<invNumber value=""/>
<!-- Использование 6-значных кодов станций и грузов в ответе -->
..... Показать* тип данных: строка (до 8 символов)
не разу не сталкивались с шести- и семизначными накладными? если не сталкивались - это не означает что их нет. прежде чем тыкать носом других, лучше разобраться самому ;)
ок, есть invoiceID 'A000001', .....
так вот, в invNumber - хоть черта лысого рисуйте(тип строка), а я Вам ответил что invoiceID тип данных ЦЕЛОЕ ЧИСЛО. От Вас много претензий - читайте что пишите....могли бы поблагодарить за ответ на Ваш вопрос по поводу того как получить одну накладную вместо списка.
(26) нужно трясти тех с кем заключали договор (скорее всего ваша дорога, ДЦФТО) и приложение о работе в режиме АСУ-АСУ. У рждшников есть и дока и приложение для взаимодействия. Но так как у разработчика системы (Интелекс со товарищи) есть своя разработка для работы в режиме АСУ-АСУ, то рждники продвигают ее, может быть имеют с этого что-то, а может просто ничего не понимают.
(33) Awarder, у них для АСУ-АСУ отдельный сервер, на котором по данному пути возвращается описание, правда у нас не на всех компьютерах оно возвращалось, на некоторых так же сохранялась dll (не знаю от чего это зависит), но всё равно работает на всех компьютерах.
Про протокол SOAP. Штатный формат 1С (WS-ссылки) не работает, в виду я так понимаю не полной поддержки всех форматов SOAP.А если подумать, SOAP - это всего лишь надстройка над протоколом HTML (в сети есть описание стандарта, формат сообщений и заголовков). Т.е. нужно просто слать сообщения в формате XML через HTTP. Поначалу мы хотели выкрутиться штатными средствами 1С, есть там HTTP-соединение или что-то в этом духе, но там нашелся глюк, либо фитча, в 1С http-запрос не дает формировать строку заголовка с двумя двоеточиями в ней, несмотря на то, что второе двоеточие используется уже в кавычках. В общем взяли COM объект входящий в windows и организующий такой же http-запрос только без лишних заморочек и проверок. Формат посылаемых сообщений на сервер приложений подсмотрели (правильно подсказывают) у Delphi. Дальше реализовали нужные сообщения по той документации, что предоставили в РЖД. Я к чему это рассказываю, возможно из-за той разработки, которую продвигают рждшники, возможно по незнанию, но нам сказали, что у нас ничего не выйдет, что доступ АСУ-АСУ работает только с их разработкой, очень неохотно давали нам адреса серверов АСУ-АСУ. Вот и хочется сказать, всё отлично работает!!! Пусть 1С конфигураций работающих напрямую с ЭТРАНом будет больше, описанная выше технология отлично работает! Их дорогая и тяжеловесная разработка никому не нужна, зачем иметь ещё одну прокладку между системами, если можно всё хранить прямо 1С-ке.
(35) Awarder, насколько я помню, закладка туннель, там где надо галку ставить "использовать виртуальный адреса", сам адрес требуйте у дороги, если вы платите по договору за АСУ-АСУ, то вам должны дать этот адрес (мы его долго пытались получить, в итоге нам дали телефон некоего программиста в РЖД, который знает вообще знает, что есть такие адреса, кстати с удивлением обнаружили что этот адрес уже был забит в VipNet параллельно с основным, так что можете попробовать проверить все адреса, которые там забиты).
Только не совсем понятно про формат посылаемых сообщений на сервер приложений, как это посмотреть????
Формат посылаемых сообщений на сервер приложений подсмотрели (правильно подсказывают) у Delphi
вы можете использовать (правда Microsoft прекратил его поддержку из-за введения WCF )
Сервис = Новый COMОбъект("MSSOAP.SoapClient30");
Сервис.MSSoapInit("ТУТ URL Сервера ЭТРАН");
.......
Если этот вариант не устраивает, то можете взять за основу "Microsoft.XMLHTTP", в этом случае описание стандарта SOAP есть и
А если подумать, SOAP - это всего лишь надстройка над протоколом HTML (в сети есть описание стандарта, формат сообщений и заголовков)
При всем уважении, протокола HTML нет, это стандарт. А вот SOAP считается протоколом, хотя с сильной натяжкой, я бы отнес его к стандарту вызова удаленных процедур или функций(RPC\RFC) поверх транспорта (как то HTTP, HTTPS, SMTP и т.д.)
закладка туннель, там где надо галку ставить "использовать виртуальный адреса"
Должно работать и с тунелированием и без.
Еще раз повторюсь, коллеги, при использовании SOAP проверяйте все ли ответы корректные, сталкивался с тем что приходящий XML соержит левые спецсимволы, из-за которых xml-документ становится не валидным для парсера.
При всем уважении, протокола HTML нет, это стандарт
Извиняюсь, опечатался, имел ввиду именно http
Еще раз повторюсь, коллеги, при использовании SOAP проверяйте все ли ответы корректные, сталкивался с тем что приходящий XML соержит левые спецсимволы, из-за которых xml-документ становится не валидным для парсера
Подтверждаю, приходится в приходящей строке пройтись СтрЗаменить, иначе парсер сыпет ошибками, правда сталкивались только на нескольких справочниках, как мне показалось в значениях полей этих справочников.
P.S. Кодом не помогу, коммерческая тайна как-никак, итак много рассказал =)
Подтверждаю, приходится в приходящей строке пройтись СтрЗаменить, иначе парсер сыпет ошибками, правда сталкивались только на нескольких справочниках, как мне показалось в значениях полей этих справочников.
Не только при запросе справочников, частенько происходит при запросе данных накладных и заявок на перевозку.
За саппорт именно АСУ АСУ режима.
У меня тема и провисла ибо было рассчитано, что за нанятый за половину суммы андроид выгрузит в Ексель за 2-3 часа все необходимые данные,а далее - скриптом закачиваем в Конфу.
Просто совет - сначала согласовать сумму , а потом уже думать о технике
Вы уверены что Вам нужен именно ЭТРАН, данных АСОУП не будет достаточно?
Если у Вас средний оборот 400 вагонов - то по затратам это будет гараздо выгоднее чем платить за АСУ-АСУ(правда провозной платы в этих данных не будет, НО если нужны деньги, то всегда есть возможность обратиться в ГВЦ и заключить договор на САО(система абонентского обслуживания, они настроят для вас формирование и передачу данных по отправкам и прибытию вагонов в ваш адрес) ).
Контроль операций в местах обработки вагонов - чем вам поможет ЭТРАН в этом вопросе?
Здесь обсуждается технология общения с АСУ АСУ.
Это технология позволяет привязать данные Этран к ВАШЕЙ системе
Продуктов я знаю 2. Первый это интеллексовский (от самих разработчиков Этрана). Цена у него большая, функционал широкий, но подробно я я его не рассматривал.
Второй - . Ни разу не реклама . цена у конфы приемлемая, судя по описанию и функционалу - все вполне внедряемо.
Нас остановило (надеюсь временно) необходимость тратить 30тыс/мес за сам обмен. Дорого это - и не так просто согласуется. Советую начать с этого вопроса, а не наоборот (может впустую работа быть).
Эту задачу можно решать по разному, а по скольку вводных для понимания ситуации мало, то предложил варианты,
а именно:
АСОУП(автоматизированная система оперативного управления парком) - если штрафы рассчитываются по условиям договоров с экспедиторами, то этих данных достаточно, подходы есть, определение простоев в пути(и причин этих простоев) можно реализовать.
САО - система ГВЦ для получения не только оперативных данных, но и данных по отправкам(основной минимум реквизитов из накладной с суммами), только в этом случае вы не платите фиксировано 25-30т.р., а платите только за объем переданной вам информации.
ЭТРАН по сути документооборот - согласование, изменение статусов, факты отправки, раскредитации.
У нас, например, 1 ЕЛС и несколько филиалов. Накопительные ведомости согласуются в 1С (потому как филиалы их не видят), а потом эти статусы переносятся в ЭТРАН.
Сейчас есть необходимость видеть заявки на перевозку, когда один филиал отправляет другому вагоны под отгрузку, необходимо указывать номер заявки. Это все видно.
Ну и побочный продукт это возможность видеть историю движения вагонов, потому как данные отправлений/прибытий из АСОУП мягко говоря не очень достоверны. Я сам обработкой этих данных не занимаюсь, но сверял загруженный результат с данными ЭТРАН - не все совпадает.
Я бы сказал наоборот - АСОУП как раз таки показывает самую реальную картинку движения вагонов, это один из китов РЖД(и вагон в 99.9% случаев не сдвинется с места без отражения соответствующего макета в базе дорог), а ЭТРАН показывает искаженные данные по движению(Вы верно заметили -
не очень понял про картину движения по данным отправления и прибытия, имхо картину движения нужно по данным АСОУП строить.
С чтением данных - разобрались. Из нюансов - 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%", "");
Показатьна текущий момент данный пост еще актуален? запрос возвращает "иероглифы", может кто пример скинуть отправки и возврата 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;
// С помощью 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С-ка от имени другого пользователя (что бы не было видно на экране, а-ля служба), задания на загрузку-выгрузку из ЭТРАНа лежат в регистре, считываем, отправляем, получаем.
У меня вопрос, такой запрос только с машины где защищенный канал настроен прокатит или можно пытаться с любой ?
П.С.
ЗапросПараметр = "
|<getInvoice version=""1.0"">
|<invNumber value=""910105""
|<useMod11/>
|</getInvoice>";
такой делаю.
П.С. Запрос правильный =).
Если запускать как то так:
Функция ПолучитьСоединенеиеЭтран() Экспорт
СоединенеиеЭтран = Новый COMОбъект("EtranASUGO.EtranASUGO",Константы.ждИмяКомпьютераЭТРАН.Получить());
СоединенеиеЭтран.Connect(ждАдресСервераЭТРАН,ждПользовательЭТРАН,ждПарольЭТРАН);
Возврат СоединенеиеЭтран;
КонецФункции // ПолучитьСоединенеиеЭтран()Мы просто поставили на комп с VipNet IIS и сделали прослойку, которая публикует методы Этрана в локальную сеть.
При этом работает не только выгрузка, но и создание накладных на УКП ( на формирование целого поезда)
По дислокации полно предложений. Если платформы постоянные, то 100-200 руб/ мес, либо по 5-8 руб в сутки.
Пытаюсь получить ком объект с другова компьютера
Etran = Новый COMОбъект("EtranASUGO.EtranASUGO", "\\trnh-db-02"); ничего не выходить.
Кто как решил проблему? Если она как то решилась, помогите пожалуйста
У этрана есть возможность работать без нее, через веб сервисы.
(Правда мы реализовали это, просто как работу по http , так как не все биндилось красиво)
Тем самым мы уходим от точки отказа "СОМ"
А, главное, у вас канал асу асу оплачен (именно асушный а не этран)?
Асушный оплачен)
Сделал через вэб, настройкой прокси сделал чтобы с любого компьютера получать доступ к сервисам этран. Может когда нибудь тему напишу да выложу обработку когда закончу)
Вы про вариант, который предлагал (76) ? Там ведь тоже используется COMОбъект.
На том другом компе должна стоять компонента ASUGO и Vip.NET. Ну, и, соответственно, доступ к другому компу и компоненте должен быть с первого компа и право использования, хотя обычно оно не ограничено.
Есть хотя-бы документация какая нибудь или по подробнее как это все организовать, и компоненту создавал и что только не делал.
Скорее всего делаю что то не так
А как понять, платим мы за канал или нет? Посмотрел отчет оказанных информационных услуг от ЦФТО, там из интересного только VipNet-подключения. Никаких асушных каналов.
А с SOAP-подключением надо что-то придумать. Проксю поднять или веб-сервер.
Через ИИС видел делают, как то еще. Но понимания пока нет. Если что может помочь понять подскажите пожалуйста
Перевел все на соап. Пока не тестировал как будет работать сервера по регламетному заданию. В остальном стало быстрее
"Сервер с очередями навероное круто, но уж больно геморно для небольшой конторы " - а сервер без очередей ?
Просто чтобы с любых ПК слать запросы и обрабатывать их на сервере, который в "випнет".
Теоретически можно как то "поиграться" с прокси, но наши админы это не освоили.
Мне проще было пару сотен строк на ASP.NET написать
Через СОАП можно как нибудь получить соеденение компутера где все есть?
А вообще Я по коду смотрел и у Меня глаза не верили этому. До Меня тут был топ программист ин зэ ворлд так. Тут такого наворотил, виртуальные таблица даже знать не знает что это). Ком соеденение использует которое 6 лет как с поддержки снято. ЗАпросы в цикле, логически не связаные вещи. А опыт программирования 20 лет у человека. Вот пытаюсь по чуть чуть собрать адекватный код. По вопросу может кто что то делал?
От использования COM тоже отказались, обмен через веб-сервисы реализовать оказалось несложно.
COM снят с поддержки. От него отказались, спустя 2 недели общения с поддержкой Мы пришли к пониманию и донесли друг до друга нужную информацию). Я им их ошибки, они Мне как все сделано прям сейчас.
На 1 компе есть вип нет и этран.
На второй этран. Я могу подключаться к Этран с компутера 2 который не имеет вип нета. Обращение идет через 1.
Но это все ровно на серваке не заводиться. А с компа своего спокойно обрабатывает) Думаю может на сервере какие то настройки стоят в свойствах обозревателя
Может запрос как то не так делаю?
Если есть пример как ты POST шлешь до Этрана можешь показать)
ТекстSOAP="<soapenv:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:sys=""SysEtranInt"">
| <soapenv:Header/>
| <soapenv:Body>
| <sys:GetBlock soapenv:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">
| <Login xsi:type=""xsd:string"">"+EtranUser+"</Login>
| <Password xsi:type=""xsd:string"">"+EtranPass+"</Password>
| <Text xsi:type=""xsd:string"">"+EtranTxt+"</Text>
| </sys:GetBlock>
| </soapenv:Body>
|</soapenv:Envelope>";
ХттпЗапрос=Новый ComОбъект("WinHttp.WinHttpRequest.5.1");
ХттпЗапрос.Open("POST", EtranURL, 0); //Ложь -значит ждать ответа (не асинхронный запрос)
ХттпЗапрос.SetRequestHeader("Content-Type","text/xml;charset=UTF-8");
ХттпЗапрос.SetRequestHeader("SOAPAction","""urn:SysEtranInt""");
Попытка
ХттпЗапрос.Send(ТекстSOAP);
Исключение
Ответ.Вставить("КодОтвета","Ошибка");
Ответ.Вставить("ТекстОтвета",ОписаниеОшибки());
Возврат Ответ ; //Возврат если возникла ошибка
КонецПопытки; ПоказатьДелаю такой запрос. Хочу получить справку по накладажной. Но что то идет не так. Кто нибудь может поправить если понимает что не так
Так и не понял зачем вместо одного COM-объекта использовать другой. Это же веб-сервис.
Я делаю так:
ТекстЗапроса =
"<test version=""1.0"">
|</test>";
МестоположениеWSDL = АдресПодключения + "?wsdl";
Определения = Новый WSОпределения(МестоположениеWSDL, Логин, Пароль, , ТаймаутСоединения);
Сервис = Определения.Сервисы.Получить(0);
Точка = Сервис.ТочкиПодключения.Получить(0);
ПодключениеКЭтрану = Новый WSПрокси(Определения, Сервис.URIПространстваИмен, Сервис.Имя, Точка.Имя, , ТаймаутОперации);
ПодключениеКЭтрану.Пользователь = Логин; // не уверен, что нужно
ПодключениеКЭтрану.Пароль = Пароль; // не уверен, что нужно
ТекстXML = ТекстЗапроса;
ПодключениеКЭтрану.GetBlock(Логин, Пароль, ТекстXML);
ТекстОтвета = ТекстXML; ПоказатьСпасибо думаю поможет. Но Можешь пожалуйста параметры объяснить.
МестоположениеWSDL - Не понял)
Логин, Пароль - Логин пароль для доступа к этрану?
Тайаут понятно
Сервес - Не понял)
Точка тоже)
ПРоще сказать Я понял по параметрах только Таймаут)). Можешь по подробнее описать. Если конечно не сложно. Да и в друг еще кто то столкнуется будет из чего учиться хоть
А регламентным заданием не работает)
{ОбщийМодуль.Этран.Модуль(156)}: Ошибка при вызове метода контекста (GetBlock)
по причине:
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {}:IEtranSysservice:GetBlock()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка работы с Интернет: Failure when receiving data from the peer
по причине:
Ошибка работы с Интернет: Failure when receiving data from the peer ПоказатьПроблема в том что отправляю большой запрос 2000 + вагонов. Вот и отваливается
Делаю запрос чтобы получить дислокацию вагонов, в данный момент их 2227 или на 100 больше.
Нужна каждые пол часа
<GetInform>
<UseGZIPBinary>1</UseGZIPBinary>
<ns0:getReference14ASU xmlns:ns0="http://service.siw.pktbcki.rzd/">
<ns0:Reference14ASURequest>
<idUser>0</idUser>
<idReference>14</idReference>
<vagons>
<vagon>50024900</vagon>
<vagon>50024900</vagon>
И так 2 тысячи
</vagons>
</ns0:Reference14ASURequest>
</ns0:getReference14ASU>
</GetInform>
Можешь пожалуйста пример показать как реализовал ты). Очень прошу)
<ScrollDateBegin>01.01.1900 00:00:00</ScrollDateBegin>
<ScrollDateEnd>01.01.3000 00:00:00</ScrollDateEnd>
<Inform_ID>14</Inform_ID>
<Doc>
<ScrollDocID>0</ScrollDocID>
<DocDateBegin>01.01.1900 00:00:00</DocDateBegin>
<DocDateEnd>01.01.3000 00:00:00</DocDateEnd>
<Type>vagon</Type>
<Value>500605</Value>
</Doc>
<Doc>
<ScrollDocID>1</ScrollDocID>
<DocDateBegin>01.01.1900 00:00:00</DocDateBegin>
<DocDateEnd>01.01.3000 00:00:00</DocDateEnd>
<Type>vagon</Type>
<Value>500619</Value>
</Doc>
</SetInformReestr>
Запрос работает ошибок нету. Возвращает время дислокации только)
С реестром затея тоже не совсем хорошая. Мы отправляем вагоны а в ответ получаем Ид накладных.
По ним может найти наши вагоны. Вот только в обоих случаях Я отправлю 2000+ вагонов))
Да вот пришлось, только хотелось за раз а так 2 отправки. 2 ответа обрабатывать
а если у Меня будет 40000 вагонов?) 20 запросов делать?)
Ты пробовал запросом SetInformReestr по одному вагону запихивать, чтобы получить список из двух вагонов? А потом по ним справку получить.
Если проблема на Моей стороне тогда в чем? Не поддержка никто не может Мне сказать требования к запросу и к каналу или вооьще как структурного объяснить.
Ладно, у самого еще руки не дошли подергать запрос, поэтому пока приторможу обсуждение вопроса.
С таким условием можно вообще справку не получать
Спасибо, да получилось так как ты и сказал. А Я и не знал. Можешь подсказать что в параметрах ставишь Даты?
<DocDateBegin>01.01.1900 00:00:00</DocDateBegin>
<DocDateEnd>01.01.3000 00:00:00</DocDateEnd>Ставлю так, это последнее значение получаю SrolId получаю все верно?
<xs:element name="ActUslugStatus">
<xs:annotation>
<xs:documentation>Запрос из АСУ ГО в ЭТРАН для получения данных по актам услуг. Рекомендуется запрашивать данные за период не более трех часов. В ответ АС Этран возвращает ActUslugStatusReply</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="fromDate" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>Дата начала периода.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="value" type="ecat:DateTimeType" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="toDate" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>Дата конца периода.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="value" type="ecat:DateTimeType" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="OperId" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>
Идентификатор элемента списка (обычно идентификатор операции в истории электронного документа) начиная с которого производится выборка элементов списка при его сканировании
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="value" type="ecat:IDLongType" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element> Показатьпервое что пришло на ум:
<ActUslugStatus>
<fromDate> </fromDate>
<toDate></toDate>
<OperId></OperId>
</ActUslugStatus>
, но с таким форматом сервер работать не хочет.
Я бы запрашивал так:
<ActUslugStatus>
<fromDate value="25.03.2020 10:46:15"/>
</ActUslugStatus>пример хочу передать код страны назначения
запрос
<getInvoice version="1.0">
<invoiceID value="1022161457"/>
<invToCountryCode value="158"/>
</getInvoice>
ответ
<?xml version="1.0" encoding="windows-1251"?>
<error>
<errorCode value="3"/>
<errorMessage value="Неизвестный тэг с данными <invToCountryCode>"/>
<errorStatusCode value="406"/>
</error>
Но - вопрос в платностисправок, если ли информация про это ?
Просто за ответы по тому же натурному листу от слеженцев - платим и не так, чтобы мало.
При запросе через этран запрос тарифицируется или нет ?
Ну и нужные нам справки давно используем, активно взаимодействуем по процессу доработки и исправления ошибок.
Есть xsd - на их базе можно делать запросы
А вот и запрос :
<lns:getReferenceSPV4664 xmlns:lns="http://service.siw.pktbcki.rzd/"><lns:ReferenceSPV4664Request><idUser>0</idUser><vagons><vagon>949
Накладную создаем, получили текст, который надо подписать. Далее пробуем при помощи Крипто-Про через COM подписать файлик, но получаем ошибку:
"(CAdESCOM.CadesSignedData.1): Группа или ресурс не находятся в нужном состоянии для выполнения требуемой операции."
Пробовали руками через Крипто-АРМ, подписывает хорошо.
Код:
CPSigner = Новый COMОбъект("CAdESCOM.CPSigner");
CPSigner.Certificate = получитьСертификат();
CPSigner.TSAAddress = "http://pkitrans.ru/tspca1_niias/tsp.srf";
CadesSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
CadesSignedData.Content = ТекстовоеПредставлениеНакладной;
sSignedData = CadesSignedData.Sign(CPSigner, Истина); ПоказатьПодпись формирую:
ecp value=
CADESCOM_BASE64_TO_BINARY = 0; // Входные данные пришли в Base64
CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи
CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2;
sTSAAddress = "http://pkitrans.ru/tspca1_niias/tsp.srf";
oSigner = Новый COMОбъект("CAPICOM.Signer");
// Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи.
oSigner.Options = CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY;;
oSigner.Certificate = Certificate;
// oSigner.TSAAddress = sTSAAddress;
oSigningTimeAttr = Новый COMОбъект("CAPICOM.Attribute");
oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
oSigningTimeAttr.Value = ТекущаяДата();
oSigner.AuthenticatedAttributes.Add(oSigningTimeAttr);
// ТекстДляПодписи = СокрЛП(ТекстДляПодписи);
oSignedData = Новый COMОбъект("CAPICOM.SignedData");
// Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.
// oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
oSignedData.Content = ТекстДляПодписи;
// EncodingType = 0;
// sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);
sSignedMessage = oSignedData.Sign(oSigner, bDetached, CADESCOM_BASE64_TO_BINARY);
// Метод добавляет к сообщению усовершенствованную подпись.
Возврат sSignedMessage; // Подпись в формате Base64
tsp value=
oStamp = Новый COMОбъект("TSPCOM.TSPStamp");
oRequest = Новый COMОбъект("TSPCOM.TSPRequest");
oOID = Новый COMОбъект("CAPICOM.OID");
oOID.Value = "1.2.643.2.2.9";
oRequest.HashAlgorithm2 = oOID;
UTF8Encoding = Новый COMОбъект("System.Text.UTF8Encoding");
oRequest.AddData(UTF8Encoding.GetBytes_4(ТекстДляПодписи));
// oRequest.AddData(ТекстДляПодписи);
oRequest.TSAAddress = "http://pkitrans.ru/tspca1_niias/tsp.srf";
оStamp = oRequest.Send();
oUtils = Новый COMОбъект("CAPICOM.Utilities");
sStamp = oUtils.Base64Encode(оStamp.Export());
Возврат sStamp; // Stampa в формате Base64 ПоказатьЭтран выдает ошибку:
<error>
<errorCode value="4"/>
<errorMessage value="Актуальная и подписанная информация о документе не совпадает."/>
<errorStatusCode value="400"
</error>
Техподдержка отписывается:
Переданная информация в поле “textBinary” содержит текстовое представление документа не в XML формате
и в кодировке UTF-8, вместо windows-1251, поэтому сработал
контроль "Актуальная и подписанная информация о документе не совпадает."
<!-- ******************************************** -->
<!-- ЗАПРОС ПОЛУЧЕНИЯ ИНФОРМАЦИИ О ДОКУМЕНТЕ ДЛЯ ПРОВЕДЕНИЯ ЭЦП: запрос -->
<!-- ******************************************** -->
<getTextForECP version="1.0">
<!-- идентификатор документа -->
<!-- * тип данных: целое число -->
<docID value=""/>
<!-- При использовании тега текстовое представление будет получено в base64 -->
<useBinary/>
</getTextForECP> ПоказатьПробовали с useBinary и без. Если без, надо сохранять переносы строк, как в XML.
Вручную через Крипто-АРМ подписывается без проблем.
Код взят из документации к Крипто-Про:
CPSigner = Новый COMОбъект("CAdESCOM.CPSigner");
CPSigner.Certificate = получитьСертификат();
CPSigner.TSAAddress = "http://pkitrans.ru/tspca1_niias/tsp.srf";
CadesSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
CadesSignedData.Content = "test";
sSignedData = CadesSignedData.Sign(CPSigner, Истина);
ПоказатьПолученные данные из запроса getTextForECP в Base64 подписываю так:
ecp value =
СADESCOM_ENCODE_BASE64 = 1; // Входные данные пришли в Base64
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
CPSigner = Новый COMОбъект("CAdESCOM.CPSigner");
CPSigner.Certificate = Certificate;
CPSigner.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
CadesSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
CadesSignedData.ContentEncoding = CADESCOM_ENCODE_BASE64;
CadesSignedData.Content = ТекстДляПодписи;
sSignedMessage = CadesSignedData.SignCades(CPSigner,CADESCOM_CADES_TYPE, Истина);
Возврат sSignedMessage;
Как правильно получить штамп времени и на какие именно данные: штамп времени на подпись или на документ????
Формирую штамп времени:
tsp value=
oStamp = Новый COMОбъект("TSPCOM.TSPStamp");
oRequest = Новый COMОбъект("TSPCOM.TSPRequest");
oOID = Новый COMОбъект("CAPICOM.OID");
oOID.Value = "1.2.643.7.1.1.2.2";
oRequest.HashAlgorithm2 = oOID;
UTF8Encoding = Новый COMОбъект("System.Text.UTF8Encoding");
ДвДанныеПодписи1 = UTF8Encoding.GetBytes_4(sSignedMessage);
oRequest.AddData(ДвДанныеПодписи1);
oRequest.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
оStamp = oRequest.Send();
oUtils = Новый COMОбъект("CAPICOM.Utilities");
sStamp = oUtils.Base64Encode(оStamp.Export());
Возврат sStamp; // Stampa в формате Base64
Этран возвращает ошибку:
<?xml version="1.0" encoding="windows-1251"?>
<error>
<errorCode value="4"/>
<errorMessage value="Ошибка проверки ЭП:Ошибка проверки подписи в УЦ:Хэш штампа времени не совпадает с хэшем подписи SignHash и TSPHash."/>
<errorStatusCode value="400"/>
</error>
<!-- ******************************************** -->
<!-- ЗАПРОС ПОЛУЧЕНИЯ ИНФОРМАЦИИ О ДОКУМЕНТЕ ДЛЯ ПРОВЕДЕНИЯ ЭЦП: запрос -->
<!-- ******************************************** -->
<getTextForECP version="1.0">
<!-- идентификатор документа -->
<!-- * тип данных: целое число -->
<docID value=""/>
<!-- При использовании тега текстовое представление будет получено в base64 -->
<useBinary/>
</getTextForECP>
далее Подпись_text = ПодписатьТекст(Doc_СтрокаBase64, Certificate, Истина); получаем ЭЦП
Функция ПодписатьТекст(ТекстДляПодписи, Certificate, bDetached)
CADESCOM_ENCODE_BASE64 = 1; // Входные данные пришли в Base64
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
CPSigner = Новый COMОбъект("CAdESCOM.CPSigner");
CPSigner.Certificate = Certificate;
CPSigner.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
//CPSigner.TSAAddress = "http://10.248.8.240/tspca1_niias/tsp.srf";
//CPSigner.TSAAddress = "http://tsp.pki.transtk.ru/tspca1/tsp.srf";
CadesSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
CadesSignedData.ContentEncoding = CADESCOM_ENCODE_BASE64;
CadesSignedData.Content = ТекстДляПодписи; //ТекстДляПодписи
sSignedMessage = CadesSignedData.SignCades(CPSigner,CADESCOM_CADES_TYPE,bDetached,0);
Возврат sSignedMessage; // Подпись в формате Base64
КонецФункции
и фтамп времени к эцп Подпись_text_stamp = ShtampТекст(Подпись_text);
Функция ShtampТекст(ТекстДляПодписи)
Cadescom_hash_algorithm_cp_gost_3411_2012_256 = 101;
oStamp = Новый COMОбъект("TSPCOM.TSPStamp");
oRequest = Новый COMОбъект("TSPCOM.TSPRequest");
oHash = Новый COMОбъект("CAdESCOM.HashedData");
oHash.Algorithm = Cadescom_hash_algorithm_cp_gost_3411_2012_256;
oHash.Hash(ТекстДляПодписи);
oOID = Новый COMОбъект("CAPICOM.OID");
oOID.Value = "1.2.643.7.1.1.2.2";
oRequest.HashAlgorithm2 = oOID;
oRequest.Hash = oHash;
oRequest.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
//oRequest.TSAAddress = "http://pki.skbkontur.ru/tsp2012/tsp.srf";
//oRequest.TSAAddress = "http://10.248.8.240/tspca1_niias/tsp.srf";
//oRequest.TSAAddress = "http://tsp.pki.transtk.ru/tspca1/tsp.srf";
оStamp = oRequest.Send();
oUtils = Новый COMОбъект("CAPICOM.Utilities");
sStamp = oUtils.Base64Encode(оStamp.Export());
Возврат sStamp; // Stampa в формате Base64
КонецФункции Показатьи формируем запрос в этран "<setECP version=""1.0"">
ДО июня 2024 все работало хорошо, но после (ЦФТО информирует Вас о том, что в рамках перехода АС ЭТРАН НП на импортонезависимую платформу на базе СУБД Postgres Pro Enteprise будет изменена кодировка подписания документов электронной подписью (далее – ЭП) на UTF-8. Возможность работы с документом, как с бинарными данными реализовна в интерфейсе АСУ ГО АС ЭТРАН в запросах <getTextForECP> и <setECP> (параметр useBinary), в руководстве программиста АСУ ГО обновлено описание веб-сервиса проведения ЭП по документам (п. 5.1.5 «Запрос операции над документом»).
В связи с вышеизложенным, прошу Вас, рассмотреть вопрос о внесении изменений в программное обеспечение АСУ предприятия в части реализации подписания документов ЭП с использованием base64 (параметр useBinary в запросе данных для подписи <getTextForECP> и запросе подписания <setECP>).
Дата перехода на работу с документом, как с бинарными данными будет сообщена дополнительно.) перестало работать подписание...
Возвращается Ошибка:
<error version="1.0">
<errorCode value="4"/>
<errorMessage value="Ошибка проверки подписи в УЦ:COM_TimeStampInfo. Ошибка получения информации о штампе времени. Доп. инфо: Import. Ошибка в tspcom.TSPStamp.1: В ASN1 встречен неожиданный конец данных. Ошибка LE № 0x80004005: Неопознанная ошибка "/>
<errorStatusCode value="400"/>
</error>
<ActUslugStatus>
<fromDate>03.02.2023 08:00:00</fromDate>
<toDate>03.02.2023 10:00:00</toDate>
<OperId>Идентификатор элемента списка </OperId>
</ActUslugStatus> Как узнать "Идентификатор элемента списка" или что передавать в параметр OperId?
<ActUslugStatus>
<fromDate>03.02.2023 08:00:00</fromDate>
<toDate>03.02.2023 10:00:00</toDate>
<OperId>Идентификатор элемента списка </OperId>
</ActUslugStatus>
Как узнать "Идентификатор элемента списка" или что передавать в параметр OperId?
<!-- ******************************************** -->
<!-- ЗАПРОС ПОЛУЧЕНИЯ ИНФОРМАЦИИ О ДОКУМЕНТЕ ДЛЯ ПРОВЕДЕНИЯ ЭЦП: запрос -->
<!-- ******************************************** -->
<getTextForECP version="1.0">
<!-- идентификатор документа -->
<!-- * тип данных: целое число -->
<docID value=""/>
<!-- При использовании тега текстовое представление будет получено в base64 -->
<useBinary/>
</getTextForECP>
<!-- ******************************************** -->
<setECP version="1.0">
<!-- Идентификатор документа -->
<!-- * тип данных: целое число -->
<docID value=""/>
<!-- Информация о документе для подписания ЭЦП -->
<!-- без использования UseBinary в запросе -->
<!-- * тип данных: строка -->
<text value=""/>
<!-- с использованием UseBinary в запросе -->
<!-- * тип данных: строка -->
<textBinary value=""/>
<!-- ЭЦП документа-->
<!-- * тип данных: строка -->
<ecp value=""/>
<!-- Штамп времени документа(для version = 1 или 2) ->
<!-- * тип данных: строка -->
<tsp value=""/>
<!-- Версия алгоритма формирования ЭЦП(1 – Усиленная неквалифицированная ЭП версия от КриптоПро, 2 – Усиленная неквалифицированная ЭП версия от ТрансТелеком 5- Усиленная квалифицированная ЭП)-->
<!-- * тип данных: строка -->
<version value=""/>
<!-- Используется для подписания документов с текстовым представлением в base64 -->
<useBinary/>
</setECP>
<textBinary value=""/> и <ecp value=""/> одно и то же значение взятое из вашего запроса?
ТекстДляПодписи = textBinary
и получаем ЭЦП документа из функция ПодписатьТекст(ТекстДляПодписи, Certificate, bDetached)
<ecp value=""/>
Функция ПодписатьТекст(ТекстДляПодписи, Certificate, bDetached)
CADESCOM_ENCODE_BASE64 = 1; // Входные данные пришли в Base64
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
CPSigner = Новый COMОбъект("CAdESCOM.CPSigner");
CPSigner.Certificate = Certificate;
CPSigner.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
//CPSigner.TSAAddress = "http://10.248.8.240/tspca1_niias/tsp.srf";
//CPSigner.TSAAddress = "http://tsp.pki.transtk.ru/tspca1/tsp.srf";
CadesSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
CadesSignedData.ContentEncoding = CADESCOM_ENCODE_BASE64;
CadesSignedData.Content = ТекстДляПодписи; //ТекстДляПодписи
sSignedMessage = CadesSignedData.SignCades(CPSigner,CADESCOM_CADES_TYPE,bDetached,0);
Возврат sSignedMessage; // Подпись в формате Base64
КонецФункции
Все сделал как вы сказали, но "Ошибка проверки подписи в УЦ:TSP не в BASE64"
<tsp value=""/> = Подпись_text_stamp = ShtampТекст(Подпись_text);
ТекстДляПодписи = <ecp value=""/> sSignedMessage; // Подпись в формате Base64
Функция ShtampТекст(ТекстДляПодписи)
Cadescom_hash_algorithm_cp_gost_3411_2012_256 = 101;
oStamp = Новый COMОбъект("TSPCOM.TSPStamp");
oRequest = Новый COMОбъект("TSPCOM.TSPRequest");
oHash = Новый COMОбъект("CAdESCOM.HashedData");
oHash.Algorithm = Cadescom_hash_algorithm_cp_gost_3411_2012_256;
oHash.Hash(ТекстДляПодписи);
oOID = Новый COMОбъект("CAPICOM.OID");
oOID.Value = "1.2.643.7.1.1.2.2";
oRequest.HashAlgorithm2 = oOID;
oRequest.Hash = oHash;
oRequest.TSAAddress = "http://qs.cryptopro.ru/tsp/tsp.srf";
//oRequest.TSAAddress = "http://pki.skbkontur.ru/tsp2012/tsp.srf";
//oRequest.TSAAddress = "http://10.248.8.240/tspca1_niias/tsp.srf";
//oRequest.TSAAddress = "http://tsp.pki.transtk.ru/tspca1/tsp.srf";
оStamp = oRequest.Send();
oUtils = Новый COMОбъект("CAPICOM.Utilities");
sStamp = oUtils.Base64Encode(оStamp.Export());
Возврат sStamp; // Stampa в формате Base64
КонецФункции Показать<textBinary value=""/> получаем из запроса <getTextForECP version="1.0"> ==textBinary
//преобразовывем в двоичные данные
ДвоичныеДанныеСтроки = Base64Значение(textBinary);
получаем <ecp value=""/> == Подпись_text
Подпись_text = ПодписатьТекст_1С(ДвоичныеДанныеСтроки, ОтпечатокЭЦП);
Функция ПодписатьТекст_1С(ТекстДляПодписи, Отпечаток)
МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider","",80);
Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
Сертификат = Хранилище.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(Отпечаток));
ДД_Подпись = МенеджерКриптографии.Подписать(ТекстДляПодписи, Сертификат, ТипПодписиКриптографии.CAdESBES);
sSignedMessage = Base64Строка(ДД_Подпись);
Возврат sSignedMessage; // Подпись в формате Base64
КонецФункции
Показатьполучаем <tsp value=""/> == Подпись_text_stamp
Подпись_text_stamp = ShtampТекст(Подпись_text);
Функция ShtampТекст(ЭЦП_Подписи)
ИмяФайлаШтампа = ПолучитьИмяВременногоФайла("tsr");
oStamp = Новый COMОбъект("TSPCOM.TSPStamp");
oRequest = Новый COMОбъект("TSPCOM.TSPRequest");
oOID = Новый COMОбъект("CAPICOM.OID");
oOID.Value = "1.2.643.7.1.1.2.2";
oRequest.HashAlgorithm2 = oOID;
oRequest.TSAAddress = "http://tsp.pkitrans.ru/tspca1_niias/tsp.srf";
UTF8Encoding = Новый COMОбъект("System.Text.UTF8Encoding");
oRequest.AddData(UTF8Encoding.GetBytes_4(ЭЦП_Подписи));
оStamp = oRequest.Send();
COMSafeArray = оStamp.Export2();
оStream = Новый COMОбъект("ADODB.Stream");
оStream.Mode = 3;
оStream.Type = 1;
оStream.Open();
оStream.Write(COMSafeArray);
оStream.SaveToFile(ИмяФайлаШтампа, 2);
оStream.Close();
ДвоичныеДанныеШтампа = Новый ДвоичныеДанные(ИмяФайлаШтампа);
sStamp = Base64Строка(ДвоичныеДанныеШтампа);
Возврат sStamp; // Stampa в формате Base64
КонецФункции
Показать<!-- Штамп времени документа(для version = 1 или 2) ->
<!-- * тип данных: строка -->
<tsp value=""/>
выше приведено для 1 – Усиленная неквалифицированная ЭП версия от КриптоПро
oRequest.UseNonce = Истина;
oRequest.PolicyID = "";
oRequest.CertReq = Истина;
Еще такой вопрос - с этрана можно получать пдф гу27 и СМГС 2015(безномерной). xsd схема EtranPrintForm.xsd
У меня по ней получился такой запрос
<getPrintForm version="1.0">
<Doc_ID value="1553041018"/>
<doctype value="0"/>
</getPrintForm>
Но в ответ приходит
<error version="1.0">
<errorCode value="4"/>
<errorMessage value="java.sql.SQLException: ORA-06550: line 1, column 80:"/>
<errorStatusCode value="400"/>
</error>
Не могу понять что не так.
В схеме ни разу не упоминается "value". Зачем оно в запросе?
Спойлер |
|---|
<getPrintForm>
<Doc_ID>1553041018</Doc_ID>
<doctype>0</doctype>
</getPrintForm> |
Сроки работ в основном зависят от сроков поставки физических носителей. По городу доставка занимает около 2-ух недель и закладываю неделю до Вас.
После получения нами средств защиты - мы их откроем их и запланируем установку и работы по аттестации. Поставим и направим Вам дистрибутивы.
Эти мероприятия занимают у нас около 10 дней, но в предложении указал - 15.
Итоговая длительность с учетом поставки - 25 дней.
Стоимость аттестации: 70 000 рублей (в этом месяце)
Разработка всей документации - 140 000 рублей
Настройка средств защиты - 15 000 рублей
Итого: 225 000 руб.
Средства защиты - еще 28 847 руб. Дистрибутив VipNet может добавить 1000 руб, если окажется, что флешка это не дистрибутив, а ключи и если не будет документов на имеющуюся лицензию - 9000 руб она стоит.
По логике должно быть оно. Но у меня не взлетело. Особо не разбирался.
<error version="1.0">
<errorCode value="4"/>
<errorMessage value="Отказ возможен только в состоянии завизировано!"/>
<errorStatusCode value="400"/>
</error>
при попытке ее запросить в ответ приходит - воспользуйтесь getReferenceSPV4664.
Она нормально запрашивается и даже приходит ответ.
В ответе есть поле KOP_VMD (Код операции с вагоном, мне пришел код 51). В расшифровке 14 справке есть еще поле KOP_VMD в котором по идее и говорится что это.
Но в этих справках ничего такого нет. и что за код из какого справочника его тянуть не понятно.
В своих изысканиях дошел до справки getReferenceSPV4723, но она меня послала обратно к getReferenceSPV4664.
В Описание входных и выходных параметров информационных справок (для запроса GetInform) ЕО2020 (30.10.2024)
Наткнулся на АСУОП 3, единое окно и какие то запросы к SQL. Куда и как слать запросы не понял.
В общем кто и как получает данные по дислокации в рамках системы АСУ- АСУ, и как получить расшивку операции над поездом.
Еще такой вопрос - станция оперции с поездом и станция текущей дислокации это одна и та же станция?
если нет как получить станцию текущей дислокации?
Спасибо.
А еще в 4664 есть поле KOP_PMD - код операции в поездной модели. Если вам нужен код поездной операции, то оно будет более поезным.
STAN_OP - это станция операции.
в результате действительно помог гуглинг "описание справочника вагонных операций".
Спасибо.
Типы операций с вагонами/Контейнерами
Операции с поездом (На сайте ржд этого не нашел)
С запросам GetInformNSI из руководства не разобрался.
Запрос из примера
<GetInformNSI>
<getTN_DOR_ADM>
<TN_DOR_ADMRequest>
<kodAdm>1</kodAdm>
</TN_DOR_ADMRequest>
</getTN_DOR_ADM>
</GetInformNSI>
вернул "Сервер АСОУП вернул ошибку! Обратитесь в АСОУП."
Если все же ктото знает как получить эту же информацию силами АСУ-АСУ - прошу ткнуть носом чуть конкретнее чем во все руководство разработчика.
<GetInformNSI>
<ns0:getTN_EO_DIC_OBJECTS xmlns:ns0="http://service.siw.pktbcki.rzd/">
<ns0:TN_EO_DIC_OBJECTSRequest>
<classId>2086</classId>
</ns0:TN_EO_DIC_OBJECTSRequest>
</ns0:getTN_EO_DIC_OBJECTS>
</GetInformNSI>
, пример где
• ID_CLASS = 2084 - Грузовые операции с вагонами
• ID_CLASS = 2083 - Операции с поездами
• ID_CLASS = 2086 - Операции с контейнерами
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 75626
Создание 17.09.10 11:56
Обновление 17.09.10 11:56
Просмотры 55491
Загрузки 0
Рейтинг
32
Комментарии 226
Код открыт Не указано
Рубрики Внешние источники данных Документооборот и делопроизводство (СЭД)
Кому Для всех
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Россия
Отрасль
Транспорт, автопарки, такси
,
ИТ-компания
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)