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

См. также

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

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

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

15.01.2020    4650    John_d    19       

Управление ИТ-проектами. Модуль 2: продвинутый онлайн-курс по классическим методам управления проектами. Вебинары проходят с 12 марта по 11 июня 2020 года. Промо

Продвинутый онлайн-курс по классическому управлению ИТ-проектами позволит слушателям освоить инструменты из PMBoK® и 1С:Технологии корпоративного внедрения и научиться их применять для проектов любого масштаба. Курс включает в себя 12 вебинаров и 12 видеолекции, разбор кейсов и рекомендации экспертов по проектам слушателей. Ведущая курса - Мария Темчина.

от 13000 рублей

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

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

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

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

05.09.2019    21145    ids79    45       

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

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Интеграция

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

03.09.2019    6162    m-rv    1       

Базовый курс для начинающих 1С-программистов. Пятый поток. Онлайн-курс с 12 февраля по 15 апреля 2020 г. Промо

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

4500/9500 рублей

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

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

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

08.08.2019    27267    ids79    34       

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

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

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

25.07.2019    20456    4    AlbinaAAA    24       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

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

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

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

25.06.2019    29071    ids79    17       

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

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

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

04.06.2019    23751    YPermitin    49       

INFOSTART MEETUP Krasnodar. 14 февраля 2020 г. Промо

Краснодар станет первым в 2020 году местом, где пройдет региональная встреча IT-специалистов сообщества Инфостарт. Тема мероприятия - управление и технологии автоматизации учета на платформе "1С: Предприятие". Стоимость участия - 5000 рублей. Цена действительна до 26.12.2019.

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

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

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

25.04.2019    8849    m-rv    2       

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

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

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

24.04.2019    10693    siddy    0       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Преобразование EXCEL в таблицу значений без COM и других извращений

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Загрузка и выгрузка в Excel

Получение таблицы значений из excel в 1С v8, без COM, внешних источников данных и т.д. EXCELВТаблицуЗначений() - За 10 строчек кода! Реализация протестирована на 1С 8.3.12.1714 (x64).

18.04.2019    16922    9    Eret1k    43       

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

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

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

16.04.2019    11864    m-rv    16       

INFOSTART MEETUP Kazan. 13 марта 2020 г. Промо

Инфостарт продолжает путешествие по России. Следующая остановка - Казань. Тема мероприятия - управление и технологии автоматизации учета на платформе "1С: Предприятие". Ждем всех: докладчиков и участников! Стоимость участия - 5 500 рублей. Цена действительна до 30.01.2020

5 500

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

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

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

15.01.2019    14751    itriot11    21       

PgConf.Russia 2020. 3-5 февраля 2020 г. Москва. Промо

PGConf.Russia – международная техническая конференция по открытой СУБД PostgreSQL, ежегодно собирающая более 700 разработчиков, администраторов баз данных и IT-менеджеров для обмена опытом и профессионального общения. Для участников сообщества infostart.ru скидка 5% на участие в конференции.

от 12350 рублей

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

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

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

14.11.2018    46624    GeterX    94       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

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

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

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

10.11.2018    25425    ids79    40       

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

Статья Системный администратор Программист Нет файла v8 1cv8.cf Бесплатно (free) Инструментарий разработчика Управление проектом

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

18.10.2018    44636    stas_ganiev    72       

Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.130.х, КА 2.4.11.х и ERP 2.4.11.х! Промо

Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.

29700 руб.

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

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

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

15.10.2018    23191    tormozit    100       

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

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Загрузка и выгрузка в Excel

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

14.08.2018    16139    m-rv    5       

Базовый курс по управлению ИТ-проектами. Курс проходит с 26 февраля по 22 апреля 2020 года. Промо

Отличительная черта курса - органичное сочетание трех вещей: 1.Теория проектного управления (PMI®+Agile Alliance+Российские ГОСТ+Методологии от 1С); 2. Опыт внедрения продуктов 1С (опыт франчайзи и успешных компаний + тренды Infostart Event и Agile Days); 3. Разбор реальных проблем и рекомендации экспертов по проектам слушателей. Мы будем фиксироваться на тех инструментах, которые реально оказываются полезными в практике руководителей проектов внедрения. Ведущая курса - Мария Темчина.

от 11000 рублей

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

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

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

25.06.2018    22748    olegtymko    47       

Сдача регламентированной отчетности из программ 1С Промо

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

от 1500 руб.

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

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

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

01.06.2018    24186    m-rv    21       

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

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

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

23.05.2018    20043    slozhenikin_com    20