Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Модификация обработки ЗакрытьПредприятие.epf - сохранение свойств конфигурации в файл #598

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -443,17 +443,19 @@ call vrunner <параметры запуска>

В папке epf есть несколько обработок, позволяющих упростить развертывание/тестирование для конфигураций, основанных на БСП.

+ Основной пример (см. ниже пример вызова) - это передача через параметры `/C` команды `"ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы"` и одновременная передача через `/Execute "ЗакрытьПредприятие.epf"`.
+ **ЗакрытьПредприятие** Основной пример (см. ниже пример вызова) - это передача через параметры `/C` команды `"ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы"` и одновременная передача через `/Execute "ЗакрытьПредприятие.epf"`.

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

+ также выполняется отключение запроса при завершении работы программы для БСП-конфигураций

+ код запуска

```bat
@call vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute $runnerRoot\epf\ЗакрытьПредприятие.epf
```
```bat
@call vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute $runnerRoot\epf\ЗакрытьПредприятие.epf
```

+ позволяет записать часть свойств конфигурации в файл (кроме свойств, записывается признак КонфигурацияИзменена, показывающий, что текущая конфигурация не совпадает с конфигурацией ИБ). Для этого в параметре запуска необходимо указать путь к файлу для сохранения свойств `configPropsPath=[ПутьКФайлуСвойствКонфигурации]`

+ **ЗагрузитьРасширение** позволяет подключать расширение в режиме предприятия и получать результат ошибки. Предназначено для подключения в конфигурациях, основанных на БСП. В параметрах /C передается путь к расширению и путь к файлу лога подключения.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,37 +23,142 @@
|""ЗапрашиватьПодтверждениеПриЗавершенииПрограммы"", Ложь);");
Исключение
// Данного модуля и метода может не быть в конфигурации
КонецПопытки;
КонецПопытки;

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

Если Не ЭтоКонфигурацияНаБазеБСПСервер() Тогда
ПрекратитьРаботуСистемы();
//Сообщить("Заглушка - завершаем работу системы");
Возврат;
КонецЕсли;
КонецЕсли;

ПараметрыЗапуска = СтрРазделить(ПараметрЗапуска, ";", Ложь);
СтрокаПоиска = "exitCodePath=";
Для каждого Стр из ПараметрыЗапуска Цикл
Если СтрНайти(Стр, СтрокаПоиска) > 0 Тогда
ПутьКФайлуРезультата = СтрЗаменить(Стр, СтрокаПоиска, "");
Сообщить("Путь файла лога " + ПутьКФайлуРезультата);
УдалитьФайлРезультата();
Прервать;
КонецЕсли;
КонецЦикла;
ОпределитьПутиИзПараметраЗапуска();
Если Не ПустаяСтрока(ПутьКФайлуРезультата) Тогда
УдалитьФайлБезопасно(ПутьКФайлуРезультата);
Сообщить("Путь файла лога " + ПутьКФайлуРезультата);
КонецЕсли;
Если Не ПустаяСтрока(ПутьКФайлуСвойствКонфигурации) Тогда
УдалитьФайлБезопасно(ПутьКФайлуСвойствКонфигурации);
Сообщить("Путь файла свойств конфигурации " + ПутьКФайлуСвойствКонфигурации);
ЗаписатьСвойстваКонфигурации();
КонецЕсли;

ПодключитьОбработчикОжидания("ПроверитьНеобходимостьЗавершенияПрограммы", 10, Истина);
ПодключитьОбработчикОжидания("ПроверитьЛегальностьОбновления", 2);
Если СуществуетПодсистемаМультиязычность() Тогда
ПодключитьОбработчикОжидания("ПроверитьРегиональныеНастройки", 2);
ПроверитьРегиональныеНастройки();
КонецЕсли;
КонецЕсли;

ПроверитьНеобходимостьЗавершенияПрограммы();
ПроверитьЛегальностьОбновления();
КонецПроцедуры
ПроверитьЛегальностьОбновления();

КонецПроцедуры

&НаКлиенте
Процедура ОпределитьПутиИзПараметраЗапуска()

ОписанияПутей = Новый Структура;
ОписанияПутей.Вставить("ПутьКФайлуРезультата", "exitCodePath");
ОписанияПутей.Вставить("ПутьКФайлуСвойствКонфигурации", "configPropsPath");

ПараметрыЗапуска = СтрРазделить(ПараметрЗапуска, ";", Ложь);
Для Каждого ЧастьПараметраЗапуска из ПараметрыЗапуска Цикл

Для Каждого ЭлементОписанияПути Из ОписанияПутей Цикл

Если Не ПустаяСтрока(ЭтаФорма[ЭлементОписанияПути.Ключ]) Тогда
Продолжить;
КонецЕсли;

СтрокаПоиска = ЭлементОписанияПути.Значение + "=";
ПозицияКлючаПути = СтрНайти(ВРег(ЧастьПараметраЗапуска), ВРег(СтрокаПоиска));

Если ПозицияКлючаПути > 0 Тогда
ПутьКФайлу = Сред(ЧастьПараметраЗапуска, ПозицияКлючаПути + СтрДлина(СтрокаПоиска));
Если СтрНачинаетсяС(ПутьКФайлу, """") Тогда
ПутьКФайлу = Сред(ПутьКФайлу, 2);
КонецЕсли;
Если СтрЗаканчиваетсяНа(ПутьКФайлу, """") Тогда
ПутьКФайлу = Лев(ПутьКФайлу, СтрДлина(ПутьКФайлу) - 1);
КонецЕсли;
ЭтаФорма[ЭлементОписанияПути.Ключ] = ПутьКФайлу;
Прервать;
КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьСвойстваКонфигурации()

Попытка
ТекстовыйФайл = Новый ТекстовыйДокумент();
ТекстовыйФайл.УстановитьТекст(ТекстСвойствКонфигурации());
ТекстовыйФайл.Записать(ПутьКФайлуСвойствКонфигурации, КодировкаТекста.UTF8);
Исключение
ТекстСообщения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписатьВЖурналРегистрации(ТекстСообщения);
КонецПопытки;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ТекстСвойствКонфигурации()

ЗаписываемыеСвойства = Новый Структура;

// Заполним часть свойств из метаданных конфигурации
ЗаписываемыеСвойства.Вставить("АвторскиеПрава");
ЗаписываемыеСвойства.Вставить("АдресИнформацииОКонфигурации");
ЗаписываемыеСвойства.Вставить("АдресИнформацииОПоставщике");
ЗаписываемыеСвойства.Вставить("АдресКаталогаОбновлений");
ЗаписываемыеСвойства.Вставить("ВариантВстроенногоЯзыка");
ЗаписываемыеСвойства.Вставить("Версия");
ЗаписываемыеСвойства.Вставить("Имя");
ЗаписываемыеСвойства.Вставить("ИспользоватьОбычныеФормыВУправляемомПриложении");
ЗаписываемыеСвойства.Вставить("ИспользоватьУправляемыеФормыВОбычномПриложении");
ЗаписываемыеСвойства.Вставить("Комментарий");
ЗаписываемыеСвойства.Вставить("КраткаяИнформация");
ЗаписываемыеСвойства.Вставить("Поставщик");

ЗаполнитьЗначенияСвойств(ЗаписываемыеСвойства, Метаданные);

// Дополним свойства другими данными
ЗаписываемыеСвойства.Вставить("КонфигурацияИзменена", КонфигурацияИзменена());

// Почистим записываемые данные
ПустыеКлючи = Новый Массив;
ДопустимыеТипы = Новый ОписаниеТипов("Булево, Строка, Дата, Число");

Для Каждого ЭлементСвойств Из ЗаписываемыеСвойства Цикл
Если ЭлементСвойств.Значение = Неопределено Тогда
ПустыеКлючи.Добавить(ЭлементСвойств.Ключ);
Продолжить;
КонецЕсли;
Если Не ДопустимыеТипы.СодержитТип(ТипЗнч(ЭлементСвойств.Значение)) Тогда
ЗаписываемыеСвойства.Вставить(ЭлементСвойств.Ключ, Строка(ЭлементСвойств.Значение));
КонецЕсли;
КонецЦикла;

Для Каждого ПустойКлюч Из ПустыеКлючи Цикл
ЗаписываемыеСвойства.Удалить(ПустойКлюч);
КонецЦикла;

// Сериализуем свойства в JSON
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ЗаписываемыеСвойства);
ТекстСвойствКонфигурации = ЗаписьJSON.Закрыть();

Возврат ТекстСвойствКонфигурации;

КонецФункции

&НаКлиенте
Процедура ПроверитьНеобходимостьЗавершенияПрограммы() Экспорт
Expand Down Expand Up @@ -148,7 +253,11 @@

Если НеобходимоОжидание И Не МожноЗавершатьРаботу И СчетчикОжиданияРезультатов <= МаксИтерацийОжиданияРезультатов Тогда
СчетчикОжиданияРезультатов = СчетчикОжиданияРезультатов + 1;
ПодключитьОбработчикОжидания("ПроверитьНеобходимостьЗавершенияПрограммы", 10, Истина);
ПодключитьОбработчикОжидания("ПроверитьНеобходимостьЗавершенияПрограммы", 10, Истина);
Если СчетчикОжиданияРезультатов <= МаксИтерацийОжиданияРезультатов Тогда
Сообщить("Ожидание при завершении программы. Итерация " +
СчетчикОжиданияРезультатов + " из " + МаксИтерацийОжиданияРезультатов);
КонецЕсли;
КонецЕсли;

МожемЗавершатьРаботу = Ложь;
Expand All @@ -161,10 +270,8 @@
КонецЕсли;

Если МожемЗавершатьРаботу И НеобходимоОжидание Тогда
Сообщить(""+ТекущаяДата() + " - "+"Завершаем работу");

Сообщить("" + ТекущаяДата() + " - " + "Завершаем работу");
ПодключитьОбработчикОжидания("ЗавершитьРаботу", 1, Истина);

КонецЕсли;

КонецПроцедуры
Expand Down Expand Up @@ -252,21 +359,26 @@
Возврат;
КонецЕсли;

ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст("0");
ТекстовыйФайл.Записать(ПутьКФайлуРезультата, КодировкаТекста.UTF8);
Попытка
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст("0");
ТекстовыйФайл.Записать(ПутьКФайлуРезультата, КодировкаТекста.UTF8);
Исключение
ТекстСообщения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписатьВЖурналРегистрации(ТекстСообщения);
КонецПопытки;

КонецПроцедуры

&НаКлиенте
Процедура УдалитьФайлРезультата()
Процедура УдалитьФайлБезопасно(ПутьКФайлу = Неопределено)

Если ПутьКФайлуРезультата = "" Тогда
Если ПустаяСтрока(ПутьКФайлу) Тогда
Возврат;
КонецЕсли;

Попытка
УдалитьФайлы(ПутьКФайлуРезультата);
УдалитьФайлы(ПутьКФайлу);
Исключение
ТекстСообщения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписатьВЖурналРегистрации(ТекстСообщения);
Expand Down