Сервис регистрации ошибок 1С (пример создания)

13.10.20

Разработка - Инструментарий разработчика

Разработаем вместе простой сервис регистрации ошибок для 1С на самой 1С =)

 

Всем привет!

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

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

Данная статья - текстовый вариант свежего видеоролика по теме.

 

 

Содержание

 

 

 

Введение ^

Что это такое? Это некий опубликованный http-сервис, на который автоматически будут отправляться возникающие у пользователей ошибки. Сервис будет их принимать, обрабатывать и хранить. А ответственные за разбор ошибок люди будут далее просматривать накопленные данные.

На чём мы это будем делать? Естественно, на 1С! И начнём прямо сейчас.

Для начала создадим новую базу для разработки. Назовём её "Сервис регистрации ошибок". Запускать её будем с версией 8.3.17. Так же сразу для удобства я сделаю себе хранилище разработки. И теперь можно разрабатывать.

 

 

Разработка HTTP-сервиса ^

 

Первое, что нам нужно в базе - создать новый HTTP-сервис. Назовём его "Основной Сервис". Укажем корневой URL. Пусть будет "main".

 

 

Теперь нам нужно добавить новый шаблон URL. Назовём его ПолучитьИнформацию. И в шаблоне укажем "/getInfo". Добавим в шаблон новый метод POST-метод с таким же названием и сразу создадим для него обработчик.

 

 

Но для работы сервиса нам нужен ещё один метод. Создадим новый шаблон URL и назовём его "ОтправитьОтчет". Шаблон у него будет "/pushReport". Аналогично прошлому шаблону, создадим POST-метод с обработчиком.

 

 

 

Публикация сервиса ^

В данном видео мы не будем рассматривать процесс установки сервера, публикации базы и так далее. По этой теме есть множество информации и публикация нашего сервиса ничем не отличается от других. По разворачиванию сервера могу посоветовать видео на канале Ильи Низамова. Лично я делал по этому видео: https://nizamov.school/server-1s-apache-ustanovka-apache/

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

 

 

Смотрим на метод getInfo() ^

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

 

 

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

 

 

Мы сейчас находимся в отладке на методе "ПолучитьИнформацию" ("getInfo"). Давайте посмотрим, что нам пришло в запросе. Для этого выполним метод Запрос.ПолучитьТелоКакСтроку().

 

 

Что мы видим? Этим запросом 1С говорит нам информацию о себе. Какая конфигурация, какая платформа и версия приложения. И далее 1С ожидает ответа от этого первого метода. Нужно ли действительно отправлять на сервис регистрации текущую ошибку? Давайте теперь сделаем так, чтобы наш метод отвечал "да".

 

Разработка метода getInfo() ^

 

Я подготовил простую функцию, которая поможет нам в этом. Она нужна для преобразования значений 1С в JSON.

 

Текст функции
// Возвращает значение в виде JSON-строки.
// Преобразованы в JSON-строку (сериализованы) могут быть только те объекты,
// для которых в описании указано, что они сериализуются.
//
// Параметры:
//   Значение - Произвольный. Значение, которое необходимо сериализовать в JSON-строку.
//
// Возвращаемое значение:
//   Строка - JSON-строка представления значения в сериализованном виде.
//
Функция ЗначениеВСтрокуJSON(Значение) Экспорт
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Значение);
	
	Возврат ЗаписьJSON.Закрыть();
	
КонецФункции

 

Теперь создадим структуру ДанныеОтвета. В неё будем помещать передаваемые в качестве ответа данные. Комментарии к свойствам я буду брать из ИТС.

 



Функция ПолучитьИнформацию(Запрос)
	
	ДанныеОтвета = Новый Структура;
	
	//данная ошибка должна быть отправлена в сервис регистрации
	ДанныеОтвета.Вставить("needSendReport", Истина); 
	
	//Текст, который будет показан пользователю в качестве дополнительной информации об ошибке (подробнее см. здесь). 
	//https://its.1c.ru/db/v8317doc#bookmark:dev:TI000002261
	//Текст желательно возвращать на том языке, который будет понятен пользователю. 
	//Информацию о локализации можно получить из запроса, который поступает в метод getInfo.
	//Если желательно, чтобы пользователь отправил отчет о конкретной ошибке в сервис регистрации ошибок, 
	//то с помощью данного свойства можно показать пользователю рекомендацию, мотивирующую на отправку отчета об ошибке.
	ДанныеОтвета.Вставить("userMessage", "Чем быстрее разработчик узнает об ошибке, тем скорее она будет исправлена =)");
	
	//тип дампа, который нужно приложить к отчету об ошибке (аналогичен значению атрибута type элемента dump файла logcfg.xml)
	ДанныеОтвета.Вставить("dumpType", 1);
	
	
	ДанныеОтветаСтрокой = ЗначениеВСтрокуJSON(ДанныеОтвета);
	
	Ответ = Новый HTTPСервисОтвет(200);
	
	Ответ.УстановитьТелоИзСтроки(ДанныеОтветаСтрокой);
	
	Возврат Ответ;
	
КонецФункции

 

needSendReport - Булево.

Этот параметр говорит 1С, нужно ли дальше отправлять отчет об ошибке или сервис отказывается его принимать. В нашем случае всегда будет "Да".

UserMessage - Строка

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

"Чем быстрее разработчик узнает об ошибке, тем скорее она будет исправлена =)"

Так же есть ещё свойство dumpType - это тип дампа, который необходимо приложить к отчету об ошибке. Его мы сейчас рассматривать не будем.

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

Метод getInfo готов.

Обновим базу и снова сымитируем ошибку.

Мы в отладке. Посмотрим, как выглядят данные, которые мы даём в качестве ответа.

 

 

И её строковый вариант в формате JSON.

 

 

 

 

Смотрим метод pushReport() ^

В окне об ошибке мы видим нашу мотивирующую строку. Это значит, что метод getInfo сработал корректно и 1С готова к отправке отчета об ошибке.

 

 

Добавим в него комментарий пользователя и нажмём "Отправить".

 

 

Теперь мы в отладке на методе "ОтправитьОтчет" ("pushReport"). Посмотрим содержимое объекта "Запрос". Сначала попробуем выполнить метод ПолучитьТелоКакСтроку().

 

 

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

 

 

Это и есть необходимый нам файл. И, фактически, наша цель достигнута - мы создали сервис, который получает отчёты об ошибках пользователей. Но пока что никак их не обрабатываем.

 

 

Разработка метода pushReport() ^

И так, мы на входе имеем двоичные данные с архивом, в котором содержится нужная нам информация. Очевидно, что нам нужно её извлечь, обработать и сохранить в базе. Но мы не будем делать это сразу. Потому что на это может потребоваться время. В которое 1С будет ожидать ответа от сервиса. Так что длительные операции мы будем выполнять после. А в самом методе http-сервиса будем просто складывать полученные данные в специальный регистр. Такая запись потребует минимум времени. Не нагружает сервис регистрации ошибок, и при этом гарантирует сохранность данных.

Для начала добавим регистр сведений. Каждый отчёт об ошибке будет сохранён в отдельную запись регистра. Добавим измерение. Значение в нём должно быть максимально уникальным, ведь запросы могут происходить часто. Поэтому сделаем его типом "УникальныйИдентификатор". Можно, конечно, сделать строковый тип с длиной достаточной для идентификатора, но мы же делаем просто прототип и сейчас не будем заморачиваться в таких тонкостях.

 

 

И так, у нас есть регистр с измерением. Сами данные отчета будут храниться в ресурсе с типом ХранилищеЗначения.

 

 

Теперь создадим методы для работы с регистром. Перейдём в его модуль менеджера. Вставим для красоты "стандартный" БСПшный текст с директивами и областями.

 

Стандартные области
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс



#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс



#КонецОбласти

#Область СлужебныеПроцедурыИФункции



#КонецОбласти

#КонецЕсли

 

И создадим экспортную процедуру ДобавитьЗапись(). Входными параметрами будут данные отчёта и идентификатор. При этом второй необязательный - если не передавать, то его значение будет автоматически генерироваться. Внутри метода будет создаваться и записываться новая запись регистра.

А так же процедуру по удалению записи регистра. Она нам понадобится позднее

 

Модуль менеджера
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

Процедура ДобавитьЗапись(Содержимое, Идентификатор = Неопределено, Дата = Неопределено) Экспорт
	
	МенеджерЗаписи = РегистрыСведений.ПолученныеОтчетыОбОшибках.СоздатьМенеджерЗаписи();
	МенеджерЗаписи.Активность    = Истина;
	МенеджерЗаписи.Идентификатор = ?(Идентификатор = Неопределено, Новый УникальныйИдентификатор, Идентификатор);
	МенеджерЗаписи.Содержимое    = Содержимое;
	МенеджерЗаписи.Дата          = ?(Дата = Неопределено, ТекущаяДата(), Дата);
	МенеджерЗаписи.Записать(Истина);
	
КонецПроцедуры

Процедура УдалитьЗапись(Идентификатор) Экспорт
	
	МенеджерЗаписи = РегистрыСведений.ПолученныеОтчетыОбОшибках.СоздатьМенеджерЗаписи();
	МенеджерЗаписи.Идентификатор = Идентификатор;
	МенеджерЗаписи.Прочитать();
	МенеджерЗаписи.Удалить();
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс



#КонецОбласти

#Область СлужебныеПроцедурыИФункции



#КонецОбласти

#КонецЕсли

 

Вернёмся в метод http-сервиса. Сначала получим двоичные данные из входящего запроса. Это и есть наш файл. Запакуем его в хранилище значения и передадим в наш новый метод регистра сведений. Ответ менять не будем - просто вернём код 200 (успешное выполнение).

 

Функция ОтправитьОтчет(Запрос)
	
	ДанныеОтчета = Запрос.ПолучитьТелоКакДвоичныеДанные();
	ДанныеОтчета = Новый ХранилищеЗначения(ДанныеОтчета);
	
	РегистрыСведений.ПолученныеОтчетыОбОшибках.ДобавитьЗапись(ДанныеОтчета);
	
	Возврат Новый HTTPСервисОтвет(200);
	
КонецФункции

 

Теперь обновим базу и зайдём в неё. У нас появился регистр, записей в нём пока нет.

 

 

В демо-базе выполним нашу обработку с генерацией ошибки. Нажмём "Отправить" и сразу видим надпись "Отчет отправлен".

 

 

Хорошо, перейдём в сервис регистрации. Вот наша запись регистра.

 

 

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

В ресурсе "Содержимое" находится ХранилищеЗначения. Попробуем извлечь его методом Получить(). Видно, что данные там есть.

 

 

Отпускаем отладку. Запись в регистр добавилась.

 

 

А что сейчас в демо-базе? Кнопка "Отправить" теперь называется "Отправить (был отправлен)".

 

 

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

 

 

 

Постобработка данных ^

Теперь у нас есть быстрый сервис, который просто пишет входящие данные в регистр. И нам нужно их как-то обрабатывать.

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

 

 

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

 

 

Теперь у нас есть источника данных (регистр сведений) и приёмник (документ). Нам нужен инструмент, который будет брать записи регистра и создавать на их основе документы. Добавим новую обработку. Сделаем ей форму и основную команду, которая будет выполнять метод модуля обработки.

 

 

А вот уже в модуле обработки будет содержаться логика превращения записи регистра в документ.

 

Логика выполнения такая:

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

Сама обработка записи будет заключаться в следующем. Сначала мы извлечём двоичные данные во временный файл. Затем откроем чтение Zip-файла и извлечём его содержимое в специально подготовленный временный каталог. Как только удалось это сделать, мы откроем в текстовом документе файл "report.json". Этот файл содержит основные данные отчета об ошибке. Содержимое этого файла и есть наш отчёт.

Теперь, когда мы имеем нужные нам данные, создадим новый документ, заполним его ими и запишем в базу. А временные файлы удалим.

Если запись регистра успешно была обработана, то удалим её тоже. Она нам больше не нужна.

Под капотом код с прототипа:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

Процедура ВыполнитьОсновноеДействие() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	*
	|ИЗ
	|	РегистрСведений.ПолученныеОтчетыОбОшибках";
	РезультатЗапроса = Запрос.Выполнить();
	Если НЕ РезультатЗапроса.Пустой() Тогда
		Выборка	= РезультатЗапроса.Выбрать();
		Пока Выборка.Следующий() Цикл
			
			Попытка
				ОбработатьДанныеПолученногоОтчетаОбОшибке(Выборка);
			Исключение
				ТекстОшибки = "Не удалось обработать отчет об ошибке с идентификатором %1 по причине %2";
				ТекстОшибки = СтрШаблон(ТекстОшибки, Выборка.Идентификатор, ОписаниеОшибки());
			    ДобавитьСообщение(ТекстОшибки);
			КонецПопытки;
			
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытий



#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ОбработатьДанныеПолученногоОтчетаОбОшибке(ДанныеОбОтчете)
	
	ДанныеОтчета = ДанныеОбОтчете.Содержимое.Получить();
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".zip");
	ДанныеОтчета.Записать(ИмяВременногоФайла);
	
	Архиватор = Новый ЧтениеZipФайла(ИмяВременногоФайла);
	
	ВременныйКаталог = Новый Массив;
	ВременныйКаталог.Добавить(КаталогВременныхФайлов());
	ВременныйКаталог.Добавить("ОбработкаПолученныхОтчетовОбОшибках");
	ВременныйКаталог.Добавить(ДанныеОбОтчете.Идентификатор);
	ВременныйКаталог = СтрСоединить(ВременныйКаталог, "\");
	
	Архиватор.ИзвлечьВсе(ВременныйКаталог);
	Архиватор.Закрыть();
	УдалитьФайлы(ИмяВременногоФайла);
	
	ИмяОсновногоФайла = СтрШаблон("%1\%2", ВременныйКаталог, "report.json");
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ИмяОсновногоФайла, КодировкаТекста.UTF8);
	
	ТекстОсновногоФайла = ТекстовыйДокумент.ПолучитьТекст();
	
	УдалитьФайлы(ВременныйКаталог);
	
	СсылкаНаОтчет = Документы.ОтчетыОбОшибках.ПолучитьСсылку(ДанныеОбОтчете.Идентификатор);
	ОтчетОбОшибке = СсылкаНаОтчет.ПолучитьОбъект();
	
	Если ОтчетОбОшибке = Неопределено Тогда
		ОтчетОбОшибке = Документы.ОтчетыОбОшибках.СоздатьДокумент();
		ОтчетОбОшибке.УстановитьСсылкуНового(СсылкаНаОтчет);
	КонецЕсли;
	
	ОтчетОбОшибке.ТекстОтчета = ТекстОсновногоФайла;
	ОтчетОбОшибке.Дата = ДанныеОбОтчете.Дата;
	ОтчетОбОшибке.Записать();
	
	РегистрыСведений.ПолученныеОтчетыОбОшибках.УдалитьЗапись(ДанныеОбОтчете.Идентификатор);
		
КонецПроцедуры

Процедура ДобавитьСообщение(ТекстСообщения)
	
	Сообщить(ТекстСообщения);
	
	ЗаписьЖурналаРегистрации("ОбработкаПолученныхОтчетовОбОшибках",
	УровеньЖурналаРегистрации.Ошибка,,,ТекстСообщения);
		
КонецПроцедуры

#КонецОбласти

#КонецЕсли

 

Выполним обработку. 

У нас создались три документа. В каждом хранится содержимое файла report.json. И теперь такую обработку можно поставить на регламентное выполнение и она будет превращать накопленные в регистре отчёты об ошибках в документы. 

 

 

 

Выводы ^

Мы разработали простой сервис регистрации ошибок и теперь понимаем, как работать с новым механизмом от 1С. 

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

А далее мы рассмотрим более подробно извлечение содержимого из архива с отчётом об ошибке. 

 

 

Понравилась статья? ^

Не будьте равнодушными! Поставьте лайк плюс, оставьте комментарий.

Не забудьте посмотреть видео по этой теме, в нём я наглядно показываю всё то, что говорится в статье: Сервис регистрации ошибок

И переходите к другим публикациям:

 

 

ошибки сервис регистрации отчеты http getInfo pushReport

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159420    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7769    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

9360 руб.

17.05.2024    23434    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8500 руб.

10.11.2023    10421    36    22    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 19980 руб.

06.10.2023    15398    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3120 руб.

14.01.2013    187980    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17303    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7694    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Sander80 100 13.10.20 17:12 Сейчас в теме
Скажите пожалуйста, вам не удалось как-то в адрес сервиса регистрации ошибок вбить логин и пароль? Я вчера пробовал после вашего видео, ничего не вышло. Хотя через curl первый метода сервиса регистрации очень легко включить логин и пароль.
2. SeiOkami 3515 13.10.20 17:32 Сейчас в теме
(1) к сожалению, никаких подобных настроек в самом интерфейсе 1С я найти не смог. А глубже пока не разбирался. Но, безусловно, это важный момент для сервиса регистрации. Если первый метод просто даёт нам инфу о клиенте, то второй присылает файл. И просто так (не доверяя однозначно источнику запроса) его нельзя принимать и распаковывать.
mordiros; +1 Ответить
3. Sander80 100 13.10.20 17:34 Сейчас в теме
(2) понятно, спасибо. Возможно, в 1с что-то не доработали.
Потому что через curl работает
http://user:password*url, но вбитый в поле настроек в 1с не прокатило
7. SeiOkami 3515 13.10.20 20:08 Сейчас в теме
(3) можно вывернуться. Для этого к адресу сервиса можно прибавить произвольные данные. Идентификатор или тот же пароль. Но, к сожалению, это будет светиться и в настройках в 1С и в адресе запроса (если его отловить).
8. Sander80 100 13.10.20 20:10 Сейчас в теме
(7) В каком формате? У меня не получилось...
9. SeiOkami 3515 13.10.20 20:13 Сейчас в теме
(8) вышлю, как буду у компьютера. Если к адресу сервиса прибавить произвольные данные, то их можно будет прочитать в методе в объекте Запрос. У меня получалось. На основе этого я хочу в конфигурации по регистрации ошибок сделать "подсервисы". Выделять не отдельный сервис для разных групп/нужд/клиентов, а просто в адресе сервиса прописывать нужный идентификатор
10. SeiOkami 3515 13.10.20 21:03 Сейчас в теме
(8)
Для этого нужно видоизменить шаблон URL

Например, так можно вставить в шаблон адреса параметр name

/{name}/getInfo
/{name}/pushReport

Сам адрес к сервису такой:
http://localhost/ErrorRegistrationService/hs/main/test/
где выделенное жирным - это значение параметра {name}
В результате, в отладке можно увидеть передаваемые параметры

11. Sander80 100 13.10.20 22:16 Сейчас в теме
(10) очень интересно, спасибо.
Хоть какой-то вариант дополнительной авторизации.

Со своей стороны могу сказать, что вот эта не готовность 1с передавать параметры авторизации привела к тому, что мы сейчас опубликовали через Апач базу отдельно, зашив в публикацию пользователя и пароль. Так хотя бы избегаешь необходимости держать базу без авторизации
22. Flok 3 12.04.21 16:29 Сейчас в теме
(1) Добрый день , я столкнулся с такой же проблемой и понял что единственный выход , это сделать вторую публикацию базы , где указать имя и пароль пользователя

У меня Apache 2.4 Сделал я так
1) Каталог моей публикации скопировал и переименовал
2 ) в файл default.vrd внес изменения -

<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/tskhidden"
ib="Srvr="ЧЧЧЧЧ";Ref="ННННН";usr=user;pwd=user">

Изменил параметр /base на новую публикацию
и в параметр IB - прописал имя пользователя и пароль ( в примере user )

Публикаю добавляем редактированием файла httpd.conf
4. Steelvan 306 13.10.20 18:20 Сейчас в теме
Поставил плюс за зачеркнутое вражеское слово "лайк".
5. ltfriend 13.10.20 18:33 Сейчас в теме
Народ тупеет. Уже софт ставят по видео-инструкциям.
user649060; +1 5 Ответить
6. SeiOkami 3515 13.10.20 19:00 Сейчас в теме
(5) как будто в видео инструкциях есть что-то плохое
bladeson; romankoav; rpgshnik; mrChOP93; lihomanov; adhocprog; serg-lom89; cuztam; +8 Ответить
12. serg-lom89 76 14.10.20 08:43 Сейчас в теме
"На чём мы это будем делать? Естественно, на 1С! И начнём прямо сейчас."
Ключевой посыл понятен,и это хорошо в своем роде)

но для ошибок есть и другие инструменты.Тот же ELK .
13. wowik 890 14.10.20 09:31 Сейчас в теме
+1 за статью, + подписка на канал. Успехов!
14. adhocprog 1142 14.10.20 12:43 Сейчас в теме
15. EGOLEGE 14.10.20 21:21 Сейчас в теме
16. Cyberhawk 135 24.10.20 11:47 Сейчас в теме
Как ведет себя отображение диалога (сообщения) об ошибке, если сервис недоступен?
17. SeiOkami 3515 24.10.20 16:41 Сейчас в теме
(16) пропадает возможность отправки на сервис. Остаётся только вариант с сохранением отчёта об ошибке в файл.

На видео можно это увидеть. Там был момент, когда я сервис держал долго в отладке и 1С решила, что он недоступен.

Вообще, не очень в этом плане удобно. Никакой информации нормально не отображается. Просто пропадает возможность отправки на сервис. Для пользователя это вообще не очевидно. Написали б хотя бы, что "Сервис регистрации недоступен, сохраните отчёт в файл".
SSErmolaev; Cyberhawk; +2 Ответить
18. Cyberhawk 135 24.10.20 17:03 Сейчас в теме
(17) А таймаут у проверки доступности сервиса известен?
Т.е. отображается ли окно ошибки с задержкой в случае, когда сервис недоступен? Ведь в формировании текста (подвала) сообщения участвует сам сервис, насколько я понял.
19. SeiOkami 3515 24.10.20 17:24 Сейчас в теме
(18) если сервис недоступен, то окно с ошибкой формируется так же (за исключением того доп. текста, который сервис должен был вернуть).
Задержка есть, но окно с ошибкой при этом функционирует. Просто надпись в подвале появится сразу, как будет получен ответ от сервиса.

А по таймауту не знаю - надо заменить.
Cyberhawk; +1 Ответить
20. rpgshnik 3795 22.03.21 04:18 Сейчас в теме
Спасибо за серию статей, очень интересно. Жду продолжения.

С меня подписка на канал и инфостарт :)
21. G_101846321568140033637 25.03.21 11:01 Сейчас в теме
Можно ли получить как то ссылку на документ в котором произошла ошибка?
23. buzzzard 51 22.10.21 16:46 Сейчас в теме
Я подготовил простую функцию, которая поможет нам в этом. Она нужна для преобразования значений 1С в JSON.
Текст функции


А где собственно текст функции?
24. SeiOkami 3515 22.10.21 16:59 Сейчас в теме
(23) а нажмите на фразу "текст функции"
25. buzzzard 51 25.10.21 10:34 Сейчас в теме
Немного не по теме, но в ее продолжение...
В функции pushReport http-сервиса делаю:

ДанныеОтчета = Запрос.ПолучитьТелоКакДвоичныеДанные();
ДанныеОтчета.Записать(ПолноеИмяФайла);

В итоге записывается файл с лишним содержанием, которое потом не позволяет открыть файл архиватором.
Что я делаю не так? Как с этим бороться?
Прикрепленные файлы:
26. buzzzard 51 25.10.21 13:00 Сейчас в теме
(25) Сам разобрался. Обычным архиватором такой zip не открыть.
Для распаковки нужно использовать именно ЧтениеZipФайла как и описано в статье.
27. 7OH 70 28.10.21 15:42 Сейчас в теме
(26) может сразу пересохранять ? чтобы потом можно было выдать на гора пользователю для просмотра.
Никто не поделится готовой конфой ? ))))
33. gruk 18 24.10.23 09:45 Сейчас в теме
(25) Вы сохраняете всё тело. Автор умолчал про Content-Type "multipart/form-data" и как с ним работать).
См. https://its.1c.ru/db/metod8dev#content:5917:hdoc:http-messages

Функция ПолучитьОтчетPOST(Запрос)
	
	ТипСодержимого = СтрРазделить(Запрос.Заголовки["Content-Type"], ";");
	
	Если ТипСодержимого[0] = "multipart/form-data" Тогда
		
		Разделитель = СтрРазделить(ТипСодержимого[1], "=")[1];
		
		Маркеры = Новый Массив();
		Маркеры.Добавить("--" + Разделитель);
		Маркеры.Добавить("--" + Разделитель + Символы.ПС);
		Маркеры.Добавить("--" + Разделитель + Символы.ВК);
		Маркеры.Добавить("--" + Разделитель + Символы.ВК + Символы.ПС);
		Маркеры.Добавить("--" + Разделитель + "--");
		
		Данные = Новый ЧтениеДанных(Запрос.ПолучитьТелоКакДвоичныеДанные());
		
		Данные.ПропуститьДо(Маркеры);

		Пока Истина Цикл
			Часть = Данные.ПрочитатьДо(Маркеры);
			Если Не Часть.МаркерНайден Тогда
				Прервать;
			КонецЕсли;
			ЧастьДанных = Новый ЧтениеДанных(Часть.ОткрытьПотокДляЧтения());
			ЗаголовкиЧасти = ПрочитатьЗаголовки(ЧастьДанных);
			ИмяЧасти = ПолучитьИмяЧасти(ЗаголовкиЧасти);
			Если ИмяЧасти = "report" Тогда

				 // Если распаковать
				 // Архив = Новый ЧтениеZipФайла(Новый ПотокВПамяти(ЧастьДанных.Прочитать().ПолучитьБуферДвоичныхДанных()));
				 // Архив.ИзвлечьВсе(<Путь>);

				 // Если сохранить
				 // ЧастьДанных.Прочитать().ПолучитьДвоичныеДанные().Записать(<ИмяФайла>);

				Возврат Новый HTTPСервисОтвет(200);
			КонецЕсли;                            
		КонецЦикла;
	КонецЕсли;
	
	Возврат Новый HTTPСервисОтвет(400);
	
КонецФункции
Показать
28. Necessitudo 14.06.22 10:47 Сейчас в теме
29. jwslavin 26 04.07.22 17:55 Сейчас в теме
Спасибо большое за статью. Помогла при разборе этого механизма. Единственный нюанс, который я не смог понять: если ошибка происходит на веб-клиенте, то на веб-сервис регистрации ошибки вместо post-запроса getInfo происходит options-запрос. И этот момент нигде в документации не освещен. В итоге так и не получилось получить ошибку с веб-клиента. У кого-нибудь были похожие трудности?
30. user1498686 29.07.22 13:08 Сейчас в теме
Это не поможет. Сделал у себя. Теперь присылают скриншоты на которых кнопка отправить отчет. И все время задают вопрос почему одна и таже ошибка так часто выскакивает.
31. user1146461 09.10.23 07:31 Сейчас в теме
Кто нибудь сталкивался с тем, что не работает на мобильной платформе?
34. user1497432 17.05.24 15:06 Сейчас в теме
Благодарим за статью. Использовали ее в написании своего сервиса. Подскажите, пожалуйста: При использовании метода ВызватьИсключение в сервисе по сбору ошибок метод getInfo отрабатывает (отладкой туда попадаем, все нормально), а pushReport - нет. Кто-то сталкивался с таким поведением ?
35. olbu 25.07.24 19:14 Сейчас в теме
Добрый день, сделал как тут описано, но в окне возникновения ошибки, у меня нет кнопки "Отправить", не подскажите, что я не доделал?

Ошибка - просто деление на 0.
36. olbu 26.07.24 07:59 Сейчас в теме
(35) Еще заметил следующее, если вызывать сервис из Браузера, с вводом Логина и Пароля, то 1с выпадает в отладку.
(Админы опубликовали сервис с запросом Логина и Пароля 1с.)

А при появлении ошибки в 1с, 1с не уходит в отладку.
путь к сервису:
https://localhost/test/hs/errors
37. Светлый ум 415 11.11.24 20:44 Сейчас в теме
Оставьте свое сообщение