Про js и 1С или как я ужа с ежом скрещивал

20.02.19

Разработка - Языки и среды

Опыт создания динамического списка для обычной формы на js в html и подводных камнях, которые обязательно встретятся при написании оного.

Однажды тихими вечером... Впрочем, отбросим литературные изыски.  В нашей организации довольно много различных бизнес-процессов, которые различаются реквизитами, документами и при этом используют один вид задач для движения по точкам. Задачи показываются в одном списке, пользователи их видят, нажимают кнопочки, исполняют, все как обычно. Колонки в списке задач были жестко заданы, показывая информацию из различных процессов. До определенного момента, пока количество ключевых параметров в бизнес-процессах примерно соответствовало, это всех устраивало. Но в один "прекрасный" момент у нас появились задачи с неизвестным заранее количеством ключевых реквизитов (как пример сведения об исполнителях групповых задач) и список перестал устраивать. Попытка пойти по пути СКД не увенчалась успехом - слишком долго перерисовывалась картинка при обновлении. Динамический список в обычной форме отсутствует, а управляемую форму в обычном клиенте нельзя (или я не знаю как) закрепить на экране. Такие мелкие казалось бы недостатки привлекали внимание руководства и обе идеи забраковали. Остался один вариант - создать заполняемый HTMLДокумент. Опыт создания такого документа, а точнее способ избежать все ошибки, которые я совершил при его создании, предлагаю уважаемым читателям. Сразу отмазка ака дисклеймер. Все справедливо и проверено для windows и обычных форм. Динамические не тестировались, линукс тем более.

При  написании списка использовалась публикация Инфостарта: Javascript и 1С. Кросс-платформенное взаимодействие. Спасибо автору и участникам дискуссии.

Итак, сначала советы, куда без них.

Совет первый: Обязательно ориентируйтесь на версии IE, установленные на клиентских машинах, которые предполагают использование вашей разработки. Фрик-шоу стандартов от Микрософт, которая как тот сержант, одна идет в ногу, изрядно подпортит вам кровь при написании. Все, что ниже 9 версии, сразу ставит крест на разработке, ибо кривая поддержка css и обработки событий делает трудозатраты непропорциональными выхлопу. У меня два основных браузера были IE10 и 11 и это уже вносило достаточно разнообразия в рутинный процесс программирования. Обязательная строка в заголовке, если вы не хотите скатиться во встроенный в 1С IE6:

<meta http-equiv="X-UA-Compatible" content="IE=edge">

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

Совет второй: Для общения с 1с используйте javascript глобальные переменные и JSON нотацию. Любая функция js нашего документа возвращает в 1с неинициализированный COMobject, который мы не можем обработать. Возможно есть способы обойти эту ситуацию, мне они неизвестны. Поэтому любой вызов функций HTML документа лучше делать в два приема: 1.Вызов функции, которая что-то запишет в переменную документа в виде строки json, затем обращение к этой строке.

Совет третий: По максимуму используйте события click и dblclick в 1с для получения данных, остальные же события инициируйте и обрабатывайте скриптами документа. И я объясню почему: Единственный вариант вызвать событие в 1с умер вместе с IE9. Это метод fireEvent. Он пробивал броню parentWindow и мог вызвать некое событие в 1С. Метод js document.dispatchEvent стартует событие на странице, но за пределы документа событие не выходит и в 1с его обработчик не срабатывает. Плюс большая часть событий, которые являются свойствами поля HTMLдокумента, давно отменены в стандартах HTML и не поддерживаются тем же IE11.

Совет четвертый: забудьте про новомодные стрелочные функции, хитрые врапперы и замыкания. Чем дубовее код, тем лучше. Нет, врапперы и замыкания существуют, но я даже боюсь предположить какой стандарт js поддерживают IE  в различных изводах. Постоянно будете натыкаться на то, что те или иные приемы не работают. Например для меня открытием стало, что this в IE10 всегда обозначает глобальный контекст, даже если его запихнуть во враппер, а объявление переменной let работает вообще непонятно как.

Совет пятый, вытекающий из предыдущих: Никогда не забывайте про сайты типа mdn или w3Schools, на которых вы можете узнать какие методы поддерживаются той или иной версией браузера.

Итак, сама разработка html для работы с 1с.

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

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

Небольшое отступление: Все, что я сейчас делаю со стилями - это мой личный вкус, настройка вида списка и его элементов может быть какой угодно. Если результат вам не понравился, смело экспериментируйте.

//чтобы не расписывать, какие селекторы что обозначают, 
//отправлю к справочнику по css https://www.w3schools.com/cssref/css_selectors.asp
.container {
  -ms-user-select: none;
  border: 2px solid transparent;
  background-color: hsl(0, 0%, 95%);
  border-radius: 10px;
  padding: 10px 15px 10px;
  margin: 10px 0;
  cursor: pointer;
  min-width:120px;
}

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

.container:nth-child(even) {
    background-color: hsl(0, 0%, 90%);
}

Выделим рамкой элемент, на который указывает курсор

.container:hover {
  border-color: hsl(0,0%,60%);
}

Для задач у нас выставлены приоритеты, которые определяются атрибутом контейнера priority. Будем выделять их цветом и подкрашивать контейнер разными оттенками в зависимости от чередования

.container[priority='1'] {
  background-color: hsl(120, 92%, 90%);
}
.container[priority='1']:nth-child(even) {
background-color: hsl(120, 92%, 85%);
}

.container[priority='2'] {
  background-color: hsl(203, 92%, 90%);
}
.container[priority='2']:nth-child(even) {
background-color: hsl(203, 92%, 85%);}

Устанавливаем стиль для заголовка контейнера.

.tooltip{
  margin: 1px;
  line-height: 0.9em;
  color: hsl(0, 0%, 15%);}

Стиль для тега time. Поскольку он будет использоваться только для одной опции, определяем стиль для всего тега

time {
  float: right;
  color: #aaa;
}

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

table {
table-layout:fixed;
white-space: pre-wrap;
width:100%;
min-width:90px;
text-align: left;
margin: 10px 0px;
border-collapse: separate;
border-spacing: 5px;
background: transparent;
color: #656665;
border: transparent;
}

Определим стиль ячеек и заголовков таблицы.

table th {
font-size: 12px;
padding: 1px;
margin: 1px;
}

table td {
font-size: 12px;
background: #fff;
padding: 5px;
}

И добавим описание стиля содержимого ячеек.  В ячейки таблицы я вкладываю контейнеры div, потому что для ячеек <td> есть ограничения по настройке стиля.

table div{
  position: relative;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: pre-wrap;
}

Теперь нужно добавить всплывающую подсказку, на случай если содержимое не влезает в ячейку (в самой ячейке текст будет забиваться точками). Обратите внимание на z-index. Он нужен, чтобы всплывающая подсказка оказалась поверх всех элементов контейнера.

 table td span {
  display: none;
  position: absolute;
  z-index:2;
  background-color: cornsilk;
  color: inherit;
  margin: 10px 0;
  text-align: center;
  border-radius: 6px;
  padding: 8px 0;
}
td:hover span {
    display: block;
}
table div{
  position: relative;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: pre-wrap;
}

Добавим описание контекстного меню. Само меню не должно быть привязано к элементу и должно быть поверх всех элементов, поэтому установим position:fixed и z-index:99;

.contmenu {
position:fixed;
background-color: hsl(240, 20%, 92%);
list-style-type: none;
margin: 0px;
float:right;
padding: 5px 5px 5px 0px;
border-radius: 6px;
z-index:99;
font-size:medium;
white-space: pre-wrap;
}

Выбранные пункты меню нужно выделять:

.contmenu>li {
background-color: hsl(240, 20%, 95%);
margin: 0px 0px 1px 15px;
padding: 10px 30px 10px 10px;
}

.contmenu>li:hover{background-color: hsl(240, 20%, 80%); color:white}

Получившийся результат выглядит так:

Вступайте в нашу телеграмм-группу Инфостарт

javascript html

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Языки и среды Программист 1С 8.3 Абонемент ($m)

Рассматривается методология реализации принципов ООП в 1С.

1 стартмани

29.06.2026    1508    szv    6    

1

Языки и среды Программист 1С:Предприятие 8 Абонемент ($m)

Подсистема для использования принципов объектно-ориентированного программирования на платформе 1С:Предприятие 8

1 стартмани

02.12.2025    2733    vadim1980    11    

3

Языки и среды Программист ИТ-компания Бесплатно (free)

В статье рассматриваются принципы работы с асинхронным программированием в Python с использованием async/await. На практических примерах показано, как создавать и управлять асинхронными задачами, использовать ключевые методы модуля asyncio, такие как create_task, gather, wait_for, и избегать распространённых ошибок. Материал будет полезен разработчикам, которые хотят улучшить производительность своих приложений за счёт асинхронного выполнения операций.

03.03.2025    5609    war41k    2    

4

Языки и среды Программист 1С:Предприятие 8 Бесплатно (free)

Будем писать свои скрипты на питоне и запускать их на 1С.

15.04.2024    12483    YA_418728146    14    

68

Языки и среды Программист Стажер 1С:Предприятие 8 Бесплатно (free)

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

16.01.2024    17280    SeiOkami    25    

66

Языки и среды Программист Бесплатно (free)

Пример небольшого приложения, с которого можно начать изучать язык программирования Dart.

08.08.2023    7920    acvatoris    6    

14

Языки и среды Программист 1С:Предприятие 8 Россия Бесплатно (free)

Написание статического анализатора для 1С традиционным способом на Си.

30.06.2023    6501    prohorp    15    

12

Языки и среды Программист Абонемент ($m)

Поставили нам задачу - вынести на отдельный сервер функционал получения заказов от клиентов по электронной почте, парсинг полученных XLS в приемлемый вид и трансформация заказов в красивый JSON, понятный нашей учетной системе на 1С. Всю эту красоту желательно запустить в отдельном докер - контейнере, по возможности не тратя лицензии, поэтому отдельно стоящую конфигурацию на БСП отвергаем сразу. Можно было бы собрать всё на Apache Airflow или Apache NiFi, но решили попробовать реализовать всю логику без Open Source, будем делать свой ETL, с Исполнителем, который в версии 3.0 научился взаимодействовать с электронной почтой по IMAP. Начнем с середины - сначала напишем скрипты, а потом соберем их в рабочую конструкцию

1 стартмани

01.06.2023    4828    0    1cembreg    2    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Blagin 20.02.19 19:20 Сейчас в теме
Не хватает картинок (анимации) результата.
JohnConnor; RocKeR_13; rhtr; mnemchinov; TreeDogNight; +5 Ответить
2. ntemny 63 20.02.19 20:23 Сейчас в теме
На выходных добавлю.
mnemchinov; TreeDogNight; Blagin; +3 Ответить
3. Gilev.Vyacheslav 1923 20.02.19 23:44 Сейчас в теме
https://hitech.vesti.ru/article/1166293/
https://wonderland.v8.1c.ru/blog/perevod-klientskikh-prilozheniy-dlya-windows-na-ispolzovanie-webkit-optimizatsiya-otobrazheniya-html/
а не проще как раз не ориентироваться на старые IE и программно блокировать их использование?
for_sale; sikuda; +2 Ответить
6. ArchLord42 84 21.02.19 12:21 Сейчас в теме
(3) не у всех стоит 14 платформа
Но в целом можно и 11 ИЕ включить для 1С, надо только в реестр заглянуть.
7. ntemny 63 21.02.19 12:41 Сейчас в теме
(6) Если на машине не установлен 11ИЕ, то и включать нечего. Я понимаю, что ситуация странная, но бывает и вот так, что обновлять нельзя, приходится работать с тем что есть.
9. Gilev.Vyacheslav 1923 21.02.19 13:30 Сейчас в теме
(4) (6) понятно что пока 14й релиз не у всех, но судя по новому лицензированию на 8.3.13-8.3.14 фирма 1С пересадит всех насильно в самое ближайшее время, так как теперь "новое правило отъема денег у населения" )))
но не надо на меня набрасываться, я просто спросил )
for_sale; acanta; +2 Ответить
11. ntemny 63 21.02.19 14:22 Сейчас в теме
(9)А подробности есть? Как они могут заставить? Не в порядке набрасывания, не понимаю о чем речь просто %)
13. Vladimir-R 170 21.02.19 17:40 Сейчас в теме
примерно так:
"Платформа: 1С:Предприятие 8.3 (8.3.9.2170)

Ошибки:
--------------------------------------------------------------------------------
21.02.2019 17:39:42
Для работы с информационной базой необходима версия платформы не меньше, чем 8.3.13.
Текущая версия 8.3.9.2170."
Алексей_mir2mb; Gilev.Vyacheslav; +2 Ответить
17. ntemny 63 21.02.19 17:49 Сейчас в теме
(13) самописным это не грозит %)
22. Gilev.Vyacheslav 1923 21.02.19 21:33 Сейчас в теме
(17) налоги вы в самописной считаете? или просто не в 1С?
23. ntemny 63 21.02.19 21:38 Сейчас в теме
(22)Для налогов отдельный сервер. По сообщению ниже. Это не новость, Б.Нуралиев деление корп и проф еще на erp-форуме анонсировал.Какое это имеет отношение к насильному пересаживанию всех на последние версии платформы?
24. Gilev.Vyacheslav 1923 21.02.19 21:42 Сейчас в теме
(23) в том что ошибки платформы не устраняются в текущей версии, в том что типовые конфигурации требуют нужной версии платформы, так как используются методы из последних версий, техподдержка оказывается по проблемам оказывается только после того как вы перейдете на актуальный релиз и т.п. и т.д.
то что вас пока не коснулось это вам везет, что делать тем у кого erp? )))
25. ntemny 63 21.02.19 21:52 Сейчас в теме
(24)Ну вы же понимаете, что erp это не аргумент в споре%) Я знаю людей, которые бух отчетность до сих пор в семерке сдают. Мне "везет" в том, что я как раз не могу поставить последний релиз по определенным причинам и приходится выкручиваться. Вот опыт такого выкручивания и переношу в статью, чтобы у людей со схожими проблемами проблем было меньше. Аналогично мне пришлось в свое время писать парсер json, хотя в релизах 8.3 он уже наличествовал тогда. А так конечно, о вебките я мечтал со времен, когда он для 1с линуксовой появился.
26. Gilev.Vyacheslav 1923 21.02.19 22:00 Сейчас в теме
(25) проблема в том что вы думаете что я с вами спорю )
Алексей_mir2mb; +1 Ответить
27. ntemny 63 21.02.19 22:05 Сейчас в теме
(26)Тонко, по-заграничному....
Алексей_mir2mb; +1 Ответить
21. Gilev.Vyacheslav 1923 21.02.19 21:31 Сейчас в теме
(11) что ж такие ленивые
держите https://1c.ru/news/info.jsp?id=25491
AlexK_2012; sikuda; +2 Ответить
4. ntemny 63 21.02.19 00:06 Сейчас в теме
Не проще.Реализовано в версии 8.3.14.1565 Не все используют последнюю версию платформы.
5. sikuda 686 21.02.19 11:02 Сейчас в теме
(4) «Делегаты! Если у меня когда-нибудь будут дети, я повешу им на стену портрет прокуратора Иудеи Понтия Пилата, чтобы дети росли чистоплотными. Прокуратор Понтий Пилат стоит и умывает руки — вот какой это будет портрет.»
Венедикт Ерофеев. Москва-Петушки

https://support.microsoft.com/ru-ru/help/17454/lifecycle-faq-internet-explorer
http://sikuda.ru/?p=10
Gilev.Vyacheslav; +1 Ответить
8. acsent 1209 21.02.19 13:07 Сейчас в теме
на чистом жс и html?
даже без jquery, не говоря о реактах?
Plotks2017; testnv0; +2 Ответить
10. ntemny 63 21.02.19 14:18 Сейчас в теме
(8)ага. страничка 10кб живет только в 1с, квери-300кб. смысл? да и фиг его знает, как он в старых браузерах себя поведет.
12. acsent 1209 21.02.19 17:33 Сейчас в теме
(10) Так его фишка как раз и была чтоб кроссбраузерность соблюсти
15. ntemny 63 21.02.19 17:46 Сейчас в теме
(12)ну я то больше на объем текста в шаблоне ориентировался
14. RustIG 1979 21.02.19 17:43 Сейчас в теме
а какая изначально задача стояла? подробнее можете написать?
упомянули СКД, динамический список и другое...
16. ntemny 63 21.02.19 17:49 Сейчас в теме
(14)Я ж вроде описал в начале статьи. Задачи две: 1. сделать подобие динамического списка на обычной форме, 2. выводить произвольное количество информации о задаче в интерактивный список
18. RustIG 1979 21.02.19 18:53 Сейчас в теме
(16) для постановки задачи можно использовать несколько раз "зачем?" - зачем вам динамический список на обычной форме? -
... я реализовал подобие динамического списка через ТаблицуЗначений на форме - во многих моих публикациях это используется, до сих пор применяю этот метод при решении задач...
но зачем вам это делать?,- непонятно пока
какую произвольную информацию о задаче вам надо выводить?
какую задачу нельзя решить в 1с стандартными способами ? так, что приходится скрещивать ужа и ежа? в чем сложность задачи?
19. ntemny 63 21.02.19 19:15 Сейчас в теме
(18)Тема публикации "программирование", а не "постановка задачи", поэтому я бы не хотел углубляться в вопросы целесообразности тех или иных решений.
20. RustIG 1979 21.02.19 19:36 Сейчас в теме
(19) не хочу делать выводы раньше времени, но вы не даете пищу ля размышления.
в чем заключается здравый смысл именно в таком в вашем решении?
может быть такое, что вы усложнили себе задачу?
без картинок конечно не представить глубину описанной проблемы и целесообразность ее решения.
тема джейсон интересна мне, стараюсь вникать в публикации на ИС, поэтому ничего личного, просто бизнес.
28. starik-2005 3301 20.02.21 17:16 Сейчас в теме
Типа управляемая форма в толстом клиенте?

ИМХО, если уж делать форму на HTML+JS (bootstrap/jq/...), то зачем ее тащить в 1С? Пусть живет отдельно в браузере и на веб-сервере со своим серверным NODE.js или PHP/Python/... А так - да, красиво, но, ИМХО, бессмысленно.

А если это вообще задачи юзерам, то им лучше это в телефон вставить и пусть в кармане вибрирует раз в минуту, пока задача не выполнена )))
29. ntemny 63 24.02.21 10:07 Сейчас в теме
(28) Форма - голый js. Весь текст на экране, зачем ей отдельный сервер? В телефон обычные формы не воткнуть, а из задач формы документов открываются. Так что кому бессмысленно, кому - нет.
30. starik-2005 3301 24.02.21 13:43 Сейчас в теме
(29)
а из задач формы документов открываются
А дальше что? В форму документа надо что-то ввести, что-то проверить, что-то исправить?

В принципе я-то не против, но если сделан такой шаг, то стоит сделать еще парочку и освободить юзера от лазания в программу совсем.
31. ntemny 63 24.02.21 16:40 Сейчас в теме
А дальше что? В форму документа надо что-то ввести, что-то проверить, что-то исправить?

Ну да, пользователь работает не с задачами, а с документами, БП автоматически двигается по выполнению действий с документом.
то стоит сделать еще парочку и освободить юзера от лазания в программу совсем
есть свои ограничения как в плане платформы, так и в плане ресурса наличного программистского.
Для отправки сообщения требуется регистрация/авторизация