diff --git a/packagedef b/packagedef index cb1fe9f..94e540d 100644 --- a/packagedef +++ b/packagedef @@ -1,5 +1,5 @@ Описание.Имя("onecore") - .Версия("0.2.7") + .Версия("0.2.8") .Автор("Андрей Савадеров (Macegor)") .АдресАвтора("savaderov.andrei@gmail.com") .Описание("Фреймворк на движке onescript, созданный для разработки web-приложений любой сложности, используя компонентный подход.") diff --git a/readme.md b/readme.md index 6523f61..838c65e 100644 --- a/readme.md +++ b/readme.md @@ -25,6 +25,8 @@ OneCore - это web-фреймворк на движке onescript, созда - [Свойства маршрутов](#свойства-маршрутов) - [Префиксация маршрутов](#префиксация-маршрутов) - [Перенаправление](#перенаправление) + - [Произвольные обработчики](#произвольные-обработчики) + - [Дочерние (подчиненные) маршруты](#дочерние-подчиненные-маршруты) - [Результат примера](#результат-примера) - [Запуск и отладка](#запуск-и-отладка) - [Шаблонизатор (jinja)](#шаблонизатор-jinja) @@ -32,6 +34,7 @@ OneCore - это web-фреймворк на движке onescript, созда - [Наследование](#наследование) - [Формирование](#формирование) - [Разработка и использование сервисов](#разработка-и-использование-сервисов) + - [Общие объекты](#общие-объекты) - [Статические файлы](#статические-файлы) - [Перехватчики (Middleware)](#перехватчики-middleware) - [Работа с базой данных (ORM)](#работа-с-базой-данных-orm) @@ -66,11 +69,20 @@ OneCore - это web-фреймворк на движке onescript, созда Перед установкой у вас уже должна быть установлена платформа onescript версией не менее 2.0RC5 ветка develop. Рекомендовано использовать [OVM](https://github.com/oscript-library/ovm) для установки платформы onescript. +**Вариант: 1** + +Выполнить консольную команду: ```opm install -l onecore``` + +**Вариант: 2** + 1. Скачать ospx файл с релизов (onecore-х.х.х.ospx) -2. Из каталога "simple" корневого каталога репозитория скопируйте содержимое нужного примера в каталог вашего проекта -3. В каталоге вашего проекта разместите скачанный файл библиотеки (onecore-х.х.х.ospx) -4. Выполнить консольную команду: ```opm i -l -f onecore-x.x.x.ospx``` где "x.x.x" версия фреймворка (библиотеки) -5. Дождаться завершения установки зависимостей, далее для запуска используется команда ```oscript main.os``` или отладчик VSCode +2. В каталоге вашего проекта разместите скачанный файл библиотеки (onecore-х.х.х.ospx) +3. Выполнить консольную команду: ```opm i -l -f onecore-x.x.x.ospx``` где "x.x.x" версия фреймворка (библиотеки) + +**Установка примера и запуск** + +1. Из каталога "simple" корневого каталога репозитория скопируйте содержимое нужного примера в каталог вашего проекта +2. Дождаться завершения установки зависимостей, далее для запуска используется команда ```oscript main.os``` или отладчик VSCode [Вернуться к началу](#header) @@ -110,6 +122,13 @@ OneCore - это web-фреймворк на движке onescript, созда Процедура ПриУстановкеПараметровСеанса(ПараметрыСеанса) Экспорт // Код, выполняемый при создании нового сеанса + // При выполнении данной процедуры будут доступны общие объекты +КонецПроцедуры + +Процедура ПриЗапускеПриложения(Отказ) Экспорт + // Код, выполняемый при запуске приложения, отказ отменит запуск, + // так же как и исключение + // При выполнении данной процедуры будут доступны общие объекты КонецПроцедуры ``` @@ -346,6 +365,33 @@ OneCore - это web-фреймворк на движке onescript, созда Перенаправление происходит ещё до автоматического формирования шаблонов и до выполнения обработчика пердставления в случае указания в перехватчике с обязательным прерыванием. +###### Произвольные обработчики + +По умолчанию в представлениях при обработке HTTP-запросов вызываются методы, соответствующие HTTP-методам (GET, POST, PUT, DELETE). Это создает ограничение при использовании одного файла для обработки нескольких связанных операций, например, для создания, обновления и удаления записи. Для расширения функциональности представлений реализована возможность указывать для маршрута один или несколько пользовательских обработчиков. Это достигается путем сопоставления HTTP-метода с именем процедуры, которая будет вызываться при обработке запроса. + +Пример использования: + +```bsl +Маршруты.Добавить("/persons/delete/<Число:ИдентификаторПользователя>", "ФизическиеЛица.Элемент").Имя("Удаление").Обработчик(МетодыHTTP.GET, "УдалитьЭлемент"); +``` + +Согласно примеру при запросе на адрес ```/persons/delete/1``` будет вызвана процедура ```УдалитьЭлемент``` представления ```ФизическиеЛица.Элемент```. + +###### Дочерние (подчиненные) маршруты + +В целях соблюдения принципов DRY при формировании маршрутов есть возможность создать дочерний маршрут к существующему. Этот механизм создает маршрут с копированием свойств родительского маршрута и добавляет префикс адреса родительского маршрута к адресу дочернего. Аналогичным образом формируется имя маршрута. Пример использования: + +```bsl +МаршрутыФизЛица = Маршруты.Добавить("/persons", "ФизическиеЛица.Список").Имя("ФизЛица"); // Адрес: /persons Имя: "Ядро.ФизЛица" +МаршрутыФизЛица.Дочерний("/create", "ФизическиеЛица.Элемент").Имя("Создание"); // Адрес: /persons/create Имя: "Ядро.ФизЛица.Создание" +МаршрутыФизЛица.Дочерний("/<Число:ИдентификаторПользователя>", "ФизическиеЛица.Элемент").Имя("Элемент"); // Адрес: /persons/<Число:ИдентификаторПользователя> Имя: "Ядро.ФизЛица.Элемент" +МаршрутыФизЛица.Дочерний("/delete/<Число:ИдентификаторПользователя>", "ФизическиеЛица.Элемент").Имя("Удаление").Обработчик(МетодыHTTP.GET, "УдалитьЭлемент"); // Адрес: /persons/delete/<Число:ИдентификаторПользователя> Имя: "Ядро.ФизЛица.Удаление" +``` + +Дочерние маршруты обладают всеми возможностями родительских маршрутов: можно указать имя, обработчик и дополнительные свойства. + +**Важно**: дочерний маршрут наследует адрес, имя и ключ представления родительского маршрута (если явно не указано иное). + ##### Результат примера Согласно тому, что мы указали, сервер, при обращении клиента к корневому адресу, будет переадресовывать выполнение в наш контроллер. Процедура "Добавить" принимает в себя 2 параметра, первый - это шаблон адреса, второй - строковый путь к объекту обработчика запроса через точку, при этом, если бы у нас объект обработчика находился не в корневом каталоге "Представления", а, например, в каталоге "Тестирование", тогда указание маршрута выглядело бы так ```Маршруты.Добавить("/", "Тестирование.Приветствие");```. @@ -596,6 +642,23 @@ OneCore - это web-фреймворк на движке onescript, созда Далее сервисы можно использовать в других сервисах и в представлениях любых компонентов приложения. +#### Общие объекты + +В модулях сервисов, компонентов, представлений и моделей, а также любых других объектов, созданных функцией "СоздатьОбъект" объекта "МенеджерОбъектов", автоматически будут устанавливаться объекты в одноименные глобальные переменные модуля. Доступные глобальные объекты: + +- МенеджерОбъектов +- Маршрутизатор +- МенеджерСеансов +- МенеджерORM + +То есть при объявлении глобальной переменной "Маршрутизатор" в неё будет помещен глобальный объект "Маршрутизатор": + +```bsl +Перем Маршрутизатор, МенеджерСеансов; +``` + +Следует учесть, что в модулях имена переменных зарезервированы согласно вышеуказанных глобальных объектов. + [Вернуться к началу](#header) ### Статические файлы diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\276\320\262.os" index 9e6e38e..9b5c625 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\276\320\262.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\276\320\262.os" @@ -56,7 +56,10 @@ Если Компонент <> Неопределено И НЕ Статический Тогда - КлючОбъекта = СтрШаблон("%1.%2.%3", Компонент.Имя(), "Представления", КлючОбъекта); + Если НЕ СтрНайти(КлючОбъекта, ".Представления.") Тогда + КлючОбъекта = СтрШаблон("%1.%2.%3", Компонент.Имя(), "Представления", КлючОбъекта); + КонецЕсли; + Адрес = ?(ПрефиксКомпонента, СтрШаблон("/%1%2", Компонент.ИмяЛатинское(), Адрес), Адрес); Если Адрес <> "/" Тогда @@ -81,7 +84,7 @@ Возврат Неопределено; КонецЕсли; - НовыйОбъект = Новый Маршрут(Адрес, КлючОбъекта, Компонент); + НовыйОбъект = Новый Маршрут(ЭтотОбъект, Адрес, КлючОбъекта, Компонент); НовыйОбъект.ТипОбъекта(Тип); НовыйОбъект.Статический(Статический); НовыйОбъект.КоличествоЧастейМаршрута(СтрРазделить(Адрес, "/", Ложь).Количество()); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202.os" index 5fe7ad9..c317b9f 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202.os" @@ -5,6 +5,7 @@ Перем ПутьКомпонента; Перем МодульКомпонента; Перем МоделиКомпонента; +Перем МенеджерОбъектов; Процедура ПриСозданииОбъекта(ИмяКомпонента, ИмяКомпонентаЛатинское, Отказ = Ложь) @@ -43,12 +44,17 @@ КонецПроцедуры -Процедура ВыполнитьОбработкуПриЗапуске() Экспорт +Процедура ВыполнитьОбработкуПриЗапуске(Отказ = Ложь) Экспорт ИмяМетода = "ПриЗапускеПриложения"; + МенеджерОбъектов.ПодключитьОбщиеОбъектыКОбъекту(МодульКомпонента); + Если Рефлексия.МетодСуществует(МодульКомпонента, ИмяМетода) Тогда - Рефлексия.ВызватьМетод(МодульКомпонента, ИмяМетода); + МассивПараметров = Новый Массив(); + МассивПараметров.Добавить(Отказ); + Рефлексия.ВызватьМетод(МодульКомпонента, ИмяМетода, МассивПараметров); + Отказ = МассивПараметров[0]; КонецЕсли; КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202.os" index 45799d0..48acf0d 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202.os" @@ -1,4 +1,6 @@ +Перем Коллекция; +Перем РодительскийМаршрут; Перем Имя; Перем Компонент; Перем АдресМаршрута; @@ -8,14 +10,17 @@ Перем КоличествоЧастейМаршрута; Перем СодержитПараметры; Перем Свойства; +Перем ПользовательскиеОбработчики; -Процедура ПриСозданииОбъекта(Адрес, Ключ, ПарКомпонент = Неопределено) +Процедура ПриСозданииОбъекта(ОбъектКоллекции, Адрес, Ключ, ПарКомпонент = Неопределено) АдресМаршрута = Адрес; КлючОбъекта = Ключ; Статический = Ложь; Свойства = Новый Структура(); + ПользовательскиеОбработчики = Новый Структура(); Компонент = ПарКомпонент; + Коллекция = ОбъектКоллекции; КонецПроцедуры @@ -31,6 +36,10 @@ Возврат Свойства; КонецФункции +Функция ПользовательскиеОбработчики() Экспорт + Возврат ПользовательскиеОбработчики; +КонецФункции + Функция Имя(Значение = Неопределено) Экспорт Если Значение = Неопределено Тогда @@ -41,7 +50,12 @@ ВызватьИсключение "Ожидается тип Строка"; КонецЕсли; - Имя = СтрШаблон("%1.%2", Компонент.Имя(), Значение); + Если РодительскийМаршрут = Неопределено Тогда + Имя = СтрШаблон("%1.%2", Компонент.Имя(), Значение); + Иначе + Имя = СтрШаблон("%1.%2", РодительскийМаршрут.Имя(), Значение); + КонецЕсли; + Возврат ЭтотОбъект; КонецФункции @@ -117,4 +131,28 @@ Свойства.Вставить(Ключ, Значение); Возврат ЭтотОбъект; +КонецФункции + +Функция Обработчик(Метод, ИмяПроцедуры) Экспорт + ПользовательскиеОбработчики.Вставить(Метод, ИмяПроцедуры); + Возврат ЭтотОбъект; +КонецФункции + +Функция Дочерний(Адрес, Ключ = Неопределено) Экспорт + + ДочернийМаршрут = Неопределено; + + КлючДочернего = ?(Ключ = Неопределено, КлючОбъекта, Ключ); + АдресДочернего = СтрШаблон("%1/%2", АдресМаршрута, ?(СтрНачинаетсяС(Адрес, "/"), Прав(Адрес, СтрДлина(Адрес) - 1), Адрес)); + + ДочернийМаршрут = Коллекция.Добавить(АдресДочернего, КлючДочернего); + + Если ДочернийМаршрут <> Неопределено Тогда + СвойстваПодчиненногоМаршрута = Коллекции.СкопироватьСтруктуру(Свойства); + Рефлексия.УстановитьСвойство(ДочернийМаршрут, "РодительскийМаршрут", ЭтотОбъект); + Рефлексия.УстановитьСвойство(ДочернийМаршрут, "Свойства", СвойстваПодчиненногоМаршрута); + КонецЕсли; + + Возврат ДочернийМаршрут; + КонецФункции \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\270\320\267\320\260\321\202\320\276\321\200.os" index 119e240..c02aa12 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\260\321\200\321\210\321\200\321\203\321\202\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -52,6 +52,7 @@ Если ТипЗнч(НовыйМаршрут) = Тип("Маршрут") Тогда Рефлексия.УстановитьСвойство(НовыйМаршрут, "Компонент", Маршрут.Компонент()); Рефлексия.УстановитьСвойство(НовыйМаршрут, "Имя", Маршрут.Имя()); + Рефлексия.УстановитьСвойство(НовыйМаршрут, "ПользовательскиеОбработчики", Маршрут.ПользовательскиеОбработчики()); Коллекции.ДополнитьСтруктуру(НовыйМаршрут.Свойства(), Маршрут.Свойства()); КонецЕсли; @@ -282,7 +283,11 @@ КонецЕсли; КонецЕсли; - Рефлексия.ВызватьМетод(ИсполняемыйОбъект, ТипЗапроса, МассивПараметровВызова); + ПользовательскийОбработчик = Неопределено; + Маршрут.ПользовательскиеОбработчики().Свойство(ТипЗапроса, ПользовательскийОбработчик); + ВызываемыйМетод = ?(ПользовательскийОбработчик = Неопределено, ТипЗапроса, ПользовательскийОбработчик); + + Рефлексия.ВызватьМетод(ИсполняемыйОбъект, ВызываемыйМетод, МассивПараметровВызова); // Если не указана кодировка, то добавляем UTF-8 Если СтрНайти(Ответ.ТипКонтента, "") ИЛИ НЕ СтрНайти(НРег(Строка(Ответ.ТипКонтента)), "charset=") Тогда diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\276\320\262.os" index 23c9f21..f9a743b 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\276\320\262.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\276\320\262.os" @@ -44,11 +44,22 @@ КонецПроцедуры -Процедура ВыполнитьОбработчикиПриЗапуске() Экспорт +Процедура ВыполнитьОбработчикиПриЗапуске(Отказ = Ложь) Экспорт // Выполняем обработчики для каждого компонента в фоновом режиме Для каждого Компонент Из Компоненты Цикл - ФоновыеЗадания.Выполнить(Компонент, "ВыполнитьОбработкуПриЗапуске"); + + Попытка + Компонент.ВыполнитьОбработкуПриЗапуске(Отказ); + Исключение + Отказ = Истина; + Лог.Ошибка(СтрШаблон("При выполнении обработчика при запуске приложения компонента %1 возникла ошибка: %2", Компонент.Имя(), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + КонецПопытки; + + Если Отказ Тогда + Лог.Предупреждение(СтрШаблон("Обработка при запуске компонента %1 вызвала отказ", Компонент.Имя())); + КонецЕсли; + КонецЦикла; КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" index 612d308..3284642 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" @@ -78,6 +78,8 @@ Рефлексия.УстановитьСвойство(Объект, СвойствоМенеджера.Имя, ЭкземплярМенеджера); КонецЦикла; + ПодключитьОбщиеОбъектыКОбъекту(Объект); + Возврат Объект; КонецФункции @@ -104,6 +106,22 @@ КонецПроцедуры +Процедура ПодключитьОбщиеОбъектыКОбъекту(Объект) Экспорт + + ОбщиеОбъекты = Новый Структура(); + ОбщиеОбъекты.Вставить("МенеджерОбъектов", ЭтотОбъект); + ОбщиеОбъекты.Вставить("Маршрутизатор", Приложение.Маршрутизатор()); + ОбщиеОбъекты.Вставить("МенеджерСеансов", Приложение.МенеджерСеансов()); + ОбщиеОбъекты.Вставить("МенеджерORM", Приложение.МенеджерORM()); + + Для каждого ОбщийОбъект Из ОбщиеОбъекты Цикл + Если Рефлексия.СвойствоСуществует(Объект, ОбщийОбъект.Ключ) Тогда + Рефлексия.УстановитьСвойство(Объект, ОбщийОбъект.Ключ, ОбщийОбъект.Значение); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + Функция ИмяТипаПоКлючу(Ключ, ЭтоМодель = Ложь) Экспорт Имя = ""; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\241\320\273\321\203\320\266\320\265\320\261\320\275\320\276\320\265.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\241\320\273\321\203\320\266\320\265\320\261\320\275\320\276\320\265.os" index d21638d..8677582 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\241\320\273\321\203\320\266\320\265\320\261\320\275\320\276\320\265.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\241\320\273\321\203\320\266\320\265\320\261\320\275\320\276\320\265.os" @@ -14,7 +14,7 @@ ПотокОтвета = Новый ПотокВПамяти(); Запрос.Тело.КопироватьВ(ПотокОтвета); ДД = ПотокОтвета.ЗакрытьИПолучитьДвоичныеДанные(); - Возврат ПолучитьСтрокуИзДвоичныхДанных(ДД); + Возврат СтрЗаменить(ПолучитьСтрокуИзДвоичныхДанных(ДД), "+", "%20"); КонецФункции diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" index 582df41..b67aeea 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" @@ -68,7 +68,13 @@ Маршрутизатор = Новый Маршрутизатор(СвойстваМаршрутовПоУмолчанию); - МенеджерКомпонентов.ВыполнитьОбработчикиПриЗапуске(); + Отказ = Ложь; + + МенеджерКомпонентов.ВыполнитьОбработчикиПриЗапуске(Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; Порт = Настройки.Получить("Приложение.ПортПрослушивания");