Получение информации из 1С

Стартовая страница Форумы Разработка и интеграция Получение информации из 1С

Помечено: 

Просмотр 15 сообщений - с 1 по 15 (из 18 всего)
  • Автор
    Сообщения
  • #24386
    Yury
    Участник

    Подскажите пожалуйста, возможно ли получить данные от SCADA-сервера по запросу от 1С? Т.е. в 1С по событию/кнопке получить текущие данные определенных каналов. Если да, то как это реализовано?

    #24387
    manjey73
    Участник

    @User2022 Scada может экспортировать каналы в БД, а 1С насколько понимаю может строить запросы к БД.

    Если есть возможность, используйте 6-ю версию Scada, она вроде как напрямую может писать данные в PostgreSQL без использования встроенной БД

    • Ответ изменён 3 года, 9 месяцев назад пользователем manjey73.
    • Ответ изменён 3 года, 9 месяцев назад пользователем manjey73.
    #24390
    Yury
    Участник

    Как раз нет необходимости, чтобы SCADA куда-то что-то дополнительно писала. Желательно получать информацию от SCADA по требованию.

    #24391
    Yury
    Участник

    Еще на сайте нашел:

    Считать данные Rapid SCADA и преобразовать в набор объектов можно с помощью библиотеки ScadaData.dll. Актуальную версию этой библиотеки можно получить, установив Rapid SCADA и выполнив поиск файла ScadaData.dll в директории установки.

    Только 1С, насколько мне известно, позволяет подключать в качестве внешних компонент библиотеки, которые работают как COM. Данная библиотека собрана как COM?

    #24392
    manjey73
    Участник

    @User2022 имелось ввиду, что 6-ю версию можно настроить двумя способами.
    1. Она сохраняет все во встроенную БД и тогда вот надо либо через webAPI получать данные или через библиотеку, не знаю, насколько реализовано то или иное в 6-й версии

    2. убрать запись во встроенную БД а использовать в качестве хранения данных PostgreSQL

    насколько понимаю, получать данные из postgre 1С вполне умеет без дополнительного написания кода или еще чего-то, то есть путь должен уже многими пройден по сотни раз.

    #24419
    Mikhail
    Модератор

    Вы можете получить данные из Rapid SCADA через БД, REST API, TCP-протокол, MQTT, ещё различными способами. Выбирайте наиболее удобный вариант.

    #24420
    Mikhail
    Модератор

    Только 1С, насколько мне известно, позволяет подключать в качестве внешних компонент библиотеки, которые работают как COM. Данная библиотека собрана как COM?

    Интеграция через COM-объекты не поддерживается и не планируется, т.к. этот стандарт устаревший и используется только в Windows. То есть если 1С, кроме COM ничего не умеет, то потребуется написать свой промежуточный модуль.

    • Ответ изменён 3 года, 9 месяцев назад пользователем Mikhail.
    #24435
    Yury
    Участник

    Вы можете получить данные из Rapid SCADA через БД, REST API, TCP-протокол, MQTT, ещё различными способами. Выбирайте наиболее удобный вариант.

    Где можно почитать про получение данных через REST API RapidScada, описание?

    #24438
    manjey73
    Участник

    Что-то здесь

    По API была вроде тема на форуме

    #24439
    manjey73
    Участник
    #24440
    Yury
    Участник

    Думаю, что этой информации будет достаточно, чтобы написать свой модуль в 1С.
    Премного благодарен.

    #24445
    Yury
    Участник

    Все получилось. Спасибо!

    #24456
    Mikhail
    Модератор

    Каким же образом интегрировали в итоге?

    #24461
    Yury
    Участник

    Через стандартные для 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.
    #24479
    Mikhail
    Модератор

    Полезная информация, спасибо.

Просмотр 15 сообщений - с 1 по 15 (из 18 всего)
  • Для ответа в этой теме необходимо авторизоваться.