diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..1406bbf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,26 @@ +--- +name: Сообщение об ошибке +about: Сообщите нам об ошибке, чтобы помочь нам улучшить продукт + +--- + +**Описание ошибки** +что конкретно происходит + +**Сценарий воспроизведения** +Шаги по воспроизведению: +1. Открыть '...' +2. Нажать '....' +3. Запустить '....' +4. Опишите, что есть ошибка по вашему мнению и почему + +**Ожидаемое поведение** +какое правильное поведение + +**Скриншоты, логи, ЖР** +* скриншоты очень сильно помогают +* добавте логи из Журнала Регистрации, из лог-файлов (убедитесь что они не содержат приватной информации) + +**Дополнительная информация** + +[что еще необходимо уточнить?] diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..d677d9f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,25 @@ +--- +name: Добавление новой функциональности +about: предложение новой идеи или функциональности к разработке + +--- + +**Существует проблема** +Описание существующей проблемы [...] + +**Хотелось бы иметь следующую функциональность** +Вариант реализации [...] + +**Расширение или улучшение?** + +Это улучшение конфигурации 1С:ГитКонвертер потому что [...] + +Это функциональность можно реализовать в расширении. + +**Дополнительный контекст** +Любая дополнительная информация + + \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/bug_fix.md b/.github/PULL_REQUEST_TEMPLATE/bug_fix.md new file mode 100644 index 0000000..011e9b8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/bug_fix.md @@ -0,0 +1,16 @@ +# Что делает этот запрос на объединение? + +Исправление ошибки [...] + + +# Этот PR соответствует критериям принятия? + +- [ ] Я подтверждаю, что [являюсь правообладателем кода или публикую с его согласия](CONTRIBUTING.md#Лицензия) +- [ ] Соответствует [Стандартам и методикам разработки](https://its.1c.ru/db/v8std) +- [ ] Ветка не имеет конфликтов объединения с `develop` (если имеет - rebase пожалуйста) +- [ ] [Squashed related commits together](https://git-scm.com/book/ru/v1/Инструменты-Git-Перезапись-истории#Уплотнение-коммитов) + + +# Номера зависимых тикетов? + +Closes #123 \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/feature.md b/.github/PULL_REQUEST_TEMPLATE/feature.md new file mode 100644 index 0000000..2cbc6fd --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/feature.md @@ -0,0 +1,21 @@ +# Что делает этот запрос на объединение? + +Новая функциональность [...] + +# Скриншоты + +- ? + +# Этот PR соответствует критериям принятия? + +- [ ] Я подтверждаю, что [являюсь правообладателем кода или публикую с его согласия](CONTRIBUTING.md#Лицензия) +- [ ] [Changelog запись]() добавлена +- [ ] [файл README.md]() обновлен +- [ ] Соответствует [Стандартам и методикам разработки](https://its.1c.ru/db/v8std) +- [ ] Ветка не имеет конфликтов объединения с `develop` (если имеет - rebase пожалуйста) +- [ ] [Squashed related commits together](https://git-scm.com/book/ru/v1/Инструменты-Git-Перезапись-истории#Уплотнение-коммитов) + + +# Номера зависимых тикетов? + +Closes #123 \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ea2bd6c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,100 @@ +# Участие в проекте 1С:ГитКонвертер + +Вначале, хотим поблагодарить Вас за желание участвовать в проекте! + +Далее описаны советы, как сделать свое участие наиболее эффективным для проекта и для себя. Это не жесткие правила, поэтому используйте свой разум, если здесь что-либо не описано. + +## У меня есть вопрос + + +1. Для начала убедитесь, что ответа нет в самой конфигурации 1С:ГитКонвертер в справке или подсказке к полям и командам. +2. Расширенная информация есть в [Wiki](https://github.com/1C-Company/GitConverter/wiki) - стоит ее прочитать +3. Так же есть [FAQ](https://github.com/1C-Company/GitConverter/wiki/Если-что-то-пошло-не-так-FAQ) с наиболее частыми вопросами + +**Вопрос есть, но ответа не нашел?** Создай `issue` + +## Сообщить об ошибке + +Печально, что ошибка существует, но мы благодарны, что вы о ней нам сообщите! + +#### Прежде чем зарегистрировать + +* Проверьте [FAQ](https://github.com/1C-Company/GitConverter/wiki/Если-что-то-пошло-не-так-FAQ) и [Wiki](https://github.com/1C-Company/GitConverter/wiki) на наличие описания, что не является ошибкой +* Проверьте раздел [Issues](https://github.com/1C-Company/GitConverter/issues), чтобы не создавать дубликатов + +#### Как сообщить об ошибке эффективно + +Следуйте простым правилам: + +1. Задайте понятный заголовок `issue`, лаконично и исчерпывающе определяющий проблему + * постарайтесь не допускать двойного смысла, сленга из других областей и т.д. + * Не используйте "метки" в заголовке - для этого существуют сами метки (labels) +2. Опишите сценарий воспроизведения ошибки. + * скриншоты очень сильно помогают, но не заменяют сценарий + * добавьте логи ЖР, из лог-файлов (убедитесь, что они не содержат приватной информации) +3. Опишите, что есть ошибка по вашему мнению и почему +4. Опишите ожидаемое поведение + + +## Предложите улучшение функциональности + +1. Задайте понятный заголовок `issue`, лаконично и исчерпывающе определяющий новую функциональность +2. Опишите суть улучшений и обсудите в issue варианты реализации. +3. Реализуйте Ваше улучшение функциональности проекта в отдельном форке и предложите его через [Pull/merge request](#Pull-Requests-Merge-Requests) + +## Доработка кода + +**Главная цель этого проекта** - помочь разработчикам 1С перейти на разработку в 1C:EDT и Git с сохранением истории разработки в хранилище 1С. + +Доработка кода в конфигурации осуществляется только для улучшения существующей функциональности в соответствии с целями проекта. + +Создание и развитие новой функциональности нужно реализовывать с помощью [расширений конфигураций 1С:Предприятия](http://v8.1c.ru/overview/Term_000000883.htm). + +### Исправление ошибок + +* Создайте `issue` в проекте с описанием ошибки. Убедитесь, что владельцы проекта так же считают текущее поведение ошибочным. +* Создайте ветку в своем **форке** с именем `bugfix/issue-<Номер issue>-доп-название` +* Создайте **pull-request** из своей ветки в ветку **`develop`** проекта GitConverter +* Убедитесь, что модификация кода действительно исправляет ошибку, описанную в issue, и не привносит новую функциональность - новую функциональность следует делать отдельным issue и pull-request'ом. +* Следуйте общим правилам [Pull/merge request](#Pull-Requests-Merge-Requests) + +### Создайте Расширение конфигурации + +Новая функциональность должна создаваться с помощью расширений для конфигурации 1С:ГитКонвертер. + +Размещение кода расширений может быть двух типов: +* в репозитории `1C-Company/GitConverter` вместе с проектом 1С:ГитКонвертер +* в вашем репозитории на ГитХабе и ссылка в основном проект на ваш репозиторий, добавляемая вами по правилам `` + +Требования к расширениям: +* Расширение должно быть в проекте в формате EDT +* Наименование проекта расширения должно иметь формат `GitConverter.ИмяРасширения` +* Код расширения должен соответствовать [общим требованиям разработки](https://its.1c.ru/db/v8std) +* В расширении должны быть заполнены свойства `Vendor/Поставщик` и `Version/Версия`. + + +### Pull Requests (Merge Requests) + +* Создайте `issue` в проекте с описанием новой функциональности, желательно перед началом работы, чтобы исключить параллельную работу разных людей над одной задачей +* Создайте ветку в своем **форке** с именем `feature/issue-<Номер issue>-доп-название` +* Внесите изменения в конфигурацию или расширение +* Создайте **pull-request** из своей ветки в ветку **`develop`** проекта GitConverter +* Укажите ссылку на issue, которую закрывает данный pull-request +* Установите в своем PR флажок "allow edits from maintainers" + +#### Лицензия + +1. Добавляя любой контент в этот репозиторий (в т.ч. код), вы соглашаетесь с тем, что Ваш контент будет поставляться по [лицензии проекта](LISENSE.md). +2. Создавая "Запрос на объединение" текстов модулей, вы подтверждаете, что публикуете код с согласия правообладателя (это вы или ваша компания). **Внимание!** Если вы работаете в компании, убедитесь, что вы не публикуете код вашей компании без ее согласия. +3. При модификации текстов модулей Вы должны добавить себя или свою компанию в секцию копирайта в заголовке модуля. Если в секции копирайта уже указан **один** дополнительный автор, необходимо заменить на `ООО 1С-Софт и другие.` +4. При создании новых модулей, например в расширениях, в заголовок модуля необходимо добавить лицензию этого проекта и правообладателя. + +```bsl +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// +``` diff --git a/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаСписка/Module.bsl b/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаСписка/Module.bsl index 9552905..33f54cf 100644 --- a/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаСписка/Module.bsl +++ b/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаСписка/Module.bsl @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// #Область ОбработчикиСобытийФормы diff --git a/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаЭлемента/Module.bsl b/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаЭлемента/Module.bsl index ca65f2a..88faff2 100644 --- a/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаЭлемента/Module.bsl +++ b/GitConverter/src/Catalogs/ВерсииХранилища/Forms/ФормаЭлемента/Module.bsl @@ -1,111 +1,119 @@ -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриЧтенииНаСервере(ТекущийОбъект) - - Отбор = Новый Структура(); - Если ЗначениеЗаполнено(ТекущийОбъект.Источник) Тогда - Отбор.Вставить("Ключ", Строка(ТекущийОбъект.Источник.УникальныйИдентификатор())); - Иначе - Отбор.Вставить("Ключ", Строка(ТекущийОбъект.Ссылка.УникальныйИдентификатор())); - КонецЕсли; - Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); - - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); - - Если МассивФоновыхЗаданий.Количество() > 0 Тогда - Задание = МассивФоновыхЗаданий[0]; - СостояниеЗадания = НСтр("ru='Выполняется обработка с %Дата%'"); - СостояниеЗадания = СтрЗаменить(СостояниеЗадания, "%Дата%", Задание.Начало); - - Элементы.ГруппаСостояние.Видимость = Истина; - ФоновоеЗаданиеПрочитатьПромежуточныйРезультат(Задание.УникальныйИдентификатор); - - Иначе - СостояниеЗадания = ""; - Элементы.ГруппаСостояние.Видимость = Ложь; - КонецЕсли; - - Если ТекущийОбъект.Состояние = Перечисления.СостоянияВерсии.НачалоКоммита - ИЛИ ТекущийОбъект.Состояние = Перечисления.СостоянияВерсии.ВерсияПомещена Тогда - КаталогВыгрузкиВерсий = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Владелец, "КаталогВыгрузкиВерсий"); - ИмяФайлаЛога = КонвертацияХранилища.ИмяФайлаЛогаКоммитаВерсии(ТекущийОбъект.Код, КаталогВыгрузкиВерсий); - Иначе - ИмяФайлаЛога = КонвертацияХранилища.ИмяФайлаЛогаОбработкиВерсии(ТекущийОбъект.КаталогВременныхФайлов); - КонецЕсли; - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + Отбор = Новый Структура(); + Если ЗначениеЗаполнено(ТекущийОбъект.Источник) Тогда + Отбор.Вставить("Ключ", Строка(ТекущийОбъект.Источник.УникальныйИдентификатор())); + Иначе + Отбор.Вставить("Ключ", Строка(ТекущийОбъект.Ссылка.УникальныйИдентификатор())); + КонецЕсли; + Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); + + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + + Если МассивФоновыхЗаданий.Количество() > 0 Тогда + Задание = МассивФоновыхЗаданий[0]; + СостояниеЗадания = НСтр("ru='Выполняется обработка с %Дата%'"); + СостояниеЗадания = СтрЗаменить(СостояниеЗадания, "%Дата%", Задание.Начало); + + Элементы.ГруппаСостояние.Видимость = Истина; + ФоновоеЗаданиеПрочитатьПромежуточныйРезультат(Задание.УникальныйИдентификатор); + + Иначе + СостояниеЗадания = ""; + Элементы.ГруппаСостояние.Видимость = Ложь; + КонецЕсли; + + Если ТекущийОбъект.Состояние = Перечисления.СостоянияВерсии.НачалоКоммита + ИЛИ ТекущийОбъект.Состояние = Перечисления.СостоянияВерсии.ВерсияПомещена Тогда + КаталогВыгрузкиВерсий = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Владелец, "КаталогВыгрузкиВерсий"); + ИмяФайлаЛога = КонвертацияХранилища.ИмяФайлаЛогаКоммитаВерсии(ТекущийОбъект.Код, КаталогВыгрузкиВерсий); + Иначе + ИмяФайлаЛога = КонвертацияХранилища.ИмяФайлаЛогаОбработкиВерсии(ТекущийОбъект.КаталогВременныхФайлов); + КонецЕсли; + КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура ЗапуститьОбработкуВерсии(Команда) - - Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда - Возврат; - КонецЕсли; - - ЗапуститьОбработкуВерсииНаСервере(Объект.Ссылка); - - Прочитать(); - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьСостояние(Команда) - - Прочитать(); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ИмяФайлаЛогаОткрытие(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - Если Не ЗначениеЗаполнено(ИмяФайлаЛога) Тогда - Возврат; - КонецЕсли; - - Текст = Новый ТекстовыйДокумент(); - - ИмяФайла = ""; - ПрочитатьТекстовыйФайлНаСервере(ИмяФайлаЛога, Текст, ИмяФайла); - - Текст.Показать(ИмяФайла, ИмяФайла); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервереБезКонтекста -Процедура ЗапуститьОбработкуВерсииНаСервере(ВерсияХранилища) - - КонвертацияХранилища.ЗапуститьОбработкуВерсииВФоне(ВерсияХранилища); - -КонецПроцедуры - -&НаСервере -Процедура ФоновоеЗаданиеПрочитатьПромежуточныйРезультат(ФоновоеЗаданиеИдентификатор) - Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ФоновоеЗаданиеИдентификатор); - Если Прогресс <> Неопределено Тогда - ФоновоеЗаданиеПроцент = Прогресс.Процент; - ФоновоеЗаданиеСостояние = Прогресс.Текст; - КонецЕсли; -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ПрочитатьТекстовыйФайлНаСервере(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы = Ложь) - - ОбщегоНазначения.ПрочитатьТекстовыйФайл(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы); - -КонецПроцедуры - -#КонецОбласти + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗапуститьОбработкуВерсии(Команда) + + Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда + Возврат; + КонецЕсли; + + ЗапуститьОбработкуВерсииНаСервере(Объект.Ссылка); + + Прочитать(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСостояние(Команда) + + Прочитать(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ИмяФайлаЛогаОткрытие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Если Не ЗначениеЗаполнено(ИмяФайлаЛога) Тогда + Возврат; + КонецЕсли; + + Текст = Новый ТекстовыйДокумент(); + + ИмяФайла = ""; + ПрочитатьТекстовыйФайлНаСервере(ИмяФайлаЛога, Текст, ИмяФайла); + + Текст.Показать(ИмяФайла, ИмяФайла); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервереБезКонтекста +Процедура ЗапуститьОбработкуВерсииНаСервере(ВерсияХранилища) + + КонвертацияХранилища.ЗапуститьОбработкуВерсииВФоне(ВерсияХранилища); + +КонецПроцедуры + +&НаСервере +Процедура ФоновоеЗаданиеПрочитатьПромежуточныйРезультат(ФоновоеЗаданиеИдентификатор) + Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ФоновоеЗаданиеИдентификатор); + Если Прогресс <> Неопределено Тогда + ФоновоеЗаданиеПроцент = Прогресс.Процент; + ФоновоеЗаданиеСостояние = Прогресс.Текст; + КонецЕсли; +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПрочитатьТекстовыйФайлНаСервере(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы = Ложь) + + ОбщегоНазначения.ПрочитатьТекстовыйФайл(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы); + +КонецПроцедуры + +#КонецОбласти diff --git a/GitConverter/src/Catalogs/ВерсииХранилища/ManagerModule.bsl b/GitConverter/src/Catalogs/ВерсииХранилища/ManagerModule.bsl index bef5578..d5654c0 100644 --- a/GitConverter/src/Catalogs/ВерсииХранилища/ManagerModule.bsl +++ b/GitConverter/src/Catalogs/ВерсииХранилища/ManagerModule.bsl @@ -1,293 +1,301 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область ПрограммныйИнтерфейс - -// Возвращает структуру последней версии хранилища -// -// Параметры: -// Хранилище - СправочникСсылка.ХранилищаКонфигураций - ссылка на хранилище -// Возвращаемое значение: -// Структура - номер последней версии и ссылка на версию -Функция ПоследняяВерсияХранилища(Знач Хранилище) Экспорт - - Результат = Новый Структура("Версия, Ссылка", 0, Неопределено); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ВложенныйЗапрос.Версия КАК Версия, - | ЕСТЬNULL(ВерсииХранилища.Ссылка, ЗНАЧЕНИЕ(Справочник.ВерсииХранилища.ПустаяСсылка)) КАК Ссылка - |ИЗ - | (ВЫБРАТЬ - | ЕСТЬNULL(МАКСИМУМ(ВерсииХранилища.Код), 0) КАК Версия - | ИЗ - | Справочник.ВерсииХранилища КАК ВерсииХранилища - | ГДЕ - | ВерсииХранилища.Владелец = &Хранилище) КАК ВложенныйЗапрос - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииХранилища КАК ВерсииХранилища - | ПО ВложенныйЗапрос.Версия = ВерсииХранилища.Код - | И (ВерсииХранилища.Владелец = &Хранилище)"; - - Запрос.УстановитьПараметр("Хранилище", Хранилище); - - РезультатЗапроса = Запрос.Выполнить(); - - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - - Если ВыборкаДетальныеЗаписи.Следующий() Тогда - ЗаполнитьЗначенияСвойств(Результат, ВыборкаДетальныеЗаписи); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Загрузить версию отчета из файла -// -// Параметры: -// Хранилище - СправочникСсылка.ХранилищаКонфигураций - ссылка на хранилище -// ИмяФайлаОтчета - Строка - Имя файла отчета -Процедура ЗагрузитьВерсииИзОтчета(Знач Хранилище, ИмяФайлаОтчета) Экспорт - - Файл = Новый Файл(ИмяФайлаОтчета); - Если НЕ Файл.Существует() Тогда - Возврат; - КонецЕсли; - - Отчет = Новый ТабличныйДокумент; - Отчет.Прочитать(ИмяФайлаОтчета); - - ВерсииХранилища = Новый Массив; - - ПоляВерсии = Новый Соответствие; - ПоляВерсии.Вставить("Версия:", "Версия"); - ПоляВерсии.Вставить("Дата создания:", "ДатаСоздания"); - ПоляВерсии.Вставить("Время создания:", "ВремяСоздания"); - ПоляВерсии.Вставить("Пользователь:", "Пользователь"); - ПоляВерсии.Вставить("Комментарий:", "Комментарий"); - ПоляВерсии.Вставить("Добавлены:", "Добавлены"); - ПоляВерсии.Вставить("Изменены:", "Изменены"); - ПоляВерсии.Вставить("Удалены:", "Удалены"); - ПоляВерсии.Вставить("Version:", "Версия"); - ПоляВерсии.Вставить("Creation date:", "ДатаСоздания"); - ПоляВерсии.Вставить("Creation time:", "ВремяСоздания"); - ПоляВерсии.Вставить("User:", "Пользователь"); - ПоляВерсии.Вставить("Comment:", "Комментарий"); - ПоляВерсии.Вставить("Added:", "Добавлены"); - ПоляВерсии.Вставить("Changed:", "Изменены"); - ПоляВерсии.Вставить("Deleted:", "Удалены"); - - КолонкаПоиска = Отчет.Область("C1"); - ОбластьСтроки = Неопределено; - ОбластьСтроки = Отчет.НайтиТекст("Версия:", ОбластьСтроки, КолонкаПоиска, Ложь, Истина, Истина, Истина); +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +// Возвращает структуру последней версии хранилища +// +// Параметры: +// Хранилище - СправочникСсылка.ХранилищаКонфигураций - ссылка на хранилище +// Возвращаемое значение: +// Структура - номер последней версии и ссылка на версию +Функция ПоследняяВерсияХранилища(Знач Хранилище) Экспорт + + Результат = Новый Структура("Версия, Ссылка", 0, Неопределено); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВложенныйЗапрос.Версия КАК Версия, + | ЕСТЬNULL(ВерсииХранилища.Ссылка, ЗНАЧЕНИЕ(Справочник.ВерсииХранилища.ПустаяСсылка)) КАК Ссылка + |ИЗ + | (ВЫБРАТЬ + | ЕСТЬNULL(МАКСИМУМ(ВерсииХранилища.Код), 0) КАК Версия + | ИЗ + | Справочник.ВерсииХранилища КАК ВерсииХранилища + | ГДЕ + | ВерсииХранилища.Владелец = &Хранилище) КАК ВложенныйЗапрос + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииХранилища КАК ВерсииХранилища + | ПО ВложенныйЗапрос.Версия = ВерсииХранилища.Код + | И (ВерсииХранилища.Владелец = &Хранилище)"; + + Запрос.УстановитьПараметр("Хранилище", Хранилище); + + РезультатЗапроса = Запрос.Выполнить(); + + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); + + Если ВыборкаДетальныеЗаписи.Следующий() Тогда + ЗаполнитьЗначенияСвойств(Результат, ВыборкаДетальныеЗаписи); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Загрузить версию отчета из файла +// +// Параметры: +// Хранилище - СправочникСсылка.ХранилищаКонфигураций - ссылка на хранилище +// ИмяФайлаОтчета - Строка - Имя файла отчета +Процедура ЗагрузитьВерсииИзОтчета(Знач Хранилище, ИмяФайлаОтчета) Экспорт + + Файл = Новый Файл(ИмяФайлаОтчета); + Если НЕ Файл.Существует() Тогда + Возврат; + КонецЕсли; + + Отчет = Новый ТабличныйДокумент; + Отчет.Прочитать(ИмяФайлаОтчета); + + ВерсииХранилища = Новый Массив; + + ПоляВерсии = Новый Соответствие; + ПоляВерсии.Вставить("Версия:", "Версия"); + ПоляВерсии.Вставить("Дата создания:", "ДатаСоздания"); + ПоляВерсии.Вставить("Время создания:", "ВремяСоздания"); + ПоляВерсии.Вставить("Пользователь:", "Пользователь"); + ПоляВерсии.Вставить("Комментарий:", "Комментарий"); + ПоляВерсии.Вставить("Добавлены:", "Добавлены"); + ПоляВерсии.Вставить("Изменены:", "Изменены"); + ПоляВерсии.Вставить("Удалены:", "Удалены"); + ПоляВерсии.Вставить("Version:", "Версия"); + ПоляВерсии.Вставить("Creation date:", "ДатаСоздания"); + ПоляВерсии.Вставить("Creation time:", "ВремяСоздания"); + ПоляВерсии.Вставить("User:", "Пользователь"); + ПоляВерсии.Вставить("Comment:", "Комментарий"); + ПоляВерсии.Вставить("Added:", "Добавлены"); + ПоляВерсии.Вставить("Changed:", "Изменены"); + ПоляВерсии.Вставить("Deleted:", "Удалены"); + + КолонкаПоиска = Отчет.Область("C1"); + ОбластьСтроки = Неопределено; + ОбластьСтроки = Отчет.НайтиТекст("Версия:", ОбластьСтроки, КолонкаПоиска, Ложь, Истина, Истина, Истина); Если ОбластьСтроки = Неопределено Тогда ОбластьСтроки = Отчет.НайтиТекст("Version:", ОбластьСтроки, КолонкаПоиска, Ложь, Истина, Истина, Истина); - КонецЕсли; - Пока ОбластьСтроки <> Неопределено Цикл - - ВерсияХранилища = Новый Структура("Версия, ДатаСоздания, ВремяСоздания, Пользователь, Комментарий, Добавлены, Изменены, Удалены", "", "", "", "", "", Новый Массив, Новый Массив, Новый Массив); - - СтрокаНачалаВерсии = ОбластьСтроки.Верх; - ОбластьСтрокиНаРусском = Отчет.НайтиТекст("Версия:", ОбластьСтроки, КолонкаПоиска, Ложь, Истина, Истина, Истина); - Если ОбластьСтрокиНаРусском = Неопределено Тогда - ОбластьСтроки = Отчет.НайтиТекст("Version:", ОбластьСтроки, КолонкаПоиска, Ложь, Истина, Истина, Истина); - Иначе - ОбластьСтроки = ОбластьСтрокиНаРусском; - КонецЕсли; - Если ОбластьСтроки = Неопределено Тогда - - // Это последняя версия в файле, получаем конец документа - СтрокаОкончанияВерсии = Отчет.ВысотаТаблицы; - - Иначе - - СтрокаОкончанияВерсии = ОбластьСтроки.Верх-1; - - КонецЕсли; - - ИмяТекущегоМассиваСтрок = ""; - - Пока СтрокаНачалаВерсии <= СтрокаОкончанияВерсии Цикл - - Имя = "R"+Формат(СтрокаНачалаВерсии, "ЧДЦ=; ЧГ=0") + "C1"; - Ключ = ПоляВерсии.Получить(Отчет.Область(Имя).Текст); - Имя = "R"+Формат(СтрокаНачалаВерсии, "ЧДЦ=; ЧГ=0") + "C2"; - Значение = Отчет.Область(Имя).Текст; - Если ЗначениеЗаполнено(Значение) Тогда - Если Ключ = Неопределено Тогда - - Если ЗначениеЗаполнено(ИмяТекущегоМассиваСтрок) И ЗначениеЗаполнено(Значение) Тогда - ВерсияХранилища[ИмяТекущегоМассиваСтрок].Добавить(Значение); - КонецЕсли; - Иначе - Если ТипЗнч(ВерсияХранилища[Ключ]) = Тип("Массив") Тогда - ИмяТекущегоМассиваСтрок = Ключ; - ВерсияХранилища[ИмяТекущегоМассиваСтрок].Добавить(Значение); - Иначе - ВерсияХранилища[Ключ] = Значение; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - СтрокаНачалаВерсии = СтрокаНачалаВерсии + 1; - - КонецЦикла; - - ВерсииХранилища.Добавить(ВерсияХранилища); - - КонецЦикла; - - // Сохраняем версии - Если ВерсииХранилища.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - // Если в отчете есть пустые пользователи - не загружаем - Для Каждого ВерсияХранилища Из ВерсииХранилища Цикл - Если Не ЗначениеЗаполнено(ВерсияХранилища.Пользователь) Тогда - - ЗаписьЖурналаРегистрации(НСтр("ru = 'Некорректный отчет из хранилища'", Метаданные.ОсновнойЯзык.КодЯзыка), - УровеньЖурналаРегистрации.Ошибка, - , - , - ЗначениеВСтрокуВнутр(Отчет)); - Возврат; - КонецЕсли; - КонецЦикла; - - МассивКодов = Новый Массив; - Для каждого ВерсияХранилища Из ВерсииХранилища Цикл - Версия = Число(ВерсияХранилища.Версия); - Если Версия = 0 Тогда - Продолжить; - КонецЕсли; - МассивКодов.Добавить(Версия); - - КонецЦикла; - - Если МассивКодов.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - НачатьТранзакцию(); - - Попытка - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ВерсииХранилища"); - ЭлементБлокировки.УстановитьЗначение("Владелец", Хранилище); - Блокировка.Заблокировать(); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ВерсииХранилища.Ссылка, - | ВерсииХранилища.Код - |ИЗ - | Справочник.ВерсииХранилища КАК ВерсииХранилища - |ГДЕ - | ВерсииХранилища.Владелец = &Хранилище - | И ВерсииХранилища.Код В(&Коды)"; - - Запрос.УстановитьПараметр("Коды", МассивКодов); - Запрос.УстановитьПараметр("Хранилище", Хранилище); - - РезультатЗапроса = Запрос.Выполнить(); - - ТаблицаВерсий = РезультатЗапроса.Выгрузить(); - ТаблицаВерсий.Индексы.Добавить("Код"); - - Для каждого ВерсияХранилища Из ВерсииХранилища Цикл - Версия = Число(ВерсияХранилища.Версия); - Если Версия = 0 Тогда - Продолжить; - КонецЕсли; - НайденнаяСтрока = ТаблицаВерсий.Найти(Версия, "Код"); - Если НайденнаяСтрока = Неопределено Тогда - - Объект = Справочники.ВерсииХранилища.СоздатьЭлемент(); - - Иначе - - Объект = НайденнаяСтрока.Ссылка.ПолучитьОбъект(); - - КонецЕсли; - - Объект.Владелец = Хранилище; - Объект.Код = Версия; - - Попытка - ВремяСоздания = СтрЗаменить(ВерсияХранилища.ВремяСоздания, ":", ""); - Если СтрДлина(ВремяСоздания) = 5 Тогда - ВремяСоздания = "0" + ВремяСоздания; - КонецЕсли; - Объект.ДатаСоздания = Дата(Прав(СокрЛП(ВерсияХранилища.ДатаСоздания), 4) + Сред(ВерсияХранилища.ДатаСоздания,4,2) + Лев(ВерсияХранилища.ДатаСоздания, 2) + ВремяСоздания); - Исключение - - КонецПопытки; - - Объект.Пользователь = ВерсияХранилища.Пользователь; - Объект.Комментарий = ВерсияХранилища.Комментарий; - - Объект.Состав.Очистить(); - Для каждого ОбъектМетаданных Из ВерсияХранилища.Добавлены Цикл - - НоваяСтрока = Объект.Состав.Добавить(); - НоваяСтрока.Тип = "Добавлено"; - НоваяСтрока.ОбъектМетаданных = ОбъектМетаданных; - - КонецЦикла; - Для каждого ОбъектМетаданных Из ВерсияХранилища.Изменены Цикл - - НоваяСтрока = Объект.Состав.Добавить(); - НоваяСтрока.Тип = "Изменено"; - НоваяСтрока.ОбъектМетаданных = ОбъектМетаданных; - - КонецЦикла; - Для каждого ОбъектМетаданных Из ВерсияХранилища.Удалены Цикл - - НоваяСтрока = Объект.Состав.Добавить(); - НоваяСтрока.Тип = "Удалено"; - НоваяСтрока.ОбъектМетаданных = ОбъектМетаданных; - - КонецЦикла; - Объект.Записать(); - - КонецЦикла; - - ЗафиксироватьТранзакцию(); - - Исключение - ОтменитьТранзакцию(); - - ТекстОшибки = ОписаниеОшибки(); - - ЗаписьЖурналаРегистрации(НСтр("ru = 'Загрузка версий хранилища конфигурации'", Метаданные.ОсновнойЯзык.КодЯзыка), - УровеньЖурналаРегистрации.Ошибка, - Метаданные.Справочники.ХранилищаКонфигураций, - Хранилище, - ТекстОшибки); - - ВызватьИсключение ТекстОшибки; - КонецПопытки; - -КонецПроцедуры - -// Устанавливает новое состояние для версии хранилища -// Параметры: -// ВерсияХранилища - СправочникСсылка.ВерсииХранилища - Ссылка на версию -// Состояние - ПеречислениеСсылка.СостоянияВерсии - новое состояние версии -Процедура УстановитьСостояние(Знач ВерсияХранилища, Знач Состояние) Экспорт - - Объект = ВерсияХранилища.ПолучитьОбъект(); - - Если Объект <> Неопределено И Объект.Состояние <> Состояние Тогда - Объект.Состояние = Состояние; - Объект.Записать(); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - + КонецЕсли; + Пока ОбластьСтроки <> Неопределено Цикл + + ВерсияХранилища = Новый Структура("Версия, ДатаСоздания, ВремяСоздания, Пользователь, Комментарий, Добавлены, Изменены, Удалены", "", "", "", "", "", Новый Массив, Новый Массив, Новый Массив); + + СтрокаНачалаВерсии = ОбластьСтроки.Верх; + ОбластьСтрокиНаРусском = Отчет.НайтиТекст("Версия:", ОбластьСтроки, КолонкаПоиска, Ложь, Истина, Истина, Истина); + Если ОбластьСтрокиНаРусском = Неопределено Тогда + ОбластьСтроки = Отчет.НайтиТекст("Version:", ОбластьСтроки, КолонкаПоиска, Ложь, Истина, Истина, Истина); + Иначе + ОбластьСтроки = ОбластьСтрокиНаРусском; + КонецЕсли; + Если ОбластьСтроки = Неопределено Тогда + + // Это последняя версия в файле, получаем конец документа + СтрокаОкончанияВерсии = Отчет.ВысотаТаблицы; + + Иначе + + СтрокаОкончанияВерсии = ОбластьСтроки.Верх-1; + + КонецЕсли; + + ИмяТекущегоМассиваСтрок = ""; + + Пока СтрокаНачалаВерсии <= СтрокаОкончанияВерсии Цикл + + Имя = "R"+Формат(СтрокаНачалаВерсии, "ЧДЦ=; ЧГ=0") + "C1"; + Ключ = ПоляВерсии.Получить(Отчет.Область(Имя).Текст); + Имя = "R"+Формат(СтрокаНачалаВерсии, "ЧДЦ=; ЧГ=0") + "C2"; + Значение = Отчет.Область(Имя).Текст; + Если ЗначениеЗаполнено(Значение) Тогда + Если Ключ = Неопределено Тогда + + Если ЗначениеЗаполнено(ИмяТекущегоМассиваСтрок) И ЗначениеЗаполнено(Значение) Тогда + ВерсияХранилища[ИмяТекущегоМассиваСтрок].Добавить(Значение); + КонецЕсли; + Иначе + Если ТипЗнч(ВерсияХранилища[Ключ]) = Тип("Массив") Тогда + ИмяТекущегоМассиваСтрок = Ключ; + ВерсияХранилища[ИмяТекущегоМассиваСтрок].Добавить(Значение); + Иначе + ВерсияХранилища[Ключ] = Значение; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СтрокаНачалаВерсии = СтрокаНачалаВерсии + 1; + + КонецЦикла; + + ВерсииХранилища.Добавить(ВерсияХранилища); + + КонецЦикла; + + // Сохраняем версии + Если ВерсииХранилища.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + // Если в отчете есть пустые пользователи - не загружаем + Для Каждого ВерсияХранилища Из ВерсииХранилища Цикл + Если Не ЗначениеЗаполнено(ВерсияХранилища.Пользователь) Тогда + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Некорректный отчет из хранилища'", Метаданные.ОсновнойЯзык.КодЯзыка), + УровеньЖурналаРегистрации.Ошибка, + , + , + ЗначениеВСтрокуВнутр(Отчет)); + Возврат; + КонецЕсли; + КонецЦикла; + + МассивКодов = Новый Массив; + Для каждого ВерсияХранилища Из ВерсииХранилища Цикл + Версия = Число(ВерсияХранилища.Версия); + Если Версия = 0 Тогда + Продолжить; + КонецЕсли; + МассивКодов.Добавить(Версия); + + КонецЦикла; + + Если МассивКодов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + НачатьТранзакцию(); + + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ВерсииХранилища"); + ЭлементБлокировки.УстановитьЗначение("Владелец", Хранилище); + Блокировка.Заблокировать(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ВерсииХранилища.Ссылка, + | ВерсииХранилища.Код + |ИЗ + | Справочник.ВерсииХранилища КАК ВерсииХранилища + |ГДЕ + | ВерсииХранилища.Владелец = &Хранилище + | И ВерсииХранилища.Код В(&Коды)"; + + Запрос.УстановитьПараметр("Коды", МассивКодов); + Запрос.УстановитьПараметр("Хранилище", Хранилище); + + РезультатЗапроса = Запрос.Выполнить(); + + ТаблицаВерсий = РезультатЗапроса.Выгрузить(); + ТаблицаВерсий.Индексы.Добавить("Код"); + + Для каждого ВерсияХранилища Из ВерсииХранилища Цикл + Версия = Число(ВерсияХранилища.Версия); + Если Версия = 0 Тогда + Продолжить; + КонецЕсли; + НайденнаяСтрока = ТаблицаВерсий.Найти(Версия, "Код"); + Если НайденнаяСтрока = Неопределено Тогда + + Объект = Справочники.ВерсииХранилища.СоздатьЭлемент(); + + Иначе + + Объект = НайденнаяСтрока.Ссылка.ПолучитьОбъект(); + + КонецЕсли; + + Объект.Владелец = Хранилище; + Объект.Код = Версия; + + Попытка + ВремяСоздания = СтрЗаменить(ВерсияХранилища.ВремяСоздания, ":", ""); + Если СтрДлина(ВремяСоздания) = 5 Тогда + ВремяСоздания = "0" + ВремяСоздания; + КонецЕсли; + Объект.ДатаСоздания = Дата(Прав(СокрЛП(ВерсияХранилища.ДатаСоздания), 4) + Сред(ВерсияХранилища.ДатаСоздания,4,2) + Лев(ВерсияХранилища.ДатаСоздания, 2) + ВремяСоздания); + Исключение + + КонецПопытки; + + Объект.Пользователь = ВерсияХранилища.Пользователь; + Объект.Комментарий = ВерсияХранилища.Комментарий; + + Объект.Состав.Очистить(); + Для каждого ОбъектМетаданных Из ВерсияХранилища.Добавлены Цикл + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Тип = "Добавлено"; + НоваяСтрока.ОбъектМетаданных = ОбъектМетаданных; + + КонецЦикла; + Для каждого ОбъектМетаданных Из ВерсияХранилища.Изменены Цикл + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Тип = "Изменено"; + НоваяСтрока.ОбъектМетаданных = ОбъектМетаданных; + + КонецЦикла; + Для каждого ОбъектМетаданных Из ВерсияХранилища.Удалены Цикл + + НоваяСтрока = Объект.Состав.Добавить(); + НоваяСтрока.Тип = "Удалено"; + НоваяСтрока.ОбъектМетаданных = ОбъектМетаданных; + + КонецЦикла; + Объект.Записать(); + + КонецЦикла; + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + + ТекстОшибки = ОписаниеОшибки(); + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Загрузка версий хранилища конфигурации'", Метаданные.ОсновнойЯзык.КодЯзыка), + УровеньЖурналаРегистрации.Ошибка, + Метаданные.Справочники.ХранилищаКонфигураций, + Хранилище, + ТекстОшибки); + + ВызватьИсключение ТекстОшибки; + КонецПопытки; + +КонецПроцедуры + +// Устанавливает новое состояние для версии хранилища +// Параметры: +// ВерсияХранилища - СправочникСсылка.ВерсииХранилища - Ссылка на версию +// Состояние - ПеречислениеСсылка.СостоянияВерсии - новое состояние версии +Процедура УстановитьСостояние(Знач ВерсияХранилища, Знач Состояние) Экспорт + + Объект = ВерсияХранилища.ПолучитьОбъект(); + + Если Объект <> Неопределено И Объект.Состояние <> Состояние Тогда + Объект.Состояние = Состояние; + Объект.Записать(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + #КонецЕсли \ No newline at end of file diff --git a/GitConverter/src/Catalogs/ВерсииХранилища/ObjectModule.bsl b/GitConverter/src/Catalogs/ВерсииХранилища/ObjectModule.bsl index 858952d..c6fbbb3 100644 --- a/GitConverter/src/Catalogs/ВерсииХранилища/ObjectModule.bsl +++ b/GitConverter/src/Catalogs/ВерсииХранилища/ObjectModule.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда #Область ОбработчикиСобытий diff --git a/GitConverter/src/Catalogs/КопииХранилищКонфигурации/Forms/ФормаЭлемента/Module.bsl b/GitConverter/src/Catalogs/КопииХранилищКонфигурации/Forms/ФормаЭлемента/Module.bsl index e56e495..83883e8 100644 --- a/GitConverter/src/Catalogs/КопииХранилищКонфигурации/Forms/ФормаЭлемента/Module.bsl +++ b/GitConverter/src/Catalogs/КопииХранилищКонфигурации/Forms/ФормаЭлемента/Module.bsl @@ -1,173 +1,179 @@ - - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - УстановитьУсловноеОформление(); - - Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда - - ПриЧтенииСозданииНаСервере(); - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ПриЧтенииНаСервере(ТекущийОбъект) - - ПриЧтенииСозданииНаСервере(); - - КаталогВыгрузкиВерсий = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Владелец, "КаталогВыгрузкиВерсий"); - ИмяФайлаЛога = КонвертацияХранилища.ИмяФайлаЛогаКонвертацииХранилища(КаталогВыгрузкиВерсий); - -КонецПроцедуры - -&НаСервере -Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - - Если НЕ ВыгружатьВОтдельныйКаталог Тогда - - ТекущийОбъект.КаталогВыгрузкиВерсий = ""; - - КонецЕсли; - - ТекущийОбъект.ДополнительныеСвойства.Вставить("Расписание", Расписание); - ТекущийОбъект.ДополнительныеСвойства.Вставить("Использование", РегламентноеЗаданиеИспользуется); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура РегламентноеЗаданиеИспользуетсяПриИзменении(Элемент) - - УстановитьДоступность(ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура РасписаниеСтрокойНажатие(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); - ДиалогРасписания.Показать(Новый ОписаниеОповещения("РасписаниеСтрокойНажатиеЗавершение", ЭтотОбъект)); - -КонецПроцедуры - -&НаКлиенте -Процедура РасписаниеСтрокойНажатиеЗавершение(РасписаниеОтвет, ДополнительныеПараметры) Экспорт - - Если РасписаниеОтвет <> Неопределено Тогда - - Модифицированность = Истина; - Расписание = РасписаниеОтвет; - РасписаниеСтрокой = Строка(Расписание); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ИмяФайлаЛогаОткрытие(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - Если Не ЗначениеЗаполнено(ИмяФайлаЛога) Тогда - Возврат; - КонецЕсли; - - Текст = Новый ТекстовыйДокумент(); - - ИмяФайла = ""; - ПрочитатьТекстовыйФайлНаСервере(ИмяФайлаЛога, Текст, ИмяФайла); - - Текст.Показать(ИмяФайла, ИмяФайла); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервере -Процедура УстановитьУсловноеОформление() - - УсловноеОформление.Элементы.Очистить(); - -КонецПроцедуры - -&НаСервере -Процедура ПриЧтенииСозданииНаСервере() - - УстановитьПривилегированныйРежим(Истина); - Задание = РегламентныеЗаданияСервер.Задание(Объект.РегламентноеЗадание); - Если Задание <> Неопределено Тогда - Расписание = Задание.Расписание; - РегламентноеЗаданиеИспользуется = Задание.Использование; - РасписаниеСтрокой = Строка(Расписание); - Иначе - Расписание = Новый РасписаниеРегламентногоЗадания; - РасписаниеСтрокой = РасписаниеСтрокой = Строка(Расписание); - КонецЕсли; - - ВыгружатьВОтдельныйКаталог = ЗначениеЗаполнено(Объект.КаталогВыгрузкиВерсий); - - ДругойПользователь = ЗначениеЗаполнено(Объект.ИмяПользователяХранилища); - - УстановитьВидимость(); - - УстановитьДоступность(ЭтаФорма); - -КонецПроцедуры - -&НаСервере -Процедура УстановитьВидимость() - - Возврат; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьДоступность(Форма) - - Если Форма.РегламентноеЗаданиеИспользуется Тогда - - Форма.Элементы.РасписаниеСтрокой.Доступность = Истина; - - Иначе - - Форма.Элементы.РасписаниеСтрокой.Доступность = Ложь; - - КонецЕсли; - - Форма.Элементы.КаталогВыгрузкиВерсий.Доступность = Форма.ВыгружатьВОтдельныйКаталог; - Форма.Элементы.ИмяПользователяХранилища.Доступность = Форма.ДругойПользователь; - Форма.Элементы.ПарольПользователяХранилища.Доступность = Форма.ДругойПользователь; - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + + Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда + + ПриЧтенииСозданииНаСервере(); + + КонецЕсли; + КонецПроцедуры - -&НаКлиенте -Процедура ВыгружатьВОтдельныйКаталогПриИзменении(Элемент) - - УстановитьДоступность(ЭтотОбъект); - -КонецПроцедуры - -&НаКлиенте -Процедура ДругойПользовательПриИзменении(Элемент) - - УстановитьДоступность(ЭтотОбъект); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ПрочитатьТекстовыйФайлНаСервере(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы = Ложь) - - ОбщегоНазначения.ПрочитатьТекстовыйФайл(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы); - -КонецПроцедуры - + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ПриЧтенииСозданииНаСервере(); + + КаталогВыгрузкиВерсий = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Владелец, "КаталогВыгрузкиВерсий"); + ИмяФайлаЛога = КонвертацияХранилища.ИмяФайлаЛогаКонвертацииХранилища(КаталогВыгрузкиВерсий); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если НЕ ВыгружатьВОтдельныйКаталог Тогда + + ТекущийОбъект.КаталогВыгрузкиВерсий = ""; + + КонецЕсли; + + ТекущийОбъект.ДополнительныеСвойства.Вставить("Расписание", Расписание); + ТекущийОбъект.ДополнительныеСвойства.Вставить("Использование", РегламентноеЗаданиеИспользуется); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура РегламентноеЗаданиеИспользуетсяПриИзменении(Элемент) + + УстановитьДоступность(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура РасписаниеСтрокойНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); + ДиалогРасписания.Показать(Новый ОписаниеОповещения("РасписаниеСтрокойНажатиеЗавершение", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура РасписаниеСтрокойНажатиеЗавершение(РасписаниеОтвет, ДополнительныеПараметры) Экспорт + + Если РасписаниеОтвет <> Неопределено Тогда + + Модифицированность = Истина; + Расписание = РасписаниеОтвет; + РасписаниеСтрокой = Строка(Расписание); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ИмяФайлаЛогаОткрытие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Если Не ЗначениеЗаполнено(ИмяФайлаЛога) Тогда + Возврат; + КонецЕсли; + + Текст = Новый ТекстовыйДокумент(); + + ИмяФайла = ""; + ПрочитатьТекстовыйФайлНаСервере(ИмяФайлаЛога, Текст, ИмяФайла); + + Текст.Показать(ИмяФайла, ИмяФайла); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииСозданииНаСервере() + + УстановитьПривилегированныйРежим(Истина); + Задание = РегламентныеЗаданияСервер.Задание(Объект.РегламентноеЗадание); + Если Задание <> Неопределено Тогда + Расписание = Задание.Расписание; + РегламентноеЗаданиеИспользуется = Задание.Использование; + РасписаниеСтрокой = Строка(Расписание); + Иначе + Расписание = Новый РасписаниеРегламентногоЗадания; + РасписаниеСтрокой = РасписаниеСтрокой = Строка(Расписание); + КонецЕсли; + + ВыгружатьВОтдельныйКаталог = ЗначениеЗаполнено(Объект.КаталогВыгрузкиВерсий); + + ДругойПользователь = ЗначениеЗаполнено(Объект.ИмяПользователяХранилища); + + УстановитьВидимость(); + + УстановитьДоступность(ЭтаФорма); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимость() + + Возврат; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьДоступность(Форма) + + Если Форма.РегламентноеЗаданиеИспользуется Тогда + + Форма.Элементы.РасписаниеСтрокой.Доступность = Истина; + + Иначе + + Форма.Элементы.РасписаниеСтрокой.Доступность = Ложь; + + КонецЕсли; + + Форма.Элементы.КаталогВыгрузкиВерсий.Доступность = Форма.ВыгружатьВОтдельныйКаталог; + Форма.Элементы.ИмяПользователяХранилища.Доступность = Форма.ДругойПользователь; + Форма.Элементы.ПарольПользователяХранилища.Доступность = Форма.ДругойПользователь; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыгружатьВОтдельныйКаталогПриИзменении(Элемент) + + УстановитьДоступность(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ДругойПользовательПриИзменении(Элемент) + + УстановитьДоступность(ЭтотОбъект); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПрочитатьТекстовыйФайлНаСервере(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы = Ложь) + + ОбщегоНазначения.ПрочитатьТекстовыйФайл(ПутьКФайлу, Текст, ИмяФайла, КодировкаСистемы); + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/GitConverter/src/Catalogs/КопииХранилищКонфигурации/ObjectModule.bsl b/GitConverter/src/Catalogs/КопииХранилищКонфигурации/ObjectModule.bsl index 6923285..cfdde35 100644 --- a/GitConverter/src/Catalogs/КопииХранилищКонфигурации/ObjectModule.bsl +++ b/GitConverter/src/Catalogs/КопииХранилищКонфигурации/ObjectModule.bsl @@ -1,116 +1,123 @@ - -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область ОбработчикиСобытий - -Процедура ПередЗаписью(Отказ) - - Если Отказ Тогда - Возврат; - КонецЕсли; - - Если ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - Наименование = Адрес; - - // Создание регламентного задания (получение уникального идентификатора) - УстановитьПривилегированныйРежим(Истина); - - Задание = РегламентныеЗаданияСервер.Задание(РегламентноеЗадание); - Если Задание = Неопределено Тогда - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ВыгрузкаВерсииИзКопииХранилища); - ПараметрыЗадания.Вставить("Использование", Ложь); - ПараметрыЗадания.Вставить("Расписание", Новый РасписаниеРегламентногоЗадания); - ПараметрыЗадания.Вставить("Наименование", НСтр("ru = 'Выгрузка версий из копии'") + ": " + СокрЛП(Наименование)); - Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); - - РегламентноеЗадание = РегламентныеЗаданияСервер.УникальныйИдентификатор(Задание); - - КонецЕсли; - - Если ЗначениеЗаполнено(КаталогВыгрузкиВерсий) Тогда - - КаталогВыгрузкиВерсий = СокрЛП(КаталогВыгрузкиВерсий); - - КонецЕсли; - - ДополнительныеСвойства.Вставить("Задание",Задание); - УстановитьПривилегированныйРежим(Ложь); - -КонецПроцедуры - -Процедура ПриКопировании(ОбъектКопирования) - - РегламентноеЗадание = Неопределено; - -КонецПроцедуры - -Процедура ПередУдалением(Отказ) - - Если ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - РегламентныеЗаданияСервер.УдалитьЗадание(РегламентноеЗадание); - -КонецПроцедуры - -Процедура ПриЗаписи(Отказ) - - Если Отказ ИЛИ ОбменДанными.Загрузка ИЛИ ЭтоГруппа Тогда - Возврат; - КонецЕсли; - - Если ДополнительныеСвойства.Свойство("Задание") Тогда - Задание = ДополнительныеСвойства.Задание; - Если Задание = Неопределено Тогда - Возврат; - КонецЕсли; - Иначе - Возврат; - КонецЕсли; - - ПараметрыЗадания = Новый Структура; - - // Расписание устанавливается в форме элемента - Если ДополнительныеСвойства.Свойство("Расписание") - И ТипЗнч(ДополнительныеСвойства.Расписание) = Тип("РасписаниеРегламентногоЗадания") - И Строка(ДополнительныеСвойства.Расписание) <> Строка(Задание.Расписание) Тогда - ПараметрыЗадания.Вставить("Расписание", ДополнительныеСвойства.Расписание); - КонецЕсли; - - // Использование устанавливается в форме элемента - Если ПометкаУдаления И Задание.Использование Тогда - - ПараметрыЗадания.Вставить("Использование", Ложь); - - ИначеЕсли ДополнительныеСвойства.Свойство("Использование") - И ДополнительныеСвойства.Использование <> Задание.Использование Тогда - - ПараметрыЗадания.Вставить("Использование", ДополнительныеСвойства.Использование); - - КонецЕсли; - НаименованиеЗадания = НСтр("ru = 'Выгрузка версий из копии'") + ": "; - - НаименованиеЗадания = НаименованиеЗадания + СокрЛП(Наименование); - ПараметрыЗадания.Вставить("Наименование", НаименованиеЗадания); - ПараметрыЗадания.Вставить("Ключ", Строка(Ссылка.УникальныйИдентификатор())); - - Если Задание.Параметры.Количество() <> 1 ИЛИ Задание.Параметры[0] <> Ссылка Тогда - МассивПараметров = Новый Массив; - МассивПараметров.Добавить(Ссылка); - ПараметрыЗадания.Вставить("Параметры", МассивПараметров); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - РегламентныеЗаданияСервер.ИзменитьЗадание(РегламентноеЗадание, ПараметрыЗадания); - -КонецПроцедуры - -#КонецОбласти - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ОбработчикиСобытий + +Процедура ПередЗаписью(Отказ) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Наименование = Адрес; + + // Создание регламентного задания (получение уникального идентификатора) + УстановитьПривилегированныйРежим(Истина); + + Задание = РегламентныеЗаданияСервер.Задание(РегламентноеЗадание); + Если Задание = Неопределено Тогда + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ВыгрузкаВерсииИзКопииХранилища); + ПараметрыЗадания.Вставить("Использование", Ложь); + ПараметрыЗадания.Вставить("Расписание", Новый РасписаниеРегламентногоЗадания); + ПараметрыЗадания.Вставить("Наименование", НСтр("ru = 'Выгрузка версий из копии'") + ": " + СокрЛП(Наименование)); + Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); + + РегламентноеЗадание = РегламентныеЗаданияСервер.УникальныйИдентификатор(Задание); + + КонецЕсли; + + Если ЗначениеЗаполнено(КаталогВыгрузкиВерсий) Тогда + + КаталогВыгрузкиВерсий = СокрЛП(КаталогВыгрузкиВерсий); + + КонецЕсли; + + ДополнительныеСвойства.Вставить("Задание",Задание); + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + +Процедура ПриКопировании(ОбъектКопирования) + + РегламентноеЗадание = Неопределено; + +КонецПроцедуры + +Процедура ПередУдалением(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + РегламентныеЗаданияСервер.УдалитьЗадание(РегламентноеЗадание); + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если Отказ ИЛИ ОбменДанными.Загрузка ИЛИ ЭтоГруппа Тогда + Возврат; + КонецЕсли; + + Если ДополнительныеСвойства.Свойство("Задание") Тогда + Задание = ДополнительныеСвойства.Задание; + Если Задание = Неопределено Тогда + Возврат; + КонецЕсли; + Иначе + Возврат; + КонецЕсли; + + ПараметрыЗадания = Новый Структура; + + // Расписание устанавливается в форме элемента + Если ДополнительныеСвойства.Свойство("Расписание") + И ТипЗнч(ДополнительныеСвойства.Расписание) = Тип("РасписаниеРегламентногоЗадания") + И Строка(ДополнительныеСвойства.Расписание) <> Строка(Задание.Расписание) Тогда + ПараметрыЗадания.Вставить("Расписание", ДополнительныеСвойства.Расписание); + КонецЕсли; + + // Использование устанавливается в форме элемента + Если ПометкаУдаления И Задание.Использование Тогда + + ПараметрыЗадания.Вставить("Использование", Ложь); + + ИначеЕсли ДополнительныеСвойства.Свойство("Использование") + И ДополнительныеСвойства.Использование <> Задание.Использование Тогда + + ПараметрыЗадания.Вставить("Использование", ДополнительныеСвойства.Использование); + + КонецЕсли; + НаименованиеЗадания = НСтр("ru = 'Выгрузка версий из копии'") + ": "; + + НаименованиеЗадания = НаименованиеЗадания + СокрЛП(Наименование); + ПараметрыЗадания.Вставить("Наименование", НаименованиеЗадания); + ПараметрыЗадания.Вставить("Ключ", Строка(Ссылка.УникальныйИдентификатор())); + + Если Задание.Параметры.Количество() <> 1 ИЛИ Задание.Параметры[0] <> Ссылка Тогда + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Ссылка); + ПараметрыЗадания.Вставить("Параметры", МассивПараметров); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + РегламентныеЗаданияСервер.ИзменитьЗадание(РегламентноеЗадание, ПараметрыЗадания); + +КонецПроцедуры + +#КонецОбласти + #КонецЕсли \ No newline at end of file diff --git a/GitConverter/src/Catalogs/ОчередиВыполнения/Commands/ОчередиВыполнения/CommandModule.bsl b/GitConverter/src/Catalogs/ОчередиВыполнения/Commands/ОчередиВыполнения/CommandModule.bsl index d123248..e66e072 100644 --- a/GitConverter/src/Catalogs/ОчередиВыполнения/Commands/ОчередиВыполнения/CommandModule.bsl +++ b/GitConverter/src/Catalogs/ОчередиВыполнения/Commands/ОчередиВыполнения/CommandModule.bsl @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) diff --git a/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаСписка/Module.bsl b/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаСписка/Module.bsl index a74d0be..37d9e1e 100644 --- a/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаСписка/Module.bsl +++ b/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаСписка/Module.bsl @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// #Область ОбработчикиСобытийФормы diff --git a/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаЭлемента/Module.bsl b/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаЭлемента/Module.bsl index a9dd7bd..b2b901f 100644 --- a/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаЭлемента/Module.bsl +++ b/GitConverter/src/Catalogs/ОчередиВыполнения/Forms/ФормаЭлемента/Module.bsl @@ -1,129 +1,136 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - УстановитьУсловноеОформление(); - - Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда - - ПриЧтенииСозданииНаСервере(); - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ПриЧтенииНаСервере(ТекущийОбъект) - - ПриЧтенииСозданииНаСервере(); - -КонецПроцедуры - -&НаСервере -Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - - ТекущийОбъект.ДополнительныеСвойства.Вставить("Расписание", Расписание); - ТекущийОбъект.ДополнительныеСвойства.Вставить("Использование", РегламентноеЗаданиеИспользуется); - Если ТипОчереди = "" Тогда - ТекущийОбъект.Хранилище = Неопределено; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура РегламентноеЗаданиеИспользуетсяПриИзменении(Элемент) - - УстановитьДоступность(ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура РасписаниеСтрокойНажатие(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); - ДиалогРасписания.Показать(Новый ОписаниеОповещения("РасписаниеСтрокойНажатиеЗавершение", ЭтотОбъект)); - -КонецПроцедуры - -&НаКлиенте -Процедура РасписаниеСтрокойНажатиеЗавершение(РасписаниеОтвет, ДополнительныеПараметры) Экспорт - - Если РасписаниеОтвет <> Неопределено Тогда - - Модифицированность = Истина; - Расписание = РасписаниеОтвет; - РасписаниеСтрокой = Строка(Расписание); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ТипОчередиПриИзменении(Элемент) - - УстановитьДоступность(ЭтаФорма); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервере -Процедура УстановитьУсловноеОформление() - - УсловноеОформление.Элементы.Очистить(); - -КонецПроцедуры - -&НаСервере -Процедура ПриЧтенииСозданииНаСервере() - - УстановитьПривилегированныйРежим(Истина); - Задание = РегламентныеЗаданияСервер.Задание(Объект.РегламентноеЗадание); - Если Задание <> Неопределено Тогда - Расписание = Задание.Расписание; - РегламентноеЗаданиеИспользуется = Задание.Использование; - РасписаниеСтрокой = Строка(Расписание); - Иначе - Расписание = Новый РасписаниеРегламентногоЗадания; - РасписаниеСтрокой = РасписаниеСтрокой = Строка(Расписание); - КонецЕсли; - - Если ЗначениеЗаполнено(Объект.Хранилище) Тогда - ТипОчереди = "Хранилище"; - Иначе - ТипОчереди = ""; - КонецЕсли; - - УстановитьВидимость(); - - УстановитьДоступность(ЭтаФорма); - -КонецПроцедуры - -&НаСервере -Процедура УстановитьВидимость() - - Возврат; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьДоступность(Форма) - - Форма.Элементы.РасписаниеСтрокой.Доступность = Форма.РегламентноеЗаданиеИспользуется; - - Форма.Элементы.Хранилище.Доступность = Форма.ТипОчереди = "Хранилище"; - Форма.Элементы.ГруппаОграниченийНомеровВерсий.Доступность = Форма.ТипОчереди = "Хранилище"; - -КонецПроцедуры - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + + Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда + + ПриЧтенииСозданииНаСервере(); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ПриЧтенииСозданииНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + ТекущийОбъект.ДополнительныеСвойства.Вставить("Расписание", Расписание); + ТекущийОбъект.ДополнительныеСвойства.Вставить("Использование", РегламентноеЗаданиеИспользуется); + Если ТипОчереди = "" Тогда + ТекущийОбъект.Хранилище = Неопределено; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура РегламентноеЗаданиеИспользуетсяПриИзменении(Элемент) + + УстановитьДоступность(ЭтаФорма); + +КонецПроцедуры + +&НаКлиенте +Процедура РасписаниеСтрокойНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); + ДиалогРасписания.Показать(Новый ОписаниеОповещения("РасписаниеСтрокойНажатиеЗавершение", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура РасписаниеСтрокойНажатиеЗавершение(РасписаниеОтвет, ДополнительныеПараметры) Экспорт + + Если РасписаниеОтвет <> Неопределено Тогда + + Модифицированность = Истина; + Расписание = РасписаниеОтвет; + РасписаниеСтрокой = Строка(Расписание); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТипОчередиПриИзменении(Элемент) + + УстановитьДоступность(ЭтаФорма); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииСозданииНаСервере() + + УстановитьПривилегированныйРежим(Истина); + Задание = РегламентныеЗаданияСервер.Задание(Объект.РегламентноеЗадание); + Если Задание <> Неопределено Тогда + Расписание = Задание.Расписание; + РегламентноеЗаданиеИспользуется = Задание.Использование; + РасписаниеСтрокой = Строка(Расписание); + Иначе + Расписание = Новый РасписаниеРегламентногоЗадания; + РасписаниеСтрокой = РасписаниеСтрокой = Строка(Расписание); + КонецЕсли; + + Если ЗначениеЗаполнено(Объект.Хранилище) Тогда + ТипОчереди = "Хранилище"; + Иначе + ТипОчереди = ""; + КонецЕсли; + + УстановитьВидимость(); + + УстановитьДоступность(ЭтаФорма); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимость() + + Возврат; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьДоступность(Форма) + + Форма.Элементы.РасписаниеСтрокой.Доступность = Форма.РегламентноеЗаданиеИспользуется; + + Форма.Элементы.Хранилище.Доступность = Форма.ТипОчереди = "Хранилище"; + Форма.Элементы.ГруппаОграниченийНомеровВерсий.Доступность = Форма.ТипОчереди = "Хранилище"; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/GitConverter/src/Catalogs/ОчередиВыполнения/ObjectModule.bsl b/GitConverter/src/Catalogs/ОчередиВыполнения/ObjectModule.bsl index 7fa300f..dbe93c8 100644 --- a/GitConverter/src/Catalogs/ОчередиВыполнения/ObjectModule.bsl +++ b/GitConverter/src/Catalogs/ОчередиВыполнения/ObjectModule.bsl @@ -1,114 +1,121 @@ - -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область ОбработчикиСобытий - -Процедура ПередЗаписью(Отказ) - - Если Отказ Тогда - Возврат; - КонецЕсли; - - Если ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - // Создание регламентного задания (получение уникального идентификатора) - УстановитьПривилегированныйРежим(Истина); - - Задание = РегламентныеЗаданияСервер.Задание(РегламентноеЗадание); - Если Задание = Неопределено Тогда - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОбработкаОчереди); - ПараметрыЗадания.Вставить("Использование", Ложь); - ПараметрыЗадания.Вставить("Расписание", Новый РасписаниеРегламентногоЗадания); - ПараметрыЗадания.Вставить("Наименование", НСтр("ru = 'Обработка очереди'") + ": " + СокрЛП(Наименование)); - Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); - - РегламентноеЗадание = РегламентныеЗаданияСервер.УникальныйИдентификатор(Задание); - - КонецЕсли; - - ДополнительныеСвойства.Вставить("Задание",Задание); - УстановитьПривилегированныйРежим(Ложь); - - Если НЕ ЗначениеЗаполнено(Хранилище) Тогда - ПрефиксНачалаНомераВерсии = 0; - ПрефиксОкончанияНомераВерсии = 0; - КонецЕсли; - - -КонецПроцедуры - -Процедура ПриКопировании(ОбъектКопирования) - - РегламентноеЗадание = Неопределено; - -КонецПроцедуры - -Процедура ПередУдалением(Отказ) - - Если ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - - РегламентныеЗаданияСервер.УдалитьЗадание(РегламентноеЗадание); - -КонецПроцедуры - -Процедура ПриЗаписи(Отказ) - - Если Отказ ИЛИ ОбменДанными.Загрузка ИЛИ ЭтоГруппа Тогда - Возврат; - КонецЕсли; - - Если ДополнительныеСвойства.Свойство("Задание") Тогда - Задание = ДополнительныеСвойства.Задание; - Если Задание = Неопределено Тогда - Возврат; - КонецЕсли; - Иначе - Возврат; - КонецЕсли; - - ПараметрыЗадания = Новый Структура; - - // Расписание устанавливается в форме элемента - Если ДополнительныеСвойства.Свойство("Расписание") - И ТипЗнч(ДополнительныеСвойства.Расписание) = Тип("РасписаниеРегламентногоЗадания") - И Строка(ДополнительныеСвойства.Расписание) <> Строка(Задание.Расписание) Тогда - ПараметрыЗадания.Вставить("Расписание", ДополнительныеСвойства.Расписание); - КонецЕсли; - - // Использование устанавливается в форме элемента - Если ПометкаУдаления И Задание.Использование Тогда - - ПараметрыЗадания.Вставить("Использование", Ложь); - - ИначеЕсли ДополнительныеСвойства.Свойство("Использование") - И ДополнительныеСвойства.Использование <> Задание.Использование Тогда - - ПараметрыЗадания.Вставить("Использование", ДополнительныеСвойства.Использование); - - КонецЕсли; - НаименованиеЗадания = НСтр("ru = 'Обработка очереди'") + ": "; - - НаименованиеЗадания = НаименованиеЗадания + СокрЛП(Наименование); - ПараметрыЗадания.Вставить("Наименование", НаименованиеЗадания); - ПараметрыЗадания.Вставить("Ключ", Строка(Ссылка.УникальныйИдентификатор())); - - Если Задание.Параметры.Количество() <> 1 ИЛИ Задание.Параметры[0] <> Ссылка Тогда - МассивПараметров = Новый Массив; - МассивПараметров.Добавить(Ссылка); - ПараметрыЗадания.Вставить("Параметры", МассивПараметров); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - РегламентныеЗаданияСервер.ИзменитьЗадание(РегламентноеЗадание, ПараметрыЗадания); - -КонецПроцедуры - -#КонецОбласти - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ОбработчикиСобытий + +Процедура ПередЗаписью(Отказ) + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + // Создание регламентного задания (получение уникального идентификатора) + УстановитьПривилегированныйРежим(Истина); + + Задание = РегламентныеЗаданияСервер.Задание(РегламентноеЗадание); + Если Задание = Неопределено Тогда + + ПараметрыЗадания = Новый Структура; + ПараметрыЗадания.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОбработкаОчереди); + ПараметрыЗадания.Вставить("Использование", Ложь); + ПараметрыЗадания.Вставить("Расписание", Новый РасписаниеРегламентногоЗадания); + ПараметрыЗадания.Вставить("Наименование", НСтр("ru = 'Обработка очереди'") + ": " + СокрЛП(Наименование)); + Задание = РегламентныеЗаданияСервер.ДобавитьЗадание(ПараметрыЗадания); + + РегламентноеЗадание = РегламентныеЗаданияСервер.УникальныйИдентификатор(Задание); + + КонецЕсли; + + ДополнительныеСвойства.Вставить("Задание",Задание); + УстановитьПривилегированныйРежим(Ложь); + + Если НЕ ЗначениеЗаполнено(Хранилище) Тогда + ПрефиксНачалаНомераВерсии = 0; + ПрефиксОкончанияНомераВерсии = 0; + КонецЕсли; + + +КонецПроцедуры + +Процедура ПриКопировании(ОбъектКопирования) + + РегламентноеЗадание = Неопределено; + +КонецПроцедуры + +Процедура ПередУдалением(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + РегламентныеЗаданияСервер.УдалитьЗадание(РегламентноеЗадание); + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если Отказ ИЛИ ОбменДанными.Загрузка ИЛИ ЭтоГруппа Тогда + Возврат; + КонецЕсли; + + Если ДополнительныеСвойства.Свойство("Задание") Тогда + Задание = ДополнительныеСвойства.Задание; + Если Задание = Неопределено Тогда + Возврат; + КонецЕсли; + Иначе + Возврат; + КонецЕсли; + + ПараметрыЗадания = Новый Структура; + + // Расписание устанавливается в форме элемента + Если ДополнительныеСвойства.Свойство("Расписание") + И ТипЗнч(ДополнительныеСвойства.Расписание) = Тип("РасписаниеРегламентногоЗадания") + И Строка(ДополнительныеСвойства.Расписание) <> Строка(Задание.Расписание) Тогда + ПараметрыЗадания.Вставить("Расписание", ДополнительныеСвойства.Расписание); + КонецЕсли; + + // Использование устанавливается в форме элемента + Если ПометкаУдаления И Задание.Использование Тогда + + ПараметрыЗадания.Вставить("Использование", Ложь); + + ИначеЕсли ДополнительныеСвойства.Свойство("Использование") + И ДополнительныеСвойства.Использование <> Задание.Использование Тогда + + ПараметрыЗадания.Вставить("Использование", ДополнительныеСвойства.Использование); + + КонецЕсли; + НаименованиеЗадания = НСтр("ru = 'Обработка очереди'") + ": "; + + НаименованиеЗадания = НаименованиеЗадания + СокрЛП(Наименование); + ПараметрыЗадания.Вставить("Наименование", НаименованиеЗадания); + ПараметрыЗадания.Вставить("Ключ", Строка(Ссылка.УникальныйИдентификатор())); + + Если Задание.Параметры.Количество() <> 1 ИЛИ Задание.Параметры[0] <> Ссылка Тогда + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Ссылка); + ПараметрыЗадания.Вставить("Параметры", МассивПараметров); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + РегламентныеЗаданияСервер.ИзменитьЗадание(РегламентноеЗадание, ПараметрыЗадания); + +КонецПроцедуры + +#КонецОбласти + #КонецЕсли \ No newline at end of file diff --git a/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 6011c5c..3dba37f 100644 --- a/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -1,2 +1,3 @@ - - \ No newline at end of file + + + diff --git a/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Module.bsl b/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Module.bsl index 34fbbfd..0404016 100644 --- a/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Module.bsl +++ b/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаСписка/Module.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + #Область ОбработчикиСобытийТаблицыФормыСписок &НаСервереБезКонтекста diff --git a/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаЭлемента/Module.bsl b/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаЭлемента/Module.bsl index 95e157a..5bcb1ef 100644 --- a/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаЭлемента/Module.bsl +++ b/GitConverter/src/Catalogs/ХранилищаКонфигураций/Forms/ФормаЭлемента/Module.bsl @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// #Область ОбработчикиСобытийФормы diff --git a/GitConverter/src/Catalogs/ХранилищаКонфигураций/ManagerModule.bsl b/GitConverter/src/Catalogs/ХранилищаКонфигураций/ManagerModule.bsl deleted file mode 100644 index e69de29..0000000 diff --git a/GitConverter/src/Catalogs/ХранилищаКонфигураций/ObjectModule.bsl b/GitConverter/src/Catalogs/ХранилищаКонфигураций/ObjectModule.bsl index 5baf7c0..9835b13 100644 --- a/GitConverter/src/Catalogs/ХранилищаКонфигураций/ObjectModule.bsl +++ b/GitConverter/src/Catalogs/ХранилищаКонфигураций/ObjectModule.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда #Область ОбработчикиСобытий diff --git a/GitConverter/src/CommonModules/ДлительныеОперации/Module.bsl b/GitConverter/src/CommonModules/ДлительныеОперации/Module.bsl index 2b44f5d..8f4cc21 100644 --- a/GitConverter/src/CommonModules/ДлительныеОперации/Module.bsl +++ b/GitConverter/src/CommonModules/ДлительныеОперации/Module.bsl @@ -1,260 +1,268 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Поддержка работы длительных серверных операций в веб-клиенте. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Отменяет выполнение фонового задания по переданному идентификатору. -// -// Параметры: -// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. -// -Процедура ОтменитьВыполнениеЗадания(Знач ИдентификаторЗадания) Экспорт - - Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда - Возврат; - КонецЕсли; - - Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); - Если Задание = Неопределено - ИЛИ Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда - - Возврат; - КонецЕсли; - - Попытка - Задание.Отменить(); - Исключение - // Возможно задание как раз в этот момент закончилось и ошибки нет. - ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Отмена выполнения фонового задания'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - -КонецПроцедуры - -// Проверяет состояние фонового задания по переданному идентификатору. -// При аварийном завершении задания вызывает исключение. -// -// Параметры: -// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. -// -// Возвращаемое значение: -// Булево - состояние выполнения задания. -// -Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания) Экспорт - - Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); - - Если Задание <> Неопределено - И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда - Возврат Ложь; - КонецЕсли; - - ОперацияНеВыполнена = Истина; - ПоказатьПолныйТекстОшибки = Ложь; - Если Задание = Неопределено Тогда - ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Фоновое задание не найдено'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , Строка(ИдентификаторЗадания)); - Иначе - Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда - ОшибкаЗадания = Задание.ИнформацияОбОшибке; - Если ОшибкаЗадания <> Неопределено Тогда - ПоказатьПолныйТекстОшибки = Истина; - КонецЕсли; - ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Длительные операции.Фоновое задание отменено администратором'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - НСтр("ru = 'Задание завершилось с неизвестной ошибкой.'")); - Иначе - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Если ПоказатьПолныйТекстОшибки Тогда - ТекстОшибки = КраткоеПредставлениеОшибки(ПолучитьИнформациюОбОшибке(Задание.ИнформацияОбОшибке)); - ВызватьИсключение(ТекстОшибки); - ИначеЕсли ОперацияНеВыполнена Тогда - ВызватьИсключение(НСтр("ru = 'Не удалось выполнить данную операцию. - |Подробности см. в Журнале регистрации.'")); - КонецЕсли; - -КонецФункции - -// Регистрирует в сообщениях информацию о ходе выполнения фонового задания. -// В дальнейшем эту информацию можно считать с клиента при помощи функции ПрочитатьПрогресс. -// -// Параметры: -// Процент - Число - Необязательный. Процент выполнения. -// Текст - Строка - Необязательный. Информация о текущей операции. -// ДополнительныеПараметры - Произвольный - Необязательный. Любая дополнительная информация, -// которую необходимо передать на клиент. Значение должно быть простым (сериализуемым в XML строку). -// -Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт - - ПередаваемоеЗначение = Новый Структура; - Если Процент <> Неопределено Тогда - ПередаваемоеЗначение.Вставить("Процент", Процент); - КонецЕсли; - Если Текст <> Неопределено Тогда - ПередаваемоеЗначение.Вставить("Текст", Текст); - КонецЕсли; - Если ДополнительныеПараметры <> Неопределено Тогда - ПередаваемоеЗначение.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); - КонецЕсли; - - ПередаваемыйТекст = ОбщегоНазначения.ЗначениеВСтрокуXML(ПередаваемоеЗначение); - - Текст = "{" + ИмяПодсистемы() + "}" + ПередаваемыйТекст; - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст); - - ПолучитьСообщенияПользователю(Истина); // Удаление предыдущих сообщений. - -КонецПроцедуры - -// Находит фоновое задание и считывает из его сообщений информацию о ходе выполнения. -// -// Возвращаемое значение: -// Структура - Информация о ходе выполнения фонового задания. -// Ключи и значения структуры соответствуют именам и значениям параметров процедуры СообщитьПрогресс(). -// -Функция ПрочитатьПрогресс(Знач ИдентификаторЗадания) Экспорт - Перем Результат; - - Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); - Если Задание = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина); - Если МассивСообщений = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; - - Количество = МассивСообщений.Количество(); - - Для Номер = 1 По Количество Цикл - ОбратныйИндекс = Количество - Номер; - Сообщение = МассивСообщений[ОбратныйИндекс]; - - Если СтрНачинаетсяС(Сообщение.Текст, "{") Тогда - Позиция = СтрНайти(Сообщение.Текст, "}"); - Если Позиция > 2 Тогда - ИдентификаторМеханизма = Сред(Сообщение.Текст, 2, Позиция - 2); - Если ИдентификаторМеханизма = ИмяПодсистемы() Тогда - ПолученныйТекст = Сред(Сообщение.Текст, Позиция + 1); - Результат = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПолученныйТекст); - Прервать; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат Результат; -КонецФункции - -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -// Запускает выполнение процедуры в фоновом задании. -Функция ЗапуститьВыполнениеВФонеСлужебный(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, Знач Параметры, - Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь, ОжидатьЗавершение = Истина) Экспорт - - АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы); - - Результат = Новый Структура; - Результат.Вставить("АдресХранилища", АдресХранилища); - Результат.Вставить("ЗаданиеВыполнено", Ложь); - Результат.Вставить("ИдентификаторЗадания", Неопределено); - - Если Не ЗначениеЗаполнено(НаименованиеЗадания) Тогда - НаименованиеЗадания = ИмяЭкспортнойПроцедуры; - КонецЕсли; - - ПараметрыЭкспортнойПроцедуры = Новый Массив; - ПараметрыЭкспортнойПроцедуры.Добавить(Параметры); - ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилища); - - Если ИспользоватьДополнительноеВременноеХранилище Тогда - АдресХранилищаДополнительный = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы); - ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилищаДополнительный); - КонецЕсли; - - ЗапущеноЗаданий = 0; - Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - Отбор = Новый Структура; - Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); - ЗапущеноЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор).Количество(); - КонецЕсли; - - Если ЗапущеноЗаданий > 0 Тогда - СтандартныеПодсистемыСервер.ВыполнитьМетодКонфигурации(ИмяЭкспортнойПроцедуры, ПараметрыЭкспортнойПроцедуры); - Результат.ЗаданиеВыполнено = Истина; - Иначе - ПараметрыЗадания = Новый Массив; - ПараметрыЗадания.Добавить(ИмяЭкспортнойПроцедуры); - ПараметрыЗадания.Добавить(ПараметрыЭкспортнойПроцедуры); - ВремяОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2); - - Задание = СтандартныеПодсистемыСервер.ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяЭкспортнойПроцедуры, - ПараметрыЭкспортнойПроцедуры,, НаименованиеЗадания); - - Если ОжидатьЗавершение Тогда - Попытка - Задание.ОжидатьЗавершения(ВремяОжидания); - Исключение - // Специальная обработка не требуется, возможно исключение вызвано истечением времени ожидания. - КонецПопытки; - КонецЕсли; - - Результат.ЗаданиеВыполнено = ЗаданиеВыполнено(Задание.УникальныйИдентификатор); - Результат.ИдентификаторЗадания = Задание.УникальныйИдентификатор; - КонецЕсли; - - Если ИспользоватьДополнительноеВременноеХранилище Тогда - Результат.Вставить("АдресХранилищаДополнительный", АдресХранилищаДополнительный); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция НайтиЗаданиеПоИдентификатору(Знач ИдентификаторЗадания) - - Если ТипЗнч(ИдентификаторЗадания) = Тип("Строка") Тогда - ИдентификаторЗадания = Новый УникальныйИдентификатор(ИдентификаторЗадания); - КонецЕсли; - - Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); - - Возврат Задание; - -КонецФункции - -Функция ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке) - - Результат = ИнформацияОбОшибке; - Если ИнформацияОбОшибке <> Неопределено Тогда - Если ИнформацияОбОшибке.Причина <> Неопределено Тогда - Результат = ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке.Причина); - КонецЕсли; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -Функция ИмяПодсистемы() - Возврат "СтандартныеПодсистемы.ДлительныеОперации"; -КонецФункции - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// Поддержка работы длительных серверных операций в веб-клиенте. +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Отменяет выполнение фонового задания по переданному идентификатору. +// +// Параметры: +// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. +// +Процедура ОтменитьВыполнениеЗадания(Знач ИдентификаторЗадания) Экспорт + + Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда + Возврат; + КонецЕсли; + + Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); + Если Задание = Неопределено + ИЛИ Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда + + Возврат; + КонецЕсли; + + Попытка + Задание.Отменить(); + Исключение + // Возможно задание как раз в этот момент закончилось и ошибки нет. + ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Отмена выполнения фонового задания'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + +КонецПроцедуры + +// Проверяет состояние фонового задания по переданному идентификатору. +// При аварийном завершении задания вызывает исключение. +// +// Параметры: +// ИдентификаторЗадания - УникальныйИдентификатор - идентификатор фонового задания. +// +// Возвращаемое значение: +// Булево - состояние выполнения задания. +// +Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания) Экспорт + + Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); + + Если Задание <> Неопределено + И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда + Возврат Ложь; + КонецЕсли; + + ОперацияНеВыполнена = Истина; + ПоказатьПолныйТекстОшибки = Ложь; + Если Задание = Неопределено Тогда + ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Фоновое задание не найдено'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , Строка(ИдентификаторЗадания)); + Иначе + Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда + ОшибкаЗадания = Задание.ИнформацияОбОшибке; + Если ОшибкаЗадания <> Неопределено Тогда + ПоказатьПолныйТекстОшибки = Истина; + КонецЕсли; + ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Длительные операции.Фоновое задание отменено администратором'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + НСтр("ru = 'Задание завершилось с неизвестной ошибкой.'")); + Иначе + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Если ПоказатьПолныйТекстОшибки Тогда + ТекстОшибки = КраткоеПредставлениеОшибки(ПолучитьИнформациюОбОшибке(Задание.ИнформацияОбОшибке)); + ВызватьИсключение(ТекстОшибки); + ИначеЕсли ОперацияНеВыполнена Тогда + ВызватьИсключение(НСтр("ru = 'Не удалось выполнить данную операцию. + |Подробности см. в Журнале регистрации.'")); + КонецЕсли; + +КонецФункции + +// Регистрирует в сообщениях информацию о ходе выполнения фонового задания. +// В дальнейшем эту информацию можно считать с клиента при помощи функции ПрочитатьПрогресс. +// +// Параметры: +// Процент - Число - Необязательный. Процент выполнения. +// Текст - Строка - Необязательный. Информация о текущей операции. +// ДополнительныеПараметры - Произвольный - Необязательный. Любая дополнительная информация, +// которую необходимо передать на клиент. Значение должно быть простым (сериализуемым в XML строку). +// +Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт + + ПередаваемоеЗначение = Новый Структура; + Если Процент <> Неопределено Тогда + ПередаваемоеЗначение.Вставить("Процент", Процент); + КонецЕсли; + Если Текст <> Неопределено Тогда + ПередаваемоеЗначение.Вставить("Текст", Текст); + КонецЕсли; + Если ДополнительныеПараметры <> Неопределено Тогда + ПередаваемоеЗначение.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); + КонецЕсли; + + ПередаваемыйТекст = ОбщегоНазначения.ЗначениеВСтрокуXML(ПередаваемоеЗначение); + + Текст = "{" + ИмяПодсистемы() + "}" + ПередаваемыйТекст; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст); + + ПолучитьСообщенияПользователю(Истина); // Удаление предыдущих сообщений. + +КонецПроцедуры + +// Находит фоновое задание и считывает из его сообщений информацию о ходе выполнения. +// +// Возвращаемое значение: +// Структура - Информация о ходе выполнения фонового задания. +// Ключи и значения структуры соответствуют именам и значениям параметров процедуры СообщитьПрогресс(). +// +Функция ПрочитатьПрогресс(Знач ИдентификаторЗадания) Экспорт + Перем Результат; + + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); + Если Задание = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина); + Если МассивСообщений = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Количество = МассивСообщений.Количество(); + + Для Номер = 1 По Количество Цикл + ОбратныйИндекс = Количество - Номер; + Сообщение = МассивСообщений[ОбратныйИндекс]; + + Если СтрНачинаетсяС(Сообщение.Текст, "{") Тогда + Позиция = СтрНайти(Сообщение.Текст, "}"); + Если Позиция > 2 Тогда + ИдентификаторМеханизма = Сред(Сообщение.Текст, 2, Позиция - 2); + Если ИдентификаторМеханизма = ИмяПодсистемы() Тогда + ПолученныйТекст = Сред(Сообщение.Текст, Позиция + 1); + Результат = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПолученныйТекст); + Прервать; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Запускает выполнение процедуры в фоновом задании. +Функция ЗапуститьВыполнениеВФонеСлужебный(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, Знач Параметры, + Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь, ОжидатьЗавершение = Истина) Экспорт + + АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы); + + Результат = Новый Структура; + Результат.Вставить("АдресХранилища", АдресХранилища); + Результат.Вставить("ЗаданиеВыполнено", Ложь); + Результат.Вставить("ИдентификаторЗадания", Неопределено); + + Если Не ЗначениеЗаполнено(НаименованиеЗадания) Тогда + НаименованиеЗадания = ИмяЭкспортнойПроцедуры; + КонецЕсли; + + ПараметрыЭкспортнойПроцедуры = Новый Массив; + ПараметрыЭкспортнойПроцедуры.Добавить(Параметры); + ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилища); + + Если ИспользоватьДополнительноеВременноеХранилище Тогда + АдресХранилищаДополнительный = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы); + ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилищаДополнительный); + КонецЕсли; + + ЗапущеноЗаданий = 0; + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Отбор = Новый Структура; + Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); + ЗапущеноЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор).Количество(); + КонецЕсли; + + Если ЗапущеноЗаданий > 0 Тогда + СтандартныеПодсистемыСервер.ВыполнитьМетодКонфигурации(ИмяЭкспортнойПроцедуры, ПараметрыЭкспортнойПроцедуры); + Результат.ЗаданиеВыполнено = Истина; + Иначе + ПараметрыЗадания = Новый Массив; + ПараметрыЗадания.Добавить(ИмяЭкспортнойПроцедуры); + ПараметрыЗадания.Добавить(ПараметрыЭкспортнойПроцедуры); + ВремяОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2); + + Задание = СтандартныеПодсистемыСервер.ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяЭкспортнойПроцедуры, + ПараметрыЭкспортнойПроцедуры,, НаименованиеЗадания); + + Если ОжидатьЗавершение Тогда + Попытка + Задание.ОжидатьЗавершения(ВремяОжидания); + Исключение + // Специальная обработка не требуется, возможно исключение вызвано истечением времени ожидания. + КонецПопытки; + КонецЕсли; + + Результат.ЗаданиеВыполнено = ЗаданиеВыполнено(Задание.УникальныйИдентификатор); + Результат.ИдентификаторЗадания = Задание.УникальныйИдентификатор; + КонецЕсли; + + Если ИспользоватьДополнительноеВременноеХранилище Тогда + Результат.Вставить("АдресХранилищаДополнительный", АдресХранилищаДополнительный); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция НайтиЗаданиеПоИдентификатору(Знач ИдентификаторЗадания) + + Если ТипЗнч(ИдентификаторЗадания) = Тип("Строка") Тогда + ИдентификаторЗадания = Новый УникальныйИдентификатор(ИдентификаторЗадания); + КонецЕсли; + + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); + + Возврат Задание; + +КонецФункции + +Функция ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке) + + Результат = ИнформацияОбОшибке; + Если ИнформацияОбОшибке <> Неопределено Тогда + Если ИнформацияОбОшибке.Причина <> Неопределено Тогда + Результат = ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке.Причина); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ИмяПодсистемы() + Возврат "СтандартныеПодсистемы.ДлительныеОперации"; +КонецФункции + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl b/GitConverter/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl index 6a5c214..010ecfb 100644 --- a/GitConverter/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl +++ b/GitConverter/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl @@ -1,40 +1,48 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Поддержка работы длительных серверных операций в веб-клиенте. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Заполняет структуру параметров значениями по умолчанию. -// -// Параметры: -// ПараметрыОбработчикаОжидания - Структура - заполняется значениями по умолчанию. -// -// -Процедура ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания) Экспорт - - ПараметрыОбработчикаОжидания = Новый Структура; - ПараметрыОбработчикаОжидания.Вставить("МинимальныйИнтервал", 1); - ПараметрыОбработчикаОжидания.Вставить("МаксимальныйИнтервал", 15); - ПараметрыОбработчикаОжидания.Вставить("ТекущийИнтервал", 1); - ПараметрыОбработчикаОжидания.Вставить("КоэффициентУвеличенияИнтервала", 1.4); - -КонецПроцедуры - -// Заполняет структуру параметров новыми расчетными значениями. -// -// Параметры: -// ПараметрыОбработчикаОжидания - Структура - заполняется расчетными значениями. -// -// -Процедура ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания) Экспорт - - ПараметрыОбработчикаОжидания.ТекущийИнтервал = ПараметрыОбработчикаОжидания.ТекущийИнтервал * ПараметрыОбработчикаОжидания.КоэффициентУвеличенияИнтервала; - Если ПараметрыОбработчикаОжидания.ТекущийИнтервал > ПараметрыОбработчикаОжидания.МаксимальныйИнтервал Тогда - ПараметрыОбработчикаОжидания.ТекущийИнтервал = ПараметрыОбработчикаОжидания.МаксимальныйИнтервал; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// Поддержка работы длительных серверных операций в веб-клиенте. +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Заполняет структуру параметров значениями по умолчанию. +// +// Параметры: +// ПараметрыОбработчикаОжидания - Структура - заполняется значениями по умолчанию. +// +// +Процедура ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания) Экспорт + + ПараметрыОбработчикаОжидания = Новый Структура; + ПараметрыОбработчикаОжидания.Вставить("МинимальныйИнтервал", 1); + ПараметрыОбработчикаОжидания.Вставить("МаксимальныйИнтервал", 15); + ПараметрыОбработчикаОжидания.Вставить("ТекущийИнтервал", 1); + ПараметрыОбработчикаОжидания.Вставить("КоэффициентУвеличенияИнтервала", 1.4); + +КонецПроцедуры + +// Заполняет структуру параметров новыми расчетными значениями. +// +// Параметры: +// ПараметрыОбработчикаОжидания - Структура - заполняется расчетными значениями. +// +// +Процедура ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания) Экспорт + + ПараметрыОбработчикаОжидания.ТекущийИнтервал = ПараметрыОбработчикаОжидания.ТекущийИнтервал * ПараметрыОбработчикаОжидания.КоэффициентУвеличенияИнтервала; + Если ПараметрыОбработчикаОжидания.ТекущийИнтервал > ПараметрыОбработчикаОжидания.МаксимальныйИнтервал Тогда + ПараметрыОбработчикаОжидания.ТекущийИнтервал = ПараметрыОбработчикаОжидания.МаксимальныйИнтервал; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/КонвертацияХранилища/Module.bsl b/GitConverter/src/CommonModules/КонвертацияХранилища/Module.bsl index 2c9a4cc..9cdb2b7 100644 --- a/GitConverter/src/CommonModules/КонвертацияХранилища/Module.bsl +++ b/GitConverter/src/CommonModules/КонвертацияХранилища/Module.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// // Серверные процедуры и функции общего назначения для "Конвертации хранилища в Git" // diff --git a/GitConverter/src/CommonModules/ОбработкаОчередей/Module.bsl b/GitConverter/src/CommonModules/ОбработкаОчередей/Module.bsl index 9f90efd..941ec4a 100644 --- a/GitConverter/src/CommonModules/ОбработкаОчередей/Module.bsl +++ b/GitConverter/src/CommonModules/ОбработкаОчередей/Module.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + #Область ПрограммныйИнтерфейс diff --git a/GitConverter/src/CommonModules/ОбщегоНазначения/Module.bsl b/GitConverter/src/CommonModules/ОбщегоНазначения/Module.bsl index 2d8dbb6..fa0a056 100644 --- a/GitConverter/src/CommonModules/ОбщегоНазначения/Module.bsl +++ b/GitConverter/src/CommonModules/ОбщегоНазначения/Module.bsl @@ -1,314 +1,322 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - для работы с данными в базе; -// - для работы с прикладными типами и коллекциями значений; -// - математические процедуры и функции; -// - для работы с внешним соединением; -// - для работы с формами; -// - для работы с типами, объектами метаданных и их строковыми представлениями; -// - функции определения типов объектов метаданных; -// - сохранение, чтение и удаление настроек из хранилищ; -// - для работы с табличными документами; -// - для работы с журналом регистрации; -// - для работы в режиме разделения данных; -// - версионирование программных интерфейсов; -// - вспомогательные процедуры и функции. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Процедура удаляет из массива МассивРеквизитов элементы, соответствующие именам -// реквизитов объекта из массива МассивНепроверяемыхРеквизитов. -// Для использования в обработчиках события ОбработкаПроверкиЗаполнения. -// -// Параметры: -// МассивРеквизитов - Массив - массив строк с именами реквизитов объекта. -// МассивНепроверяемыхРеквизитов - Массив строк с именами реквизитов объекта, не требующих проверки. -// -Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт - - Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл - - ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива); - Если ПорядковыйНомер <> Неопределено Тогда - МассивРеквизитов.Удалить(ПорядковыйНомер); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Общие процедуры и функции для работы с данными в базе. - -// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы -// по ссылке на объект. -// -// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить. -// -// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате -// требований к свойствам структуры. -// Например, "Код, Наименование, Родитель". -// - Структура, ФиксированнаяСтруктура - в качестве ключа передается -// псевдоним поля для возвращаемой структуры с результатом, а в качестве -// значения (опционально) фактическое имя поля в таблице. -// Если значение не определено, то имя поля берется из ключа. -// - Массив, ФиксированныйМассив - имена реквизитов в формате требований -// к свойствам структуры. -// -// Возвращаемое значение: -// Структура - содержит имена (ключи) и значения затребованных реквизитов. -// Если строка затребованных реквизитов пуста, то возвращается пустая структура. -// Если в качестве объекта передана пустая ссылка, то все реквизиты вернутся со значением Неопределено. -// -Функция ЗначенияРеквизитовОбъекта(Знач Ссылка, Знач Реквизиты) Экспорт - - Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда - Если ПустаяСтрока(Реквизиты) Тогда - Возврат Новый Структура; - КонецЕсли; - Реквизиты = СтрРазделить(Реквизиты, ", ", Ложь); - КонецЕсли; - - СтруктураРеквизитов = Новый Структура; - Если ТипЗнч(Реквизиты) = Тип("Структура") Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда - СтруктураРеквизитов = Реквизиты; - ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда - Для Каждого Реквизит Из Реквизиты Цикл - СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, ".", ""), Реквизит); - КонецЦикла; - Иначе - ВызватьИсключение СтрШаблон(НСтр("ru = 'Неверный тип второго параметра Реквизиты: %1'"), Строка(ТипЗнч(Реквизиты))); - КонецЕсли; - - ТекстПолей = ""; - Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл - ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), - СокрЛП(КлючИЗначение.Значение), - СокрЛП(КлючИЗначение.Ключ)); - - Псевдоним = СокрЛП(КлючИЗначение.Ключ); - - ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " - | " + ИмяПоля + " КАК " + Псевдоним; - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.Текст = - "ВЫБРАТЬ - |" + ТекстПолей + " - |ИЗ - | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы - |ГДЕ - | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка - |"; - Выборка = Запрос.Выполнить().Выбрать(); - Выборка.Следующий(); - - Результат = Новый Структура; - Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл - Результат.Вставить(КлючИЗначение.Ключ); - КонецЦикла; - ЗаполнитьЗначенияСвойств(Результат, Выборка); - - Возврат Результат; - -КонецФункции - -// Возвращает значение реквизита, прочитанного из информационной базы по ссылке на объект. -// -// Если доступа к реквизиту нет, возникнет исключение прав доступа. -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// Ссылка - ссылка на объект, - элемент справочника, документ, ... -// ИмяРеквизита - Строка, например, "Код". -// -// Возвращаемое значение: -// Произвольный - зависит от типа значения прочитанного реквизита. -// -Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) Экспорт - - Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита); - Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")]; - -КонецФункции - -// Возвращает значения реквизитов, прочитанные из информационной базы -// для нескольких объектов. -// -// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// МассивСсылок - массив ссылок на объекты одного типа. -// ВАЖНО! значения массива должны быть ссылками на -// объекты одного типа! -// ИменаРеквизитов - Строка, имена реквизитов перечисленные через запятую, -// в формате требований к свойствам структуры. -// Например, "Код, Наименование, Родитель". -// -// Возвращаемое значение: -// Соответствие - где ключ - ссылка на объект, а Значение - структура, которая -// содержит список свойств, как список имен в строке. -// ИменаРеквизитов, со значениям реквизитов, прочитанными из информационной базы. -// -Функция ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов) Экспорт - - ЗначенияРеквизитов = Новый Соответствие; - Если МассивСсылок.Количество() = 0 Тогда - Возврат ЗначенияРеквизитов; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Ссылка КАК Ссылка, " + ИменаРеквизитов + " - |ИЗ - | " + МассивСсылок[0].Метаданные().ПолноеИмя() + " КАК Таблица - |ГДЕ - | Таблица.Ссылка В (&МассивСсылок)"; - Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок); - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - Результат = Новый Структура(ИменаРеквизитов); - ЗаполнитьЗначенияСвойств(Результат, Выборка); - ЗначенияРеквизитов[Выборка.Ссылка] = Результат; - КонецЦикла; - - Возврат ЗначенияРеквизитов; - -КонецФункции - -// Возвращает значения реквизита, прочитанного из информационной базы для нескольких объектов. -// -// Если доступа к реквизиту нет, возникнет исключение прав доступа. -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// МассивСсылок - массив ссылок на объекты одного типа. -// ВАЖНО! значения массива должны быть ссылками на -// объекты одного типа! -// ИмяРеквизита - Строка, например, "Код". -// -// Возвращаемое значение: -// Соответствие - Ключ - ссылка на объект, Значение - значение прочитанного реквизита. -// -Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита) Экспорт - - ЗначенияРеквизитов = ЗначенияРеквизитовОбъектов(МассивСсылок, ИмяРеквизита); - Для Каждого Элемент Из ЗначенияРеквизитов Цикл - ЗначенияРеквизитов[Элемент.Ключ] = Элемент.Значение[ИмяРеквизита]; - КонецЦикла; - - Возврат ЗначенияРеквизитов; - -КонецФункции - -// Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь). -// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно. -// -// Параметры: -// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если -// нужно проверить строку соединения не текущей информационной базы. -// -// Возвращаемое значение: -// Булево. -// -Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт - - Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда - СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы(); - КонецЕсли; - Возврат СтрНайти(Врег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1; - -КонецФункции - -// Возвращает значение в виде XML-строки. -// Преобразованы в XML-строку (сериализованы) могут быть только те объекты, -// для которых в описании указано, что они сериализуются. -// -// Параметры: -// Значение - Произвольный. Значение, которое необходимо сериализовать в XML-строку. -// -// Возвращаемое значение: -// Строка - XML-строка представления значения в сериализованном виде. -// -Функция ЗначениеВСтрокуXML(Значение) Экспорт - - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.УстановитьСтроку(); - СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное); - - Возврат ЗаписьXML.Закрыть(); -КонецФункции - -// Возвращает значение, полученное из XML-строки. -// Получены из XML-строки могут быть только те объекты, -// для которых в описании указано, что они сериализуются. -// -// Параметры: -// СтрокаXML - строка представления значения в сериализованном виде. -// -// Возвращаемое значение: -// Значение, полученное из переданной XML-строки. -// -Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт - - ЧтениеXML = Новый ЧтениеXML; - ЧтениеXML.УстановитьСтроку(СтрокаXML); - - Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML); -КонецФункции - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// Серверные процедуры и функции общего назначения: +// - для работы с данными в базе; +// - для работы с прикладными типами и коллекциями значений; +// - математические процедуры и функции; +// - для работы с внешним соединением; +// - для работы с формами; +// - для работы с типами, объектами метаданных и их строковыми представлениями; +// - функции определения типов объектов метаданных; +// - сохранение, чтение и удаление настроек из хранилищ; +// - для работы с табличными документами; +// - для работы с журналом регистрации; +// - для работы в режиме разделения данных; +// - версионирование программных интерфейсов; +// - вспомогательные процедуры и функции. +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Процедура удаляет из массива МассивРеквизитов элементы, соответствующие именам +// реквизитов объекта из массива МассивНепроверяемыхРеквизитов. +// Для использования в обработчиках события ОбработкаПроверкиЗаполнения. +// +// Параметры: +// МассивРеквизитов - Массив - массив строк с именами реквизитов объекта. +// МассивНепроверяемыхРеквизитов - Массив строк с именами реквизитов объекта, не требующих проверки. +// +Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт + + Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл + + ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива); + Если ПорядковыйНомер <> Неопределено Тогда + МассивРеквизитов.Удалить(ПорядковыйНомер); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Общие процедуры и функции для работы с данными в базе. + +// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы +// по ссылке на объект. +// +// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Функция не предназначена для получения значений реквизитов пустых ссылок. +// +// Параметры: +// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить. +// +// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате +// требований к свойствам структуры. +// Например, "Код, Наименование, Родитель". +// - Структура, ФиксированнаяСтруктура - в качестве ключа передается +// псевдоним поля для возвращаемой структуры с результатом, а в качестве +// значения (опционально) фактическое имя поля в таблице. +// Если значение не определено, то имя поля берется из ключа. +// - Массив, ФиксированныйМассив - имена реквизитов в формате требований +// к свойствам структуры. +// +// Возвращаемое значение: +// Структура - содержит имена (ключи) и значения затребованных реквизитов. +// Если строка затребованных реквизитов пуста, то возвращается пустая структура. +// Если в качестве объекта передана пустая ссылка, то все реквизиты вернутся со значением Неопределено. +// +Функция ЗначенияРеквизитовОбъекта(Знач Ссылка, Знач Реквизиты) Экспорт + + Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда + Если ПустаяСтрока(Реквизиты) Тогда + Возврат Новый Структура; + КонецЕсли; + Реквизиты = СтрРазделить(Реквизиты, ", ", Ложь); + КонецЕсли; + + СтруктураРеквизитов = Новый Структура; + Если ТипЗнч(Реквизиты) = Тип("Структура") Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда + СтруктураРеквизитов = Реквизиты; + ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда + Для Каждого Реквизит Из Реквизиты Цикл + СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, ".", ""), Реквизит); + КонецЦикла; + Иначе + ВызватьИсключение СтрШаблон(НСтр("ru = 'Неверный тип второго параметра Реквизиты: %1'"), Строка(ТипЗнч(Реквизиты))); + КонецЕсли; + + ТекстПолей = ""; + Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл + ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), + СокрЛП(КлючИЗначение.Значение), + СокрЛП(КлючИЗначение.Ключ)); + + Псевдоним = СокрЛП(КлючИЗначение.Ключ); + + ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " + | " + ИмяПоля + " КАК " + Псевдоним; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.Текст = + "ВЫБРАТЬ + |" + ТекстПолей + " + |ИЗ + | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы + |ГДЕ + | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка + |"; + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Результат = Новый Структура; + Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл + Результат.Вставить(КлючИЗначение.Ключ); + КонецЦикла; + ЗаполнитьЗначенияСвойств(Результат, Выборка); + + Возврат Результат; + +КонецФункции + +// Возвращает значение реквизита, прочитанного из информационной базы по ссылке на объект. +// +// Если доступа к реквизиту нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Функция не предназначена для получения значений реквизитов пустых ссылок. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// ИмяРеквизита - Строка, например, "Код". +// +// Возвращаемое значение: +// Произвольный - зависит от типа значения прочитанного реквизита. +// +Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) Экспорт + + Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита); + Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")]; + +КонецФункции + +// Возвращает значения реквизитов, прочитанные из информационной базы +// для нескольких объектов. +// +// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Функция не предназначена для получения значений реквизитов пустых ссылок. +// +// Параметры: +// МассивСсылок - массив ссылок на объекты одного типа. +// ВАЖНО! значения массива должны быть ссылками на +// объекты одного типа! +// ИменаРеквизитов - Строка, имена реквизитов перечисленные через запятую, +// в формате требований к свойствам структуры. +// Например, "Код, Наименование, Родитель". +// +// Возвращаемое значение: +// Соответствие - где ключ - ссылка на объект, а Значение - структура, которая +// содержит список свойств, как список имен в строке. +// ИменаРеквизитов, со значениям реквизитов, прочитанными из информационной базы. +// +Функция ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов) Экспорт + + ЗначенияРеквизитов = Новый Соответствие; + Если МассивСсылок.Количество() = 0 Тогда + Возврат ЗначенияРеквизитов; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Ссылка КАК Ссылка, " + ИменаРеквизитов + " + |ИЗ + | " + МассивСсылок[0].Метаданные().ПолноеИмя() + " КАК Таблица + |ГДЕ + | Таблица.Ссылка В (&МассивСсылок)"; + Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Результат = Новый Структура(ИменаРеквизитов); + ЗаполнитьЗначенияСвойств(Результат, Выборка); + ЗначенияРеквизитов[Выборка.Ссылка] = Результат; + КонецЦикла; + + Возврат ЗначенияРеквизитов; + +КонецФункции + +// Возвращает значения реквизита, прочитанного из информационной базы для нескольких объектов. +// +// Если доступа к реквизиту нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Функция не предназначена для получения значений реквизитов пустых ссылок. +// +// Параметры: +// МассивСсылок - массив ссылок на объекты одного типа. +// ВАЖНО! значения массива должны быть ссылками на +// объекты одного типа! +// ИмяРеквизита - Строка, например, "Код". +// +// Возвращаемое значение: +// Соответствие - Ключ - ссылка на объект, Значение - значение прочитанного реквизита. +// +Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита) Экспорт + + ЗначенияРеквизитов = ЗначенияРеквизитовОбъектов(МассивСсылок, ИмяРеквизита); + Для Каждого Элемент Из ЗначенияРеквизитов Цикл + ЗначенияРеквизитов[Элемент.Ключ] = Элемент.Значение[ИмяРеквизита]; + КонецЦикла; + + Возврат ЗначенияРеквизитов; + +КонецФункции + +// Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь). +// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно. +// +// Параметры: +// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если +// нужно проверить строку соединения не текущей информационной базы. +// +// Возвращаемое значение: +// Булево. +// +Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт + + Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда + СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы(); + КонецЕсли; + Возврат СтрНайти(Врег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1; + +КонецФункции + +// Возвращает значение в виде XML-строки. +// Преобразованы в XML-строку (сериализованы) могут быть только те объекты, +// для которых в описании указано, что они сериализуются. +// +// Параметры: +// Значение - Произвольный. Значение, которое необходимо сериализовать в XML-строку. +// +// Возвращаемое значение: +// Строка - XML-строка представления значения в сериализованном виде. +// +Функция ЗначениеВСтрокуXML(Значение) Экспорт + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное); + + Возврат ЗаписьXML.Закрыть(); +КонецФункции + +// Возвращает значение, полученное из XML-строки. +// Получены из XML-строки могут быть только те объекты, +// для которых в описании указано, что они сериализуются. +// +// Параметры: +// СтрокаXML - строка представления значения в сериализованном виде. +// +// Возвращаемое значение: +// Значение, полученное из переданной XML-строки. +// +Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(СтрокаXML); + + Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML); +КонецФункции + // Счтитывает в память текстовый файл на сервере в объект "ТектовыйДокумент" для отображения на клиенте // // Параметры: // ПутьКФайлу - Строка - Путь к файлу на сервере // Текст - ТекстовыйДокумент- Текстовый документ, в который будет считан файл на сервере // ИмяФайла - Строка - Возвращаемое значение имени файла -// ИспользоватьКодировкуСистемы - Булево - Истина - использовать кодировку системы, +// ИспользоватьКодировкуСистемы - Булево - Истина - использовать кодировку системы, // Ложь - считать файл в кодировке UTF-8 -Процедура ПрочитатьТекстовыйФайл(ПутьКФайлу, Текст, ИмяФайла, ИспользоватьКодировкуСистемы = Ложь) Экспорт - - Файл = новый Файл(ПутьКФайлу); - ИмяФайла = Файл.Имя; - Если Файл.Существует() Тогда - Если ИспользоватьКодировкуСистемы Тогда - СистемнаяИнформация = Новый СистемнаяИнформация; - ЭтоWindowsСервер = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 - Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64); - Если ЭтоWindowsСервер Тогда - Текст.Прочитать(ПутьКФайлу, КодировкаТекста.OEM); - Иначе - Текст.Прочитать(ПутьКФайлу, КодировкаТекста.Системная); - КонецЕсли; - Иначе - Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +Процедура ПрочитатьТекстовыйФайл(ПутьКФайлу, Текст, ИмяФайла, ИспользоватьКодировкуСистемы = Ложь) Экспорт + + Файл = новый Файл(ПутьКФайлу); + ИмяФайла = Файл.Имя; + Если Файл.Существует() Тогда + Если ИспользоватьКодировкуСистемы Тогда + СистемнаяИнформация = Новый СистемнаяИнформация; + ЭтоWindowsСервер = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64); + Если ЭтоWindowsСервер Тогда + Текст.Прочитать(ПутьКФайлу, КодировкаТекста.OEM); + Иначе + Текст.Прочитать(ПутьКФайлу, КодировкаТекста.Системная); + КонецЕсли; + Иначе + Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl b/GitConverter/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl index c1d44d6..021581c 100644 --- a/GitConverter/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl +++ b/GitConverter/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl @@ -1,16 +1,24 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Задает вопрос о продолжении действия, влекущего к потере изменений. -// -Процедура ПодтвердитьЗакрытиеФормыСейчас() Экспорт - - ОбщегоНазначенияКлиент.ПодтвердитьЗакрытиеФормы(); - -КонецПроцедуры - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Задает вопрос о продолжении действия, влекущего к потере изменений. +// +Процедура ПодтвердитьЗакрытиеФормыСейчас() Экспорт + + ОбщегоНазначенияКлиент.ПодтвердитьЗакрытиеФормы(); + +КонецПроцедуры + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/GitConverter/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl index 0ce7203..f76ae13 100644 --- a/GitConverter/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl +++ b/GitConverter/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl @@ -1,87 +1,95 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Клиентские процедуры и функции общего назначения: -// - для работы со списками в формах; -// - для работы с журналом регистрации; -// - для обработки действий пользователя в процессе редактирования -// многострочного текста, например комментария в документах; -// - прочее. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Задает вопрос о продолжении действия, влекущего к потере изменений. -// Для использования в обработчиках события ПередЗакрытием модулей форм. -// -// Параметры: -// ОповещениеСохранитьИЗакрыть - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку OK. -// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия. -// ТекстПредупреждения - Строка - переопределяемый текст предупреждения, выводимый пользователю. -// -// Пример: -// Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект); -// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); -// -// &НаКлиенте -// Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт -// // записываем данные формы. -// // ... -// Модифицированность = Ложь; // не выводить подтверждение о закрытии формы еще раз. -// Закрыть(<РезультатВыбораВФорме>); -// КонецПроцедуры -// -Процедура ПоказатьПодтверждениеЗакрытияФормы(ОповещениеСохранитьИЗакрыть, Отказ, ТекстПредупреждения = "") Экспорт - - Форма = ОповещениеСохранитьИЗакрыть.Модуль; - Если Не Форма.Модифицированность Тогда - Возврат; - КонецЕсли; - - Отказ = Истина; - - Параметры = Новый Структура(); - Параметры.Вставить("ОповещениеСохранитьИЗакрыть", ОповещениеСохранитьИЗакрыть); - Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения); - - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); - КонецЕсли; - ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Параметры; - - ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеФормыСейчас", 0.1, Истина); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Процедура ПодтвердитьЗакрытиеФормы() Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); - КонецЕсли; - - Параметры = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"]; - Если Параметры = Неопределено Тогда - Возврат; - КонецЕсли; - ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Неопределено; - - Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеФормыЗавершение", ЭтотОбъект, Параметры); - Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда - ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); - Иначе - ТекстВопроса = Параметры.ТекстПредупреждения; - КонецЕсли; - - ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , - КодВозвратаДиалога.Нет); - -КонецПроцедуры - - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// Клиентские процедуры и функции общего назначения: +// - для работы со списками в формах; +// - для работы с журналом регистрации; +// - для обработки действий пользователя в процессе редактирования +// многострочного текста, например комментария в документах; +// - прочее. +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Задает вопрос о продолжении действия, влекущего к потере изменений. +// Для использования в обработчиках события ПередЗакрытием модулей форм. +// +// Параметры: +// ОповещениеСохранитьИЗакрыть - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку OK. +// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия. +// ТекстПредупреждения - Строка - переопределяемый текст предупреждения, выводимый пользователю. +// +// Пример: +// Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект); +// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); +// +// &НаКлиенте +// Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт +// // записываем данные формы. +// // ... +// Модифицированность = Ложь; // не выводить подтверждение о закрытии формы еще раз. +// Закрыть(<РезультатВыбораВФорме>); +// КонецПроцедуры +// +Процедура ПоказатьПодтверждениеЗакрытияФормы(ОповещениеСохранитьИЗакрыть, Отказ, ТекстПредупреждения = "") Экспорт + + Форма = ОповещениеСохранитьИЗакрыть.Модуль; + Если Не Форма.Модифицированность Тогда + Возврат; + КонецЕсли; + + Отказ = Истина; + + Параметры = Новый Структура(); + Параметры.Вставить("ОповещениеСохранитьИЗакрыть", ОповещениеСохранитьИЗакрыть); + Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения); + + ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); + КонецЕсли; + ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Параметры; + + ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеФормыСейчас", 0.1, Истина); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ПодтвердитьЗакрытиеФормы() Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Неопределено); + КонецЕсли; + + Параметры = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"]; + Если Параметры = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПодтвержденияЗакрытияФормы"] = Неопределено; + + Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеФормыЗавершение", ЭтотОбъект, Параметры); + Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда + ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); + Иначе + ТекстВопроса = Параметры.ТекстПредупреждения; + КонецЕсли; + + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , + КодВозвратаДиалога.Нет); + +КонецПроцедуры + + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/GitConverter/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl index 92d97b2..7d1a1d3 100644 --- a/GitConverter/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl +++ b/GitConverter/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -1,247 +1,255 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Клиентские и серверные процедуры и функции общего назначения: -// - для поддержки формирования печатных форм; -// - для работы с файлами; -// - для работы с управляемыми формами; -// - для работы с почтовыми адресами; -// - для работы с отборами динамических списков; -// - прочее. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Формирует и выводит сообщение, которое может быть связано с элементом -// управления формы. -// -// Параметры -// ТекстСообщенияПользователю - Строка - текст сообщения. -// КлючДанных - ЛюбаяСсылка - на объект информационной базы. -// Ссылка на объект информационной базы, к которому это сообщение относится, -// или ключ записи. -// Поле - Строка - наименование реквизита формы. -// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы). -// Отказ - Булево - Выходной параметр. -// Всегда устанавливается в значение Истина. -// -// Пример: -// -// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта: -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), , -// "ПолеВРеквизитеФормыОбъект", -// "Объект"); -// -// Альтернативный вариант использования в форме объекта: -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), , -// "Объект.ПолеВРеквизитеФормыОбъект"); -// -// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы: -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), , -// "ИмяРеквизитаФормы"); -// -// 3. Для вывода сообщения связанного с объектом информационной базы. -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), ОбъектИнформационнойБазы, "Ответственный",,Отказ); -// -// 4. Для вывода сообщения по ссылке на объект информационной базы. -// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( -// НСтр("ru = 'Сообщение об ошибке.'"), Ссылка, , , Отказ); -// -// Случаи некорректного использования: -// 1. Передача одновременно параметров КлючДанных и ПутьКДанным. -// 2. Передача в параметре КлючДанных значения типа отличного от допустимых. -// 3. Установка ссылки без установки поля (и/или пути к данным). -// -Процедура СообщитьПользователю( - Знач ТекстСообщенияПользователю, - Знач КлючДанных = Неопределено, - Знач Поле = "", - Знач ПутьКДанным = "", - Отказ = Ложь) Экспорт - - Сообщение = Новый СообщениеПользователю; - Сообщение.Текст = ТекстСообщенияПользователю; - Сообщение.Поле = Поле; - - ЭтоОбъект = Ложь; - -#Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда - Если КлючДанных <> Неопределено - И XMLТипЗнч(КлючДанных) <> Неопределено Тогда - ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа; - ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0; - КонецЕсли; -#КонецЕсли - - Если ЭтоОбъект Тогда - Сообщение.УстановитьДанные(КлючДанных); - Иначе - Сообщение.КлючДанных = КлючДанных; - КонецЕсли; - - Если НЕ ПустаяСтрока(ПутьКДанным) Тогда - Сообщение.ПутьКДанным = ПутьКДанным; - КонецЕсли; - - Сообщение.Сообщить(); - - Отказ = Истина; - -КонецПроцедуры - -// Дополняет структуру значениями из другой структуры. -// -// Параметры: -// Приемник - Структура - коллекция, в которую будут добавляться новые значения. -// Источник - Структура - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. -// Заменять - Булево, Неопределено - Что делать в местах пересечения ключей источника и приемника: -// Истина - Заменять значения приемника (самый быстрый способ), -// Ложь - Не заменять значения приемника (пропускать), -// Неопределено - Значение по умолчанию. Бросать исключение. -// -Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт - - Для Каждого Элемент Из Источник Цикл - Если Заменять <> Истина И Приемник.Свойство(Элемент.Ключ) Тогда - Если Заменять = Ложь Тогда - Продолжить; - Иначе - ВызватьИсключение СтрШаблон(НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); - КонецЕсли - КонецЕсли; - Приемник.Вставить(Элемент.Ключ, Элемент.Значение); - КонецЦикла; - -КонецПроцедуры - -// Добавляет к переданному пути каталога конечный символ-разделитель, если он отсутствует. -// -// Параметры: -// ПутьКаталога - Строка - путь к каталогу. -// -// Возвращаемое значение: -// Строка - путь к каталогу с конечным символом-разделителем. -// -// Примеры использования: -// Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог"); // возвращает "C:\Мой каталог\". -// Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог\"); // возвращает "C:\Мой каталог\". -// Результат = ДобавитьКонечныйРазделительПути("%APPDATA%"); // возвращает "%APPDATA%\" -// -Функция ДобавитьКонечныйРазделительПути(Знач ПутьКаталога, Знач Удалить_Платформа = Неопределено) Экспорт - Если ПустаяСтрока(ПутьКаталога) Тогда - Возврат ПутьКаталога; - КонецЕсли; - - ДобавляемыйСимвол = ПолучитьРазделительПути(); - - Если СтрЗаканчиваетсяНа(ПутьКаталога, ДобавляемыйСимвол) Тогда - Возврат ПутьКаталога; - Иначе - Возврат ПутьКаталога + ДобавляемыйСимвол; - КонецЕсли; -КонецФункции - -// Преобразует РасписаниеРегламентногоЗадания в структуру. -// -// Параметры: -// Расписание - РасписаниеРегламентногоЗадания -. -// -// Возвращаемое значение: -// Структура. -// -Функция РасписаниеВСтруктуру(Знач Расписание) Экспорт - - ЗначениеРасписания = Расписание; - Если ЗначениеРасписания = Неопределено Тогда - ЗначениеРасписания = Новый РасписаниеРегламентногоЗадания(); - КонецЕсли; - СписокПолей = "ВремяЗавершения,ВремяКонца,ВремяНачала,ДатаКонца,ДатаНачала,ДеньВМесяце,ДеньНеделиВМесяце," - + "ДниНедели,ИнтервалЗавершения,Месяцы,ПаузаПовтора,ПериодНедель,ПериодПовтораВТечениеДня,ПериодПовтораДней"; - Результат = Новый Структура(СписокПолей); - ЗаполнитьЗначенияСвойств(Результат, ЗначениеРасписания, СписокПолей); - ДетальныеРасписанияДня = Новый Массив; - Для каждого РасписаниеДля Из Расписание.ДетальныеРасписанияДня Цикл - ДетальныеРасписанияДня.Добавить(РасписаниеВСтруктуру(РасписаниеДля)); - КонецЦикла; - Результат.Вставить("ДетальныеРасписанияДня", ДетальныеРасписанияДня); - Возврат Результат; - -КонецФункции - -// Преобразует структуру в РасписаниеРегламентногоЗадания. -// -// Параметры: -// СтруктураРасписания - Структура -. -// -// Возвращаемое значение: -// РасписаниеРегламентногоЗадания. -// -Функция СтруктураВРасписание(Знач СтруктураРасписания) Экспорт - - Если СтруктураРасписания = Неопределено Тогда - Возврат Новый РасписаниеРегламентногоЗадания(); - КонецЕсли; - СписокПолей = "ВремяЗавершения,ВремяКонца,ВремяНачала,ДатаКонца,ДатаНачала,ДеньВМесяце,ДеньНеделиВМесяце," - + "ДниНедели,ИнтервалЗавершения,Месяцы,ПаузаПовтора,ПериодНедель,ПериодПовтораВТечениеДня,ПериодПовтораДней"; - Результат = Новый РасписаниеРегламентногоЗадания; - ЗаполнитьЗначенияСвойств(Результат, СтруктураРасписания, СписокПолей); - ДетальныеРасписанияДня = Новый Массив; - Для каждого Расписание Из СтруктураРасписания.ДетальныеРасписанияДня Цикл - ДетальныеРасписанияДня.Добавить(СтруктураВРасписание(Расписание)); - КонецЦикла; - Результат.ДетальныеРасписанияДня = ДетальныеРасписанияДня; - Возврат Результат; - -КонецФункции - - -// Возвращает код основного языка конфигурации, например "ru". -Функция КодОсновногоЯзыка() Экспорт - #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда - Возврат Метаданные.ОсновнойЯзык.КодЯзыка; - #Иначе - Возврат "ru"; - #КонецЕсли -КонецФункции - - -// Сравнить две строки версий. -// -// Параметры: -// СтрокаВерсии1 - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.СС. -// СтрокаВерсии2 - Строка - второй сравниваемый номер версии. -// -// Возвращаемое значение: -// Число - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны. -// -Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт - - Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0.0", СтрокаВерсии1); - Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0.0", СтрокаВерсии2); - Версия1 = СтрРазделить(Строка1, "."); - Если Версия1.Количество() <> 4 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1); - КонецЕсли; - Версия2 = СтрРазделить(Строка2, "."); - Если Версия2.Количество() <> 4 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2); - КонецЕсли; - - Результат = 0; - Для Разряд = 0 По 3 Цикл - Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]); - Если Результат <> 0 Тогда - Возврат Результат; - КонецЕсли; - КонецЦикла; - Возврат Результат; - -КонецФункции - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// Клиентские и серверные процедуры и функции общего назначения: +// - для поддержки формирования печатных форм; +// - для работы с файлами; +// - для работы с управляемыми формами; +// - для работы с почтовыми адресами; +// - для работы с отборами динамических списков; +// - прочее. +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Формирует и выводит сообщение, которое может быть связано с элементом +// управления формы. +// +// Параметры +// ТекстСообщенияПользователю - Строка - текст сообщения. +// КлючДанных - ЛюбаяСсылка - на объект информационной базы. +// Ссылка на объект информационной базы, к которому это сообщение относится, +// или ключ записи. +// Поле - Строка - наименование реквизита формы. +// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы). +// Отказ - Булево - Выходной параметр. +// Всегда устанавливается в значение Истина. +// +// Пример: +// +// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "ПолеВРеквизитеФормыОбъект", +// "Объект"); +// +// Альтернативный вариант использования в форме объекта: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "Объект.ПолеВРеквизитеФормыОбъект"); +// +// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы: +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), , +// "ИмяРеквизитаФормы"); +// +// 3. Для вывода сообщения связанного с объектом информационной базы. +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), ОбъектИнформационнойБазы, "Ответственный",,Отказ); +// +// 4. Для вывода сообщения по ссылке на объект информационной базы. +// ОбщегоНазначенияКлиентСервер.СообщитьПользователю( +// НСтр("ru = 'Сообщение об ошибке.'"), Ссылка, , , Отказ); +// +// Случаи некорректного использования: +// 1. Передача одновременно параметров КлючДанных и ПутьКДанным. +// 2. Передача в параметре КлючДанных значения типа отличного от допустимых. +// 3. Установка ссылки без установки поля (и/или пути к данным). +// +Процедура СообщитьПользователю( + Знач ТекстСообщенияПользователю, + Знач КлючДанных = Неопределено, + Знач Поле = "", + Знач ПутьКДанным = "", + Отказ = Ложь) Экспорт + + Сообщение = Новый СообщениеПользователю; + Сообщение.Текст = ТекстСообщенияПользователю; + Сообщение.Поле = Поле; + + ЭтоОбъект = Ложь; + +#Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда + Если КлючДанных <> Неопределено + И XMLТипЗнч(КлючДанных) <> Неопределено Тогда + ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа; + ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0; + КонецЕсли; +#КонецЕсли + + Если ЭтоОбъект Тогда + Сообщение.УстановитьДанные(КлючДанных); + Иначе + Сообщение.КлючДанных = КлючДанных; + КонецЕсли; + + Если НЕ ПустаяСтрока(ПутьКДанным) Тогда + Сообщение.ПутьКДанным = ПутьКДанным; + КонецЕсли; + + Сообщение.Сообщить(); + + Отказ = Истина; + +КонецПроцедуры + +// Дополняет структуру значениями из другой структуры. +// +// Параметры: +// Приемник - Структура - коллекция, в которую будут добавляться новые значения. +// Источник - Структура - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. +// Заменять - Булево, Неопределено - Что делать в местах пересечения ключей источника и приемника: +// Истина - Заменять значения приемника (самый быстрый способ), +// Ложь - Не заменять значения приемника (пропускать), +// Неопределено - Значение по умолчанию. Бросать исключение. +// +Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт + + Для Каждого Элемент Из Источник Цикл + Если Заменять <> Истина И Приемник.Свойство(Элемент.Ключ) Тогда + Если Заменять = Ложь Тогда + Продолжить; + Иначе + ВызватьИсключение СтрШаблон(НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); + КонецЕсли + КонецЕсли; + Приемник.Вставить(Элемент.Ключ, Элемент.Значение); + КонецЦикла; + +КонецПроцедуры + +// Добавляет к переданному пути каталога конечный символ-разделитель, если он отсутствует. +// +// Параметры: +// ПутьКаталога - Строка - путь к каталогу. +// +// Возвращаемое значение: +// Строка - путь к каталогу с конечным символом-разделителем. +// +// Примеры использования: +// Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог"); // возвращает "C:\Мой каталог\". +// Результат = ДобавитьКонечныйРазделительПути("C:\Мой каталог\"); // возвращает "C:\Мой каталог\". +// Результат = ДобавитьКонечныйРазделительПути("%APPDATA%"); // возвращает "%APPDATA%\" +// +Функция ДобавитьКонечныйРазделительПути(Знач ПутьКаталога, Знач Удалить_Платформа = Неопределено) Экспорт + Если ПустаяСтрока(ПутьКаталога) Тогда + Возврат ПутьКаталога; + КонецЕсли; + + ДобавляемыйСимвол = ПолучитьРазделительПути(); + + Если СтрЗаканчиваетсяНа(ПутьКаталога, ДобавляемыйСимвол) Тогда + Возврат ПутьКаталога; + Иначе + Возврат ПутьКаталога + ДобавляемыйСимвол; + КонецЕсли; +КонецФункции + +// Преобразует РасписаниеРегламентногоЗадания в структуру. +// +// Параметры: +// Расписание - РасписаниеРегламентногоЗадания -. +// +// Возвращаемое значение: +// Структура. +// +Функция РасписаниеВСтруктуру(Знач Расписание) Экспорт + + ЗначениеРасписания = Расписание; + Если ЗначениеРасписания = Неопределено Тогда + ЗначениеРасписания = Новый РасписаниеРегламентногоЗадания(); + КонецЕсли; + СписокПолей = "ВремяЗавершения,ВремяКонца,ВремяНачала,ДатаКонца,ДатаНачала,ДеньВМесяце,ДеньНеделиВМесяце," + + "ДниНедели,ИнтервалЗавершения,Месяцы,ПаузаПовтора,ПериодНедель,ПериодПовтораВТечениеДня,ПериодПовтораДней"; + Результат = Новый Структура(СписокПолей); + ЗаполнитьЗначенияСвойств(Результат, ЗначениеРасписания, СписокПолей); + ДетальныеРасписанияДня = Новый Массив; + Для каждого РасписаниеДля Из Расписание.ДетальныеРасписанияДня Цикл + ДетальныеРасписанияДня.Добавить(РасписаниеВСтруктуру(РасписаниеДля)); + КонецЦикла; + Результат.Вставить("ДетальныеРасписанияДня", ДетальныеРасписанияДня); + Возврат Результат; + +КонецФункции + +// Преобразует структуру в РасписаниеРегламентногоЗадания. +// +// Параметры: +// СтруктураРасписания - Структура -. +// +// Возвращаемое значение: +// РасписаниеРегламентногоЗадания. +// +Функция СтруктураВРасписание(Знач СтруктураРасписания) Экспорт + + Если СтруктураРасписания = Неопределено Тогда + Возврат Новый РасписаниеРегламентногоЗадания(); + КонецЕсли; + СписокПолей = "ВремяЗавершения,ВремяКонца,ВремяНачала,ДатаКонца,ДатаНачала,ДеньВМесяце,ДеньНеделиВМесяце," + + "ДниНедели,ИнтервалЗавершения,Месяцы,ПаузаПовтора,ПериодНедель,ПериодПовтораВТечениеДня,ПериодПовтораДней"; + Результат = Новый РасписаниеРегламентногоЗадания; + ЗаполнитьЗначенияСвойств(Результат, СтруктураРасписания, СписокПолей); + ДетальныеРасписанияДня = Новый Массив; + Для каждого Расписание Из СтруктураРасписания.ДетальныеРасписанияДня Цикл + ДетальныеРасписанияДня.Добавить(СтруктураВРасписание(Расписание)); + КонецЦикла; + Результат.ДетальныеРасписанияДня = ДетальныеРасписанияДня; + Возврат Результат; + +КонецФункции + + +// Возвращает код основного языка конфигурации, например "ru". +Функция КодОсновногоЯзыка() Экспорт + #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда + Возврат Метаданные.ОсновнойЯзык.КодЯзыка; + #Иначе + Возврат "ru"; + #КонецЕсли +КонецФункции + + +// Сравнить две строки версий. +// +// Параметры: +// СтрокаВерсии1 - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.СС. +// СтрокаВерсии2 - Строка - второй сравниваемый номер версии. +// +// Возвращаемое значение: +// Число - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны. +// +Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт + + Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0.0", СтрокаВерсии1); + Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0.0", СтрокаВерсии2); + Версия1 = СтрРазделить(Строка1, "."); + Если Версия1.Количество() <> 4 Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1); + КонецЕсли; + Версия2 = СтрРазделить(Строка2, "."); + Если Версия2.Количество() <> 4 Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2); + КонецЕсли; + + Результат = 0; + Для Разряд = 0 По 3 Цикл + Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]); + Если Результат <> 0 Тогда + Возврат Результат; + КонецЕсли; + КонецЦикла; + Возврат Результат; + +КонецФункции + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl b/GitConverter/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl index 980dc90..d0303a3 100644 --- a/GitConverter/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl +++ b/GitConverter/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + #Область ПрограммныйИнтерфейс // Возвращает массив квалифицированных имен метаданных diff --git a/GitConverter/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl b/GitConverter/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl index 1641e49..726628b 100644 --- a/GitConverter/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl +++ b/GitConverter/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl @@ -1,242 +1,250 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Серверные процедуры и функции общего назначения: -// - Поддержка работы с включенными профилями безопасности. -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - -// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации. -// При включении профилей безопасности для вызова оператора Выполнить() используется -// переход в безопасный режим с профилем безопасности, используемом для информационной базы -// (если выше по стеку не был установлен другой безопасный режим). -// -// Параметры: -// ИмяМетода - Строка - имя экспортной процедуры в формате -// <имя объекта>.<имя процедуры>, где <имя объекта> - это -// общий модуль или модуль менеджера объекта. -// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры> -// в порядке расположения элементов массива. -// -// Пример: -// Параметры = Новый Массив(); -// Параметры.Добавить("1"); -// РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации("МойОбщийМодуль.МояПроцедура", Параметры); -// -Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт - - Попытка - ПроверитьИмяМетодаКонфигурации(ИмяМетода); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ВызватьИсключение НСтр("ru = 'Ошибка при вызове процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме.'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - КонецПопытки; - - ПараметрыСтрока = ""; - Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда - Для Индекс = 0 По Параметры.ВГраница() Цикл - ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; - КонецЦикла; - ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); - КонецЕсли; - - Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")"; - -КонецПроцедуры - -// Проверяет, что переданное имя является именем экспортной процедуры конфигурации. -// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма -// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить() и Вычислить() -// при их использовании для динамического вызова методов код конфигурации. -// -// В случае, если переданная строка не соответствует имени метода конфигурации - генерируется. -// -Процедура ПроверитьИмяМетодаКонфигурации(Знач ИмяМетода) Экспорт - - // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. - ЧастиИмени = СтрРазделить(ИмяМетода, "."); - Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда - ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1)'"), ИмяМетода); - КонецЕсли; - - ИмяОбъекта = ЧастиИмени[0]; - Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда - ВызватьИсключение СтрШаблон( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): - |Не найден общий модуль ""%2"".'"), - ИмяМетода, - ИмяОбъекта); - КонецЕсли; - - Если ЧастиИмени.Количество() = 3 Тогда - ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1]; - Попытка - Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта); - Исключение - Менеджер = Неопределено; - КонецПопытки; - Если Менеджер = Неопределено Тогда - ВызватьИсключение СтрШаблон( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): - |Не найден менеджер объекта ""%2"".'"), - ИмяМетода, - ПолноеИмяОбъекта); - КонецЕсли; - КонецЕсли; - - ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()]; - ВременнаяСтруктура = Новый Структура; - Попытка - // Проверка того, что ИмяМетодаОбъекта является допустимым идентификатором. - // Например: МояПроцедура - ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение СтрШаблон( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): - |Имя метода ""%2"" не соответствует требованиям образования имен процедур и функций.'"), - ИмяМетода, - ИмяМетодаОбъекта); - КонецПопытки; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Возвращает менеджер объекта по имени. -// Ограничение: не обрабатываются точки маршрутов бизнес-процессов. -// -// Параметры: -// Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации". -// -// Возвращаемое значение: -// СправочникиМенеджер, СправочникМенеджер, ДокументыМенеджер, ДокументМенеджер, ... -// -Функция МенеджерОбъектаПоИмени(Имя) - Перем КлассОМ, ИмяОМ, Менеджер; - - ЧастиИмени = СтрРазделить(Имя, "."); - - Если ЧастиИмени.Количество() > 0 Тогда - КлассОМ = ВРег(ЧастиИмени[0]); - КонецЕсли; - - Если ЧастиИмени.Количество() > 1 Тогда - ИмяОМ = ЧастиИмени[1]; - КонецЕсли; - - Если КлассОМ = "ПЛАНОБМЕНА" - Или КлассОМ = "ПЛАНЫОБМЕНА" Тогда - Менеджер = ПланыОбмена; - - ИначеЕсли КлассОМ = "СПРАВОЧНИК" - Или КлассОМ = "СПРАВОЧНИКИ" Тогда - Менеджер = Справочники; - - ИначеЕсли КлассОМ = "ДОКУМЕНТ" - Или КлассОМ = "ДОКУМЕНТЫ" Тогда - Менеджер = Документы; - - ИначеЕсли КлассОМ = "ЖУРНАЛДОКУМЕНТОВ" - Или КлассОМ = "ЖУРНАЛЫДОКУМЕНТОВ" Тогда - Менеджер = ЖурналыДокументов; - - ИначеЕсли КлассОМ = "ПЕРЕЧИСЛЕНИЕ" - Или КлассОМ = "ПЕРЕЧИСЛЕНИЯ" Тогда - Менеджер = Перечисления; - - ИначеЕсли КлассОМ = "ОТЧЕТ" - Или КлассОМ = "ОТЧЕТЫ" Тогда - Менеджер = Отчеты; - - ИначеЕсли КлассОМ = "ОБРАБОТКА" - Или КлассОМ = "ОБРАБОТКИ" Тогда - Менеджер = Обработки; - - ИначеЕсли КлассОМ = "ПЛАНВИДОВХАРАКТЕРИСТИК" - Или КлассОМ = "ПЛАНЫВИДОВХАРАКТЕРИСТИК" Тогда - Менеджер = ПланыВидовХарактеристик; - - ИначеЕсли КлассОМ = "ПЛАНСЧЕТОВ" - Или КлассОМ = "ПЛАНЫСЧЕТОВ" Тогда - Менеджер = ПланыСчетов; - - ИначеЕсли КлассОМ = "ПЛАНВИДОВРАСЧЕТА" - Или КлассОМ = "ПЛАНЫВИДОВРАСЧЕТА" Тогда - Менеджер = ПланыВидовРасчета; - - ИначеЕсли КлассОМ = "РЕГИСТРСВЕДЕНИЙ" - Или КлассОМ = "РЕГИСТРЫСВЕДЕНИЙ" Тогда - Менеджер = РегистрыСведений; - - ИначеЕсли КлассОМ = "РЕГИСТРНАКОПЛЕНИЯ" - Или КлассОМ = "РЕГИСТРЫНАКОПЛЕНИЯ" Тогда - Менеджер = РегистрыНакопления; - - ИначеЕсли КлассОМ = "РЕГИСТРБУХГАЛТЕРИИ" - Или КлассОМ = "РЕГИСТРЫБУХГАЛТЕРИИ" Тогда - Менеджер = РегистрыБухгалтерии; - - ИначеЕсли КлассОМ = "РЕГИСТРРАСЧЕТА" - Или КлассОМ = "РЕГИСТРЫРАСЧЕТА" Тогда - - Если ЧастиИмени.Количество() < 3 Тогда - // Регистр расчета - Менеджер = РегистрыРасчета; - Иначе - КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]); - Если ЧастиИмени.Количество() > 3 Тогда - ИмяПодчиненногоОМ = ЧастиИмени[3]; - КонецЕсли; - Если КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТ" - Или КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТЫ" Тогда - // Перерасчет - Попытка - Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; - ИмяОМ = ИмяПодчиненногоОМ; - Исключение - Менеджер = Неопределено; - КонецПопытки; - КонецЕсли; - КонецЕсли; - - ИначеЕсли КлассОМ = "БИЗНЕСПРОЦЕСС" - Или КлассОМ = "БИЗНЕСПРОЦЕССЫ" Тогда - Менеджер = БизнесПроцессы; - - ИначеЕсли КлассОМ = "ЗАДАЧА" - Или КлассОМ = "ЗАДАЧИ" Тогда - Менеджер = Задачи; - - ИначеЕсли КлассОМ = "КОНСТАНТА" - Или КлассОМ = "КОНСТАНТЫ" Тогда - Менеджер = Константы; - - ИначеЕсли КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТЬ" - Или КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТИ" Тогда - Менеджер = Последовательности; - КонецЕсли; - - Если Менеджер <> Неопределено Тогда - Если ЗначениеЗаполнено(ИмяОМ) Тогда - Попытка - Возврат Менеджер[ИмяОМ]; - Исключение - Менеджер = Неопределено; - КонецПопытки; - Иначе - Возврат Менеджер; - КонецЕсли; - КонецЕсли; - - ВызватьИсключение СтрШаблон(НСтр("ru = 'Не удалось получить менеджер для объекта ""%1""'"), Имя); - -КонецФункции - -#КонецОбласти - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// Серверные процедуры и функции общего назначения: +// - Поддержка работы с включенными профилями безопасности. +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации. +// При включении профилей безопасности для вызова оператора Выполнить() используется +// переход в безопасный режим с профилем безопасности, используемом для информационной базы +// (если выше по стеку не был установлен другой безопасный режим). +// +// Параметры: +// ИмяМетода - Строка - имя экспортной процедуры в формате +// <имя объекта>.<имя процедуры>, где <имя объекта> - это +// общий модуль или модуль менеджера объекта. +// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры> +// в порядке расположения элементов массива. +// +// Пример: +// Параметры = Новый Массив(); +// Параметры.Добавить("1"); +// РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации("МойОбщийМодуль.МояПроцедура", Параметры); +// +Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт + + Попытка + ПроверитьИмяМетодаКонфигурации(ИмяМетода); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ВызватьИсключение НСтр("ru = 'Ошибка при вызове процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме.'") + + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + + ПараметрыСтрока = ""; + Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда + Для Индекс = 0 По Параметры.ВГраница() Цикл + ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; + КонецЦикла; + ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); + КонецЕсли; + + Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")"; + +КонецПроцедуры + +// Проверяет, что переданное имя является именем экспортной процедуры конфигурации. +// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма +// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить() и Вычислить() +// при их использовании для динамического вызова методов код конфигурации. +// +// В случае, если переданная строка не соответствует имени метода конфигурации - генерируется. +// +Процедура ПроверитьИмяМетодаКонфигурации(Знач ИмяМетода) Экспорт + + // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. + ЧастиИмени = СтрРазделить(ИмяМетода, "."); + Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда + ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1)'"), ИмяМетода); + КонецЕсли; + + ИмяОбъекта = ЧастиИмени[0]; + Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда + ВызватьИсключение СтрШаблон( + НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): + |Не найден общий модуль ""%2"".'"), + ИмяМетода, + ИмяОбъекта); + КонецЕсли; + + Если ЧастиИмени.Количество() = 3 Тогда + ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1]; + Попытка + Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта); + Исключение + Менеджер = Неопределено; + КонецПопытки; + Если Менеджер = Неопределено Тогда + ВызватьИсключение СтрШаблон( + НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): + |Не найден менеджер объекта ""%2"".'"), + ИмяМетода, + ПолноеИмяОбъекта); + КонецЕсли; + КонецЕсли; + + ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()]; + ВременнаяСтруктура = Новый Структура; + Попытка + // Проверка того, что ИмяМетодаОбъекта является допустимым идентификатором. + // Например: МояПроцедура + ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение СтрШаблон( + НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): + |Имя метода ""%2"" не соответствует требованиям образования имен процедур и функций.'"), + ИмяМетода, + ИмяМетодаОбъекта); + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Возвращает менеджер объекта по имени. +// Ограничение: не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации". +// +// Возвращаемое значение: +// СправочникиМенеджер, СправочникМенеджер, ДокументыМенеджер, ДокументМенеджер, ... +// +Функция МенеджерОбъектаПоИмени(Имя) + Перем КлассОМ, ИмяОМ, Менеджер; + + ЧастиИмени = СтрРазделить(Имя, "."); + + Если ЧастиИмени.Количество() > 0 Тогда + КлассОМ = ВРег(ЧастиИмени[0]); + КонецЕсли; + + Если ЧастиИмени.Количество() > 1 Тогда + ИмяОМ = ЧастиИмени[1]; + КонецЕсли; + + Если КлассОМ = "ПЛАНОБМЕНА" + Или КлассОМ = "ПЛАНЫОБМЕНА" Тогда + Менеджер = ПланыОбмена; + + ИначеЕсли КлассОМ = "СПРАВОЧНИК" + Или КлассОМ = "СПРАВОЧНИКИ" Тогда + Менеджер = Справочники; + + ИначеЕсли КлассОМ = "ДОКУМЕНТ" + Или КлассОМ = "ДОКУМЕНТЫ" Тогда + Менеджер = Документы; + + ИначеЕсли КлассОМ = "ЖУРНАЛДОКУМЕНТОВ" + Или КлассОМ = "ЖУРНАЛЫДОКУМЕНТОВ" Тогда + Менеджер = ЖурналыДокументов; + + ИначеЕсли КлассОМ = "ПЕРЕЧИСЛЕНИЕ" + Или КлассОМ = "ПЕРЕЧИСЛЕНИЯ" Тогда + Менеджер = Перечисления; + + ИначеЕсли КлассОМ = "ОТЧЕТ" + Или КлассОМ = "ОТЧЕТЫ" Тогда + Менеджер = Отчеты; + + ИначеЕсли КлассОМ = "ОБРАБОТКА" + Или КлассОМ = "ОБРАБОТКИ" Тогда + Менеджер = Обработки; + + ИначеЕсли КлассОМ = "ПЛАНВИДОВХАРАКТЕРИСТИК" + Или КлассОМ = "ПЛАНЫВИДОВХАРАКТЕРИСТИК" Тогда + Менеджер = ПланыВидовХарактеристик; + + ИначеЕсли КлассОМ = "ПЛАНСЧЕТОВ" + Или КлассОМ = "ПЛАНЫСЧЕТОВ" Тогда + Менеджер = ПланыСчетов; + + ИначеЕсли КлассОМ = "ПЛАНВИДОВРАСЧЕТА" + Или КлассОМ = "ПЛАНЫВИДОВРАСЧЕТА" Тогда + Менеджер = ПланыВидовРасчета; + + ИначеЕсли КлассОМ = "РЕГИСТРСВЕДЕНИЙ" + Или КлассОМ = "РЕГИСТРЫСВЕДЕНИЙ" Тогда + Менеджер = РегистрыСведений; + + ИначеЕсли КлассОМ = "РЕГИСТРНАКОПЛЕНИЯ" + Или КлассОМ = "РЕГИСТРЫНАКОПЛЕНИЯ" Тогда + Менеджер = РегистрыНакопления; + + ИначеЕсли КлассОМ = "РЕГИСТРБУХГАЛТЕРИИ" + Или КлассОМ = "РЕГИСТРЫБУХГАЛТЕРИИ" Тогда + Менеджер = РегистрыБухгалтерии; + + ИначеЕсли КлассОМ = "РЕГИСТРРАСЧЕТА" + Или КлассОМ = "РЕГИСТРЫРАСЧЕТА" Тогда + + Если ЧастиИмени.Количество() < 3 Тогда + // Регистр расчета + Менеджер = РегистрыРасчета; + Иначе + КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]); + Если ЧастиИмени.Количество() > 3 Тогда + ИмяПодчиненногоОМ = ЧастиИмени[3]; + КонецЕсли; + Если КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТ" + Или КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТЫ" Тогда + // Перерасчет + Попытка + Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; + ИмяОМ = ИмяПодчиненногоОМ; + Исключение + Менеджер = Неопределено; + КонецПопытки; + КонецЕсли; + КонецЕсли; + + ИначеЕсли КлассОМ = "БИЗНЕСПРОЦЕСС" + Или КлассОМ = "БИЗНЕСПРОЦЕССЫ" Тогда + Менеджер = БизнесПроцессы; + + ИначеЕсли КлассОМ = "ЗАДАЧА" + Или КлассОМ = "ЗАДАЧИ" Тогда + Менеджер = Задачи; + + ИначеЕсли КлассОМ = "КОНСТАНТА" + Или КлассОМ = "КОНСТАНТЫ" Тогда + Менеджер = Константы; + + ИначеЕсли КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТЬ" + Или КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТИ" Тогда + Менеджер = Последовательности; + КонецЕсли; + + Если Менеджер <> Неопределено Тогда + Если ЗначениеЗаполнено(ИмяОМ) Тогда + Попытка + Возврат Менеджер[ИмяОМ]; + Исключение + Менеджер = Неопределено; + КонецПопытки; + Иначе + Возврат Менеджер; + КонецЕсли; + КонецЕсли; + + ВызватьИсключение СтрШаблон(НСтр("ru = 'Не удалось получить менеджер для объекта ""%1""'"), Имя); + +КонецФункции + +#КонецОбласти + diff --git a/GitConverter/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl b/GitConverter/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl index 3511229..ed4ca43 100644 --- a/GitConverter/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl +++ b/GitConverter/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// // Подсистема "Регламентные задания". // diff --git a/GitConverter/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl b/GitConverter/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl index aa9367f..a1dacaa 100644 --- a/GitConverter/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl +++ b/GitConverter/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl @@ -1,625 +1,633 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Регламентные задания". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// Проверяет, включено ли регламентное задание по функциональным опциям. -// -// Параметры: -// Задание - ОбъектМетаданных: РегламентноеЗадание - регламентное задание. -// ЗависимостиЗаданий - ТаблицаЗначений - таблица зависимостей регламентных -// заданий, полученная методом РегламентныеЗаданияСлужебный.РегламентныеЗаданияЗависимыеОтФункциональныхОпций. -// Если не указано, получается автоматически. -// -// Возвращаемое значение: -// Использование - Булево - Истина, если регламентное задание используется. -// -Функция РегламентноеЗаданиеДоступноПоФункциональнымОпциям(Задание, ЗависимостиЗаданий = Неопределено) Экспорт - - Если ЗависимостиЗаданий = Неопределено Тогда - ЗависимостиЗаданий = РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); - КонецЕсли; - - Использование = Неопределено; - - НайденныеСтроки = ЗависимостиЗаданий.НайтиСтроки(Новый Структура("РегламентноеЗадание", Задание)); - - Для Каждого СтрокаЗависимости Из НайденныеСтроки Цикл - - Если СтрокаЗависимости.ФункциональнаяОпция = Неопределено Тогда - Продолжить; - КонецЕсли; - - ЗначениеФО = ПолучитьФункциональнуюОпцию(СтрокаЗависимости.ФункциональнаяОпция.Имя); - - Если Использование = Неопределено Тогда - Использование = ЗначениеФО; - ИначеЕсли СтрокаЗависимости.ЗависимостьПоИ Тогда - Использование = Использование И ЗначениеФО; - Иначе - Использование = Использование Или ЗначениеФО; - КонецЕсли; - КонецЦикла; - - Если Использование = Неопределено Тогда - Возврат Истина; - Иначе - Возврат Использование; - КонецЕсли; - -КонецФункции - -// Формирует таблицу зависимостей регламентных заданий от функциональных опций. -// -// Возвращаемое значение: -// Зависимости - ТаблицаЗначений - таблица значений с колонками: -// * РегламентноеЗадание - ОбъектМетаданных:РегламентноеЗадание - регламентное задание. -// * ФункциональнаяОпция - ОбъектМетаданных:ФункциональнаяОпция - функциональная опция, -// от которой зависит регламентное задание. -// * ЗависимостьПоИ - Булево - если регламентное задание зависит более, чем -// от одной функциональной опции и его необходимо включать только тогда, -// когда все функциональные опции включены, то следует указывать Истина -// для каждой зависимости. -// По умолчанию Ложь - если хотя бы одна функциональная опция включена, -// то регламентное задание тоже включено. -// * ВключатьПриВключенииФункциональнойОпции - Булево, Неопределено - если Ложь, то при -// включении функциональной опции регламентное задание не будет включаться. Значение -// Неопределено соответствует значению Истина. -// По умолчанию - неопределено. -// * ДоступноВПодчиненномУзлеРИБ - Булево, Неопределено - Истина или Неопределено, если регламентное -// задание доступно в РИБ. -// По умолчанию - неопределено. -// * ДоступноВМоделиСервиса - Булево, Неопределено - Истина или Неопределено, если регламентное -// задание доступно в модели сервиса. -// По умолчанию - неопределено. -// -Функция РегламентныеЗаданияЗависимыеОтФункциональныхОпций() Экспорт - - Зависимости = Новый ТаблицаЗначений; - Зависимости.Колонки.Добавить("РегламентноеЗадание"); - Зависимости.Колонки.Добавить("ФункциональнаяОпция"); - Зависимости.Колонки.Добавить("ЗависимостьПоИ", Новый ОписаниеТипов("Булево")); - Зависимости.Колонки.Добавить("ДоступноВМоделиСервиса"); - Зависимости.Колонки.Добавить("ДоступноВПодчиненномУзлеРИБ"); - Зависимости.Колонки.Добавить("ВключатьПриВключенииФункциональнойОпции"); - - Зависимости.Сортировать("РегламентноеЗадание"); - - Возврат Зависимости; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Вызывает исключение, если у пользователя нет права администрирования. -Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() Экспорт - - Возврат; -КонецПроцедуры - -// Отменяет фоновое задание, если это возможно, а именно, если оно выполняется на сервере, и активно. -// -// Параметры: -// Идентификатор - Строка уникального идентификатора ФоновогоЗадания. -// -Процедура ОтменитьФоновоеЗадание(Идентификатор) Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор(Идентификатор); - Отбор = Новый Структура; - Отбор.Вставить("УникальныйИдентификатор", НовыйУникальныйИдентификатор); - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); - Если МассивФоновыхЗаданий.Количество() = 1 Тогда - ФоновоеЗадание = МассивФоновыхЗаданий[0]; - Иначе - ВызватьИсключение НСтр("ru = 'Фоновое задание не найдено на сервере.'"); - КонецЕсли; - - Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда - ВызватьИсключение НСтр("ru = 'Задание не выполняется, его нельзя отменить.'"); - КонецЕсли; - - ФоновоеЗадание.Отменить(); - -КонецПроцедуры - -// Предназначена для "ручного" немедленного выполнения процедуры регламентного задания -// либо в сеансе клиента (в файловой ИБ), либо в фоновом задании на сервере (в серверной ИБ). -// Применяется в любом режиме соединения. -// СРучной" режим запуска не влияет на выполнение регламентного задания по аварийному -// и основному расписаниям, т.к. не указывается ссылка на регламентное задание у фонового задания. -// Тип ФоновоеЗадание не допускает установки такой ссылки, поэтому для файлового режима применяется -// тоже правило. -// -// Параметры: -// Задание - РегламентноеЗадание, Строка - уникального идентификатора РегламентногоЗадания. -// -// Возвращаемое значение: -// Структура - со свойствами -// * МоментЗапуска - Неопределено, Дата - для файловой ИБ устанавливает переданный момент, как момент запуска -// метода регламентного задания. -// Для серверной ИБ - возвращает момент запуска фонового задания по факту. -// * ИдентификаторФоновогоЗадания - Строка - для серверной ИБ возвращает идентификатор запущенного фонового задания. -// -Функция ВыполнитьРегламентноеЗаданиеВручную(Знач Задание) Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - ПараметрыВыполнения = ПараметрыВыполненияРегламентногоЗадания(); - ПараметрыВыполнения.ПроцедураУжеВыполняется = Ложь; - Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Задание); - - ПараметрыВыполнения.ЗапускВыполнен = Ложь; - СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); - - Если СвойстваПоследнегоФоновогоЗадания <> Неопределено - И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно Тогда - - ПараметрыВыполнения.МоментЗапуска = СвойстваПоследнегоФоновогоЗадания.Начало; - Если ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Наименование) Тогда - ПараметрыВыполнения.ПредставлениеФоновогоЗадания = СвойстваПоследнегоФоновогоЗадания.Наименование; - Иначе - ПараметрыВыполнения.ПредставлениеФоновогоЗадания = ПредставлениеРегламентногоЗадания(Задание); - КонецЕсли; - Иначе - НаименованиеФоновогоЗадания = СтрШаблон(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание)); - ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания); - ПараметрыВыполнения.ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор); - ПараметрыВыполнения.МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало; - ПараметрыВыполнения.ЗапускВыполнен = Истина; - КонецЕсли; - - ПараметрыВыполнения.ПроцедураУжеВыполняется = НЕ ПараметрыВыполнения.ЗапускВыполнен; - Возврат ПараметрыВыполнения; - -КонецФункции - -Функция ПараметрыВыполненияРегламентногоЗадания() - - Результат = Новый Структура; - Результат.Вставить("МоментЗапуска"); - Результат.Вставить("ИдентификаторФоновогоЗадания"); - Результат.Вставить("ПредставлениеФоновогоЗадания"); - Результат.Вставить("ПроцедураУжеВыполняется"); - Результат.Вставить("ЗапускВыполнен"); - Возврат Результат; - -КонецФункции - -// Возвращает представление регламентного задания, -// это по порядку исключения незаполненных реквизитов: -// Наименование, Метаданные.Синоним, Метаданные.Имя. -// -// Параметры: -// Задание - РегламентноеЗадание, Строка - если строка, тогда УникальныйИдентификатор строкой. -// -// Возвращаемое значение: -// Строка. -// -Функция ПредставлениеРегламентногоЗадания(Знач Задание) Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда - РегламентноеЗадание = Задание; - Иначе - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Задание)); - КонецЕсли; - - Если РегламентноеЗадание <> Неопределено Тогда - Представление = РегламентноеЗадание.Наименование; - - Если ПустаяСтрока(РегламентноеЗадание.Наименование) Тогда - Представление = РегламентноеЗадание.Метаданные.Синоним; - - Если ПустаяСтрока(Представление) Тогда - Представление = РегламентноеЗадание.Метаданные.Имя; - КонецЕсли - КонецЕсли; - Иначе - Представление = ТекстНеОпределено(); - КонецЕсли; - - Возврат Представление; - -КонецФункции - -// Возвращает текст "<не определено>". -Функция ТекстНеОпределено() Экспорт - - Возврат НСтр("ru = '<не определено>'"); - -КонецФункции - -// Только для внутреннего использования. -// -Процедура ТаблицаСвойствФоновыхЗаданийВФоне(Параметры, АдресХранилища) Экспорт - - ТаблицаСвойств = ПолучитьТаблицуСвойствФоновыхЗаданий(Параметры.Отбор); - - Результат = Новый Структура; - Результат.Вставить("ТаблицаСвойств", ТаблицаСвойств); - - ПоместитьВоВременноеХранилище(Результат, АдресХранилища); - -КонецПроцедуры - -// Возвращает таблицу свойств фоновых заданий. -// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий(). -// -// Параметры: -// Отбор - Структура - допустимые поля: -// Идентификатор, Ключ, Состояние, Начало, Конец, -// Наименование, ИмяМетода, РегламентноеЗадание. -// -// Возвращаемое значение: -// ТаблицаЗначений - возвращается таблица после отбора. -// -Функция ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор = Неопределено) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Таблица = ПустаяТаблицаСвойствФоновыхЗаданий(); - - Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда - Отбор.Удалить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания"); - ПолучитьПоследнее = Истина; - Иначе - ПолучитьПоследнее = Ложь; - КонецЕсли; - - РегламентноеЗадание = Неопределено; - - // Добавление истории фоновых заданий, полученных с сервера. - Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда - Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( - Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); - ТекущийОтбор = Новый Структура("Ключ", Отбор.ИдентификаторРегламентногоЗадания); - ФоновыеЗаданияЗапущенныеВручную = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); - Если РегламентноеЗадание <> Неопределено Тогда - ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание; - КонецЕсли; - Если НЕ ПолучитьПоследнее ИЛИ ПоследнееФоновоеЗадание = Неопределено Тогда - ТекущийОтбор = Новый Структура("РегламентноеЗадание", РегламентноеЗадание); - АвтоматическиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); - КонецЕсли; - Если ПолучитьПоследнее Тогда - Если ПоследнееФоновоеЗадание = Неопределено Тогда - ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(АвтоматическиеФоновыеЗадания); - КонецЕсли; - - ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве( - ФоновыеЗаданияЗапущенныеВручную, ПоследнееФоновоеЗадание); - - Если ПоследнееФоновоеЗадание <> Неопределено Тогда - МассивФоновыхЗаданий = Новый Массив; - МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание); - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - КонецЕсли; - Возврат Таблица; - КонецЕсли; - ДобавитьСвойстваФоновыхЗаданий(ФоновыеЗаданияЗапущенныеВручную, Таблица); - ДобавитьСвойстваФоновыхЗаданий(АвтоматическиеФоновыеЗадания, Таблица); - Иначе - МассивФоновыхЗаданий = Новый Массив; - ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие; - Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл - ВсеИдентификаторыРегламентныхЗаданий.Вставить( - Строка(ТекущееЗадание.УникальныйИдентификатор), Истина); - КонецЦикла; - ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(); - Для каждого ТекущееЗадание Из ВсеФоновыеЗадания Цикл - Если ТекущееЗадание.РегламентноеЗадание = Неопределено - И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда - - МассивФоновыхЗаданий.Добавить(ТекущееЗадание); - КонецЕсли; - КонецЦикла; - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - КонецЕсли; - Иначе - Если НЕ ЗначениеЗаполнено(Отбор) Тогда - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(); - Иначе - Если Отбор.Свойство("Идентификатор") Тогда - Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор)); - Отбор.Удалить("Идентификатор"); - КонецЕсли; - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); - Если Отбор.Свойство("УникальныйИдентификатор") Тогда - Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор)); - Отбор.Удалить("УникальныйИдентификатор"); - КонецЕсли; - КонецЕсли; - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - КонецЕсли; - - Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда - РегламентныеЗаданияДляОбработки = Новый Массив; - Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда - Если РегламентноеЗадание = Неопределено Тогда - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( - Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); - КонецЕсли; - Если РегламентноеЗадание <> Неопределено Тогда - РегламентныеЗаданияДляОбработки.Добавить(РегламентноеЗадание); - КонецЕсли; - КонецЕсли; - Иначе - РегламентныеЗаданияДляОбработки = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); - КонецЕсли; - - Таблица.Сортировать("Начало Убыв, Конец Убыв"); - - // Отбор фоновых заданий. - Если ЗначениеЗаполнено(Отбор) Тогда - Начало = Неопределено; - Конец = Неопределено; - Состояние = Неопределено; - Если Отбор.Свойство("Начало") Тогда - Начало = ?(ЗначениеЗаполнено(Отбор.Начало), Отбор.Начало, Неопределено); - Отбор.Удалить("Начало"); - КонецЕсли; - Если Отбор.Свойство("Конец") Тогда - Конец = ?(ЗначениеЗаполнено(Отбор.Конец), Отбор.Конец, Неопределено); - Отбор.Удалить("Конец"); - КонецЕсли; - Если Отбор.Свойство("Состояние") Тогда - Если ТипЗнч(Отбор.Состояние) = Тип("Массив") Тогда - Состояние = Отбор.Состояние; - Отбор.Удалить("Состояние"); - КонецЕсли; - КонецЕсли; - - Если Отбор.Количество() <> 0 Тогда - Строки = Таблица.НайтиСтроки(Отбор); - Иначе - Строки = Таблица; - КонецЕсли; - // Выполнение дополнительного отбора по периоду и состоянию (если отбор определен). - НомерЭлемента = Строки.Количество() - 1; - Пока НомерЭлемента >= 0 Цикл - Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало - Или Конец <> Неопределено И Конец < ?(ЗначениеЗаполнено(Строки[НомерЭлемента].Конец), Строки[НомерЭлемента].Конец, ТекущаяДатаСеанса()) - Или Состояние <> Неопределено И Состояние.Найти(Строки[НомерЭлемента].Состояние) = Неопределено Тогда - Строки.Удалить(НомерЭлемента); - КонецЕсли; - НомерЭлемента = НомерЭлемента - 1; - КонецЦикла; - // Удаление лишних строк из таблицы. - Если ТипЗнч(Строки) = Тип("Массив") Тогда - НомерСтроки = Таблица.Количество() - 1; - Пока НомерСтроки >= 0 Цикл - Если Строки.Найти(Таблица[НомерСтроки]) = Неопределено Тогда - Таблица.Удалить(Таблица[НомерСтроки]); - КонецЕсли; - НомерСтроки = НомерСтроки - 1; - КонецЦикла; - КонецЕсли; - КонецЕсли; - - Возврат Таблица; - -КонецФункции - -// Возвращает новую таблицу свойств фоновых заданий. -// -// Возвращаемое значение: -// ТаблицаЗначений. -// -Функция ПустаяТаблицаСвойствФоновыхЗаданий() - - НоваяТаблица = Новый ТаблицаЗначений; - НоваяТаблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); - НоваяТаблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); - НоваяТаблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка")); - НоваяТаблица.Колонки.Добавить("Начало", Новый ОписаниеТипов("Дата")); - НоваяТаблица.Колонки.Добавить("Конец", Новый ОписаниеТипов("Дата")); - НоваяТаблица.Колонки.Добавить("ИдентификаторРегламентногоЗадания", Новый ОписаниеТипов("Строка")); - НоваяТаблица.Колонки.Добавить("Состояние", Новый ОписаниеТипов("СостояниеФоновогоЗадания")); - НоваяТаблица.Колонки.Добавить("ИмяМетода", Новый ОписаниеТипов("Строка")); - НоваяТаблица.Колонки.Добавить("Расположение", Новый ОписаниеТипов("Строка")); - НоваяТаблица.Колонки.Добавить("ОписаниеИнформацииОбОшибке", Новый ОписаниеТипов("Строка")); - НоваяТаблица.Колонки.Добавить("ПопыткаЗапуска", Новый ОписаниеТипов("Число")); - НоваяТаблица.Колонки.Добавить("СообщенияПользователю", Новый ОписаниеТипов("Массив")); - НоваяТаблица.Колонки.Добавить("НомерСеанса", Новый ОписаниеТипов("Число")); - НоваяТаблица.Колонки.Добавить("НачалоСеанса", Новый ОписаниеТипов("Дата")); - НоваяТаблица.Индексы.Добавить("Идентификатор, Начало"); - - Возврат НоваяТаблица; - -КонецФункции - -Процедура ДобавитьСвойстваФоновыхЗаданий(Знач МассивФоновыхЗаданий, Знач ТаблицаСвойствФоновыхЗаданий) - - Индекс = МассивФоновыхЗаданий.Количество() - 1; - Пока Индекс >= 0 Цикл - ФоновоеЗадание = МассивФоновыхЗаданий[Индекс]; - Строка = ТаблицаСвойствФоновыхЗаданий.Добавить(); - ЗаполнитьЗначенияСвойств(Строка, ФоновоеЗадание); - Строка.Идентификатор = ФоновоеЗадание.УникальныйИдентификатор; - РегламентноеЗадание = ФоновоеЗадание.РегламентноеЗадание; - - Если РегламентноеЗадание = Неопределено - И СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ФоновоеЗадание.Ключ) Тогда - - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ФоновоеЗадание.Ключ)); - КонецЕсли; - Строка.ИдентификаторРегламентногоЗадания = ?( - РегламентноеЗадание = Неопределено, - "", - РегламентноеЗадание.УникальныйИдентификатор); - - Строка.ОписаниеИнформацииОбОшибке = ?( - ФоновоеЗадание.ИнформацияОбОшибке = Неопределено, - "", - ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке)); - - Индекс = Индекс - 1; - КонецЦикла; - -КонецПроцедуры - -Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено) - - Для каждого ТекущееФоновоеЗадание Из МассивФоновыхЗаданий Цикл - Если ПоследнееФоновоеЗадание = Неопределено Тогда - ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; - Продолжить; - КонецЕсли; - Если ЗначениеЗаполнено(ПоследнееФоновоеЗадание.Конец) Тогда - Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) - ИЛИ ПоследнееФоновоеЗадание.Конец < ТекущееФоновоеЗадание.Конец Тогда - ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; - КонецЕсли; - Иначе - Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) - И ПоследнееФоновоеЗадание.Начало < ТекущееФоновоеЗадание.Начало Тогда - ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат ПоследнееФоновоеЗадание; - -КонецФункции - -// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке, -// последнее фоновое задание найдено по идентификатору регламентного задания -// и сообщения/ошибки есть. -// -// Параметры: -// Задание - РегламентноеЗадание, Строка - УникальныйИдентификатор -// РегламентногоЗадания строкой. -// -// Возвращаемое значение: -// Строка. -// -Функция СообщенияИОписанияОшибокРегламентногоЗадания(Знач Задание) Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - ИдентификаторРегламентногоЗадания = ?(ТипЗнч(Задание) = Тип("РегламентноеЗадание"), Строка(Задание.УникальныйИдентификатор), Задание); - СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(ИдентификаторРегламентногоЗадания); - Возврат ?(СвойстваПоследнегоФоновогоЗадания = Неопределено, - "", - СообщенияИОписанияОшибокФоновогоЗадания(СвойстваПоследнегоФоновогоЗадания.Идентификатор) ); - -КонецФункции - -// Возвращает свойства ФоновогоЗадания по строке уникального идентификатора. -// -// Параметры: -// Идентификатор - Строка - уникального идентификатора ФоновогоЗадания. -// ИменаСвойств - Строка, если заполнено, возвращается структура с указанными свойствами. -// -// Возвращаемое значение: -// СтрокаТаблицыЗначений, Структура - свойства ФоновогоЗадания. -// -Функция ПолучитьСвойстваФоновогоЗадания(Идентификатор, ИменаСвойств = "") Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - Отбор = Новый Структура("Идентификатор", Идентификатор); - ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор); - - Если ТаблицаСвойствФоновыхЗаданий.Количество() > 0 Тогда - Если ЗначениеЗаполнено(ИменаСвойств) Тогда - Результат = Новый Структура(ИменаСвойств); - ЗаполнитьЗначенияСвойств(Результат, ТаблицаСвойствФоновыхЗаданий[0]); - Иначе - Результат = ТаблицаСвойствФоновыхЗаданий[0]; - КонецЕсли; - Иначе - Результат = Неопределено; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке, -// если фоновое задание найдено по идентификатору и сообщения/ошибки есть. -// -// Параметры: -// Задание - Строка - УникальныйИдентификатор ФоновогоЗадания строкой. -// -// Возвращаемое значение: -// Строка. -// -Функция СообщенияИОписанияОшибокФоновогоЗадания(Идентификатор, СвойстваФоновогоЗадания = Неопределено) Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - Если СвойстваФоновогоЗадания = Неопределено Тогда - СвойстваФоновогоЗадания = ПолучитьСвойстваФоновогоЗадания(Идентификатор); - КонецЕсли; - - Строка = ""; - Если СвойстваФоновогоЗадания <> Неопределено Тогда - Для каждого Сообщение Из СвойстваФоновогоЗадания.СообщенияПользователю Цикл - Строка = Строка + ?(Строка = "", - "", - " - | - |") + Сообщение.Текст; - КонецЦикла; - Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке) Тогда - Строка = Строка + ?(Строка = "", - СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке, - " - | - |" + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке); - КонецЕсли; - КонецЕсли; - - Возврат Строка; - -КонецФункции - -// Возвращает свойства последнего фонового задания выполненного при выполнении регламентного задания, если оно есть. -// Процедура работает, как в файл-серверном, так и в клиент-серверном режимах. -// -// Параметры: -// РегламентноеЗадание - РегламентноеЗадание, Строка - строка уникального идентификатора РегламентногоЗадания. -// -// Возвращаемое значение: -// СтрокаТаблицыЗначений, Неопределено. -// -Функция ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(РегламентноеЗадание) Экспорт - - ВызватьИсключениеЕслиНетПраваАдминистрирования(); - УстановитьПривилегированныйРежим(Истина); - - ИдентификаторРегламентногоЗадания = ?(ТипЗнч(РегламентноеЗадание) = Тип("РегламентноеЗадание"), Строка(РегламентноеЗадание.УникальныйИдентификатор), РегламентноеЗадание); - Отбор = Новый Структура; - Отбор.Вставить("ИдентификаторРегламентногоЗадания", ИдентификаторРегламентногоЗадания); - Отбор.Вставить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания"); - ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор); - ТаблицаСвойствФоновыхЗаданий.Сортировать("Конец Возр"); - - Если ТаблицаСвойствФоновыхЗаданий.Количество() = 0 Тогда - СвойстваФоновогоЗадания = Неопределено; - ИначеЕсли НЕ ЗначениеЗаполнено(ТаблицаСвойствФоновыхЗаданий[0].Конец) Тогда - СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[0]; - Иначе - СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[ТаблицаСвойствФоновыхЗаданий.Количество()-1]; - КонецЕсли; - - Возврат СвойстваФоновогоЗадания; - -КонецФункции - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Регламентные задания". +// +//////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Проверяет, включено ли регламентное задание по функциональным опциям. +// +// Параметры: +// Задание - ОбъектМетаданных: РегламентноеЗадание - регламентное задание. +// ЗависимостиЗаданий - ТаблицаЗначений - таблица зависимостей регламентных +// заданий, полученная методом РегламентныеЗаданияСлужебный.РегламентныеЗаданияЗависимыеОтФункциональныхОпций. +// Если не указано, получается автоматически. +// +// Возвращаемое значение: +// Использование - Булево - Истина, если регламентное задание используется. +// +Функция РегламентноеЗаданиеДоступноПоФункциональнымОпциям(Задание, ЗависимостиЗаданий = Неопределено) Экспорт + + Если ЗависимостиЗаданий = Неопределено Тогда + ЗависимостиЗаданий = РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); + КонецЕсли; + + Использование = Неопределено; + + НайденныеСтроки = ЗависимостиЗаданий.НайтиСтроки(Новый Структура("РегламентноеЗадание", Задание)); + + Для Каждого СтрокаЗависимости Из НайденныеСтроки Цикл + + Если СтрокаЗависимости.ФункциональнаяОпция = Неопределено Тогда + Продолжить; + КонецЕсли; + + ЗначениеФО = ПолучитьФункциональнуюОпцию(СтрокаЗависимости.ФункциональнаяОпция.Имя); + + Если Использование = Неопределено Тогда + Использование = ЗначениеФО; + ИначеЕсли СтрокаЗависимости.ЗависимостьПоИ Тогда + Использование = Использование И ЗначениеФО; + Иначе + Использование = Использование Или ЗначениеФО; + КонецЕсли; + КонецЦикла; + + Если Использование = Неопределено Тогда + Возврат Истина; + Иначе + Возврат Использование; + КонецЕсли; + +КонецФункции + +// Формирует таблицу зависимостей регламентных заданий от функциональных опций. +// +// Возвращаемое значение: +// Зависимости - ТаблицаЗначений - таблица значений с колонками: +// * РегламентноеЗадание - ОбъектМетаданных:РегламентноеЗадание - регламентное задание. +// * ФункциональнаяОпция - ОбъектМетаданных:ФункциональнаяОпция - функциональная опция, +// от которой зависит регламентное задание. +// * ЗависимостьПоИ - Булево - если регламентное задание зависит более, чем +// от одной функциональной опции и его необходимо включать только тогда, +// когда все функциональные опции включены, то следует указывать Истина +// для каждой зависимости. +// По умолчанию Ложь - если хотя бы одна функциональная опция включена, +// то регламентное задание тоже включено. +// * ВключатьПриВключенииФункциональнойОпции - Булево, Неопределено - если Ложь, то при +// включении функциональной опции регламентное задание не будет включаться. Значение +// Неопределено соответствует значению Истина. +// По умолчанию - неопределено. +// * ДоступноВПодчиненномУзлеРИБ - Булево, Неопределено - Истина или Неопределено, если регламентное +// задание доступно в РИБ. +// По умолчанию - неопределено. +// * ДоступноВМоделиСервиса - Булево, Неопределено - Истина или Неопределено, если регламентное +// задание доступно в модели сервиса. +// По умолчанию - неопределено. +// +Функция РегламентныеЗаданияЗависимыеОтФункциональныхОпций() Экспорт + + Зависимости = Новый ТаблицаЗначений; + Зависимости.Колонки.Добавить("РегламентноеЗадание"); + Зависимости.Колонки.Добавить("ФункциональнаяОпция"); + Зависимости.Колонки.Добавить("ЗависимостьПоИ", Новый ОписаниеТипов("Булево")); + Зависимости.Колонки.Добавить("ДоступноВМоделиСервиса"); + Зависимости.Колонки.Добавить("ДоступноВПодчиненномУзлеРИБ"); + Зависимости.Колонки.Добавить("ВключатьПриВключенииФункциональнойОпции"); + + Зависимости.Сортировать("РегламентноеЗадание"); + + Возврат Зависимости; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Вызывает исключение, если у пользователя нет права администрирования. +Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() Экспорт + + Возврат; +КонецПроцедуры + +// Отменяет фоновое задание, если это возможно, а именно, если оно выполняется на сервере, и активно. +// +// Параметры: +// Идентификатор - Строка уникального идентификатора ФоновогоЗадания. +// +Процедура ОтменитьФоновоеЗадание(Идентификатор) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор(Идентификатор); + Отбор = Новый Структура; + Отбор.Вставить("УникальныйИдентификатор", НовыйУникальныйИдентификатор); + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + Если МассивФоновыхЗаданий.Количество() = 1 Тогда + ФоновоеЗадание = МассивФоновыхЗаданий[0]; + Иначе + ВызватьИсключение НСтр("ru = 'Фоновое задание не найдено на сервере.'"); + КонецЕсли; + + Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда + ВызватьИсключение НСтр("ru = 'Задание не выполняется, его нельзя отменить.'"); + КонецЕсли; + + ФоновоеЗадание.Отменить(); + +КонецПроцедуры + +// Предназначена для "ручного" немедленного выполнения процедуры регламентного задания +// либо в сеансе клиента (в файловой ИБ), либо в фоновом задании на сервере (в серверной ИБ). +// Применяется в любом режиме соединения. +// СРучной" режим запуска не влияет на выполнение регламентного задания по аварийному +// и основному расписаниям, т.к. не указывается ссылка на регламентное задание у фонового задания. +// Тип ФоновоеЗадание не допускает установки такой ссылки, поэтому для файлового режима применяется +// тоже правило. +// +// Параметры: +// Задание - РегламентноеЗадание, Строка - уникального идентификатора РегламентногоЗадания. +// +// Возвращаемое значение: +// Структура - со свойствами +// * МоментЗапуска - Неопределено, Дата - для файловой ИБ устанавливает переданный момент, как момент запуска +// метода регламентного задания. +// Для серверной ИБ - возвращает момент запуска фонового задания по факту. +// * ИдентификаторФоновогоЗадания - Строка - для серверной ИБ возвращает идентификатор запущенного фонового задания. +// +Функция ВыполнитьРегламентноеЗаданиеВручную(Знач Задание) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + ПараметрыВыполнения = ПараметрыВыполненияРегламентногоЗадания(); + ПараметрыВыполнения.ПроцедураУжеВыполняется = Ложь; + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Задание); + + ПараметрыВыполнения.ЗапускВыполнен = Ложь; + СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); + + Если СвойстваПоследнегоФоновогоЗадания <> Неопределено + И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно Тогда + + ПараметрыВыполнения.МоментЗапуска = СвойстваПоследнегоФоновогоЗадания.Начало; + Если ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Наименование) Тогда + ПараметрыВыполнения.ПредставлениеФоновогоЗадания = СвойстваПоследнегоФоновогоЗадания.Наименование; + Иначе + ПараметрыВыполнения.ПредставлениеФоновогоЗадания = ПредставлениеРегламентногоЗадания(Задание); + КонецЕсли; + Иначе + НаименованиеФоновогоЗадания = СтрШаблон(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание)); + ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания); + ПараметрыВыполнения.ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор); + ПараметрыВыполнения.МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало; + ПараметрыВыполнения.ЗапускВыполнен = Истина; + КонецЕсли; + + ПараметрыВыполнения.ПроцедураУжеВыполняется = НЕ ПараметрыВыполнения.ЗапускВыполнен; + Возврат ПараметрыВыполнения; + +КонецФункции + +Функция ПараметрыВыполненияРегламентногоЗадания() + + Результат = Новый Структура; + Результат.Вставить("МоментЗапуска"); + Результат.Вставить("ИдентификаторФоновогоЗадания"); + Результат.Вставить("ПредставлениеФоновогоЗадания"); + Результат.Вставить("ПроцедураУжеВыполняется"); + Результат.Вставить("ЗапускВыполнен"); + Возврат Результат; + +КонецФункции + +// Возвращает представление регламентного задания, +// это по порядку исключения незаполненных реквизитов: +// Наименование, Метаданные.Синоним, Метаданные.Имя. +// +// Параметры: +// Задание - РегламентноеЗадание, Строка - если строка, тогда УникальныйИдентификатор строкой. +// +// Возвращаемое значение: +// Строка. +// +Функция ПредставлениеРегламентногоЗадания(Знач Задание) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда + РегламентноеЗадание = Задание; + Иначе + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Задание)); + КонецЕсли; + + Если РегламентноеЗадание <> Неопределено Тогда + Представление = РегламентноеЗадание.Наименование; + + Если ПустаяСтрока(РегламентноеЗадание.Наименование) Тогда + Представление = РегламентноеЗадание.Метаданные.Синоним; + + Если ПустаяСтрока(Представление) Тогда + Представление = РегламентноеЗадание.Метаданные.Имя; + КонецЕсли + КонецЕсли; + Иначе + Представление = ТекстНеОпределено(); + КонецЕсли; + + Возврат Представление; + +КонецФункции + +// Возвращает текст "<не определено>". +Функция ТекстНеОпределено() Экспорт + + Возврат НСтр("ru = '<не определено>'"); + +КонецФункции + +// Только для внутреннего использования. +// +Процедура ТаблицаСвойствФоновыхЗаданийВФоне(Параметры, АдресХранилища) Экспорт + + ТаблицаСвойств = ПолучитьТаблицуСвойствФоновыхЗаданий(Параметры.Отбор); + + Результат = Новый Структура; + Результат.Вставить("ТаблицаСвойств", ТаблицаСвойств); + + ПоместитьВоВременноеХранилище(Результат, АдресХранилища); + +КонецПроцедуры + +// Возвращает таблицу свойств фоновых заданий. +// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий(). +// +// Параметры: +// Отбор - Структура - допустимые поля: +// Идентификатор, Ключ, Состояние, Начало, Конец, +// Наименование, ИмяМетода, РегламентноеЗадание. +// +// Возвращаемое значение: +// ТаблицаЗначений - возвращается таблица после отбора. +// +Функция ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Таблица = ПустаяТаблицаСвойствФоновыхЗаданий(); + + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда + Отбор.Удалить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания"); + ПолучитьПоследнее = Истина; + Иначе + ПолучитьПоследнее = Ложь; + КонецЕсли; + + РегламентноеЗадание = Неопределено; + + // Добавление истории фоновых заданий, полученных с сервера. + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда + Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); + ТекущийОтбор = Новый Структура("Ключ", Отбор.ИдентификаторРегламентногоЗадания); + ФоновыеЗаданияЗапущенныеВручную = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); + Если РегламентноеЗадание <> Неопределено Тогда + ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание; + КонецЕсли; + Если НЕ ПолучитьПоследнее ИЛИ ПоследнееФоновоеЗадание = Неопределено Тогда + ТекущийОтбор = Новый Структура("РегламентноеЗадание", РегламентноеЗадание); + АвтоматическиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); + КонецЕсли; + Если ПолучитьПоследнее Тогда + Если ПоследнееФоновоеЗадание = Неопределено Тогда + ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(АвтоматическиеФоновыеЗадания); + КонецЕсли; + + ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве( + ФоновыеЗаданияЗапущенныеВручную, ПоследнееФоновоеЗадание); + + Если ПоследнееФоновоеЗадание <> Неопределено Тогда + МассивФоновыхЗаданий = Новый Массив; + МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание); + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); + КонецЕсли; + Возврат Таблица; + КонецЕсли; + ДобавитьСвойстваФоновыхЗаданий(ФоновыеЗаданияЗапущенныеВручную, Таблица); + ДобавитьСвойстваФоновыхЗаданий(АвтоматическиеФоновыеЗадания, Таблица); + Иначе + МассивФоновыхЗаданий = Новый Массив; + ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие; + Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл + ВсеИдентификаторыРегламентныхЗаданий.Вставить( + Строка(ТекущееЗадание.УникальныйИдентификатор), Истина); + КонецЦикла; + ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Для каждого ТекущееЗадание Из ВсеФоновыеЗадания Цикл + Если ТекущееЗадание.РегламентноеЗадание = Неопределено + И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда + + МассивФоновыхЗаданий.Добавить(ТекущееЗадание); + КонецЕсли; + КонецЦикла; + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); + КонецЕсли; + Иначе + Если НЕ ЗначениеЗаполнено(Отбор) Тогда + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Иначе + Если Отбор.Свойство("Идентификатор") Тогда + Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор)); + Отбор.Удалить("Идентификатор"); + КонецЕсли; + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + Если Отбор.Свойство("УникальныйИдентификатор") Тогда + Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор)); + Отбор.Удалить("УникальныйИдентификатор"); + КонецЕсли; + КонецЕсли; + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); + КонецЕсли; + + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда + РегламентныеЗаданияДляОбработки = Новый Массив; + Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда + Если РегламентноеЗадание = Неопределено Тогда + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); + КонецЕсли; + Если РегламентноеЗадание <> Неопределено Тогда + РегламентныеЗаданияДляОбработки.Добавить(РегламентноеЗадание); + КонецЕсли; + КонецЕсли; + Иначе + РегламентныеЗаданияДляОбработки = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); + КонецЕсли; + + Таблица.Сортировать("Начало Убыв, Конец Убыв"); + + // Отбор фоновых заданий. + Если ЗначениеЗаполнено(Отбор) Тогда + Начало = Неопределено; + Конец = Неопределено; + Состояние = Неопределено; + Если Отбор.Свойство("Начало") Тогда + Начало = ?(ЗначениеЗаполнено(Отбор.Начало), Отбор.Начало, Неопределено); + Отбор.Удалить("Начало"); + КонецЕсли; + Если Отбор.Свойство("Конец") Тогда + Конец = ?(ЗначениеЗаполнено(Отбор.Конец), Отбор.Конец, Неопределено); + Отбор.Удалить("Конец"); + КонецЕсли; + Если Отбор.Свойство("Состояние") Тогда + Если ТипЗнч(Отбор.Состояние) = Тип("Массив") Тогда + Состояние = Отбор.Состояние; + Отбор.Удалить("Состояние"); + КонецЕсли; + КонецЕсли; + + Если Отбор.Количество() <> 0 Тогда + Строки = Таблица.НайтиСтроки(Отбор); + Иначе + Строки = Таблица; + КонецЕсли; + // Выполнение дополнительного отбора по периоду и состоянию (если отбор определен). + НомерЭлемента = Строки.Количество() - 1; + Пока НомерЭлемента >= 0 Цикл + Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало + Или Конец <> Неопределено И Конец < ?(ЗначениеЗаполнено(Строки[НомерЭлемента].Конец), Строки[НомерЭлемента].Конец, ТекущаяДатаСеанса()) + Или Состояние <> Неопределено И Состояние.Найти(Строки[НомерЭлемента].Состояние) = Неопределено Тогда + Строки.Удалить(НомерЭлемента); + КонецЕсли; + НомерЭлемента = НомерЭлемента - 1; + КонецЦикла; + // Удаление лишних строк из таблицы. + Если ТипЗнч(Строки) = Тип("Массив") Тогда + НомерСтроки = Таблица.Количество() - 1; + Пока НомерСтроки >= 0 Цикл + Если Строки.Найти(Таблица[НомерСтроки]) = Неопределено Тогда + Таблица.Удалить(Таблица[НомерСтроки]); + КонецЕсли; + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + Возврат Таблица; + +КонецФункции + +// Возвращает новую таблицу свойств фоновых заданий. +// +// Возвращаемое значение: +// ТаблицаЗначений. +// +Функция ПустаяТаблицаСвойствФоновыхЗаданий() + + НоваяТаблица = Новый ТаблицаЗначений; + НоваяТаблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Начало", Новый ОписаниеТипов("Дата")); + НоваяТаблица.Колонки.Добавить("Конец", Новый ОписаниеТипов("Дата")); + НоваяТаблица.Колонки.Добавить("ИдентификаторРегламентногоЗадания", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Состояние", Новый ОписаниеТипов("СостояниеФоновогоЗадания")); + НоваяТаблица.Колонки.Добавить("ИмяМетода", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("Расположение", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("ОписаниеИнформацииОбОшибке", Новый ОписаниеТипов("Строка")); + НоваяТаблица.Колонки.Добавить("ПопыткаЗапуска", Новый ОписаниеТипов("Число")); + НоваяТаблица.Колонки.Добавить("СообщенияПользователю", Новый ОписаниеТипов("Массив")); + НоваяТаблица.Колонки.Добавить("НомерСеанса", Новый ОписаниеТипов("Число")); + НоваяТаблица.Колонки.Добавить("НачалоСеанса", Новый ОписаниеТипов("Дата")); + НоваяТаблица.Индексы.Добавить("Идентификатор, Начало"); + + Возврат НоваяТаблица; + +КонецФункции + +Процедура ДобавитьСвойстваФоновыхЗаданий(Знач МассивФоновыхЗаданий, Знач ТаблицаСвойствФоновыхЗаданий) + + Индекс = МассивФоновыхЗаданий.Количество() - 1; + Пока Индекс >= 0 Цикл + ФоновоеЗадание = МассивФоновыхЗаданий[Индекс]; + Строка = ТаблицаСвойствФоновыхЗаданий.Добавить(); + ЗаполнитьЗначенияСвойств(Строка, ФоновоеЗадание); + Строка.Идентификатор = ФоновоеЗадание.УникальныйИдентификатор; + РегламентноеЗадание = ФоновоеЗадание.РегламентноеЗадание; + + Если РегламентноеЗадание = Неопределено + И СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ФоновоеЗадание.Ключ) Тогда + + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ФоновоеЗадание.Ключ)); + КонецЕсли; + Строка.ИдентификаторРегламентногоЗадания = ?( + РегламентноеЗадание = Неопределено, + "", + РегламентноеЗадание.УникальныйИдентификатор); + + Строка.ОписаниеИнформацииОбОшибке = ?( + ФоновоеЗадание.ИнформацияОбОшибке = Неопределено, + "", + ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке)); + + Индекс = Индекс - 1; + КонецЦикла; + +КонецПроцедуры + +Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено) + + Для каждого ТекущееФоновоеЗадание Из МассивФоновыхЗаданий Цикл + Если ПоследнееФоновоеЗадание = Неопределено Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + Продолжить; + КонецЕсли; + Если ЗначениеЗаполнено(ПоследнееФоновоеЗадание.Конец) Тогда + Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) + ИЛИ ПоследнееФоновоеЗадание.Конец < ТекущееФоновоеЗадание.Конец Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + КонецЕсли; + Иначе + Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) + И ПоследнееФоновоеЗадание.Начало < ТекущееФоновоеЗадание.Начало Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат ПоследнееФоновоеЗадание; + +КонецФункции + +// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке, +// последнее фоновое задание найдено по идентификатору регламентного задания +// и сообщения/ошибки есть. +// +// Параметры: +// Задание - РегламентноеЗадание, Строка - УникальныйИдентификатор +// РегламентногоЗадания строкой. +// +// Возвращаемое значение: +// Строка. +// +Функция СообщенияИОписанияОшибокРегламентногоЗадания(Знач Задание) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + ИдентификаторРегламентногоЗадания = ?(ТипЗнч(Задание) = Тип("РегламентноеЗадание"), Строка(Задание.УникальныйИдентификатор), Задание); + СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(ИдентификаторРегламентногоЗадания); + Возврат ?(СвойстваПоследнегоФоновогоЗадания = Неопределено, + "", + СообщенияИОписанияОшибокФоновогоЗадания(СвойстваПоследнегоФоновогоЗадания.Идентификатор) ); + +КонецФункции + +// Возвращает свойства ФоновогоЗадания по строке уникального идентификатора. +// +// Параметры: +// Идентификатор - Строка - уникального идентификатора ФоновогоЗадания. +// ИменаСвойств - Строка, если заполнено, возвращается структура с указанными свойствами. +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений, Структура - свойства ФоновогоЗадания. +// +Функция ПолучитьСвойстваФоновогоЗадания(Идентификатор, ИменаСвойств = "") Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + Отбор = Новый Структура("Идентификатор", Идентификатор); + ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор); + + Если ТаблицаСвойствФоновыхЗаданий.Количество() > 0 Тогда + Если ЗначениеЗаполнено(ИменаСвойств) Тогда + Результат = Новый Структура(ИменаСвойств); + ЗаполнитьЗначенияСвойств(Результат, ТаблицаСвойствФоновыхЗаданий[0]); + Иначе + Результат = ТаблицаСвойствФоновыхЗаданий[0]; + КонецЕсли; + Иначе + Результат = Неопределено; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке, +// если фоновое задание найдено по идентификатору и сообщения/ошибки есть. +// +// Параметры: +// Задание - Строка - УникальныйИдентификатор ФоновогоЗадания строкой. +// +// Возвращаемое значение: +// Строка. +// +Функция СообщенияИОписанияОшибокФоновогоЗадания(Идентификатор, СвойстваФоновогоЗадания = Неопределено) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + Если СвойстваФоновогоЗадания = Неопределено Тогда + СвойстваФоновогоЗадания = ПолучитьСвойстваФоновогоЗадания(Идентификатор); + КонецЕсли; + + Строка = ""; + Если СвойстваФоновогоЗадания <> Неопределено Тогда + Для каждого Сообщение Из СвойстваФоновогоЗадания.СообщенияПользователю Цикл + Строка = Строка + ?(Строка = "", + "", + " + | + |") + Сообщение.Текст; + КонецЦикла; + Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке) Тогда + Строка = Строка + ?(Строка = "", + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке, + " + | + |" + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке); + КонецЕсли; + КонецЕсли; + + Возврат Строка; + +КонецФункции + +// Возвращает свойства последнего фонового задания выполненного при выполнении регламентного задания, если оно есть. +// Процедура работает, как в файл-серверном, так и в клиент-серверном режимах. +// +// Параметры: +// РегламентноеЗадание - РегламентноеЗадание, Строка - строка уникального идентификатора РегламентногоЗадания. +// +// Возвращаемое значение: +// СтрокаТаблицыЗначений, Неопределено. +// +Функция ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(РегламентноеЗадание) Экспорт + + ВызватьИсключениеЕслиНетПраваАдминистрирования(); + УстановитьПривилегированныйРежим(Истина); + + ИдентификаторРегламентногоЗадания = ?(ТипЗнч(РегламентноеЗадание) = Тип("РегламентноеЗадание"), Строка(РегламентноеЗадание.УникальныйИдентификатор), РегламентноеЗадание); + Отбор = Новый Структура; + Отбор.Вставить("ИдентификаторРегламентногоЗадания", ИдентификаторРегламентногоЗадания); + Отбор.Вставить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания"); + ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор); + ТаблицаСвойствФоновыхЗаданий.Сортировать("Конец Возр"); + + Если ТаблицаСвойствФоновыхЗаданий.Количество() = 0 Тогда + СвойстваФоновогоЗадания = Неопределено; + ИначеЕсли НЕ ЗначениеЗаполнено(ТаблицаСвойствФоновыхЗаданий[0].Конец) Тогда + СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[0]; + Иначе + СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[ТаблицаСвойствФоновыхЗаданий.Количество()-1]; + КонецЕсли; + + Возврат СвойстваФоновогоЗадания; + +КонецФункции + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl b/GitConverter/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl index 7a1ca87..05f7c83 100644 --- a/GitConverter/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl +++ b/GitConverter/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl @@ -1,310 +1,318 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область СлужебныйПрограммныйИнтерфейс - -// Запуск фонового задания с контекстом клиента. Например, передаются ПараметрыКлиентаНаСервере. -// Запуск выполняется с помощью процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме. -// -// Параметры: -// ИмяМетода - Строка - как в функции Выполнить менеджера фоновых заданий. -// Параметры - Массив - как в функции Выполнить менеджера фоновых заданий. -// Ключ - Строка - как в функции Выполнить менеджера фоновых заданий. -// Наименование - Строка - как в функции Выполнить менеджера фоновых заданий. -// -// Возвращаемое значение: -// ФоновоеЗадание. -// -Функция ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяМетода, Параметры = Неопределено, Ключ = "", Наименование = "") Экспорт - - Если ТекущийРежимЗапуска() = Неопределено Тогда - ВызватьИсключение НСтр("ru = 'Запуск фонового задания с контекстом клиента возможен только при наличии клиента.'"); - КонецЕсли; - - ВсеПараметры = Новый Структура; - ВсеПараметры.Вставить("ИмяМетода", ИмяМетода); - ВсеПараметры.Вставить("Параметры", Параметры); - - ПараметрыПроцедурыФоновогоЗадания = Новый Массив; - ПараметрыПроцедурыФоновогоЗадания.Добавить(ВсеПараметры); - - Возврат ФоновыеЗадания.Выполнить("СтандартныеПодсистемыСервер.ПередЗапускомФоновогоЗаданияСКонтекстомКлиента", - ПараметрыПроцедурыФоновогоЗадания, Ключ, Наименование); - -КонецФункции - -// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации. -// При включении профилей безопасности для вызова оператора Выполнить() используется -// переход в безопасный режим с профилем безопасности, используемом для информационной базы -// (если выше по стеку не был установлен другой безопасный режим). -// -// Параметры: -// ИмяМетода - Строка - имя экспортной процедуры в формате -// <имя объекта>.<имя процедуры>, где <имя объекта> - это -// общий модуль или модуль менеджера объекта. -// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры> -// в порядке расположения элементов массива. -// -// Пример: -// Параметры = Новый Массив(); -// Параметры.Добавить("1"); -// РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации("МойОбщийМодуль.МояПроцедура", Параметры); -// -Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт - - Попытка - ПроверитьИмяМетодаКонфигурации(ИмяМетода); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ВызватьИсключение НСтр("ru = 'Ошибка при вызове процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме.'") - + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - КонецПопытки; - - ПараметрыСтрока = ""; - Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда - Для Индекс = 0 По Параметры.ВГраница() Цикл - ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; - КонецЦикла; - ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); - КонецЕсли; - - Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")"; - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Устанавливает размер шрифта заголовков групп формы для их корректного отображения в интерфейсе 8.2. -// -// Параметры: -// Форма - УправляемаяФорма - Форма для изменения шрифта заголовков групп; -// ИменаГрупп - Строка - Список имен групп формы, разделенных запятыми. -// -Процедура УстановитьОтображениеЗаголовковГрупп(Форма, ИменаГрупп = "") Экспорт - - Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда - ЖирныйШрифт = Новый Шрифт(,, Истина); - Если НЕ ЗначениеЗаполнено(ИменаГрупп) Тогда - Для Каждого Элемент Из Форма.Элементы Цикл - Если Тип(Элемент) = Тип("ГруппаФормы") - И Элемент.Вид = ВидГруппыФормы.ОбычнаяГруппа - И Элемент.ОтображатьЗаголовок = Истина - И (Элемент.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение - Или Элемент.Отображение = ОтображениеОбычнойГруппы.Нет) Тогда - Элемент.ШрифтЗаголовка = ЖирныйШрифт; - КонецЕсли; - КонецЦикла; - Иначе - МассивЗаголовков = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаГрупп,,, Истина); - Для Каждого ИмяЗаголовка Из МассивЗаголовков Цикл - Элемент = Форма.Элементы[ИмяЗаголовка]; - Если Элемент.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение ИЛИ Элемент.Отображение = ОтображениеОбычнойГруппы.Нет Тогда - Элемент.ШрифтЗаголовка = ЖирныйШрифт; - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ЗапуститьФоновоеЗаданиеСКонтекстомКлиента. -Процедура ПередЗапускомФоновогоЗаданияСКонтекстомКлиента(ВсеПараметры) Экспорт - - РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ВсеПараметры.ИмяМетода, ВсеПараметры.Параметры); - -КонецПроцедуры - -// Проверяет, что переданное имя является именем экспортной процедуры конфигурации. -// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма -// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить() и Вычислить() -// при их использовании для динамического вызова методов код конфигурации. -// -// В случае, если переданная строка не соответствует имени метода конфигурации - генерируется. -// -Процедура ПроверитьИмяМетодаКонфигурации(Знач ИмяМетода) Экспорт - - // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. - ЧастиИмени = СтрРазделить(ИмяМетода, "."); - Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда - ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1)'"), ИмяМетода); - КонецЕсли; - - ИмяОбъекта = ЧастиИмени[0]; - Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда - ВызватьИсключение СтрШаблон( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): - |Не найден общий модуль ""%2"".'"), - ИмяМетода, - ИмяОбъекта); - КонецЕсли; - - Если ЧастиИмени.Количество() = 3 Тогда - ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1]; - Попытка - Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта); - Исключение - Менеджер = Неопределено; - КонецПопытки; - Если Менеджер = Неопределено Тогда - ВызватьИсключение СтрШаблон( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): - |Не найден менеджер объекта ""%2"".'"), - ИмяМетода, - ПолноеИмяОбъекта); - КонецЕсли; - КонецЕсли; - - ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()]; - ВременнаяСтруктура = Новый Структура; - Попытка - // Проверка того, что ИмяМетодаОбъекта является допустимым идентификатором. - // Например: МояПроцедура - ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение СтрШаблон( - НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): - |Имя метода ""%2"" не соответствует требованиям образования имен процедур и функций.'"), - ИмяМетода, - ИмяМетодаОбъекта); - КонецПопытки; - -КонецПроцедуры - - -// Возвращает менеджер объекта по имени. -// Ограничение: не обрабатываются точки маршрутов бизнес-процессов. -// -// Параметры: -// Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации". -// -// Возвращаемое значение: -// СправочникиМенеджер, СправочникМенеджер, ДокументыМенеджер, ДокументМенеджер, ... -// -Функция МенеджерОбъектаПоИмени(Имя) - Перем КлассОМ, ИмяОМ, Менеджер; - - ЧастиИмени = СтрРазделить(Имя, "."); - - Если ЧастиИмени.Количество() > 0 Тогда - КлассОМ = ВРег(ЧастиИмени[0]); - КонецЕсли; - - Если ЧастиИмени.Количество() > 1 Тогда - ИмяОМ = ЧастиИмени[1]; - КонецЕсли; - - Если КлассОМ = "ПЛАНОБМЕНА" - Или КлассОМ = "ПЛАНЫОБМЕНА" Тогда - Менеджер = ПланыОбмена; - - ИначеЕсли КлассОМ = "СПРАВОЧНИК" - Или КлассОМ = "СПРАВОЧНИКИ" Тогда - Менеджер = Справочники; - - ИначеЕсли КлассОМ = "ДОКУМЕНТ" - Или КлассОМ = "ДОКУМЕНТЫ" Тогда - Менеджер = Документы; - - ИначеЕсли КлассОМ = "ЖУРНАЛДОКУМЕНТОВ" - Или КлассОМ = "ЖУРНАЛЫДОКУМЕНТОВ" Тогда - Менеджер = ЖурналыДокументов; - - ИначеЕсли КлассОМ = "ПЕРЕЧИСЛЕНИЕ" - Или КлассОМ = "ПЕРЕЧИСЛЕНИЯ" Тогда - Менеджер = Перечисления; - - ИначеЕсли КлассОМ = "ОТЧЕТ" - Или КлассОМ = "ОТЧЕТЫ" Тогда - Менеджер = Отчеты; - - ИначеЕсли КлассОМ = "ОБРАБОТКА" - Или КлассОМ = "ОБРАБОТКИ" Тогда - Менеджер = Обработки; - - ИначеЕсли КлассОМ = "ПЛАНВИДОВХАРАКТЕРИСТИК" - Или КлассОМ = "ПЛАНЫВИДОВХАРАКТЕРИСТИК" Тогда - Менеджер = ПланыВидовХарактеристик; - - ИначеЕсли КлассОМ = "ПЛАНСЧЕТОВ" - Или КлассОМ = "ПЛАНЫСЧЕТОВ" Тогда - Менеджер = ПланыСчетов; - - ИначеЕсли КлассОМ = "ПЛАНВИДОВРАСЧЕТА" - Или КлассОМ = "ПЛАНЫВИДОВРАСЧЕТА" Тогда - Менеджер = ПланыВидовРасчета; - - ИначеЕсли КлассОМ = "РЕГИСТРСВЕДЕНИЙ" - Или КлассОМ = "РЕГИСТРЫСВЕДЕНИЙ" Тогда - Менеджер = РегистрыСведений; - - ИначеЕсли КлассОМ = "РЕГИСТРНАКОПЛЕНИЯ" - Или КлассОМ = "РЕГИСТРЫНАКОПЛЕНИЯ" Тогда - Менеджер = РегистрыНакопления; - - ИначеЕсли КлассОМ = "РЕГИСТРБУХГАЛТЕРИИ" - Или КлассОМ = "РЕГИСТРЫБУХГАЛТЕРИИ" Тогда - Менеджер = РегистрыБухгалтерии; - - ИначеЕсли КлассОМ = "РЕГИСТРРАСЧЕТА" - Или КлассОМ = "РЕГИСТРЫРАСЧЕТА" Тогда - - Если ЧастиИмени.Количество() < 3 Тогда - // Регистр расчета - Менеджер = РегистрыРасчета; - Иначе - КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]); - Если ЧастиИмени.Количество() > 3 Тогда - ИмяПодчиненногоОМ = ЧастиИмени[3]; - КонецЕсли; - Если КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТ" - Или КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТЫ" Тогда - // Перерасчет - Попытка - Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; - ИмяОМ = ИмяПодчиненногоОМ; - Исключение - Менеджер = Неопределено; - КонецПопытки; - КонецЕсли; - КонецЕсли; - - ИначеЕсли КлассОМ = "БИЗНЕСПРОЦЕСС" - Или КлассОМ = "БИЗНЕСПРОЦЕССЫ" Тогда - Менеджер = БизнесПроцессы; - - ИначеЕсли КлассОМ = "ЗАДАЧА" - Или КлассОМ = "ЗАДАЧИ" Тогда - Менеджер = Задачи; - - ИначеЕсли КлассОМ = "КОНСТАНТА" - Или КлассОМ = "КОНСТАНТЫ" Тогда - Менеджер = Константы; - - ИначеЕсли КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТЬ" - Или КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТИ" Тогда - Менеджер = Последовательности; - КонецЕсли; - - Если Менеджер <> Неопределено Тогда - Если ЗначениеЗаполнено(ИмяОМ) Тогда - Попытка - Возврат Менеджер[ИмяОМ]; - Исключение - Менеджер = Неопределено; - КонецПопытки; - Иначе - Возврат Менеджер; - КонецЕсли; - КонецЕсли; - - ВызватьИсключение СтрШаблон(НСтр("ru = 'Не удалось получить менеджер для объекта ""%1""'"), Имя); - -КонецФункции - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// +//////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Запуск фонового задания с контекстом клиента. Например, передаются ПараметрыКлиентаНаСервере. +// Запуск выполняется с помощью процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме. +// +// Параметры: +// ИмяМетода - Строка - как в функции Выполнить менеджера фоновых заданий. +// Параметры - Массив - как в функции Выполнить менеджера фоновых заданий. +// Ключ - Строка - как в функции Выполнить менеджера фоновых заданий. +// Наименование - Строка - как в функции Выполнить менеджера фоновых заданий. +// +// Возвращаемое значение: +// ФоновоеЗадание. +// +Функция ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяМетода, Параметры = Неопределено, Ключ = "", Наименование = "") Экспорт + + Если ТекущийРежимЗапуска() = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Запуск фонового задания с контекстом клиента возможен только при наличии клиента.'"); + КонецЕсли; + + ВсеПараметры = Новый Структура; + ВсеПараметры.Вставить("ИмяМетода", ИмяМетода); + ВсеПараметры.Вставить("Параметры", Параметры); + + ПараметрыПроцедурыФоновогоЗадания = Новый Массив; + ПараметрыПроцедурыФоновогоЗадания.Добавить(ВсеПараметры); + + Возврат ФоновыеЗадания.Выполнить("СтандартныеПодсистемыСервер.ПередЗапускомФоновогоЗаданияСКонтекстомКлиента", + ПараметрыПроцедурыФоновогоЗадания, Ключ, Наименование); + +КонецФункции + +// Выполнить экспортную процедуру по имени с уровнем привилегий конфигурации. +// При включении профилей безопасности для вызова оператора Выполнить() используется +// переход в безопасный режим с профилем безопасности, используемом для информационной базы +// (если выше по стеку не был установлен другой безопасный режим). +// +// Параметры: +// ИмяМетода - Строка - имя экспортной процедуры в формате +// <имя объекта>.<имя процедуры>, где <имя объекта> - это +// общий модуль или модуль менеджера объекта. +// Параметры - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры> +// в порядке расположения элементов массива. +// +// Пример: +// Параметры = Новый Массив(); +// Параметры.Добавить("1"); +// РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации("МойОбщийМодуль.МояПроцедура", Параметры); +// +Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт + + Попытка + ПроверитьИмяМетодаКонфигурации(ИмяМетода); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ВызватьИсключение НСтр("ru = 'Ошибка при вызове процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме.'") + + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + + ПараметрыСтрока = ""; + Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда + Для Индекс = 0 По Параметры.ВГраница() Цикл + ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],"; + КонецЦикла; + ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1); + КонецЕсли; + + Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")"; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Устанавливает размер шрифта заголовков групп формы для их корректного отображения в интерфейсе 8.2. +// +// Параметры: +// Форма - УправляемаяФорма - Форма для изменения шрифта заголовков групп; +// ИменаГрупп - Строка - Список имен групп формы, разделенных запятыми. +// +Процедура УстановитьОтображениеЗаголовковГрупп(Форма, ИменаГрупп = "") Экспорт + + Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда + ЖирныйШрифт = Новый Шрифт(,, Истина); + Если НЕ ЗначениеЗаполнено(ИменаГрупп) Тогда + Для Каждого Элемент Из Форма.Элементы Цикл + Если Тип(Элемент) = Тип("ГруппаФормы") + И Элемент.Вид = ВидГруппыФормы.ОбычнаяГруппа + И Элемент.ОтображатьЗаголовок = Истина + И (Элемент.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение + Или Элемент.Отображение = ОтображениеОбычнойГруппы.Нет) Тогда + Элемент.ШрифтЗаголовка = ЖирныйШрифт; + КонецЕсли; + КонецЦикла; + Иначе + МассивЗаголовков = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаГрупп,,, Истина); + Для Каждого ИмяЗаголовка Из МассивЗаголовков Цикл + Элемент = Форма.Элементы[ИмяЗаголовка]; + Если Элемент.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение ИЛИ Элемент.Отображение = ОтображениеОбычнойГруппы.Нет Тогда + Элемент.ШрифтЗаголовка = ЖирныйШрифт; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЗапуститьФоновоеЗаданиеСКонтекстомКлиента. +Процедура ПередЗапускомФоновогоЗаданияСКонтекстомКлиента(ВсеПараметры) Экспорт + + РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ВсеПараметры.ИмяМетода, ВсеПараметры.Параметры); + +КонецПроцедуры + +// Проверяет, что переданное имя является именем экспортной процедуры конфигурации. +// Может использоваться для проверки, что переданная строка не содержит произвольного алгоритма +// на встроенном языке 1С:Предприятия перед использованием его в операторах Выполнить() и Вычислить() +// при их использовании для динамического вызова методов код конфигурации. +// +// В случае, если переданная строка не соответствует имени метода конфигурации - генерируется. +// +Процедура ПроверитьИмяМетодаКонфигурации(Знач ИмяМетода) Экспорт + + // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. + ЧастиИмени = СтрРазделить(ИмяМетода, "."); + Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда + ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1)'"), ИмяМетода); + КонецЕсли; + + ИмяОбъекта = ЧастиИмени[0]; + Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда + ВызватьИсключение СтрШаблон( + НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): + |Не найден общий модуль ""%2"".'"), + ИмяМетода, + ИмяОбъекта); + КонецЕсли; + + Если ЧастиИмени.Количество() = 3 Тогда + ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1]; + Попытка + Менеджер = МенеджерОбъектаПоИмени(ПолноеИмяОбъекта); + Исключение + Менеджер = Неопределено; + КонецПопытки; + Если Менеджер = Неопределено Тогда + ВызватьИсключение СтрШаблон( + НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): + |Не найден менеджер объекта ""%2"".'"), + ИмяМетода, + ПолноеИмяОбъекта); + КонецЕсли; + КонецЕсли; + + ИмяМетодаОбъекта = ЧастиИмени[ЧастиИмени.ВГраница()]; + ВременнаяСтруктура = Новый Структура; + Попытка + // Проверка того, что ИмяМетодаОбъекта является допустимым идентификатором. + // Например: МояПроцедура + ВременнаяСтруктура.Вставить(ИмяМетодаОбъекта); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение СтрШаблон( + НСтр("ru = 'Неправильный формат параметра ИмяМетода (%1): + |Имя метода ""%2"" не соответствует требованиям образования имен процедур и функций.'"), + ИмяМетода, + ИмяМетодаОбъекта); + КонецПопытки; + +КонецПроцедуры + + +// Возвращает менеджер объекта по имени. +// Ограничение: не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации". +// +// Возвращаемое значение: +// СправочникиМенеджер, СправочникМенеджер, ДокументыМенеджер, ДокументМенеджер, ... +// +Функция МенеджерОбъектаПоИмени(Имя) + Перем КлассОМ, ИмяОМ, Менеджер; + + ЧастиИмени = СтрРазделить(Имя, "."); + + Если ЧастиИмени.Количество() > 0 Тогда + КлассОМ = ВРег(ЧастиИмени[0]); + КонецЕсли; + + Если ЧастиИмени.Количество() > 1 Тогда + ИмяОМ = ЧастиИмени[1]; + КонецЕсли; + + Если КлассОМ = "ПЛАНОБМЕНА" + Или КлассОМ = "ПЛАНЫОБМЕНА" Тогда + Менеджер = ПланыОбмена; + + ИначеЕсли КлассОМ = "СПРАВОЧНИК" + Или КлассОМ = "СПРАВОЧНИКИ" Тогда + Менеджер = Справочники; + + ИначеЕсли КлассОМ = "ДОКУМЕНТ" + Или КлассОМ = "ДОКУМЕНТЫ" Тогда + Менеджер = Документы; + + ИначеЕсли КлассОМ = "ЖУРНАЛДОКУМЕНТОВ" + Или КлассОМ = "ЖУРНАЛЫДОКУМЕНТОВ" Тогда + Менеджер = ЖурналыДокументов; + + ИначеЕсли КлассОМ = "ПЕРЕЧИСЛЕНИЕ" + Или КлассОМ = "ПЕРЕЧИСЛЕНИЯ" Тогда + Менеджер = Перечисления; + + ИначеЕсли КлассОМ = "ОТЧЕТ" + Или КлассОМ = "ОТЧЕТЫ" Тогда + Менеджер = Отчеты; + + ИначеЕсли КлассОМ = "ОБРАБОТКА" + Или КлассОМ = "ОБРАБОТКИ" Тогда + Менеджер = Обработки; + + ИначеЕсли КлассОМ = "ПЛАНВИДОВХАРАКТЕРИСТИК" + Или КлассОМ = "ПЛАНЫВИДОВХАРАКТЕРИСТИК" Тогда + Менеджер = ПланыВидовХарактеристик; + + ИначеЕсли КлассОМ = "ПЛАНСЧЕТОВ" + Или КлассОМ = "ПЛАНЫСЧЕТОВ" Тогда + Менеджер = ПланыСчетов; + + ИначеЕсли КлассОМ = "ПЛАНВИДОВРАСЧЕТА" + Или КлассОМ = "ПЛАНЫВИДОВРАСЧЕТА" Тогда + Менеджер = ПланыВидовРасчета; + + ИначеЕсли КлассОМ = "РЕГИСТРСВЕДЕНИЙ" + Или КлассОМ = "РЕГИСТРЫСВЕДЕНИЙ" Тогда + Менеджер = РегистрыСведений; + + ИначеЕсли КлассОМ = "РЕГИСТРНАКОПЛЕНИЯ" + Или КлассОМ = "РЕГИСТРЫНАКОПЛЕНИЯ" Тогда + Менеджер = РегистрыНакопления; + + ИначеЕсли КлассОМ = "РЕГИСТРБУХГАЛТЕРИИ" + Или КлассОМ = "РЕГИСТРЫБУХГАЛТЕРИИ" Тогда + Менеджер = РегистрыБухгалтерии; + + ИначеЕсли КлассОМ = "РЕГИСТРРАСЧЕТА" + Или КлассОМ = "РЕГИСТРЫРАСЧЕТА" Тогда + + Если ЧастиИмени.Количество() < 3 Тогда + // Регистр расчета + Менеджер = РегистрыРасчета; + Иначе + КлассПодчиненногоОМ = ВРег(ЧастиИмени[2]); + Если ЧастиИмени.Количество() > 3 Тогда + ИмяПодчиненногоОМ = ЧастиИмени[3]; + КонецЕсли; + Если КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТ" + Или КлассПодчиненногоОМ = "ПЕРЕРАСЧЕТЫ" Тогда + // Перерасчет + Попытка + Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; + ИмяОМ = ИмяПодчиненногоОМ; + Исключение + Менеджер = Неопределено; + КонецПопытки; + КонецЕсли; + КонецЕсли; + + ИначеЕсли КлассОМ = "БИЗНЕСПРОЦЕСС" + Или КлассОМ = "БИЗНЕСПРОЦЕССЫ" Тогда + Менеджер = БизнесПроцессы; + + ИначеЕсли КлассОМ = "ЗАДАЧА" + Или КлассОМ = "ЗАДАЧИ" Тогда + Менеджер = Задачи; + + ИначеЕсли КлассОМ = "КОНСТАНТА" + Или КлассОМ = "КОНСТАНТЫ" Тогда + Менеджер = Константы; + + ИначеЕсли КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТЬ" + Или КлассОМ = "ПОСЛЕДОВАТЕЛЬНОСТИ" Тогда + Менеджер = Последовательности; + КонецЕсли; + + Если Менеджер <> Неопределено Тогда + Если ЗначениеЗаполнено(ИмяОМ) Тогда + Попытка + Возврат Менеджер[ИмяОМ]; + Исключение + Менеджер = Неопределено; + КонецПопытки; + Иначе + Возврат Менеджер; + КонецЕсли; + КонецЕсли; + + ВызватьИсключение СтрШаблон(НСтр("ru = 'Не удалось получить менеджер для объекта ""%1""'"), Имя); + +КонецФункции + +#КонецОбласти diff --git a/GitConverter/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/GitConverter/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl index 469c12d..9c698a7 100644 --- a/GitConverter/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl +++ b/GitConverter/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -1,211 +1,219 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// -//////////////////////////////////////////////////////////////////////////////// - -#Область ПрограммныйИнтерфейс - - -// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину. -// -// Параметры: -// Строка - Строка - текст с разделителями; -// Разделитель - Строка - разделитель строк текста, минимум 1 символ; -// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. -// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: -// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки -// включаются в результат. -// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в -// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а -// при других разделителях результатом функции будет пустой массив. -// СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок. -// -// Возвращаемое значение: -// Массив - массив строк. -// -// Примеры: -// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые -// строки; -// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов; -// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов; -// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив; -// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой); -// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой); -// -// Примечание: -// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы, -// рекомендуется использовать функцию платформы СтрРазделить. -Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт - - Результат = Новый Массив; - - // Для обеспечения обратной совместимости. - Если ПропускатьПустыеСтроки = Неопределено Тогда - ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); - Если ПустаяСтрока(Строка) Тогда - Если Разделитель = " " Тогда - Результат.Добавить(""); - КонецЕсли; - Возврат Результат; - КонецЕсли; - КонецЕсли; - // - - Позиция = СтрНайти(Строка, Разделитель); - Пока Позиция > 0 Цикл - Подстрока = Лев(Строка, Позиция - 1); - Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда - Если СокращатьНепечатаемыеСимволы Тогда - Результат.Добавить(СокрЛП(Подстрока)); - Иначе - Результат.Добавить(Подстрока); - КонецЕсли; - КонецЕсли; - Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); - Позиция = СтрНайти(Строка, Разделитель); - КонецЦикла; - - Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда - Если СокращатьНепечатаемыеСимволы Тогда - Результат.Добавить(СокрЛП(Строка)); - Иначе - Результат.Добавить(Строка); - КонецЕсли; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Проверяет, является ли строка уникальным идентификатором. -// В качестве уникального идентификатора предполагается строка вида -// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f]. -// -// Параметры: -// Строка - Строка - проверяемая строка. -// -// Возвращаемое значение: -// Булево - Истина, если переданная строка является уникальным идентификатором. -Функция ЭтоУникальныйИдентификатор(Знач Строка) Экспорт - - Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; - - Если СтрДлина(Шаблон) <> СтрДлина(Строка) Тогда - Возврат Ложь; - КонецЕсли; - Для Позиция = 1 По СтрДлина(Строка) Цикл - Если КодСимвола(Шаблон, Позиция) = 88 // X - И ((КодСимвола(Строка, Позиция) < 48 Или КодСимвола(Строка, Позиция) > 57) // 0..9 - И (КодСимвола(Строка, Позиция) < 97 Или КодСимвола(Строка, Позиция) > 102) // a..f - И (КодСимвола(Строка, Позиция) < 65 Или КодСимвола(Строка, Позиция) > 70)) // A..F - Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Строка, Позиция) <> 45 Тогда // - - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - Возврат Истина; - -КонецФункции - -// Подставляет параметры в строку. Максимально возможное число параметров - 9. -// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. -// -// Параметры: -// СтрокаПодстановки - Строка - шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"); -// Параметр - Строка - подставляемый параметр. -// -// Возвращаемое значение: -// Строка - текстовая строка с подставленными параметрами. -// -// Пример: -// ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк". -// -// Примечание: -// В случаях, когда число используемых параметров в строке совпадает с числом переданных для подстановки параметров, -// рекомендуется использовать функцию платформы СтрШаблон. -Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, - Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, - Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, - Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт - - ИспользоватьАльтернативныйАлгоритм = - СтрНайти(Параметр1, "%") - Или СтрНайти(Параметр2, "%") - Или СтрНайти(Параметр3, "%") - Или СтрНайти(Параметр4, "%") - Или СтрНайти(Параметр5, "%") - Или СтрНайти(Параметр6, "%") - Или СтрНайти(Параметр7, "%") - Или СтрНайти(Параметр8, "%") - Или СтрНайти(Параметр9, "%"); - - Если ИспользоватьАльтернативныйАлгоритм Тогда - СтрокаПодстановки = ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(СтрокаПодстановки, Параметр1, - Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); - Иначе - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8); - СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9); - КонецЕсли; - - Возврат СтрокаПодстановки; -КонецФункции - -#КонецОбласти - - -#Область СлужебныеПроцедурыИФункции - - -// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. -Функция ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(Знач СтрокаПодстановки, - Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, - Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, - Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) - - Результат = ""; - Позиция = СтрНайти(СтрокаПодстановки, "%"); - Пока Позиция > 0 Цикл - Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); - СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); - ПодставляемыйПараметр = ""; - Если СимволПослеПроцента = "1" Тогда - ПодставляемыйПараметр = Параметр1; - ИначеЕсли СимволПослеПроцента = "2" Тогда - ПодставляемыйПараметр = Параметр2; - ИначеЕсли СимволПослеПроцента = "3" Тогда - ПодставляемыйПараметр = Параметр3; - ИначеЕсли СимволПослеПроцента = "4" Тогда - ПодставляемыйПараметр = Параметр4; - ИначеЕсли СимволПослеПроцента = "5" Тогда - ПодставляемыйПараметр = Параметр5; - ИначеЕсли СимволПослеПроцента = "6" Тогда - ПодставляемыйПараметр = Параметр6; - ИначеЕсли СимволПослеПроцента = "7" Тогда - ПодставляемыйПараметр = Параметр7 - ИначеЕсли СимволПослеПроцента = "8" Тогда - ПодставляемыйПараметр = Параметр8; - ИначеЕсли СимволПослеПроцента = "9" Тогда - ПодставляемыйПараметр = Параметр9; - КонецЕсли; - Если ПодставляемыйПараметр = "" Тогда - Результат = Результат + "%"; - СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); - Иначе - Результат = Результат + ПодставляемыйПараметр; - СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); - КонецЕсли; - Позиция = СтрНайти(СтрокаПодстановки, "%"); - КонецЦикла; - Результат = Результат + СтрокаПодстановки; - - Возврат Результат; -КонецФункции - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + + +// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину. +// +// Параметры: +// Строка - Строка - текст с разделителями; +// Разделитель - Строка - разделитель строк текста, минимум 1 символ; +// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. +// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: +// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки +// включаются в результат. +// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в +// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а +// при других разделителях результатом функции будет пустой массив. +// СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок. +// +// Возвращаемое значение: +// Массив - массив строк. +// +// Примеры: +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые +// строки; +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив; +// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой); +// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой); +// +// Примечание: +// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы, +// рекомендуется использовать функцию платформы СтрРазделить. +Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт + + Результат = Новый Массив; + + // Для обеспечения обратной совместимости. + Если ПропускатьПустыеСтроки = Неопределено Тогда + ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); + Если ПустаяСтрока(Строка) Тогда + Если Разделитель = " " Тогда + Результат.Добавить(""); + КонецЕсли; + Возврат Результат; + КонецЕсли; + КонецЕсли; + // + + Позиция = СтрНайти(Строка, Разделитель); + Пока Позиция > 0 Цикл + Подстрока = Лев(Строка, Позиция - 1); + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда + Если СокращатьНепечатаемыеСимволы Тогда + Результат.Добавить(СокрЛП(Подстрока)); + Иначе + Результат.Добавить(Подстрока); + КонецЕсли; + КонецЕсли; + Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); + Позиция = СтрНайти(Строка, Разделитель); + КонецЦикла; + + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда + Если СокращатьНепечатаемыеСимволы Тогда + Результат.Добавить(СокрЛП(Строка)); + Иначе + Результат.Добавить(Строка); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Проверяет, является ли строка уникальным идентификатором. +// В качестве уникального идентификатора предполагается строка вида +// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f]. +// +// Параметры: +// Строка - Строка - проверяемая строка. +// +// Возвращаемое значение: +// Булево - Истина, если переданная строка является уникальным идентификатором. +Функция ЭтоУникальныйИдентификатор(Знач Строка) Экспорт + + Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; + + Если СтрДлина(Шаблон) <> СтрДлина(Строка) Тогда + Возврат Ложь; + КонецЕсли; + Для Позиция = 1 По СтрДлина(Строка) Цикл + Если КодСимвола(Шаблон, Позиция) = 88 // X + И ((КодСимвола(Строка, Позиция) < 48 Или КодСимвола(Строка, Позиция) > 57) // 0..9 + И (КодСимвола(Строка, Позиция) < 97 Или КодСимвола(Строка, Позиция) > 102) // a..f + И (КодСимвола(Строка, Позиция) < 65 Или КодСимвола(Строка, Позиция) > 70)) // A..F + Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Строка, Позиция) <> 45 Тогда // - + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +// Подставляет параметры в строку. Максимально возможное число параметров - 9. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. +// +// Параметры: +// СтрокаПодстановки - Строка - шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"); +// Параметр - Строка - подставляемый параметр. +// +// Возвращаемое значение: +// Строка - текстовая строка с подставленными параметрами. +// +// Пример: +// ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк". +// +// Примечание: +// В случаях, когда число используемых параметров в строке совпадает с числом переданных для подстановки параметров, +// рекомендуется использовать функцию платформы СтрШаблон. +Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт + + ИспользоватьАльтернативныйАлгоритм = + СтрНайти(Параметр1, "%") + Или СтрНайти(Параметр2, "%") + Или СтрНайти(Параметр3, "%") + Или СтрНайти(Параметр4, "%") + Или СтрНайти(Параметр5, "%") + Или СтрНайти(Параметр6, "%") + Или СтрНайти(Параметр7, "%") + Или СтрНайти(Параметр8, "%") + Или СтрНайти(Параметр9, "%"); + + Если ИспользоватьАльтернативныйАлгоритм Тогда + СтрокаПодстановки = ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(СтрокаПодстановки, Параметр1, + Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); + Иначе + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9); + КонецЕсли; + + Возврат СтрокаПодстановки; +КонецФункции + +#КонецОбласти + + +#Область СлужебныеПроцедурыИФункции + + +// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. +Функция ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) + + Результат = ""; + Позиция = СтрНайти(СтрокаПодстановки, "%"); + Пока Позиция > 0 Цикл + Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); + СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); + ПодставляемыйПараметр = ""; + Если СимволПослеПроцента = "1" Тогда + ПодставляемыйПараметр = Параметр1; + ИначеЕсли СимволПослеПроцента = "2" Тогда + ПодставляемыйПараметр = Параметр2; + ИначеЕсли СимволПослеПроцента = "3" Тогда + ПодставляемыйПараметр = Параметр3; + ИначеЕсли СимволПослеПроцента = "4" Тогда + ПодставляемыйПараметр = Параметр4; + ИначеЕсли СимволПослеПроцента = "5" Тогда + ПодставляемыйПараметр = Параметр5; + ИначеЕсли СимволПослеПроцента = "6" Тогда + ПодставляемыйПараметр = Параметр6; + ИначеЕсли СимволПослеПроцента = "7" Тогда + ПодставляемыйПараметр = Параметр7 + ИначеЕсли СимволПослеПроцента = "8" Тогда + ПодставляемыйПараметр = Параметр8; + ИначеЕсли СимволПослеПроцента = "9" Тогда + ПодставляемыйПараметр = Параметр9; + КонецЕсли; + Если ПодставляемыйПараметр = "" Тогда + Результат = Результат + "%"; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); + Иначе + Результат = Результат + ПодставляемыйПараметр; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); + КонецЕсли; + Позиция = СтрНайти(СтрокаПодстановки, "%"); + КонецЦикла; + Результат = Результат + СтрокаПодстановки; + + Возврат Результат; +КонецФункции + +#КонецОбласти diff --git a/GitConverter/src/Configuration/Configuration.mdo b/GitConverter/src/Configuration/Configuration.mdo index 56b04c6..fe33522 100644 --- a/GitConverter/src/Configuration/Configuration.mdo +++ b/GitConverter/src/Configuration/Configuration.mdo @@ -40,7 +40,7 @@ ru - Copyright © ООО "1С-Софт" + Copyright © ООО "1С-Софт", Все права защищены. Эта программа и сопроводительные материалы предоставляются в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) Текст лицензии доступен по ссылке: https://creativecommons.org/licenses/by-sa/4.0/legalcode ru diff --git a/GitConverter/src/Configuration/ManagedApplicationModule.bsl b/GitConverter/src/Configuration/ManagedApplicationModule.bsl index 352d37b..25770a5 100644 --- a/GitConverter/src/Configuration/ManagedApplicationModule.bsl +++ b/GitConverter/src/Configuration/ManagedApplicationModule.bsl @@ -1,36 +1,44 @@ -#Область ОписаниеПеременных - -// СтандартныеПодсистемы - -// Хранилище глобальных переменных. -// -// ПараметрыПриложения - Соответствие - хранилище переменных, где: -// * Ключ - Строка - имя переменной в формате "ИмяБиблиотеки.ИмяПеременной"; -// * Значение - Произвольный - значение переменной. -// -// Инициализация (на примере СообщенияДляЖурналаРегистрации): -// ИмяПараметра = "СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"; -// Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда -// ПараметрыПриложения.Вставить(ИмяПараметра, Новый СписокЗначений); -// КонецЕсли; -// -// Использование (на примере СообщенияДляЖурналаРегистрации): -// ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"].Добавить(...); -// ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"] = ...; -Перем ПараметрыПриложения Экспорт; - -// Конец СтандартныеПодсистемы - -#КонецОбласти - -#Область ОбработчикиСобытий - -Процедура ПередНачаломРаботыСистемы(Отказ) - - Если ПараметрыПриложения = Неопределено Тогда - ПараметрыПриложения = Новый Соответствие; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +// СтандартныеПодсистемы + +// Хранилище глобальных переменных. +// +// ПараметрыПриложения - Соответствие - хранилище переменных, где: +// * Ключ - Строка - имя переменной в формате "ИмяБиблиотеки.ИмяПеременной"; +// * Значение - Произвольный - значение переменной. +// +// Инициализация (на примере СообщенияДляЖурналаРегистрации): +// ИмяПараметра = "СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"; +// Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда +// ПараметрыПриложения.Вставить(ИмяПараметра, Новый СписокЗначений); +// КонецЕсли; +// +// Использование (на примере СообщенияДляЖурналаРегистрации): +// ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"].Добавить(...); +// ПараметрыПриложения["СтандартныеПодсистемы.СообщенияДляЖурналаРегистрации"] = ...; +Перем ПараметрыПриложения Экспорт; + +// Конец СтандартныеПодсистемы + +#КонецОбласти + +#Область ОбработчикиСобытий + +Процедура ПередНачаломРаботыСистемы(Отказ) + + Если ПараметрыПриложения = Неопределено Тогда + ПараметрыПриложения = Новый Соответствие; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/GitConverter/src/Constants/ПутьКВерсиямПлатформыНаСервере/ValueManagerModule.bsl b/GitConverter/src/Constants/ПутьКВерсиямПлатформыНаСервере/ValueManagerModule.bsl index 399d16c..72c3252 100644 --- a/GitConverter/src/Constants/ПутьКВерсиямПлатформыНаСервере/ValueManagerModule.bsl +++ b/GitConverter/src/Constants/ПутьКВерсиямПлатформыНаСервере/ValueManagerModule.bsl @@ -1,3 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда #Область ОбработчикиСобытий diff --git a/GitConverter/src/DataProcessors/КонвертацияВФорматEDT/Forms/Форма/Module.bsl b/GitConverter/src/DataProcessors/КонвертацияВФорматEDT/Forms/Форма/Module.bsl index 764eecf..8cdeba4 100644 --- a/GitConverter/src/DataProcessors/КонвертацияВФорматEDT/Forms/Форма/Module.bsl +++ b/GitConverter/src/DataProcessors/КонвертацияВФорматEDT/Forms/Форма/Module.bsl @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// #Область ОбработчикиСобытийФормы diff --git a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Commands/РегламентныеИФоновыеЗадания/CommandModule.bsl b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Commands/РегламентныеИФоновыеЗадания/CommandModule.bsl index b87991b..362545b 100644 --- a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Commands/РегламентныеИФоновыеЗадания/CommandModule.bsl +++ b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Commands/РегламентныеИФоновыеЗадания/CommandModule.bsl @@ -1,14 +1,22 @@ -#Область ОбработчикиСобытий - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма", - , - ПараметрыВыполненияКоманды.Источник, - ПараметрыВыполненияКоманды.Уникальность, - ПараметрыВыполненияКоманды.Окно); - -КонецПроцедуры - +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма", + , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl index 67e7b5c..edfb133 100644 --- a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl +++ b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентноеЗадание/Module.bsl @@ -1,254 +1,261 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Действие = Параметры.Действие; - - Если СтрНайти(", Добавить, Скопировать, Изменить,", ", " + Действие + ",") = 0 Тогда - - ВызватьИсключение НСтр("ru = 'Неверные параметры открытия формы ""Регламентное задание"".'"); - КонецЕсли; - - Если Действие = "Добавить" Тогда - - Расписание = Новый РасписаниеРегламентногоЗадания; - - Для каждого РегламентноеЗаданиеМетаданные Из Метаданные.РегламентныеЗадания Цикл - ОписанияМетаданныхРегламентныхЗаданий.Добавить( - РегламентноеЗаданиеМетаданные.Имя - + Символы.ПС - + РегламентноеЗаданиеМетаданные.Синоним - + Символы.ПС - + РегламентноеЗаданиеМетаданные.ИмяМетода, - ?(ПустаяСтрока(РегламентноеЗаданиеМетаданные.Синоним), - РегламентноеЗаданиеМетаданные.Имя, - РегламентноеЗаданиеМетаданные.Синоним) ); - КонецЦикла; - Иначе - Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Параметры.Идентификатор); - ЗаполнитьЗначенияСвойств( - ЭтотОбъект, - Задание, - "Ключ, - |Предопределенное, - |Использование, - |Наименование, - |ИмяПользователя, - |ИнтервалПовтораПриАварийномЗавершении, - |КоличествоПовторовПриАварийномЗавершении"); - - Идентификатор = Строка(Задание.УникальныйИдентификатор); - Если Задание.Метаданные = Неопределено Тогда - ИмяМетаданных = НСтр("ru = '<нет метаданных>'"); - СинонимМетаданных = НСтр("ru = '<нет метаданных>'"); - ИмяМетодаМетаданных = НСтр("ru = '<нет метаданных>'"); - Иначе - ИмяМетаданных = Задание.Метаданные.Имя; - СинонимМетаданных = Задание.Метаданные.Синоним; - ИмяМетодаМетаданных = Задание.Метаданные.ИмяМетода; - КонецЕсли; - Расписание = Задание.Расписание; - - СообщенияПользователюИОписаниеИнформацииОбОшибке = РегламентныеЗаданияСлужебный - .СообщенияИОписанияОшибокРегламентногоЗадания(Задание); - КонецЕсли; - - Если Действие <> "Изменить" Тогда - Идентификатор = НСтр("ru = '<будет создан при записи>'"); - Использование = Ложь; - - Наименование = ?( - Действие = "Добавить", - "", - РегламентныеЗаданияСлужебный.ПредставлениеРегламентногоЗадания(Задание)); - КонецЕсли; - - // Заполнение списка выбора имени пользователя. - МассивПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей(); - - Для каждого Пользователь Из МассивПользователей Цикл - Элементы.ИмяПользователя.СписокВыбора.Добавить(Пользователь.Имя); - КонецЦикла; - - СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - Если Действие = "Добавить" Тогда - ПодключитьОбработчикОжидания("ВыборШаблонаНовогоРегламентногоЗадания", 0.1, Истина); - Иначе - ОбновитьЗаголовокФормы(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - - Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьЗавершение", ЭтотОбъект); - ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура НаименованиеПриИзменении(Элемент) - - ОбновитьЗаголовокФормы(); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Записать(Команда) - - ЗаписатьРегламентноеЗадание(); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗаписатьИЗакрытьВыполнить() - - ЗаписатьИЗакрытьЗавершение(); - -КонецПроцедуры - -&НаКлиенте -Процедура НастроитьРасписаниеВыполнить() - - Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); - Диалог.Показать(Новый ОписаниеОповещения("ОткрытьРасписаниеЗавершение", ЭтотОбъект)); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаКлиенте -Процедура ЗаписатьИЗакрытьЗавершение(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт - - ЗаписатьРегламентноеЗадание(); - Модифицированность = Ложь; - Закрыть(); - -КонецПроцедуры - -&НаКлиенте -Процедура ВыборШаблонаНовогоРегламентногоЗадания() - - // Выбор шаблона регламентного задания (метаданные). - ОписанияМетаданныхРегламентныхЗаданий.ПоказатьВыборЭлемента( - Новый ОписаниеОповещения("ВыборШаблонаНовогоРегламентногоЗаданияЗавершение", ЭтотОбъект), - НСтр("ru = 'Выберите шаблон регламентного задания'")); - -КонецПроцедуры - -&НаКлиенте -Процедура ВыборШаблонаНовогоРегламентногоЗаданияЗавершение(ЭлементСписка, Неопределен) Экспорт - - Если ЭлементСписка = Неопределено Тогда - Закрыть(); - Возврат; - КонецЕсли; - - ИмяМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 1); - СинонимМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 2); - ИмяМетодаМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 3); - Наименование = ЭлементСписка.Представление; - - ОбновитьЗаголовокФормы(); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, Неопределен) Экспорт - - Если НовоеРасписание <> Неопределено Тогда - Расписание = НовоеРасписание; - Модифицированность = Истина; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗаписатьРегламентноеЗадание() - - Если НЕ ЗначениеЗаполнено(ИмяМетаданных) Тогда - Возврат; - КонецЕсли; - - ТекущийИдентификатор = ?(Действие = "Изменить", Идентификатор, Неопределено); - - ЗаписатьРегламентноеЗаданиеНаСервере(); - ОбновитьЗаголовокФормы(); - - Оповестить("Запись_РегламентныеЗадания", ТекущийИдентификатор); - -КонецПроцедуры - -&НаСервере -Процедура ЗаписатьРегламентноеЗаданиеНаСервере() - - Если Действие = "Изменить" Тогда - Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Идентификатор); - Иначе - Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание( - Метаданные.РегламентныеЗадания[ИмяМетаданных]); - - Идентификатор = Строка(Задание.УникальныйИдентификатор); - Действие = "Изменить"; - КонецЕсли; - - ЗаполнитьЗначенияСвойств( - Задание, - ЭтотОбъект, - "Ключ, - |Наименование, - |Использование, - |ИмяПользователя, - |ИнтервалПовтораПриАварийномЗавершении, - |КоличествоПовторовПриАварийномЗавершении"); - - Задание.Расписание = Расписание; - Задание.Записать(); - - Модифицированность = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьЗаголовокФормы() - - Если НЕ ПустаяСтрока(Наименование) Тогда - Представление = Наименование; - - ИначеЕсли НЕ ПустаяСтрока(СинонимМетаданных) Тогда - Представление = СинонимМетаданных; - Иначе - Представление = ИмяМетаданных; - КонецЕсли; - - Если Действие = "Изменить" Тогда - Заголовок = СтрШаблон(НСтр("ru = '%1 (Регламентное задание)'"), Представление); - Иначе - Заголовок = НСтр("ru = 'Регламентное задание (создание)'"); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + Действие = Параметры.Действие; + + Если СтрНайти(", Добавить, Скопировать, Изменить,", ", " + Действие + ",") = 0 Тогда + + ВызватьИсключение НСтр("ru = 'Неверные параметры открытия формы ""Регламентное задание"".'"); + КонецЕсли; + + Если Действие = "Добавить" Тогда + + Расписание = Новый РасписаниеРегламентногоЗадания; + + Для каждого РегламентноеЗаданиеМетаданные Из Метаданные.РегламентныеЗадания Цикл + ОписанияМетаданныхРегламентныхЗаданий.Добавить( + РегламентноеЗаданиеМетаданные.Имя + + Символы.ПС + + РегламентноеЗаданиеМетаданные.Синоним + + Символы.ПС + + РегламентноеЗаданиеМетаданные.ИмяМетода, + ?(ПустаяСтрока(РегламентноеЗаданиеМетаданные.Синоним), + РегламентноеЗаданиеМетаданные.Имя, + РегламентноеЗаданиеМетаданные.Синоним) ); + КонецЦикла; + Иначе + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Параметры.Идентификатор); + ЗаполнитьЗначенияСвойств( + ЭтотОбъект, + Задание, + "Ключ, + |Предопределенное, + |Использование, + |Наименование, + |ИмяПользователя, + |ИнтервалПовтораПриАварийномЗавершении, + |КоличествоПовторовПриАварийномЗавершении"); + + Идентификатор = Строка(Задание.УникальныйИдентификатор); + Если Задание.Метаданные = Неопределено Тогда + ИмяМетаданных = НСтр("ru = '<нет метаданных>'"); + СинонимМетаданных = НСтр("ru = '<нет метаданных>'"); + ИмяМетодаМетаданных = НСтр("ru = '<нет метаданных>'"); + Иначе + ИмяМетаданных = Задание.Метаданные.Имя; + СинонимМетаданных = Задание.Метаданные.Синоним; + ИмяМетодаМетаданных = Задание.Метаданные.ИмяМетода; + КонецЕсли; + Расписание = Задание.Расписание; + + СообщенияПользователюИОписаниеИнформацииОбОшибке = РегламентныеЗаданияСлужебный + .СообщенияИОписанияОшибокРегламентногоЗадания(Задание); + КонецЕсли; + + Если Действие <> "Изменить" Тогда + Идентификатор = НСтр("ru = '<будет создан при записи>'"); + Использование = Ложь; + + Наименование = ?( + Действие = "Добавить", + "", + РегламентныеЗаданияСлужебный.ПредставлениеРегламентногоЗадания(Задание)); + КонецЕсли; + + // Заполнение списка выбора имени пользователя. + МассивПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей(); + + Для каждого Пользователь Из МассивПользователей Цикл + Элементы.ИмяПользователя.СписокВыбора.Добавить(Пользователь.Имя); + КонецЦикла; + + СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если Действие = "Добавить" Тогда + ПодключитьОбработчикОжидания("ВыборШаблонаНовогоРегламентногоЗадания", 0.1, Истина); + Иначе + ОбновитьЗаголовокФормы(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьЗавершение", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура НаименованиеПриИзменении(Элемент) + + ОбновитьЗаголовокФормы(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Записать(Команда) + + ЗаписатьРегламентноеЗадание(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрытьВыполнить() + + ЗаписатьИЗакрытьЗавершение(); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьРасписаниеВыполнить() + + Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); + Диалог.Показать(Новый ОписаниеОповещения("ОткрытьРасписаниеЗавершение", ЭтотОбъект)); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗаписатьИЗакрытьЗавершение(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + ЗаписатьРегламентноеЗадание(); + Модифицированность = Ложь; + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборШаблонаНовогоРегламентногоЗадания() + + // Выбор шаблона регламентного задания (метаданные). + ОписанияМетаданныхРегламентныхЗаданий.ПоказатьВыборЭлемента( + Новый ОписаниеОповещения("ВыборШаблонаНовогоРегламентногоЗаданияЗавершение", ЭтотОбъект), + НСтр("ru = 'Выберите шаблон регламентного задания'")); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборШаблонаНовогоРегламентногоЗаданияЗавершение(ЭлементСписка, Неопределен) Экспорт + + Если ЭлементСписка = Неопределено Тогда + Закрыть(); + Возврат; + КонецЕсли; + + ИмяМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 1); + СинонимМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 2); + ИмяМетодаМетаданных = СтрПолучитьСтроку(ЭлементСписка.Значение, 3); + Наименование = ЭлементСписка.Представление; + + ОбновитьЗаголовокФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, Неопределен) Экспорт + + Если НовоеРасписание <> Неопределено Тогда + Расписание = НовоеРасписание; + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьРегламентноеЗадание() + + Если НЕ ЗначениеЗаполнено(ИмяМетаданных) Тогда + Возврат; + КонецЕсли; + + ТекущийИдентификатор = ?(Действие = "Изменить", Идентификатор, Неопределено); + + ЗаписатьРегламентноеЗаданиеНаСервере(); + ОбновитьЗаголовокФормы(); + + Оповестить("Запись_РегламентныеЗадания", ТекущийИдентификатор); + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьРегламентноеЗаданиеНаСервере() + + Если Действие = "Изменить" Тогда + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Идентификатор); + Иначе + Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание( + Метаданные.РегламентныеЗадания[ИмяМетаданных]); + + Идентификатор = Строка(Задание.УникальныйИдентификатор); + Действие = "Изменить"; + КонецЕсли; + + ЗаполнитьЗначенияСвойств( + Задание, + ЭтотОбъект, + "Ключ, + |Наименование, + |Использование, + |ИмяПользователя, + |ИнтервалПовтораПриАварийномЗавершении, + |КоличествоПовторовПриАварийномЗавершении"); + + Задание.Расписание = Расписание; + Задание.Записать(); + + Модифицированность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьЗаголовокФормы() + + Если НЕ ПустаяСтрока(Наименование) Тогда + Представление = Наименование; + + ИначеЕсли НЕ ПустаяСтрока(СинонимМетаданных) Тогда + Представление = СинонимМетаданных; + Иначе + Представление = ИмяМетаданных; + КонецЕсли; + + Если Действие = "Изменить" Тогда + Заголовок = СтрШаблон(НСтр("ru = '%1 (Регламентное задание)'"), Представление); + Иначе + Заголовок = НСтр("ru = 'Регламентное задание (создание)'"); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl index 2d77b66..c0b7a80 100644 --- a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl +++ b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РегламентныеИФоновыеЗадания/Module.bsl @@ -1,1073 +1,1081 @@ -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - УстановитьУсловноеОформление(); - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - ПустойИдентификатор = Строка(Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); - ТекстНеОпределено = РегламентныеЗаданияСлужебный.ТекстНеОпределено(); - ЭтоПодчиненныйУзелРИБ = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - Если НЕ НастройкиЗагружены Тогда - ЗаполнитьНастройкиФормы(Новый Соответствие); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - - Если ИмяСобытия = "Запись_РегламентныеЗадания" Тогда - - Если ЗначениеЗаполнено(Параметр) Тогда - ОбновитьТаблицуРегламентныхЗаданий(Параметр); - Иначе - ПодключитьОбработчикОжидания("ОтложенноеОбновлениеРегламентныхЗаданий", 0.1, Истина); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) - - ЗаполнитьНастройкиФормы(Настройки); - - НастройкиЗагружены = Истина; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии(ЗавершениеРаботы) - Если НЕ ЗавершениеРаботы И ИдентификаторЗадания <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда - ПриЗакрытииНаСервере(); - КонецЕсли; -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ЗаданияПриСменеСтраницы(Элемент, ТекущаяСтраница) - - Если ТекущаяСтраница = Элементы.ФоновыеЗадания - И Не СтраницаФоновыеЗаданияОткрывалась Тогда - - СтраницаФоновыеЗаданияОткрывалась = Истина; - ОбновитьТаблицуФоновыхЗаданийНаКлиенте(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидОтбораПоПериодуПриИзменении(Элемент) - - ТекущаяДатаСеанса = ТекущаяДатаСеансаНаСервере(); - - Элементы.ОтборПериодС.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); - Элементы.ОтборПериодПо.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); - - Если ВидОтбораПоПериоду = 0 Тогда - ОтборПериодС = '00010101'; - ОтборПериодПо = '00010101'; - Элементы.УстановкаПроизвольногоПериода.Видимость = Ложь; - ИначеЕсли ВидОтбораПоПериоду = 4 Тогда - ОтборПериодС = НачалоДня(ТекущаяДатаСеанса); - ОтборПериодПо = ОтборПериодС; - Элементы.УстановкаПроизвольногоПериода.Видимость = Истина; - Иначе - ОбновитьАвтоматическийПериод(ЭтотОбъект, ТекущаяДатаСеанса); - Элементы.УстановкаПроизвольногоПериода.Видимость = Ложь; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОтбиратьПоРегламентномуЗаданиюПриИзменении(Элемент) - - Элементы.РегламентноеЗаданиеДляОтбора.Доступность = ОтбиратьПоРегламентномуЗаданию; - -КонецПроцедуры - -&НаКлиенте -Процедура РегламентноеЗаданиеДляОтбораОчистка(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаФоновыеЗадания - -&НаКлиенте -Процедура ТаблицаФоновыеЗаданияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - ОткрытьФоновоеЗадание(); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаРегламентныеЗадания - -&НаКлиенте -Процедура ТаблицаРегламентныеЗаданияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - Если Поле = "Предопределенное" - ИЛИ Поле = "Использование" Тогда - - ДобавитьСкопироватьИзменитьРегламентноеЗадание("Изменить"); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ТаблицаРегламентныеЗаданияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - - Отказ = Истина; - - ДобавитьСкопироватьИзменитьРегламентноеЗадание(?(Копирование, "Скопировать", "Добавить")); - -КонецПроцедуры - -&НаКлиенте -Процедура ТаблицаРегламентныеЗаданияПередНачаломИзменения(Элемент, Отказ) - - Отказ = Истина; - - ДобавитьСкопироватьИзменитьРегламентноеЗадание("Изменить"); - -КонецПроцедуры - -&НаКлиенте -Процедура ТаблицаРегламентныеЗаданияПередУдалением(Элемент, Отказ) - - Отказ = Истина; - - Если Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Количество() > 1 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите одно регламентное задание.'")); - - ИначеЕсли Элемент.ТекущиеДанные.Предопределенное Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Невозможно удалить предопределенное регламентное задание.'") ); - Иначе - ПоказатьВопрос( - Новый ОписаниеОповещения("ТаблицаРегламентныеЗаданияПередУдалениемЗавершение", ЭтотОбъект), - НСтр("ru = 'Удалить регламентное задание?'"), РежимДиалогаВопрос.ДаНет); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура ОбновитьРегламентныеЗадания(Команда) - - ОбновитьТаблицуРегламентныхЗаданий(); - -КонецПроцедуры - -&НаКлиенте -Процедура ВыполнитьРегламентноеЗаданиеВручную(Команда) - - Если Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные = Неопределено Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите регламентное задание.'")); - Возврат; - КонецЕсли; - - ВыделенныеСтроки = Новый Массив; - Для каждого ВыделеннаяСтрока Из Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки Цикл - ВыделенныеСтроки.Добавить(ВыделеннаяСтрока); - КонецЦикла; - Индекс = 0; - - МассивСообщенийОбОшибках = Новый Массив; - - Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл - ОбновитьВсе = (Индекс = ВыделенныеСтроки.Количество() - 1); - ТекущиеДанные = ТаблицаРегламентныеЗадания.НайтиПоИдентификатору(ВыделеннаяСтрока); - - ПараметрыВыполнения = ВыполнитьРегламентноеЗаданиеВручнуюНаСервере(ТекущиеДанные.Идентификатор, ОбновитьВсе); - Если ПараметрыВыполнения.ЗапускВыполнен Тогда - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Запущена процедура регламентного задания'"), , - СтрШаблон(НСтр("ru = '%1. - |Процедура запущена в фоновом задании %2'"), - ТекущиеДанные.Наименование, - Строка(ПараметрыВыполнения.МоментЗапуска)), - БиблиотекаКартинок.ВыполнитьРегламентноеЗаданиеВручную); - - ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Добавить( - ПараметрыВыполнения.ИдентификаторФоновогоЗадания, - ТекущиеДанные.Наименование); - - ПодключитьОбработчикОжидания( - "СообщитьОбОкончанииРучногоВыполненияРегламентногоЗадания", 0.1, Истина); - ИначеЕсли ПараметрыВыполнения.ПроцедураУжеВыполняется Тогда - МассивСообщенийОбОшибках.Добавить( - СтрШаблон( - НСтр("ru = 'Процедура регламентного задания ""%1"" - | уже выполняется в фоновом задании ""%2"", начатом %3.'"), - ТекущиеДанные.Наименование, - ПараметрыВыполнения.ПредставлениеФоновогоЗадания, - Строка(ПараметрыВыполнения.МоментЗапуска))); - Иначе - Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Удалить( - Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Найти(ВыделеннаяСтрока)); - КонецЕсли; - - Индекс = Индекс + 1; - КонецЦикла; - - КоличествоОшибок = МассивСообщенийОбОшибках.Количество(); - Если КоличествоОшибок > 0 Тогда - ЗаголовокТекстаПроОшибки = СтрШаблон( - НСтр("ru = 'Задания выполнены с ошибками (%1 из %2)'"), - Формат(КоличествоОшибок, "ЧГ="), - Формат(ВыделенныеСтроки.Количество(), "ЧГ=")); - - ТекстВсехОшибок = Новый ТекстовыйДокумент; - ТекстВсехОшибок.ДобавитьСтроку(ЗаголовокТекстаПроОшибки + ":"); - Для Каждого ТекстЭтойОшибки Из МассивСообщенийОбОшибках Цикл - ТекстВсехОшибок.ДобавитьСтроку(""); - ТекстВсехОшибок.ДобавитьСтроку(ТекстЭтойОшибки); - КонецЦикла; - - Если КоличествоОшибок > 5 Тогда - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Показать ошибки'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - ПоказатьВопрос( - Новый ОписаниеОповещения( - "ВыполнитьРегламентноеЗаданиеВручнуюЗавершение", ЭтотОбъект, ТекстВсехОшибок), - ЗаголовокТекстаПроОшибки, Кнопки); - Иначе - ПоказатьПредупреждение(, СокрЛП(ТекстВсехОшибок.ПолучитьТекст())); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьФоновыеЗадания(Команда) - - ОбновитьТаблицуФоновыхЗаданийНаКлиенте(); - -КонецПроцедуры - -&НаКлиенте -Процедура НастроитьРасписание(Команда) - - ТекущиеДанные = Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные; - - Если ТекущиеДанные = Неопределено Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите регламентное задание.'")); - - Иначе - Диалог = Новый ДиалогРасписанияРегламентногоЗадания( - ПолучитьРасписание(ТекущиеДанные.Идентификатор)); - - Диалог.Показать(Новый ОписаниеОповещения( - "ОткрытьРасписаниеЗавершение", ЭтотОбъект, ТекущиеДанные)); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВключитьРегламентноеЗадание(Команда) - - УстановитьИспользованиеРегламентногоЗадания(Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура ВыключитьРегламентноеЗадание(Команда) - - УстановитьИспользованиеРегламентногоЗадания(Ложь); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФоновоеЗаданиеНаКлиенте(Команда) - - ОткрытьФоновоеЗадание(); - -КонецПроцедуры - -&НаКлиенте -Процедура ОтменитьФоновоеЗадание(Команда) - - Если Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные = Неопределено Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите фоновое задание.'")); - Иначе - ОтменитьФоновоеЗаданиеНаСервере(Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные.Идентификатор); - - ПоказатьПредупреждение(, - НСтр("ru = 'Задание отменено, но состояние отмены будет - |установлено сервером только через секунды, - |возможно потребуется обновить данные вручную.'")); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПоказатьВсеЗадания(Команда) - Значение = Элементы.ТаблицаРегламентныеЗаданияПоказатьВсеЗадания.Пометка; - Элементы.ТаблицаРегламентныеЗаданияПоказатьВсеЗадания.Пометка = Не Значение; - - УстановитьВидимостьОтключенныхЗаданий(Не Значение); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервере -Процедура УстановитьУсловноеОформление() - - УсловноеОформление.Элементы.Очистить(); - - // - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Конец.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаФоновыеЗадания.Конец"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; - Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<>'")); - - // - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СостояниеВыполнения.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.СостояниеВыполнения"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = НСтр("ru = '<не определено>'"); - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - - // - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДатаОкончания.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.ДатаОкончания"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = НСтр("ru = '<не определено>'"); - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - - // - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Использование.Имя); - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Наименование.Имя); - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СостояниеВыполнения.Имя); - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДатаОкончания.Имя); - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИмяПользователя.Имя); - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Предопределенное.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.ИмяЗадания"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; - ОтборЭлемента.ПравоеЗначение = ОтключенныеЗадания; - Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); - -КонецПроцедуры - -&НаСервере -Процедура УстановитьВидимостьОтключенныхЗаданий(Показывать) - - Элемент = УсловноеОформление.Элементы.Получить(3); - ЭлементОформления = Элемент.Оформление.Элементы.Найти("Видимость"); - - Если Не Показывать Тогда - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.ИмяЗадания"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; - ОтборЭлемента.ПравоеЗначение = ОтключенныеЗадания; - - ЭлементОформления.Использование = Истина; - Иначе - Элемент.Отбор.Элементы.Очистить(); - ЭлементОформления.Использование = Ложь; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ТаблицаРегламентныеЗаданияПередУдалениемЗавершение(Ответ, Неопределен) Экспорт - - Если Ответ = КодВозвратаДиалога.Да Тогда - УдалитьРегламентноеЗаданиеВыполнитьНаСервере( - Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные.Идентификатор); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВыполнитьРегламентноеЗаданиеВручнуюЗавершение(Ответ, ТекстВсехОшибок) Экспорт - - Если Ответ = 1 Тогда - ТекстВсехОшибок.Показать(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, ТекущиеДанные) Экспорт - - Если НовоеРасписание <> Неопределено Тогда - Для каждого ВыделеннаяСтрока Из Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки Цикл - - ТекущаяСтрока = ТаблицаРегламентныеЗадания.НайтиПоИдентификатору(ВыделеннаяСтрока); - УстановитьРасписание(ТекущаяСтрока.Идентификатор, НовоеРасписание); - - КонецЦикла; - - ОбновитьТаблицуРегламентныхЗаданий(ТекущиеДанные.Идентификатор); - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ПолучитьРасписание(Знач ИдентификаторРегламентногоЗадания) - - УстановитьПривилегированныйРежим(Истина); - - Возврат РегламентныеЗаданияСервер.РасписаниеРегламентногоЗадания( - ИдентификаторРегламентногоЗадания); - -КонецФункции - -&НаСервереБезКонтекста -Процедура УстановитьРасписание(Знач ИдентификаторРегламентногоЗадания, Знач Расписание) - - УстановитьПривилегированныйРежим(Истина); - - РегламентныеЗаданияСервер.УстановитьРасписаниеРегламентногоЗадания( - ИдентификаторРегламентногоЗадания, - Расписание); - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьНастройкиФормы(Знач Настройки) - - ОбновитьТаблицуРегламентныхЗаданий(); - - НастройкиПоУмолчанию = Новый Структура; - - // Настройка отбора фоновых заданий. - Если Настройки.Получить("ОтборПоСостояниюАктивно") = Неопределено Тогда - Настройки.Вставить("ОтборПоСостояниюАктивно", Истина); - КонецЕсли; - - Если Настройки.Получить("ОтборПоСостояниюЗавершено") = Неопределено Тогда - Настройки.Вставить("ОтборПоСостояниюЗавершено", Истина); - КонецЕсли; - - Если Настройки.Получить("ОтборПоСостояниюЗавершеноАварийно") = Неопределено Тогда - Настройки.Вставить("ОтборПоСостояниюЗавершеноАварийно", Истина); - КонецЕсли; - - Если Настройки.Получить("ОтборПоСостояниюОтменено") = Неопределено Тогда - Настройки.Вставить("ОтборПоСостояниюОтменено", Истина); - КонецЕсли; - - Если Настройки.Получить("ОтбиратьПоРегламентномуЗаданию") = Неопределено - ИЛИ Настройки.Получить("РегламентноеЗаданиеДляОтбораИдентификатор") = Неопределено Тогда - Настройки.Вставить("ОтбиратьПоРегламентномуЗаданию", Ложь); - Настройки.Вставить("РегламентноеЗаданиеДляОтбораИдентификатор", ПустойИдентификатор); - КонецЕсли; - - // Настройка отбора по периоду "За все время". - // См. также обработчик события ВидОтбораПоПериодуПриИзменении переключателя. - Если Настройки.Получить("ВидОтбораПоПериоду") = Неопределено - ИЛИ Настройки.Получить("ОтборПериодС") = Неопределено - ИЛИ Настройки.Получить("ОтборПериодПо") = Неопределено Тогда - - Настройки.Вставить("ВидОтбораПоПериоду", 0); - ТекущаяДатаСеанса = ТекущаяДатаСеанса(); - Настройки.Вставить("ОтборПериодС", НачалоДня(ТекущаяДатаСеанса) - 3*3600); - Настройки.Вставить("ОтборПериодПо", НачалоДня(ТекущаяДатаСеанса) + 9*3600); - КонецЕсли; - - Для Каждого Настройка Из Настройки Цикл - НастройкиПоУмолчанию.Вставить(Настройка.Ключ, Настройка.Значение); - КонецЦикла; - - ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиПоУмолчанию); - - // Настройка видимости и доступности. - Элементы.ОтборПериодС.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); - Элементы.ОтборПериодПо.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); - Элементы.РегламентноеЗаданиеДляОтбора.Доступность = ОтбиратьПоРегламентномуЗаданию; - - ОбновитьАвтоматическийПериод(ЭтотОбъект, ТекущаяДатаСеанса()); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФоновоеЗадание() - - Если Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные = Неопределено Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите фоновое задание.'")); - Возврат; - КонецЕсли; - - СписокПередаваемыхСвойств = - "Идентификатор, - |Ключ, - |Наименование, - |ИмяМетода, - |Состояние, - |Начало, - |Конец, - |Расположение, - |СообщенияПользователюИОписаниеИнформацииОбОшибке, - |ИдентификаторРегламентногоЗадания, - |НаименованиеРегламентногоЗадания"; - ЗначенияТекущихДанных = Новый Структура(СписокПередаваемыхСвойств); - ЗаполнитьЗначенияСвойств(ЗначенияТекущихДанных, Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные); - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Идентификатор", Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные.Идентификатор); - ПараметрыФормы.Вставить("СвойстваФоновогоЗадания", ЗначенияТекущихДанных); - - ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма.ФоновоеЗадание", ПараметрыФормы, ЭтотОбъект); - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ТекущаяДатаСеансаНаСервере() - - Возврат ТекущаяДатаСеанса(); - -КонецФункции - -&НаСервере -Функция ОповещенияОбОкончанииВыполненияРегламентныхЗаданий() - - ОповещенияОбОкончанииВыполнения = Новый Массив; - - Если ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Количество() > 0 Тогда - Индекс = ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Количество() - 1; - - УстановитьПривилегированныйРежим(Истина); - Пока Индекс >= 0 Цикл - - НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор( - ИдентификаторыФоновыхЗаданийПриРучномВыполнении[Индекс].Значение); - Отбор = Новый Структура; - Отбор.Вставить("УникальныйИдентификатор", НовыйУникальныйИдентификатор); - - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); - - Если МассивФоновыхЗаданий.Количество() = 1 Тогда - МоментОкончания = МассивФоновыхЗаданий[0].Конец; - - Если ЗначениеЗаполнено(МоментОкончания) Тогда - - ОповещенияОбОкончанииВыполнения.Добавить( - Новый Структура( - "ПредставлениеРегламентногоЗадания, - |МоментОкончания", - ИдентификаторыФоновыхЗаданийПриРучномВыполнении[Индекс].Представление, - МоментОкончания)); - - ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Удалить(Индекс); - КонецЕсли; - Иначе - ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Удалить(Индекс); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; - УстановитьПривилегированныйРежим(Ложь); - КонецЕсли; - - ОбновитьТаблицуРегламентныхЗаданий(); - - Возврат ОповещенияОбОкончанииВыполнения; - -КонецФункции - -&НаКлиенте -Процедура СообщитьОбОкончанииРучногоВыполненияРегламентногоЗадания() - - ОповещенияОбОкончанииВыполнения = ОповещенияОбОкончанииВыполненияРегламентныхЗаданий(); - - Для каждого Оповещение Из ОповещенияОбОкончанииВыполнения Цикл - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Выполнена процедура регламентного задания'"), - , - СтрШаблон( - НСтр("ru = '%1. - |Процедура завершена в фоновом задании %2'"), - Оповещение.ПредставлениеРегламентногоЗадания, - Строка(Оповещение.МоментОкончания)), - БиблиотекаКартинок.ВыполнитьРегламентноеЗаданиеВручную); - КонецЦикла; - - Если ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Количество() > 0 Тогда - - ПодключитьОбработчикОжидания( - "СообщитьОбОкончанииРучногоВыполненияРегламентногоЗадания", 2, Истина); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьСписокВыбораРегламентногоЗадания() - - Таблица = ТаблицаРегламентныеЗадания; - Список = Элементы.РегламентноеЗаданиеДляОтбора.СписокВыбора; - - // Добавление предопределенного элемента. - Если Список.Количество() = 0 Тогда - Список.Добавить(ПустойИдентификатор, ТекстНеОпределено); - КонецЕсли; - - Индекс = 1; - Для каждого Задание Из Таблица Цикл - Если Индекс >= Список.Количество() - ИЛИ Список[Индекс].Значение <> Задание.Идентификатор Тогда - // Вставка нового задания. - Список.Вставить(Индекс, Задание.Идентификатор, Задание.Наименование); - Иначе - Список[Индекс].Представление = Задание.Наименование; - КонецЕсли; - Индекс = Индекс + 1; - КонецЦикла; - - // Удаление лишних строк. - Пока Индекс < Список.Количество() Цикл - Список.Удалить(Индекс); - КонецЦикла; - - ЭлементСписка = Список.НайтиПоЗначению(РегламентноеЗаданиеДляОтбораИдентификатор); - Если ЭлементСписка = Неопределено Тогда - РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор; - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция ВыполнитьРегламентноеЗаданиеВручнуюНаСервере(Знач ИдентификаторРегламентногоЗадания, ОбновитьВсе = Ложь) - - Результат = РегламентныеЗаданияСлужебный.ВыполнитьРегламентноеЗаданиеВручную(ИдентификаторРегламентногоЗадания); - Если ОбновитьВсе Тогда - ОбновитьТаблицуРегламентныхЗаданий(); - Иначе - ОбновитьТаблицуРегламентныхЗаданий(ИдентификаторРегламентногоЗадания); - КонецЕсли; - Возврат Результат; - -КонецФункции - -&НаСервере -Процедура ОтменитьФоновоеЗаданиеНаСервере(Знач Идентификатор) - - РегламентныеЗаданияСлужебный.ОтменитьФоновоеЗадание(Идентификатор); - - ОбновитьТаблицуРегламентныхЗаданий(); - ОбновитьТаблицуФоновыхЗаданий(Ложь); - -КонецПроцедуры - -&НаСервере -Процедура УдалитьРегламентноеЗаданиеВыполнитьНаСервере(Знач Идентификатор) - - Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Идентификатор); - Строка = ТаблицаРегламентныеЗадания.НайтиСтроки(Новый Структура("Идентификатор", Идентификатор))[0]; - Задание.Удалить(); - ТаблицаРегламентныеЗадания.Удалить(ТаблицаРегламентныеЗадания.Индекс(Строка)); - -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьСкопироватьИзменитьРегламентноеЗадание(Знач Действие) - - Если Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные = Неопределено Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Выберите регламентное задание.'")); - Иначе - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Идентификатор", Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные.Идентификатор); - ПараметрыФормы.Вставить("Действие", Действие); - - ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма.РегламентноеЗадание", ПараметрыФормы, ЭтотОбъект); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОтложенноеОбновлениеРегламентныхЗаданий() - - ОбновитьТаблицуРегламентныхЗаданий(); - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьТаблицуРегламентныхЗаданий(ИдентификаторРегламентногоЗадания = Неопределено) - - // Обновление таблицы РегламентныеЗадания и списка СписокВыбора регламентного задания для отбора. - ТекущиеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); - Таблица = ТаблицаРегламентныеЗадания; - ОтключенныеЗадания.Очистить(); - - ЗависимостиЗаданий = РегламентныеЗаданияСлужебный.РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); - - Для Каждого ОбъектМетаданных Из Метаданные.РегламентныеЗадания Цикл - Если Не РегламентныеЗаданияСлужебный.РегламентноеЗаданиеДоступноПоФункциональнымОпциям(ОбъектМетаданных, ЗависимостиЗаданий) Тогда - ОтключенныеЗадания.Добавить(ОбъектМетаданных.Имя); - Продолжить; - КонецЕсли; - КонецЦикла; - - Если ИдентификаторРегламентногоЗадания = Неопределено Тогда - - Индекс = 0; - Для каждого Задание Из ТекущиеЗадания Цикл - - Идентификатор = Строка(Задание.УникальныйИдентификатор); - - Если Индекс >= Таблица.Количество() - ИЛИ Таблица[Индекс].Идентификатор <> Идентификатор Тогда - - // Вставка нового задания. - Обновляемое = Таблица.Вставить(Индекс); - - // Установка уникального идентификатора. - Обновляемое.Идентификатор = Идентификатор; - Иначе - Обновляемое = Таблица[Индекс]; - КонецЕсли; - ОбновитьСтрокуТаблицыРегламентныхЗаданий(Обновляемое, Задание); - Индекс = Индекс + 1; - КонецЦикла; - - // Удаление лишних строк. - Пока Индекс < Таблица.Количество() Цикл - Таблица.Удалить(Индекс); - КонецЦикла; - Иначе - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( - Новый УникальныйИдентификатор(ИдентификаторРегламентногоЗадания)); - - Строки = Таблица.НайтиСтроки( - Новый Структура("Идентификатор", ИдентификаторРегламентногоЗадания)); - - Если Задание <> Неопределено - И Строки.Количество() > 0 Тогда - - ОбновитьСтрокуТаблицыРегламентныхЗаданий(Строки[0], Задание); - КонецЕсли; - КонецЕсли; - - Элементы.ТаблицаРегламентныеЗадания.Обновить(); - - ПозицияСкобки = СтрНайти(Элементы.РегламентныеЗадания.Заголовок, " ("); - Если ПозицияСкобки > 0 Тогда - Элементы.РегламентныеЗадания.Заголовок = Лев(Элементы.РегламентныеЗадания.Заголовок, ПозицияСкобки - 1); - КонецЕсли; - ЭлементовВСписке = ТаблицаРегламентныеЗадания.Количество(); - Если ЭлементовВСписке > 0 Тогда - Элементы.РегламентныеЗадания.Заголовок = Элементы.РегламентныеЗадания.Заголовок + " (" + Формат(ЭлементовВСписке, "ЧГ=") + ")"; - КонецЕсли; - - ОбновитьСписокВыбораРегламентногоЗадания(); - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьСтрокуТаблицыРегламентныхЗаданий(Строка, Задание); - - ЗаполнитьЗначенияСвойств(Строка, Задание); - - // Уточнение наименования - Строка.Наименование = РегламентныеЗаданияСлужебный.ПредставлениеРегламентногоЗадания(Задание); - - // Установка Даты завершения и Состояния завершения по последней фоновой процедуре. - СвойстваПоследнегоФоновогоЗадания = РегламентныеЗаданияСлужебный - .ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); - - Строка.ИмяЗадания = Задание.Метаданные.Имя; - Если СвойстваПоследнегоФоновогоЗадания = Неопределено Тогда - - Строка.ДатаОкончания = ТекстНеОпределено; - Строка.СостояниеВыполнения = ТекстНеОпределено; - Иначе - Строка.ДатаОкончания = ?(ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Конец), - СвойстваПоследнегоФоновогоЗадания.Конец, - "<>"); - Строка.СостояниеВыполнения = СвойстваПоследнегоФоновогоЗадания.Состояние; - КонецЕсли; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьАвтоматическийПериод(Форма, ТекущаяДатаСеанса) - - Если Форма.ВидОтбораПоПериоду = 1 Тогда - Форма.ОтборПериодС = НачалоДня(ТекущаяДатаСеанса) - 3*3600; - Форма.ОтборПериодПо = НачалоДня(ТекущаяДатаСеанса) + 9*3600; - - ИначеЕсли Форма.ВидОтбораПоПериоду = 2 Тогда - Форма.ОтборПериодС = НачалоДня(ТекущаяДатаСеанса) - 24*3600; - Форма.ОтборПериодПо = КонецДня(Форма.ОтборПериодС); - - ИначеЕсли Форма.ВидОтбораПоПериоду = 3 Тогда - Форма.ОтборПериодС = НачалоДня(ТекущаяДатаСеанса); - Форма.ОтборПериодПо = КонецДня(Форма.ОтборПериодС); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьИспользованиеРегламентногоЗадания(Включено) - - Для каждого ВыделеннаяСтрока Из Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки Цикл - ТекущиеДанные = ТаблицаРегламентныеЗадания.НайтиПоИдентификатору(ВыделеннаяСтрока); - Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(ТекущиеДанные.Идентификатор); - Если Задание.Использование <> Включено Тогда - Задание.Использование = Включено; - Задание.Записать(); - ТекущиеДанные.Использование = Включено; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Фоновая загрузка фоновых заданий. - -&НаКлиенте -Процедура ОбновитьТаблицуФоновыхЗаданийНаКлиенте() - - Результат = ФормированиеТаблицыФоновыхЗаданийВФоне(); - - Если Не Результат.ЗаданиеВыполнено Тогда - Элементы.ГруппаШапка.Доступность = Ложь; - Элементы.СтраницыОтложеннаяЗагрузкаФоновыхЗаданий.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; - ПараметрыОбработчикаОжидания = Новый Структура; - ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); - ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина); - Иначе - ОбновитьТаблицуФоновыхЗаданий(); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция ФормированиеТаблицыФоновыхЗаданийВФоне() - - Отбор = ОтборФоновыхЗаданий(); - ПередаваемыеПараметры = Новый Структура; - ПередаваемыеПараметры.Вставить("Отбор", Отбор); - - Результат = ДлительныеОперации.ЗапуститьВыполнениеВФонеСлужебный( - УникальныйИдентификатор, - "РегламентныеЗаданияСлужебный.ТаблицаСвойствФоновыхЗаданийВФоне", - ПередаваемыеПараметры, - НСтр("ru = 'Регламентные задания. Обновление списка фоновых заданий'") - , , Ложь); - - АдресХранилища = Результат.АдресХранилища; - ИдентификаторЗадания = Результат.ИдентификаторЗадания; - - Если Результат.ЗаданиеВыполнено Тогда - ОбновитьТаблицуФоновыхЗаданий(); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -&НаСервере -Функция ОтборФоновыхЗаданий() - - // 1. Подготовка отбора. - Отбор = Новый Структура; - - // 1.1. Добавление отбора по состояниям. - МассивСостояний = Новый Массив; - - Если ОтборПоСостояниюАктивно Тогда - МассивСостояний.Добавить(СостояниеФоновогоЗадания.Активно); - КонецЕсли; - - Если ОтборПоСостояниюЗавершено Тогда - МассивСостояний.Добавить(СостояниеФоновогоЗадания.Завершено); - КонецЕсли; - - Если ОтборПоСостояниюЗавершеноАварийно Тогда - МассивСостояний.Добавить(СостояниеФоновогоЗадания.ЗавершеноАварийно); - КонецЕсли; - - Если ОтборПоСостояниюОтменено Тогда - МассивСостояний.Добавить(СостояниеФоновогоЗадания.Отменено); - КонецЕсли; - - Если МассивСостояний.Количество() <> 4 Тогда - Если МассивСостояний.Количество() = 1 Тогда - Отбор.Вставить("Состояние", МассивСостояний[0]); - Иначе - Отбор.Вставить("Состояние", МассивСостояний); - КонецЕсли; - КонецЕсли; - - // 1.2. Добавление отбора по регламентному заданию. - Если ОтбиратьПоРегламентномуЗаданию Тогда - Отбор.Вставить( - "ИдентификаторРегламентногоЗадания", - ?(РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор, - "", - РегламентноеЗаданиеДляОтбораИдентификатор)); - КонецЕсли; - - // 1.3. Добавление отбора по периоду. - Если ВидОтбораПоПериоду <> 0 Тогда - ОбновитьАвтоматическийПериод(ЭтотОбъект, ТекущаяДатаСеанса()); - Отбор.Вставить("Начало", ОтборПериодС); - Отбор.Вставить("Конец", ОтборПериодПо); - КонецЕсли; - - Возврат Отбор; - -КонецФункции - -&НаСервере -Процедура ОбновитьТаблицуФоновыхЗаданий(ФоноваяЗагрузка = Истина) - - // 2. Обновление списка фоновых заданий. - - Если ФоноваяЗагрузка Тогда - ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресХранилища); - ТекущаяТаблица = ДанныеИзХранилища.ТаблицаСвойств; - Иначе - Отбор = ОтборФоновыхЗаданий(); - ТекущаяТаблица = РегламентныеЗаданияСлужебный.ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор); - КонецЕсли; - - Таблица = ТаблицаФоновыеЗадания; - - Индекс = 0; - Для каждого Задание Из ТекущаяТаблица Цикл - - Если Индекс >= Таблица.Количество() - ИЛИ Таблица[Индекс].Идентификатор <> Задание.Идентификатор Тогда - // Вставка нового задания. - Обновляемое = Таблица.Вставить(Индекс); - // Установка уникального идентификатора. - Обновляемое.Идентификатор = Задание.Идентификатор; - Иначе - Обновляемое = Таблица[Индекс]; - КонецЕсли; - - ЗаполнитьЗначенияСвойств(Обновляемое, Задание); - - // Установка наименования регламентного задания из коллекции ТаблицаРегламентныеЗадания. - Если ЗначениеЗаполнено(Обновляемое.ИдентификаторРегламентногоЗадания) Тогда - - Обновляемое.ИдентификаторРегламентногоЗадания - = Обновляемое.ИдентификаторРегламентногоЗадания; - - Строки = ТаблицаРегламентныеЗадания.НайтиСтроки( - Новый Структура("Идентификатор", Обновляемое.ИдентификаторРегламентногоЗадания)); - - Обновляемое.НаименованиеРегламентногоЗадания - = ?(Строки.Количество() = 0, НСтр("ru = '<не найдено>'"), Строки[0].Наименование); - Иначе - Обновляемое.НаименованиеРегламентногоЗадания = ТекстНеОпределено; - Обновляемое.ИдентификаторРегламентногоЗадания = ТекстНеОпределено; - КонецЕсли; - - // Получение информации об ошибках. - Обновляемое.СообщенияПользователюИОписаниеИнформацииОбОшибке - = РегламентныеЗаданияСлужебный.СообщенияИОписанияОшибокФоновогоЗадания( - Обновляемое.Идентификатор, Задание); - - // Увеличение индекса - Индекс = Индекс + 1; - КонецЦикла; - - // Удаление лишних строк. - Пока Индекс < Таблица.Количество() Цикл - Таблица.Удалить(Таблица.Количество()-1); - КонецЦикла; - - Элементы.ТаблицаФоновыеЗадания.Обновить(); - - ПозицияСкобки = СтрНайти(Элементы.ФоновыеЗадания.Заголовок, " ("); - Если ПозицияСкобки > 0 Тогда - Элементы.ФоновыеЗадания.Заголовок = Лев(Элементы.ФоновыеЗадания.Заголовок, ПозицияСкобки - 1); - КонецЕсли; - ЭлементовВСписке = ТаблицаФоновыеЗадания.Количество(); - Если ЭлементовВСписке > 0 Тогда - Элементы.ФоновыеЗадания.Заголовок = Элементы.ФоновыеЗадания.Заголовок + " (" + Формат(ЭлементовВСписке, "ЧГ=") + ")"; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_ПроверитьВыполнениеЗадания() - - Попытка - Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда - ОбновитьТаблицуФоновыхЗаданий(); - Элементы.ГруппаШапка.Доступность = Истина; - Элементы.СтраницыОтложеннаяЗагрузкаФоновыхЗаданий.ТекущаяСтраница = Элементы.СтраницаФоновыеЗадания; - Иначе - ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); - ПодключитьОбработчикОжидания( - "Подключаемый_ПроверитьВыполнениеЗадания", - ПараметрыОбработчикаОжидания.ТекущийИнтервал, - Истина); - КонецЕсли; - Исключение - Элементы.ГруппаШапка.Доступность = Истина; - Элементы.СтраницыОтложеннаяЗагрузкаФоновыхЗаданий.ТекущаяСтраница = Элементы.СтраницаФоновыеЗадания; - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -&НаСервере -Процедура ПриЗакрытииНаСервере() - ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания); -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ЗаданиеВыполнено(ИдентификаторЗадания) - Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания); -КонецФункции - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + ПустойИдентификатор = Строка(Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + ТекстНеОпределено = РегламентныеЗаданияСлужебный.ТекстНеОпределено(); + ЭтоПодчиненныйУзелРИБ = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если НЕ НастройкиЗагружены Тогда + ЗаполнитьНастройкиФормы(Новый Соответствие); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "Запись_РегламентныеЗадания" Тогда + + Если ЗначениеЗаполнено(Параметр) Тогда + ОбновитьТаблицуРегламентныхЗаданий(Параметр); + Иначе + ПодключитьОбработчикОжидания("ОтложенноеОбновлениеРегламентныхЗаданий", 0.1, Истина); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + ЗаполнитьНастройкиФормы(Настройки); + + НастройкиЗагружены = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии(ЗавершениеРаботы) + Если НЕ ЗавершениеРаботы И ИдентификаторЗадания <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда + ПриЗакрытииНаСервере(); + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ЗаданияПриСменеСтраницы(Элемент, ТекущаяСтраница) + + Если ТекущаяСтраница = Элементы.ФоновыеЗадания + И Не СтраницаФоновыеЗаданияОткрывалась Тогда + + СтраницаФоновыеЗаданияОткрывалась = Истина; + ОбновитьТаблицуФоновыхЗаданийНаКлиенте(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидОтбораПоПериодуПриИзменении(Элемент) + + ТекущаяДатаСеанса = ТекущаяДатаСеансаНаСервере(); + + Элементы.ОтборПериодС.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + Элементы.ОтборПериодПо.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + + Если ВидОтбораПоПериоду = 0 Тогда + ОтборПериодС = '00010101'; + ОтборПериодПо = '00010101'; + Элементы.УстановкаПроизвольногоПериода.Видимость = Ложь; + ИначеЕсли ВидОтбораПоПериоду = 4 Тогда + ОтборПериодС = НачалоДня(ТекущаяДатаСеанса); + ОтборПериодПо = ОтборПериодС; + Элементы.УстановкаПроизвольногоПериода.Видимость = Истина; + Иначе + ОбновитьАвтоматическийПериод(ЭтотОбъект, ТекущаяДатаСеанса); + Элементы.УстановкаПроизвольногоПериода.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтбиратьПоРегламентномуЗаданиюПриИзменении(Элемент) + + Элементы.РегламентноеЗаданиеДляОтбора.Доступность = ОтбиратьПоРегламентномуЗаданию; + +КонецПроцедуры + +&НаКлиенте +Процедура РегламентноеЗаданиеДляОтбораОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаФоновыеЗадания + +&НаКлиенте +Процедура ТаблицаФоновыеЗаданияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ОткрытьФоновоеЗадание(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаРегламентныеЗадания + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если Поле = "Предопределенное" + ИЛИ Поле = "Использование" Тогда + + ДобавитьСкопироватьИзменитьРегламентноеЗадание("Изменить"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Отказ = Истина; + + ДобавитьСкопироватьИзменитьРегламентноеЗадание(?(Копирование, "Скопировать", "Добавить")); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияПередНачаломИзменения(Элемент, Отказ) + + Отказ = Истина; + + ДобавитьСкопироватьИзменитьРегламентноеЗадание("Изменить"); + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияПередУдалением(Элемент, Отказ) + + Отказ = Истина; + + Если Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Количество() > 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите одно регламентное задание.'")); + + ИначеЕсли Элемент.ТекущиеДанные.Предопределенное Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Невозможно удалить предопределенное регламентное задание.'") ); + Иначе + ПоказатьВопрос( + Новый ОписаниеОповещения("ТаблицаРегламентныеЗаданияПередУдалениемЗавершение", ЭтотОбъект), + НСтр("ru = 'Удалить регламентное задание?'"), РежимДиалогаВопрос.ДаНет); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОбновитьРегламентныеЗадания(Команда) + + ОбновитьТаблицуРегламентныхЗаданий(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьРегламентноеЗаданиеВручную(Команда) + + Если Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите регламентное задание.'")); + Возврат; + КонецЕсли; + + ВыделенныеСтроки = Новый Массив; + Для каждого ВыделеннаяСтрока Из Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки Цикл + ВыделенныеСтроки.Добавить(ВыделеннаяСтрока); + КонецЦикла; + Индекс = 0; + + МассивСообщенийОбОшибках = Новый Массив; + + Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл + ОбновитьВсе = (Индекс = ВыделенныеСтроки.Количество() - 1); + ТекущиеДанные = ТаблицаРегламентныеЗадания.НайтиПоИдентификатору(ВыделеннаяСтрока); + + ПараметрыВыполнения = ВыполнитьРегламентноеЗаданиеВручнуюНаСервере(ТекущиеДанные.Идентификатор, ОбновитьВсе); + Если ПараметрыВыполнения.ЗапускВыполнен Тогда + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Запущена процедура регламентного задания'"), , + СтрШаблон(НСтр("ru = '%1. + |Процедура запущена в фоновом задании %2'"), + ТекущиеДанные.Наименование, + Строка(ПараметрыВыполнения.МоментЗапуска)), + БиблиотекаКартинок.ВыполнитьРегламентноеЗаданиеВручную); + + ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Добавить( + ПараметрыВыполнения.ИдентификаторФоновогоЗадания, + ТекущиеДанные.Наименование); + + ПодключитьОбработчикОжидания( + "СообщитьОбОкончанииРучногоВыполненияРегламентногоЗадания", 0.1, Истина); + ИначеЕсли ПараметрыВыполнения.ПроцедураУжеВыполняется Тогда + МассивСообщенийОбОшибках.Добавить( + СтрШаблон( + НСтр("ru = 'Процедура регламентного задания ""%1"" + | уже выполняется в фоновом задании ""%2"", начатом %3.'"), + ТекущиеДанные.Наименование, + ПараметрыВыполнения.ПредставлениеФоновогоЗадания, + Строка(ПараметрыВыполнения.МоментЗапуска))); + Иначе + Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Удалить( + Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки.Найти(ВыделеннаяСтрока)); + КонецЕсли; + + Индекс = Индекс + 1; + КонецЦикла; + + КоличествоОшибок = МассивСообщенийОбОшибках.Количество(); + Если КоличествоОшибок > 0 Тогда + ЗаголовокТекстаПроОшибки = СтрШаблон( + НСтр("ru = 'Задания выполнены с ошибками (%1 из %2)'"), + Формат(КоличествоОшибок, "ЧГ="), + Формат(ВыделенныеСтроки.Количество(), "ЧГ=")); + + ТекстВсехОшибок = Новый ТекстовыйДокумент; + ТекстВсехОшибок.ДобавитьСтроку(ЗаголовокТекстаПроОшибки + ":"); + Для Каждого ТекстЭтойОшибки Из МассивСообщенийОбОшибках Цикл + ТекстВсехОшибок.ДобавитьСтроку(""); + ТекстВсехОшибок.ДобавитьСтроку(ТекстЭтойОшибки); + КонецЦикла; + + Если КоличествоОшибок > 5 Тогда + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(1, НСтр("ru = 'Показать ошибки'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); + + ПоказатьВопрос( + Новый ОписаниеОповещения( + "ВыполнитьРегламентноеЗаданиеВручнуюЗавершение", ЭтотОбъект, ТекстВсехОшибок), + ЗаголовокТекстаПроОшибки, Кнопки); + Иначе + ПоказатьПредупреждение(, СокрЛП(ТекстВсехОшибок.ПолучитьТекст())); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьФоновыеЗадания(Команда) + + ОбновитьТаблицуФоновыхЗаданийНаКлиенте(); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьРасписание(Команда) + + ТекущиеДанные = Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите регламентное задание.'")); + + Иначе + Диалог = Новый ДиалогРасписанияРегламентногоЗадания( + ПолучитьРасписание(ТекущиеДанные.Идентификатор)); + + Диалог.Показать(Новый ОписаниеОповещения( + "ОткрытьРасписаниеЗавершение", ЭтотОбъект, ТекущиеДанные)); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьРегламентноеЗадание(Команда) + + УстановитьИспользованиеРегламентногоЗадания(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыключитьРегламентноеЗадание(Команда) + + УстановитьИспользованиеРегламентногоЗадания(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФоновоеЗаданиеНаКлиенте(Команда) + + ОткрытьФоновоеЗадание(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьФоновоеЗадание(Команда) + + Если Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите фоновое задание.'")); + Иначе + ОтменитьФоновоеЗаданиеНаСервере(Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные.Идентификатор); + + ПоказатьПредупреждение(, + НСтр("ru = 'Задание отменено, но состояние отмены будет + |установлено сервером только через секунды, + |возможно потребуется обновить данные вручную.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьВсеЗадания(Команда) + Значение = Элементы.ТаблицаРегламентныеЗаданияПоказатьВсеЗадания.Пометка; + Элементы.ТаблицаРегламентныеЗаданияПоказатьВсеЗадания.Пометка = Не Значение; + + УстановитьВидимостьОтключенныхЗаданий(Не Значение); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура УстановитьУсловноеОформление() + + УсловноеОформление.Элементы.Очистить(); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Конец.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаФоновыеЗадания.Конец"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<>'")); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СостояниеВыполнения.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.СостояниеВыполнения"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = НСтр("ru = '<не определено>'"); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДатаОкончания.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.ДатаОкончания"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = НСтр("ru = '<не определено>'"); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Использование.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Наименование.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СостояниеВыполнения.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДатаОкончания.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИмяПользователя.Имя); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Предопределенное.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.ИмяЗадания"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + ОтборЭлемента.ПравоеЗначение = ОтключенныеЗадания; + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьВидимостьОтключенныхЗаданий(Показывать) + + Элемент = УсловноеОформление.Элементы.Получить(3); + ЭлементОформления = Элемент.Оформление.Элементы.Найти("Видимость"); + + Если Не Показывать Тогда + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаРегламентныеЗадания.ИмяЗадания"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + ОтборЭлемента.ПравоеЗначение = ОтключенныеЗадания; + + ЭлементОформления.Использование = Истина; + Иначе + Элемент.Отбор.Элементы.Очистить(); + ЭлементОформления.Использование = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТаблицаРегламентныеЗаданияПередУдалениемЗавершение(Ответ, Неопределен) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + УдалитьРегламентноеЗаданиеВыполнитьНаСервере( + Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные.Идентификатор); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьРегламентноеЗаданиеВручнуюЗавершение(Ответ, ТекстВсехОшибок) Экспорт + + Если Ответ = 1 Тогда + ТекстВсехОшибок.Показать(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, ТекущиеДанные) Экспорт + + Если НовоеРасписание <> Неопределено Тогда + Для каждого ВыделеннаяСтрока Из Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки Цикл + + ТекущаяСтрока = ТаблицаРегламентныеЗадания.НайтиПоИдентификатору(ВыделеннаяСтрока); + УстановитьРасписание(ТекущаяСтрока.Идентификатор, НовоеРасписание); + + КонецЦикла; + + ОбновитьТаблицуРегламентныхЗаданий(ТекущиеДанные.Идентификатор); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьРасписание(Знач ИдентификаторРегламентногоЗадания) + + УстановитьПривилегированныйРежим(Истина); + + Возврат РегламентныеЗаданияСервер.РасписаниеРегламентногоЗадания( + ИдентификаторРегламентногоЗадания); + +КонецФункции + +&НаСервереБезКонтекста +Процедура УстановитьРасписание(Знач ИдентификаторРегламентногоЗадания, Знач Расписание) + + УстановитьПривилегированныйРежим(Истина); + + РегламентныеЗаданияСервер.УстановитьРасписаниеРегламентногоЗадания( + ИдентификаторРегламентногоЗадания, + Расписание); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьНастройкиФормы(Знач Настройки) + + ОбновитьТаблицуРегламентныхЗаданий(); + + НастройкиПоУмолчанию = Новый Структура; + + // Настройка отбора фоновых заданий. + Если Настройки.Получить("ОтборПоСостояниюАктивно") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюАктивно", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтборПоСостояниюЗавершено") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюЗавершено", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтборПоСостояниюЗавершеноАварийно") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюЗавершеноАварийно", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтборПоСостояниюОтменено") = Неопределено Тогда + Настройки.Вставить("ОтборПоСостояниюОтменено", Истина); + КонецЕсли; + + Если Настройки.Получить("ОтбиратьПоРегламентномуЗаданию") = Неопределено + ИЛИ Настройки.Получить("РегламентноеЗаданиеДляОтбораИдентификатор") = Неопределено Тогда + Настройки.Вставить("ОтбиратьПоРегламентномуЗаданию", Ложь); + Настройки.Вставить("РегламентноеЗаданиеДляОтбораИдентификатор", ПустойИдентификатор); + КонецЕсли; + + // Настройка отбора по периоду "За все время". + // См. также обработчик события ВидОтбораПоПериодуПриИзменении переключателя. + Если Настройки.Получить("ВидОтбораПоПериоду") = Неопределено + ИЛИ Настройки.Получить("ОтборПериодС") = Неопределено + ИЛИ Настройки.Получить("ОтборПериодПо") = Неопределено Тогда + + Настройки.Вставить("ВидОтбораПоПериоду", 0); + ТекущаяДатаСеанса = ТекущаяДатаСеанса(); + Настройки.Вставить("ОтборПериодС", НачалоДня(ТекущаяДатаСеанса) - 3*3600); + Настройки.Вставить("ОтборПериодПо", НачалоДня(ТекущаяДатаСеанса) + 9*3600); + КонецЕсли; + + Для Каждого Настройка Из Настройки Цикл + НастройкиПоУмолчанию.Вставить(Настройка.Ключ, Настройка.Значение); + КонецЦикла; + + ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиПоУмолчанию); + + // Настройка видимости и доступности. + Элементы.ОтборПериодС.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + Элементы.ОтборПериодПо.ТолькоПросмотр = НЕ (ВидОтбораПоПериоду = 4); + Элементы.РегламентноеЗаданиеДляОтбора.Доступность = ОтбиратьПоРегламентномуЗаданию; + + ОбновитьАвтоматическийПериод(ЭтотОбъект, ТекущаяДатаСеанса()); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФоновоеЗадание() + + Если Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите фоновое задание.'")); + Возврат; + КонецЕсли; + + СписокПередаваемыхСвойств = + "Идентификатор, + |Ключ, + |Наименование, + |ИмяМетода, + |Состояние, + |Начало, + |Конец, + |Расположение, + |СообщенияПользователюИОписаниеИнформацииОбОшибке, + |ИдентификаторРегламентногоЗадания, + |НаименованиеРегламентногоЗадания"; + ЗначенияТекущихДанных = Новый Структура(СписокПередаваемыхСвойств); + ЗаполнитьЗначенияСвойств(ЗначенияТекущихДанных, Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Идентификатор", Элементы.ТаблицаФоновыеЗадания.ТекущиеДанные.Идентификатор); + ПараметрыФормы.Вставить("СвойстваФоновогоЗадания", ЗначенияТекущихДанных); + + ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма.ФоновоеЗадание", ПараметрыФормы, ЭтотОбъект); + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ТекущаяДатаСеансаНаСервере() + + Возврат ТекущаяДатаСеанса(); + +КонецФункции + +&НаСервере +Функция ОповещенияОбОкончанииВыполненияРегламентныхЗаданий() + + ОповещенияОбОкончанииВыполнения = Новый Массив; + + Если ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Количество() > 0 Тогда + Индекс = ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Количество() - 1; + + УстановитьПривилегированныйРежим(Истина); + Пока Индекс >= 0 Цикл + + НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор( + ИдентификаторыФоновыхЗаданийПриРучномВыполнении[Индекс].Значение); + Отбор = Новый Структура; + Отбор.Вставить("УникальныйИдентификатор", НовыйУникальныйИдентификатор); + + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + + Если МассивФоновыхЗаданий.Количество() = 1 Тогда + МоментОкончания = МассивФоновыхЗаданий[0].Конец; + + Если ЗначениеЗаполнено(МоментОкончания) Тогда + + ОповещенияОбОкончанииВыполнения.Добавить( + Новый Структура( + "ПредставлениеРегламентногоЗадания, + |МоментОкончания", + ИдентификаторыФоновыхЗаданийПриРучномВыполнении[Индекс].Представление, + МоментОкончания)); + + ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Удалить(Индекс); + КонецЕсли; + Иначе + ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + ОбновитьТаблицуРегламентныхЗаданий(); + + Возврат ОповещенияОбОкончанииВыполнения; + +КонецФункции + +&НаКлиенте +Процедура СообщитьОбОкончанииРучногоВыполненияРегламентногоЗадания() + + ОповещенияОбОкончанииВыполнения = ОповещенияОбОкончанииВыполненияРегламентныхЗаданий(); + + Для каждого Оповещение Из ОповещенияОбОкончанииВыполнения Цикл + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Выполнена процедура регламентного задания'"), + , + СтрШаблон( + НСтр("ru = '%1. + |Процедура завершена в фоновом задании %2'"), + Оповещение.ПредставлениеРегламентногоЗадания, + Строка(Оповещение.МоментОкончания)), + БиблиотекаКартинок.ВыполнитьРегламентноеЗаданиеВручную); + КонецЦикла; + + Если ИдентификаторыФоновыхЗаданийПриРучномВыполнении.Количество() > 0 Тогда + + ПодключитьОбработчикОжидания( + "СообщитьОбОкончанииРучногоВыполненияРегламентногоЗадания", 2, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСписокВыбораРегламентногоЗадания() + + Таблица = ТаблицаРегламентныеЗадания; + Список = Элементы.РегламентноеЗаданиеДляОтбора.СписокВыбора; + + // Добавление предопределенного элемента. + Если Список.Количество() = 0 Тогда + Список.Добавить(ПустойИдентификатор, ТекстНеОпределено); + КонецЕсли; + + Индекс = 1; + Для каждого Задание Из Таблица Цикл + Если Индекс >= Список.Количество() + ИЛИ Список[Индекс].Значение <> Задание.Идентификатор Тогда + // Вставка нового задания. + Список.Вставить(Индекс, Задание.Идентификатор, Задание.Наименование); + Иначе + Список[Индекс].Представление = Задание.Наименование; + КонецЕсли; + Индекс = Индекс + 1; + КонецЦикла; + + // Удаление лишних строк. + Пока Индекс < Список.Количество() Цикл + Список.Удалить(Индекс); + КонецЦикла; + + ЭлементСписка = Список.НайтиПоЗначению(РегламентноеЗаданиеДляОтбораИдентификатор); + Если ЭлементСписка = Неопределено Тогда + РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ВыполнитьРегламентноеЗаданиеВручнуюНаСервере(Знач ИдентификаторРегламентногоЗадания, ОбновитьВсе = Ложь) + + Результат = РегламентныеЗаданияСлужебный.ВыполнитьРегламентноеЗаданиеВручную(ИдентификаторРегламентногоЗадания); + Если ОбновитьВсе Тогда + ОбновитьТаблицуРегламентныхЗаданий(); + Иначе + ОбновитьТаблицуРегламентныхЗаданий(ИдентификаторРегламентногоЗадания); + КонецЕсли; + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ОтменитьФоновоеЗаданиеНаСервере(Знач Идентификатор) + + РегламентныеЗаданияСлужебный.ОтменитьФоновоеЗадание(Идентификатор); + + ОбновитьТаблицуРегламентныхЗаданий(); + ОбновитьТаблицуФоновыхЗаданий(Ложь); + +КонецПроцедуры + +&НаСервере +Процедура УдалитьРегламентноеЗаданиеВыполнитьНаСервере(Знач Идентификатор) + + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Идентификатор); + Строка = ТаблицаРегламентныеЗадания.НайтиСтроки(Новый Структура("Идентификатор", Идентификатор))[0]; + Задание.Удалить(); + ТаблицаРегламентныеЗадания.Удалить(ТаблицаРегламентныеЗадания.Индекс(Строка)); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьСкопироватьИзменитьРегламентноеЗадание(Знач Действие) + + Если Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите регламентное задание.'")); + Иначе + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Идентификатор", Элементы.ТаблицаРегламентныеЗадания.ТекущиеДанные.Идентификатор); + ПараметрыФормы.Вставить("Действие", Действие); + + ОткрытьФорму("Обработка.РегламентныеИФоновыеЗадания.Форма.РегламентноеЗадание", ПараметрыФормы, ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтложенноеОбновлениеРегламентныхЗаданий() + + ОбновитьТаблицуРегламентныхЗаданий(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьТаблицуРегламентныхЗаданий(ИдентификаторРегламентногоЗадания = Неопределено) + + // Обновление таблицы РегламентныеЗадания и списка СписокВыбора регламентного задания для отбора. + ТекущиеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); + Таблица = ТаблицаРегламентныеЗадания; + ОтключенныеЗадания.Очистить(); + + ЗависимостиЗаданий = РегламентныеЗаданияСлужебный.РегламентныеЗаданияЗависимыеОтФункциональныхОпций(); + + Для Каждого ОбъектМетаданных Из Метаданные.РегламентныеЗадания Цикл + Если Не РегламентныеЗаданияСлужебный.РегламентноеЗаданиеДоступноПоФункциональнымОпциям(ОбъектМетаданных, ЗависимостиЗаданий) Тогда + ОтключенныеЗадания.Добавить(ОбъектМетаданных.Имя); + Продолжить; + КонецЕсли; + КонецЦикла; + + Если ИдентификаторРегламентногоЗадания = Неопределено Тогда + + Индекс = 0; + Для каждого Задание Из ТекущиеЗадания Цикл + + Идентификатор = Строка(Задание.УникальныйИдентификатор); + + Если Индекс >= Таблица.Количество() + ИЛИ Таблица[Индекс].Идентификатор <> Идентификатор Тогда + + // Вставка нового задания. + Обновляемое = Таблица.Вставить(Индекс); + + // Установка уникального идентификатора. + Обновляемое.Идентификатор = Идентификатор; + Иначе + Обновляемое = Таблица[Индекс]; + КонецЕсли; + ОбновитьСтрокуТаблицыРегламентныхЗаданий(Обновляемое, Задание); + Индекс = Индекс + 1; + КонецЦикла; + + // Удаление лишних строк. + Пока Индекс < Таблица.Количество() Цикл + Таблица.Удалить(Индекс); + КонецЦикла; + Иначе + Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(ИдентификаторРегламентногоЗадания)); + + Строки = Таблица.НайтиСтроки( + Новый Структура("Идентификатор", ИдентификаторРегламентногоЗадания)); + + Если Задание <> Неопределено + И Строки.Количество() > 0 Тогда + + ОбновитьСтрокуТаблицыРегламентныхЗаданий(Строки[0], Задание); + КонецЕсли; + КонецЕсли; + + Элементы.ТаблицаРегламентныеЗадания.Обновить(); + + ПозицияСкобки = СтрНайти(Элементы.РегламентныеЗадания.Заголовок, " ("); + Если ПозицияСкобки > 0 Тогда + Элементы.РегламентныеЗадания.Заголовок = Лев(Элементы.РегламентныеЗадания.Заголовок, ПозицияСкобки - 1); + КонецЕсли; + ЭлементовВСписке = ТаблицаРегламентныеЗадания.Количество(); + Если ЭлементовВСписке > 0 Тогда + Элементы.РегламентныеЗадания.Заголовок = Элементы.РегламентныеЗадания.Заголовок + " (" + Формат(ЭлементовВСписке, "ЧГ=") + ")"; + КонецЕсли; + + ОбновитьСписокВыбораРегламентногоЗадания(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСтрокуТаблицыРегламентныхЗаданий(Строка, Задание); + + ЗаполнитьЗначенияСвойств(Строка, Задание); + + // Уточнение наименования + Строка.Наименование = РегламентныеЗаданияСлужебный.ПредставлениеРегламентногоЗадания(Задание); + + // Установка Даты завершения и Состояния завершения по последней фоновой процедуре. + СвойстваПоследнегоФоновогоЗадания = РегламентныеЗаданияСлужебный + .ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); + + Строка.ИмяЗадания = Задание.Метаданные.Имя; + Если СвойстваПоследнегоФоновогоЗадания = Неопределено Тогда + + Строка.ДатаОкончания = ТекстНеОпределено; + Строка.СостояниеВыполнения = ТекстНеОпределено; + Иначе + Строка.ДатаОкончания = ?(ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Конец), + СвойстваПоследнегоФоновогоЗадания.Конец, + "<>"); + Строка.СостояниеВыполнения = СвойстваПоследнегоФоновогоЗадания.Состояние; + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьАвтоматическийПериод(Форма, ТекущаяДатаСеанса) + + Если Форма.ВидОтбораПоПериоду = 1 Тогда + Форма.ОтборПериодС = НачалоДня(ТекущаяДатаСеанса) - 3*3600; + Форма.ОтборПериодПо = НачалоДня(ТекущаяДатаСеанса) + 9*3600; + + ИначеЕсли Форма.ВидОтбораПоПериоду = 2 Тогда + Форма.ОтборПериодС = НачалоДня(ТекущаяДатаСеанса) - 24*3600; + Форма.ОтборПериодПо = КонецДня(Форма.ОтборПериодС); + + ИначеЕсли Форма.ВидОтбораПоПериоду = 3 Тогда + Форма.ОтборПериодС = НачалоДня(ТекущаяДатаСеанса); + Форма.ОтборПериодПо = КонецДня(Форма.ОтборПериодС); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьИспользованиеРегламентногоЗадания(Включено) + + Для каждого ВыделеннаяСтрока Из Элементы.ТаблицаРегламентныеЗадания.ВыделенныеСтроки Цикл + ТекущиеДанные = ТаблицаРегламентныеЗадания.НайтиПоИдентификатору(ВыделеннаяСтрока); + Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(ТекущиеДанные.Идентификатор); + Если Задание.Использование <> Включено Тогда + Задание.Использование = Включено; + Задание.Записать(); + ТекущиеДанные.Использование = Включено; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Фоновая загрузка фоновых заданий. + +&НаКлиенте +Процедура ОбновитьТаблицуФоновыхЗаданийНаКлиенте() + + Результат = ФормированиеТаблицыФоновыхЗаданийВФоне(); + + Если Не Результат.ЗаданиеВыполнено Тогда + Элементы.ГруппаШапка.Доступность = Ложь; + Элементы.СтраницыОтложеннаяЗагрузкаФоновыхЗаданий.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; + ПараметрыОбработчикаОжидания = Новый Структура; + ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); + ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина); + Иначе + ОбновитьТаблицуФоновыхЗаданий(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ФормированиеТаблицыФоновыхЗаданийВФоне() + + Отбор = ОтборФоновыхЗаданий(); + ПередаваемыеПараметры = Новый Структура; + ПередаваемыеПараметры.Вставить("Отбор", Отбор); + + Результат = ДлительныеОперации.ЗапуститьВыполнениеВФонеСлужебный( + УникальныйИдентификатор, + "РегламентныеЗаданияСлужебный.ТаблицаСвойствФоновыхЗаданийВФоне", + ПередаваемыеПараметры, + НСтр("ru = 'Регламентные задания. Обновление списка фоновых заданий'") + , , Ложь); + + АдресХранилища = Результат.АдресХранилища; + ИдентификаторЗадания = Результат.ИдентификаторЗадания; + + Если Результат.ЗаданиеВыполнено Тогда + ОбновитьТаблицуФоновыхЗаданий(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ОтборФоновыхЗаданий() + + // 1. Подготовка отбора. + Отбор = Новый Структура; + + // 1.1. Добавление отбора по состояниям. + МассивСостояний = Новый Массив; + + Если ОтборПоСостояниюАктивно Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.Активно); + КонецЕсли; + + Если ОтборПоСостояниюЗавершено Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.Завершено); + КонецЕсли; + + Если ОтборПоСостояниюЗавершеноАварийно Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.ЗавершеноАварийно); + КонецЕсли; + + Если ОтборПоСостояниюОтменено Тогда + МассивСостояний.Добавить(СостояниеФоновогоЗадания.Отменено); + КонецЕсли; + + Если МассивСостояний.Количество() <> 4 Тогда + Если МассивСостояний.Количество() = 1 Тогда + Отбор.Вставить("Состояние", МассивСостояний[0]); + Иначе + Отбор.Вставить("Состояние", МассивСостояний); + КонецЕсли; + КонецЕсли; + + // 1.2. Добавление отбора по регламентному заданию. + Если ОтбиратьПоРегламентномуЗаданию Тогда + Отбор.Вставить( + "ИдентификаторРегламентногоЗадания", + ?(РегламентноеЗаданиеДляОтбораИдентификатор = ПустойИдентификатор, + "", + РегламентноеЗаданиеДляОтбораИдентификатор)); + КонецЕсли; + + // 1.3. Добавление отбора по периоду. + Если ВидОтбораПоПериоду <> 0 Тогда + ОбновитьАвтоматическийПериод(ЭтотОбъект, ТекущаяДатаСеанса()); + Отбор.Вставить("Начало", ОтборПериодС); + Отбор.Вставить("Конец", ОтборПериодПо); + КонецЕсли; + + Возврат Отбор; + +КонецФункции + +&НаСервере +Процедура ОбновитьТаблицуФоновыхЗаданий(ФоноваяЗагрузка = Истина) + + // 2. Обновление списка фоновых заданий. + + Если ФоноваяЗагрузка Тогда + ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресХранилища); + ТекущаяТаблица = ДанныеИзХранилища.ТаблицаСвойств; + Иначе + Отбор = ОтборФоновыхЗаданий(); + ТекущаяТаблица = РегламентныеЗаданияСлужебный.ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор); + КонецЕсли; + + Таблица = ТаблицаФоновыеЗадания; + + Индекс = 0; + Для каждого Задание Из ТекущаяТаблица Цикл + + Если Индекс >= Таблица.Количество() + ИЛИ Таблица[Индекс].Идентификатор <> Задание.Идентификатор Тогда + // Вставка нового задания. + Обновляемое = Таблица.Вставить(Индекс); + // Установка уникального идентификатора. + Обновляемое.Идентификатор = Задание.Идентификатор; + Иначе + Обновляемое = Таблица[Индекс]; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(Обновляемое, Задание); + + // Установка наименования регламентного задания из коллекции ТаблицаРегламентныеЗадания. + Если ЗначениеЗаполнено(Обновляемое.ИдентификаторРегламентногоЗадания) Тогда + + Обновляемое.ИдентификаторРегламентногоЗадания + = Обновляемое.ИдентификаторРегламентногоЗадания; + + Строки = ТаблицаРегламентныеЗадания.НайтиСтроки( + Новый Структура("Идентификатор", Обновляемое.ИдентификаторРегламентногоЗадания)); + + Обновляемое.НаименованиеРегламентногоЗадания + = ?(Строки.Количество() = 0, НСтр("ru = '<не найдено>'"), Строки[0].Наименование); + Иначе + Обновляемое.НаименованиеРегламентногоЗадания = ТекстНеОпределено; + Обновляемое.ИдентификаторРегламентногоЗадания = ТекстНеОпределено; + КонецЕсли; + + // Получение информации об ошибках. + Обновляемое.СообщенияПользователюИОписаниеИнформацииОбОшибке + = РегламентныеЗаданияСлужебный.СообщенияИОписанияОшибокФоновогоЗадания( + Обновляемое.Идентификатор, Задание); + + // Увеличение индекса + Индекс = Индекс + 1; + КонецЦикла; + + // Удаление лишних строк. + Пока Индекс < Таблица.Количество() Цикл + Таблица.Удалить(Таблица.Количество()-1); + КонецЦикла; + + Элементы.ТаблицаФоновыеЗадания.Обновить(); + + ПозицияСкобки = СтрНайти(Элементы.ФоновыеЗадания.Заголовок, " ("); + Если ПозицияСкобки > 0 Тогда + Элементы.ФоновыеЗадания.Заголовок = Лев(Элементы.ФоновыеЗадания.Заголовок, ПозицияСкобки - 1); + КонецЕсли; + ЭлементовВСписке = ТаблицаФоновыеЗадания.Количество(); + Если ЭлементовВСписке > 0 Тогда + Элементы.ФоновыеЗадания.Заголовок = Элементы.ФоновыеЗадания.Заголовок + " (" + Формат(ЭлементовВСписке, "ЧГ=") + ")"; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПроверитьВыполнениеЗадания() + + Попытка + Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда + ОбновитьТаблицуФоновыхЗаданий(); + Элементы.ГруппаШапка.Доступность = Истина; + Элементы.СтраницыОтложеннаяЗагрузкаФоновыхЗаданий.ТекущаяСтраница = Элементы.СтраницаФоновыеЗадания; + Иначе + ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); + ПодключитьОбработчикОжидания( + "Подключаемый_ПроверитьВыполнениеЗадания", + ПараметрыОбработчикаОжидания.ТекущийИнтервал, + Истина); + КонецЕсли; + Исключение + Элементы.ГруппаШапка.Доступность = Истина; + Элементы.СтраницыОтложеннаяЗагрузкаФоновыхЗаданий.ТекущаяСтраница = Элементы.СтраницаФоновыеЗадания; + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗакрытииНаСервере() + ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания); +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ЗаданиеВыполнено(ИдентификаторЗадания) + Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания); +КонецФункции + +#КонецОбласти diff --git a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Module.bsl b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Module.bsl index 8b78c4f..f5d3c71 100644 --- a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Module.bsl +++ b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ФоновоеЗадание/Module.bsl @@ -1,61 +1,68 @@ - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Если Параметры.СвойстваФоновогоЗадания = Неопределено Тогда - - СвойстваФоновогоЗадания = РегламентныеЗаданияСлужебный - .ПолучитьСвойстваФоновогоЗадания(Параметры.Идентификатор); - - Если СвойстваФоновогоЗадания = Неопределено Тогда - ВызватьИсключение(НСтр("ru = 'Фоновое задание не найдено.'")); - КонецЕсли; - - СообщенияПользователюИОписаниеИнформацииОбОшибке = РегламентныеЗаданияСлужебный - .СообщенияИОписанияОшибокФоновогоЗадания(Параметры.Идентификатор); - - Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания) Тогда - - ИдентификаторРегламентногоЗадания - = СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания; - - НаименованиеРегламентногоЗадания - = РегламентныеЗаданияСлужебный.ПредставлениеРегламентногоЗадания( - СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания); - Иначе - НаименованиеРегламентногоЗадания = РегламентныеЗаданияСлужебный.ТекстНеОпределено(); - ИдентификаторРегламентногоЗадания = РегламентныеЗаданияСлужебный.ТекстНеОпределено(); - КонецЕсли; - Иначе - СвойстваФоновогоЗадания = Параметры.СвойстваФоновогоЗадания; - ЗаполнитьЗначенияСвойств( - ЭтотОбъект, - СвойстваФоновогоЗадания, - "СообщенияПользователюИОписаниеИнформацииОбОшибке, - |ИдентификаторРегламентногоЗадания, - |НаименованиеРегламентногоЗадания"); - КонецЕсли; - - ЗаполнитьЗначенияСвойств( - ЭтотОбъект, - СвойстваФоновогоЗадания, - "Идентификатор, - |Ключ, - |Наименование, - |Начало, - |Конец, - |Расположение, - |Состояние, - |ИмяМетода"); - - СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект); - -КонецПроцедуры - -#КонецОбласти +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017-2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by-sa/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + Если Параметры.СвойстваФоновогоЗадания = Неопределено Тогда + + СвойстваФоновогоЗадания = РегламентныеЗаданияСлужебный + .ПолучитьСвойстваФоновогоЗадания(Параметры.Идентификатор); + + Если СвойстваФоновогоЗадания = Неопределено Тогда + ВызватьИсключение(НСтр("ru = 'Фоновое задание не найдено.'")); + КонецЕсли; + + СообщенияПользователюИОписаниеИнформацииОбОшибке = РегламентныеЗаданияСлужебный + .СообщенияИОписанияОшибокФоновогоЗадания(Параметры.Идентификатор); + + Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания) Тогда + + ИдентификаторРегламентногоЗадания + = СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания; + + НаименованиеРегламентногоЗадания + = РегламентныеЗаданияСлужебный.ПредставлениеРегламентногоЗадания( + СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания); + Иначе + НаименованиеРегламентногоЗадания = РегламентныеЗаданияСлужебный.ТекстНеОпределено(); + ИдентификаторРегламентногоЗадания = РегламентныеЗаданияСлужебный.ТекстНеОпределено(); + КонецЕсли; + Иначе + СвойстваФоновогоЗадания = Параметры.СвойстваФоновогоЗадания; + ЗаполнитьЗначенияСвойств( + ЭтотОбъект, + СвойстваФоновогоЗадания, + "СообщенияПользователюИОписаниеИнформацииОбОшибке, + |ИдентификаторРегламентногоЗадания, + |НаименованиеРегламентногоЗадания"); + КонецЕсли; + + ЗаполнитьЗначенияСвойств( + ЭтотОбъект, + СвойстваФоновогоЗадания, + "Идентификатор, + |Ключ, + |Наименование, + |Начало, + |Конец, + |Расположение, + |Состояние, + |ИмяМетода"); + + СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти diff --git a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/ManagerModule.bsl b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/ManagerModule.bsl deleted file mode 100644 index e69de29..0000000 diff --git a/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/ObjectModule.bsl b/GitConverter/src/DataProcessors/РегламентныеИФоновыеЗадания/ObjectModule.bsl deleted file mode 100644 index e69de29..0000000 diff --git a/GitConverter/src/InformationRegisters/ИнформацияПользователей/RecordSetModule.bsl b/GitConverter/src/InformationRegisters/ИнформацияПользователей/RecordSetModule.bsl deleted file mode 100644 index e69de29..0000000 diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..4e002f8 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,173 @@ +## creative commons + +# Attribution-ShareAlike 4.0 International + +Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +### Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors). + +* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees). + +## Creative Commons Attribution-ShareAlike 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions. + +a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + +b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + +c. __BY-SA Compatible License__ means a license listed at [creativecommons.org/compatiblelicenses](http://creativecommons.org/compatiblelicenses), approved by Creative Commons as essentially the equivalent of this Public License. + +d. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + +e. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + +f. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + +g. __License Elements__ means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. + +h. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + +i. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + +j. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License. + +k. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + +l. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + +m. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +### Section 2 – Scope. + +a. ___License grant.___ + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + + 2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. __Term.__ The term of this Public License is specified in Section 6(a). + + 4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. __Downstream recipients.__ + + A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. __Additional offer from the Licensor – Adapted Material.__ Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + + C. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + +b. ___Other rights.___ + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +### Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +a. ___Attribution.___ + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + +b. ___ShareAlike.___ + +In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + +1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. + +2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + +3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +### Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + +b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and + +c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability. + +a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__ + +b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__ + +c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination. + +a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + +b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + +c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + +d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions. + +a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + +b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation. + +a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + +b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + +c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + +d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +> Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the [CC0 Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/legalcode). Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. +> +> Creative Commons may be contacted at creativecommons.org. \ No newline at end of file diff --git a/README.md b/README.md index 1e79d85..43b41e7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Конфигурация предназначена для односторонней синхронизации хранилища конфигурации "1С:Предприятия" с репозиторием Git и последующим переходом на разработку в [1C:Enterprise Development Tools (1C:EDT)](http://v8.1c.ru/overview/release_EDT_17/) с сохранением истории. -### Основные возможности +## Основные возможности * Конвертирование существующего хранилища конфигурации 1С в репозиторий Git в формате 1C:EDT * Обновлять изменения из хранилища 1С в репозиторий Git @@ -13,23 +13,62 @@ * Выгружать только изменения конфигурации. Доступно для Платформы 8.3.10 и выше, требуется использовать "очереди" * Создание сквозной история изменений для "хранилищ исправительных версий" если вы используете [Технологию разветвленной разработки конфигураций](https://its.1c.ru/db/v8std/content/2149184358/hdoc) или аналогичный процесс - хранилище версии можно загружать в "ветку" Git, получив сквозную историю в ветке. +### Возможности добавляемые расширениями + +Сторонние расширения: +* [Конвертирование истории "Обычного приложения"](https://github.com/marmyshev/GitConverter-ordinary) +* `<Ждем ваших pull-request'ов>` + ### Необходимые компоненты -* Конфигурацию можно запустить, используя 1C:Enterprise Development Tools 1.8 (https://releases.1c.ru/project/DevelopmentTools10) +* Конфигурацию можно запустить, используя 1C:Enterprise Development Tools 1.9 (https://releases.1c.ru/project/DevelopmentTools10) * Платформа 1С:Предприятия 8.3.12 и выше (https://releases.1c.ru/project/Platform83) * СУБД, поддерживаемая 1С:Предприятием * OS Windows 7 или выше, ОС Linux и macOS - в бета-режиме. +### Сборка и установка проекта + +Выполните команды в Linux: + +```bash +git clone https://github.com/1C-Company/GitConverter.git +ring edt workspace export --workspace-location "${PWD}/w" --project "${PWD}/GitConverter/GitConverter" --configuration-files "${PWD}/xml" +1cv8 CREATEINFOBASE File=${PWD}/db +1cv8 DESIGNER /WA- /DisableStartupDialogs /IBConnectionString File="${PWD}/db" /LoadConfigFromFiles "${PWD}/xml" /UpdateDBCfg +1cv8 DESIGNER /WA- /DisableStartupDialogs /IBConnectionString File="${PWD}/db" /CreateDistributionFiles -cffile "${PWD}/1cv8.cf" +``` + +Выполните команды в Windows, указав корректный путь к версии 1С: + +```cmd +git clone https://github.com/1C-Company/GitConverter.git +ring edt workspace export --workspace-location "%CD%/w" --project "%CD%/GitConverter/GitConverter" --configuration-files "%CD%/xml" +"C:\Program files\1cv8\8.3.12.1714\bin\1cv8" CREATEINFOBASE File=%CD%/db +"C:\Program files\1cv8\8.3.12.1714\bin\1cv8" DESIGNER /WA- /DisableStartupDialogs /IBConnectionString File="%CD%/db" /LoadConfigFromFiles "%CD%/xml" /UpdateDBCfg +"C:\Program files\1cv8\8.3.12.1714\bin\1cv8" DESIGNER /WA- /DisableStartupDialogs /IBConnectionString File="%CD%/db" /CreateDistributionFiles -cffile "%CD%/1cv8.cf" +``` + ## Начальная настройка [Без настройки - никак. См. Wiki](https://github.com/1C-Company/GitConverter/wiki/Начальная-настройка) +## Документация + +* Справка в конфигурации 1С:ГитКонвертер +* Подсказки к полям и командам в конфигурации +* Документация в [Wiki](https://github.com/1C-Company/GitConverter/wiki) и [сценарии применения конфигурации](https://github.com/1C-Company/GitConverter/wiki/Сценарии-применения) + +### Если что-то пошло не так (FAQ) + +[См. примеры Wiki](https://github.com/1C-Company/GitConverter/wiki/Если-что-то-пошло-не-так-FAQ) + +## Участие в проекте + +Добро пожаловать! [См. правила в соответствующем разделе](CONTRIBUTING.md) + ## Обновление с версии 1.0.4 **Внимание!** Конвертация хранилища 1С в формат выгрузки xml 1С:Предприятия является [устаревшей функциональностью](https://github.com/1C-Company/GitConverter/wiki/Обновление-с-версии-1.0.4) и не доступна для новых настроек конвертации хранилища. Текущие настройки синхронизации хранилища, конвертирующие в формат выгрузки xml 1С:Предприятия будут работать корректно, но рекомендуется выполнить разовую конвертацию в формат 1C:EDT и продолжить синхронизацию в этом формате. [См. Wiki](https://github.com/1C-Company/GitConverter/wiki/Конвертация-выгрузки-1С-Предприятия-в-формат-1C-Enterprise-Development-Tools) -## Если что-то пошло не так (FAQ) - -[См. примеры Wiki](https://github.com/1C-Company/GitConverter/wiki/Если-что-то-пошло-не-так-FAQ) - +Функциональность конвертирования в формат xml 1С:Предприятия **будет удалена в 1.0.6**.