Вывод отладочных сообщений HTTP Сервиса с помощью ChromeLogger

27.11.17

Интеграция - WEB-интеграция

Разработка для 1C для вывода отладочной информации с помощью ChromeLogger. Есть вопросы к знатокам.

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

Рассмотрим как работает одно из таких средств - ChromeLogger (https://craig.is/writing/chrome-logger/techspecs).

На стороне сервера в процессе формирования ответа добавляется заголовок X-ChromeLogger-Data. Значение заголовка формируется так:

1. Формируем json строку вида:

data = {
    "version": "0.2", // версия модуля, который формирует отладочную информацию
    "request_uri": "/", // ресурс
    "columns": ["label", "log", "backtrace", "type"], // перечень колонок
    "rows": [ // массив строк, соответствующих колонкам
        [
            'метка',
            'сообщение/описание/представление объекта',
            'стек вызова',
            'тип отладочного сообщения'
        ]
    ]
}

2. Кодируем строку в UTF8

3. Кодируем строку в Base64

На стороне клиента в браузере Google Chrome установленное расширение Chrome Logger разбирает данный заголовок и выводит информацию в консоль.

 

А теперь реализуем это для 1С

Разработка производится на 8.3.10.2505, УНФ 1.6.12.4. Модули входят в состав расширения. Конфигурация с поддержки не снята.

Нам необходимо где-то хранить информацию, я выбрал ХранилищеОбщихНастроек. Может быть есть лучше вариант?

функция Отладка(Данные, Метка="", Трассировка="", Тип="") экспорт
	ТекущиеДанные = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ChromeLogger", "ChromeLogger");
	
	если НЕ ЗначениеЗаполнено(ТекущиеДанные) тогда
		ТекущиеДанные = новый ТаблицаЗначений();
		ТекущиеДанные.Колонки.Добавить("log");
		ТекущиеДанные.Колонки.Добавить("label");
		ТекущиеДанные.Колонки.Добавить("backtrace");
		ТекущиеДанные.Колонки.Добавить("type");
	конецесли;

	Запись = ТекущиеДанные.Добавить();	
	Запись.log = Данные;
	Запись.label = Метка;
	Запись.backtrace = Трассировка;
	Запись.type = Тип;
	
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ChromeLogger", "ChromeLogger", ТекущиеДанные);
конецфункции

Теперь сформируем заголовок.

Формируем json строку.

функция СформироватьChromeLoggerJson()
	Таблица = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ChromeLogger", "ChromeLogger");	
	
	если НЕ ЗначениеЗаполнено(Таблица) ИЛИ Таблица.Количество() = 0 тогда
		возврат неопределено;
	конецесли;
	
	Запись = новый ЗаписьJSON();
	Запись.УстановитьСтроку();
	
	Структура = Новый Структура();
	Структура.Вставить("version", "4.0");
	
	Колонки = Новый Массив();
	Колонки.Добавить("label");
	Колонки.Добавить("log");
	Колонки.Добавить("backtrace");
	Колонки.Добавить("type");	
	
	Структура.Вставить("columns", Колонки);	
	
	Строки = новый Массив();	
	для каждого строка из Таблица цикл
		Значения = Новый Массив();
		Значения.Добавить(КодироватьВUnicodeEscape(строка.label));
		
		//Значения.Добавить(строка.log);				
		Значения.Добавить(КодироватьВUnicodeEscape(строка.log));
		
		Значения.Добавить(КодироватьВUnicodeEscape(строка.backtrace));
		Значения.Добавить(КодироватьВUnicodeEscape(строка.type));
		
		Строки.Добавить(Значения);
	конеццикла;	
	
	Структура.Вставить("rows", Строки);	
	Структура.Вставить("request_uri", "/");
	
	ЗаписатьJSON(Запись, Структура);
	
	Таблица.Очистить();
	
	возврат Запись.Закрыть();		
конецфункции

Все национальные символы должны быть кодированы с помощью escape-последовательностей \uhhhh, где hhhh — шестнадцатеричное число из четырех цифр. Для этого была написана, как быстрое решение, функция КодироватьВUnicodeEscape. Можно ли это сделать "красивее", и желательно по максимум штатными средствами?

функция КодироватьВUnicodeEscape(Строка) 
	Уникод = новый Массив();
	Уникод.Добавить("\u0410");
	Уникод.Добавить("\u0430");
	Уникод.Добавить("\u0411");
	Уникод.Добавить("\u0431");
	Уникод.Добавить("\u0412");
	Уникод.Добавить("\u0432");
	Уникод.Добавить("\u0413");
	Уникод.Добавить("\u0433");
	Уникод.Добавить("\u0414");
	Уникод.Добавить("\u0434");
	Уникод.Добавить("\u0415");
	Уникод.Добавить("\u0435");
	Уникод.Добавить("\u0401");
	Уникод.Добавить("\u0451");
	Уникод.Добавить("\u0416");
	Уникод.Добавить("\u0436");
	Уникод.Добавить("\u0417");
	Уникод.Добавить("\u0437");
	Уникод.Добавить("\u0418");
	Уникод.Добавить("\u0438");
	Уникод.Добавить("\u0419");
	Уникод.Добавить("\u0439");
	Уникод.Добавить("\u041a");
	Уникод.Добавить("\u043a");
	Уникод.Добавить("\u041b");
	Уникод.Добавить("\u043b");
	Уникод.Добавить("\u041c");
	Уникод.Добавить("\u043c");
	Уникод.Добавить("\u041d");
	Уникод.Добавить("\u043d");
	Уникод.Добавить("\u041e");
	Уникод.Добавить("\u043e");
	Уникод.Добавить("\u041f");
	Уникод.Добавить("\u043f");
	Уникод.Добавить("\u0420");
	Уникод.Добавить("\u0440");
	Уникод.Добавить("\u0421");
	Уникод.Добавить("\u0441");
	Уникод.Добавить("\u0422");
	Уникод.Добавить("\u0442");
	Уникод.Добавить("\u0423");
	Уникод.Добавить("\u0443");
	Уникод.Добавить("\u0424");
	Уникод.Добавить("\u0444");
	Уникод.Добавить("\u0425");
	Уникод.Добавить("\u0445");
	Уникод.Добавить("\u0426");
	Уникод.Добавить("\u0446");
	Уникод.Добавить("\u0427");
	Уникод.Добавить("\u0447");
	Уникод.Добавить("\u0428");
	Уникод.Добавить("\u0448");
	Уникод.Добавить("\u0429");
	Уникод.Добавить("\u0449");
	Уникод.Добавить("\u042a");
	Уникод.Добавить("\u044a");
	Уникод.Добавить("\u042b");
	Уникод.Добавить("\u044b");
	Уникод.Добавить("\u042c");
	Уникод.Добавить("\u044c");
	Уникод.Добавить("\u042d");
	Уникод.Добавить("\u044d");
	Уникод.Добавить("\u042e");
	Уникод.Добавить("\u044e");
	Уникод.Добавить("\u042f");
	Уникод.Добавить("\u044f");	
	
	РусскиеБуквы = Новый Массив();
	РусскиеБуквы.Добавить("А");
	РусскиеБуквы.Добавить("а");
	РусскиеБуквы.Добавить("Б");
	РусскиеБуквы.Добавить("б");
	РусскиеБуквы.Добавить("В");
	РусскиеБуквы.Добавить("в");
	РусскиеБуквы.Добавить("Г");
	РусскиеБуквы.Добавить("г");
	РусскиеБуквы.Добавить("Д");
	РусскиеБуквы.Добавить("д");
	РусскиеБуквы.Добавить("Е");
	РусскиеБуквы.Добавить("е");
	РусскиеБуквы.Добавить("Ё");
	РусскиеБуквы.Добавить("ё");
	РусскиеБуквы.Добавить("Ж");
	РусскиеБуквы.Добавить("ж");
	РусскиеБуквы.Добавить("З");
	РусскиеБуквы.Добавить("з");
	РусскиеБуквы.Добавить("И");
	РусскиеБуквы.Добавить("и");
	РусскиеБуквы.Добавить("Й");
	РусскиеБуквы.Добавить("й");
	РусскиеБуквы.Добавить("К");
	РусскиеБуквы.Добавить("к");
	РусскиеБуквы.Добавить("Л");
	РусскиеБуквы.Добавить("л");
	РусскиеБуквы.Добавить("М");
	РусскиеБуквы.Добавить("м");
	РусскиеБуквы.Добавить("Н");
	РусскиеБуквы.Добавить("н");
	РусскиеБуквы.Добавить("О");
	РусскиеБуквы.Добавить("о");
	РусскиеБуквы.Добавить("П");
	РусскиеБуквы.Добавить("п");
	РусскиеБуквы.Добавить("Р");
	РусскиеБуквы.Добавить("р");
	РусскиеБуквы.Добавить("С");
	РусскиеБуквы.Добавить("с");
	РусскиеБуквы.Добавить("Т");
	РусскиеБуквы.Добавить("т");
	РусскиеБуквы.Добавить("У");
	РусскиеБуквы.Добавить("у");
	РусскиеБуквы.Добавить("Ф");
	РусскиеБуквы.Добавить("ф");
	РусскиеБуквы.Добавить("Х");
	РусскиеБуквы.Добавить("х");
	РусскиеБуквы.Добавить("Ц");
	РусскиеБуквы.Добавить("ц");
	РусскиеБуквы.Добавить("Ч");
	РусскиеБуквы.Добавить("ч");
	РусскиеБуквы.Добавить("Ш");
	РусскиеБуквы.Добавить("ш");
	РусскиеБуквы.Добавить("Щ");
	РусскиеБуквы.Добавить("щ");
	РусскиеБуквы.Добавить("Ъ");
	РусскиеБуквы.Добавить("ъ");
	РусскиеБуквы.Добавить("Ы");
	РусскиеБуквы.Добавить("ы");
	РусскиеБуквы.Добавить("Ь");
	РусскиеБуквы.Добавить("ь");
	РусскиеБуквы.Добавить("Э");
	РусскиеБуквы.Добавить("э");
	РусскиеБуквы.Добавить("Ю");
	РусскиеБуквы.Добавить("ю");
	РусскиеБуквы.Добавить("Я");
	РусскиеБуквы.Добавить("я");	
	
	для индекс = 0 по РусскиеБуквы.Количество()-1 цикл
		Строка = СтрЗаменить(Строка, РусскиеБуквы.Получить(индекс), Уникод.Получить(индекс));
	конеццикла;	
	
	возврат Строка;
конецфункции

Далее необходимо кодировать получившееся в utf8, после в base64. Можно ли это сделать без всяких временных файлов?

функция КодироватьВUTF8ИBase64(Строка)
    ВременныйФайл = ПолучитьИмяВременногоФайла();

    Запись = Новый ЗаписьТекста(ВременныйФайл, КодировкаТекста.UTF8);
    Запись.Записать(Строка);
    Запись.Закрыть();
    
    ДвоичныеДанные = Новый ДвоичныеДанные(ВременныйФайл);
    Результат = Base64Строка(ДвоичныеДанные);    
    УдалитьФайлы(ВременныйФайл);
	
	возврат Результат;
конецфункции

Собираем все вместе

функция СформироватьЗаголовокДляChromeLogger()
	json = СформироватьChromeLoggerJson();
	
	если НЕ ЗначениеЗаполнено(json) тогда
		возврат неопределено;
	конецесли;	

	json = СтрЗаменить(json, "\\u", "\u");
	Результат = КодироватьВUTF8ИBase64(json);	
	Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат, " ", ""), Символы.ПС, ""), Символ(20), ""), Символ(13), "");	
	Результат = Прав(Результат, СтрДлина(Результат)-4);
	
	возврат Результат;
конецфункции

На последнем шаге добавляем заголовок к ответу

функция Ответ(ДанныеJSON) экспорт		
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
	
	ЗаголовокДляChromeLogger = СформироватьЗаголовокДляChromeLogger();
	если ЗначениеЗаполнено(ЗаголовокДляChromeLogger) тогда
		Ответ.Заголовки.Вставить("X-ChromeLogger-Data", ЗаголовокДляChromeLogger);				
	конецесли;
	
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ChromeLogger", "ChromeLogger", неопределено);
	
	Ответ.УстановитьТелоИзСтроки(ДанныеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);	
	Возврат Ответ;	
конецфункции

Таким образом, при вызове в коде функции <ОбщийМодуль>.Отладка("Привет infostart.ru!"); в консоли браузера увидим наше сообщение.

 

В процессе реализации у меня возникли следующие вопросы:

1. Где лучше хранить отладочную информацию (функция Отладка), в случае использования расширений конфигурации?

2. Как "красиво" и правильно закодировать строку в unicode escape-последовательности (функция КодироватьВUnicodeEscape) штатными средствами?

3. Можно ли кодировать строку в base64 штатными средствами без временных файлов?

 

Спасибо. Надеюсь, кому-нибудь мой опыт будет полезен.

 

Обновление №1

Спасибо всем за ответы. 

Переписаны функции 
- КодироватьВUTF8ИBase64 
- КодироватьВUnicodeEscape 
- СформироватьChromeLoggerJson 

// Наименование модуля
// ХромЛогер

// Получить данные отладки
//
// Возвращаемое значение:
// Массив
//
функция ПолучитьДанныеОтладки()
	возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ChromeLogger", "ChromeLogger");
конецфункции

// Установить данные отладки
//
// Параметры:
// Значение - Массив
//
процедура УстановитьДанныеОтладки(Значение)
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ChromeLogger", "ChromeLogger", Значение);
конецпроцедуры	

// Удалить все данные отладки
//
процедура УдалитьДанныеОтладки()
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ChromeLogger", "ChromeLogger", неопределено);
конецпроцедуры	

////////////////////////////////////////////////////////
////////////////////////////////////////////////////////

// Добавляет отладочное сообщение
//
// Параметры:
// Данные - Строка, или Объект
// Метка - Строка
// Трассировка - Строка
// Тип - Строка - возможные значения: log, warn, error, info, group, groupEnd, groupCollapsed, table
//
процедура Отладка(Данные, Метка="", Трассировка="", Тип="") экспорт
	ТекущиеДанные = ПолучитьДанныеОтладки();
	
	если НЕ ЗначениеЗаполнено(ТекущиеДанные) тогда
		ТекущиеДанные = новый Массив();
	конецесли;
	
	СтрокаДанные = новый Массив();
	СтрокаДанные.Вставить(0, Данные);
	СтрокаДанные.Вставить(1, Метка);
	СтрокаДанные.Вставить(2, Трассировка);
	СтрокаДанные.Вставить(3, Тип);
	
	ТекущиеДанные.Добавить(СтрокаДанные);
	
	УстановитьДанныеОтладки(ТекущиеДанные);
конецпроцедуры

// Кодирует строку в UTF8, затем в BASE64
//
// Параметры:
// Строка - Строка, которую необходимо закодировать
//
// Возвращаемое значение:
// Строка - строка в BASE64
//
функция КодироватьВUTF8ИBase64(Строка)
	// Совет http://forum.infostart.ru/forum9/topic181969/message1888978/#message1888978
	Поток = Новый ПотокВПамяти;
	
	ЗаписьДанных = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8,,,,ложь);
	ЗаписьДанных.ЗаписатьСимволы(Строка);
	ЗаписьДанных.Закрыть();
	
	ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
	Результат = Base64Строка(ДвоичныеДанные);
	
	возврат Результат;
конецфункции	

// Преобразовывает число в шестнадцатеричное представление
//
// Параметры:
// Значение - Число
//
// Возвращаемое значение:
// Строка - шестнадцатеричное представление
//
функция ЧислоВHex(Значение)
	Результат = "";
	
	Пока Значение > 0 Цикл
		Результат = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Значение%16 + 1, 1) + Результат;
		Значение = Цел(Значение/16) ;
	КонецЦикла;
	
	Возврат Результат;
конецфункции

// Кодирует строку с использованием escape-последовательностей
//
// Параметры:
// Строка - Строка, которую необходимо преобразовать
//
// Возвращаемое значение:
// Строка - преобразованная строка
//
функция КодироватьВUnicodeEscape(Строка) 
	Результат = "";
	для индекс = 1 по СтрДлина(Строка) цикл		
		Символ = Сред(Строка, индекс, 1);
		КодСимвола = КодСимвола(Символ);
		если КодСимвола > 127 тогда
			Символ = "\u" + Прав("0000" + ЧислоВHex(КодСимвола), 4);
		конецесли;
		
		Результат = Результат + Символ;
	конеццикла;	
	
	возврат Результат;
конецфункции	

// Вспомогательная фукнция для ЗаписатьJSON() в СформироватьChromeLoggerJson()
//
Функция ПреобразованиеJSON(Знач Свойство, Значение, ДопПараметры, Отказ) Экспорт
	// Совет http://forum.infostart.ru/forum9/topic181969/message1888986/#message1888986
	ТипЗначения = ТипЗнч(Значение);
	
	Если ТипЗначения = Тип("ТаблицаЗначений") Тогда
		
		мКолонки = Новый Массив;
		
		Для Каждого Колонка ИЗ Значение.Колонки Цикл
			мКолонки.Добавить(Колонка.Имя);
		КонецЦикла;
		
		СтрКолонки = СтрСоединить(мКолонки, ",");
		
		Массив = Новый Массив;
		
		Для Каждого СтрокаТЗ ИЗ Значение Цикл
			Структура = Новый Структура(СтрКолонки);
			ЗаполнитьЗначенияСвойств(Структура, СтрокаТЗ, СтрКолонки);
			Массив.Добавить(Структура);
		КонецЦикла;
		
		Возврат ПерекодироватьВсеСтрокиВМассивеВUnicodeEscape(Массив);
		
	ИначеЕсли ТипЗначения = Тип("Дата") Тогда
		
		Если НачалоДня(Значение) = '00010101' Тогда
			Возврат Формат(Значение, "ДФ=HH:mm:ss");
		Иначе
			Возврат Формат(Значение, "ДФ='dd.MM.yyyy HH:mm:ss'"); //Игнорим настройки системы
		КонецЕсли;
		
	Иначе
		
		возврат КодироватьВUnicodeEscape(Строка(Значение)); // рискнем и преобразуем в строку
		
	КонецЕсли;
	
КонецФункции

// Перекодирует все строки в массиве (рекурсивно)
//
// Параметры:
// МассивЗначений - Массив
//
// Возвращаемое значение:
// Массив - с перекодированными строками
//
функция ПерекодироватьВсеСтрокиВМассивеВUnicodeEscape(МассивЗначений)
	если ЗначениеЗаполнено(МассивЗначений) И МассивЗначений.Количество() > 0  тогда
		для индекс = 0 по МассивЗначений.Количество()-1 цикл
			Элемент = МассивЗначений.Получить(индекс);
			если ТипЗнч(Элемент) = Тип("Строка") тогда
				МассивЗначений.Установить(индекс, КодироватьВUnicodeEscape(элемент));
			иначеесли ТипЗнч(Элемент) = Тип("Массив") тогда
				МассивЗначений.Установить(индекс, ПерекодироватьВсеСтрокиВМассивеВUnicodeEscape(элемент));
			конецесли;
		конеццикла;	
	конецесли;
	
	возврат МассивЗначений;
конецфункции	

// Сформировать json строку для заголовка ChromeLogger'а
// 
// Возвращаемое значение:
// Строка - JSON
//
функция СформироватьChromeLoggerJson()
	ТекущиеДанные = ПолучитьДанныеОтладки();
	
	если НЕ ЗначениеЗаполнено(ТекущиеДанные) ИЛИ ТекущиеДанные.Количество() = 0 тогда
		возврат неопределено;
	конецесли;
	
	Запись = новый ЗаписьJSON();
	Запись.УстановитьСтроку();
	
	Структура = Новый Структура();
	Структура.Вставить("version", "1.0");
	
	Колонки = Новый Массив();
	Колонки.Добавить("label");
	Колонки.Добавить("log");
	Колонки.Добавить("backtrace");
	Колонки.Добавить("type");	
	
	Структура.Вставить("columns", Колонки);		
	Структура.Вставить("rows", ПерекодироватьВсеСтрокиВМассивеВUnicodeEscape(ТекущиеДанные));	
	Структура.Вставить("request_uri", "/");
	
	ЗаписатьJSON(Запись, Структура,,"ПреобразованиеJSON", ХромЛогер);
	
	УдалитьДанныеОтладки();
	
	возврат Запись.Закрыть();		
конецфункции

// Сформировать заголовок X-ChromeLogger-Data
//
// Возвращаемое значение:
// Строка - BASE64
//
функция СформироватьЗаголовокДляChromeLogger() Экспорт
	json = СформироватьChromeLoggerJson();
	
	если НЕ ЗначениеЗаполнено(json) тогда
		возврат неопределено;
	конецесли;	
	
	json = СтрЗаменить(json, "\\u", "\u");
	Результат = КодироватьВUTF8ИBase64(json);	
	Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат, " ", ""), Символы.ПС, ""), Символ(20), ""), Символ(13), "");	
	
	возврат Результат;
конецфункции

Пример использования

функция Ответ(ДанныеJSON) экспорт		
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
	
	ЗаголовокДляChromeLogger = ХромЛогер.СформироватьЗаголовокДляChromeLogger();
	если ЗначениеЗаполнено(ЗаголовокДляChromeLogger) тогда
		Ответ.Заголовки.Вставить("X-ChromeLogger-Data", ЗаголовокДляChromeLogger);
	конецесли;
	
	Ответ.УстановитьТелоИзСтроки(ДанныеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);	
	Возврат Ответ;	
конецфункции

 

ChromeLogger отладка http сервис base64

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    4273    5    0    

11

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

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

60000 руб.

07.05.2019    35813    71    45    

30

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    3284    3    3    

5

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1379    9    2    

11

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19645    24    24    

20

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    5502    5    2    

6

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 1C:Бухгалтерия Управленческий учет Платные (руб)

Решение осуществляет синхронизацию задач Битрикс24 и 1С, что позволяет в одной системе ставить задачи, контролировать выполнение всего пула задач с группировкой по ответственным и проектам, формировать управленческие отчеты по работе сотрудников (загрузка, просроченные задачи), уведомлять сотрудников о ходе выполнения задач посредством чат-бот Telegram

7200 руб.

04.05.2021    21296    14    19    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Bassgood 1461 27.11.17 18:30 Сейчас в теме
Можно ли это сделать "красивее", и желательно по максимум штатными средствами?

РусскиеБуквыСтрокой = "А,Б,В,Г,Д";
РусскиеБуквы = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(РусскиеБуквыСтрокой, ",");

Процедуру разложения строки в массив можете выдернуть из БСП и прописать в ней добавление еще букв нижнего регистра, либо дополнить массив букв уже после его формирования, как то так ;)
3. PerlAmutor 158 27.11.17 18:54 Сейчас в теме
(1) Это можно сделать тоже штатными средствами:
РусскиеБуквыСтрокой = "А,Б,В,Г,Д";
РусскиеБуквы = СтрРазделить(РусскиеБуквыСтрокой,",", Ложь));
4. Bassgood 1461 27.11.17 19:16 Сейчас в теме
(3) Можно и так, но на ранних версих 8.3 и ниже не взлетит - этот метод в платформе еще не был реализован.
6. ArchLord42 83 27.11.17 19:34 Сейчас в теме
(1) у автора 8.3.10 там и СтрРазделить можно юзать уже давно
7. ArchLord42 83 27.11.17 19:35 Сейчас в теме
(6) Пока писал уже написали за меня)
2. PerlAmutor 158 27.11.17 18:52 Сейчас в теме
3. Можно ли кодировать строку в base64 штатными средствами без временных файлов?

Сам не пробовал, но связка из этих двух функций глобального контекста в 8.3.11, вероятно может это сделать:
ПолучитьБуферДвоичныхДанныхИзСтроки
ПолучитьBase64СтрокуИзБуфераДвоичныхДанных
5. PerlAmutor 158 27.11.17 19:21 Сейчас в теме
Для функции "КодироватьВUnicodeEscape" данные я бы поместил либо в текстовый макет, либо в двоичный макет, в формате JSON. Соответственно перед вызовом функции хорошо бы эти данные вытащить и подготовить, а не делать этого на лету. Макет хранить в обработке расширения можно.
В 8.3.11 расширения позволяют перехватить УстановкуПараметровСеанса (на выбор, до или после родного обработчика) и создавать прямо в расширении свои Регистры сведений.
8. ArchLord42 83 27.11.17 19:36 Сейчас в теме
получение base64 строки без временных файлов

ТестоваяСтрока = "<<JSON>>>";
	
Поток = Новый ПотокВПамяти;

ЗаписьДанных = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8,,,,Ложь);
ЗаписьДанных.ЗаписатьСимволы(ТестоваяСтрока);
ЗаписьДанных.Закрыть();

ДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Base64Строка = Base64Строка(ДД);
Показать


Странно, у меня на платформе 8.3.10.2466 вылетает ошибка:
Некорректные символы в заголовке HTTP: [X-ChromeLogger-Data: e31zYWRhc2Rhc2Rhc2Rhc2RzZGZnLC5kZnNiZmRuYmxrbmRzZmxrYm5zc3Nzc3Nz c3Nzc3Nzcw==]

чет не кушает base64
9. ArchLord42 83 27.11.17 19:55 Сейчас в теме
Сколько публикаций не видел по HTTP сервисами, ни разу не видел, чтобы юзали 3,4,5 параметры у функции "ПреобразоватьJSON", а их использование может сэкономить приличное количество строк кода и инкапсулировать все преобразования данных, которая 1Ска не может сделать автоматом, достаточно накидать функцию наподобие этой:

Функция ПреобразованияJSON(Свойство, Значение, ДопПараметры, Отказ) Экспорт
	ТипЗначения = ТипЗнч(Значение);
	
	Если ТипЗначения = Тип("ТаблицаЗначений") Тогда
		
		мКолонки = Новый Массив;
		
		Для Каждого Колонка ИЗ Значение.Колонки Цикл
			мКолонки.Добавить(Колонка.Имя);
		КонецЦикла;
		
		СтрКолонки = СтрСоединить(мКолонки, ",");
		
		Массив = Новый Массив;
		
		Для Каждого СтрокаТЗ ИЗ Значение Цикл
			Структура = Новый Структура(СтрКолонки);
			ЗаполнитьЗначенияСвойств(Структура, СтрКолонки);
			Массив.Добавить(Структура);
		КонецЦикла;
		
		Возврат Массив;
		
	ИначеЕсли ЭтоСсылка(Значение) Тогда
		
		Возврат XMLСтрока(Значение);
		
	ИначеЕсли ТипЗначения = Тип("Дата") Тогда
		
		Если НачалоДня(Значение) = '00010101' Тогда
			Возврат Формат(Значение, "ДФ=HH:mm:ss");
		Иначе
			Возврат Формат(Значение, "ДФ='dd.MM.yyyy HH:mm:ss'"; //Игнорим настройки системы
		КонецЕсли;
		
	Иначе
		
		Отказ = Истина;
		
	КонецЕсли;
	
КонецФункции
Показать


и подставить нужные параметры в функцию ЗаписатьJSON
saddy; MOPC; +2 Ответить
10. MOPC 24 28.11.17 07:38 Сейчас в теме
Большое спасибо всем за советы.

Добавил обновление!
11. Dementor 1051 29.11.17 20:38 Сейчас в теме
А можете привести пример использования такой доработки?

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

В вашем решении много кода и установка стороннего расширения в браузере. В чем же преимущества? Да и многопользовательская одновременная работа не очень продумана - под одним пользователем с долгой операцией логи накопятся, а другой клиент с быстрым запросом их прочитает и обнулит для первого пользователя.
12. MOPC 24 30.11.17 02:28 Сейчас в теме
(11) Да, совершенно верно. Можно использовать штатную отладку.
Это все лишь еще один из способов...

А пример использования - только на этапе разработки и если вы работаете в паре с веб-разработчиком, который знает, допустим только javascript/angular, и ему (разработчику) нужна какая то доп.информация.
Dementor; +1 Ответить
13. Dementor 1051 30.11.17 12:35 Сейчас в теме
(12) О, про работу в паре с веб-мастером, у которого нет доступа к серверу 1С, я как-то не подумал.
Оставьте свое сообщение