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

Публикация № 1008027

Разработка - Практика программирования

javascript html

Опыт создания динамического списка для обычной формы на 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}

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

Чтобы контекстное меню на странице работало корректно, в 1с в свойствах формы списка укажем свойство контекстное меню: отсутствует.

На этом со стилями все. Почти. Мы не учли такую штуку, как размер окна, когда при уменьшении ширины наша прекрасная картинка начинает превращаться в  нечто неудобочитаемом. Добавим еще немного стиля.

@media screen and (max-width:400px){
td { display:flex; text-decoration:underline; width:100%}
th { display:none;}
td:hover span {left:20px;}
.contmenu
 {display:block;
 font-size:small;
 overflow-x: hidden;
 text-overflow: ellipsis}
time {display:none}
}

Этим стилем мы показываем, что при размере окна меньше 400 пикселей нам надо свернуть информацию в блок, спрятать заголовки и немножко урезать осетра в шрифтах, чтобы контекстное меню можно было прочитать:

Вот теперь стили полностью готовы, можно переходить к скриптам.

Первым делом определим переменные, которые будут отвечать у нас за общение с 1С

var arr=''; //это будет переменная, в которую 1С будет закачивать строку json с данными
var retval=''; //переменная, в которую мы пишем результат выбора на странице
var cur='';//при обновлении экран иногда(не понял в каких случаях)уезжает к первому элементу
//здесь мы будем хранить элемент на который надо спозиционироваться при обновлении страницы.
var filter=new Object; //Отборы в списке. Будем на них строить фильтрацию в документе.

Эти переменные будут доступны в 1С через свойство полеHTMLдокумента.документ.parentWindow.

Создаем несколько функций, которые будут основой для работы со страницей.

1.Удаление всех контейнеров. Я решил не заморачиваться с отрисовкой каждого отдельного контейнера при обновлении, потому что в таком случае нужно будет хранить где-то позиции элементов, или искать их по неким атрибутам, чтобы добавлять последовательно данные. Работы много, а конечный пользователь разницы не увидит. Поэтому, при каждом обновлении списка задач мы просто убиваем все элементы списка и добавляем заново по новым данным из 1С.

function deleteAllTasks() {
   var x=document.querySelectorAll('div[id]');
   if (x.lenght!=0){
    for (i = 0; i < x.length; i++) {document.body.removeChild(x[i]);}
   }
}

2. Присваивание элемента выбора переменной, из которой мы получаем данные в 1С.

function addValue(event) {
   retval = event.currentTarget.id;
   event.currentTarget.focus(); 
  //фокус тут для манипуляций с курсором ожидание/нажатие. 
 //в статье я этой темы не коснулся как маловажной, поэтому строку просто игнорьте %)
}

Заметьте, я здесь и далее использую свойство currentTarget вместо target. Это сделано для того, чтобы получать элемент (контейнер) к которому обработчик прикреплен, а не элемент, вызвавший событие (например ячейка таблицы).

3.Функция очистки значений. Добавлена чтобы при частично заполненной странице при нажатии на пустое пространство не вызывалась последняя нажатая задача и для того, чтобы запоминать последнюю выбранную задачу (для запоминания последней позиции при автообновлении). У функции есть параметр, в зависимости от которого поведение меняется.

function clearVal(event,mean) {
  if (mean) {(event.stopPropagation) ? event.stopPropagation() : event.cancelBubble = true;
  cur=event.currentTarget.id}
else{
  retval=''};
}

4. Функция обработки одного нажатия. Нужна для работы с курсором и для контекстного меню

function oneClick(event) {
 	event.currentTarget.blur();
 	closeMenu(); //удаляем меню при нажатии
}

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

5. Функция включения отборов из контекстного меню. В ней мы работаем с глобальной переменной filter.

function enableFilter(event) {
	var action=event.currentTarget.getAttribute('action');
	var curFilter=event.currentTarget.getAttribute('name');
	switch (action) {
	 case 'add':
		filter[curFilter]=event.currentTarget.getAttribute('value');
		break;
	 case 'deleteAll':
		filter=new Object;
		break;
	default:
		delete filter[curFilter]
		break;
		}
}

6. Удаление контекстного меню. Все просто. Нашли по id, удалили.

function closeMenu(){
 var x=document.querySelectorAll('.contmenu');
 if (x.length!=0){ 
   for (i = 0; i < x.length; i++) {x[i].parentNode.removeChild(x[i]);}
   }
}

7. Создание контекстного меню.

function contextMenu(event) {
 closeMenu();
 var menu=document.createElement('ul');
 menu.className='contmenu'; //присвоим ранее определенный в css класс.
 menu.style.left=event.clientX+'px'; //настроим позицию относительно пользовательского экрана
 menu.style.top=event.clientY+'px';//меню будет появляться в точке, где была нажата мышка.
 var type=event.currentTarget.getAttribute('name'); //здесь я добавил только один пункт. Остальные отборы целиком на вашей фантазии 
 var hasFilter=0; //переменная, проверяющаяя, нужно ли добавить пункт "снять все отборы"
 if (type!=''){
 var action='add';//у нас есть три типа действия, которы потом обрабатываются в функции enableFilter
 var actionName='Отбор по типу задачи: ';
 if (filter.hasOwnProperty('type')){hasFilter++; if (filter['type']==type){action='delete';actionName='Отключить отбор по типу задачи: '}}
 var li=document.createElement('li');
 li.innerHTML=actionName+type;
 li.setAttribute('id','contmenu');
 li.setAttribute('name','type');
 li.setAttribute('value',type);
 li.setAttribute('action',action);
 li.addEventListener('click',enableFilter,true); //добавим обработчик нажатия.
 menu.appendChild(li);}
 if (hasFilter!=0) //если есть отборы, добавим пункт "отключить все отборы"
  {var li=document.createElement('li');
 	li.innerHTML='Отключить все отборы';
 	li.setAttribute('id','contmenu');
 	li.setAttribute('name','');
 	li.setAttribute('value','');
 	li.setAttribute('action','deleteAll');
 	li.addEventListener('click',enableFilter,true);
 	menu.appendChild(li);}
 	
 event.currentTarget.appendChild(menu);
 event.currentTarget.blur();//снимем фокус с контейнера.
}

Теперь перейдем к функциям непосредственного создания списка.

8. Создание списка задач. id объекта в данном случае - строковое представление UID задачи, полученное из 1С

function createPage() { 
  var tableObject=JSON.parse(arr); //обработаем полученную из 1С строку
  for (var k in tableObject) {
  var obj=tableObject[k];
  if (document.getElementById(obj.taskId)==undefined){ //если элемента с таким id нет (это аппендикс от попыток обновлять странцу через отдельные элементы))
  var div=document.createElement('div');
  var d=new Date(obj.taskDate);
  if (filter.hasOwnProperty('type')) {if (obj.taskName!=filter.type){continue;}} //проверяем на фильтр. Если отбор установлен, пропускаем все что не соответствует.
  div.setAttribute('id',obj.taskId); //устанавливаем атрибуты по которым элемент можно найти и
  div.setAttribute('name',obj.taskName);//отфильтровать (используются в вызове контекстного меню)
  div.setAttribute('dateTime',d);
  div.setAttribute('priority',parseInt(obj.taskPriority)); //для расцвечивания и возможного отбора по важности
  div.setAttribute('tabindex',-1);// табиндекс не позволяет переходить на элемент и фокусироваться на нем. фокус только скриптом. 
  div.className='container';
  div.addEventListener('dblclick',addValue,true); //присваивание ид возвращаемому значению.
  div.addEventListener('mouseover',function(e){return clearVal(e,true)},true); //вот тут делаем два враппера очистки значения,
  div.addEventListener('mouseout',function(e){return clearVal(e,false)},true);//когда мышь над элементом и уходит с него
  div.addEventListener('click',oneClick,true);
  div.addEventListener('contextmenu',return contextMenu,true); //вызов контекстного меню
  var t=document.createElement('time');
  t.innerHTML=d.toLocaleString();//нарисуем дату задчи.
  div.appendChild(t);
  var p=document.createElement('p');
  p.className='tooltip';
  p.innerHTML=obj.taskName;
  div.appendChild(p);
  var info=obj.info; //для задач которым нечего сказать миру таблицу делать не будем.
  if (info.lenght!=0){
  createTable(div,info)};
  document.body.appendChild(div);}
}
if (cur!=''){ //а вот тут нам пригодилась переменная на которую позиционируемся. 
//Вышло не очень удачно, потому что по факту позиционирование идет на последний элемент над которым пробежала мышка
//Выход есть, но в этой стаье я его не рассматриваю, потому что у меня в списке нет позиционирования по одному клику.
var elem= document.getElementById(cur);
if (elem!=undefined)
{elem.scrollIntoView();}
else {cur=''}}
}

9.Создание таблицы. Сразу хочу предупредить: при передаче таблиц, если вам нужен определенный порядок их следования, не используйте в 1С структуру или соответствие. Они в json строке располагают свои ключи в произвольном порядке. Пользуйтесь массивами, где вы можете располагать пары ключ-значение структур или соответствий в нужном вам порядке.

function createTable(container,source) {
 var table=document.createElement('table');
 var trH=document.createElement('tr');
 var trD=document.createElement('tr');
 if (source.length==1){trH.style.display='none'}// таблицу из одной колонки делаем без заголовка
 for (var n in source){
  var pair=source[n];//получили сложный объект который представляет нам одну колонку таблицы
  var keys=Object.keys(pair);//поскольку мы не знаем названий колонок выводимых в задаче, получим их из объекта
  var th=document.createElement('th');
  var td=document.createElement('td');
  var div=document.createElement('div');
  th.setAttribute('width',pair[keys[0]]['width']);//в паре колонка-значение в 1С мы добавляем еще  
  td.setAttribute('width',pair[keys[0]]['width']);//различные реквизиты, помогающие нам оформить таблицу. В данном случае - ширину ячеек
  div.innerHTML=keys[0];//заголовок
  th.appendChild(div);
  var div=document.createElement('div');
  var span=document.createElement('span');
  div.innerHTML=pair[keys[0]]['value'];//установим значение
  span.innerHTML=pair[keys[0]]['value'];
  td.appendChild(div);
  td.appendChild(span);
  trH.appendChild(th);
  trD.appendChild(td);
 };
  table.appendChild(trH);
  table.appendChild(trD);
  container.appendChild(table);
}

Все ключевые функции написаны. Оформляем в html шаблон, и используем.

В 1С нам нужна процедура выдачи данных для странички (фоновое задание как вариант), обработчик события "ondblclick",  через который мы узнаем УИД задачи которую нужно открыть (глобальные переменные, retval, помните?) и обработчик события "onclick" для обработки событий контекстного меню. Когда мы создавали меню на страничке, мы присвоили ему id contmenu. В обработчике события "onclick" поставим условие:

Если pEvtObj.srcElement.id="contmenu" Тогда
		....
КонецЕсли;	

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

На этом все. Буду рад, если статья поможет кому-то не набить тех же шишек, что и я.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Blagin 20.02.19 19:20 Сейчас в теме
Не хватает картинок (анимации) результата.
JohnConnor; RocKeR_13; rhtr; mnemchinov; TreeDogNight; +5 Ответить
2. ntemny 57 20.02.19 20:23 Сейчас в теме
На выходных добавлю.
mnemchinov; TreeDogNight; Blagin; +3 Ответить
3. Gilev.Vyacheslav 1879 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 75 21.02.19 12:21 Сейчас в теме
(3) не у всех стоит 14 платформа
Но в целом можно и 11 ИЕ включить для 1С, надо только в реестр заглянуть.
7. ntemny 57 21.02.19 12:41 Сейчас в теме
(6) Если на машине не установлен 11ИЕ, то и включать нечего. Я понимаю, что ситуация странная, но бывает и вот так, что обновлять нельзя, приходится работать с тем что есть.
9. Gilev.Vyacheslav 1879 21.02.19 13:30 Сейчас в теме
(4) (6) понятно что пока 14й релиз не у всех, но судя по новому лицензированию на 8.3.13-8.3.14 фирма 1С пересадит всех насильно в самое ближайшее время, так как теперь "новое правило отъема денег у населения" )))
но не надо на меня набрасываться, я просто спросил )
for_sale; acanta; +2 Ответить
11. ntemny 57 21.02.19 14:22 Сейчас в теме
(9)А подробности есть? Как они могут заставить? Не в порядке набрасывания, не понимаю о чем речь просто %)
13. Балабас 164 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 57 21.02.19 17:49 Сейчас в теме
(13) самописным это не грозит %)
22. Gilev.Vyacheslav 1879 21.02.19 21:33 Сейчас в теме
(17) налоги вы в самописной считаете? или просто не в 1С?
23. ntemny 57 21.02.19 21:38 Сейчас в теме
(22)Для налогов отдельный сервер. По сообщению ниже. Это не новость, Б.Нуралиев деление корп и проф еще на erp-форуме анонсировал.Какое это имеет отношение к насильному пересаживанию всех на последние версии платформы?
24. Gilev.Vyacheslav 1879 21.02.19 21:42 Сейчас в теме
(23) в том что ошибки платформы не устраняются в текущей версии, в том что типовые конфигурации требуют нужной версии платформы, так как используются методы из последних версий, техподдержка оказывается по проблемам оказывается только после того как вы перейдете на актуальный релиз и т.п. и т.д.
то что вас пока не коснулось это вам везет, что делать тем у кого erp? )))
25. ntemny 57 21.02.19 21:52 Сейчас в теме
(24)Ну вы же понимаете, что erp это не аргумент в споре%) Я знаю людей, которые бух отчетность до сих пор в семерке сдают. Мне "везет" в том, что я как раз не могу поставить последний релиз по определенным причинам и приходится выкручиваться. Вот опыт такого выкручивания и переношу в статью, чтобы у людей со схожими проблемами проблем было меньше. Аналогично мне пришлось в свое время писать парсер json, хотя в релизах 8.3 он уже наличествовал тогда. А так конечно, о вебките я мечтал со времен, когда он для 1с линуксовой появился.
26. Gilev.Vyacheslav 1879 21.02.19 22:00 Сейчас в теме
(25) проблема в том что вы думаете что я с вами спорю )
Алексей_mir2mb; +1 Ответить
27. ntemny 57 21.02.19 22:05 Сейчас в теме
(26)Тонко, по-заграничному....
Алексей_mir2mb; +1 Ответить
21. Gilev.Vyacheslav 1879 21.02.19 21:31 Сейчас в теме
(11) что ж такие ленивые
держите https://1c.ru/news/info.jsp?id=25491
AlexK_2012; sikuda; +2 Ответить
4. ntemny 57 21.02.19 00:06 Сейчас в теме
Не проще.Реализовано в версии 8.3.14.1565 Не все используют последнюю версию платформы.
5. sikuda 649 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 1170 21.02.19 13:07 Сейчас в теме
на чистом жс и html?
даже без jquery, не говоря о реактах?
Plotks2017; testnv0; +2 Ответить
10. ntemny 57 21.02.19 14:18 Сейчас в теме
(8)ага. страничка 10кб живет только в 1с, квери-300кб. смысл? да и фиг его знает, как он в старых браузерах себя поведет.
12. acsent 1170 21.02.19 17:33 Сейчас в теме
(10) Так его фишка как раз и была чтоб кроссбраузерность соблюсти
15. ntemny 57 21.02.19 17:46 Сейчас в теме
(12)ну я то больше на объем текста в шаблоне ориентировался
14. Rustig 1717 21.02.19 17:43 Сейчас в теме
а какая изначально задача стояла? подробнее можете написать?
упомянули СКД, динамический список и другое...
16. ntemny 57 21.02.19 17:49 Сейчас в теме
(14)Я ж вроде описал в начале статьи. Задачи две: 1. сделать подобие динамического списка на обычной форме, 2. выводить произвольное количество информации о задаче в интерактивный список
18. Rustig 1717 21.02.19 18:53 Сейчас в теме
(16) для постановки задачи можно использовать несколько раз "зачем?" - зачем вам динамический список на обычной форме? -
... я реализовал подобие динамического списка через ТаблицуЗначений на форме - во многих моих публикациях это используется, до сих пор применяю этот метод при решении задач...
но зачем вам это делать?,- непонятно пока
какую произвольную информацию о задаче вам надо выводить?
какую задачу нельзя решить в 1с стандартными способами ? так, что приходится скрещивать ужа и ежа? в чем сложность задачи?
19. ntemny 57 21.02.19 19:15 Сейчас в теме
(18)Тема публикации "программирование", а не "постановка задачи", поэтому я бы не хотел углубляться в вопросы целесообразности тех или иных решений.
20. Rustig 1717 21.02.19 19:36 Сейчас в теме
(19) не хочу делать выводы раньше времени, но вы не даете пищу ля размышления.
в чем заключается здравый смысл именно в таком в вашем решении?
может быть такое, что вы усложнили себе задачу?
без картинок конечно не представить глубину описанной проблемы и целесообразность ее решения.
тема джейсон интересна мне, стараюсь вникать в публикации на ИС, поэтому ничего личного, просто бизнес.
28. starik-2005 2302 20.02.21 17:16 Сейчас в теме
Типа управляемая форма в толстом клиенте?

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

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

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

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

См. также

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    79400    Serginio    113    

Обзор полезных методов БСП 3.1.4

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

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

25.03.2021    15928    rayastar    47    

Звуковое управление в 1С 8.3

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    3091    velemir    31    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    5365    comol    31    

Как я начал администрировать сервер 1С: Предприятие 8.3 с телефона Промо

Администрирование данных 1С Мобильная разработка v8 Бесплатно (free)

Развитие инструментов управления кластером серверов 1С:Предприятие 8.3.

14.04.2017    64545    user700211_a.straltsou    29    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    45253    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    33449    John_d    22    

Шпаргалка (БСП). Добавление в новый документ механизма печати дополнительных печатных форм

Печать БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Постоянно приходится вспоминать, как добавить механизм печати (БСП) в новый документ. Поэтому решил написать шпаргалку.

10.10.2019    23547    John_d    19    

Копирование числовых ячеек из 1С в Excel Промо

Загрузка и выгрузка в Excel Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

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

15.01.2019    30422    itriot11    27    

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

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    34595    HostHost    41    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    43566    Yashazz    50    

Самый примитивный HTTP-сервис в мире

WEB v8 Бесплатно (free)

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

12.09.2019    23693    YPermitin    27    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    39042    unichkin    74    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    75136    rpgshnik    70    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    62545    ids79    55    

Обмен данными. Консистентность vs Многопоточность

Интеграция v8 1cv8.cf Бесплатно (free)

Рассмотрим теоретические основы обмена данными. Какие бывают обмены, какие гарантии при этом даются, зачем идти на компромиссы и что при этом может пойти не так. Есть ли идеальная схема?

03.09.2019    13965    m-rv    1    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    32869    tormozit    105    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    117979    ids79    69    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    83645    ids79    14    

Обработчики событий при записи объектов. Зачем и что за чем?

Математика и алгоритмы v8 Бесплатно (free)

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    82555    AlbinaAAA    33    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    79910    tormozit    131    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    64079    ids79    26    

Подсистема "Варианты отчетов". Используете ли Вы ее правильно?

Работа с интерфейсом БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Небольшая история про использование подсистемы "Варианты отчетов" из БСП. Используете ли Вы ее правильно?

04.06.2019    49404    YPermitin    53    

Выгрузка документа по условию

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16701    m-rv    3    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    50910    tormozit    49    

Как настроить правильную техподдержку (helpdesk, service desk на коленке)

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Документооборот и делопроизводство Монитор заказов Учет рабочего времени Управление взаимоотношениями с клиентами (СRM) Документооборот и делопроизводство Монитор заказов Учет рабочего времени v8 УУ Бесплатно (free)

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

24.04.2019    24694    siddy    0    

Как прикрутить ГУИД к регистру сведений

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    21327    m-rv    17    

Excel vs 1С: битва с неожиданным исходом

Анализ учета Универсальные обработки Загрузка и выгрузка в Excel Финансовые Управленческие v8 1cv8.cf Россия Бесплатно (free)

Что лучше 1С или Excel? Разберемся, в казалось бы, очевидном, чтобы получить невероятное!

11.04.2019    39093    bolefirenko    121    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    47828    tormozit    74    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    39164    ellavs    127    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    29222    ellavs    90    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    50010    ids79    11    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    47767    ids79    81    

Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке

Универсальные функции Зарплата Управление персоналом (HRM) Зарплата v8 v8::СПР ЗКГУ3.0 ЗУП3.x БУ Бесплатно (free)

В статье размещен список стандартных процедур и функций с примерами, которые могут помочь при разработке (доработке) конфигураций Зарплата и управление персоналом ред. 3.1 и Зарплата и кадры государственного учреждения 3.1. Иногда бывает довольно сложно правильно получить данные или долго, поэтому лучшим вариантом будет использование стандартных процедур. Буду очень признателен, если Вы поделитесь своим опытом и предложите свои варианты стандартных процедур которые помогают в работе. Или предложите, как дополнить имеющиеся процедуры.

14.11.2018    119552    GeterX    129    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    39107    ids79    40    

Git + 1С. Часть 1. Как подключиться к команде разработки и начать использовать Git

Инструментарий разработчика Управление проектом v8 1cv8.cf Бесплатно (free)

Первая статья из цикла инструкций по работе с Git в 1С-разработке. Рассмотрим, как настроить рабочее место, как получить свою "копию" проекта для разработки и приступить к полезным действиям. Все примеры будут изложены в рамках трёх практических кейсов: 1. Моя команда дорабатывает типовую конфигурацию, использует приватный репозиторий на BitBucket, в котором версионируются внешние отчеты/обработки, расширения конфигураций и правила обмена; 2. Я участвую в стартап-команде, которая разрабатывает свою конфигурацию с использованием Git и GitLab; 3. Я принимаю участие в развитии OpenSource-продукта на GitHub как заинтересованный разработчик (контрибьютор).

18.10.2018    82894    stas_ganiev    83    

Планы обмена 1С

Перенос данных из 1C8 в 1C8 Интеграция v8 Бесплатно (free)

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

10.09.2018    74828    zhichkin    32    

Из Excel в 1С запросом

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

... ну, конечно, не прям так типовым языком запросов, а расширенным языком запросов. Речь пойдет о том, как "залить" данные в таблицы 1С и не пилить при этом бесконечного количества наколеночных обработок.

14.08.2018    20972    m-rv    5    

Тестер: частые вопросы

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    30512    grumagargler    31    

Повышаем эффективность разработки правил обмена

Практика программирования Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    29460    olegtymko    48    

Как сделать запрос на изменение данных

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    33289    m-rv    22    

Строим графы средствами 1С (без GraphViz)

Практика программирования v8 Бесплатно (free)

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    25098    slozhenikin_com    20    

Распределение расходов пропорционально продажам

Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Практика программирования Финансовый учет и бюджетирование (FRP) Учет доходов и расходов v8 v8::ОУ УТ10 УУ Бесплатно (free)

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    18623    Rustig    9    

Универсальный обмен между идентичными конфигурациями через REST интерфейс OData. Часть І: Справочники

Перенос данных из 1C8 в 1C8 v8 Бесплатно (free)

Сейчас все чаще интеграции различных конфигураций проектируются через HTTP-сервисы - они и работают быстрее, и "войти" в режим отладки гораздо проще, тем самым обойдя "черный ящик" универсального обмена через xml, например. Более года назад я начал работать в компании, в которой разработчики работали с конфигурациями 1С в режиме совместимости еще 8.2.16 (менять режим совместимости в типичных базах мы не хотели) - а как Вы наверное знаете, если интересовались HTTP-сервисами в 1С, их использование в режиме совместимости 8.3.4 и ниже недопустимо - и здесь я уже не надеялся на разработку и использование HTTP-сервисов. Но позже меня заинтересовал такой "сервис" как REST интерфейс OData, так как его можно использовать не меняя режим совместимости конфигурации - именно он и стал для меня идеальным вариантом решения "нетривиальных" задач.

11.05.2018    24262    V.Stavinsky    11    

Минимализмы 3

Практика программирования Универсальные функции v8 Бесплатно (free)

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    48559    ildarovich    46