diff --git a/lib.config b/lib.config
index 413755b..ec20879 100644
--- a/lib.config
+++ b/lib.config
@@ -10,6 +10,7 @@
+
diff --git a/packagedef b/packagedef
index 8d9a932..c057b9f 100644
--- a/packagedef
+++ b/packagedef
@@ -1,5 +1,5 @@
Описание.Имя("yard")
- .Версия("1.9.9")
+ .Версия("1.10.0")
.ВерсияСреды("1.6")
.ЗависитОт("logos")
.ЗависитОт("asserts")
@@ -10,6 +10,7 @@
.ЗависитОт("tempfiles")
.ЗависитОт("fs")
.ЗависитОт("1commands")
+ .ЗависитОт("1connector")
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("1bdd")
.ВключитьФайл("packagedef")
diff --git a/src/lib.config b/src/lib.config
index f48614b..9a7d11a 100644
--- a/src/lib.config
+++ b/src/lib.config
@@ -10,6 +10,7 @@
+
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\276\320\267\321\200\320\265\320\262\320\260\321\202\320\265\320\273\321\214\320\241\320\260\320\271\321\202\320\2601\320\241.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\276\320\267\321\200\320\265\320\262\320\260\321\202\320\265\320\273\321\214\320\241\320\260\320\271\321\202\320\2601\320\241.os"
index 57b217a..dd80e59 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\276\320\267\321\200\320\265\320\262\320\260\321\202\320\265\320\273\321\214\320\241\320\260\320\271\321\202\320\2601\320\241.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\276\320\267\321\200\320\265\320\262\320\260\321\202\320\265\320\273\321\214\320\241\320\260\320\271\321\202\320\2601\320\241.os"
@@ -12,16 +12,16 @@
//
// ----------------------------------------------------------
-#Использовать asserts
+#Использовать 1connector
#Область ПеременныеМодуля
-Перем Лог; // Объект - объект записи лога приложения
+Перем Лог; // Объект - объект записи лога приложения
-Перем ИмяПользователя; // Строка - имя пользователя сервиса загрузки релизов
-Перем ПарольПользователя; // Строка - пароль пользователя сервиса загрузки релизов
-Перем ИдСеанса; // Строка - идентификатор сеанса сервиса загрузки релизов
-Перем ВремяОжиданияОтвета; // Число - время ожидания ответа от внешнего ресурса (HTTP) в секундах
+Перем ИмяПользователя; // Строка - имя пользователя сервиса загрузки релизов
+Перем ПарольПользователя; // Строка - пароль пользователя сервиса загрузки релизов
+Перем ВремяОжиданияОтвета; // Число - время ожидания ответа от внешнего ресурса (HTTP) в секундах
+Перем Сессия; // Сессия - Сессия в рамках которой происходят все взаимодействия с сайтом 1с.
#КонецОбласти // ПеременныеМодуля
@@ -82,7 +82,7 @@
Знач ПолучатьБетаВерсии = Ложь) Экспорт
СтраницаКонфигураций = ПолучитьСтраницуСайта(ПараметрыПриложения.СервисРелизов(),
- ПараметрыПриложения.СтраницаСпискаРелизов());
+ ПараметрыПриложения.СтраницаСпискаРелизов());
Служебный.ОчиститьТекстСтраницыHTML(СтраницаКонфигураций);
@@ -100,7 +100,7 @@
ТекстСтрокиКонфигурации = ТекСтрокаКонфигурации.Группы[0].Значение;
НайденныеОписания = Служебный.НайтиСовпаденияВТексте(ТекстСтрокиКонфигурации,
- ПараметрыПриложения.ШаблонПоискаКонфигураций());
+ ПараметрыПриложения.ШаблонПоискаКонфигураций());
Если НайденныеОписания.Количество() = 0
ИЛИ НайденныеОписания[0].Группы.Количество() < 3 Тогда
@@ -394,201 +394,100 @@
// ПутьКФайлуДляСохранения - Строка - путь к файлу для сохранения
//
Процедура ЗагрузитьФайл(АдресИсточника, Знач ПутьКФайлуДляСохранения) Экспорт
-
- СтруктураАдреса = СтруктураURI(АдресИсточника);
- Сервер = СтрШаблон("%1://%2", СтруктураАдреса.Схема, СтруктураАдреса.Хост);
- ИдСеансаЗагрузки = Авторизация(Сервер, ИмяПользователя, ПарольПользователя, СтруктураАдреса.ПутьНаСервере);
-
- Соединение = Новый HTTPСоединение(Сервер, , , , , ВремяОжиданияОтвета());
- Соединение.РазрешитьАвтоматическоеПеренаправление = Истина;
-
- Запрос = ЗапросКСайту(АдресИсточника);
- Запрос.Заголовки.Вставить("Cookie", ИдСеансаЗагрузки);
-
Лог.Отладка("Загрузка файла: Начало загрузки файла по адресу ""%1""", АдресИсточника);
-
- Ответ = Соединение.Получить(Запрос, ПутьКФайлуДляСохранения);
-
- Лог.Отладка("Загрузка файла: Загружен файл ""%1""", ПутьКФайлуДляСохранения);
-
-КонецПроцедуры // ЗагрузитьФайл()
-
-// Функция - выполняет авторизацию на сайте 1С и возвращает идентификатор сеанса
-//
-// Параметры:
-// Сервер - Строка - адрес сервера
-// Имя - Строка - имя пользователя
-// Пароль - Строка - пароль пользователя
-// АдресРесурса - Строка - расположение ресурса на сервере
-//
-// Возвращаемое значение:
-// Строка - текст полученной страницы
-//
-Функция Авторизация(Знач Сервер, Знач Имя, Знач Пароль, Знач АдресРесурса = "") Экспорт
-
- ИмяПользователя = Имя;
- ПарольПользователя = Пароль;
-
- КодПереадресации = 302;
- КодОшибкиАвторизации = 401;
-
- СоединениеРегистрации = Новый HTTPСоединение(ПараметрыПриложения.СервисАвторизации(), , , , , ВремяОжиданияОтвета());
- СоединениеРегистрации.РазрешитьАвтоматическоеПеренаправление = Ложь;
-
- СоединениеЦелевое = Новый HTTPСоединение(Сервер, , , , , ВремяОжиданияОтвета());
- СоединениеЦелевое.РазрешитьАвтоматическоеПеренаправление = Ложь;
-
- // Запрос 1
- ЗапросПолучение = ЗапросКСайту();
- ЗапросПолучение.АдресРесурса = АдресРесурса;
-
- // Ответ 1 - переадресация на страницу регистрации
- ОтветПереадресация = СоединениеЦелевое.Получить(ЗапросПолучение);
- НовыйИдСеанса = ПолучитьЗначениеЗаголовка("set-cookie", ОтветПереадресация.Заголовки);
- НовыйИдСеанса = Сред(НовыйИдСеанса, Найти(НовыйИдСеанса, "SESSION="));
- НовыйИдСеанса = Лев(НовыйИдСеанса, Найти(НовыйИдСеанса, ";") - 1);
-
- Лог.Отладка("Авторизация: Получен ответ от ресурса ""%1%2"", переадресация -> ""%3""",
- Сервер,
- ЗапросПолучение.АдресРесурса,
- ПолучитьЗначениеЗаголовка("location", ОтветПереадресация.Заголовки));
-
- // Запрос 2 - переходим на страницу регистрации
- ЗапросПолучение.АдресРесурса = СтрЗаменить(ПолучитьЗначениеЗаголовка("location", ОтветПереадресация.Заголовки),
- ПараметрыПриложения.СервисАвторизации(),
- "");
-
- // Ответ 2 - получение строки регистрации
- ОтветРегистрация = СоединениеРегистрации.Получить(ЗапросПолучение);
- ТелоОтвета = ОтветРегистрация.ПолучитьТелоКакСтроку();
- СтрокаРегистрации = ПолучитьСтрокуРегистрации(ТелоОтвета, ИмяПользователя, ПарольПользователя);
-
- Лог.Отладка("Авторизация: Получена строка регистрации от ресурса ""%1%2"": ""%3""",
- ПараметрыПриложения.СервисАвторизации(),
- ЗапросПолучение.АдресРесурса,
- СтрокаРегистрации);
-
- // Запрос 3 - выполнение регистрации
- ЗапросОбработка = ЗапросКСайту(ПараметрыПриложения.СтраницаАвторизации());
- ЗапросОбработка.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
- ЗапросОбработка.Заголовки.Вставить("Cookie", НовыйИдСеанса + "; i18next=ru-RU");
- ЗапросОбработка.УстановитьТелоИзСтроки(СтрокаРегистрации);
-
- // Ответ 3 - проверка успешности регистрации
- ОтветПроверка = СоединениеРегистрации.ОтправитьДляОбработки(ЗапросОбработка);
-
- СообщениеОбОшибке = "Код переадресации не соответствует ожидаемому!";
-
- Если ОтветПроверка.КодСостояния = КодОшибкиАвторизации Тогда
- СообщениеОбОшибке = СтрШаблон("Ошибка авторизации на сайте %1/%2 (пользователь: %3)",
- ПараметрыПриложения.СервисАвторизации(),
- ЗапросОбработка.АдресРесурса,
- Имя);
- КонецЕсли;
-
- Утверждения.ПроверитьРавенство(ОтветПроверка.КодСостояния,
- КодПереадресации,
- СообщениеОбОшибке);
-
- Лог.Отладка("Авторизация: Получен ответ от ресурса ""%1%2"", переадресация -> ""%3""",
- ПараметрыПриложения.СервисАвторизации(),
- ЗапросОбработка.АдресРесурса,
- ПолучитьЗначениеЗаголовка("location", ОтветПроверка.Заголовки));
-
- // Запрос 4 - переход на целевую страницу
- ЗапросПолучение.АдресРесурса = СтрЗаменить(ПолучитьЗначениеЗаголовка("location", ОтветПроверка.Заголовки), Сервер, "");
- ЗапросПолучение.Заголовки.Вставить("Cookie", НовыйИдСеанса);
- СоединениеЦелевое.Получить(ЗапросПолучение);
+ Ответ = ВыполнитьЗапросНаСайт(АдресИсточника, "", ПутьКФайлуДляСохранения);
- Лог.Отладка("Авторизация: Получен ответ от ресурса ""%1%2"", ID сеанса: ""%3""",
- Сервер,
- ЗапросПолучение.АдресРесурса,
- НовыйИдСеанса);
+ Если НЕ СтрНайти(Ответ.Заголовки.Получить("Content-Type"), "application/octet-stream;") Тогда
+ ВызватьИсключение СтрШаблон("КодВозврата: %1
+ |ТекстОтвета: %2", Ответ.КодСостояния, Ответ.Текст());
+ КонецЕсли;
- Возврат НовыйИдСеанса;
+ Лог.Отладка("Загрузка файла: Загружен файл ""%1""", ПутьКФайлуДляСохранения);
-КонецФункции // Авторизация()
+КонецПроцедуры // ЗагрузитьФайл()
#КонецОбласти // ПрограммныйИнтерфейс
#Область РаботаСсайтом
-// Функция - получает строку регистрации на основе данных страницы авторизации
-//
-// Параметры:
-// Текст - Строка - текст страницы авторизации
-// Имя - Строка - имя пользователя
-// Пароль - Строка - пароль пользователя
-//
-// Возвращаемое значение:
-// Строка - строка регистрации на сайте
-//
-Функция ПолучитьСтрокуРегистрации(Знач Текст, Знач Имя, Знач Пароль)
-
- Совпадения = Служебный.НайтиСовпаденияВТексте(Текст, ПараметрыПриложения.ШаблонПоискаСтрокиРегистрации());
-
- Токен = "";
- Если Совпадения.Количество() > 0 Тогда
- Токен = Совпадения[0].Группы[1].Значение;
- КонецЕсли;
-
- Возврат СтрШаблон(ПараметрыПриложения.ШаблонСтрокиРегистрации(), Имя, Пароль, Токен);
-
-КонецФункции // ПолучитьСтрокуРегистрации()
-
// Функция - получает страницу с сайта
//
// Параметры:
// Сервер - Строка - адрес сервера
// АдресРесурса - Строка - расположение ресурса на сервере
-// АвтоматическоеПеренаправление - Булево - Истина - будет выполняться автоматическое перенаправление
-// при соответствующем ответе сервера
-// Ложь - перенаправление выполняться не будет
//
// Возвращаемое значение:
// Строка - текст полученной страницы
//
-Функция ПолучитьСтраницуСайта(Знач Сервер, Знач АдресРесурса, Знач АвтоматическоеПеренаправление = Ложь)
+Функция ПолучитьСтраницуСайта(Знач Сервер, Знач АдресРесурса)
- Соединение = Новый HTTPСоединение(Сервер, , , , , ВремяОжиданияОтвета());
- Соединение.РазрешитьАвтоматическоеПеренаправление = АвтоматическоеПеренаправление;
-
- Запрос = ЗапросКСайту(АдресРесурса);
- Запрос.Заголовки.Вставить("Cookie", ИдСеанса);
+ Ответ = ВыполнитьЗапросНаСайт(Сервер, АдресРесурса);
- Ответ = Соединение.Получить(Запрос);
-
Лог.Отладка("Получена страница сайта ""%1%2""", Сервер, АдресРесурса);
-
- Возврат Ответ.ПолучитьТелоКакСтроку();
-
+
+ Возврат Ответ.Текст();
+
КонецФункции // ПолучитьСтраницуСайта()
-#КонецОбласти // РаботаСсайтом
+Функция ВыполнитьЗапросНаСайт(Знач Сервер, Знач АдресРесурса, Знач ПутьКФайлуДляСохранения = "")
+ ДопПараметры = Новый Структура("ИмяВыходногоФайла, Таймаут", ПутьКФайлуДляСохранения, ВремяОжиданияОтвета());
-#Область СлужебныеПроцедурыИФункции
+ Ответ = Сессия.ВызватьМетод("GET", СтрШаблон("%1%2", Сервер, АдресРесурса), ДопПараметры);
+
+ Если ТребуетсяАвторизация(Ответ) Тогда
+ Лог.Отладка("Авторизация: Получен ответ от ресурса ""%1%2"", Необходима авторизация",
+ Сервер,
+ АдресРесурса);
-// Функция - создает и возвращает HTTP-запрос со стандартными заголовками
+ Ответ = Авторизация(Ответ);
+ КонецЕсли;
+
+ Возврат Ответ;
+КонецФункции
+
+// Функция - выполняет авторизацию на сайте 1С
+// и выполняет запрос который предшествовал попаданию на страницу авторизации.
//
// Параметры:
-// АдресРесурса - Строка - адрес ресурса на сайте
+// Ответ - ПодготовленныйОтвет - Ответ предыдущего запроса,
+// для выполнения которого потребовалась авторизация
//
// Возвращаемое значение:
-// HTTPЗапрос - HTTP-запрос со стандартными заголовками
+// ПодготовленныйОтвет - Ответ на запрос который был перенаправлен на авторизацию
//
-Функция ЗапросКСайту(АдресРесурса = "")
-
- Запрос = Новый HTTPЗапрос;
- Запрос.Заголовки.Вставить("User-Agent", "oscript");
- Запрос.Заголовки.Вставить("Connection", "keep-alive");
- Запрос.АдресРесурса = АдресРесурса;
+Функция Авторизация(Знач Ответ)
+
+ КодОшибкиАвторизации = 401;
+
+ Execution = ИзвлечьExecution(Ответ.Текст());
+
+
+ Данные = Новый Структура;
+ Данные.Вставить("execution", Execution);
+ Данные.Вставить("username", ИмяПользователя);
+ Данные.Вставить("password", ПарольПользователя);
+ Данные.Вставить("_eventId", "submit");
+ Данные.Вставить("geolocation", "");
+ Данные.Вставить("submit", "Войти");
+ Данные.Вставить("rememberMe", "on");
+
+ Ответ = Сессия.ВызватьМетод("POST", Ответ.URL, Новый Структура("Данные", Данные));
+
+ Если Ответ.КодСостояния = КодОшибкиАвторизации Тогда
+ СообщениеОбОшибке = СтрШаблон("Ошибка авторизации на сайте пользователь: %1",
+ ИмяПользователя);
+ ВызватьИсключение СообщениеОбОшибке;
+ КонецЕсли;
+
+ Возврат Ответ;
+КонецФункции // Авторизация()
- Возврат Запрос;
+#КонецОбласти // РаботаСсайтом
-КонецФункции // ЗапросКСайту()
+#Область СлужебныеПроцедурыИФункции
// Функция - выделяет имя файла из полного адреса файла
//
@@ -677,97 +576,33 @@
КонецФункции // СоответствуетФильтру()
-Функция ПолучитьЗначениеЗаголовка(Заголовок, ВсеЗаголовки)
-
- Для Каждого ТекЗаголовок Из ВсеЗаголовки Цикл
- Если НРег(ТекЗаголовок.Ключ) = НРег(Заголовок) Тогда
- Возврат ТекЗаголовок.Значение;
- КонецЕсли;
- КонецЦикла;
-
- Возврат "";
-
-КонецФункции // ПолучитьЗначениеЗаголовка()
-
-// Функция - разбирает строку URI на составные части и возвращает в виде структуры.
-// На основе RFC 3986.
-// утащено из https://its.1c.ru/db/metod8dev#content:5574:hdoc, также есть в БСП
-//
-// Параметры:
-// СтрокаURI - Строка - ссылка на ресурс в формате:
-// <схема>://<логин>:<пароль>@<хост>:<порт>/<путь>?<параметры>#<якорь>.
-//
-// Возвращаемое значение:
-// Структура - составные части URI согласно формату:
-// * Схема - Строка - схема из URI.
-// * Логин - Строка - логин из URI.
-// * Пароль - Строка - пароль из URI.
-// * ИмяСервера - Строка - часть <хост>:<порт> из URI.
-// * Хост - Строка - хост из URI.
-// * Порт - Строка - порт из URI.
-// * ПутьНаСервере - Строка - часть <путь>?<параметры>#<якорь> из URI.
-//
-Функция СтруктураURI(Знач СтрокаURI) Экспорт
-
- СтрокаURI = СокрЛП(СтрокаURI);
-
- // схема
- Схема = "";
- Разделитель = "://";
- Позиция = Найти(СтрокаURI, Разделитель);
- Если Позиция > 0 Тогда
- Схема = НРег(Лев(СтрокаURI, Позиция - 1));
- СтрокаURI = Сред(СтрокаURI, Позиция + СтрДлина(Разделитель));
- КонецЕсли;
+Функция ТребуетсяАвторизация(Ответ)
+ Возврат СтрНачинаетсяС(Ответ.URL, СтрШаблон("%1%2", ПараметрыПриложения.СервисАвторизации(),
+ ПараметрыПриложения.СтраницаАвторизации()));
+КонецФункции
- // строка соединения и путь на сервере
- СтрокаСоединения = СтрокаURI;
- ПутьНаСервере = "";
- Позиция = Найти(СтрокаСоединения, "/");
- Если Позиция > 0 Тогда
- ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
- СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
- КонецЕсли;
-
- // информация пользователя и имя сервера
- СтрокаАвторизации = "";
- ИмяСервера = СтрокаСоединения;
- Позиция = Найти(СтрокаСоединения, "@");
- Если Позиция > 0 Тогда
- СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
- ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
- КонецЕсли;
+Функция ИзвлечьExecution(Текст)
+ execution = "";
+ Совпадения = Служебный.НайтиСовпаденияВТексте(Текст, ПараметрыПриложения.ШаблонПоискаСтрокиРегистрации());
- // логин и пароль
- Логин = СтрокаАвторизации;
- Пароль = "";
- Позиция = Найти(СтрокаАвторизации, ":");
- Если Позиция > 0 Тогда
- Логин = Лев(СтрокаАвторизации, Позиция - 1);
- Пароль = Сред(СтрокаАвторизации, Позиция + 1);
+ Если Совпадения.Количество() > 0 Тогда
+ execution = Совпадения[0].Группы[1].Значение;
КонецЕсли;
- // хост и порт
- Хост = ИмяСервера;
- Порт = "";
- Позиция = Найти(ИмяСервера, ":");
- Если Позиция > 0 Тогда
- Хост = Лев(ИмяСервера, Позиция - 1);
- Порт = Сред(ИмяСервера, Позиция + 1);
+ Если НЕ ЗначениеЗаполнено(execution) Тогда
+ ВызватьИсключение "Авторизация: Ожидали что execution будет заполнен, но это не так!";
КонецЕсли;
- Результат = Новый Структура;
- Результат.Вставить("Схема", Схема);
- Результат.Вставить("Логин", Логин);
- Результат.Вставить("Пароль", Пароль);
- Результат.Вставить("ИмяСервера", ИмяСервера);
- Результат.Вставить("Хост", Хост);
- Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
- Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
-
- Возврат Результат;
-
-КонецФункции // СтруктураURI()
+ Возврат execution;
+КонецФункции
+
+
+Процедура ИнициализацияСессии()
+ Если НЕ ЗначениеЗаполнено(Сессия) Тогда
+ Лог.Отладка("Инициализирована новая сессия.");
+ Сессия = Новый Сессия;
+ КонецЕсли;
+КонецПроцедуры
// Процедура - сортирует массив описаний версий по датам версий
//
@@ -807,12 +642,8 @@
ПарольПользователя = Пароль;
Лог = ПараметрыПриложения.Лог();
-
- ИдСеанса = Авторизация(ПараметрыПриложения.СервисРелизов(),
- ИмяПользователя,
- ПарольПользователя,
- ПараметрыПриложения.СтраницаСпискаРелизов());
-
+ ИнициализацияСессии();
+
КонецПроцедуры // ПриСозданииОбъекта()
-#КонецОбласти // Инициализация
+#КонецОбласти // Инициализация
\ No newline at end of file
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\320\260\320\272\320\265\321\202\320\260.os"
new file mode 100644
index 0000000..c692541
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\320\260\320\272\320\265\321\202\320\260.os"
@@ -0,0 +1,251 @@
+//////////////////////////////////////////////////////////////////////
+// Позаимствовано из пакета opm
+// https://github.com/oscript-library/opm
+//
+//////////////////////////////////////////////////////////////////////
+//
+// Fluent-API для описания пакета
+//
+//////////////////////////////////////////////////////////////////////
+
+Перем мСвойстваПакета;
+Перем мЗависимости;
+Перем мМодули;
+Перем мВключаемыеФайлы;
+Перем мИсполняемыеФайлы;
+
+Перем ТипыМодулей Экспорт;
+
+//////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+
+Функция Имя(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("Имя", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Версия(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("Версия", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Автор(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("Автор", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Описание(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("Описание", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция АдресАвтора(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("АдресАвтора", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция ВерсияСреды(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("ВерсияСреды", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция ВерсияМанифеста(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("ВерсияМанифеста", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция ТочкаВхода(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("ТочкаВхода", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Задачи(Знач Параметр) Экспорт
+ УстановитьСвойствоПакета("Задачи", Параметр);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Свойства() Экспорт
+
+ // Проверка обязательных свойств
+ Если Не мСвойстваПакета.Свойство("Имя") или Не ЗначениеЗаполнено(мСвойстваПакета.Имя) Тогда
+ ВызватьИсключение "Не задано имя пакета";
+ КонецЕсли;
+
+ Если Не мСвойстваПакета.Свойство("Версия") или Не ЗначениеЗаполнено(мСвойстваПакета.Версия) Тогда
+ ВызватьИсключение "Не задана версия пакета";
+ КонецЕсли;
+
+ КопияСвойств = Новый Структура;
+ Для Каждого Свойство Из мСвойстваПакета Цикл
+ КопияСвойств.Вставить(Свойство.Ключ, Свойство.Значение);
+ КонецЦикла;
+
+ Возврат КопияСвойств;
+
+КонецФункции
+
+
+//////////////////////////////////////////////////////////////////////
+// Зависимости
+
+Функция ЗависитОт(Знач ИмяПакета, Знач МинимальнаяВерсия = Неопределено, Знач МаксимальнаяВерсия = Неопределено) Экспорт
+
+ Зависимость = Зависимость(ИмяПакета);
+ Если Зависимость = Неопределено Тогда
+ Зависимость = мЗависимости.Добавить();
+ Зависимость.ИмяПакета = ИмяПакета;
+ КонецЕсли;
+
+ Зависимость.ДляРазработки = Ложь;
+
+ Если МинимальнаяВерсия = Неопределено Тогда
+ Возврат ЭтотОбъект;
+ КонецЕсли;
+
+ Зависимость.МинимальнаяВерсия = МинимальнаяВерсия;
+ Зависимость.МаксимальнаяВерсия = МаксимальнаяВерсия;
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+Функция РазработкаЗависитОт(
+ Знач ИмяПакета,
+ Знач МинимальнаяВерсия = Неопределено,
+ Знач МаксимальнаяВерсия = Неопределено) Экспорт
+
+ Зависимость = Зависимость(ИмяПакета);
+ Если Зависимость = Неопределено Тогда
+ Зависимость = мЗависимости.Добавить();
+ Зависимость.ИмяПакета = ИмяПакета;
+ Зависимость.ДляРазработки = Истина;
+ КонецЕсли;
+
+ Если МинимальнаяВерсия = Неопределено Тогда
+ Возврат ЭтотОбъект;
+ КонецЕсли;
+
+ Зависимость.МинимальнаяВерсия = МинимальнаяВерсия;
+ Зависимость.МаксимальнаяВерсия = МаксимальнаяВерсия;
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+Функция Зависимость(Знач ИмяПакета) Экспорт
+
+ Возврат мЗависимости.Найти(ИмяПакета, "ИмяПакета");
+
+КонецФункции
+
+Функция Зависимости() Экспорт
+ Возврат мЗависимости.Скопировать();
+КонецФункции
+
+//////////////////////////////////////////////////////////////////////
+// Модули пакета
+
+Функция ОпределяетКласс(Знач Идентификатор, Знач Файл) Экспорт
+
+ ЗарегистрироватьМодульПакета(Идентификатор, Файл, ТипыМодулей.Класс);
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+Функция Классы() Экспорт
+ Возврат мМодули.Скопировать(Новый Структура("Тип", ТипыМодулей.Класс));
+КонецФункции
+
+Функция ОпределяетМодуль(Знач Идентификатор, Знач Файл) Экспорт
+
+ ЗарегистрироватьМодульПакета(Идентификатор, Файл, ТипыМодулей.Модуль);
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+Функция Модули() Экспорт
+ Возврат мМодули.Скопировать(Новый Структура("Тип", ТипыМодулей.Модуль));
+КонецФункции
+
+Функция ВсеМодулиПакета() Экспорт
+ Возврат мМодули.Скопировать();
+КонецФункции
+
+Процедура ЗарегистрироватьМодульПакета(Знач Идентификатор, Знач Файл, Знач Тип)
+ УжеЕсть = мМодули.НайтиСтроки(Новый Структура("Идентификатор,Тип", Идентификатор, Тип));
+ Если УжеЕсть.Количество() Тогда
+ ВызватьИсключение "Уже определен " + НРег(тип) + " с именем " + Идентификатор;
+ КонецЕсли;
+
+ Объявление = мМодули.Добавить();
+ Объявление.Идентификатор = Идентификатор;
+ Объявление.Файл = Файл;
+ Объявление.Тип = Тип;
+
+КонецПроцедуры
+
+//////////////////////////////////////////////////////////////////////
+// Включаемые файлы
+
+Функция ВключитьФайл(Знач ИсходныйПуть) Экспорт
+
+ мВключаемыеФайлы.Добавить(ИсходныйПуть);
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+Функция ВключаемыеФайлы() Экспорт
+ Возврат мВключаемыеФайлы;
+КонецФункции
+
+//////////////////////////////////////////////////////////////////////
+// Исполняемые файлы
+
+Функция ИсполняемыйФайл(Знач Путь, Знач ИмяПриложения = "") Экспорт
+ Стр = мИсполняемыеФайлы.Добавить();
+ Стр.Путь = Путь;
+ Стр.ИмяПриложения = ИмяПриложения;
+
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция ИсполняемыеФайлы() Экспорт
+ Возврат мИсполняемыеФайлы;
+КонецФункции
+
+//////////////////////////////////////////////////////////////////////
+// Вспомогательные функции
+
+Процедура УстановитьСвойствоПакета(Знач Имя, Знач Значение)
+ мСвойстваПакета.Вставить(Имя, Значение);
+КонецПроцедуры
+
+//////////////////////////////////////////////////////////////////////
+//
+
+Процедура Инициализация()
+
+ мСвойстваПакета = Новый Структура;
+
+ мЗависимости = Новый ТаблицаЗначений;
+ мЗависимости.Колонки.Добавить("ИмяПакета");
+ мЗависимости.Колонки.Добавить("ДляРазработки", Новый ОписаниеТипов("Булево"));
+ мЗависимости.Колонки.Добавить("МинимальнаяВерсия");
+ мЗависимости.Колонки.Добавить("МаксимальнаяВерсия");
+
+ мМодули = Новый ТаблицаЗначений;
+ мМодули.Колонки.Добавить("Идентификатор");
+ мМодули.Колонки.Добавить("Файл");
+ мМодули.Колонки.Добавить("Тип");
+
+ ТипыМодулей = Новый Структура("Класс,Модуль", "Класс", "Модуль");
+
+ мВключаемыеФайлы = Новый Массив;
+
+ мИсполняемыеФайлы = Новый ТаблицаЗначений;
+ мИсполняемыеФайлы.Колонки.Добавить("Путь");
+ мИсполняемыеФайлы.Колонки.Добавить("ИмяПриложения");
+
+КонецПроцедуры
+
+Инициализация();
\ No newline at end of file
diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os"
index 1151102..d327d02 100644
--- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os"
+++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os"
@@ -8,7 +8,6 @@
// ----------------------------------------------------------
#Использовать logos
-#Использовать opm
#Использовать tempfiles
#Использовать fs
@@ -351,7 +350,7 @@
ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета);
- ОбработчикСобытий = ЗагрузитьСценарий(ФайлМанифеста.ПолноеИмя, ВнешнийКонтекст);
+ ЗагрузитьСценарий(ФайлМанифеста.ПолноеИмя, ВнешнийКонтекст);
Свойства = ОписаниеПакета.Свойства();
Свойства.Вставить("Классы", ОписаниеПакета.Классы());