Реализация простого http-сервиса "Просмотр карточки номенклатуры(товара) в браузере"

Программирование - Практика программирования

hhtp-сервисы http 1с в браузере

74
Практический пример реализации простого http-сервиса средствами 1С Предприятие 8.3. Обеспечивает просмотр списка товаров и просмотр данных товара в браузере.

Добрый день, коллеги!  

Мне не приходилось ранее работать с http-сервисами, но поставили  задачу, про которую чуть ниже, и на мой взгляд http-сервисы -это самый простой путь к ее реализации. Потратив несколько часов на "гугление" и разбирательства, был написан этот http-сервис. И чтобы потом при необходимости не вспоминать как это все работает,  решил написать статью в виде шпаргалки, чтобы всегда можно было вспомнить. Может кому тоже пригодится.

Небольшое отступление от темы:

В этой статье НЕ будет рассказано, про установку и настройку веб-сервера и подробности работы с http-сервисами в 1С Предприятие 8.  Это все можно узнать прочитав статьи, ссылки на которые указаны ниже.

Благодарности:

Выражаю благодарность Илье Головацкому (YAGolova)  и Дмитрию Сидоренко (dsdred) за статьи по этой теме. Результат был получен гораздо быстрее, чем если бы пришлось разбираться самостоятельно. Вот ссылки на статьи, которые использовались при изучении вопроса: 

HTTP-сервисы для тех, кто ничего не понимает в WEB 

HTTP Сервисы: Путь к своему сервису. Часть 1   Это серия из 4-х статей. Привожу ссылку на первую статью, ссылки на остальные можно взять уже там.

Рассказывать постараюсь кратко. Итак приступим. 

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

После поиска информации по теме было принято решение использовать  http-сервисы в платформе 1С 8.3

Разработка и тестирование  производилось на платформе 1С Предприятие 8.3 (8.3.13.1513) в  серверном режиме. СУБД -  MSSQL 2008

В качестве Web-Сервера  использовался  Apache 2.2.25 под Windows. Пример настройки например здесь:  Настройка веб сервера Apache + 1С (Пошаговое руководство)

 Apache настроен на локальной машине,  доступен по адресу: http://localhost

Работа сервиса протестирована в Internet Explorer, Google Chrome, Yandex браузере. 

Логика работы: 

Создаем HTTP -Сервис, который выполняет две функции:

  • возвращает список номенклатуры
  • возвращает данные выбранной номенклатуры по коду

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

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

Реализация:

1. Создаем новую базу на сервере 1С Предприятие. 

2. В ветке метаданных "Общие" находим "HTTP-сервисы" и в нем Добавляем новый сервис. Я назвал его "ПросмотрНоменклатурыЧерезБраузер".  Здесь же определяем очень важное свойство "Корневой URL", ставим значение "Nom" -  используется  как часть будущей  ссылки на наш сервис. 

На вкладке  "Шаблоны URL" создаем шаблон "Номенклатура" и устанавливаем значение /{Metod}

В параметр {Metod} мы будем передавать название метода в наш  http-сервис из браузера. И соответственно по названию  будем определять, что нужно сделать.  Больше обязательных данных нет.  Поэтому в шаблоне больше ничего не указываем.

Нам еще нужен дополнительный параметр "Code", который нужно будет передать на наш сервис для получения данных по конкретной номенклатуре (простой поиск по коду). Его мы будем  будем  передавать в браузере в следующем виде: http://localhost/[ИмяБазы]/hs/Nom/GetDataNom?Code=[ЗначениеКода] . При обработке запроса найдем в нем значение параметра "Code".

Далее добавим  к ранее созданному шаблону метод "Получить", который имеет  тип HTTP-метод "GET".

Далее создадим обработчик метода "ОбработатьЗапрос" и перейдем в модуль нашего HTTP-сервиса.

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

// Функция метода GET
Функция ОбработатьЗапрос(Запрос)
	Ответ = Service_http_ОбработкаМетодовGet.ОбработатьЗапросНаСервере(Запрос);
	Возврат Ответ;
КонецФункции // ОбработатьЗапрос()

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

Добавим общий модуль "Service_http_ОбработкаМетодовGet" и реализуем экспортную функцию первичной обработки запроса, которая будет вызываться из обработчика "ОбработатьЗапрос".

// ОСНОВНАЯ ФУНКЦИЯ ДЛЯ ВЫЗОВА ИЗ ОБРАБОТЧИКА HTTP-СЕРВИСА
Функция ОбработатьЗапросНаСервере(Запрос) Экспорт
	Ответ = Новый HTTPСервисОтвет(200);
	
	ИмяМетода = запрос.ПараметрыURL.Получить("Metod");   // Возвращает список номенклатуры
	// В ЗАВИСИМОСТИ ОТ МЕТОДА ПОЛУЧЕННОГО ИЗ ВХОДЯЩЕГО ЗАПРОСА СФОРМИРУЕМ ОТВЕТ
	Если ИмяМетода = "GetListNom" Тогда
		ТабДокХТМЛ = СформироватьСписокНоменклатурыНаСКД();
		
	ИначеЕсли ИмяМетода = "GetDataNom" Тогда  // Возвращает данные выбранной номенклатуры
		КодНоменклатуры = Запрос.ПараметрыЗапроса.Получить("Code");
		Если КодНоменклатуры <> Неопределено Тогда // если параметр передан
			ТабДокХтмл = СформироватьДанныеПоНоменклатуре(КодНоменклатуры);
		Иначе
			Ответ.КодСостояния=405;
			ТабДокХТМЛ = "Отсутствует значение кода номенклатуры ";
		КонецЕсли;
		
	Иначе
		Ответ.КодСостояния=405;
		ТабДокХТМЛ = "Отсутствует метод " + ИмяМетода;
	КонецЕсли;
	
	Ответ.УстановитьТелоИзСтроки(ТабДокХТМЛ,КодировкаТекста.UTF8);
	// ЧТОБЫ НА СТРАНИЦЕ КОРРЕКТНО ОТОБРАЖАЛАСЬ КОДИРОВКА ДОБАВИМ СЛЕДУЮЩИЙ КОД
	Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
	Возврат Ответ;
КонецФункции // ОбработатьЗапросНаСервере()

Получение списка номенклатуры сделано с помощью общего макета на СКД, чтобы при необходимости можно было быстро изменить внешний вид списка. Для Этого создаем Общий макет. У меня он называется "МакетСКД", тип "Схема компоновки данных". Добавляем Набор данных "Запрос".  Текст запроса очень простой, но там есть поле, которое служит ссылкой для перехода в браузере на получение данных по конкретной номенклатуре. Текст запроса следующий: 

ВЫБРАТЬ
	Номенклатура.Родитель,
	Номенклатура.Код,
	Номенклатура.Артикул,
	"<a " + "href=""" + "http://localhost/ddashevsky_http/hs/Nom/GetDataNom?Code=" + Номенклатура.Код + """" + ">" + Номенклатура.Наименование + "</a>" КАК Перейти,
	Номенклатура.Представление
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	НЕ Номенклатура.ПометкаУдаления
	И НЕ Номенклатура.ЭтоГруппа

Здесь поле "Перейти" формируется в виде кода на html, которую браузер  отображает как ссылку с вызовом метода GetDataNom, который уже служит для получения данных выбранного элемента справочника номенклатуры.

В остальном все стандартно.

Скриншот настроек макета:

Текст функции "СформироватьСписокНоменклатурыНаСКД"

Функция СформироватьСписокНоменклатурыНаСКД()Экспорт
	
	ТабДок = Новый ТабличныйДокумент;	
	
	СхемаКомпоновкиДанных= ПолучитьОбщийМакет("МакетСКД");
	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
	
	//  ФОРМИРУЕМ МАКЕТ, С ПОМОЩЬЮ КОМПОНОВЩИКА МАКЕТА
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	// ПЕРЕДАЕМ В МАКЕТ КОМПОНОВКИ СХЕМУ, НАСТРОЙКИ, ДАННЫЕ РАСШИФРОВКИ 
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,НастройкиОтчета,ДанныеРасшифровки);
	
	// ВЫПОЛНЯЕМ КОМПОНОВКУ С ПОМОЩЬЮ ПРОЫЕССОРА КОМПОНОВКИ
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки,Истина);
	
	//  ВЫВОДИМ РЕЗУЛЬТАТ В ТАБЛИЧНЫЙ ДОКУМЕНТ
	ПроцессорВывода =новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабДок);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);	
	
	ТабДок.ОтображатьЗаголовки = Ложь;
	ТабДок.ОтображатьСетку	   = Ложь;
	
	// СФОРМИРУЕМ HTML-КОД ИЗ ТАБЛИЧНОГО ДОКУМЕНТА
	ТекстХТМЛ = СформироватьХТМЛИзТабдок(ТабДок);
	Возврат ТекстХТМЛ;	
	
КонецФункции // СформироватьСписокНоменклатурыНаСКД()

Здесь тоже все стандартно. Получаем общий макет. Инициализируем, выполняем, выводим результат в табличный документ. 

После чего вызываем функцию формирования HTML-кода из табличного документа.

// ВОЗВРАЩАЕТ HTML-КОД ТАБЛИЧНОГО ДОКУМЕНТА
Функция СформироватьХТМЛИзТабдок(ТабДок)
	
	ИмяВремФайла = ПолучитьИмяВременногоФайла();
	//имяВремФайла =  "E:\temp\ном.html";    // временно для отладки
	ТабДок.Записать(ИмяВремФайла,ТипФайлаТабличногоДокумента.HTML);
	ТекстХТМЛ = Новый ТекстовыйДокумент;
	ТекстХТМЛ.Прочитать(ИмяВремФайла);
	ТекстХТМЛ = ТекстХТМЛ.ПолучитьТекст();
	
	// КАК ВЫЯСНИЛОСЬ ПРИ СОХРАНЕНИИ В ФОРМАТ HTML ТЕГИ НЕ ПОКАЗЫВАЮТСЯ В ОКНЕ БРАУЗЕРА, ПОЭТОМУ ОНИ ЗАМЕНЯЮТСЯ НА СИМВОЛЫ  "&lt;","&gt;"
	// ПОЭТОМУ СГЕНЕРЕННАЯ ССЫЛКА ВЫВОДИТСЯ В ВИДЕ ТЕКСТА. ЗАМЕНИМ ЭТИ СИМВОЛЫ НА ТЕГИ И ОТДАДИМ УЖЕ В БРАУЗЕР
	ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,"&lt;","<");
	ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,"&gt;",">");
	ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,"&nbsp;"," ");
	
	//НЕЧЕГО ОСТАВЛЯТЬ МУСОР, УДАЛЯЕМ ВРЕМЕННЫЙ ФАЙЛ
	УдалитьФайлы(ИмяВремФайла);
	
	Возврат ТекстХТМЛ;	
КонецФункции // СформироватьХТМЛИзТабдок()

 

Читаем его в виде текста и вроде бы все уже хорошо можно отдавать его как конечный результат в браузер и пожинать плоды.

... и здесь я наступил на грабли.

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

Тогда я стал смотреть файл, полученный после записи табличного документа в формате html и увидел, что все теги "<" ">", которые и служат в качестве управляющих символов в html заменились на "&lt;" и "&gt;" и еще вместо пробелов, которые разделяют команды расположенные между тегами, ставился "&nbsp;" поэтому браузер считал данную строку текстом. Поэтому в функцию СформироватьХТМЛИзТабдок и был добавлен следующий код: 

ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,"&lt;","<");
ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,"&gt;",">");
ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,"&nbsp;"," ");

..и все стало отображаться как нужно.

Едем дальше.

Данные номенклатуры формируются функцией "СформироватьДанныеПоНоменклатуре(Код)"

Функция СформироватьДанныеПоНоменклатуре(Код) Экспорт
	табдок = Новый ТабличныйДокумент;
	Запрос = Новый запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	Номенклатура.Ссылка,
	|	Номенклатура.Код,
	|	Номенклатура.Наименование,
	|	Номенклатура.НаименованиеПолное,
	|	Номенклатура.Артикул,
	|	Номенклатура.Представление КАК НоменклатураПредставление,
	|	Номенклатура.ПутьККартинке
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Код = &Код";
	
	Запрос.УстановитьПараметр("Код",Код);
	
	Рез = Запрос.Выполнить();
	Если Не Рез.Пустой() Тогда
		Выборка = Рез.Выбрать();
		Выборка.Следующий();
		
		Макет = ПолучитьОбщийМакет("МакетЭлементаНоменклатуры");
		Шапка = Макет.ПолучитьОбласть("Данные");
		Шапка.Параметры.Заполнить(Выборка);
		
		Табдок.Вывести(Шапка);
		Если СокрЛП(Выборка.путьККартинке) <>""  Тогда // если поле не пустое, попытаемся вывести картинку 
			ОблКартинки = Макет.ПолучитьОбласть("Картинка");
			СсылкаНаКартинку = ПолучитьСсылкуХТМЛПоАдресуКартинки(Выборка.ПутькКартинке);
			ОблКартинки.Параметры.КартинкаНоменклатуры = СсылкаНаКартинку;	
			табдок.Вывести(ОблКартинки);
		КонецЕсли; 
	КонецЕсли;
	
	ТекстХТМЛ = СформироватьХТМЛИзТабдок(ТабДок);
	
	//ДОБАВИМ В УЖЕ ГОТОВЫЙ HTML-КОД НАВИГАЦИОННУЮ ССЫЛКУ "НАЗАД" ХОТЯ ПО БОЛЬЛЬШОМУ СЧЕТУ МОЖНО ВОСПОЛЬЗОВАТЬСЯ В БРАУЗЕРЕ КНОПКОЙ "НАЗАД"
	ХТМЛСсылкаНавигацииНазад = ПолучитьТекстНавигационнойСсылки_Назад();
	ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ,"</TABLE>","</TABLE> " + ХТМЛСсылкаНавигацииНазад);
	
	Возврат ТекстХТМЛ;
КонецФункции // СформироватьДанныеПоНоменклатуре()

Обращу внимание на несколько моментов:

1. В данной случае используется Общий макет, с типом - "Табличный документ", а не схема компоновки данных как в первом случае.

2. Картинка выводится, если в элементе номенклатура, в реквизите "ПутькКартинке" указан путь до картинки. 

3. Первоначально хотел выводить картинку с помощью формирования команды <img src="путь до картинки" alt="описание" /> , но как выяснилось по умолчанию браузеры не всегда отображают картинку находящуюся на сетевом ресурсе из-за настроек безопасности по умолчанию. Менять настройки браузеров  на n-количестве рабочих мест - "это не наш метод"(с). Поэтому решил встраивать картинку прямо в код html путем кодирования картинки в строку BASE64 и помещая ее в соответствующую обертку типа 

<img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
    9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="это что-то" />

Далее привожу все остальные вспомогательные функции использующиеся в функции СформироватьДанныеПоНоменклатуре()

// ВОЗВРАЩАЕТ КОД HTML ДЛЯ НАВИГАЦИОННОЙ ССЫЛКИ С ДЕЙТВИЕМ ПЕРЕХОДА НА ПРЕДЫДУЩУЮ СТРАНИЦУ
Функция ПолучитьТекстНавигационнойСсылки_Назад()
	ТекстСсылки	 = "<a " + "href=""javascript:history.back(1)""" + ">Вернуться назад" + "</a>";
	Возврат ТекстСсылки;
КонецФункции // ПолучитьТекстСсылкиНаСписокноменклатуры()

// ОСНОВНАЯ ВЫЗЫВАЕМАЯ ФУНКЦИЯ ФОРМИРОВАНИЯ КОДА ДЛЯ ВСТАВКИ КАРТИНКИ В БУДУЩИЙ HTML-КОД
Функция ПолучитьСсылкуХТМЛПоАдресуКартинки(ПутькКартинке)
	СтрокаBase64 = ПолучитьКартинкуBase64(ПутькКартинке);	
	ТекстСсылки =  "<img src="+"""" +СтрокаBase64 +""""+Символы.НПП+"alt="+""""+"картинка"+""""  + "/>";
	Возврат ТекстСсылки;
КонецФункции // ()

// ВСПОМОГАТЕЛЬНАЯ ФУНКЦИЯ ВОЗВРАЩАЕТ КАРТИНКУ В ВИДЕ СТРОКИ BASE64
// ВЫЗЫВАЕТСЯ ИЗ "ПолучитьСсылкуХТМЛПоАдресуКартинки"
Функция ПолучитьКартинкуBase64(ПутькКартинке)
	
	нКартинка = Новый Картинка(ПутькКартинке); // ПОЛУЧИМ КАРТИНКУ
	фКартинки = Строка(нКартинка.Формат());    // ОПРЕДЕЛИМ ФОРМАТ КАРТИНКИ ДЛЯ ДАЛЬНЕЙШЕГО ФОРМИРОВАНИЯ HTML-ССЫЛКИ
	ДвоичныеДанныеКартинки = нКартинка.ПолучитьДвоичныеДанные(); // ДЛЯ КОДИРОВАНИЯ В BASE64 ПОЛУЧИМ ДВОИЧНЫЕ ДАННЫЕ КАРТИНКИ
	
	//КОДИРУЕМ КАРТИНКУ В BASE64
	СтрокаBASE64 = Base64Строка(ДвоичныеДанныеКартинки);
	
	//ФОРМИРУЕМ КОМАНДУ HTML ДЛЯ ВСТАВКИ КАРТИНКИ
	СтрокаBASE64 = "data:image/"+ФКартинки+";base64,"+СтрокаBASE64;
	
	// ДОПОЛНИТЕЛЬНО УБЕРЕМ ИЗ ПОЛУЧЕННОЙ СТРОКИ СЛУЖЕБНЫЕ СИМВОЛЫ, ТАК КАК НЕ ВСЕ БРАУЗЕРЫ КОРРЕКТНО ОТОБРАЖАЮТ КАРТИНКИ С ТАКИМИ СИМВОЛАМИ
	СтрокаBASE64 = СтрЗаменить(СтрокаBASE64,символы.ВК,"");
	СтрокаBASE64 = СтрЗаменить(СтрокаBASE64,символы.ПС,"");
	
	Возврат СтрокаBASE64;
КонецФункции // ПолучитьКартинкуBase64()

// ВОЗВРАЩАЕТ ПЕРВИЧНУЮ ССЫЛКУ ДЛЯ БРАУЗЕРА С КОТОРОЙ НАЧИНАЕТСЯ РАБОТА С HTTP_СЕРВИСОМ
Функция СформироватьАдресСсылки() Экспорт
	ИмяБазы = Макс (НСтр(СтрокаСоединенияИнформационнойБазы(),"Ref"));
	КорневойURL =  Метаданные.HTTPСервисы.ПросмотрНоменклатурыЧерезБраузер.КорневойURL;
	Адрес = "http://localhost/"+ ИмяБазы + "/hs/"+КорневойURL+"/GetListNom";
	Возврат Адрес;
КонецФункции // СформироватьАдресСсылки()

Еще немного про экспортную функцию СформироватьАдресСсылки() - она используется в обработке "ПроверкаФормированияHTML" для запуска браузера с первоначальной ссылкой на получение списка номенклатуры. Если сервер не локальный, то необходимо соответственно ее подправить.

Саму обработку для отладки особо описывать не буду, она просто вызывает функции общего модуля СформироватьСписокНоменклатурыНаСКД","СформироватьДанныеПоНоменклатуре" и выводит полученный html-код в одном поле и отображение его в html-поле. Но так как я выше уже говорил, решить возникшую проблему неправильного отображения в браузере мне не помогло, но на всякий случай удалять из конфигурации я ее не стал :)

К статье приложена выгрузка базы, которая реализует все вышенаписанное. Для отображения картинок нужно указать в элементах номенклатуры путь до картинки.

Вот в принципе и все. Буду рад комментариям, поучениям и всему остальному :)  И надеюсь, что это кому-нибудь сэкономит немного времени. 

74

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

Наименование Файл Версия Размер
TestDb_HttpService.dt
.dt 46,24Kb
07.12.18
1
.dt 46,24Kb 1 Скачать

См. также

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

Комментарии
Избранное Подписка Сортировка: Древо
1. saa@kuzov.org 07.12.18 17:36 Сейчас в теме
Добавьте еще один гет-метод, который "по ссылке" отдает из базы файл картинки в поток (не в base64, а бинарно).
И в отображаемую страничку встраивайте картинки именно по этой ссылке.
dmitry1975; +1 Ответить
2. dmitry1975 124 07.12.18 23:01 Сейчас в теме
(1) А каковы буду преимущества этого метода? Сейчас при формировании ответа, генерится полностью страничка вместе с картинками и отдается. В случае реализации метода, который предложили вы, возрастет нагрузка на сервис, поскольку вместо одного запроса, при наличии нескольких картинок на страничке буду дополнительно сделаны запросы в сервис по числу картинок. На мой взгляд это не сильно оптимально.. единственно, что страничка возможно будет быстрее отображаться..
3. saa@kuzov.org 08.12.18 10:52 Сейчас в теме
(2) Ну Вы же сами пишите, хотел ссылки вставлять, не разобрался как. Вот я Вам и предлагаю вариант со ссылками, который будет работать не только в локальной сети с наличием файловой шары.
Так же я не уверен, что браузеру будет "хорошо" при большом количестве объемных картинок в формате base64
Ну и просто полезно такой код по отдаче картинок написать, ИМХО.
9. dmitry1975 124 08.12.18 14:15 Сейчас в теме
(3 )Да, спасибо за предложение! Скорее всего я реализую эту фичу, потому что мне самому интересно проверить, насколько это будет лучше работать. В моем случае картинки небольшие, и их заведомо не так много, а с учетом того, что база находится в локальной сети, то по скорости не будет больших задержек даже если картинки будут большими.. единственно может есть ограничения на объем передаваемых данных? Но в принципе это можно проверить :)
4. DO_WHILE_LOOP 303 08.12.18 11:15 Сейчас в теме
без пагинации на проде не взлетит, с ростом базы начнутся проблемы с выводом GetListNom
dmitry1975; +1 Ответить
7. dmitry1975 124 08.12.18 14:10 Сейчас в теме
(4) Вы правы, по хорошему конечно нужно разделять информацию на порции..
У нас это не сильно актуально, потому что количество производимого товара не такое и большое, и новый товар появляется не настолько часто, а если появляется, то скорее всего что-то снимается с производства, поэтому я не стал акцентировать на этом внимание. Но дело даже не в этом.. Данная статья просто реализует пример http-сервиса, который конечно есть куда развивать и дорабатывать:)
Я не ставил задачей статьи показать законченное решение, а хотел поделиться с тем, с чем мне пришлось столкнуться в процессе решения своей задачи, с учетом того, что я с веб вообще не имею опыта работы, но знаю, что сейчас это актуально для многих.
Но в любом случае я благодарю вас, за то, что акцентировали внимание на этой важной детали! И обязательно учту это в будущем..
5. logarifm 1020 08.12.18 13:58 Сейчас в теме
В целом все отлично к статье никаких вопросов нет. А вот к способу выбора тут конечно возник вопрос. В целом, а почему именно вообще сервис сделан? Ну вот в чем его особенность. Поймите меня верно сейчас в сервисе, что есть? Необходимо знать ссылку куда зайти в него для кого это для менеджеров ? А если надо получить код товара то еще в браузере надо чего-то там в адресную строку добавлять. То есть возрастает ошибки ввода если это производит обычный менеджер, а не обученный ИТ-спец.

Если сделать обычный упрощенный вход в систему с узким набором динамического списка, где возможностей гораздо больше.
10. dmitry1975 124 08.12.18 14:56 Сейчас в теме
(5) Спасибо за комментарий!
Расскажу почему выбран именно http-сервис:

1. У нас конфигурация "УПП". Для публикации базы, и работы в веб-клиенте необходимы управляемые формы, которые нужно будет для документов, справочников и тому подобное.Часть там есть, но этого недостаточно, потому что реализован большой доп. функционал, которые тоже придется переводить на УФ. На это нужно прилично времени, особенно с учетом того, что времени на это практически нет. Поэтому публикация базы не рассматривается.

2. Упрощенный вход в систему и динамический список тоже не панацея, поскольку я писал, что данные по товару, которые должны видеть пользователи находятся не только в справочнике "номенклатура", а разбросаны по регистрам, доп. сведениям, характеристикам, фотографии находятся на сетевом ресурсе, и не скопом и соответственно в разных папках, подпапках. Поэтому динамический список конечно отразит справочник номенклатуры, но пользователю придется все равно собирать информацию по разным местам и это самый главный момент задачи. Пользователь должен видеть все важную информацию о товаре в одном месте!
3. Возможно я ошибаюсь, но в случае с интерфейсом ODATA, так же через web-интерфейс дается доступ к публикуемым объектам метаданных. Почему нас это не спасет написано выше, но еще раз повторюсь: информация о товаре нужна в одном месте, без лишних телодвижений.

А теперь чем мне понравился http-сервис?

1. Достаточно простая реализация. (я не работал с web-сервисами, читал, что там реализация сложнее, но конечно тоже надо будет попробовать и оценить для себя для каких задач это можно использовать)
2. Я реализовал только то, что мне было необходимо, минимальными затратами. Я не сторонник делать универсальные решения, когда нужно решить конкретную задачу! Потому что на универсальное решение затрачивается очень много времени, которого всегда не хватает!
3. Еще один момент, Http-сервисы в 1С это относительно новая и одна из последних фич платформы 1С, в смысле интеграции с WEB, поэтому просто хотелось разобраться как это работает на реальной задаче. Что и было сделано.

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

У меня ссылка на метод получения информации по элементу, формируется автоматически при выводе, поэтому вводить что-то а в адресную строку не потребуется, и вероятность ошибки существенно снижается :)

Надеюсь, что я смог ответить на ваши вопросы.
14. logarifm 1020 08.12.18 23:45 Сейчас в теме
(10)
. Поэтому публикация базы не рассм

У меня была такая же проблематика конфа на ОФ (обычных формах) и постала задача чтобы поставщики могли работать с нашей номенклатурой и для автоматизации процеса делать в ней заявки. Сделал очень просто - ОБРАБОТКА на УФ (управляемой форме) в конфигурации свойство ест-но выставлено использовать ОФ и УФ. И все дал спец. роль и на рабочий стол выделил обработку.
17. dmitry1975 124 09.12.18 00:18 Сейчас в теме
(14) Да, в вашем случае это нормальное решение. Но здесь конкретная задача: только отображать информацию о товаре, а не редактировать ее, поэтому обработка здесь не будет оптимальным решением.
6. logarifm 1020 08.12.18 14:01 Сейчас в теме
Я к тому виду, что можно же было опубликовать саму 1С завести пользователей для входа или одного общего чтобы не парится и входите будьте здоровы. Лицензия один фиг нужна , что на веб-сервис, что на вход!
12. TitanLuchs 94 08.12.18 15:37 Сейчас в теме
(6) При прочих равных использование http--сервиса в данной задаче более оптаимльный вариант. Страница загружается значительно быстрее, чем интерфейс 1С, не требуется ввод логинов-паролей, установленная платформа 1С на компьютере не нужна, нагрузка на сервер ниже в разы. И лицензия на веб-сервис в клиент-серверном варианта съедаться не будет ни одна, достаточно лицензии на сервер 1С Предприятия.
8. logarifm 1020 08.12.18 14:13 Сейчас в теме
Ну и забыл. Вообще можно было без всех маневров использовать ОДАТА :)
11. TitanLuchs 94 08.12.18 15:33 Сейчас в теме
Хорошая реализация. Пара моментов:
1. HTML, который генерит 1С при сохранении табличного документа, сильно перегружен лишними стилями и прочими элементами. Будет быстрее работать, если создать шаблон строки таблицы (<tr>) и заполнять этот шаблон данными из 1С, таким образом собирать html всей страницы. Самый идеальный вариант -- отправлять в браузер только JSON с данными строки, а саму строку собирать на клиенте яваскриптом, но в этой задаче это конечно, излишне.
2. Для быстрого отбора неплохо добавить поле поиска. На его обработчик оnchange повесить функцию, которая дернет http-сервис 1С, передав в него еще один параметр - подстроку поиска. По этой подстроке можно выбирать нужную номенклатуру: по наименованию или коду, и формировать список номенклатуры с учетом этого отбора.
dmitry1975; +1 Ответить
15. dmitry1975 124 09.12.18 00:08 Сейчас в теме
(11)
1. Да, это верно подмечено! Содержимое файла, который получается после сохранения табличного документа в формате html, далеко от совершенства :)) Скорее всего попозже я реализую ваш метод.
2. Про поле "поиска" я думал, но пока для моей задачи это не особо актуально, но в принципе на будущее тоже можно будет сделать. Стандартным поиском по странице работает нормально..

Спасибо за советы!
13. DO_WHILE_LOOP 303 08.12.18 18:21 Сейчас в теме
вот как пример оптимизации, посмотрите на скорость загрузки при разбивке по категориям
https://superdealsae.github.io/category/

и при варианте полной загрузки каталога
https://superdealsae.github.io/search

при этом в обоих случаях данные хранятся в json формате отображается только видимая часть каталога и реализована ленивая подгрузка изображений
16. dmitry1975 124 09.12.18 00:13 Сейчас в теме
(13) Да видно, что существенно быстрее страничка отображается при разбивке по категориям. Есть куда стремиться.. Спасибо!
18. badboychik 60 09.12.18 16:09 Сейчас в теме
генерить целиком html - так себе решение. У меня есть задумка сделать страницы на vue.js и коннектиться к 1С только за данными. Должны быть абсолютно независимыми представление (html+vue+vuetify) и бэкэнд (1С). Можно отдельно тестить и разрабатывать и то и другое, разными людьми. Было бы идеально, если 1С добавила в платформу поддержку html-макетов для объектов и js-библиотек в секции "Общие объекты". Пока что приходится городить костыли на текстовых макетах. А если вставить в него сжатую js-библиотеку, где несколько килобайт в одну строку, конфигуратор до сих пор падает.
19. TitanLuchs 94 09.12.18 20:10 Сейчас в теме
(18) Подобные решения в большинстве случаев передаются на поддержку 1Сникам, которые довольно слабо разбираются в vue. Я занимаюсь интеграцией 1С с веб с 2008 года, сделал много проектов на эту тему и всегда предлагаю клиенту варианты: передавать из 1С только JSON и собирать страницу в браузере, или сразу генерить в 1С готовый HTML. Только один выбрал первый вариант, и то потому, что выгружали огромную таблицу порциями, там на готовом HTML браузер начинал подвисать при добавлении новых строк в <table>. Все остальные выбирают генерацию html на стороне 1С, так как это проще и дешевле в сопровождении, но при этом отвечает требованиям по скорости отображения страниц и нагрузки на сервер.
20. Xershi 417 09.12.18 20:25 Сейчас в теме
Возможно автор не знал что опубликовать базу было бы ещё проще. Открыл и работай.
21. dmitry1975 124 09.12.18 21:20 Сейчас в теме
(20) Я писал выше (пост 10), почему публикация базы в данном случае не подходит.
24. Xershi 417 10.12.18 15:38 Сейчас в теме
(21) что-то вы лукавите. У вас простой вебсервис, функционал которого на УФ пилится за пол часа. Тут скорее нет опыта на УФ?
Тогда соглашусь в рамках цейтнота и нехватки знаний оптимальный вариант.
Тогда укажите это в начале статьи, а то до коментариев надо дойти же!
А то прочитав вашу статью складывает мнение, что вы безграмотный программист, а не решали задачу в заданных условиях...
25. dmitry1975 124 11.12.18 08:23 Сейчас в теме
(24) Я не понимаю с чего вы взяли, что у меня нет опыта работы на УФ. По большей части, пишу как раз на управляемых формах.

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

я больше отвечать не буду. Каждый сам для себя решит- полезна ли ему статья или нет.
22. dsdred 914 10.12.18 08:24 Сейчас в теме
Рад, что статьи пригодились.
23. dmitry1975 124 10.12.18 08:26 Сейчас в теме
(22) Да, еще раз спасибо за статьи! :)
Прекрасно когда уже есть информация, с которой можно начать изучение :)
Оставьте свое сообщение