feat: Поддержка переменных bash/shel

This commit is contained in:
Dmitry Ivanov
2025-07-08 23:30:06 +03:00
parent e221f00357
commit 5688f12138
20 changed files with 995 additions and 434 deletions
+10 -5
View File
@@ -1,6 +1,11 @@
# OneScript
out/
oscript_modules/
coverage/
*.ospx
# VS Code
.vscode/
# Mac
**/.DS_Store
.vscode/*
coverage/*
out/*
oscript_modules/*
*.ospx
+6 -6
View File
@@ -15,12 +15,12 @@
.ВключитьФайл("README.md")
.ВключитьФайл("LICENSE")
.ВключитьФайл("NOTICES")
.ЗависитОт("tokenizer")
.ЗависитОт("logos")
.ЗависитОт("winow", "0.8.5")
.ЗависитОт("autumn-cli", "1.0.6")
.ЗависитОт("coloratos")
.ЗависитОт("i18n")
.ЗависитОт("tokenizer", "1.0.2")
.ЗависитОт("logos", "1.7.1")
.ЗависитОт("winow", "0.9.5")
.ЗависитОт("autumn-cli", "1.2.0")
.ЗависитОт("coloratos", "0.3.0")
.ЗависитОт("i18n", "1.0.0")
.РазработкаЗависитОт("1bdd")
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("asserts")
@@ -50,7 +50,7 @@
ОписаниеЗапроса = Описание;
ИсходящиеОшибки = Ошибки;
Конструктор = Новый КонструкторПрограммногоКода();
Конструктор = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
ПрочитанныеФайлы.Очистить();
ПакетРесурсов = МенеджерРесурсовЛокализации.ПолучитьПакеты(
@@ -59,6 +59,7 @@
);
ОпределитьМетодУстановкиТелаЗапроса();
ДобавитьПеременные();
ДобавитьЧтениеФайлов();
ДобавитьДанныеЗапроса();
ДобавитьРазделительДанныхMultipart();
@@ -197,6 +198,18 @@
КонецПроцедуры
Процедура ДобавитьПеременные()
Код = Новый ГенераторКодаИменаПеременных(ОписаниеЗапроса).Получить();
Если Не ПустаяСтрока(Код) Тогда
Конструктор
.ДобавитьПустуюСтроку()
.ДобавитьСтроку(Код);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьРазделительДанныхMultipart()
Если Не ОписаниеЗапроса.ОтправлятьКакMultipartFormData Тогда
@@ -216,7 +229,7 @@
ИнициализированыЗаголовки = Ложь;
ЛокальныйКонструктор = Новый КонструкторПрограммногоКода();
ЛокальныйКонструктор = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
Для Каждого Заголовок Из ОписаниеЗапроса.Заголовки Цикл
@@ -298,7 +311,7 @@
КонецЦикла;
Код = ЛокальныйГенераторКода.ЧтениеТекстовыхФайлов(ФайлыДляЧтения, ПрочитанныеФайлы);
Код = Новый ГенераторКодаЧтениеТекстовыхФайлов(ОписаниеЗапроса, ФайлыДляЧтения, ПрочитанныеФайлы).Получить();
Если Не ПустаяСтрока(Код) Тогда
Конструктор
@@ -315,11 +328,11 @@
КонецЕсли;
ТелоЗапросаСтрока = "";
ТелоЗапроса = ЛокальныйГенераторКода.ДанныеЗапроса(
НазначенияПередаваемыхДанных.ТелоЗапроса,
ОписаниеЗапроса.ОтправляемыеТекстовыеДанные,
ТелоЗапроса = Новый ГенераторКодаДанныеЗапроса(
ОписаниеЗапроса,
НазначенияПередаваемыхДанных.ТелоЗапроса,
ПрочитанныеФайлы
);
).Получить();
Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
@@ -424,7 +437,7 @@
Конструктор
.ДобавитьПустуюСтроку()
.ДобавитьСтроку(ЛокальныйГенераторКода.ИнтернетПрокси(ОписаниеЗапроса, ИмяПараметраПрокси));
.ДобавитьСтроку(Новый ГенераторКодаИнтернетПрокси(ОписаниеЗапроса, ИмяПараметраПрокси).Получить());
КонецПроцедуры
@@ -562,11 +575,12 @@
ПараметрыФункции = Новый Массив;
АдресРесурсаКод = ЛокальныйГенераторКода.АдресРесурса(
АдресРесурсаКод = Новый ГенераторКодаАдресРесурса(
ОписаниеЗапроса,
СтруктураURL,
ОписаниеЗапроса.ОтправляемыеТекстовыеДанные,
ПрочитанныеФайлы
);
).Получить();
Если ПустаяСтрока(АдресРесурсаКод) Тогда
@@ -705,7 +719,7 @@
Возврат;
КонецЕсли;
КонструкторЗаписиДанных = Новый КонструкторПрограммногоКода();
КонструкторЗаписиДанных = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
ДобавитьДанныеФормыВЗаписьДанныхMultipart(КонструкторЗаписиДанных);
ДобавитьДанныеФормыИзФайловВЗаписьДанныхMultipart(КонструкторЗаписиДанных);
@@ -46,7 +46,7 @@
ОписаниеЗапроса = Описание;
ИсходящиеОшибки = Ошибки;
Конструктор = Новый КонструкторПрограммногоКода();
Конструктор = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
Состояние = НовоеСостояние();
ПрочитанныеФайлы.Очистить();
@@ -55,6 +55,7 @@
КодЛокализации
);
ДобавитьПеременные();
ДобавитьЧтениеФайлов();
ДобавитьДанныеЗапроса();
ДобавитьФайлы();
@@ -186,6 +187,18 @@
КонецПроцедуры
Процедура ДобавитьПеременные()
Код = Новый ГенераторКодаИменаПеременных(ОписаниеЗапроса).Получить();
Если Не ПустаяСтрока(Код) Тогда
Конструктор
.ДобавитьПустуюСтроку()
.ДобавитьСтроку(Код);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьЗаголовки()
Заголовки = ПередаваемыеЗаголовки();
@@ -234,7 +247,7 @@
КонецЦикла;
Код = ЛокальныйГенераторКода.ЧтениеТекстовыхФайлов(ФайлыДляЧтения, ПрочитанныеФайлы);
Код = Новый ГенераторКодаЧтениеТекстовыхФайлов(ОписаниеЗапроса, ФайлыДляЧтения, ПрочитанныеФайлы).Получить();
Если Не ПустаяСтрока(Код) Тогда
Конструктор
@@ -287,7 +300,7 @@
Процедура ДобавитьДанныеЗапросаЧерезСоответствие(Назначение, ИмяПараметра, РезультатСборка = "")
КонструкторДанных = Новый КонструкторПрограммногоКода();
КонструкторДанных = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
ДобавитьДанныеЗапросаИзТекстовыхДанныхЧерезСоответствие(КонструкторДанных, Назначение, ИмяПараметра);
ДобавитьДанныеЗапросаИзПрочитанныхФайловЧерезСоответствие(КонструкторДанных, Назначение, ИмяПараметра);
@@ -415,11 +428,11 @@
Процедура ДобавитьТекстовыеДанныеЗапросаЧерезСтроку(НазначениеДанных, ИмяПараметра, РезультатСборка)
Сборка = ЛокальныйГенераторКода.ДанныеЗапроса(
НазначениеДанных,
ОписаниеЗапроса.ОтправляемыеТекстовыеДанные,
Сборка = Новый ГенераторКодаДанныеЗапроса(
ОписаниеЗапроса,
НазначениеДанных,
ПрочитанныеФайлы
);
).Получить();
Если Не ЗначениеЗаполнено(Сборка) Тогда
Возврат;
@@ -471,7 +484,7 @@
КонецЕсли;
Назначение = НазначенияПередаваемыхДанных.ТелоЗапроса;
КонструкторФайлов = Новый КонструкторПрограммногоКода();
КонструкторФайлов = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
Для Каждого ПередаваемыйФайл Из ОписаниеЗапроса.Файлы Цикл
@@ -713,7 +726,7 @@
Конструктор
.ДобавитьПустуюСтроку()
.ДобавитьСтроку(ЛокальныйГенераторКода.ИнтернетПрокси(ОписаниеЗапроса, ИмяПараметраПрокси));
.ДобавитьСтроку(Новый ГенераторКодаИнтернетПрокси(ОписаниеЗапроса, ИмяПараметраПрокси).Получить());
КонецПроцедуры
@@ -827,15 +840,16 @@
Если Состояние.ПереданаСтрокаЗапроса
И ВозможнаПередачаДанныхЧерезСоответствие(НазначениеДанных) Тогда
URLСборка = ЛокальныйГенераторКода.URL(СтруктураURL);
URLСборка = Новый ГенераторКодаURL(ОписаниеЗапроса, СтруктураURL).Получить();
Иначе
URLСборка = ЛокальныйГенераторКода.URL(
URLСборка = Новый ГенераторКодаURL(
ОписаниеЗапроса,
СтруктураURL,
ОписаниеЗапроса.ОтправляемыеТекстовыеДанные,
ПрочитанныеФайлы
);
).Получить();
КонецЕсли;
@@ -855,7 +869,7 @@
Состояние.ЕстьДополнительныеПараметры = Ложь;
КонструкторДопПараметров = Новый КонструкторПрограммногоКода();
КонструкторДопПараметров = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
ДобавитьЗаголовкиВДополнительныеПараметры(КонструкторДопПараметров);
ДобавитьАутентификациюВДополнительныеПараметры(КонструкторДопПараметров);
@@ -48,10 +48,13 @@
Если ТипЗнч(КоманднаяСтрока) = Тип("Массив") Тогда
АргументыКоманд = Новый Массив();
ИменаПеременных = Новый Массив();
АргументыКоманд.Добавить(КоманднаяСтрока);
Иначе
Парсер = Новый ПарсерКонсольнойКоманды();
АргументыКоманд = Парсер.Распарсить(КоманднаяСтрока);
РезультатПарсинга = Парсер.Распарсить(КоманднаяСтрока);
АргументыКоманд = РезультатПарсинга.АргументыКоманд;
ИменаПеременных = РезультатПарсинга.ИменаПеременных;
КонецЕсли;
Если АргументыКоманд.Количество() = 0 Тогда
@@ -66,6 +69,7 @@
НомерКоманды = НомерКоманды + 1;
ОписаниеЗапроса = Новый ОписаниеЗапроса();
ОписаниеЗапроса.ИменаПеременных = ИменаПеременных;
ОбработатьАргументыКоманды(АргументыКоманды, НомерКоманды, КоличествоКоманд);
@@ -1794,7 +1798,7 @@
КонецФункции
// Используется для отключения вывода справки cli
Процедура Заглушка(Значение = Неопределено) Экспорт
Процедура Заглушка(Значение = Неопределено) Экспорт // BSLLS:MissingParameterDescription-off
КонецПроцедуры
@@ -0,0 +1,68 @@
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Перем _СтруктураURL; // ПарсерURL
Перем _ТекстовыеДанные; // Массив из ПередаваемыйТекст
Перем _ПрочитанныеФайлы; // Массив из Структура:
// - ПередаваемыйФайл - см. ПередаваемыйФайл
// - ИмяПеременной - Строка
Перем _Конструктор; // КонструкторПрограммногоКода
Процедура ПриСозданииОбъекта(
ОписаниеЗапроса,
СтруктураURL,
ТекстовыеДанные = Неопределено,
ПрочитанныеФайлы = Неопределено
)
_ОписаниеЗапроса = ОписаниеЗапроса;
_СтруктураURL = СтруктураURL;
_ТекстовыеДанные = ТекстовыеДанные;
_ПрочитанныеФайлы = ПрочитанныеФайлы;
_Конструктор = Новый КонструкторПрограммногоКода(ОписаниеЗапроса.ИменаПеременных);
КонецПроцедуры
Функция Получить() Экспорт
// Схема
URL = СтрШаблон("%1://", _СтруктураURL.Схема);
// Аутентификация
Пользователь = _СтруктураURL.Аутентификация.Пользователь;
Пароль = _СтруктураURL.Аутентификация.Пароль;
Если Не ПустаяСтрока(Пользователь) Или Не ПустаяСтрока(Пароль) Тогда
URL = URL + СтрШаблон("%1:%2@", Пользователь, Пароль);
КонецЕсли;
// Сервер
URL = URL + _СтруктураURL.Сервер;
// Порт
Если ЗначениеЗаполнено(_СтруктураURL.Порт) Тогда
URL = URL + ":" + Формат(_СтруктураURL.Порт, "ЧГ=");
КонецЕсли;
URL = _Конструктор.ПараметрВСтроку(URL);
// Адрес ресурса
АдресРесурса = Новый ГенераторКодаАдресРесурса(
_ОписаниеЗапроса,
_СтруктураURL,
_ТекстовыеДанные,
_ПрочитанныеФайлы
).Получить();
Если ПустаяСтрока(АдресРесурса) Тогда
Возврат URL;
КонецЕсли;
Кавычка = """";
Если СтрЗаканчиваетсяНа(URL, Кавычка) И СтрНачинаетсяС(АдресРесурса, Кавычка) Тогда
URL = Сред(URL, 1, СтрДлина(URL) - 1) + Сред(АдресРесурса, 2);
Иначе
URL = СтрШаблон("%1 + %2", URL, АдресРесурса);
КонецЕсли;
Возврат URL;
КонецФункции
@@ -0,0 +1,212 @@
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Перем _СтруктураURL; // ПарсерURL
Перем _ТекстовыеДанные; // Массив из ПередаваемыйТекст
Перем _ПрочитанныеФайлы; // Массив из Структура:
// - ПередаваемыйФайл - см. ПередаваемыйФайл
// - ИмяПеременной - Строка
Перем _Конструктор; // КонструкторПрограммногоКода
Перем _РазделительПараметров; // Строка
Перем _КонкатенацияСПереносомСтрокиИРазделителем; // Строка
Перем _КонкатенацияСПереносомСтроки; // Строка
Процедура ПриСозданииОбъекта(
ОписаниеЗапроса,
СтруктураURL,
ТекстовыеДанные = Неопределено,
ПрочитанныеФайлы = Неопределено
)
_ОписаниеЗапроса = ОписаниеЗапроса;
_СтруктураURL = СтруктураURL;
_ТекстовыеДанные = ТекстовыеДанные;
_ПрочитанныеФайлы = ПрочитанныеФайлы;
_Конструктор = Новый КонструкторПрограммногоКода(_ОписаниеЗапроса.ИменаПеременных);
_РазделительПараметров = "&";
_КонкатенацияСПереносомСтрокиИРазделителем = "
| + ""%1"" + ";
_КонкатенацияСПереносомСтроки = "
| + ";
КонецПроцедуры
#Область ПрограммныйИнтерфейс
Функция Получить() Экспорт
ПараметрыЗапросаСтрокой = ПараметрыЗапросаСтрокой();
ПараметрыЗапросаИзФайловСтрокой = ПараметрыЗапросаИзФайловСтрокой();
ЕстьПараметрыЗапроса = Не ПустаяСтрока(ПараметрыЗапросаСтрокой) Или Не ПустаяСтрока(ПараметрыЗапросаИзФайловСтрокой);
Адрес = _СтруктураURL.Путь + ?(ЕстьПараметрыЗапроса, "?", "") + ПараметрыЗапросаСтрокой;
Фрагмент = ?(Не ПустаяСтрока(_СтруктураURL.Фрагмент), "#" + _СтруктураURL.Фрагмент, "");
Если ПустаяСтрока(ПараметрыЗапросаИзФайловСтрокой) Тогда
Возврат АдресРесурсаБезПараметровИзФайла(Адрес, Фрагмент);
Иначе
Возврат АдресРесурсаСПараметрамиИзФайла(Адрес, Фрагмент, ПараметрыЗапросаСтрокой, ПараметрыЗапросаИзФайловСтрокой);
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция АдресРесурсаБезПараметровИзФайла(Адрес, Фрагмент)
Результат = Адрес + Фрагмент;
Если ЗначениеЗаполнено(Результат) Тогда
Результат = _Конструктор.ПараметрВСтроку(Результат);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция АдресРесурсаСПараметрамиИзФайла(Адрес, Фрагмент, ПараметрыЗапросаСтрокой, ПараметрыЗапросаИзФайловСтрокой)
ВозможноОднойСтрокой = ПустаяСтрока(Фрагмент) И СтрЧислоСтрок(ПараметрыЗапросаИзФайловСтрокой) = 1;
Если ВозможноОднойСтрокой Тогда
Возврат АдресРесурсаСПараметрамиИзФайлаОднострочный(Адрес, ПараметрыЗапросаСтрокой, ПараметрыЗапросаИзФайловСтрокой);
Иначе
Возврат АдресРесурсаСПараметрамиИзФайлаМногострочный(
Адрес,
Фрагмент,
ПараметрыЗапросаСтрокой,
ПараметрыЗапросаИзФайловСтрокой
);
КонецЕсли;
КонецФункции
Функция АдресРесурсаСПараметрамиИзФайлаОднострочный(Адрес, ПараметрыЗапросаСтрокой, ПараметрыЗапросаИзФайловСтрокой)
Возврат ""
+ _Конструктор.ПараметрВСтроку(Адрес + ?(ПустаяСтрока(ПараметрыЗапросаСтрокой), "", _РазделительПараметров))
+ " + "
+ ПараметрыЗапросаИзФайловСтрокой;
КонецФункции
Функция АдресРесурсаСПараметрамиИзФайлаМногострочный(
Адрес,
Фрагмент,
ПараметрыЗапросаСтрокой,
ПараметрыЗапросаИзФайловСтрокой)
Результат = _Конструктор.ПараметрВСтроку(Адрес);
Если ПустаяСтрока(ПараметрыЗапросаСтрокой) Тогда
Результат = Результат
+ _КонкатенацияСПереносомСтроки
+ ПараметрыЗапросаИзФайловСтрокой;
ИначеЕсли Лев(ПараметрыЗапросаИзФайловСтрокой, 1) = """" Тогда
Результат = Результат
+ _КонкатенацияСПереносомСтроки
+ """" + _РазделительПараметров
+ Сред(ПараметрыЗапросаИзФайловСтрокой, 2);
Иначе
Результат = Результат
+ СтрШаблон(_КонкатенацияСПереносомСтрокиИРазделителем, _РазделительПараметров)
+ ПараметрыЗапросаИзФайловСтрокой;
КонецЕсли;
Если Не ПустаяСтрока(Фрагмент) Тогда
Результат = Результат
+ _КонкатенацияСПереносомСтроки
+ _Конструктор.ПараметрВСтроку(Фрагмент);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПараметрыЗапросаСтрокой()
ПараметрыЗапроса = Новый Массив();
Для Каждого Параметр Из _СтруктураURL.ПараметрыЗапроса Цикл
Если ЗначениеЗаполнено(Параметр.Значение) Тогда
КлючИЗначение = СтрШаблон("%1=%2",
КодироватьСтроку(Параметр.Ключ, СпособКодированияСтроки.КодировкаURL),
КодироватьСтроку(Параметр.Значение, СпособКодированияСтроки.КодировкаURL));
Иначе
КлючИЗначение = КодироватьСтроку(Параметр.Ключ, СпособКодированияСтроки.КодировкаURL);
КонецЕсли;
ПараметрыЗапроса.Добавить(КлючИЗначение);
КонецЦикла;
ДополнитьПараметрыЗапроса(ПараметрыЗапроса);
Возврат СтрСоединить(ПараметрыЗапроса);
КонецФункции
Процедура ДополнитьПараметрыЗапроса(ПараметрыЗапроса)
Если _ТекстовыеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого ПередаваемыйТекст Из _ТекстовыеДанные Цикл
Если ПередаваемыйТекст.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса Тогда
Если ПараметрыЗапроса.Количество() И Не ПустаяСтрока(ПередаваемыйТекст.РазделительТелаЗапроса) Тогда
ПараметрыЗапроса.Добавить(ПередаваемыйТекст.РазделительТелаЗапроса);
КонецЕсли;
ПараметрыЗапроса.Добавить(ПередаваемыйТекст.ПолноеЗначение());
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПараметрыЗапросаИзФайловСтрокой()
ПараметрыЗапросаИзФайловСтрокой = "";
Если _ПрочитанныеФайлы = Неопределено Тогда
Возврат ПараметрыЗапросаИзФайловСтрокой;
КонецЕсли;
Для Каждого ПрочитанныйФайл Из _ПрочитанныеФайлы Цикл
ПередаваемыйФайл = ПрочитанныйФайл.ПередаваемыйФайл;
Если ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса Тогда
Если ЗначениеЗаполнено(ПередаваемыйФайл.ИмяПоля) Тогда
Префикс = ПередаваемыйФайл.ИмяПоля + "=";
ПрефиксВКоде = _Конструктор.ПараметрВСтроку(Префикс) + " + ";
Иначе
Префикс = "";
ПрефиксВКоде = "";
КонецЕсли;
ИмяПеременной = ПрочитанныйФайл.ИмяПеременной;
Если ПараметрыЗапросаИзФайловСтрокой = "" Тогда
ПараметрыЗапросаИзФайловСтрокой = ПрефиксВКоде + ИмяПеременной;
Иначе
ПараметрыЗапросаИзФайловСтрокой = ПараметрыЗапросаИзФайловСтрокой
+ СтрШаблон(_КонкатенацияСПереносомСтрокиИРазделителем, _РазделительПараметров + Префикс)
+ ИмяПеременной;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ПараметрыЗапросаИзФайловСтрокой;
КонецФункции
#КонецОбласти
@@ -0,0 +1,119 @@
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Перем _НазначениеДанных; // см. НазначенияПередаваемыхДанных
Перем _ПрочитанныеФайлы; // Массив из Структура:
// - ПередаваемыйФайл - см. ПередаваемыйФайл
// - ИмяПеременной - Строка
Перем _Конструктор; // КонструкторПрограммногоКода
Перем _ЧастиКода; // Масств из Строка
Перем _НуженРазделитель; // Булево
Процедура ПриСозданииОбъекта(ОписаниеЗапроса, НазначениеДанных, ПрочитанныеФайлы)
_ОписаниеЗапроса = ОписаниеЗапроса;
_НазначениеДанных = НазначениеДанных;
_ПрочитанныеФайлы = ПрочитанныеФайлы;
_Конструктор = Новый КонструкторПрограммногоКода(_ОписаниеЗапроса.ИменаПеременных);
КонецПроцедуры
#Область ПрограммныйИнтерфейс
Функция Получить() Экспорт
_ЧастиКода = Новый Массив();
_НуженРазделитель = Ложь;
ДобавитьТекстовыеДанные();
ДобавитьФайлы();
Возврат СтрСоединить(_ЧастиКода);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДобавитьТекстовыеДанные()
МассивТекстовыхДанных = Новый Массив();
Для Каждого ПередаваемыйТекст Из _ОписаниеЗапроса.ОтправляемыеТекстовыеДанные Цикл
Если Не ПередаваемыйТекст.Назначение = _НазначениеДанных Тогда
Продолжить;
КонецЕсли;
Разделитель = ПередаваемыйТекст.РазделительТелаЗапроса;
Если _НуженРазделитель И Не ПустаяСтрока(Разделитель) Тогда
МассивТекстовыхДанных.Добавить(Разделитель);
КонецЕсли;
МассивТекстовыхДанных.Добавить(ПередаваемыйТекст.ПолноеЗначение());
_НуженРазделитель = Истина;
КонецЦикла;
Если МассивТекстовыхДанных.Количество() Тогда
_ЧастиКода.Добавить(_Конструктор.ПараметрВСтроку(СтрСоединить(МассивТекстовыхДанных)));
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьФайлы()
КонкатенацияСПереносомСтрокиИРазделителя = "
| + ""%1"" + %2";
КонкатенацияСПереносомСтроки = "
| + %1";
Для Каждого ПрочитанныйФайл Из _ПрочитанныеФайлы Цикл
ПередаваемыйФайл = ПрочитанныйФайл.ПередаваемыйФайл;
Если Не ПередаваемыйФайл.Назначение = _НазначениеДанных Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(ПередаваемыйФайл.ИмяПоля) Тогда
Префикс = ПередаваемыйФайл.ИмяПоля + "=";
ПрефиксВКоде = _Конструктор.ПараметрВСтроку(Префикс) + " + ";
Иначе
Префикс = "";
ПрефиксВКоде = "";
КонецЕсли;
ИмяПеременной = ПрочитанныйФайл.ИмяПеременной;
Разделитель = ПередаваемыйФайл.РазделительТелаЗапроса;
Если _НуженРазделитель Тогда
Если Не ПустаяСтрока(Разделитель) Тогда
Текст = СтрШаблон(КонкатенацияСПереносомСтрокиИРазделителя,
ПередаваемыйФайл.РазделительТелаЗапроса + Префикс,
ИмяПеременной);
_ЧастиКода.Добавить(Текст);
Иначе
Текст = СтрШаблон(КонкатенацияСПереносомСтроки, ПрефиксВКоде + ИмяПеременной);
_ЧастиКода.Добавить(Текст);
КонецЕсли;
Иначе
_ЧастиКода.Добавить(ПрефиксВКоде + ИмяПеременной);
КонецЕсли;
_НуженРазделитель = Истина;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
@@ -0,0 +1,21 @@
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Процедура ПриСозданииОбъекта(ОписаниеЗапроса)
_ОписаниеЗапроса = ОписаниеЗапроса;
КонецПроцедуры
Функция Получить() Экспорт
Если _ОписаниеЗапроса.ИменаПеременных.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
Конструктор = Новый КонструкторПрограммногоКода();
Для Каждого Имя Из _ОписаниеЗапроса.ИменаПеременных Цикл
Конструктор.ДобавитьСтроку("%1 = """";", Имя);
КонецЦикла;
Возврат Конструктор.ПолучитьРезультат();
КонецФункции
@@ -0,0 +1,32 @@
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Перем _ИмяПараметра; // Строка
Процедура ПриСозданииОбъекта(ОписаниеЗапроса, ИмяПараметра)
_ОписаниеЗапроса = ОписаниеЗапроса;
_ИмяПараметра = ИмяПараметра;
КонецПроцедуры
Функция Получить() Экспорт
Конструктор = Новый КонструкторПрограммногоКода(_ОписаниеЗапроса.ИменаПеременных);
ИспользоватьАутентификациюОС = _ОписаниеЗапроса.ТипАутентификацииПрокси = ТипыАутентификации.NTLM;
ПараметрыФункции = Новый Массив;
ПараметрыФункции.Добавить(Конструктор.ПараметрВСтроку(_ОписаниеЗапроса.ПроксиПротокол));
ПараметрыФункции.Добавить(Конструктор.ПараметрВСтроку(_ОписаниеЗапроса.ПроксиСервер));
ПараметрыФункции.Добавить(Конструктор.НеобязательныйПараметрВСтроку(_ОписаниеЗапроса.ПроксиПорт));
ПараметрыФункции.Добавить(Конструктор.НеобязательныйПараметрВСтроку(_ОписаниеЗапроса.ПроксиПользователь));
ПараметрыФункции.Добавить(Конструктор.НеобязательныйПараметрВСтроку(_ОписаниеЗапроса.ПроксиПароль));
ПараметрыФункции.Добавить(?(ИспользоватьАутентификациюОС, "", "Ложь")); // Значение по умолчанию Истина
Конструктор
.ДобавитьСтроку("%1 = Новый ИнтернетПрокси();", _ИмяПараметра)
.ДобавитьСтроку("%1.Установить(%2);",
_ИмяПараметра,
Конструктор.ПараметрыФункцииВСтроку(ПараметрыФункции)
);
Возврат Конструктор.ПолучитьРезультат();
КонецФункции
@@ -0,0 +1,62 @@
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Перем _Файлы; // Массив из ПередаваемыйФайл
Перем _ПрочитанныеФайлы; // Массив из Структура:
// - ПередаваемыйФайл - см. ПередаваемыйФайл
// - ИмяПеременной - Строка
Процедура ПриСозданииОбъекта(ОписаниеЗапроса, Файлы, ПрочитанныеФайлы)
_ОписаниеЗапроса = ОписаниеЗапроса;
_Файлы = Файлы;
_ПрочитанныеФайлы = ПрочитанныеФайлы;
КонецПроцедуры
Функция Получить() Экспорт
Конструктор = Новый КонструкторПрограммногоКода(_ОписаниеЗапроса.ИменаПеременных);
НомерФайла = 1;
Для Каждого ПередаваемыйФайл Из _Файлы Цикл
Если Не (ПередаваемыйФайл.ПрочитатьСодержимое
Или ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса) Тогда
Продолжить;
КонецЕсли;
Если НомерФайла > 1 Тогда
Конструктор.ДобавитьПустуюСтроку();
КонецЕсли;
Шаблон = "ЧтениеТекста = Новый ЧтениеТекста(%2);
|%1 = ЧтениеТекста.Прочитать();";
Если ПередаваемыйФайл.УдалятьПереносыСтрок Тогда
Шаблон = Шаблон + "
|%1 = СтрЗаменить(%1, Символы.ПС, """");
|%1 = СтрЗаменить(%1, Символы.ВК, """");";
КонецЕсли;
Если ПередаваемыйФайл.КодироватьСодержимое Тогда
Шаблон = Шаблон + "
|%1 = КодироватьСтроку(%1, СпособКодированияСтроки.КодировкаURL);";
КонецЕсли;
ИмяПеременной = "{t(Переменная.ТекстовыеДанныеФайла)}_" + Формат(НомерФайла, "ЧГ=");
Конструктор.ДобавитьСтроку(Шаблон,
ИмяПеременной,
Конструктор.ПараметрВСтроку(ПередаваемыйФайл.ПолноеИмяФайла)
);
ПрочитанныйФайл = Новый Структура();
ПрочитанныйФайл.Вставить("ПередаваемыйФайл", ПередаваемыйФайл);
ПрочитанныйФайл.Вставить("ИмяПеременной", ИмяПеременной);
_ПрочитанныеФайлы.Добавить(ПрочитанныйФайл);
НомерФайла = НомерФайла + 1;
КонецЦикла;
Возврат Конструктор.ПолучитьРезультат();
КонецФункции
@@ -1,25 +1,34 @@
Перем Результат; // Массив из Строка
Перем _Результат; // Массив из Строка
Перем _ИменаПеременных; // Соответствие
Перем _РегулярноеВыражениеПараметра; // РегулярноеПриложение
#Область ПрограммныйИнтерфейс
Функция ПолучитьРезультат() Экспорт
Возврат СокрЛП(СтрСоединить(Результат));
Возврат СокрЛП(СтрСоединить(_Результат));
КонецФункции
Функция Пустой() Экспорт
Возврат Результат.Количество() = 0;
Возврат _Результат.Количество() = 0;
КонецФункции
Функция Очистить() Экспорт
Результат.Очистить();
_Результат.Очистить();
Возврат ЭтотОбъект;
КонецФункции
Функция ДобавитьСтроку(Строка,
Значение1 = Неопределено, Значение2 = Неопределено, Значение3 = Неопределено) Экспорт
Результат.Добавить(Символы.ПС);
Результат.Добавить(СтрШаблон(Строка, Значение1, Значение2, Значение3));
ОбработаннаяСтрока = СтрШаблон(
Строка,
ОбработатьПараметрыВСтроке(Значение1),
ОбработатьПараметрыВСтроке(Значение2),
ОбработатьПараметрыВСтроке(Значение3)
);
_Результат.Добавить(Символы.ПС);
_Результат.Добавить(ОбработаннаяСтрока);
Возврат ЭтотОбъект;
@@ -34,11 +43,11 @@
Функция ДобавитьПустуюСтроку(ТолькоПриОтсутствии = Истина) Экспорт
ИндексПоследнего = Результат.ВГраница();
ИндексПоследнего = _Результат.ВГраница();
Если ИндексПоследнего >= 0 И Не Результат[ИндексПоследнего] = Символы.ПС
Если ИндексПоследнего >= 0 И Не _Результат[ИндексПоследнего] = Символы.ПС
Или Не ТолькоПриОтсутствии Тогда
Результат.Добавить(Символы.ПС);
_Результат.Добавить(Символы.ПС);
КонецЕсли;
Возврат ЭтотОбъект;
@@ -48,10 +57,10 @@
Функция ПараметрыФункцииВСтроку(ПараметрыФункции) Экспорт
ПараметрыСтрокой = "";
МаксимальнаяДлинаВсехПараметровНаОднойСтроке = 110;
МаксимальнаяДлинаВсехПараметровВОднойСтроке = 110;
ДлинаПараметров = СтрДлина(СтрСоединить(ПараметрыФункции, ", ")) ;
ПереноситьКаждыйПараметр = ДлинаПараметров > МаксимальнаяДлинаВсехПараметровНаОднойСтроке;
ПереноситьКаждыйПараметр = ДлинаПараметров > МаксимальнаяДлинаВсехПараметровВОднойСтроке;
Если ПереноситьКаждыйПараметр Тогда
Разделитель = "," + Символы.ПС + Символы.Таб;
@@ -89,7 +98,11 @@
Тип = ТипЗнч(Значение);
Если Тип = Тип("Строка") Тогда
Возврат СтрШаблон("""%1""", ЭкранироватьКавычки(Значение));
Результат = ЭкранироватьКавычки(Значение);
Результат = СтрШаблон("""%1""", Результат);
Результат = ОбработатьПараметрыВСтроке(Результат);
Возврат Результат;
ИначеЕсли Тип = Тип("Число") Тогда
@@ -231,8 +244,27 @@
#Область СлужебныеПроцедурыИФункции
Процедура ПриСозданииОбъекта()
Результат = Новый Массив();
Процедура ПриСозданииОбъекта(ИменаПеременных = Неопределено)
_Результат = Новый Массив();
_РегулярноеВыражениеПараметра = Новый РегулярноеВыражение("(?:\$|%24)ENV_([a-zA-Z_][a-zA-Z0-9_]*)");
ИнициализироватьИменаПеременных(ИменаПеременных);
КонецПроцедуры
Процедура ИнициализироватьИменаПеременных(ИменаПеременных)
_ИменаПеременных = Новый Соответствие();
Если ИменаПеременных = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого Имя Из ИменаПеременных Цикл
_ИменаПеременных[Имя] = Истина;
КонецЦикла;
КонецПроцедуры
Функция ЭкранироватьКавычки(Знач Строка)
@@ -241,4 +273,87 @@
Возврат Строка;
КонецФункции
Функция ОбработатьПараметрыВСтроке(Строка)
Если _ИменаПеременных.Количество() = 0
Или Не СтрНайти(Строка, "ENV_") Тогда
Возврат Строка;
КонецЕсли;
Результат = Новый Массив();
Кавычка = """";
ЕстьКавычкаВНачале = СтрНачинаетсяС(Строка, Кавычка);
ЕстьКавычкаВКонце = СтрЗаканчиваетсяНа(Строка, Кавычка);
Если ЕстьКавычкаВНачале И ЕстьКавычкаВКонце Тогда
РабочаяСтрока = Сред(Строка, 2, СтрДлина(Строка) - 2);
ИначеЕсли ЕстьКавычкаВНачале Тогда
РабочаяСтрока = Сред(Строка, 2);
ИначеЕсли ЕстьКавычкаВКонце Тогда
РабочаяСтрока = Сред(Строка, 1, СтрДлина(Строка) - 1);
Иначе
РабочаяСтрока = Строка;
КонецЕсли;
КоллекцияСовпадений = _РегулярноеВыражениеПараметра.НайтиСовпадения(РабочаяСтрока);
Если КоллекцияСовпадений.Количество() = 0 Тогда
Возврат Строка;
КонецЕсли;
ДлинаСтроки = СтрДлина(РабочаяСтрока);
ПредыдущийИндекс = 0;
ПеременнаяВНачале = Ложь;
ПеременнаяВКонце = Ложь;
Для Каждого Совпадение Из КоллекцияСовпадений Цикл
Имя = Совпадение.Группы[1].Значение;
Если _ИменаПеременных[Имя] = Неопределено Тогда
Продолжить;
КонецЕсли;
ВНачале = Совпадение.Индекс = 0;
ВКонце = Совпадение.Индекс + Совпадение.Длина = ДлинаСтроки;
СледомЗаПредыдущми = Совпадение.Индекс = ПредыдущийИндекс И Не ВНачале;
ПеременнаяВНачале = ПеременнаяВНачале Или ВНачале;
ПеременнаяВКонце = ПеременнаяВКонце Или ВКонце;
Если СледомЗаПредыдущми Тогда
Результат.Удалить(Результат.ВГраница());
КонецЕсли;
Если Не СледомЗаПредыдущми И Совпадение.Индекс > 0 Тогда
ДобавочныйИндекс = ?(Совпадение.Индекс = 0, 0, 1);
Результат.Добавить(Сред(РабочаяСтрока, ПредыдущийИндекс + ДобавочныйИндекс, Совпадение.Индекс - ПредыдущийИндекс));
КонецЕсли;
Если Не ВНачале Тогда
Результат.Добавить(?(СледомЗаПредыдущми, "", """") + " + ");
КонецЕсли;
Результат.Добавить(Имя);
Если Не ВКонце Тогда
Результат.Добавить(" + """);
КонецЕсли;
ПредыдущийИндекс = Совпадение.Индекс + Совпадение.Длина;
КонецЦикла;
Если ЕстьКавычкаВКонце И Не ПеременнаяВКонце Тогда
Результат.Добавить(Кавычка);
КонецЕсли;
Результат = СтрСоединить(Результат);
Если ЕстьКавычкаВНачале И Не ПеременнаяВНачале Тогда
Результат = Кавычка + Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
@@ -31,6 +31,7 @@
Перем AWS4 Экспорт; // Структура
Перем ТокенBearer Экспорт; // Строка
Перем СоздатьКаталогСохраненияФайлов Экспорт; // Булево
Перем ИменаПеременных Экспорт; // Массив из Строка
// Максимальное время ожидания на выполнение запроса
Перем Таймаут Экспорт; // Число
@@ -129,6 +130,7 @@
AWS4 = НовыйAWS4();
ТокенBearer = "";
СоздатьКаталогСохраненияФайлов = Ложь;
ИменаПеременных = Новый Массив();
КонецПроцедуры
@@ -150,6 +152,10 @@
КонецФункции
Функция ЭтоПеременная(Имя) Экспорт
Возврат Не ИменаПеременных.Найти(Имя) = Неопределено;
КонецФункции
Функция НовоеОписаниеРесурса()
Описание = Новый Структура();
@@ -1,6 +1,7 @@
#Использовать tokenizer
Перем АргументыКоманд; // Массив
Перем АргументыКоманд; // Массив из Строка
Перем Переменные; // Массив из Строка
Перем Спецификация; // Массив
Перем Токенайзер; // Токенайзер
Перем ОткрытаКавычкаСПоддержкойИнтерполяции; // Булево
@@ -19,10 +20,13 @@
// Команда - Строка - Команда
//
// Возвращаемое значение:
// Массив из Строка - Аргументы командной строки
// Структура:
// * АргументыКоманд - Массив из Строка
// * ИменаПеременных - Массив из Строка
Функция Распарсить(Команда) Экспорт
АргументыКоманд = Новый Массив;
Переменные = Новый Массив;
ОткрытаКавычкаСПоддержкойИнтерполяции = Ложь;
ОткрытаКавычкаБезПоддержкиИнтерполяции = Ложь;
@@ -50,7 +54,7 @@
УдалитьПустуюПоследнююКоманду();
Возврат АргументыКоманд;
Возврат Новый Структура("АргументыКоманд, ИменаПеременных", АргументыКоманд, Переменные);
КонецФункции
@@ -74,10 +78,11 @@
Спецификация.Добавить(Новый СпецификацияТокенСимвол(СимволЭкранирования, "СимволЭкранирования"));
Спецификация.Добавить(Новый СпецификацияТокенСимвол(КавычкаСПоддержкойИнтерполяции, "КавычкаСПоддержкойИнтерполяции"));
Спецификация.Добавить(Новый СпецификацияТокенСимвол(КавычкаБезПоддержкиИнтерполяции, "КавычкаБезПоддержкиИнтерполяции"));
Спецификация.Добавить(Новый СпецификацияТокенРегулярноеВыражение(Новый РегулярноеВыражение("^[;&|]+"), "ОператорСвязыванияКоманд"));
Спецификация.Добавить(Новый СпецификацияТокенСимвол(Символы.ПС, "ПереносСтроки"));
Спецификация.Добавить(Новый СпецификацияТокенРегулярноеВыражение(Новый РегулярноеВыражение("^\s"), "ПробельныйСимвол"));
Спецификация.Добавить(Новый СпецификацияТокенРегулярноеВыражение(Новый РегулярноеВыражение("^[^'""\\\s]+"), "СтрокаБезСлужебныхСимволов")); // Строка до символов '"\ и пробельных символов
Спецификация.Добавить(ТокенРегулярноеВыражение("^\$(?:[a-zA-Z_][a-zA-Z0-9_]*|\{[a-zA-Z_][a-zA-Z0-9_]*\})", "Переменная"));
Спецификация.Добавить(ТокенРегулярноеВыражение("^(?:&&|\|\||[;&])", "ОператорСвязыванияКоманд"));
Спецификация.Добавить(ТокенРегулярноеВыражение("^\s", "ПробельныйСимвол"));
Спецификация.Добавить(ТокенРегулярноеВыражение("^[^'"";&$|\\\s]+", "СтрокаБезСлужебныхСимволов")); // Строка до символов '"\;&$| и пробельных символов
Возврат Спецификация;
@@ -145,6 +150,14 @@
КонецЕсли;
Если Токен.ТипТокена() = "Переменная" Тогда
Если Не ЭкранироватьСимвол И Не ОткрытаКавычкаБезПоддержкиИнтерполяции Тогда
ДобавитьПеременную(Токен.Значение());
Возврат ПолучитьСледующийТокен();
КонецЕсли;
Возврат Токен;
КонецЕсли;
Если Токен.ТипТокена() = "ОператорСвязыванияКоманд" Тогда
Если Не ЭкранироватьСимвол И Не ОткрытаКавычка() Тогда
НачатьНовуюКоманду = Истина;
@@ -248,6 +261,20 @@
КонецПроцедуры
Процедура ДобавитьПеременную(Знач Значение)
ШаблонВТексте = "$ENV_%1";
Имя = Сред(Значение, 2);
Имя = СтрЗаменить(Имя, "{", "");
Имя = СтрЗаменить(Имя, "}", "");
Переменные.Добавить(Имя);
ДополнитьНакопительнуюСтроку(СтрШаблон(ШаблонВТексте, Имя));
КонецПроцедуры
Процедура ОчиститьНакопительнуюСтроку()
НакопленнаяСтрока = Неопределено;
КонецПроцедуры
@@ -269,4 +296,13 @@
КонецПроцедуры
Функция ТокенРегулярноеВыражение(Паттерн, ТипТокена)
РегулярноеВыражение = Новый РегулярноеВыражение(Паттерн);
РегулярноеВыражение.Многострочный = Ложь;
Возврат Новый СпецификацияТокенРегулярноеВыражение(РегулярноеВыражение, ТипТокена);
КонецФункции
#КонецОбласти
@@ -21,16 +21,16 @@
ЗарегистрированныеФайлы = Новый Массив;
КонецПроцедуры
Процедура ОбновтитьСтатичныеФайлы() Экспорт
Процедура ОбновитьСтатичныеФайлы() Экспорт
Если ТипЗнч(КаталогиСФайлами) = Тип("Соответствие") Тогда
Для Каждого КиЗ Из КаталогиСФайлами Цикл
Для Каждого КиЗ из КаталогиСФайлами Цикл
ДобавитьКаталогСтатичныхФайлов(КиЗ.Значение, КиЗ.Ключ);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьКаталогСтатичныхФайлов(КаталогФайлов, ПутьНаСайте = "/") Экспорт
Для Каждого ТипФайла Из Перечисления.ОписанияТиповРасширенийФайлов Цикл
Для Каждого ТипФайла из Перечисления.ОписанияТиповРасширенийФайлов Цикл
Файлы = НайтиФайлы(КаталогФайлов, "*." + ТипФайла.Ключ, Истина);
Для каждого Файл Из Файлы Цикл
ДобавитьМаршрутДоФайла(Файл, КаталогФайлов, ПутьНаСайте, ТипФайла.Значение);
@@ -56,7 +56,24 @@
КонецПроцедуры
Процедура ДобавитьМаршрутДоФайла(Файл, Знач КаталогФайлов, Знач ПутьНаСайте, Знач ТипКонтента)
Процедура РегистрацияФайла(РасположениеНаСайте, ПутьНаДиске, ТипКонтента) Экспорт
СоответствиеПутей.Вставить(РасположениеНаСайте, Новый Структура("ПутьНаДиске, ТипКонтента", ПутьНаДиске, ТипКонтента));
Массив = Новый Массив();
Массив.Добавить("Запрос");
Массив.Добавить("Ответ");
Действие = Маршрутизатор.ОписаниеТочкиМаршрута();
Действие.Желудь = ЭтотОбъект;
Действие.ИмяМетода = "ОтдатьФайл";
Действие.Параметры = Массив;
Маршрутизатор.ДобавитьМаршрут(РасположениеНаСайте, Действие);
КонецПроцедуры
Процедура ДобавитьМаршрутДоФайла(Файл, знач КаталогФайлов, знач ПутьНаСайте, знач ТипКонтента)
Если Не СтрЗаканчиваетсяНа(КаталогФайлов, "/") Тогда
КаталогФайлов = КаталогФайлов + "/";
@@ -74,22 +91,11 @@
РасположениеНаСайте = СтрЗаменить(ОбъединитьПути(ПутьНаСайте, ПутьВПодкаталоге), "\", "/");
СоответствиеПутей.Вставить(РасположениеНаСайте, Новый Структура("ПутьНаДиске, ТипКонтента", ПутьЮниксСлешами, ТипКонтента));
Массив = Новый Массив();
Массив.Добавить("Запрос");
Массив.Добавить("Ответ");
Действие = Маршрутизатор.ОписаниеТочкиМаршрута();
Действие.Желудь = ЭтотОбъект;
Действие.ИмяМетода = "ОтдатьФайл";
Действие.Параметры = Массив;
Маршрутизатор.ДобавитьМаршрут(РасположениеНаСайте, Действие);
РегистрацияФайла(РасположениеНаСайте, ПутьЮниксСлешами, ТипКонтента);
КонецПроцедуры
Функция ПутьВПодкаталоге(Знач ПолныйПуть, Знач КаталогФайлов)
Функция ПутьВПодкаталоге(знач ПолныйПуть, знач КаталогФайлов)
Если СтрНачинаетсяС(КаталогФайлов, ".") Тогда
КаталогФайлов = Сред(КаталогФайлов, 2);
@@ -1,327 +0,0 @@
#Область ПрограммныйИнтерфейс
Функция ЧтениеТекстовыхФайлов(Файлы, ПрочитанныеФайлы) Экспорт
Конструктор = Новый КонструкторПрограммногоКода();
НомерФайла = 1;
Для Каждого ПередаваемыйФайл Из Файлы Цикл
Если Не (ПередаваемыйФайл.ПрочитатьСодержимое
Или ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса) Тогда
Продолжить;
КонецЕсли;
Если НомерФайла > 1 Тогда
Конструктор.ДобавитьПустуюСтроку();
КонецЕсли;
Шаблон = "ЧтениеТекста = Новый ЧтениеТекста(%2);
|%1 = ЧтениеТекста.Прочитать();";
Если ПередаваемыйФайл.УдалятьПереносыСтрок Тогда
Шаблон = Шаблон + "
|%1 = СтрЗаменить(%1, Символы.ПС, """");
|%1 = СтрЗаменить(%1, Символы.ВК, """");";
КонецЕсли;
Если ПередаваемыйФайл.КодироватьСодержимое Тогда
Шаблон = Шаблон + "
|%1 = КодироватьСтроку(%1, СпособКодированияСтроки.КодировкаURL);";
КонецЕсли;
ИмяПеременной = "{t(Переменная.ТекстовыеДанныеФайла)}_" + Формат(НомерФайла, "ЧГ=");
Конструктор.ДобавитьСтроку(Шаблон,
ИмяПеременной,
Конструктор.ПараметрВСтроку(ПередаваемыйФайл.ПолноеИмяФайла)
);
ПрочитанныйФайл = Новый Структура();
ПрочитанныйФайл.Вставить("ПередаваемыйФайл", ПередаваемыйФайл);
ПрочитанныйФайл.Вставить("ИмяПеременной", ИмяПеременной);
ПрочитанныеФайлы.Добавить(ПрочитанныйФайл);
НомерФайла = НомерФайла + 1;
КонецЦикла;
Возврат Конструктор.ПолучитьРезультат();
КонецФункции
Функция ДанныеЗапроса(НазначениеДанных, ТекстовыеДанные, ПрочитанныеФайлы) Экспорт
Конструктор = Новый КонструкторПрограммногоКода();
ЧастиКода = Новый Массив();
КонкатенацияСПереносомСтрокиИРазделителя = "
| + ""%1"" + %2";
КонкатенацияСПереносомСтроки = "
| + %1";
НуженРазделитель = Ложь;
МассивТекстовыхДанных = Новый Массив();
Для Каждого ПередаваемыйТекст Из ТекстовыеДанные Цикл
Если Не ПередаваемыйТекст.Назначение = НазначениеДанных Тогда
Продолжить;
КонецЕсли;
Разделитель = ПередаваемыйТекст.РазделительТелаЗапроса;
Если НуженРазделитель И Не ПустаяСтрока(Разделитель) Тогда
МассивТекстовыхДанных.Добавить(Разделитель);
КонецЕсли;
МассивТекстовыхДанных.Добавить(ПередаваемыйТекст.ПолноеЗначение());
НуженРазделитель = Истина;
КонецЦикла;
Если МассивТекстовыхДанных.Количество() Тогда
ЧастиКода.Добавить(Конструктор.ПараметрВСтроку(СтрСоединить(МассивТекстовыхДанных)));
КонецЕсли;
Для Каждого ПрочитанныйФайл Из ПрочитанныеФайлы Цикл
ПередаваемыйФайл = ПрочитанныйФайл.ПередаваемыйФайл;
Если Не ПередаваемыйФайл.Назначение = НазначениеДанных Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(ПередаваемыйФайл.ИмяПоля) Тогда
Префикс = ПередаваемыйФайл.ИмяПоля + "=";
ПрефиксВКоде = Конструктор.ПараметрВСтроку(Префикс) + " + ";
Иначе
Префикс = "";
ПрефиксВКоде = "";
КонецЕсли;
ИмяПеременной = ПрочитанныйФайл.ИмяПеременной;
Разделитель = ПередаваемыйФайл.РазделительТелаЗапроса;
Если НуженРазделитель Тогда
Если Не ПустаяСтрока(Разделитель) Тогда
Текст = СтрШаблон(КонкатенацияСПереносомСтрокиИРазделителя,
ПередаваемыйФайл.РазделительТелаЗапроса + Префикс,
ИмяПеременной);
ЧастиКода.Добавить(Текст);
Иначе
Текст = СтрШаблон(КонкатенацияСПереносомСтроки, ПрефиксВКоде + ИмяПеременной);
ЧастиКода.Добавить(Текст);
КонецЕсли;
Иначе
ЧастиКода.Добавить(ПрефиксВКоде + ИмяПеременной);
КонецЕсли;
НуженРазделитель = Истина;
КонецЦикла;
Возврат СтрСоединить(ЧастиКода);
КонецФункции
Функция URL(СтруктураURL, ТекстовыеДанные = Неопределено, ПрочитанныеФайлы = Неопределено) Экспорт
// Схема
URL = """" + СтруктураURL.Схема + "://";
// Аутентификация
Пользователь = СтруктураURL.Аутентификация.Пользователь;
Пароль = СтруктураURL.Аутентификация.Пароль;
Если Не ПустаяСтрока(Пользователь) Или Не ПустаяСтрока(Пароль) Тогда
URL = URL + СтрШаблон("%1:%2@", Пользователь, Пароль);
КонецЕсли;
// Сервер
URL = URL + СтруктураURL.Сервер;
// Порт
Если ЗначениеЗаполнено(СтруктураURL.Порт) Тогда
URL = URL + ":" + Формат(СтруктураURL.Порт, "ЧГ=");
КонецЕсли;
// Адрес ресурса
АдресРесурса = АдресРесурса(СтруктураURL, ТекстовыеДанные, ПрочитанныеФайлы);
Если ПустаяСтрока(АдресРесурса) Тогда
URL = URL + """";
Иначе
URL = URL + Сред(АдресРесурса, 2);
КонецЕсли;
Возврат URL;
КонецФункции
Функция АдресРесурса(СтруктураURL, ТекстовыеДанные = Неопределено, ПрочитанныеФайлы = Неопределено) Экспорт
Конструктор = Новый КонструкторПрограммногоКода();
РазделительПараметров = "&";
КонкатенацияСПереносомСтрокиИРазделителем = "
| + ""%1"" + ";
КонкатенацияСПереносомСтроки = "
| + ";
ПараметрыЗапроса = Новый Массив();
// Исходные параметры запроса
Для Каждого Параметр Из СтруктураURL.ПараметрыЗапроса Цикл
КлючИЗначение = СтрШаблон("%1=%2",
КодироватьСтроку(Параметр.Ключ, СпособКодированияСтроки.КодировкаURL),
КодироватьСтроку(Параметр.Значение, СпособКодированияСтроки.КодировкаURL));
ПараметрыЗапроса.Добавить(КлючИЗначение);
КонецЦикла;
// Дополняемые параметры запроса
Если Не ТекстовыеДанные = Неопределено Тогда
Для Каждого ПередаваемыйТекст Из ТекстовыеДанные Цикл
Если ПередаваемыйТекст.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса Тогда
Если ПараметрыЗапроса.Количество() И Не ПустаяСтрока(ПередаваемыйТекст.РазделительТелаЗапроса) Тогда
ПараметрыЗапроса.Добавить(ПередаваемыйТекст.РазделительТелаЗапроса);
КонецЕсли;
ПараметрыЗапроса.Добавить(ПередаваемыйТекст.ПолноеЗначение());
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Параметры запроса из файлов
ПараметрыЗапросаИзФайловСтрокой = "";
Если Не ПрочитанныеФайлы = Неопределено Тогда
Для Каждого ПрочитанныйФайл Из ПрочитанныеФайлы Цикл
ПередаваемыйФайл = ПрочитанныйФайл.ПередаваемыйФайл;
Если ПередаваемыйФайл.Назначение = НазначенияПередаваемыхДанных.СтрокаЗапроса Тогда
Если ЗначениеЗаполнено(ПередаваемыйФайл.ИмяПоля) Тогда
Префикс = ПередаваемыйФайл.ИмяПоля + "=";
ПрефиксВКоде = Конструктор.ПараметрВСтроку(Префикс) + " + ";
Иначе
Префикс = "";
ПрефиксВКоде = "";
КонецЕсли;
ИмяПеременной = ПрочитанныйФайл.ИмяПеременной;
Если ПараметрыЗапросаИзФайловСтрокой = "" Тогда
ПараметрыЗапросаИзФайловСтрокой = ПрефиксВКоде + ИмяПеременной;
Иначе
ПараметрыЗапросаИзФайловСтрокой = ПараметрыЗапросаИзФайловСтрокой
+ СтрШаблон(КонкатенацияСПереносомСтрокиИРазделителем, РазделительПараметров + Префикс)
+ ИмяПеременной;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Сборка адреса
ПараметрыЗапросаСтрокой = СтрСоединить(ПараметрыЗапроса);
ЕстьПараметрыЗапроса = Не ПустаяСтрока(ПараметрыЗапросаСтрокой) Или Не ПустаяСтрока(ПараметрыЗапросаИзФайловСтрокой);
ПерваяЧасть = СтруктураURL.Путь
+ ?(ЕстьПараметрыЗапроса, "?", "")
+ ПараметрыЗапросаСтрокой;
ВтораяЧасть = ?(Не ПустаяСтрока(СтруктураURL.Фрагмент), "#" + СтруктураURL.Фрагмент, "");
Если ПустаяСтрока(ПараметрыЗапросаИзФайловСтрокой) Тогда
Результат = ПерваяЧасть + ВтораяЧасть;
Если ЗначениеЗаполнено(Результат) Тогда
Результат = Конструктор.ПараметрВСтроку(Результат);
КонецЕсли;
Иначе
ВозможноОднойСтрокой = ПустаяСтрока(ВтораяЧасть) И СтрЧислоСтрок(ПараметрыЗапросаИзФайловСтрокой) = 1;
Если ВозможноОднойСтрокой Тогда
Результат = ""
+ Конструктор.ПараметрВСтроку(ПерваяЧасть + ?(ПустаяСтрока(ПараметрыЗапросаСтрокой), "", РазделительПараметров))
+ " + "
+ ПараметрыЗапросаИзФайловСтрокой;
Иначе
Результат = Конструктор.ПараметрВСтроку(ПерваяЧасть);
Если ПустаяСтрока(ПараметрыЗапросаСтрокой) Тогда
Результат = Результат
+ КонкатенацияСПереносомСтроки
+ ПараметрыЗапросаИзФайловСтрокой;
ИначеЕсли Лев(ПараметрыЗапросаИзФайловСтрокой, 1) = """" Тогда
Результат = Результат
+ КонкатенацияСПереносомСтроки
+ """" + РазделительПараметров
+ Сред(ПараметрыЗапросаИзФайловСтрокой, 2);
Иначе
Результат = Результат
+ СтрШаблон(КонкатенацияСПереносомСтрокиИРазделителем, РазделительПараметров)
+ ПараметрыЗапросаИзФайловСтрокой;
КонецЕсли;
Если Не ПустаяСтрока(ВтораяЧасть) Тогда
Результат = Результат
+ КонкатенацияСПереносомСтроки
+ Конструктор.ПараметрВСтроку(ВтораяЧасть);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ИнтернетПрокси(ОписаниеЗапроса, ИмяПараметра) Экспорт
Конструктор = Новый КонструкторПрограммногоКода();
ИспользоватьАутентификациюОС = ОписаниеЗапроса.ТипАутентификацииПрокси = ТипыАутентификации.NTLM;
ПараметрыФункции = Новый Массив;
ПараметрыФункции.Добавить(Конструктор.ПараметрВСтроку(ОписаниеЗапроса.ПроксиПротокол));
ПараметрыФункции.Добавить(Конструктор.ПараметрВСтроку(ОписаниеЗапроса.ПроксиСервер));
ПараметрыФункции.Добавить(Конструктор.НеобязательныйПараметрВСтроку(ОписаниеЗапроса.ПроксиПорт));
ПараметрыФункции.Добавить(Конструктор.НеобязательныйПараметрВСтроку(ОписаниеЗапроса.ПроксиПользователь));
ПараметрыФункции.Добавить(Конструктор.НеобязательныйПараметрВСтроку(ОписаниеЗапроса.ПроксиПароль));
ПараметрыФункции.Добавить(?(ИспользоватьАутентификациюОС, "", "Ложь")); // Значение по умолчанию Истина
Конструктор
.ДобавитьСтроку("%1 = Новый ИнтернетПрокси();", ИмяПараметра)
.ДобавитьСтроку("%1.Установить(%2);",
ИмяПараметра,
Конструктор.ПараметрыФункцииВСтроку(ПараметрыФункции)
);
Возврат Конструктор.ПолучитьРезультат();
КонецФункции
#КонецОбласти
@@ -92,7 +92,7 @@
Возврат Неопределено;
КонецПопытки
КонецПопытки;
КонецФункции
@@ -2002,7 +2002,7 @@
);
ТестовыеДанные.Вставить(
"curl http://example16.com/ --form-string name=@data;type=some",
"curl http://example16.com/ --form-string 'name=@data;type=some'",
"РазделительMultipart = СтрЗаменить(Новый УникальныйИдентификатор, ""-"", """");
|
|Заголовки = Новый Соответствие();
@@ -2027,7 +2027,7 @@
);
ТестовыеДанные.Вставить(
"curl http://example17.com/ -F name=John= -F brief=doctor=111;type=text/foo",
"curl http://example17.com/ -F name=John= -F 'brief=doctor=111;type=text/foo'",
"РазделительMultipart = СтрЗаменить(Новый УникальныйИдентификатор, ""-"", """");
|
|Заголовки = Новый Соответствие();
@@ -2059,7 +2059,7 @@
);
ТестовыеДанные.Вставить(
"curl http://example18.com/ -F profile=@portrait.jpg;type=text/html,@file1.pdf,@file2.pdf;type=text/xml",
"curl http://example18.com/ -F 'profile=@portrait.jpg;type=text/html,@file1.pdf,@file2.pdf;type=text/xml'",
"РазделительMultipart = СтрЗаменить(Новый УникальныйИдентификатор, ""-"", """");
|
|Заголовки = Новый Соответствие();
@@ -2142,7 +2142,7 @@
Для Каждого Строка Из ТестовыеДанные Цикл
ПроверитьКонвертациюБезОшибок(Строка.Ключ, Строка.Значение);
КонецЦикла
КонецЦикла;
КонецПроцедуры
@@ -2189,6 +2189,79 @@
КонецПроцедуры
&Тест
Процедура ТестДолжен_ПроверитьПеременные() Экспорт
ТестовыеДанные = Новый Соответствие();
ТестовыеДанные.Вставить(
"curl http://example.com -u usr:$PASSWORD",
"PASSWORD = """";
|
|Соединение = Новый HTTPСоединение(""example.com"", 80, ""usr"", PASSWORD);
|HTTPЗапрос = Новый HTTPЗапрос(""/"");
|
|HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос);"
);
ТестовыеДанные.Вставить(
"curl http://example.com -H ""PRIVATE-TOKEN: $TOKEN""",
"TOKEN = """";
|
|Заголовки = Новый Соответствие();
|Заголовки.Вставить(""PRIVATE-TOKEN"", TOKEN);
|
|Соединение = Новый HTTPСоединение(""example.com"", 80);
|HTTPЗапрос = Новый HTTPЗапрос(""/"", Заголовки);
|
|HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос);"
);
ТестовыеДанные.Вставить(
"curl http://example.com?search=$QUERY1$QUERY2",
"QUERY1 = """";
|QUERY2 = """";
|
|Соединение = Новый HTTPСоединение(""example.com"", 80);
|HTTPЗапрос = Новый HTTPЗапрос(""?search="" + QUERY1 + QUERY2);
|
|HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос);"
);
ТестовыеДанные.Вставить(
"curl http://example.com -d name=$NAME -d surname=$SURNAME",
"NAME = """";
|SURNAME = """";
|
|Заголовки = Новый Соответствие();
|Заголовки.Вставить(""Content-Type"", ""application/x-www-form-urlencoded"");
|
|Соединение = Новый HTTPСоединение(""example.com"", 80);
|HTTPЗапрос = Новый HTTPЗапрос(""/"", Заголовки);
|HTTPЗапрос.УстановитьТелоИзСтроки(""name="" + NAME + ""&surname="" + SURNAME);
|
|HTTPОтвет = Соединение.ВызватьHTTPМетод(""POST"", HTTPЗапрос);"
);
ТестовыеДанные.Вставить(
"curl http://$HOST/$PATH?$QUERY#$FRAGMENT",
"HOST = """";
|PATH = """";
|QUERY = """";
|FRAGMENT = """";
|
|Соединение = Новый HTTPСоединение(HOST, 80);
|HTTPЗапрос = Новый HTTPЗапрос(""/"" + PATH + ""?"" + QUERY + ""#"" + FRAGMENT);
|
|HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос);"
);
Для Каждого Строка Из ТестовыеДанные Цикл
ПроверитьКонвертациюБезОшибок(Строка.Ключ, Строка.Значение);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьКонвертациюБезОшибок(КонсольнаяКоманда, ПрограммныйКод, Генератор = Неопределено)
Если Генератор = Неопределено Тогда
@@ -1156,9 +1156,9 @@
|curl http://example13.com/ -F ""json=@data.json;headers=\""X-header: value\""""
|curl http://example14.com/ -F ""json=@data.json;headers=\""X-header-1: some value 1\"";headers=\""X-header-2: some value 2\""""
|curl http://example15.com/ --form-string name=data
|curl http://example16.com/ --form-string name=@data;type=some
|curl http://example17.com/ -F name=John= -F brief=doctor=111;type=text/foo
|curl http://example18.com/ -F profile=@portrait.jpg;type=text/html,@file1.pdf,@file2.pdf;type=text/xml
|curl http://example16.com/ --form-string 'name=@data;type=some'
|curl http://example17.com/ -F name=John= -F 'brief=doctor=111;type=text/foo'
|curl http://example18.com/ -F 'profile=@portrait.jpg;type=text/html,@file1.pdf,@file2.pdf;type=text/xml'
|
|curl http://example19.com/ \
|-F multiline1=""line1
@@ -1481,6 +1481,72 @@
КонецПроцедуры
&Тест
Процедура ТестДолжен_ПроверитьПеременные() Экспорт
ТестовыеДанные = Новый Соответствие();
ТестовыеДанные.Вставить(
"curl http://example.com -u usr:$PASSWORD",
"PASSWORD = """";
|
|Аутентификация = Новый Структура(""Пользователь, Пароль"", ""usr"", PASSWORD);
|
|ДополнительныеПараметры = Новый Структура();
|ДополнительныеПараметры.Вставить(""Аутентификация"", Аутентификация);
|
|Результат = КоннекторHTTP.Get(""http://example.com"", , ДополнительныеПараметры);"
);
ТестовыеДанные.Вставить(
"curl http://example.com -H ""PRIVATE-TOKEN: $TOKEN""",
"TOKEN = """";
|
|Заголовки = Новый Соответствие();
|Заголовки.Вставить(""PRIVATE-TOKEN"", TOKEN);
|
|ДополнительныеПараметры = Новый Структура();
|ДополнительныеПараметры.Вставить(""Заголовки"", Заголовки);
|
|Результат = КоннекторHTTP.Get(""http://example.com"", , ДополнительныеПараметры);"
);
ТестовыеДанные.Вставить(
"curl http://example.com?search=$QUERY1$QUERY2",
"QUERY1 = """";
|QUERY2 = """";
|
|Результат = КоннекторHTTP.Get(""http://example.com?search="" + QUERY1 + QUERY2);"
);
ТестовыеДанные.Вставить(
"curl http://example.com -d name=$NAME -d surname=$SURNAME",
"NAME = """";
|SURNAME = """";
|
|Данные = Новый Соответствие();
|Данные.Вставить(""name"", NAME);
|Данные.Вставить(""surname"", SURNAME);
|
|Результат = КоннекторHTTP.Post(""http://example.com"", Данные);"
);
ТестовыеДанные.Вставить(
"curl http://$HOST/$PATH?$QUERY#$FRAGMENT",
"HOST = """";
|PATH = """";
|QUERY = """";
|FRAGMENT = """";
|
|Результат = КоннекторHTTP.Get(""http://"" + HOST + ""/"" + PATH + ""?"" + QUERY + ""#"" + FRAGMENT);"
);
Для Каждого Строка Из ТестовыеДанные Цикл
ПроверитьКонвертациюБезОшибок(Строка.Ключ, Строка.Значение);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьКонвертациюБезОшибок(КонсольнаяКоманда, ПрограммныйКод, Генератор = Неопределено)
Если Генератор = Неопределено Тогда
@@ -1490,10 +1556,11 @@
// Результат конвертации
Ошибки = Неопределено;
КонвертерКомандыCURL.УстановитьЯзыкПеревода("ru");
Результат = КонвертерКомандыCURL.Конвертировать(КонсольнаяКоманда, Генератор, Ошибки);
Ожидаем.Что(Результат).Равно(ПрограммныйКод);
Ожидаем.Что(Ошибки).Не_().Заполнено();
Ожидаем.Что(Результат, КонсольнаяКоманда).Равно(ПрограммныйКод);
Ожидаем.Что(Ошибки, КонсольнаяКоманда).Не_().Заполнено();
// Перевод
КонвертерКомандыCURL.УстановитьЯзыкПеревода("en");
@@ -1,3 +1,5 @@
// BSLLS:DuplicateStringLiteral-off
#Использовать asserts
#Использовать "../src/core"
#Использовать "../src/internal"
@@ -132,10 +134,10 @@
&Тест
Процедура ТестДолжен_ПроверитьОператорыСвязыванияКоманд() Экспорт
КоманднаяСтрока = "myapp -a & myapp -b
КоманднаяСтрока = "myapp -a && myapp -b
|myapp -c '&' &
|command1 ; command2 ;
|command3 | command4";
|cmd1 & cmd2 && cmd3 || cmd4 ; cmd5
|cmd6&&cmd7||cmd8;cmd9";
Эталон = Новый Массив;
@@ -155,21 +157,11 @@
Команда.Добавить("&");
Эталон.Добавить(Команда);
Команда = Новый Массив();
Команда.Добавить("command1");
Эталон.Добавить(Команда);
Команда = Новый Массив();
Команда.Добавить("command2");
Эталон.Добавить(Команда);
Команда = Новый Массив();
Команда.Добавить("command3");
Эталон.Добавить(Команда);
Команда = Новый Массив();
Команда.Добавить("command4");
Эталон.Добавить(Команда);
Для к = 1 по 9 Цикл
Команда = Новый Массив();
Команда.Добавить("cmd" + к);
Эталон.Добавить(Команда);
КонецЦикла;
Парсер = Новый ПарсерКонсольнойКоманды();
Результат = Парсер.Распарсить(КоманднаяСтрока);
@@ -395,17 +387,59 @@
КонецПроцедуры
&Тест
Процедура ТестДолжен_РаспарситьПеременные() Экспорт
КоманднаяСтрока = "myapp -a $VAR
|myapp ""$VAR""
|myapp -a '$VAR'
|myapp -a ""Text$VAR text""";
Эталон = Новый Массив;
Команда = Новый Массив;
Команда.Добавить("myapp");
Команда.Добавить("-a");
Команда.Добавить("$ENV_VAR");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp");
Команда.Добавить("$ENV_VAR");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp");
Команда.Добавить("-a");
Команда.Добавить("$VAR");
Эталон.Добавить(Команда);
Команда = Новый Массив;
Команда.Добавить("myapp");
Команда.Добавить("-a");
Команда.Добавить("Text$ENV_VAR text");
Эталон.Добавить(Команда);
Парсер = Новый ПарсерКонсольнойКоманды();
Результат = Парсер.Распарсить(КоманднаяСтрока);
ПроверитьРезультатПарсинга(Результат, Эталон);
КонецПроцедуры
Процедура ПроверитьРезультатПарсинга(Результат, Эталон)
Ожидаем.Что(Результат, "Количество команд").ИмеетДлину(Эталон.Количество());
АргументыКоманд = Результат.АргументыКоманд;
Для Инд1 = 0 По Результат.ВГраница() Цикл
Ожидаем.Что(АргументыКоманд, "Количество команд").ИмеетДлину(Эталон.Количество());
Для Инд1 = 0 По АргументыКоманд.ВГраница() Цикл
Заголовок = СтрШаблон("Инд1: %1", Инд1);
Ожидаем.Что(Результат[Инд1], Заголовок).ИмеетДлину(Эталон[Инд1].Количество());
Ожидаем.Что(АргументыКоманд[Инд1], Заголовок).ИмеетДлину(Эталон[Инд1].Количество());
Для Инд2 = 0 По Результат[Инд1].ВГраница() Цикл
Для Инд2 = 0 По АргументыКоманд[Инд1].ВГраница() Цикл
Заголовок = СтрШаблон("Инд1: %1, Инд2 : %2", Инд1, Инд2);
Ожидаем.Что(Результат[Инд1][Инд2], Заголовок).Равно(Эталон[Инд1][Инд2]);
Ожидаем.Что(АргументыКоманд[Инд1][Инд2], Заголовок).Равно(Эталон[Инд1][Инд2]);
КонецЦикла;
КонецЦикла;