Javascript (Yandex api) Вернуть в 1С значение переменной

1. Xirurg1C 17.10.12 07:16 Сейчас в теме
Привет,
Подскажите как из функции яваскрипта вернуть значение переменной в 1С?

Сама функция:

function DobavitMarshrut(Tochka1, Tochka2)    {

		var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);
		map.setCenter(new YMaps.GeoPoint(82.921597, 55.029910), 13);

		var router = new YMaps.Router([Tochka1, Tochka2], [1]);

		map.addOverlay(router);

		YMaps.Events.observe(router, router.Events.Success, function() {
			
			Distance = router.getDistance();
                
                        //Элементам на странице присваиваем значения
			document.getElementById('TochkaNachalo').value = Tochka1;
			document.getElementById('TochkaKonec').value = Tochka2;
			document.getElementById('Rasstoyanie').value = Distance;
			
		});
        
		return 'Вернуть бы сюда Distance' + document.getElementById('Rasstoyanie').value;
        	
}
Показать


в 1С код такой:

Расстояние = ЭлементыФормы.Карта.Document.parentWindow.DobavitMarshrut(Точка1,Точка2);


Но в переменную Расстояние значение переменной Distance никак не возвращается. Для наглядного примера прикрепил обработку. Подскажите, пожалуйста.
Прикрепленные файлы:
ВнешняяОбработка1.epf
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. boolean 28 21.12.12 16:38 Сейчас в теме
У меня получилось вот так решить данную задачу
Но я не загружаю саму карту а просто веду подсчет
Макет
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>logistic.</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <script src="http://api-maps.yandex.ru/2.0/?load=package.route&lang=ru-RU"
            type="text/javascript"></script>
    <script type="text/javascript">
            ymaps.ready(init);   
        function init() { 
            
			

        } 

function  m(point1, point2) {
ymaps.route([point1, point2], {
            }).then(function (route) {				
				 var perem = document.getElementById("backperem");
			     var rastoyanie = route.getLength();
			     var r =  parseFloat(rastoyanie);
                 
                 backperem.innerHTML=rastoyanie;
								 
            }, function (error) {
                backperem.innerHTML="error";
            });
            
              //alert (backperem.innerHTML);
              var r = backperem.innerHTML;
              return r;
             
			
			}		
</script>
</head>
<body> 
<div style="DISPLAY: none" id=backperem></DIV>
</body>
</html>
Показать


Процедуры в 1С

Процедура ПаузаВыполнить(чСекунд) 
	    
    cmdLine= "ping -n 1 -w " + Формат(1000*чСекунд, "ЧГ=0")+" 0.0.0.1";
    
    WshShell = Новый COMОбъект("WScript.Shell");
    
    WshShell.Run(cmdLine, 0, -1);

КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
	
	БазаДнепропетровск = "'48.504213, 35.000205'";
	
	
	//Точка1 = "'48.513591, 35.089534'";
	//Точка2 = "'48.528668, 35.031994'"; 
	
	Для каждого Строка Из Клиенты Цикл
	Строка.Расстояние = 0;	
	Точка2 ="'"+ СтрЗаменить(Строка.GPSX,",",".")+", "+ СтрЗаменить(Строка.GPSY,",",".")+"'";	
	Строка.Расстояние = РасчетРастояния(БазаДнепропетровск,Точка2);	
	
	КонецЦикла; 
	
		
//Сообщить(ОтветJS);
   
  
 

КонецПроцедуры

Процедура ПриОткрытии()
	Текст = ПолучитьМакет("Макет").ПолучитьТекст();	
	ЭлементыФормы.Карта.УстановитьТекст(Текст);

КонецПроцедуры

Функция РасчетРастояния(Точка1,Точка2)
	
	Растояние = "";
	Растояние = ЭлементыФормы.карта.Документ.parentWindow.eval("m(" + Точка2 +"," + Точка1 + ")");
	
	Если Растояние = "" Тогда
		ПаузаВыполнить(1);
		Растояние = ЭлементыФормы.карта.Документ.parentWindow.eval("m(" + Точка2 +"," + Точка1 + ")");
		Если Растояние = "" Тогда
			ПаузаВыполнить(5);
			Растояние = ЭлементыФормы.карта.Документ.parentWindow.eval("m(" + Точка2 +"," + Точка1 + ")");
		КонецЕсли; 	
	КонецЕсли; 
	
	
	Возврат Растояние;
	
КонецФункции
Показать
8. Sas001 16.11.17 19:16 Сейчас в теме
(7)
олнить(5);
Растояние = ЭлементыФормы.карта.Документ.parentWindow.eval("m(" + Точка2 +"," + Точка1 +

а как это же самое проделать для управляющих форм без элемента формы Карта?
2. logos 211 17.10.12 08:28 Сейчас в теме
А через eval пробовал?
ЭлементыФормы.Карта.Document.parentWindow.eval("DobavitMarshrut("+Точка1+","+Точка2+");");

Единственное но, в этом случае нужно проверить соответствие типов, возможно придётся преобразовать строку в флоат.
3. Xirurg1C 17.10.12 09:06 Сейчас в теме
(2) eval не помог.

Если на форме в 1С сделать две кнопки:

1-ая - Которая вызовет функцию DobavitMarshrut(Точка1,Точка2), которая в свою очередь элементу на странице присвоит значение (дистанцию): document.getElementById('Rasstoyanie').value = Distance;

Подождать, пока страница загрузится, увидеть, что на странице элементу "Rasstoyanie" присвоилось значение.

2-ой кнопкой вызвать значение этого поля: Сообщить(ЭлементыФормы.Карта.Document.getElementById("Rasstoyanie").value);
Тогда все отображается, но сделать это одной кнопкой не получается...
4. logos 211 17.10.12 11:02 Сейчас в теме
Я думаю дело в асинхронном вызове расчета маршрута роутером. Ты подписываешься на событие
router.Events.Success
и в обработчике события заполняешь поле с дистанцией. При попытке получить поле дистанции когда сервер ещё не вернул значение расстояния, получаешь ничего. Поэтому необходимо уведомить 1С, что сервер вернул данные дистанции. Попробуй сделать fireEvent('onclick') после присвоения дистанции какого то значения. Только нужно будет ещё разместить где то доп. признак того, что это событие произошло для получения данных дистанции, а не из-за нажатия на поле хтмл документа
5. boolean 28 21.12.12 13:04 Сейчас в теме
Xirurg1C, Получилось ли победить данную проблему
6. Xirurg1C 21.12.12 13:12 Сейчас в теме
Пока проблему решил так:

на страницу(в макет) поместил кнопку:
<P><BUTTON id=oButton disabled>Маршрутизатор</BUTTON></P>

в яваскрипте в обработчике события router.Events.Success вставил oButton.fireEvent("onclick");

и перехватываю его в 1с уже через событие onclick в свойствах элемента ПолеHTMLДокумента
9. Jekka83 21.10.23 15:33 Сейчас в теме
Малоли кто наткнется на этот пост, но я проблему решил так, при построении маршрута на карте заполняю какой нибудь DIV расстоянием, а в 1с после отправки данных с маршрутом, запускаю процедуру через ЗапуститьОбработчикОжидания с интервалом в 1с, однократно, и считываю данные с этого дива
P.s сори, объяснялся еще тот )))

JS
var DataChanged = false;
function MakeRoute(coords) {
				arraycoords = JSON.parse("[" + coords + "]");
				ymaps.route(arraycoords, {
					viewAutoApply: true,
					mapStateAutoApply: true, 
					routingMode: "auto",
				}).then(function (route) {
						activeRoutePaths = route.getPaths();
						route.getHumanLength();
						myMap.geoObjects.add(myRoute = route.getPaths());
						document.getElementById('dlinamarshruta').innerHTML = route.getHumanLength() + ".";
						var path_text = "";
						for (var i = 0; i < route.getPaths().getLength(); i++) {
                        	way = route.getPaths().get(i); 
                        	delim = path_text==="" ? "" : ";"; 
                            path_text = path_text + delim + way.getHumanLength();
                  	    }
                        document.getElementById('otrezkiMarshruta').innerHTML = path_text;
                        DataChanged = true;
					}
				);

			}
Показать


1C
&НаКлиенте
Процедура ПостроитьМаршрут()
	ОтключитьОбработчикОжидания("ПрочитатьДанныеСКарты");
	Если ЯндексКарта = "" или Элементы.ЯндексКарта.Документ.readyState = "loading" Тогда
		Возврат;	
	КонецЕсли;

	Элементы.ЯндексКарта.Документ.defaultView.OchistitMarshrutes();
	Элементы.ЯндексКарта.Документ.defaultView.OchistitKartu();
	Маршрут = ПолучитьАдресаДоставкиПоМаршрутномуЛисту();
	Если Маршрут = Неопределено Тогда
		Возврат;	
	КонецЕсли;
	
	Элементы.ЯндексКарта.Документ.defaultView.Marshrutes(Маршрут);
	
	ПодключитьОбработчикОжидания("ПрочитатьДанныеСКарты",1, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьДанныеСКарты()
	Если Элементы.ЯндексКарта.Документ.defaultView.DataChanged Тогда
		Объект.Ф_ДлинаМаршрута = Элементы.ЯндексКарта.Документ.document.getElementById("dlinamarshruta").innerText;
		ОтрезкиМаршрута = Элементы.ЯндексКарта.Документ.document.getElementById("otrezkiMarshruta").innerText;

		МассивОтрезков = СтрРазделить(ОтрезкиМаршрута, ";");
		к = 0;
		Для каждого стр из Объект.Маршрут Цикл
			стр.Ф_ДлинаМаршрута = МассивОтрезков[к]; 
			к = к + 1;
		КонецЦИкла;
		
		
		Элементы.ЯндексКарта.Документ.defaultView.DataChanged = false;

	КонецЕсли;
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот