gifts2017

Javascript и 1С. Кросс-платформенное взаимодействие

Опубликовал Виталий Чебан (VitaliyCeban) в раздел Программирование - Практика программирования

Что делать, если необходим богатый интерфейс, а управляемые формы нам его не могут обеспечить? Использовать HTML и JavaScript. В статье рассмотрено взаимодействие кода 1С и JavaScript, работающее на любой платформе: толстый, тонкий и веб-клиент, под Windows и Linux.

На текущий момент штатные средства 1С в управляемых формах не могут в полной мере удовлетворить потребность в богатом и отзывчивом интерфейсе. Ведь, по словам разработчиков платформы, управляемые формы призваны обеспечить быструю и эффективную разработку бизнес-логики приложения, с некоторым ущербом интерфейсу. Для абсолютного большинства ситуаций это верный подход, но есть случаи, когда необходимо и то, и другое.
Решением является использование HTML и JavaScript.

Предлагается решение, которое работает как в тонком, так и в веб-клиенте. Под Windows и Linux.

Примечание: при упоминании работоспособности в тонком клиенте, также подразумевается работоспособность и в толстом клиенте (управляемое приложение).



Взаимодействие кода 1С и JavaScript.

Вызов методов языка JavaScript из кода 1С.

Методы JavaScript могут быть вызваны из 1C так:

<Окно документа>.funcName(funcArgs);

Глобальные переменные доступны следующим образом:

<Окно документа>.varName;

Для браузера Internet Explorer окно документа доступно через

Элементы.ПолеHTMLДокумента.Документ.parentWindow

Для остальных браузеров через

Элементы.ПолеHTMLДокумента.Документ.defaultView


Подготовка переменных модуля для взаимодействия с JavaScript и вызов функции:

&НаКлиенте
Перем ДокументПервогоБраузера;

&НаКлиенте
Перем ОкноПервогоБраузера;

&НаКлиенте
Процедура ПервыйБраузерДокументСформирован(Элемент)
		
	// Сохранение элементов document и window в переменные модуля формы,
	// для последующего быстрого доступа к элементам и функциям.
	ДокументПервогоБраузера = Элемент.Документ;
	ОкноПервогоБраузера 	= ДокументПервогоБраузера.parentWindow; // IE
	Если ОкноПервогоБраузера = Неопределено Тогда
		ОкноПервогоБраузера = ДокументПервогоБраузера.defaultView; // Прочие браузеры
	КонецЕсли;

	ОкноПервогоБраузера.createButtons(МассивКнопокПервогоБраузера);

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

Подробнее остановимся на передаваемых агрументах.

В тонком клиенте под Windows, помимо примитивных типов Строка, Число, Булево.., в функцию JavaScript можно передавать и  нативные объекты 1С, такие как Структура, Массив, Соответствие, УправляемаяФорма, и др. Затем, в теле javascript функции доступны свойства и методы этих объектов.

Пример:

&НаКлиенте
Процедура СоздатьКнопки(Команда)
	
	МассивКнопок = Новый Массив;	
	...
	Для Сч = 1 По КоличествоКнопок Цикл
		...
		СтруктураКнопки = Новый Структура;
		СтруктураКнопки.Вставить("Заголовок", 		ЗаголовокКнопки);
		СтруктураКнопки.Вставить("ИмяКоманды", 		ИмяКоманды);
		СтруктураКнопки.Вставить("РазмерТекста", 	РазмерТекста);
		СтруктураКнопки.Вставить("ЦветТекста", 		ЦветТекста);
				
		МассивКнопок.Добавить(СтруктураКнопки);
	КонецЦикла;		
	
	ОкноПервогоБраузера.createButtons(МассивКнопок);
	
КонецПроцедуры
function createButtons(buttonsArray)
{
	var buttonsCount = buttonsArray.Количество(); // Доступны методы и свойства массива 1С
	for(var i = 0; i < buttonsCount; i++)
	{
		var ПараметрыКнопки = buttonsArray.Получить(i);

		var btn = document.createElement('div'); 
		btn.id 			= ПараметрыКнопки.ИмяКоманды; 
		btn.innerText 		= ПараметрыКнопки.Заголовок;	
		btn.style.fontSize 	= ПараметрыКнопки.РазмерТекста;			
		btn.style.color 	= ПараметрыКнопки.ЦветТекста;	
		 				
		container.appendChild(btn);                        
	}  
}  

Данный метод очень удобен, и он подходит, если хватает возможности работы в тонком клиенте в ОС Windows.

В тонком клиенте под Linux, а также в веб-клиенте метод не работает. При передаче структур, массивов, соответствий в аргумент функции, в её теле эти агрументы равны undefined. Работает передача строк, чисел, булев.

Решением возникшей проблемы является использование формата обмена данными JSON. Что это такое - см. https://ru.wikipedia.org/wiki/JSON

Массивы, Структуры и Соответствия преобразуются в их строковое представление, и передаются в функцию. Затем, в теле функции они преобразовываются в объекты языка javascript, такие как Array и Object.

Функции сериализации и десериализации в/из JSON:

&НаКлиенте
Функция СериализоватьВJSON(СериализуемыйОбъект)
	
	#Если ВебКлиент Тогда	
		СтрокаJSON = СериализоватьВJSONНаСервере(СериализуемыйОбъект);
	#Иначе
		ЗаписьJSON = Новый ЗаписьJSON; 
		ЗаписьJSON.УстановитьСтроку();
		НастройкиСериализации = Новый НастройкиСериализацииJSON();
		НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Ложь;
		ЗаписатьJSON(ЗаписьJSON, СериализуемыйОбъект, НастройкиСериализации, "ПреобразованиеВJSON", ЭтотОбъект); 
		СтрокаJSON = ЗаписьJSON.Закрыть();
	#КонецЕсли
	
	Возврат СтрокаJSON; 

КонецФункции 

&НаСервереБезКонтекста
Функция СериализоватьВJSONНаСервере(СериализуемыйОбъект)
	
	ЗаписьJSON = Новый ЗаписьJSON; 
	ЗаписьJSON.УстановитьСтроку();
	НастройкиСериализации = Новый НастройкиСериализацииJSON();
	НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Ложь;
	ЗаписатьJSON(ЗаписьJSON, СериализуемыйОбъект); 
	// ЗаписатьJSON(ЗаписьJSON, СериализуемыйОбъект, НастройкиСериализации, "ПреобразованиеВJSON", ЭтотОбъект); 
	//
	// ЭтотОбъект недоступнен в безконтекстном вызове, поэтому нужно либо поместить эту функцию в общий модуль, 
	// либо изменить директиву компиляции в &НаСервере
	СтрокаJSON = ЗаписьJSON.Закрыть();
		
	Возврат СтрокаJSON; 

КонецФункции 

&НаКлиентеНаСервереБезКонтекста
Функция ПреобразованиеВJSON(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
	
	// Данная функция вызывается для всех свойств, тип которых не поддерживает преобразование в формат JSON напрямую.
	// Они нам не нужны, поэтому всегда отказ от их записи.
	Отказ = Истина;	
	
	// Можно сделать преобразование в строку.
	// Значение = Строка(Значение);
	// Возврат Значение;
	
КонецФункции

&НаКлиенте
Функция ДесериализоватьИзJSON(СтрокаJSON)
	
	#Если ВебКлиент Тогда
		ДесериализованныйОбъект = ДесериализоватьИзJSONНаСервере(СтрокаJSON);
	#Иначе
		ЧтениеJSON = Новый ЧтениеJSON(); 
		ЧтениеJSON.УстановитьСтроку(СтрокаJSON); 
		ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON); 
		ЧтениеJSON.Закрыть();
	#КонецЕсли	
	
	Возврат ДесериализованныйОбъект;
	
КонецФункции

&НаСервереБезКонтекста
Функция ДесериализоватьИзJSONНаСервере(СтрокаJSON)
	
	ЧтениеJSON = Новый ЧтениеJSON(); 
	ЧтениеJSON.УстановитьСтроку(СтрокаJSON); 
	ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON); 
	ЧтениеJSON.Закрыть();
	
	Возврат ДесериализованныйОбъект;
	
КонецФункции

Используются механизмы работы с JSON, реализованные в платформе 8.3.6.1977.

Для платформы 8.3.5 и ранее, можно использовать разработку господина Александра Переверзева, доступную по адресу http://infostart.ru/public/119601/.

Теперь, прежде чем передавать структуру в функцию JavaScript, преобразуем её в строку:

JSONМассивКнопокПервогоБраузера = СериализоватьВJSON(МассивКнопокПервогоБраузера);
ОкноПервогоБраузера.createButtons(JSONМассивКнопокПервогоБраузера);

Изменится и код функции Javascript, так как строку нужно преобразовать обратно в объект, пусть и не 1С-овский, но удобный для обработки:

function createButtonsWithJSON(buttonsData)
{
	var buttonsData = JSON.parse(buttonsData);
	
	for(var i in buttonsData)
	{
		var ПараметрыКнопки = buttonsData[i];

		var btn = document.createElement('li'); 
		btn.id = ПараметрыКнопки.ИмяКоманды; 
		...                                    
	}
}  

Глобальный объект JSON, используемый для сериализации и парсинга (десериализации) в javascript, доступен начиная с Internet Explorer 8.

HTML документ в тонком клиенте, по умолчанию, даже при наличии установленного IE11, отображается в режиме совместимости с IE5 (Quirks mode), поэтому необходимо его перевести в Standarts mode установной тега <meta http-equiv="X-UA-Compatible" content="IE=EDGE" /> в теле тега head.

Если на компьютере установлен IE7 (когда переход в режим минимум IE8 невозможен), то нужно использовать следующий скрипт: https://github.com/douglascrockford/JSON-js/blob/master/json2.js

который реализует функционал работы с JSON в IE < 8 (по аналогии с работой с JSON в платформе начиная с версии 8.3.6.1977, и до неё).

В функции javascript можно создавать массивы или объекты javascript, заполнять их, и возвращать в 1C.

&НаКлиенте
Процедура ПолучитьОбъектИзJavaScript(Команда)
	
	JSONСтруктураОтвета = ОкноПервогоБраузера.getDataFromJavaScript(""); 
	// Нужно передать любой параметр, например пустую строку, иначе функция не выполняется,
	// а переменной принимающей результат присваивается ссылка на эту функцию (COMОбъект).	
	СтруктураОтвета = ДесериализоватьИзJSON(JSONСтруктураОтвета);
	
	Для Каждого КлючИЗначение Из СтруктураОтвета Цикл
		Сообщить("Ключ: " + КлючИЗначение.Ключ + " Значение: " + КлючИЗначение.Значение);	
	КонецЦикла;
	
КонецПроцедуры
function getDataFromJavaScript()
{
	var arr = []; // Массив
	arr.push(555);
	arr.push("Строка в массиве");
	
 	var obj = {}; // Объект (структура)
 	obj["Ключ1"] = "Пробная строка";
 	obj["Ключ2"] = 7777;
 	obj["Ключ3"] = true;
 	obj["Ключ4"] = arr;
 	
 	return JSON.stringify(obj);
}

Вызов методов 1С из JavaScript

В тонком клиенте под Windows доступен очень удобный метод:

В HTML документе создается глобальная переменная, например externalForm. При загрузке документа, переменной externalForm присваивается ссылка на текущую упрваляемую форму, доступную через ЭтотОбъект или ЭтаФорма.

Затем, в коде JavaScript становятся доступны любые клиентские экспортные методы и переменные модуля данной управляемой формы.

Пример:

// В документе html, в теге script объявляем глобальную переменную.
var externalForm = null;
var timer = null;
var counter = 0;

function startTimer() 
{        
    alert(externalForm.ПеременнаяМодуля);
            
    timer = setInterval(function() 
    {
        externalForm.МетодВызываемыйИзJavaScript("Значение переменной conunter: " + counter++);
    }, 1000);
}

function stopTimer()
{
    clearInterval(timer);
}
&НаКлиенте
Перем ПеременнаяМодуля Экспорт;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    ...
    ПеременнаяМодуля = "Значение переменной модуля";
    
КонецПроцедуры

&НаКлиенте
Процедура ПервыйБраузерДокументСформирован(Элемент)
	
	...		
	ОкноПервогоБраузера.externalForm = ЭтаФорма;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗапуститьТаймер(Команда)
	
	ОкноПервогоБраузера.startTimer();
	
КонецПроцедуры

&НаКлиенте
Процедура ОстановитьТаймер(Команда)
	
	ОкноПервогоБраузера.stopTimer();
	
КонецПроцедуры

&НаКлиенте
Процедура МетодВызываемыйИзJavaScript(Данные) Экспорт
    
    Сообщить(Данные);
    
КонецПроцедуры

В тонком клиенте на Linux и в веб-клиенте методы и свойства переменной externalForm не доступны в javascript, их значение - undefined, поэтому используется следующая методика:

Объявляем глобальную переменную javascript, в которую будем помещать передаваемое значение.

var interactionVariable = null;

В документ добавляем невидимую кнопку

<button id="interactionButton" style="display: none">Кнопка взаимодействия</button>

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

interactionVariable = "МетодВызываемыйИзJavaScript через interactionButton. Значение переменной conunter: " + counter;
interactionButton.click();

И обрабатываем событие ПриНажатии у поля HTML документа.

&НаКлиенте
Процедура ПервыйБраузерПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	
	НажатыйЭлемент = ДанныеСобытия.Element;
	Если НажатыйЭлемент.id = "interactionButton" Тогда
		МетодВызываемыйИзJavaScript(ОкноПервогоБраузера.interactionVariable);
		
		// Или: Заглушка = Вычислить(ОкноПервогоБраузера.interactionVariable + "()");
		// Поле для фантазии большое	
	КонецЕсли;
	
КонецПроцедуры

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

Прикреплена демонстрационная обработка.

Скачать файлы

Наименование Файл Версия Размер
ВзаимодействиеJavaScriptИ1C 70
.epf 12,23Kb
28.07.16
70
.epf 12,23Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Виталий Чебан (VitaliyCeban) 14.09.15 11:59
Еще один интересный приём передачи данных JavaScript -> 1C, работающий только в тонком/толстом клиентах на Windows.

function call1C()
{
	var obj = externalForm.ВычислитьКод1СИзJavascript("Новый Структура");
	obj.Вставить("ПолеСтруктуры", "Значение поля стурктуры");
	externalForm.МетодВызываемыйИз1С(obj);
}

&НаКлиенте
Функция ВычислитьКод1СИзJavascript(Код) Экспорт
	
	Возврат Вычислить(Код);
		
КонецФункции

&НаКлиенте
Функция МетодВызываемыйИз1С(Данные) Экспорт
	
	Сообщить(Данные.ПолеСтруктуры);
		
КонецФункции
...Показать Скрыть
yurii_host; WizaXxX; Gilev.Vyacheslav; zergnm; kote; +5 Ответить 1
2. Котэ Пруидзе (kote) 14.09.15 17:23
Прочитал с большим интересом :) В своё время "подружил" HTML-форму c Flash элементом на нём - с передачей данных туда и обратно.. но потом flash умер и всё как то сошло на нет :)
В общем, управляемые формы уже не мучал в этом отношении.

Пишите еще. Интересно, насколько можно улучшить UI у 1С с помощью js - фото и видео бы добавить в следующих статьях.. и посмотреть работу таких фреймворков в окне 1С, как Angular/React/.. и т.п.

Жму руку и буду ждать продолжения..
3. Пишу код как картины (yurii_host) 14.09.15 21:01
Очень интересная статья. Автору респект за развитие направления по расширению возможностей 1С.

Не смог понять из описания, где хранится код на жабаскрипте.
Если я хочу объявить, например, javascript-функцию, то где конкретно я должен прописать ее код?
4. Ivan Khorkov (vano-ekt) 14.09.15 21:14
ПолеHTMLДокумента ис суксь, ибо ie6 или какой там
5. Виталий Чебан (VitaliyCeban) 14.09.15 22:00
(2) kote, Постараюсь написать полезный материал.

(3) yurii_host, Функции javascript объявляются в HTML документе, между тегами <sc ript> </sc ript>
Простейший пример https://learn.javascript.ru/hello-world.

Исходный код HTML документа можно хранить в макете типа ТекстовыйДокумент. Хотя есть и макет типа Документ HTML, с мгновенным просмотром результата изменений, но хранить код в нем не советую, так как конфигуратор портит код, работающий с новыми версиями браузеров.

Создаете реквизит формы, с типом Строка, переностите его на форму, изменяете тип элемента с Поле ввода на Поле HTML документа. Получаете содержимое макета ТекстовыйДокумент и присваиваете его созданному реквизиту с типом Строка.

(4) vano-ekt, Нужно указывать мета-тег x-ua-compatible для перевода браузера в Standards mode, тогда документ будет отображаться в режиме версии, установленной на компьютере. Тег присутствует в статье. Проблема реальна, когда сборка Windows на компьютере старая, и установлен IE8, или IE7. Поэтому нужно писать разметку HTML таким образом, чтобы обеспечивать совместимость и с этими браузерами.

Для решения которое я разрабатываю, я выбрал минимальный порог - IE8. То есть, если хотите чтобы приложение работало, обновите ваш IE6/7 до IE8, так как для поддержки IE7 нужно слишком много костылей. Такой же порог выбрали и разработчики 1С для веб-клиента.

Надо сделать коллективное обращение в 1С, об отказе использования IE WebContol в толстом/тонком клиентах под Windows, и переход на Webkit, с вшитием его в платформу, то есть чтобы версия Webkit не зависела от того что установлено на компьютере.
6. Александр Хомяк (logarifm) 14.09.15 23:56
не могут в полной мере удовлетворить потребность в богатом и отзывчивом интерфейсе


А вы значит можете??? Тоесть вы думаете, что добавив эту пидаль и вуаля 1С вдруг стала красивей. Ну если Вы такой крутой и можете критиковать 1С так почему не стать одним из разработчиков этой 1С и исправить то что вам не нравиться.

Если проанализировать ИС то 80% статей начинается, 1С не сделала то. 1С криво сделала это... Так почему продолжаем стонать и упорно лезть на кактус, работайте на других системах...
7. Александр Анисков (vandalsvq) 15.09.15 03:05
(5) VitaliyCeban, указание совместимости - это лишь костылек, который в полной мере не решит проблему. Большинство современных java- библиотек поддерживаться будут крайне ограниченно или вообще никак (поскольку большинству надо хотя бы IE8+). На текущий момент работу в 1С с java лично для себя немного закрыл, в пользу связки web-приложение + http сервисы. Да есть ряд неудобств, но пережить можно. По крайней мере пока webkit не появится. Хотя тут тоже такой нюанс, пока 1С добавит, пока платформа выйдет, пока займет значимую часть среди пользователей ))))). В общем не скоро будет оное ))))
8. Евгений Ванжула (minimajack) 15.09.15 08:01
(7) vandalsvq, ХВАТИТ ПУТАТЬ.
java - никакого отношения к javascript не имеет ВООБЩЕ.
9. Пишу код как картины (yurii_host) 15.09.15 08:54
(6) logarifm,
javascript - это не педаль и не костыль. Разработчики из фирмы 1С тоже используют javascript в типовых конфигурациях (БП 2.0, ЗУП). Некоторые вещи 1с-кой не реализуешь (например, предпросмотр при наведении, некоторые виды диаграмм и др.) типовыми средствами. Но применение таких рюшечек повышает привлекательность и удобство интерфейса.

и еще один факт. Над улучшением возможностей платформы 1С работает только одна фирма 1С, а сообщество javascript - по всему миру. Очевидно, что javascript - развивается интенсивнее.

думаю, для того, чтобы высказывать подобные замечания объективно, вам явно не хватает знаний в области возможностей этого языка.
Chif13; Gilev.Vyacheslav; sikuda; amon_ra; unpete; Taktic; infostart user; fvadim; slavap; FSerg; VitaliyCeban; +11 Ответить
10. Виталий Чебан (VitaliyCeban) 15.09.15 09:12
(7) vandalsvq, Указание использовать последний доступный Standards mode решает проблемы. Библиотеки работают, так, как нужно.
Как я описал выше, проблема действительно присутствует когда у пользователя просто не установлен на компьютере IE8+.

(6) logarifm, Успокойтесь, отбросьте негатив, попробуйте javascript, весьма вероятно - Вам понравится.
11. Александр Анисков (vandalsvq) 15.09.15 23:50
(8) minimajack, слушай, если я для упрощения печатания написал java (хотя понятно контексту общения о чем идет речь) что теперь на гильотину? Сейчас уже исправить не могу, но сразу говорю, что имел в виду javascript.
(10) VitaliyCeban, ну вот не знаю, не знаю. Ты это, например, ангулару (1.4) скажи с его директивами вроде ng-if, которые при использовании вываливают 1С на бок. Тестил правда всего на нескольких релизах (8.3.6.2ххх, 8.3.5.ххх - не помню точно), но так и было. На компе стоит ie "припоследнейший", вот винда только 7-я, но она то не при чем? Кстати эти же странички прекрасно работают в ie (правда как всегда для оформления в css приходится хаки использовать), про гугл и сафари молчу, там понятно что все путем. Так что, по чем купил, по тому и отдаю.
Готов предоставить для тестирования код.

Пы.сы. интересная идея возникла, попробовать накидать тестовую страничку для проверки директив ангулара... как найдется минутка накидаю.
12. Александр Иванов (tunesoft) 16.09.15 08:12
Интересно, но всё это неактуально для мобильного приложения на 1С :(
gigapevt; kvovka; +2 Ответить 2
13. Максим Кузнецов (Makushimo) 16.09.15 08:20
Наконец-то появляются статьи на тему использования html в 1C.
Автор, спасибо

Вопрос, на который не могу найти ответ. Может подскажете

Как в 1С в поле html документа сделать раскрывающийся текст ?
ну вот как на этом сайте цитаты кода 1С отображаются:
небольшой спойлер, нажимаешь на "показать" или на заголовок спойлера и разворачивается весь текст внутри.
14. Владимир Соловьев (kvovka) 16.09.15 08:31
(12) tunesoft, вот именно. Ждем, когда заработает на мобильной платформе.
15. vasek (iliabvf) 16.09.15 10:14
Большое спасибо! Как раз была идея полностью заменить интерфейс Такси на дизайнерский из html + css + js.
Как заметили выше, с мобильным приложением все хуже.

Буду ждать продолжения.
16. Александр Анисков (vandalsvq) 16.09.15 14:11
(13) Makushimo, jQuery тебе в помощь. Там есть метод show смотри в его сторону.
В html будет примерно так

// HTML
<h1 id='blockctrl'>Показать</h1>
<div id='hideblock' style='display:none'>Тут содержимое блока</div>

// JS
$("#blockctrl").click(
    function() {
        $("#hideblock").show("slow");
    }
);
...Показать Скрыть
17. Котэ Пруидзе (kote) 17.09.15 09:32
(5) VitaliyCeban,
Надо сделать коллективное обращение в 1С, об отказе использования IE WebContol в толстом/тонком клиентах под Windows, и переход на Webkit, с вшитием его в платформу, то есть чтобы версия Webkit не зависела от того что установлено на компьютере.


.. и более того - учитывая сколько геморроя.. не СКОЛЬКО ГЕМОРРОЯ доставляет web-клиент, когда у пользователей постоянно обновляется Хром/Фаерфокс.. может, вообще стоит выпустить СВОЮ СБОРКУ хрома/фаерфокса - которая будет гарантированно работать с 1С через web?

Ведь загвоздка, на самом деле - хоть тонкий клиент и весит меньше, чем дистрибутив броузера - проблема в правах на установку и зависимости тонкого клиента от версии платформы на сервере.. Ну сделали бы как то - вариантов море - например, тонкий клиент, портабельный/не требующий установки - распаковал и работай.. или обновление чтобы не требовало прав на установку ПО.. или вообще - чтоб тонкий клиент не требовал соответствия версии сервера и своей (т.е. по сути специализированный такой броузер базы 1С)..
18. Евгений Маляров (unpete) 17.09.15 20:58
(5) VitaliyCeban,
Надо сделать коллективное обращение в 1С, об отказе использования IE WebContol
Подобные обращения писались многократно. Цитирую дословно ответ С. Нуралиева с весеннего партнерского семинара 2015 года: "Это сложно и очень опасно".
и переход на Webkit

Лучше, не базовый Webkit, а Blink с движком V8 (Chromium) - поддержка ES6-ES7 там намного лучше. Например, Object.Observe() или ServiseWorkers работают только в V8. В других javascript движках еще даже не анонсированы.

(7) vandalsvq,
указание совместимости - это лишь костылек, который в полной мере не решит проблему
Проблему подтверждаю. Платформа 1С аварийно завершает работу при нетривиальных манипуляциях с DOM внутри поля HTMLДокумента.

(6) logarifm,
Так почему продолжаем стонать и упорно лезть на кактус, работайте на других системах
Платформа 1С содержит гениальные объекты данных. Про регистр, документ, справочник и ссылочную типизацию можно говорить только в превосходной степени.
При этом, та же платформа содержит серьёзные архитектурные ошибки в модели тонкого и веб-клиентов. Эти проблемы не решить рефакторингом или оптимизацией, т.к. их корни в постановке задачи, а не в реализации. Попытки применить педали и костыли - естественны. Перед людьми возникают задачи и они пытаются их решать используя доступные в платформе средства.
почему не стать одним из разработчиков

Так и поступили. См. metadata.js
Makushimo; VitaliyCeban; kote; +3 Ответить 1
19. Евгений Маляров (unpete) 17.09.15 21:07
(12) tunesoft, (14) kvovka,
Ждем, когда заработает на мобильной платформе
Два вопроса:
  • Можно пример задачи для которой из мобильной платформы нужен доступ к браузеру?
  • Почему бы эту задачу не решить прямо в браузере?
20. Олег (olbu) 18.09.15 13:57
открываю под 8.2 обычное приложение вот это <Окно документа>.funcName(funcArgs);, у меня вываливается ошибка
{Форма.Форма.Форма(153)}: Метод объекта не обнаружен (fff)
Браузер.fff("ГГГГГ");
получается в моем случае не видно функции fff...

<script>
function fff(M) {alert(M);}
</script>
21. Виталий Чебан (VitaliyCeban) 21.09.15 09:30
(20) olbu, Загрузите обработку на файловый хостинг, могу посмотреть в чём проблема. И напишите версию IE, установленную на компьютере. А также, через какой клиент запускаете.
22. Котэ Пруидзе (kote) 21.09.15 11:17
for all, (18) unpete,

Всем рекомендую посмотреть на metadata.js - из 18 поста.. И задумка и исполнение на высоте. Правда, не бесплатно для коммерческого использования - но посмотреть стоит.
23. Евгений Маляров (unpete) 21.09.15 15:58
(1) VitaliyCeban, Ремарка: события на вебстранице возникают асинхронно, форма 1С, в общем случае, может какие-то из виртуальных кликов пропустить. Тип переменной interactionVariable лучше сделать строкой и не просто присваивать, а дописывать в неё json очередного сообщения. На стороне формы 1С реализовать очередь, в которую складывать элементы массива из interactionVariable и последовательно обрабатывать.
24. Виталий Чебан (VitaliyCeban) 22.09.15 09:13
(23) unpete, Хоть и не замечал пропусков, но ваш метод всё же, более надёжен, спасибо. Одно непонятно, как поведет себя одновременный .pop() у этого стека в 1С, и .push() в javascript, при отсутствии mutex'ов.
25. Евгений Маляров (unpete) 22.09.15 12:24
(24) VitaliyCeban, В моих проектах пропуски были решение из практики.
как поведет себя одновременный .pop() у этого стека в 1С, и .push() в javascript
Поведёт себя плохо, решение не идеальное, но вероятность проблем ниже.
26. Сергей Кудашкин (sikuda) 24.09.15 18:22
Чашечка с кофе это эмблема java, а не javascript. Не путайте пожалуйста.

Hitler And The Downfall Of Silverlight
https://youtu.be/RRFiu0xfQzw
27. Владимир Соловьев (kvovka) 30.09.15 08:07
(19) unpete, клиентов все устраивает в мобильном, кроме интерфейса.
28. Евгений Стоянов (quick) 30.09.15 10:20
превосходный пример, как раз то что нужно. Надоело писать интерфейсы под все версии.
29. Александр Прокопенко (alprk) 23.11.16 11:17
ПараметрыКнопки = buttonsArray.Получить(i);


var ПараметрыКнопки
30. Виталий Чебан (VitaliyCeban) 23.11.16 12:25
(29) alprk, Дополнено, спасибо.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа