1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-05 12:50:36 +02:00

Merge pull request #141 from bia-technologies/feature/pause

Реализация кроссплатформеной паузы
This commit is contained in:
Koryakin Aleksey 2023-08-23 01:35:11 +03:00 committed by GitHub
commit f4f5f7a5fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 477 additions and 17 deletions

View File

@ -26,6 +26,7 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьПараметры");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикАнализПараметровЗапуска");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПодключитьКомпоненты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата");
@ -158,6 +159,13 @@
КонецПроцедуры
Процедура ОбработчикПодключитьКомпоненты(Результат, ДополнительныеПараметры) Экспорт
ЮТКомпонентыКлиент.ТихаяУстановкаКомпонент();
ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено)

View File

@ -0,0 +1,104 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ПрограммныйИнтерфейс
// Возвращает внешнюю компоненту, реализующую паузу
//
// Возвращаемое значение:
// ВнешнийОбъект
Функция Пауза() Экспорт
Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза());
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Создает внешнюю компоненту по описанию
//
// Параметры:
// ОписаниеКомпоненты - см. ОписаниеКомпоненты
//
// Возвращаемое значение:
// ВнешнийОбъект
Функция СоздатьКомпоненту(ОписаниеКомпоненты) Экспорт
Если ПодключитьКомпоненту(ОписаниеКомпоненты.ИмяМакета, ОписаниеКомпоненты.ИмяКомпоненты, Истина) Тогда
Возврат Новый (ОписаниеКомпоненты.ИмяКласса);
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту " + ОписаниеКомпоненты.ИмяКласса;
КонецЕсли;
КонецФункции
// Подключает внещнюю компоненту из макета
//
// Параметры:
// ИмяМакета - Строка - Имя макета, в котором хранится компонента
// ИмяКомпоненты - Строка - Имя компоненты
// Кэшировать - Булево - Кэшировать создание компоненты
//
// Возвращаемое значение:
// Булево - Успешность подключения
Функция ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты, Кэшировать) Экспорт
Если Кэшировать Тогда
Возврат ЮТПовторногоИспользования.ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты);
КонецЕсли;
Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
КонецФункции
// Описание компоненты реализующей паузу.
//
// Возвращаемое значение:
// см. ОписаниеКомпоненты
Функция ОписаниеКомпонентыПауза() Экспорт
Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТYaxUnitAddIn", "YaxUnitAddin", "Sleep");
КонецФункции
// Описание внешней компоненты.
//
// Параметры:
// ИмяМакета - Строка - Имя макета, в котором хранится компонента
// ИмяКомпоненты - Строка -Имя компоненты
// ИмяКласса - Строка - Имя класса, по которому создается компонента
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - Описание компоненты:
// * ИмяМакета - Строка - Имя макета, в котором хранится компонента
// * ИмяКомпоненты - Строка -Имя компоненты
// * ИмяКласса - Строка - Имя класса
Функция ОписаниеКомпоненты(ИмяМакета, ИмяКомпоненты, ИмяКласса) Экспорт
Описание = Новый Структура;
Описание.Вставить("ИмяМакета", ИмяМакета);
Описание.Вставить("ИмяКомпоненты", ИмяКомпоненты);
Описание.Вставить("ИмяКласса", СтрШаблон("AddIn.%1.%2", ИмяКомпоненты, ИмяКласса));
Возврат Новый ФиксированнаяСтруктура(Описание);
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="76e16534-934b-43af-9f91-4a2849ed5f35">
<name>ЮТКомпоненты</name>
<synonym>
<key>ru</key>
<value>Компоненты</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,108 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Функция ФайлКомпоненты(Знач ИмяМакета, Знач ОперационнаяСистема, Знач Архитектура) Экспорт
Данные = ЮТОбщийВызовСервера.Макет(ИмяМакета);
ЧтениеАрхива = Новый ЧтениеZipФайла();
ЧтениеАрхива.Открыть(Данные.ОткрытьПотокДляЧтения());
ИмяФайлаКомпоненты = ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура);
Если ИмяФайлаКомпоненты = Неопределено Тогда
ВызватьИсключение "Компонента не поддерживает клиентское окружение";
КонецЕсли;
Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайлаКомпоненты);
Возврат Новый ФиксированнаяСтруктура("ИмяФайла, Данные", ИмяФайлаКомпоненты, Данные);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура)
Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, "MANIFEST.XML");
Если Данные = Неопределено Тогда
ВызватьИсключение "Архив компоненты не содержит манифеста";
КонецЕсли;
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьПоток(Данные.ОткрытьПотокДляЧтения());
ИмяФайлаКомпоненты = Неопределено;
Пока ЧтениеXML.Прочитать() Цикл
Если ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура) Тогда
ИмяФайлаКомпоненты = ЧтениеXML.ЗначениеАтрибута("path");
Прервать;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Возврат ИмяФайлаКомпоненты;
КонецФункции
Функция ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура)
Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента ИЛИ СтрСравнить(ЧтениеXML.Имя, "component") <> 0 Тогда
Возврат Ложь;
КонецЕсли;
ОперационнаяСистемаУзла = ЧтениеXML.ЗначениеАтрибута("os");
АрхитектураУзла = ЧтениеXML.ЗначениеАтрибута("arch");
Возврат ОперационнаяСистема = ОперационнаяСистемаУзла И Архитектура = АрхитектураУзла;
КонецФункции
Функция ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайла)
ЭлементФайла = Неопределено;
Для Каждого Элемент Из ЧтениеАрхива.Элементы Цикл
Если СтрСравнить(Элемент.ПолноеИмя, ИмяФайла) = 0 Тогда
ЭлементФайла = Элемент;
КонецЕсли;
КонецЦикла;
Если ЭлементФайла = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ЧтениеАрхива.Извлечь(ЭлементФайла, ИмяВременногоФайла, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Данные = Новый ДвоичныеДанные(ЮТФайлы.ОбъединитьПути(ИмяВременногоФайла, ИмяФайла));
УдалитьФайлы(ИмяВременногоФайла);
Возврат Данные;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="20617de9-dab7-4587-a43a-4330e51bbc64">
<name>ЮТКомпонентыВызовСервера</name>
<synonym>
<key>ru</key>
<value>Компоненты вызов сервера</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,113 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Функция ТихаяУстановкаКомпонент() Экспорт
Успешно = Истина;
#Если Клиент И НЕ ВебКлиент Тогда
Компоненты = ЮТОбщий.ЗначениеВМассиве(ЮТКомпоненты.ОписаниеКомпонентыПауза());
Для Каждого Компонента Из Компоненты Цикл
ТихаяУстановкаВнешнейКомпоненты(Компонента.ИмяМакета);
КонецЦикла;
#КонецЕсли
Возврат Успешно;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ТихаяУстановкаВнешнейКомпоненты(ИмяМакета)
Информация = Новый СистемнаяИнформация();
ОперационнаяСистема = Неопределено;
Архитектура = Неопределено;
Linux = "Linux";
Windows = "Windows";
MacOS = "MacOS";
x86 = "i386";
x64 = "x86_64";
ТипКлиентскойПлатформы = Информация.ТипПлатформы;
Если ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86 Тогда
ОперационнаяСистема = Linux;
Архитектура = x86;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86_64 Тогда
ОперационнаяСистема = Linux;
Архитектура = x64;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86 Тогда
ОперационнаяСистема = Windows;
Архитектура = x86;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ОперационнаяСистема = Windows;
Архитектура = x64;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86 Тогда
ОперационнаяСистема = MacOS;
Архитектура = x86;
ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86_64 Тогда
ОперационнаяСистема = MacOS;
Архитектура = x64;
Иначе
ВызватьИсключение "Неподдерживаемый тип платформы";
КонецЕсли;
ДанныеФайла = ЮТКомпонентыВызовСервера.ФайлКомпоненты(ИмяМакета, ОперационнаяСистема, Архитектура);
Путь = РабочийКаталогДанныхПользователя();
КорневойКаталог = ЮТФайлы.ОбъединитьПути(Путь, "..", "..", "..");
КаталогКомпонент = ЮТФайлы.ОбъединитьПути(КорневойКаталог, "ExtCompT");
ФайлРеестра = ЮТФайлы.ОбъединитьПути(КаталогКомпонент, "registry.xml");
ФайлКомпоненты = ЮТФайлы.ОбъединитьПути(КаталогКомпонент, ДанныеФайла.ИмяФайла);
ДанныеФайла.Данные.Записать(ФайлКомпоненты);
ЗаписатьВРеестр(ФайлРеестра, ДанныеФайла.ИмяФайла);
КонецПроцедуры
Процедура ЗаписатьВРеестр(ФайлРеестра, ИмяФайла)
Данные = Новый ДвоичныеДанные(ФайлРеестра);
Текст = ПолучитьСтрокуИзДвоичныхДанных(Данные);
Если СтрНайти(Текст, "<component") = 0 Тогда // Файл пустой
Текст = СтрШаблон("<?xml version=""1.0"" encoding=""UTF-8""?>
|<registry xmlns=""http://v8.1c.ru/8.2/addin/registry"">
| <component path=""%1"" type=""native""/>
|</registry>", ИмяФайла);
ИначеЕсли СтрНайти(Текст, СтрШаблон("path=""%1""", ИмяФайла)) <> 0 Тогда // Компонента уже зарегистрированна
Возврат;
Иначе // Добавляем компоненту
Запись = СтрШаблон(" <component path=""%1"" type=""native""/>", ИмяФайла);
Текст = СтрЗаменить(Текст, "</registry>", Запись + Символы.ПС + "</registry>");
КонецЕсли;
Данные = ПолучитьДвоичныеДанныеИзСтроки(Текст, КодировкаТекста.UTF8, Истина);
Данные.Записать(ФайлРеестра);
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="fde2e089-b73c-4596-b283-959c570ff45d">
<name>ЮТКомпонентыКлиент</name>
<synonym>
<key>ru</key>
<value>Компоненты клиент</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -841,6 +841,16 @@
КонецПроцедуры
// Преостанавливает поток выполнения на указанное количество секунд
//
// Параметры:
// Время - Число - Продолжительность паузы в секундах, возможно указывать дробное значение
Процедура Пауза(Время) Экспорт
ЮТКомпоненты.Пауза().Sleep(Цел(1000 * Время));
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -46,4 +46,33 @@
КонецФункции
Функция Макет(ИмяМакета) Экспорт
ЧастиИмени = СтрРазделить(ИмяМакета, ".");
Если ЧастиИмени.Количество() < 2 Тогда
ВызватьИсключение СтрШаблон("Некорректно имя макет, если вы хотите получить данные общего макета необходимо указать `ОбщийМакет.%1`",
ИмяМакета);
КонецЕсли;
ИндексОбласти = 0;
Если СтрСравнить(ЧастиИмени[0], "ОбщийМакет") = 0 Тогда
Макет = ПолучитьОбщийМакет(ЧастиИмени[1]);
ИндексОбласти = 2;
ИначеЕсли ЧастиИмени.Количество() >= 3 Тогда
Менеджер = Менеджер(СтрШаблон("%1.%2", ЧастиИмени[0], ЧастиИмени[1]));
Макет = Менеджер.ПолучитьМакет(ЧастиИмени[2]);
ИндексОбласти = 3;
Иначе
ВызватьИсключение СтрШаблон("Некорректное имя макета `%1`", ИмяМакета);
КонецЕсли;
Если ЧастиИмени.Количество() > ИндексОбласти Тогда
Макет = Макет.ПолучитьОбласть(ЧастиИмени[ИндексОбласти]);
КонецЕсли;
Возврат Макет;
КонецФункции
#КонецОбласти

View File

@ -42,4 +42,10 @@
КонецФункции
Функция ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты) Экспорт
Возврат ЮТКомпоненты.ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты, Ложь);
КонецФункции
#КонецОбласти

View File

@ -77,26 +77,28 @@
// Параметры:
// Путь1 - Строка - базовый путь к каталогу
// Путь2 - Строка - относительный путь к вложенному элементу
// Путь3 - Строка - относительный путь к вложенному элементу
// Путь4 - Строка - относительный путь к вложенному элементу
// Путь5 - Строка - относительный путь к вложенному элементу
//
// Возвращаемое значение:
// Строка - Объединенный путь
Функция ОбъединитьПути(Путь1, Путь2) Экспорт
Функция ОбъединитьПути(Путь1, Путь2, Путь3 = Неопределено, Путь4 = Неопределено, Путь5 = Неопределено) Экспорт
Результат = Неопределено;
Разделитель = ПолучитьРазделительПути();
Если ЗначениеЗаполнено(Путь1) И ЗначениеЗаполнено(Путь2) Тогда
Разделитель = ПолучитьРазделительПути();
Если НЕ СтрЗаканчиваетсяНа(Путь1, Разделитель) И НЕ СтрНачинаетсяС(Разделитель, Путь2) Тогда
Результат = СтрШаблон("%1%2%3", Путь1, Разделитель, Путь2);
Иначе
Результат = Путь1 + Путь2;
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(Путь1) Тогда
Результат = Путь1;
Иначе
Результат = Путь2;
Результат = ДополнитьПуть(Путь1, Путь2, Разделитель);
Если Путь3 <> Неопределено Тогда
Результат = ДополнитьПуть(Результат, Путь3, Разделитель);
КонецЕсли;
Если Путь4 <> Неопределено Тогда
Результат = ДополнитьПуть(Результат, Путь4, Разделитель);
КонецЕсли;
Если Путь5 <> Неопределено Тогда
Результат = ДополнитьПуть(Результат, Путь5, Разделитель);
КонецЕсли;
Возврат Результат;
@ -174,4 +176,26 @@
КонецПроцедуры
#КонецЕсли
Функция ДополнитьПуть(Путь1, Путь2, Разделитель)
Результат = Неопределено;
Если ЗначениеЗаполнено(Путь1) И ЗначениеЗаполнено(Путь2) Тогда
Если НЕ СтрЗаканчиваетсяНа(Путь1, Разделитель) И НЕ СтрНачинаетсяС(Разделитель, Путь2) Тогда
Результат = СтрШаблон("%1%2%3", Путь1, Разделитель, Путь2);
Иначе
Результат = Путь1 + Путь2;
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(Путь1) Тогда
Результат = Путь1;
Иначе
Результат = Путь2;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="28fa5c27-1be9-4b6d-b814-c72dd59f398c">
<name>ЮТYaxUnitAddIn</name>
<synonym>
<key>ru</key>
<value>ЮТYax unit add in</value>
</synonym>
<templateType>AddIn</templateType>
</mdclass:CommonTemplate>

View File

@ -43,6 +43,7 @@
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеИмена_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеОтчества_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеФамилии_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТYaxUnitAddIn</commonTemplates>
<commonTemplates>CommonTemplate.ЮТОписаниеМетаданных</commonTemplates>
<commonModules>CommonModule.Мокито</commonModules>
<commonModules>CommonModule.МокитоОбучение</commonModules>
@ -55,6 +56,9 @@
<commonModules>CommonModule.ЮТИсполнительКлиент</commonModules>
<commonModules>CommonModule.ЮТИсполнительКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТИсполнительСервер</commonModules>
<commonModules>CommonModule.ЮТКомпоненты</commonModules>
<commonModules>CommonModule.ЮТКомпонентыВызовСервера</commonModules>
<commonModules>CommonModule.ЮТКомпонентыКлиент</commonModules>
<commonModules>CommonModule.ЮТКонструкторВариантов</commonModules>
<commonModules>CommonModule.ЮТКонструкторТестовыхДанныхСлужебный</commonModules>
<commonModules>CommonModule.ЮТКонтекст</commonModules>

View File

@ -25,10 +25,24 @@
.ДобавитьТест("ОбъединитьВСтруктуру")
.ДобавитьТест("СформироватьСтрокуСимволов")
.ДобавитьТест("ДанныеСовпадают")
.ДобавитьТест("Пауза")
;
КонецПроцедуры
Процедура Пауза() Экспорт
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТОбщий.Пауза(1);
ЮТОбщий.Пауза(1);
ЮТОбщий.Пауза(1);
Дельта = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
ЮТест.ОжидаетЧто(Дельта)
.МеждуИсключаяГраницы(3010, 3050);
КонецПроцедуры
Процедура ДобавитьСтроку() Экспорт
Варианты = ЮТест.Варианты("Исходная, Дополнение, Разделитель, Результат")

View File

@ -93,7 +93,7 @@
Наборы = ЮТЧитатель.ЗагрузитьТесты(ПараметрыЗапуска);
ЮТест.ОжидаетЧто(Наборы, "Прочитанные наборы расширения tests")
.ИмеетДлину(21);
.ИмеетДлину(22);
КонецПроцедуры
@ -158,4 +158,4 @@
КонецПроцедуры
#КонецОбласти
#КонецОбласти