Стартовая страница › Форумы › Разработка и интеграция › Получение информации из 1С
Помечено: 1С
- В этой теме 17 ответов, 5 участников, последнее обновление 3 года, 9 месяцев назад сделано
a80808.
-
АвторСообщения
-
13.08.2022 в 20:46 #24386
Yury
УчастникПодскажите пожалуйста, возможно ли получить данные от SCADA-сервера по запросу от 1С? Т.е. в 1С по событию/кнопке получить текущие данные определенных каналов. Если да, то как это реализовано?
13.08.2022 в 21:04 #24387
manjey73Участник@User2022 Scada может экспортировать каналы в БД, а 1С насколько понимаю может строить запросы к БД.
Если есть возможность, используйте 6-ю версию Scada, она вроде как напрямую может писать данные в PostgreSQL без использования встроенной БД
13.08.2022 в 21:19 #24390Yury
УчастникКак раз нет необходимости, чтобы SCADA куда-то что-то дополнительно писала. Желательно получать информацию от SCADA по требованию.
13.08.2022 в 21:38 #24391Yury
УчастникЕще на сайте нашел:
Считать данные Rapid SCADA и преобразовать в набор объектов можно с помощью библиотеки ScadaData.dll. Актуальную версию этой библиотеки можно получить, установив Rapid SCADA и выполнив поиск файла ScadaData.dll в директории установки.
Только 1С, насколько мне известно, позволяет подключать в качестве внешних компонент библиотеки, которые работают как COM. Данная библиотека собрана как COM?
13.08.2022 в 23:28 #24392
manjey73Участник@User2022 имелось ввиду, что 6-ю версию можно настроить двумя способами.
1. Она сохраняет все во встроенную БД и тогда вот надо либо через webAPI получать данные или через библиотеку, не знаю, насколько реализовано то или иное в 6-й версии2. убрать запись во встроенную БД а использовать в качестве хранения данных PostgreSQL
насколько понимаю, получать данные из postgre 1С вполне умеет без дополнительного написания кода или еще чего-то, то есть путь должен уже многими пройден по сотни раз.
15.08.2022 в 09:48 #24419
MikhailМодераторВы можете получить данные из Rapid SCADA через БД, REST API, TCP-протокол, MQTT, ещё различными способами. Выбирайте наиболее удобный вариант.
15.08.2022 в 09:50 #24420
MikhailМодераторТолько 1С, насколько мне известно, позволяет подключать в качестве внешних компонент библиотеки, которые работают как COM. Данная библиотека собрана как COM?
Интеграция через COM-объекты не поддерживается и не планируется, т.к. этот стандарт устаревший и используется только в Windows. То есть если 1С, кроме COM ничего не умеет, то потребуется написать свой промежуточный модуль.
-
Ответ изменён 3 года, 9 месяцев назад пользователем
Mikhail.
15.08.2022 в 11:26 #24435Yury
УчастникВы можете получить данные из Rapid SCADA через БД, REST API, TCP-протокол, MQTT, ещё различными способами. Выбирайте наиболее удобный вариант.
Где можно почитать про получение данных через REST API RapidScada, описание?
15.08.2022 в 13:06 #24438
manjey73УчастникПо API была вроде тема на форуме
15.08.2022 в 13:11 #2443915.08.2022 в 13:21 #24440Yury
УчастникДумаю, что этой информации будет достаточно, чтобы написать свой модуль в 1С.
Премного благодарен.15.08.2022 в 19:34 #24445Yury
УчастникВсе получилось. Спасибо!
16.08.2022 в 17:30 #24456
MikhailМодераторКаким же образом интегрировали в итоге?
16.08.2022 в 18:26 #24461Yury
УчастникЧерез стандартные для 1С HTTPСоединение и HTTPЗапрос. Затык возник только с тем, что после запроса авторизации мы получали положительный результат в ответ, а вот второй и последующие запросы выдавали, что пользователь не вошел. Логично сразу было предположить, что где-то была проблема с сессией, но даже в рамках одного HTTPСоединение второй запрос возвращал неуспех. Тогда оставался вариант, что SCADA-сервер определяет сессию по кукам, что оказалось верным. Чтение из заголовка установленных кук, и отправка их же обратно в следующем запросе дала свои плоды. Теперь можно кнопкой в программе 1С заполнить данные со всех счетчиков Меркурий. Сейчас еще СПТ940 прикручу и Valtec (Протей), чтобы и тепло с водой снимать со всех счетчиков в цехе и на удаленных объектах.
Если кому нужно, код для 1С для получения текущих значений каналов:Функция ПолучитьСтруктуруАвторизации() СтруктураАвторизации = Новый Структура("Адрес,Логин,Пароль,Таймаут", Новый Структура("Хост,Порт", "www.motsins.local", 80), "1CRestAPI", "12345", 30); Возврат СтруктураАвторизации; КонецФункции Функция Запрос(Знач АдресФункции, Знач ИдентификаторСессии = Неопределено, Параметры, ВернутьСтруктуру = Ложь) Экспорт СтруктураАвторизации = ПолучитьСтруктуруАвторизации(); РезультатСтруктура = Новый Структура("Результат,Заголовки,Адрес,Метод,Запрос,КодСостояния,Ответ,Cookie", Неопределено, Новый Массив); ОтветJSON = Новый Соответствие; Адрес = СтруктураАвторизации.Адрес; АдресАдрес = МОТСИНС_ПочтовыйТрекингСервер.ДополнитьАдресПараметрами(АдресФункции, Параметры); Попытка //Устанавливаем соединение ЗащищенноеСоединение = ?(Адрес.Порт = 443, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено); HTTPСоединение = Новый HTTPСоединение(Адрес.Хост, Адрес.Порт,,,, СтруктураАвторизации.Таймаут, ЗащищенноеСоединение); HTTPЗаголовки = Новый Соответствие; HTTPЗаголовки.Вставить("Content-type", "application/json;charset=UTF-8"); HTTPЗаголовки.Вставить("Accept", "application/json"); Если ЗначениеЗаполнено(ИдентификаторСессии) Тогда HTTPЗаголовки.Вставить("Cookie", ИдентификаторСессии); КонецЕсли; HTTPЗапрос = Новый HTTPЗапрос(АдресАдрес, HTTPЗаголовки); HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос); Если ЗначениеЗаполнено(ИдентификаторСессии) Тогда РезультатСтруктура.Cookie = ИдентификаторСессии; Иначе РезультатСтруктура.Cookie = HTTPОтвет.Заголовки.Получить("Set-Cookie"); КонецЕсли; ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8); РезультатСтруктура.Ответ = ТекстОтвета; Если Найти(ТекстОтвета, "{") > 0 ИЛИ Найти(ТекстОтвета, "[") > 0 Тогда ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ТекстОтвета); ОтветJSON = ПрочитатьJSON(ЧтениеJSON, Истина); Иначе ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Получен неверный ответ от сервера."); КонецЕсли; Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Запрос: " + ОписаниеОшибки()); КонецПопытки; Если ОтветJSON["d"] <> Неопределено И ТипЗнч(ОтветJSON["d"]) = Тип("Строка") Тогда ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ОтветJSON["d"]); ОтветJSON = ПрочитатьJSON(ЧтениеJSON, Истина); РезультатСтруктура.Результат = ОтветJSON; КонецЕсли; Возврат ?(ВернутьСтруктуру, РезультатСтруктура, РезультатСтруктура.Результат); КонецФункции // Производит авторизацию на сервере RapidSCADA Функция Авторизация(ИдентификаторСессии = Неопределено) Экспорт СтруктураАвторизации = ПолучитьСтруктуруАвторизации(); Параметры = Новый Структура("username,password", КодироватьСтроку(СтруктураАвторизации.Логин, СпособКодированияСтроки.КодировкаURL), КодироватьСтроку(СтруктураАвторизации.Пароль, СпособКодированияСтроки.КодировкаURL)); Ответ = Запрос("/scada/ClientApiSvc.svc/Login", , Параметры, Истина); Если Ответ = Неопределено ИЛИ Ответ.Результат = Неопределено Тогда Возврат Ложь; КонецЕсли; Если ТипЗнч(Ответ.Cookie) = Тип("Строка") Тогда CookieМассив = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Ответ.Cookie, ";"); ИдентификаторСессии = CookieМассив[0]; КонецЕсли; Если Ответ.Результат["Data"] = Неопределено ИЛИ Ответ.Результат["Data"] <> Истина Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции // Получает и возвращает текущие данные канала Функция ПолучитьТекущиеДанныеКанала(Знач ИдентификаторСессии, НомерКанала) Экспорт Результат = Новый Структура("Значение,Статус"); СтруктураАвторизации = ПолучитьСтруктуруАвторизации(); Параметры = Новый Структура("cnlNum", НомерКанала); Ответ = Запрос("/scada/ClientApiSvc.svc/GetCurCnlData", ИдентификаторСессии, Параметры); Если Ответ = Неопределено Тогда Возврат Результат; КонецЕсли; Если Ответ["Data"] = Неопределено ИЛИ Ответ["Data"] = Ложь ИЛИ ТипЗнч(Ответ["Data"]) <> Тип("Соответствие") Тогда Возврат Результат; КонецЕсли; Если Ответ["Data"]["Val"] <> Неопределено Тогда Результат.Значение = Ответ["Data"]["Val"]; КонецЕсли; Если Ответ["Data"]["Stat"] <> Неопределено Тогда Результат.Статус = Ответ["Data"]["Stat"]; КонецЕсли; Возврат Результат; КонецФункции-
Ответ изменён 3 года, 9 месяцев назад пользователем
Mikhail.
17.08.2022 в 14:19 #24479
MikhailМодераторПолезная информация, спасибо.
-
Ответ изменён 3 года, 9 месяцев назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.