[mobile] Переносим HTML интерфейс на 1С
Разработка - Работа с интерфейсом
Введение
Разрабатывая мобильное приложение для салонов оптики на 1С (подробнее на ютубе и в телеграме) дойдя до этапа переноса подготовленного функционала на 1C, возник вопрос, какой метод для этого выбрать, чтобы упростить и ускорить перенос функционала на 1С. Для этого разберем учебный пример.
Задача
Реализовать нижнее меню для мобильного приложения на 1С.
При клике на пункты меняется активный пункт в меню и основной заголовок. Нижнее меню формируется динамически, для учебного примера пункты меню будут храниться в справочнике в мобильном приложении, который заполняется при старте.
Для экспериментов сделал пример в VS Code с которым будем работать:
Использовались следующие версии 1С:
- Платформа: 8.3.17.1496
- Мобильная платформа: 8.3.16.142
Ссылка на все исходники и материалы будет в конце статьи также будут приводиться только ключевые моменты по коду, остальное сможете самостоятельно изучить за чашечкой чая.
Анализ верстки
В исходниках на GitHub нужно обратить внимание на следующие моменты:
- Файл index.js: используются стрелочные функции, они в 1С не будут работать поэтому, когда будем переносить на 1С, нужно будет переделать под обычные функции.
Выглядят следующим образом:
let func = (arg1, arg2, ...argN) => expression
let sum = (a, b) => {
let result = a + b;
return result;
};
У стрелочных функций нет this. Если происходит обращение к this, его значение берётся снаружи.
- Файл index.html: в теге script используется атрибут defer, он также не будет работать в 1С т.к. атрибут defer предназначен только для внешних скриптов и для учебного примера содержимое скрипта полностью будет внутри тега.
Атрибут defer сообщает браузеру, что он должен продолжать обрабатывать страницу и загружать скрипт в фоновом режиме, а затем запустить этот скрипт, когда он загрузится.
- Скрипты с defer никогда не блокируют страницу
- Скрипты с defer всегда выполняются, когда дерево DOM готово, но до события DOMContentLoaded
- Атрибут defer предназначен только для внешних скриптов
- Атрибут defer будет проигнорирован, если в теге <script> нет src
Рассмотрим структуру HTML учебного примера в классическом варианте:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>mobile1C</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<main class="main">
<div class="container">
<div class="title">Home</div>
</div>
</main>
<footer class="footer">
<div class="container">
<div class="footer__inner">
<a href="/" class="footer__item footer__item--focus">
<img class="footer__icon" src="img/home.png" id="home">
</a>
<a href="/" class="footer__item">
<img class="footer__icon" src="img/bag.png" id="bag">
</a>
<a href="/" class="footer__item">
<img class="footer__icon" src="img/cart.png" id="cart">
</a>
<a href="/" class="footer__item">
<img class="footer__icon" src="img/user.png" id="user">
</a>
</div>
</div>
</footer>
<script src="js/index.js"></script>
</body>
</html>
Содержимое тегов div с классом title и footer__inner нужно будет менять.
Первый метод
Идея данного метода заключается в формировании HTML структуры с помощью JavaScript. Примерная логика:
- 1С формирует строку JSON с данными
- Передает сформированную строку в функцию JavaScript, которая преобразует ее в массив с объектами
- Формируем HTML и меняем содержимое с помощью JavaScript функций
В итоге на стороне 1С остается только сформировать строки в формате JSON, передать их в нужные функции и вызвать функции JavaScript для изменения структуры HTML.
Возвращаемся к исходникам на GitHub и проанализируем основные файлы, там можем увидеть вариант формирования HTML структуры с помощью JavaScript:
- Файл index.html. Тег body пустой
- Файл index.js. У нас есть переменная footerMenuJSON, которая содержит пункты меню в формате Json. Данная строка передает функцию setItemsMenu, которая преобразует ее в массив с объектами. Далее вызываются две функции для отрисовки main (generateMain()) и footer (generateFooter())
let footerMenuJSON = `
[{"id":"home","href":"/","icon":"home","active":true},{"id":"bag","href":"/","icon":"bag","active":false},{"id":"cart","href":"/","icon":"cart","active":false},{"id":"user","href":"/","icon":"user","active":false}]`
let PATH = '',
textHTML = '',
itemsMenu = []
const setItemsMenu = strJSON => {
itemsMenu = strJSON !== '' ? JSON.parse(strJSON) : []
}
............................
//остальную часть кода смотрите на GitHub
............................
const generateMain = () => {
textHTML = `
<main class="main">
<div class="container">
${getTitle()}
</div>
</main>`
document.body.insertAdjacentHTML('afterbegin', textHTML)
}
const generateFooter = () => {
const main = document.querySelector('.main')
textHTML = `
<footer class="footer">
<div class="container">
<div class="footer__inner">
${getMenuFooter()}
</div>
</div>
</footer>`
main.insertAdjacentHTML('beforeend', textHTML)
updateTitle()
}
setItemsMenu(footerMenuJSON)
generateMain()
generateFooter()
Переходим к 1С. В исходниках файл с конфигурацией первого метода называется mobile1c_adapt_js.cf. В конфигурации добавлена единственная обработка на форме которой расположено ПолеHTML и реквизит формы с типом строка, с аналогичным названием. Код формы рассмотрим ниже:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ФормаКлиент.СформироватьСтраницу(ПолеHTML, ЭтаФорма);
ПодключитьОбработчикОжидания("ПослеОткрытия", 1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытия()
Документ = ЭтаФорма.Элементы.ПолеHTML.Документ;
ДанныеНижнееМеню = ОбщегоНазначенияВызовСервера.НижнееМенюJSON();
Документ.defaultView.setItemsMenu(ДанныеНижнееМеню);
Документ.defaultView.generateMain();
Документ.defaultView.generateFooter();
КонецПроцедуры;
В процедуре СформироватьСтраницу получаем стартовою структуру HTML, которая заполнена по шаблону.
Функция ПолучитьШаблонHTML() Экспорт
ШаблонHTML = "
|<!DOCTYPE html>
|<html lang=""ru"">
|<head>
| <meta name=""viewport"" content=""user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"">
| <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"">
| <meta name=""format-detection"" content=""telephone=no"">
| <style>
| %1
| </style>
|</head>
|<body>
|
| <script>
| %2
|</script>
|</body>
|</html>";
Возврат ШаблонHTML;
КонецФункции
Первая проблема, которая возникает, это невозможность вызвать функции JavaScript ПриОткрытии формы т.к. они еще не доступны. Для обхода данной проблемы используется обработчик ожидания. За все остальное дальше будет отвечать JavaScript.
Плюсы
- Большая часть логики для работы с HTML размещена в JavaScript. Для 1Сника все сводится к правильному формированию строк Json и вызову нужных функций JavaScript, как работа с каким-либо api. Данный подход будет удобен если версткой и адаптацией под 1С занимаются разные люди.
- Интерфейс более плавно перерисовывается по сравнению, если структура формировалась и изменялась на стороне 1С (об этом в след методе).
Минусы
- На конкретном примере пришлось подключать обработчик ожидания, чтобы отрисовать начальную страницу, эта задержка заметна в пользовательском режиме. Но она связана с особенностью, что данные пунктов меню хранятся в справочнике в мобильном приложении, альтернативой можно забирать эти данные сразу с сервера методами JavaScript (если они будут работать в 1С) или формировать начальные пункты в начальной структуре HTML.
- Отладка. Т.к объем кода JavaScript заметно увеличится при таком методе, вы можете столкнутся с проблемой, когда итоговая строка HTML будет на столько большая, что при попытке открыть ее в конфигураторе он будет зависать, а при копировании строки из окошка ниже она может обрезаться. С данной проблемой вы так же можете столкнуться если подключаете много дополнительных компонентов JavaScript. Предполагаю, что данный метод Инструменты отладки Web-страниц в приложении на устройстве Android позволяет обойти данную проблему (не тестировался).

Второй метод
Он основывается на подходе описанным в статье Асинхронный обмен данными с JavaScript (и не только) без потерь.
Данный метод был изучен на занятии по разработке HTML интерфейса, автор Илья Низамов (ютуб).
Несколько полезных статей на взаимодействия 1С и JavaScript:
- Выполнение JavaScript кода из 1С в объекте Поле HTML Документа (HTML 5) и вызов события в 1С ПриНажатии
- Javascript и 1С. Кросс-платформенное взаимодействие
В исходниках файл с конфигурацией второго метода называется mobile1c_adapt_1c.cf.
Здесь шаблон HTML в 1С выглядит по-другому:
Функция ПолучитьШаблонHTML() Экспорт
ШаблонHTML = "
|<!DOCTYPE html>
|<html lang=""ru"">
|<head>
| <meta name=""viewport"" content=""user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"">
| <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"">
| <meta name=""format-detection"" content=""telephone=no"">
| <style>
| %1
| </style>
|</head>
|<body>
|
|<main class=""main"">
| <div class=""container"">
| %2
| </div>
|</main>
|
|<footer class=""footer"">
| <div class=""container"">
| <div class=""footer__inner"">
| %3
| </div>
| </div>
| </footer>
|
|<!-- Script start -->
| %4
|<!-- Script end -->
|
|</body>
|</html>";
Возврат ШаблонHTML;
КонецФункции
Добавляется функция для формирования пунктов меню:
Функция ПолучитьМеню(ВыбранID = "") Экспорт
ШаблонПункта = "
|<a href=""%1"" class=""footer__item %4"" on click=""paramChange('menu', '%2')"">
|<img src=""%3"" class=""footer__icon"">
|</a>";
Меню = "";
МассивПунктов = ОбщегоНазначенияВызовСервера.ПунктыМеню();
Для Каждого СтрокаПункт Из МассивПунктов Цикл
Если (ВыбранID = "" И СтрокаПункт.active)
ИЛИ ВыбранID = СтрокаПункт.id
Тогда
ДопКласс = "footer__item--focus";
Иначе
ДопКласс = "";
КонецЕсли;
Меню = Меню + СтрШаблон(ШаблонПункта, СформироватьСсылку(СтрокаПункт.id), СтрокаПункт.id,
СтрокаПункт.icon, ДопКласс);
КонецЦикла;
Возврат Меню;
КонецФункции
В строке on click=""paramChange('menu', '%2')""> умышленно поставлен пробел т.к редактор текста на инфостаре вырезает данный кусок.
Рассмотрим код формы обработки, на которой расположено ПолеHTML:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ФормыКлиент.СформироватьФорму(ПолеHTML, ЭтаФорма);
ПодключитьОбработчикОжидания("ПолучитьИОбработатьДанные", 1);
КонецПроцедуры
&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПолучитьИОбработатьДанные();
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИОбработатьДанные() Экспорт
Документ = ЭтаФорма.Элементы.ПолеHTML.Документ;
Если Документ = Неопределено Тогда
Возврат;
КонецЕсли;
Пока ОкноДокумента.queueHead < ОкноДокумента.queueTail Цикл
Данные = ПрочитатьДанныеИзJSON(ОкноДокумента.getEvent(ОкноДокумента.queueHead + 1));
ОкноДокумента.queueHead = ОкноДокумента.queueHead + 1;
Если Данные = Неопределено Тогда
Возврат;
КонецЕсли;
Если НЕ Данные["menu"] = Неопределено Тогда
ОбработатьМеню(Данные["menu"]);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрочитатьДанныеИзJSON(СтрокаJSON)
Результат = ОбщегоНазначения.ПрочитатьСтрокуJSON(СтрокаJSON);
Если ТипЗнч(Результат) = Тип("Строка") Тогда
Возврат ОбщегоНазначения.ПрочитатьСтрокуJSON(Результат);
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ОбработатьМеню(Данные)
Документ = ЭтаФорма.Элементы.ПолеHTML.Документ;
Если Документ = Неопределено Тогда
Возврат;
КонецЕсли;
ЗаголовокСтраницы = html.ПолучитьЗаголовок(Данные);
Меню = html.ПолучитьМеню(Данные);
html.ВставитьВHTML(Документ, ".title", ЗаголовокСтраницы);
html.ВставитьВHTML(Документ, ".footer__inner", Меню);
КонецПроцедуры
Код процедуры ВставитьВHTML:
Процедура ВставитьВHTML(document, querySelector, htmlText) Экспорт
Selector = document.querySelector(querySelector);
Selector.innerHTML = htmlText;
КонецПроцедуры
Принцип работы:
- Все пункты меню и заголовок формируются в начальной структуре HTML в процедуре СформироватьФорму
- Каждому пункту меню присваивается событие клика on click=""paramChange(Имя, Значение)"
- Функция paramChange создает объект из параметров, который передает в функцию pushEvent
- Функция pushEvent добавляет объект в массив очереди queue
- На стороне 1С в процедуре ПолучитьИОбработатьДанные получаем значения из очереди и обрабатываем в зависимости от ключа
- В процедуре ОбработатьМеню выполняем замену содержимого блоков с классом title и footer__inner
Основной минус метода, что он не отрабатывает в веб клиенте.
Заключение
В заключение можно посмотреть видео с демонстрацией результата каждого метода:
На видео не так заметно, что первый вариант работает более плавно и быстрее. Пользователи, которые принимали участие в тестирование замечали разницу и определяли более быстрым первый вариант.
Объемы нашего приложения пока не такие большие и визуальная разница пока не настолько заметна.
Если у статьи будет хороший отклик, реализуем более сложные примеры на основе первого метода, но немного модернизированным способом. Например, создадим страницу с карточкой товара или корзиной, а в будущем возможно дойти до порционного списка товаров. В этих примерах уже будут рассмотрены наиболее удобные варианты для передачи данных обратно в 1С.
UPDATE
05/11/20
Внесем следующие улучшения для первого метода:
1) Откажемся от обработчика ожидания. Будем использовать обработчик события ПолеHTML ДокументСфомирован (Спасибо Владимиру Голованову):
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ФормаКлиент.СформироватьСтраницу(ПолеHTML, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ПолеHTMLДокументСформирован(Элемент)
Документ = ЭтаФорма.Элементы.ПолеHTML.Документ;
ДанныеНижнееМеню = ОбщегоНазначенияВызовСервера.НижнееМенюJSON();
Документ.defaultView.setItemsMenu(ДанныеНижнееМеню);
Документ.defaultView.generateMain();
Документ.defaultView.generateFooter();
КонецПроцедуры
2) Начальное формирование пунктов меню сделаем при формирование начальной структуры:
Функция ПолучитьСкрипт() Экспорт
ДанныеНижнееМеню = ОбщегоНазначенияВызовСервера.НижнееМенюJSON();
Текст = "'use strict'
|let footerMenuJSON = `" + ДанныеНижнееМеню + "`
...
...
...
|setItemsMenu(footerMenuJSON)
|generateMain()
|generateFooter()
|";
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ФормаКлиент.СформироватьСтраницу(ПолеHTML, ЭтаФорма);
КонецПроцедуры
В результате уменьшили код и убрали задержку, которая была при обработчике ожидания. Конфигурация в исходниках обновлена.
Ссылка на все исходники и материалы
Мой список. Управляй своими заметками. JavaScript внутри 1С
Приложение доступно в Play market
Следите за проектом в телеграмм канале ovmst

ver 1.0
ver 1.1


Другие материалы, которые могут вас заинтересовать:
Вступайте в нашу телеграмм-группу Инфостарт
приложение интерфейс html javascript мобильное мобильная платформа полеHTML webkit css js
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)
Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!
31720 руб.
27.03.2025 92262 69 44
Мобильная разработка Сканер штрих-кода Терминал сбора данных 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)
Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.
3050 руб.
03.12.2018 72944 250 108
Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Разработчик Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)
Простой мобильный ТСД (терминал сбора данных) сканер для 1С для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически. Решение предназначено для считывания штрихкодов, а не для их создания и печати.
3050 руб.
22.04.2019 124950 739 207
Сканер штрих-кода Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Терминал сбора данных Мобильная разработка Разработчик Пользователь 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Управленческий учет Платные (руб)
Android смартфон как беспроводной сканер штрих-кодов, QR-кодов (2D), терминал сбора данных (ТСД), подписка на штрих-код Комбайн
2196 руб.
18.01.2017 152690 235 237
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3648 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10330 2 2
Мобильная разработка 1С:Предприятие 8 1С:Управление торговлей 11 Оптовая торговля, дистрибуция, логистика Россия Платные (руб)
"МРМ:Маркировка" для работы с конфигурациями 1С - готовое решение, позволяющее быстро автоматизировать работу учетной системы 1С на ордерном и безордерном складе при работе как с товарами, подлежащими обязательной маркировке, так и с товарами, учет которых построен на базе линейных штрих-кодов. Решение поддерживает большинство распространенных складских документов, необходимых для работы кладовщику на терминале сбора данных. Для начинающих пользователей имеется подробная инструкция по работе с приложением в разрезе видов документов.
19000 руб.
24.06.2025 4111 26 0
Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна
20.08.2024 57378 mrXoxot 44
Меняем данные в FancyTree, меняются данные в справочнике. А при открытии FancyTree отображал данные справочника.
Т.е. по сути замена динамическому списку или дереву через js.
Как думаете, возможно такое в принципе?
Справа панель, которая меняет оформление у текущей строки.
Сейчас отрисовка сделана средствами 1С, что крайне негативно сказывается на производительности.
Хочу в HTML+JS, чтобы без перерисовки страницы все было и синхронизировалось со справочником.
Общение с 1С - путем обработки собыйтий onchange у полей ввода и клика по иконке сворачивания/разворачивания у групп. При срабатывании события собираем информацию о нем и отправляем в 1С, там в коде 1С анализируем м выполняем соответствующее действие.
Авторизация возможна двойная: или средствами 1С (в том числе в локалке через AD с автологином), или через свой РС. Вариант со своим РС не позволяет задействовать RLS, так как логин в 1С происходит под одним служебным пользователем, зато позволяет задействовать переиспользование сеансов, а это существенно снижает нагрузку на сервер.
вы сами "нарисовали" макет или был взят откуда-то готовый?
Макет свой, css тоже свой. Оно же на продажу идет, там чужого быть не должно.
Сейчас же, честно говоря офигеваю от возможностей того, что вы сделали)))
По сути - это нативный веб-интерфейс взамен стандартному веб-клиенту 1С, и ваша доработка лучше т.к. нативная, и без всяких ограничений со стороны платформы.
И даже скрипты на js в 1С стиле (см вложение).
Это круто. Чего уж там...
Вторая проблема - это обработка объекта без перерисовки. Сейчас есть желание, заменить на HTML+JS вообще форму документа/списка (документ сложный), чтобы использовать его одновременно и на мобильном приложении и на десктопе.
В связи с этим хочу попробовать что-то в таком же духе с деревом на простом примере.
Через домен - только в локалке. Там и настраивать ничего не надо, браузер показывает стандартное окно вводи логина/пароля, посетителю необходимо ввести логин/пароль пользователя 1С (именно пользователя, а не из справочника Посетители сайтов). Если в 1С настроена авторизация средствами ОС, то логин/пароль вводит не надо будет.
Есть лайфхак, как получить по логину/паролю элемент справочника "Пользователи".
// Проверяет введен верный логин/пароль пользователя или нет.
//
// Параметры (название, тип, дифференцированное значение)
// Логин - Строка - логин пользователя
// Пароль - Строка - пароль пользователя
//
// Возвращаемое значение:
// СправочникСсылка.Пользователи - пустая ссылка, если пользователь не найден, или логин/пароль не подошел
// Или ссылка на справочник пользователи, найденного пользователя.
//
Функция НайтиПользователяПоЛогинуИПаролю(Знач Логин, Знач Пароль)
ПользовательИнформационнойБазы = ПользователиИнформационнойБазы.НайтиПоИмени(Логин);
Если ПользовательИнформационнойБазы = Неопределено Тогда
Возврат Справочники.Пользователи.ПустаяСсылка();
Иначе
ХэшНастоящегоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля;
НачатьТранзакцию();
Попытка
ПользовательИнформационнойБазы.Пароль = Пароль;
ПользовательИнформационнойБазы.Записать();
ХешВведенногоПароля = ПользователиИнформационнойБазы.НайтиПоИмени(Логин).СохраняемоеЗначениеПароля;
Исключение
ОтменитьТранзакцию();
КонецПопытки;
// Проверка, хэшей пароля.
Возврат ?(ХешВведенногоПароля = ХэшНастоящегоПароля,
Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ",
ПользовательИнформационнойБазы.УникальныйИдентификатор),
Справочники.Пользователи.ПустаяСсылка());
КонецЕсли;
КонецФункции ПоказатьТ.е. по сути, если нам нужен пользователь, то можно обойтись без доп. справочника.
В итоге получается нет необходимости заводить лишние сущности. Не надо партнерам и сотрудникам создавать элементы в справочнике "Пользователи".
А так - какая разница 1С, откуда и с помощью чего ей пришел http-запрос? Но допущу, что я чего-то не знаю и с чем-то еще не сталкивался. Всякое бывает, иногда такие интересные кунштюки всплывают. Вот сегодня как раз клиент обратился - на его странице JS возвращает пустую строку в window.location.search, хотя там должны быть параметры GET-запроса. У всех работает, а у него нет. Но там сложная инфраструктура с кучей редиректов, клиент очень крупный, федерального размера. Может у кого-то и с запросами из xmlhttprequest есть проблемы - не исключаю такой возможности.
План подключения примерно следующий:
*) Берем все скрипты, css и html и делаем одним файлом;
*) Берем данные из справочника, который должен быть отображен в дереве и пакуем в json;
*) Добавляем в тот же файл;
*) Сей файл загружаем в ПолеHTMLДокумента;
*) К ПолеHTMLДокумента подключаем 1Сные функции для обработки событий через ДобавитьОбработчик;
Список событий для прослушки
*) Ловим события в 1Сных функциях и меняем данные в нашем справочнике;
Вроде все выполнимо.
Но...
получается что 1с является браузером в котором открывается web приложение...да еще и глючным браузером не поддерживающий современный js
мне кажется что при вашем знании js лучше уже делать приложение на react native ...
:) призываю всех 1с ников изучать js и очень крутую и простую для понимания библиотеку react от фейсбук!!! :)
В вертску можно погрузиться довольно таки быстро. Чтобы ее перенести на мобильную платформу 1с достаточно быть 1сником и чтобы организовать синхронизацию между основной базой и мобильными достаточно знаний 1с .
Вы получаете сборку сразу для android и ios
все они написаны на родных андроидовых технологиях. Но у всех у них очень удобный интерактивный интерфейс, и масштабируемость просто космическая, они отлично работают на миллионах различных устройств, от тормозных китайфонов с маленьким экраном, до топовых смартфонов и планшетов. 1с с HTML такое даже и не снилось
Тоже сомнительное преимущество. Можно использовать Flutter или Xamarin, приложения будут кроссплатформенными, а возможности богатыми. Посмотрите, например:
Пример: я автор конфигурации Управление IT-отделом 8, в ней можно работать:
1. В тонком клиенте
2. В личном кабинете
3. В мобильном приложении
Если использовать HTML + JS, то можно везде сделать одинаковый интерфейс и сделать его адаптивным.
В рамках вот таких задач не получится использовать Java/Kotlin под Android и на Swift под iOS, т.к. тогда мы сделаем несравненно больше работы.
Это кажется. Интерфейс будет заметно различаться от устройства к устройству. Ты же понимаешь, что приложение может быть запущено и на китайфоне с экраном 4" и разрешением 800x480, и на топовом самсунге с экраном 6.7" и разрешением 3200х1440? Чтобы интерфейс приложений был одинаковым на самых разношерстных устройствах, всегда пишут на Java/Kotlin под Android и на Swift под iOS. Только так можно добиться большой масштабируемости мобильных приложений. Под масштабируемостью МП как раз и понимается возможное количество устройст, на которых приложение будет одинаково хорошо работать. Ради эксперимента скачай Android Studio, запусти несколько различных эмуляторов, установи какое-нибудь "произведене" на 1с под ХТМЛ и узри какое это убожество
Тоже иллюзия. Есть масса вещей, которые Android и iOS берут на себя, и которые тебе придётся разруливать вручную. Например, размеры картинок в зависимости от плотности экрана. Под андроид и иос тебе вообще не нужно заморачиваться, просто разлжил картинки разного разлешения по папкам, операционки сами подтянут нужную для каждого экрана. На ХТМЛе тебе придётся самостоятельно анализировать плотность экрана и выводить подходящую картинку. Если у тебя одни и те же картинки на все случаи жизни, то у тебя такой себе интерфейс, он будет уродски отображаться на больших и маленьких устройствах
Вводная была разъяснена мною правильно. Есть десктопная конфигурация на 1С и чтобы не усложнять себе работу было принято такое решение.
Это заблуждение. Есть такое понятие как адаптивная верстка и оно прекрасно будет работать на всех устройствах с разным разрешением экрана. Инфостарт тоже сделан используя адаптивную верстку. Попробуйте отмасштабровать окно с сайтом, верстка одна а будет работать на всех устройствах. А теперь откройте Инфостарт на мобильном и там все будет Ок.
То, что есть нативная разработка и то, что она в некоторых моментах лучше - я не спорю.
Но есть рамки определенных задач, где такое не нужно или лишнее. И кстати, тот же Flutter (я на нем делал демо-проект), тоже использует тот же прием, что и предлагается в этой статье, только используя HTML+JS.
И последнее: те кто так категорично пишет обычно ничего серьезного в своей жизни не делали и не представляют про масштабы разработки, что PM-ы бьются над тем, чтобы сократить количество потраченного времени не в ущерб качеству. Использование HTML+JS хороший способ это сделать. Это вам подтвердит и TitanLuchs со своим демо-примером в (5). Приведите пример того, что лично вы сделали самостоятельно в области "Java/Kotlin под Android и на Swift под iOS" и тогда продолжим дискуссию.
PS: И перестаньте тыкать не знакомым людям в интернете. Я вас не знаю.
Не соглашусь. HTML всего-лишь способ обойти убогость мобильного интерфейса 1с. Скорости разработки это не особо добавляет, про что и речь. В (44) ссылка на видео, как на Flutter за 20 минут рисуется небольшой интерфейс. Сколько понадобится времени, чтобы изобразить такое же на 1с используя HTML+JS? Дня хватит?
Я так и думал. Много слов, а на деле своего ничего нет, ни на Android, ни на 1С... Или все же есть?
Если это троллинг, то он не удачный, а если же вы реально в теме, то почему не пишите о своем опыте?
Я бы с удовольствием почитал про то, как можно организовать обмен данными между десктопным приложением на 1С и мобильным приложением на Flutter, как организовать обновления Flutter приложений, реально ли новичку из 1С за короткий срок создать приложение на Flutter и сколько это займет времени и т.п. Это не сарказм, мне это реально интересно и я думаю не только мне.
Очевидно, через XML или JSON. Примерно также, как и на 1с. С Flutter я сам почти не знаком. Но на Java есть over 100 тыщ способов работать с текстовыми форматами. Там даже проще, чем в 1с. Это мы на 1с ручками расколупываем XML, другие так не работают. Например, вот:
на входе XSD-схема, на выходе готовый код для работы с данными из XML
Это не совсем то, что я имел ввиду
вот такие вещи Android разруливает сам. Нужно лишь заранее приготовить, например, картинки разного разрешения. Используя HTML+JS вопросы плотности экрана тебе придётся разруливать самостоятельно
Подскажите пожалуйста. я использую 1 метод, то есть весь интерфейс отрисовывается при помощи JS, который формируется в отдельном общем модуле. А как теперь мне реализовать перерисовку поляHTML при нажатии на ссылку, не понимаю? То есть как мне вернуться с уровня js на уровень 1с, чтобы при нажатии на ссылку, у меня перерисовывался новый интерфейс по новому макету из 1с, с подстановкой новых данных из json соответственно?
// ps может через обработчик поляhtml при нажатии или
|function getTasksList() {
| //if(!TaskListItems){return}
| const tasks = TaskListItems.map(function(task) {
| return `
| <div class=""taskBlock"">
| <div class=""left_block"">
| "<"a href=""ПРИ_КЛИКЕ_СЮДА_ВЫЗЫВАЕТСЯ_НОВЫЙ МОДУЛЬ 1с"" class=""task__item "" on click=""updatePage('${task.taskName}')"">
| <img class=""round"" src=""${getRandomTaskListPIC()}"">
| </div>
| <div class=""right_block"">
| <h4 class=""heading"">${task.taskName}</h4>
| <p class=""srt"">${task.srt}</p>
| <p class=""ro"">${task.Ро}</p>
| <p class=""sch"">${task.tsk}</p>
| </div>
| </a>
| </div>
|
`
| })
| return tasks.join('')
|}
Как оформить ссылку и код к ней, чтобы вызвать функцию из 1с-ного модуля?
view = ЭтаФорма.Элементы.ПолеHTML.Документ.defaultView;
mResult = view.func();
Обычно такой метод работает.
НО!!! Обнаружилась интересная особенность.
При обращении к функции JS view.func(); если в строке скрипта присутствуют слова 'USE STRICT'
будет выдаваться ошибка метод объекта не обнаружен (func())
Решением является удаление слов 'USE STRICT' из скрипта JS
У меня в полеHTML формируется html-форма. Но при нажатии на текстовое поле для внесения текста отрабатывает событие ПолеHTMLПриНажатии() и соответственно, не дает внести никакие данные в html-форму. Если по некоторому условию написать в ПолеHTMLПриНажатии() {....СтандартнаяОбработка = ЛОЖЬ; ...} никакие действия не происходят, но ввести текст все равно НЕ получается.
Потом в этом же полеHTML происходит перерисовка интерфейса: другие формы и списки.
Такой вопрос: как постоить логику работы модуля, чтобы получилось ввести текст в поля формы и отправить это все на обработку далее?
Все это конечно хорошо, и производить обмен JS и 1С через событие ПриНажатии() удобно.
Вот только засада. На android-эмуляторе событие ПриНажатии() срабатывает ТОЛЬКО если есть тег и ОБЯЗАТЕЛЬНО
href="" заполнено ссылкой. НЕ пустой ссылкой типа href=""#"" или href=""##"" или href=""!#"" или href=""jav * ascript:void(0)""
Поэтому вопрос к знатокам. как уже в Android-эмуляторе заставить работать ПриНАжатии у тега <a></a>???
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1319458
Создание 02.11.20 08:50
Обновление 29.09.21 05:13
Просмотры 23168
Загрузки 0
Рейтинг
124
Комментарии 83
Код открыт Да
Рубрики Работа с интерфейсом Мобильная разработка
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)