diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl index 1ac4c1dea..021bb0563 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl @@ -14,7 +14,7 @@ // Для нового объекта выполняем код инициализации формы в ПриСозданииНаСервере. // Для существующего - в ПриЧтенииНаСервере. Если Объект.Ссылка.Пустая() Тогда - ИнициализацияФормы(); + ИнициализироватьФорму(); КонецЕсли; ТекущийПользователь = Пользователи.ТекущийПользователь(); @@ -89,7 +89,7 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - ИнициализацияФормы(); + ИнициализироватьФорму(); // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -251,7 +251,7 @@ #Область СлужебныеПроцедурыИФункции &НаСервере -Процедура ИнициализацияФормы() +Процедура ИнициализироватьФорму() НачальныйПризнакВыполнения = Объект.Выполнена; ПрочитатьРеквизитыБизнесПроцесса(); diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl index ded5716a4..6bebd2c63 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl @@ -14,7 +14,7 @@ // Для нового объекта выполняем код инициализации формы в ПриСозданииНаСервере. // Для существующего - в ПриЧтенииНаСервере. Если Объект.Ссылка.Пустая() Тогда - ИнициализацияФормы(); + ИнициализироватьФорму(); КонецЕсли; ТекущийПользователь = Пользователи.ТекущийПользователь(); @@ -77,7 +77,7 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - ИнициализацияФормы(); + ИнициализироватьФорму(); // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -262,7 +262,7 @@ #Область СлужебныеПроцедурыИФункции &НаСервере -Процедура ИнициализацияФормы() +Процедура ИнициализироватьФорму() НачальныйПризнакВыполнения = Объект.Выполнена; ПрочитатьРеквизитыБизнесПроцесса(); diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl index 3d5cdfe87..ecfb92719 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl @@ -27,7 +27,7 @@ // Для нового объекта выполняем код инициализации формы в ПриСозданииНаСервере. // Для существующего - в ПриЧтенииНаСервере. Если Объект.Ссылка.Пустая() Тогда - ИнициализацияФормы(); + ИнициализироватьФорму(); КонецЕсли; // СтандартныеПодсистемы.РаботаСФайлами @@ -58,7 +58,7 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - ИнициализацияФормы(); + ИнициализироватьФорму(); // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда @@ -489,7 +489,7 @@ КонецПроцедуры &НаСервере -Процедура ИнициализацияФормы() +Процедура ИнициализироватьФорму() НачальныйПризнакСтарта = Объект.Стартован; diff --git a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl index 47e0bbd48..c90303c3d 100644 --- a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl +++ b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl @@ -348,12 +348,10 @@ "РезультатВыполнения,ДатаИсполнения,Исполнитель,Выполнена"); СтрокаФормат = ?(ЗадачаДанные.Выполнена, - "%1, %2 " + НСтр("ru = 'выполнил(а) задачу'") + ": - |%3 - |", - "%1, %2 " + НСтр("ru = 'отклонил(а) задачу'") + ": - |%3 - |"); + НСтр("ru = '%1, %2 выполнил(а) задачу: + |%3'") + Символы.ПС, + НСтр("ru = '%1, %2 отклонил(а) задачу: + |%3'") + Символы.ПС); Комментарий = СокрЛП(ЗадачаДанные.РезультатВыполнения); Комментарий = ?(ПустаяСтрока(Комментарий), "", Комментарий + Символы.ПС); @@ -366,17 +364,15 @@ Функция РезультатВыполненияТочкиПроверить(Знач ЗадачаСсылка) Если НЕ Подтверждено Тогда - СтрокаФормат = "%1, %2 " + НСтр("ru = 'вернул(а) задачу на доработку'") + ": - |%3 - |"; + СтрокаФормат = НСтр("ru = '%1, %2 вернул(а) задачу на доработку: + |%3'") + Символы.ПС; + Иначе СтрокаФормат = ?(Выполнено, - "%1, %2 " + НСтр("ru = 'подтвердил(а) выполнение задачи'") + ": - |%3 - |", - "%1, %2 " + НСтр("ru = 'подтвердил(а) отмену задачи'") + ": - |%3 - |"); + НСтр("ru = '%1, %2 подтвердил(а) выполнение задачи: + |%3'") + Символы.ПС, + НСтр("ru = '%1, %2 подтвердил(а) отмену задачи: + |%3'") + Символы.ПС); КонецЕсли; ЗадачаДанные = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка, diff --git a/SSL/src/BusinessProcesses/Задание/Задание.mdo b/SSL/src/BusinessProcesses/Задание/Задание.mdo index 3b1de99ec..55d42bb6c 100644 --- a/SSL/src/BusinessProcesses/Задание/Задание.mdo +++ b/SSL/src/BusinessProcesses/Задание/Задание.mdo @@ -270,7 +270,7 @@ ru Задание - Описание задания + АПК:58 - Описание задания String diff --git a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Module.bsl index 86ce085f2..9e1ebb912 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Module.bsl @@ -76,7 +76,7 @@ #КонецОбласти -#Область ОбработчикиЭлементовШапкиФормы +#Область ОбработчикиСобытийЭлементовШапкиФормы &НаКлиенте Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form index 2175463cf..6ffc5428a 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form @@ -14,6 +14,7 @@ СтрокаПоиска + None ru Поиск слов в наименовании и описании отчета а также в наименованиях настроек отчета. @@ -57,6 +58,10 @@ true true Normal + + ru + Наименование, поле или автор отчета + @@ -2242,6 +2247,7 @@ ВыполнитьПоиск + Picture DontUse Auto diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl index f92e3739d..b4e02ee9e 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl @@ -117,8 +117,14 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = ВариантыОтчетовКлиент.ИмяСобытияИзменениеВарианта() Или ИмяСобытия = "Запись_НаборКонстант" Тогда + ДеревоПодсистемТекущаяСтрока = -1; ПодключитьОбработчикОжидания("ДеревоПодсистемОбработчикАктивизацииСтроки", 0.1, Истина); + + ИначеЕсли ИмяСобытия = ВариантыОтчетовКлиент.ИмяСобытияОбновленияВариантовОтчетовИзФайлов() Тогда + + УстановитьОтборПоОбновленнымИзФайловОтчетов(Параметр); + КонецЕсли; КонецПроцедуры @@ -254,40 +260,40 @@ &НаКлиенте Процедура СохранитьВариантОтчетаВФайл(Команда) - ВариантОтчета = Элементы.Список.ТекущаяСтрока; - Если Не ЗначениеЗаполнено(ВариантОтчета) Тогда + ВыбранныеВариантыОтчетов = Элементы.Список.ВыделенныеСтроки; + + Если ВыбранныеВариантыОтчетов.Количество() = 0 Тогда Возврат; КонецЕсли; - ПараметрыСохранения = Новый Структура(ВариантыОтчетовКлиентСервер.СвойстваСохраненияВариантаОтчета()); - ПараметрыСохранения.ВариантОтчета = ВариантОтчета; - ОткрытьФорму( "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.СохранениеВариантаОтчетаВФайл", - ПараметрыСохранения, + Новый Структура("ВыбранныеВариантыОтчетов", ВыбранныеВариантыОтчетов), ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ОбновитьВариантОтчетаИзФайла(Команда) - Ссылка = Элементы.Список.ТекущаяСтрока; + ВыбранныеВариантыОтчетов = Элементы.Список.ВыделенныеСтроки; - Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.ВариантыОтчетов") Тогда + Если ВыбранныеВариантыОтчетов.Количество() = 0 Тогда Возврат; КонецЕсли; СвойстваВариантаОтчета = ВариантыОтчетовКлиент.СвойстваВариантаОтчетаОснования(); - СвойстваВариантаОтчета.Ссылка = Ссылка; - СвойстваВариантаОтчета.ПредставлениеВарианта = Строка(Ссылка); - - Обработчик = Новый ОписаниеОповещения( - "ОбновитьВариантОтчетаИзФайла", ВариантыОтчетовКлиент, СвойстваВариантаОтчета); + СвойстваВариантаОтчета.Ссылка = ВыбранныеВариантыОтчетов[0]; + СвойстваВариантаОтчета.ПредставлениеВарианта = Строка(ВыбранныеВариантыОтчетов[0]); ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла(); ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Архив ZIP (*.zip)|*.zip'"); ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор; - ФайловаяСистемаКлиент.ЗагрузитьФайл(Обработчик, ПараметрыЗагрузки); + Обработчик = Новый ОписаниеОповещения( + ВариантыОтчетовКлиент.ИмяСобытияОбновленияВариантовОтчетовИзФайлов(), + ВариантыОтчетовКлиент, + СвойстваВариантаОтчета); + + ФайловаяСистемаКлиент.ЗагрузитьФайлы(Обработчик, ПараметрыЗагрузки); КонецПроцедуры #КонецОбласти @@ -347,12 +353,12 @@ // Строка - Число // // Возвращаемое значение: -// Неопределено -// Структура: -// * Варианты - Структура: -// ** Массив - Массив из ДанныеФормыЭлементДерева -// ** Всего - Число -// ** Представление - Строка +// - Неопределено +// - Структура: +// * Варианты - Структура: +// ** Массив - Массив из ДанныеФормыЭлементДерева +// ** Всего - Число +// ** Представление - Строка // * Действие - Строка // * Приемник - см. СвойстваДанныхСтроки // * Источник - см. СвойстваДанныхСтроки @@ -448,14 +454,7 @@ // // Параметры: // Ответ - КодВозвратаДиалога -// ПараметрыРазмещения - Структура: -// * Варианты - Структура: -// ** Массив - Массив из ДанныеФормыЭлементДерева -// ** Всего - Число -// ** Представление - Строка -// * Действие - Строка -// * Приемник - ДанныеФормыЭлементДерева -// * Источник - ДанныеФормыЭлементДерева +// ПараметрыРазмещения - см. ПараметрыРазмещения // &НаКлиенте Процедура ДеревоПодсистемПеретаскиваниеЗавершение(Ответ, ПараметрыРазмещения) Экспорт @@ -837,4 +836,33 @@ КонецФункции +// Параметры: +// ОписаниеВариантовОтчетов - см. ВариантыОтчетов.СвойстваВариантовОтчетовИзФайлов +// +&НаКлиенте +Процедура УстановитьОтборПоОбновленнымИзФайловОтчетов(ОписаниеВариантовОтчетов) + + ОбновленныеВариантыОтчетов = Новый СписокЗначений; + + Для Каждого ОписаниеВариантаОтчета Из ОписаниеВариантовОтчетов Цикл + ОбновленныеВариантыОтчетов.Добавить(ОписаниеВариантаОтчета.Ссылка); + КонецЦикла; + + ДочерниеПодсистемы = ДеревоПодсистем.ПолучитьЭлементы(); + + Если ДочерниеПодсистемы.Количество() > 0 Тогда + Элементы.ДеревоПодсистем.ТекущаяСтрока = ДочерниеПодсистемы[0].ПолучитьИдентификатор(); + КонецЕсли; + + ОбновитьСодержимоеСписка(); + + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( + Список, + "Ссылка", + ОбновленныеВариантыОтчетов, + ВидСравненияКомпоновкиДанных.ВСписке,,, + РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный); + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl index 2092fe136..b07e685b7 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl @@ -144,7 +144,7 @@ КонецЕсли; КонецЦикла; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Невозможно перейти в списку для %1'"), ВидКонтактнойИнформацииСсылка); + НСтр("ru = 'Невозможно перейти к списку %1'"), ВидКонтактнойИнформацииСсылка); КонецФункции diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl index a4f35b8b6..ce18c87e2 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl @@ -157,6 +157,14 @@ Отказ = Истина; КонецЕсли; + Если ВидКИСТакимНаименованиемУжеСуществует(ТекущийОбъект) Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вид контактной информации с наименованием %1 уже существует. Необходимо задать другое наименование.'"), + Строка(ТекущийОбъект.Наименование)); + + КонецЕсли; + // Формирование идентификатора для формул дополнительного реквизита (сведения). Если Не ЗначениеЗаполнено(ТекущийОбъект.ИдентификаторДляФормул) Или ПараметрыЗаписи.Свойство("КогдаИдентификаторДляФормулУжеИспользуется") Тогда @@ -471,6 +479,31 @@ КонецПроцедуры +&НаСервереБезКонтекста +Функция ВидКИСТакимНаименованиемУжеСуществует(ТекущийОбъект) + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ВидыКонтактнойИнформации.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации + |ГДЕ + | ВидыКонтактнойИнформации.Наименование = &Наименование + | И ВидыКонтактнойИнформации.Родитель = &Родитель + | И ВидыКонтактнойИнформации.Ссылка <> &Ссылка"; + + Запрос.УстановитьПараметр("Наименование", ТекущийОбъект.Наименование); + Запрос.УстановитьПараметр("Родитель", ТекущийОбъект.Родитель); + Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка); + + РезультатЗапроса = Запрос.Выполнить(); + + Возврат Не РезультатЗапроса.Пустой(); + +КонецФункции + + &НаСервереБезКонтекста Функция ИдентификаторДляФормулУжеИспользуется(Знач ИдентификаторДляФормул, Знач ТекущийВидКонтактнойИнформации, Знач Родитель) diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl index 72ee27042..f58f7092a 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl @@ -51,29 +51,14 @@ // СтандартныеПодсистемы.ПоискИУдалениеДублей -// Анализирует пары ссылок справочника на возможность замены одной на другую -// во всех местах использования с прикладной точки зрения. -// Проверки на запрет замены групп и ссылок разных типов производятся автоматически при начале замены. -// -// Параметры: -// ПарыЗамен - Соответствие из КлючИЗначение: -// * Ключ - ЛюбаяСсылка - что будет заменено -// * Значение - ЛюбаяСсылка - на что будет заменено -// Параметры - Структура - набор флагов, описывающих действие с заменяемыми элементами. -// Содержит необязательные реквизиты: -// * СпособУдаления - Строка - может принимать значения: -// "Непосредственно" - Если после замены ссылка нигде не используется, -// то она будет удалена непосредственно -// "Пометка" - Если после замены ссылка не используется, то -// она будет помечена на удаление. -// Любые другие значения говорят о том, что заменяемая ссылка не будет изменена. -// +// Параметры: +// ПарыЗамен - см. ПоискИУдалениеДублейПереопределяемый.ПриОпределенииВозможностиЗаменыЭлементов.ПарыЗамен +// ПараметрыЗамены - см. ПоискИУдалениеДублейПереопределяемый.ПриОпределенииВозможностиЗаменыЭлементов.ПараметрыЗамены +// // Возвращаемое значение: -// Соответствие из КлючИЗначение: -// * Ключ - ЛюбаяСсылка - исходная ссылка -// * Значение - Строка - описание, почему замена недопустима. Если все замены допустимы, то возвращается пустое соответствие +// см. ПоискИУдалениеДублейПереопределяемый.ПриОпределенииВозможностиЗаменыЭлементов.НедопустимыеЗамены // -Функция ВозможностьЗаменыЭлементов(Знач ПарыЗамен, Знач Параметры = Неопределено) Экспорт +Функция ВозможностьЗаменыЭлементов(Знач ПарыЗамен, Знач ПараметрыЗамены = Неопределено) Экспорт Результат = Новый Соответствие; Для Каждого КлючЗначение Из ПарыЗамен Цикл @@ -97,35 +82,10 @@ Возврат Результат; КонецФункции -// Вызывается для определения прикладных параметров поиска дублей. +// Параметры: +// ПараметрыПоиска - см. ПоискИУдалениеДублейПереопределяемый.ПриОпределенииПараметровПоискаДублей.ПараметрыПоиска +// ДополнительныеПараметры - см. ПоискИУдалениеДублейПереопределяемый.ПриОпределенииПараметровПоискаДублей.ДополнительныеПараметры // -// Параметры: -// -// ПараметрыПоиска - Структура - предлагаемые параметры поиска. Содержит поля: -// -// * ПравилаПоиска - ТаблицаЗначений - предлагаемые правила сравнения для объектов. -// Может быть изменена для установки новых вариантов. Содержит колонки: -// ** Реквизит - Строка - имя реквизита для сравнения. -// ** Правило - Строка - правило сравнения: "Равно" - сравнение по равенству, "Подобно" -подобие строк, -// "" - пустая строка - не сравнивать. -// -// * КомпоновщикОтбора - КомпоновщикНастроекКомпоновкиДанных - инициализированный компоновщик для -// предварительного отбора. Может быть изменен, например, для -// усиления отборов. -// -// * ОграниченияСравнения - Массив - предназначен для заполнения описания прикладных правил-ограничений. -// Должен быть дополнен структурами с полями: -// ** Представление - Строка - описание правила-ограничения для пользователя. -// ** ДополнительныеПоля - Строка - список дополнительных реквизитов запятую, необходимых для -// дополнительного анализа. -// -// * КоличествоЭлементовДляСравнения - Число - количество кандидатов в дубли, передаваемых одним вызовом -// обработчику. -// -// ДополнительныеПараметры - Произвольный - значение, переданное при вызове программного интерфейса -// ОбщегоНазначения.НайтиДублиЭлементов. -// При вызове пользователем из обработки "ПоискИЗаменаДублей" равно Неопределено. -// Процедура ПараметрыПоискаДублей(ПараметрыПоиска, ДополнительныеПараметры = Неопределено) Экспорт Ограничение = Новый Структура; @@ -162,6 +122,8 @@ #Область ОбработчикиСобытий +// АПК:362-выкл Проектное решение + Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда @@ -176,10 +138,80 @@ #КонецЕсли КонецПроцедуры +// АПК:362-вкл + #КонецОбласти #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +#Область СлужебныйПрограммныйИнтерфейс + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + + Настройки.ПриНачальномЗаполненииЭлемента = Ложь; + +КонецПроцедуры + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "СправочникПользователи"; + Элемент.Наименование = НСтр("ru = 'Контактная информация справочника ""Пользователи""'"); + Элемент.ЭтоГруппа = Истина; + Элемент.Используется = Истина; + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "EmailПользователя"; + Элемент.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты; + Элемент.Наименование = НСтр("ru = 'Электронная почта'"); + Элемент.МожноИзменятьСпособРедактирования = Истина; + Элемент.РазрешитьВводНесколькихЗначений = Истина; + Элемент.Родитель = Справочники.ВидыКонтактнойИнформации.СправочникПользователи; + Элемент.ИдентификаторДляФормул = "ЭлектроннаяПочта"; + Элемент.ВидРедактирования = "ПолеВвода"; + Элемент.Используется = Истина; + Элемент.РеквизитДопУпорядочивания = 2; + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "ТелефонПользователя"; + Элемент.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон; + Элемент.Наименование = НСтр("ru = 'Телефон'"); + Элемент.МожноИзменятьСпособРедактирования = Истина; + Элемент.РазрешитьВводНесколькихЗначений = Истина; + Элемент.Родитель = Справочники.ВидыКонтактнойИнформации.СправочникПользователи; + Элемент.ИдентификаторДляФормул = "Телефон"; + Элемент.Используется = Истина; + Элемент.ВидРедактирования = "ПолеВводаИДиалог"; + Элемент.РеквизитДопУпорядочивания = 1; + +КонецПроцедуры + +// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлемента +// +// Параметры: +// Объект - СправочникОбъект.ВидыКонтактнойИнформации - заполняемый объект. +// Данные - СтрокаТаблицыЗначений - данные заполнения объекта. +// ДополнительныеПараметры - Структура: +// * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов. +// +Процедура ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры) Экспорт + +КонецПроцедуры + +#КонецОбласти + #Область СлужебныеПроцедурыИФункции #Область ИдентификаторДляФормул @@ -475,8 +507,16 @@ ОбъектовОбработано = 0; Пока ВидКонтактнойИнформацииСсылка.Следующий() Цикл + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ВидыКонтактнойИнформации"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВидКонтактнойИнформацииСсылка.Ссылка); + НачатьТранзакцию(); Попытка + + Блокировка.Заблокировать(); + ВидКонтактнойИнформации = ВидКонтактнойИнформацииСсылка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.ВидыКонтактнойИнформации // Исправление наименований на разных языках @@ -580,5 +620,4 @@ #КонецОбласти - #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl index 04b1ae3b4..96d30de6a 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl @@ -5,63 +5,61 @@ // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область ОбработчикиСобытийФормы &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если ТипЗнч(Параметры.ОбновляемыеКомпоненты) <> Тип("Массив") - Или Параметры.ОбновляемыеКомпоненты.Количество() = 0 Тогда + + Если ТипЗнч(Параметры.ОбновляемыеКомпоненты) <> Тип("Массив") Или Параметры.ОбновляемыеКомпоненты.Количество() = 0 Тогда ВызватьИсключение НСтр("ru = 'Некорректное значение параметра формы ОбновляемыеКомпоненты.'"); КонецЕсли; - + ДанныеАутентификацииПорталаСохранены = ДанныеАутентификацииПорталаСохранены(); ДоступнаЗагрузкаСПортала = ВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаСПортала(); - + ТекстПояснения = ""; ПредложитьОбновление = Ложь; - РеквизитыКомпонент = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(Параметры.ОбновляемыеКомпоненты, "Идентификатор, Версия, ОбновлятьСПортала1СИТС"); - Для Каждого ОбновляемаяКомпонента Из Параметры.ОбновляемыеКомпоненты Цикл + ПараметрОбновляемыеКомпоненты = Параметры.ОбновляемыеКомпоненты; // Массив из СправочникСсылка.ВнешниеКомпоненты + РеквизитыКомпонент = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(ПараметрОбновляемыеКомпоненты, + "Идентификатор, Версия, ОбновлятьСПортала1СИТС"); + Для Каждого ОбновляемаяКомпонента Из ПараметрОбновляемыеКомпоненты Цикл Реквизиты = РеквизитыКомпонент[ОбновляемаяКомпонента]; - ТекстПояснения = ТекстПояснения - + ВнешниеКомпонентыСлужебный.ПредставлениеКомпоненты(Реквизиты.Идентификатор, Реквизиты. Версия) - + ?(Реквизиты.ОбновлятьСПортала1СИТС, "", " - " + НСтр("ru = 'обновление отключено'") + ".") - + Символы.ПС; - + ТекстПояснения = ТекстПояснения + ВнешниеКомпонентыСлужебный.ПредставлениеКомпоненты(Реквизиты.Идентификатор, + Реквизиты.Версия) + ?(Реквизиты.ОбновлятьСПортала1СИТС, "", " - " + НСтр("ru = 'обновление отключено'") + + ".") + Символы.ПС; + ПредложитьОбновление = ПредложитьОбновление Или Реквизиты.ОбновлятьСПортала1СИТС; - Если Реквизиты.ОбновлятьСПортала1СИТС Тогда + Если Реквизиты.ОбновлятьСПортала1СИТС Тогда ОбновляемыеКомпоненты.Добавить(ОбновляемаяКомпонента); КонецЕсли; КонецЦикла; - - Если ПредложитьОбновление Тогда - + + Если ПредложитьОбновление Тогда + Элементы.ДекорацияПояснение.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 - |Проверить и загрузить обновление компоненты?'"), - ТекстПояснения); - + |Проверить и загрузить обновление компоненты?'"), ТекстПояснения); + Элементы.ПодключитьИнтернетПоддержку.Видимость = Не ДанныеАутентификацииПорталаСохранены; Элементы.Закрыть.Видимость = Ложь; - - Иначе + + Иначе Элементы.ДекорацияПояснение.Заголовок = ТекстПояснения; Элементы.ПодключитьИнтернетПоддержку.Видимость = Ложь; Элементы.Загрузить.Видимость = Ложь; Элементы.Отмена.Видимость = Ложь; Элементы.Закрыть.Видимость = Истина; КонецЕсли; - + КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - + Если Не ДоступнаЗагрузкаСПортала Тогда Отказ = Истина; КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -70,40 +68,41 @@ &НаКлиенте Процедура ПодключитьИнтернетПоддержку(Команда = Неопределено) - + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда - МодульИнтернетПоддержкаПользователейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиент"); + МодульИнтернетПоддержкаПользователейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( + "ИнтернетПоддержкаПользователейКлиент"); Оповещение = Новый ОписаниеОповещения("ПослеПодключенияИнтернетПоддержки", ЭтотОбъект); МодульИнтернетПоддержкаПользователейКлиент.ПодключитьИнтернетПоддержкуПользователей(Оповещение, ЭтотОбъект); КонецЕсли; - + КонецПроцедуры &НаКлиенте Процедура Загрузить(Команда) - - Если Не ДанныеАутентификацииПорталаСохранены Тогда + + Если Не ДанныеАутентификацииПорталаСохранены Тогда ПодключитьИнтернетПоддержку(); Возврат; КонецЕсли; - + Элементы.Загрузить.Доступность = Ложь; Элементы.Страницы.ТекущаяСтраница = Элементы.ДлительнаяОперация; - + ДлительнаяОперация = НачатьОбновлениеКомпонентСПортала(); - - Если ДлительнаяОперация = Неопределено Тогда + + Если ДлительнаяОперация = Неопределено Тогда КраткоеПредставлениеОшибки = НСтр("ru = 'Не удалось создать фоновое задание обновления компоненты.'"); Элементы.Страницы.ТекущаяСтраница = Элементы.Ошибка; КонецЕсли; - + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); ПараметрыОжидания.ФормаВладелец = ЭтотОбъект; ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; - + Оповещение = Новый ОписаниеОповещения("ПослеОбновленияКомпонентСПортала", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); - + КонецПроцедуры #КонецОбласти @@ -112,64 +111,64 @@ &НаКлиенте Процедура ПослеПодключенияИнтернетПоддержки(Результат, Параметр) Экспорт - + Если ТипЗнч(Результат) = Тип("Структура") Тогда Элементы.ПодключитьИнтернетПоддержку.Видимость = Ложь; ДанныеАутентификацииПорталаСохранены = Истина; КонецЕсли; - + КонецПроцедуры &НаСервереБезКонтекста Функция ДанныеАутентификацииПорталаСохранены() - + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); Возврат МодульИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки(); КонецЕсли; - + Возврат Ложь; - + КонецФункции &НаСервере Функция НачатьОбновлениеКомпонентСПортала() - + Если Не ВнешниеКомпонентыСлужебный.ДоступнаЗагрузкаСПортала() Тогда Возврат Неопределено; КонецЕсли; - - ПараметрыПроцедуры = Новый Структура; - ПараметрыПроцедуры.Вставить("ОбновляемыеКомпоненты", ОбновляемыеКомпоненты.ВыгрузитьЗначения()); - + + ПараметрыПроцедуры = ВнешниеКомпонентыСлужебный.ПараметрыОбновленияКомпонентСПортала(); + ПараметрыПроцедуры.ОбновляемыеКомпоненты = ОбновляемыеКомпоненты.ВыгрузитьЗначения(); + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление внешней компоненты.'"); - + Возврат ДлительныеОперации.ВыполнитьВФоне("ВнешниеКомпонентыСлужебный.ОбновитьКомпонентыСПортала", ПараметрыПроцедуры, ПараметрыВыполнения); - + КонецФункции &НаКлиенте Процедура ПослеОбновленияКомпонентСПортала(Результат, ДополнительныеПараметры) Экспорт - + Если Результат = Неопределено Тогда Возврат; КонецЕсли; - + Если Результат.Статус = "Ошибка" Тогда КраткоеПредставлениеОшибки = Результат.КраткоеПредставлениеОшибки; Элементы.Страницы.ТекущаяСтраница = Элементы.Ошибка; КонецЕсли; - - Если Результат.Статус = "Выполнено" Тогда + + Если Результат.Статус = "Выполнено" Тогда РезультатВыполнения = ПолучитьИзВременногоХранилища(Результат.АдресРезультата); Элементы.Страницы.ТекущаяСтраница = Элементы.Выполнено; Элементы.Загрузить.Видимость = Ложь; Элементы.Отмена.Видимость = Ложь; Элементы.Закрыть.Видимость = Истина; КонецЕсли; - + КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Module.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Module.bsl index 2db5df03b..9327ad9ad 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Module.bsl @@ -115,9 +115,9 @@ Возврат Неопределено; КонецЕсли; - ПараметрыПроцедуры = Новый Структура; - ПараметрыПроцедуры.Вставить("Идентификатор", Идентификатор); - ПараметрыПроцедуры.Вставить("Версия", Версия); + ПараметрыПроцедуры = ВнешниеКомпонентыСлужебный.ПараметрыКомпонентаСПортала(); + ПараметрыПроцедуры.Идентификатор = Идентификатор; + ПараметрыПроцедуры.Версия = Версия; ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение внешней компоненты.'"); diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl index a7284fd21..2e4d3a57b 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl @@ -966,7 +966,8 @@ Если ТипЗнч(Параметры.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда Если ХранимыеПараметры.ИспользоватьГруппы Тогда - Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = ХранимыеПараметры.ТекущаяСтрока; + ТекущиеХранимыеПараметры = ХранимыеПараметры; // Структура + Элементы.ГруппыВнешнихПользователей.ТекущаяСтрока = ТекущиеХранимыеПараметры.ТекущаяСтрока; Иначе Параметры.ТекущаяСтрока = Неопределено; КонецЕсли; @@ -1182,7 +1183,7 @@ // ДополнительныеПараметры - Структура: // * ПараметрыПеретаскивания - Массив из СправочникСсылка.ВнешниеПользователи // * Строка - СправочникСсылка.ГруппыВнешнихПользователей -// * Перемещение - ДействиеПеретаскивания +// * Перемещение - Булево // &НаКлиенте Процедура ГруппыВнешнихПользователейПеретаскиваниеОбработкаВопроса(Ответ, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl index 929e72eae..4aca86955 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl @@ -1513,7 +1513,10 @@ ИначеЕсли Параметры.Свойство("ИдентификаторПользователяИБ") И ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда - Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ; + Если Объект.ИдентификаторПользователяИБ <> Параметры.ИдентификаторПользователяИБ Тогда + Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ; + Модифицированность = Истина; + КонецЕсли; ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ); Если ПрочитанныеСвойства <> Неопределено Тогда diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl index a0f15c674..022645967 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Module.bsl @@ -16,6 +16,8 @@ Запрос.УстановитьПараметр("ПользовательГрупп", Параметры.ПользовательГрупп); Запрос.УстановитьПараметр("Ответственный", Пользователи.АвторизованныйПользователь()); Запрос.УстановитьПараметр("ПолноправныйОтветственный", Пользователи.ЭтоПолноправныйПользователь()); + Запрос.УстановитьПараметр("ГруппаДоступаАдминистраторы", + УправлениеДоступом.ГруппаДоступаАдминистраторы()); УстановитьПривилегированныйРежим(Истина); Запрос.Текст = @@ -49,7 +51,7 @@ | ТОГДА ЛОЖЬ | КОГДА ГруппыДоступа.Профиль.ПометкаУдаления | ТОГДА ЛОЖЬ - | КОГДА ГруппыДоступа.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) + | КОГДА ГруппыДоступа.Ссылка = &ГруппаДоступаАдминистраторы | ТОГДА &ПолноправныйОтветственный | И ТИПЗНАЧЕНИЯ(&ПользовательГрупп) = ТИП(Справочник.Пользователи) | КОГДА &ПолноправныйОтветственный = ЛОЖЬ diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl index 7a8166d6b..392e24545 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl @@ -57,7 +57,7 @@ Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда // Скрытие группы доступа Администраторы. ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Список, "Ссылка", Справочники.ГруппыДоступа.Администраторы, + Список, "Ссылка", УправлениеДоступом.ГруппаДоступаАдминистраторы(), ВидСравненияКомпоновкиДанных.НеРавно, , Истина); КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form index 3af0ab5f3..5afc7537a 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form @@ -2120,6 +2120,32 @@ true + + ПрофильАдминистратор + 9 + + CatalogRef.ПрофилиГруппДоступа + + + true + + + true + + + + ГруппаДоступаАдминистраторы + 10 + + CatalogRef.ГруппыДоступа + + + true + + + true + + Подобрать diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl index 5c8f80ebb..89b323f3b 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl @@ -34,7 +34,7 @@ Элементы.КонтекстноеМенюПользователиПодобрать.Доступность = НЕ ТолькоПросмотр; Если ОбщегоНазначения.РазделениеВключено() - И Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы + И Объект.Ссылка = ГруппаДоступаАдминистраторы И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); @@ -51,7 +51,7 @@ ВыполненаПроцедураПриСозданииНаСервере = Истина; Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда - Если Не Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы + Если Не Объект.Ссылка = ГруппаДоступаАдминистраторы И Не УправлениеДоступомСлужебный.ЭтоПрофильОткрытиеВнешнихОтчетовИОбработок(Объект.Профиль) Тогда ТолькоПросмотр = Истина; @@ -76,12 +76,12 @@ Если ОтветНаВопросПриОткрытииФормы = "УстановитьПрофильАдминистратор" Тогда ОтветНаВопросПриОткрытииФормы = Неопределено; - Объект.Профиль = ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор"); + Объект.Профиль = ПрофильАдминистратор; Модифицированность = Истина; ИначеЕсли Не ТолькоПросмотр - И Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") - И Объект.Профиль <> ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда + И Объект.Ссылка = ГруппаДоступаАдминистраторы + И Объект.Профиль <> ПрофильАдминистратор Тогда Отказ = Истина; ПоказатьВопрос( @@ -148,7 +148,7 @@ Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено - И Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") + И Объект.Ссылка = ГруппаДоступаАдминистраторы И ПарольПользователяСервиса = Неопределено Тогда Отказ = Истина; @@ -173,7 +173,9 @@ ТекущийОбъект.Пользователи.Очистить(); - Если ТекущийОбъект.Ссылка <> Справочники.ГруппыДоступа.Администраторы + ГруппаДоступаАдминистраторы = ГруппаДоступаАдминистраторы; + + Если ТекущийОбъект.Ссылка <> ГруппаДоступаАдминистраторы И ЗначениеЗаполнено(ТекущийОбъект.Пользователь) Тогда Если ИспользованиеПерсональногоДоступа Тогда @@ -185,13 +187,13 @@ КонецЦикла; КонецЕсли; - Если ТекущийОбъект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + Если ТекущийОбъект.Ссылка = ГруппаДоступаАдминистраторы Тогда Объект.Родитель = Неопределено; Объект.Ответственный = Неопределено; КонецЕсли; Если ОбщегоНазначения.РазделениеВключено() - И Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + И Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда ТекущийОбъект.ДополнительныеСвойства.Вставить( "ПарольПользователяСервиса", ПарольПользователяСервиса); @@ -377,7 +379,7 @@ КонецЕсли; // Проверка наличия только пользователей в предопределенной группе Администраторы. - Если Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы + Если Объект.Ссылка = ГруппаДоступаАдминистраторы И ТипЗнч(ТекущаяСтрока.Пользователь) <> Тип("СправочникСсылка.Пользователи") Тогда Если ТипЗнч(ТекущаяСтрока.Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда @@ -428,7 +430,7 @@ КонецЦикла; Если НЕ ОбщегоНазначения.РазделениеВключено() - И Объект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + И Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда ОписаниеОшибки = ""; УправлениеДоступомСлужебный.ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы( @@ -683,7 +685,7 @@ Если ЗначениеЗаполнено(Текст) Тогда СтандартнаяОбработка = Ложь; - Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + Если Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораПользователя( Текст, Ложь, Ложь); Иначе @@ -699,7 +701,7 @@ Если ЗначениеЗаполнено(Текст) Тогда СтандартнаяОбработка = Ложь; - Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + Если Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораПользователя( Текст, Ложь, Ложь); Иначе @@ -959,7 +961,10 @@ &НаСервере Процедура НачальнаяНастройкаПриЧтенииИСоздании(ТекущийОбъект) - Если ТекущийОбъект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + ПрофильАдминистратор = УправлениеДоступом.ПрофильАдминистратор(); + ГруппаДоступаАдминистраторы = УправлениеДоступом.ГруппаДоступаАдминистраторы(); + + Если ТекущийОбъект.Ссылка = ГруппаДоступаАдминистраторы Тогда ЗапретитьИзменениеВсегоКромеСоставаУчастников(); Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда @@ -1216,7 +1221,7 @@ ВыборИПодборВнешнихПользователей = Ложь; - Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + Если Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ВыборИПодборВнешнихПользователей); Возврат; КонецЕсли; @@ -1320,7 +1325,7 @@ ПараметрыФормы.Вставить("РасширенныйПодбор", Истина); ПараметрыФормы.Вставить("ПараметрыРасширеннойФормыПодбора", ПараметрыРасширеннойФормыПодбора()); ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); - ИначеЕсли Объект.Ссылка <> ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + ИначеЕсли Объект.Ссылка <> ГруппаДоступаАдминистраторы Тогда Если ВыборИПодборВнешнихПользователей Тогда ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); Иначе @@ -1366,7 +1371,7 @@ ПараметрыРасширеннойФормыПодбора = Новый Структура; ПараметрыРасширеннойФормыПодбора.Вставить("ЗаголовокФормыПодбора", ЗаголовокФормыПодбора); ПараметрыРасширеннойФормыПодбора.Вставить("ВыбранныеПользователи", ВыбранныеПользователи); - Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + Если Объект.Ссылка = ГруппаДоступаАдминистраторы Тогда ПараметрыРасширеннойФормыПодбора.Вставить("ПодборГруппНевозможен"); КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl index a0018beaf..1aa9c4965 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl @@ -122,18 +122,15 @@ #Область СлужебныеПроцедурыИФункции -// Устанавливает пометку удаления группам доступа, если установлена -// пометка удаления у профиля группы доступа. Требуется, например, -// при удалении предопределенных профилей групп доступа, -// т.к. платформа не вызывает обработчики объектов при -// установке пометки удаления бывшим предопределенным -// элементам в процессе обновления конфигурации базы данных. -// -// Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, -// устанавливается Истина, иначе не изменяется. -// -Процедура ПометитьНаУдалениеГруппыДоступаПомеченныхПрофилей(ЕстьИзменения = Неопределено) Экспорт +// См. УправлениеДоступом.ГруппаДоступаАдминистраторы +Функция ГруппаДоступаАдминистраторы(ПрофильАдминистратор = Неопределено) Экспорт + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + Если Не ЗначениеЗаполнено(ПрофильАдминистратор) Тогда + ПрофильАдминистратор = УправлениеДоступом.ПрофильАдминистратор(); + КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = @@ -142,22 +139,180 @@ |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ - | ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | ГруппыДоступа.Профиль = &ПрофильАдминистратор + | + |УПОРЯДОЧИТЬ ПО + | Ссылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ГруппыДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ГруппыДоступа.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + Запрос.УстановитьПараметр("ПрофильАдминистратор", ПрофильАдминистратор); + Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", "Администраторы"); + + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + ВыборкаПоПрофилю = РезультатыЗапроса[0].Выбрать(); + ВыборкаПоПредопределенному = РезультатыЗапроса[1].Выбрать(); + + Если ВыборкаПоПрофилю.Следующий() + И ВыборкаПоПредопределенному.Следующий() + И ВыборкаПоПрофилю.Количество() = 1 + И ВыборкаПоПредопределенному.Количество() = 1 + И ВыборкаПоПрофилю.Ссылка = ВыборкаПоПредопределенному.Ссылка Тогда + + Возврат ВыборкаПоПрофилю.Ссылка; + КонецЕсли; + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("Справочник.ГруппыДоступа"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + ВыборкаПоПрофилю = РезультатыЗапроса[0].Выбрать(); + ВыборкаПоПредопределенному = РезультатыЗапроса[1].Выбрать(); + Если ВыборкаПоПрофилю.Следующий() Тогда + ГруппаДоступаОбъект = ВыборкаПоПрофилю.Ссылка.ПолучитьОбъект(); + Если ГруппаДоступаОбъект.ИмяПредопределенныхДанных <> "Администраторы" Тогда + ГруппаДоступаОбъект.ИмяПредопределенныхДанных = "Администраторы"; + КонецЕсли; + ИначеЕсли ВыборкаПоПредопределенному.Следующий() Тогда + ГруппаДоступаОбъект = ВыборкаПоПредопределенному.Ссылка.ПолучитьОбъект(); + ГруппаДоступаОбъект.Профиль = ПрофильАдминистратор; + Иначе + ГруппаДоступаПоНаименованию = ГруппаДоступаПоНаименованию( + НСтр("ru = 'Администраторы'", ОбщегоНазначения.КодОсновногоЯзыка())); + Если ЗначениеЗаполнено(ГруппаДоступаПоНаименованию) Тогда + ГруппаДоступаОбъект = ГруппаДоступаПоНаименованию.ПолучитьОбъект(); + Иначе + ГруппаДоступаОбъект = СоздатьЭлемент(); + КонецЕсли; + ГруппаДоступаОбъект.Профиль = ПрофильАдминистратор; + ГруппаДоступаОбъект.ИмяПредопределенныхДанных = "Администраторы"; + КонецЕсли; + Если ГруппаДоступаОбъект.Модифицированность() Тогда + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаДоступаОбъект, Ложь, Ложь); + КонецЕсли; + + ОбъектыДляОтвязки = Новый Соответствие; + Пока ВыборкаПоПрофилю.Следующий() Цикл + Если ВыборкаПоПрофилю.Ссылка <> ГруппаДоступаОбъект.Ссылка Тогда + ОбъектыДляОтвязки.Вставить(ВыборкаПоПрофилю.Ссылка); + КонецЕсли; + КонецЦикла; + Пока ВыборкаПоПредопределенному.Следующий() Цикл + Если ВыборкаПоПредопределенному.Ссылка <> ГруппаДоступаОбъект.Ссылка Тогда + ОбъектыДляОтвязки.Вставить(ВыборкаПоПредопределенному.Ссылка); + КонецЕсли; + КонецЦикла; + Для Каждого КлючИЗначение Из ОбъектыДляОтвязки Цикл + ТекущийГруппаДоступаОбъект = КлючИЗначение.Ключ.ПолучитьОбъект(); + ТекущийГруппаДоступаОбъект.Профиль = Неопределено; + ТекущийГруппаДоступаОбъект.ИмяПредопределенныхДанных = ""; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийГруппаДоступаОбъект, Ложь, Ложь); + КонецЦикла; + Для Каждого КлючИЗначение Из ОбъектыДляОтвязки Цикл + ТекущийГруппаДоступаОбъект = КлючИЗначение.Ключ.ПолучитьОбъект(); + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийГруппаДоступаОбъект); + КонецЦикла; + + ГруппаДоступаОбъект.Наименование = НСтр("ru = 'Администраторы'", + ОбщегоНазначения.КодОсновногоЯзыка()); + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаДоступаОбъект); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат ГруппаДоступаОбъект.Ссылка; + +КонецФункции + +// Для функции ГруппаДоступаАдминистраторы. +Функция ГруппаДоступаПоНаименованию(Наименование) + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Наименование", Наименование); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ГруппыДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ГруппыДоступа.Наименование = &Наименование + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Возврат Выборка.Ссылка; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Устанавливает пометку удаления группам доступа, если установлена +// пометка удаления у профиля группы доступа. Требуется, например, +// при удалении предопределенных профилей групп доступа, +// т.к. платформа не вызывает обработчики объектов при +// установке пометки удаления бывшим предопределенным +// элементам в процессе обновления конфигурации базы данных. +// +// Параметры: +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, +// устанавливается Истина, иначе не изменяется. +// +Процедура ПометитьНаУдалениеГруппыДоступаПомеченныхПрофилей(ЕстьИзменения = Неопределено) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); + Запрос.Текст = + "ВЫБРАТЬ + | ГруппыДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | ГруппыДоступа.Профиль <> &ПрофильАдминистратор | И ГруппыДоступа.Профиль.ПометкаУдаления | И НЕ ГруппыДоступа.ПометкаУдаления | И НЕ ГруппыДоступа.Предопределенный"; Выборка = Запрос.Выполнить().Выбрать(); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + Пока Выборка.Следующий() Цикл - ГруппаДоступаОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ГруппаДоступаОбъект.ПометкаУдаления = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаДоступаОбъект); - РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(Выборка.Ссылка); - РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра(Выборка.Ссылка); - ПользователиДляОбновления = ПользователиДляОбновленияРолей(Неопределено, ГруппаДоступаОбъект); - УправлениеДоступом.ОбновитьРолиПользователей(ПользователиДляОбновления); - ЕстьИзменения = Истина; + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ГруппаДоступаОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ГруппаДоступаОбъект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаДоступаОбъект); + РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(Выборка.Ссылка); + РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра(Выборка.Ссылка); + ПользователиДляОбновления = ПользователиДляОбновленияРолей(Неопределено, ГруппаДоступаОбъект); + УправлениеДоступом.ОбновитьРолиПользователей(ПользователиДляОбновления); + ЕстьИзменения = Истина; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; КонецПроцедуры @@ -194,6 +349,8 @@ КонецЦикла; Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); + Запрос.УстановитьПараметр("ГруппаДоступаАдминистраторы", УправлениеДоступом.ГруппаДоступаАдминистраторы()); Запрос.Текст = "ВЫБРАТЬ | ГруппыДоступа.Ссылка КАК Ссылка @@ -201,8 +358,8 @@ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ | НЕ(ГруппыДоступа.Профиль <> &Профиль - | И НЕ(&Профиль = ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) - | И ГруппыДоступа.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы)))"; + | И НЕ(&Профиль = &ПрофильАдминистратор + | И ГруппыДоступа.Ссылка = &ГруппаДоступаАдминистраторы))"; Запрос.УстановитьПараметр("Профиль", Профиль.Ссылка); Выборка = Запрос.Выполнить().Выбрать(); @@ -211,10 +368,10 @@ // Проверка необходимости/возможности обновления группы доступа. ГруппаДоступа = Выборка.Ссылка.ПолучитьОбъект(); - Если ГруппаДоступа.Ссылка = Администраторы - И ГруппаДоступа.Профиль <> Справочники.ПрофилиГруппДоступа.Администратор Тогда + Если ГруппаДоступа.Ссылка = УправлениеДоступом.ГруппаДоступаАдминистраторы() + И ГруппаДоступа.Профиль <> УправлениеДоступом.ПрофильАдминистратор() Тогда // Установка профиля Администратор, если не задан. - ГруппаДоступа.Профиль = Справочники.ПрофилиГруппДоступа.Администратор; + ГруппаДоступа.Профиль = УправлениеДоступом.ПрофильАдминистратор(); КонецЕсли; // Проверка состава видов доступа. @@ -447,6 +604,69 @@ КонецФункции +Функция РолиДляОбновленияПрав(СтарыеЗначения, ЭлементДанных) Экспорт + + Если СтарыеЗначения = Неопределено Тогда + СтарыеЗначения = Новый Структура("Ссылка, Профиль, ПометкаУдаления") + КонецЕсли; + + // Обновление ролей для добавленных, оставшихся и удаленных пользователей. + Запрос = Новый Запрос; + + Запрос.УстановитьПараметр("НовыйПрофиль", + ?(ТипЗнч(ЭлементДанных) <> Тип("УдалениеОбъекта") И Не ЭлементДанных.ПометкаУдаления, + ЭлементДанных.Профиль, Справочники.ПрофилиГруппДоступа.ПустаяСсылка())); + + Запрос.УстановитьПараметр("СтарыйПрофиль", + ?(ЭлементДанных.Ссылка = СтарыеЗначения.Ссылка И Не СтарыеЗначения.ПометкаУдаления, + СтарыеЗначения.Профиль, Справочники.ПрофилиГруппДоступа.ПустаяСсылка())); + + Если ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта") + Или ЭлементДанных.ПометкаУдаления <> СтарыеЗначения.ПометкаУдаления Тогда + + // Выбор всех ролей старого или нового профилей группы доступа. + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Роль КАК Роль + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + |ГДЕ + | РолиПрофилей.Ссылка В (&СтарыйПрофиль, &НовыйПрофиль)"; + Иначе + // Выбор изменений состава ролей группы доступа. + Запрос.Текст = + "ВЫБРАТЬ + | Данные.Роль КАК Роль + |ИЗ + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Роль КАК Роль, + | -1 КАК ВидИзмененияСтроки + | ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + | ГДЕ + | РолиПрофилей.Ссылка = &СтарыйПрофиль + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Роль, + | 1 + | ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + | ГДЕ + | РолиПрофилей.Ссылка = &НовыйПрофиль) КАК Данные + | + |СГРУППИРОВАТЬ ПО + | Данные.Роль + | + |ИМЕЮЩИЕ + | СУММА(Данные.ВидИзмененияСтроки) <> 0"; + КонецЕсли; + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Роль"); + +КонецФункции + Функция ГруппыДоступаПрофиля(Профили) Экспорт Запрос = Новый Запрос; @@ -560,23 +780,28 @@ // Процедуры и функции для поддержки обмена данными в РИБ. // Только для внутреннего использования. +// +// Параметры: +// ЭлементДанных - СправочникОбъект.ГруппыДоступа +// Процедура ВосстановитьСоставУчастниковГруппыДоступаАдминистраторы(ЭлементДанных) Экспорт - Если ЭлементДанных.ИмяПредопределенныхДанных <> "Администраторы" Тогда + ГруппаДоступаАдминистраторы = УправлениеДоступом.ГруппаДоступаАдминистраторы(); + Если ЭлементДанных.Ссылка <> ГруппаДоступаАдминистраторы Тогда Возврат; КонецЕсли; ЭлементДанных.Пользователи.Очистить(); Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", "Администраторы"); + Запрос.УстановитьПараметр("ГруппаДоступаАдминистраторы", ГруппаДоступаАдминистраторы); Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ГруппыДоступаПользователи.Пользователь |ИЗ | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи |ГДЕ - | ГруппыДоступаПользователи.Ссылка.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных"; + | ГруппыДоступаПользователи.Ссылка = &ГруппаДоступаАдминистраторы"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если ЭлементДанных.Пользователи.Найти(Выборка.Пользователь, "Пользователь") = Неопределено Тогда @@ -589,14 +814,16 @@ // Только для внутреннего использования. Процедура УдалитьУчастниковГруппыДоступаАдминистраторыБезПользователяИБ() Экспорт + ГруппаДоступаАдминистраторы = УправлениеДоступом.ГруппаДоступаАдминистраторы(); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ГруппаДоступаАдминистраторы); + НачатьТранзакцию(); Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); - ЭлементБлокировки.УстановитьЗначение("Ссылка", Администраторы); Блокировка.Заблокировать(); - - ГруппаДоступаАдминистраторы = Администраторы.ПолучитьОбъект(); + ГруппаДоступаАдминистраторы = ГруппаДоступаАдминистраторы.ПолучитьОбъект(); Индекс = ГруппаДоступаАдминистраторы.Пользователи.Количество() - 1; Пока Индекс >= 0 Цикл @@ -626,7 +853,7 @@ Исключение ОтменитьТранзакцию(); ВызватьИсключение; - КонецПопытки; + КонецПопытки; КонецПроцедуры @@ -671,9 +898,13 @@ КонецЕсли; ПользователиДляОбновления = ПользователиДляОбновленияРолей(СтарыеЗначения, ЭлементДанных); - ЗарегистрироватьСсылки("Пользователи", ПользователиДляОбновления); + Если УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда + РолиДляОбновления = РолиДляОбновленияПрав(СтарыеЗначения, ЭлементДанных); + ЗарегистрироватьСсылки("Роли", РолиДляОбновления); + КонецЕсли; + КонецПроцедуры // Только для внутреннего использования. @@ -700,8 +931,16 @@ КонецЕсли; Если УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда - УправлениеДоступомСлужебный.ЗапланироватьОбновлениеНаборовГруппДоступа( - "ОбновитьВспомогательныеДанныеГруппДоступаИзмененныхПриЗагрузке"); + Описание = "ОбновитьВспомогательныеДанныеГруппДоступаИзмененныхПриЗагрузке"; + УправлениеДоступомСлужебный.ЗапланироватьОбновлениеНаборовГруппДоступа(Описание); + СоставИзмененийРолей = ЗарегистрированныеСсылки("Роли"); + Если СоставИзмененийРолей.Количество() = 1 + И СоставИзмененийРолей[0] = Неопределено Тогда + СоставИзмененийРолей = Неопределено; + КонецЕсли; + УправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступаПриИзмененииПрофиляГруппыДоступа(Описание, + СоставИзмененийРолей, Истина); + ЗарегистрироватьСсылки("Роли", Null); КонецЕсли; ЗарегистрироватьСсылки("ГруппыДоступа", Null); @@ -869,7 +1108,7 @@ Элемент = Элементы.Добавить(); Элемент.ИмяПредопределенныхДанных = "Администраторы"; Элемент.Наименование = НСтр("ru = 'Администраторы'", ОбщегоНазначения.КодОсновногоЯзыка()); - Элемент.Профиль = Справочники.ПрофилиГруппДоступа.Администратор; + Элемент.Профиль = УправлениеДоступом.ПрофильАдминистратор(); КонецПроцедуры @@ -879,9 +1118,9 @@ Процедура ЗаполнитьПрофильГруппыДоступаАдминистраторы() Экспорт - Объект = Администраторы.ПолучитьОбъект(); - Если Объект.Профиль <> Справочники.ПрофилиГруппДоступа.Администратор Тогда - Объект.Профиль = Справочники.ПрофилиГруппДоступа.Администратор; + Объект = УправлениеДоступом.ГруппаДоступаАдминистраторы().ПолучитьОбъект(); + Если Объект.Профиль <> УправлениеДоступом.ПрофильАдминистратор() Тогда + Объект.Профиль = УправлениеДоступом.ПрофильАдминистратор(); ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); КонецЕсли; @@ -1078,6 +1317,18 @@ ИначеЕсли ВидСсылок = "Пользователи" Тогда ДопустимыеТипы = Новый ОписаниеТипов("СправочникСсылка.Пользователи,СправочникСсылка.ВнешниеПользователи"); ИмяПараметраРаботыПрограммы = "СтандартныеПодсистемы.УправлениеДоступом.ПользователиИзмененныеПриЗагрузке"; + + ИначеЕсли ВидСсылок = "Роли" Тогда + ДопустимыеТипы = Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных,СправочникСсылка.ИдентификаторыОбъектовРасширений"); + ИмяПараметраРаботыПрограммы = "СтандартныеПодсистемы.УправлениеДоступом.РолиИзмененныеПриЗагрузке"; + + ИначеЕсли ВидСсылок = "ОграничиватьДоступНаУровнеЗаписей" Тогда + ДопустимыеТипы = Новый ОписаниеТипов("Булево"); + ИмяПараметраРаботыПрограммы = "СтандартныеПодсистемы.УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписейИзменениеПриЗагрузке"; + + ИначеЕсли ВидСсылок = "ИспользуемыеВидыДоступа" Тогда + ДопустимыеТипы = Метаданные.ОпределяемыеТипы.ЗначениеДоступа; + ИмяПараметраРаботыПрограммы = "СтандартныеПодсистемы.УправлениеДоступом.ИспользуемыеВидыДоступаИзмененныеПриЗагрузке"; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Недопустимое значение ""%1"" параметра ВидСсылок функции СвойстваВидаСсылок.'"), diff --git a/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl index a34b6e901..b5b66191f 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/ObjectModule.bsl @@ -42,10 +42,10 @@ Индекс = Индекс - 1; КонецЦикла; - Если Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + Если Ссылка = УправлениеДоступом.ГруппаДоступаАдминистраторы() Тогда // Всегда предопределенный профиль Администратор. - Профиль = Справочники.ПрофилиГруппДоступа.Администратор; + Профиль = УправлениеДоступом.ПрофильАдминистратор(); // Не может быть персональной группой доступа. Пользователь = Неопределено; @@ -76,7 +76,7 @@ КонецЦикла; // Нельзя устанавливать предопределенный профиль Администратор произвольной группе доступа. - ИначеЕсли Профиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда + ИначеЕсли Профиль = УправлениеДоступом.ПрофильАдминистратор() Тогда ВызватьИсключение НСтр("ru = 'Предопределенный профиль Администратор может быть только |у предопределенной группы доступа Администраторы.'"); @@ -152,6 +152,12 @@ РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(Ссылка); КонецЕсли; + Если УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда + СоставИзмененийРолей = Справочники.ГруппыДоступа.РолиДляОбновленияПрав(СтарыеЗначения, ЭтотОбъект); + УправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступаПриИзмененииПрофиляГруппыДоступа( + "ГруппаДоступаПриИзмененииПрофиля", СоставИзмененийРолей, Профиль <> СтарыеЗначения.Профиль); + КонецЕсли; + Если Справочники.ГруппыДоступа.ИзменилисьВидыИлиЗначенияДоступа(СтарыеЗначения, ЭтотОбъект) Или ПометкаУдаления <> СтарыеЗначения.ПометкаУдаления Или НаличиеУчастников <> СтароеНаличиеУчастников Тогда @@ -249,7 +255,7 @@ КонецЕсли; Если ОбщегоНазначения.РазделениеВключено() - И Ссылка = Справочники.ГруппыДоступа.Администраторы + И Ссылка = УправлениеДоступом.ГруппаДоступаАдминистраторы() И Не СеансЗапущенБезРазделителей И ДополнительныеСвойства.Свойство("ПарольПользователяСервиса") Тогда @@ -263,7 +269,7 @@ ПользователиДляОбновления = Справочники.ГруппыДоступа.ПользователиДляОбновленияРолей(СтарыеЗначения, ЭтотОбъект); - Если Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + Если Ссылка = УправлениеДоступом.ГруппаДоступаАдминистраторы() Тогда // Добавление пользователей, связанных с пользователямиИБ, имеющих роль ПолныеПрава. Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл diff --git a/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl b/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl index 379e6887d..d1c642d63 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl +++ b/SSL/src/Catalogs/ГруппыПользователей/ObjectModule.bsl @@ -184,18 +184,16 @@ Возврат; КонецЕсли; - ТекстОшибки = - НСтр("ru = 'Недостаточно прав доступа. - | - |В состав участников групп пользователей можно добавлять и удалять только - |новых (добавленных) пользователей, у которых включен признак Подготовлен. - | - |Запрещено добавлять и удалять существующих пользователей:'"); + СоставПользователей = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Наименование"); - Выборка = РезультатЗапроса.Выбрать(); - Пока Выборка.Следующий() Цикл - ТекстОшибки = ТекстОшибки + Символы.ПС + Выборка.Наименование; - КонецЦикла; + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недостаточно прав доступа для изменения: + |%1 + | + |В состав участников групп пользователей можно включать и исключать + |только новых пользователей, которые еще не одобрены администратором + |(то есть администратор еще не разрешил вход в программу).'"), + СтрСоединить(СоставПользователей, Символы.ПС)); ВызватьИсключение ТекстОшибки; diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl index 79e069010..769391b58 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl @@ -57,6 +57,8 @@ #Область ОбработчикиСобытий +// АПК:362-выкл Проектное решение + Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда @@ -71,4 +73,6 @@ #КонецЕсли КонецПроцедуры +// АПК:362-вкл + #КонецОбласти diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl index f278ae4ed..f6eb01568 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl @@ -57,6 +57,8 @@ #Область ОбработчикиСобытий +// АПК:362-выкл Проектное решение + Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда @@ -71,5 +73,7 @@ #КонецЕсли КонецПроцедуры +// АПК:362-вкл + #КонецОбласти diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl index e3958984b..34db7a476 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl @@ -428,10 +428,10 @@ // Процедура обновляет данные справочника по метаданным конфигурации. // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) в этот параметр возвращается +// ЕстьИзменения - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если производилась запись, иначе не изменяется. // -// ЕстьУдаленные - Булево - (возвращаемое значение) в этот параметр возвращается +// ЕстьУдаленные - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если хотя бы один элемент справочника был помечен // на удаление, иначе не изменяется. // @@ -483,24 +483,23 @@ // Процедура обновляет данные справочника по метаданным конфигурации. // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) - в этот параметр возвращается +// ЕстьИзменения - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если производилась запись, иначе не изменяется. // -// ЕстьУдаленные - Булево - (возвращаемое значение) - в этот параметр возвращается +// ЕстьУдаленные - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если хотя бы один элемент справочника был помечен // на удаление, иначе не изменяется. // // ТолькоПроверка - Булево - не производить никаких изменений, а выполнить только установку // параметров ЕстьИзменения, ЕстьУдаленные, ЕстьКритичныеИзменения, СписокКритичныхИзменений. // -// ЕстьКритичныеИзменения - (возвращаемое значение) - в этот параметр возвращается +// ЕстьКритичныеИзменения - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если найдены критичные изменения, иначе не изменяется. -// Критичные изменения (только для не помеченных на удаление): -// - изменении реквизита ПолноеИмя, -// - добавление нового элемента справочника. -// В общем случае, критичные изменения требуют монопольный режим. +// Критичные изменения (только для непомеченных на удаление): +// изменении реквизита ПолноеИмя или добавление нового элемента справочника. +// В общем случае критичные изменения требуют монопольный режим. // -// СписокКритичныхИзменений - Строка (возвращаемое значение) - содержит полные имена +// СписокКритичныхИзменений - Строка - возвращаемое значение. Содержит полные имена // объектов метаданных, которые добавлены или требуется добавить, // а также объектов метаданных, полные имена которых изменены или требуется изменить. // @@ -697,6 +696,9 @@ ИначеЕсли ТипЗнч(Описание.Ключ) = Тип("Тип") Тогда Результат.Вставить(Идентификатор, Метаданные.НайтиПоТипу(Описание.Ключ)); + + ИначеЕсли СтрНачинаетсяС(Описание.Ключ, "Роль.") Тогда + Результат.Вставить(Идентификатор, Метаданные.Роли.Найти(СтрРазделить(Описание.Ключ, ".")[1])); Иначе Результат.Вставить(Идентификатор, Метаданные.НайтиПоПолномуИмени(Описание.Ключ)); КонецЕсли; @@ -1444,15 +1446,22 @@ Выгрузка.Колонки.Добавить("ЭтоНовый", Новый ОписаниеТипов("Булево")); // Упорядочение идентификаторов перед обработкой. - Для каждого Строка Из Выгрузка Цикл + Для Каждого Строка Из Выгрузка Цикл + Если Не ЗначениеЗаполнено(Строка.Ссылка) Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Данные справочника %1 повреждены. + |В конфигураторе в меню ""Администрирование"" + |выполните ""Тестирование и исправление..."".'"), + ?(ОбъектыРасширений, "ИдентификаторыОбъектовРасширений", "ИдентификаторыОбъектовМетаданных")); + ВызватьИсключение ТекстОшибки; + КонецЕсли; Если ТипЗнч(Строка.ХранилищеКлюча) = Тип("ХранилищеЗначения") Тогда Строка.КлючОбъектаМетаданных = Строка.ХранилищеКлюча.Получить(); Иначе Строка.КлючОбъектаМетаданных = Неопределено; КонецЕсли; - Строка.БезКлючаОбъектаМетаданных = Строка.КлючОбъектаМетаданных = Неопределено - ИЛИ Строка.КлючОбъектаМетаданных = Тип("Неопределено"); + Или Строка.КлючОбъектаМетаданных = Тип("Неопределено"); КонецЦикла; Выгрузка.Индексы.Добавить("Ссылка"); @@ -1460,7 +1469,7 @@ СвойстваКоллекций = СтандартныеПодсистемыПовтИсп.СвойстваКоллекцийОбъектовМетаданных(ОбъектыРасширений); - Для каждого СвойстваКоллекции Из СвойстваКоллекций Цикл + Для Каждого СвойстваКоллекции Из СвойстваКоллекций Цикл ИдентификаторКоллекции = ИдентификаторКоллекции(СвойстваКоллекции.Идентификатор, ОбъектыРасширений); Строка = Выгрузка.Найти(ИдентификаторКоллекции, "Ссылка"); Если Строка = Неопределено Тогда @@ -1523,6 +1532,7 @@ Переименование.НовоеПолноеИмя = НовоеПолноеИмя; КонецЕсли; Строка.ПолноеИмя = НовоеПолноеИмя; + Строка.Обновлен = Истина; КонецЦикла; КонецЦикла; @@ -2248,7 +2258,11 @@ Функция МетаданныеНайтиПоПолномуИмени(ПолноеИмя) - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + Если СтрНачинаетсяС(ПолноеИмя, "Роль.") Тогда + ОбъектМетаданных = Метаданные.Роли.Найти(СтрРазделить(ПолноеИмя, ".")[1]); + Иначе + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + КонецЕсли; Если ОбъектМетаданных = Неопределено Тогда Возврат Неопределено; diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo index ef8d92c56..414b5dfc8 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ИдентификаторыОбъектовМетаданных.mdo @@ -1253,6 +1253,30 @@ <value></value> </code> </items> + <items id="51a9bff2-c716-4f86-bbfa-861b026ee9fd"> + <name>РегистрСведенийИспользуемыеВидыДоступа</name> + <code xsi:type="core:StringValue"> + <value></value> + </code> + </items> + <items id="bdd8a5af-48f3-48f5-b5ef-e03497baf600"> + <name>РегистрСведенийИспользуемыеВидыДоступаПоТаблицам</name> + <code xsi:type="core:StringValue"> + <value></value> + </code> + </items> + <items id="27eb08f4-c296-4ef9-9941-bceec60b4b02"> + <name>РегистрСведенийКэшПереводов</name> + <code xsi:type="core:StringValue"> + <value></value> + </code> + </items> + <items id="f674dc60-7b2e-4976-83a1-ae630aad4b4b"> + <name>РегистрСведенийСертификатыПользователяDSS</name> + <code xsi:type="core:StringValue"> + <value></value> + </code> + </items> </predefined> <predefinedDataUpdate>DontAutoUpdate</predefinedDataUpdate> <editType>InDialog</editType> diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl index 84f3f6c81..1a616da1d 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl @@ -117,10 +117,10 @@ // Процедура обновляет данные справочника по метаданным конфигурации. // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) в этот параметр возвращается +// ЕстьИзменения - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если производилась запись, иначе не изменяется. // -// ЕстьУдаленные - Булево - (возвращаемое значение) в этот параметр возвращается +// ЕстьУдаленные - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если хотя бы один элемент справочника был помечен // на удаление, иначе не изменяется. // diff --git a/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form index 81992ca96..6843debe5 100644 --- a/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанков/Forms/ФормаСписка/Form.form @@ -557,7 +557,7 @@ <name>ЗагрузитьКлассификатор</name> <title> <key>ru</key> - <value>Загрузить классификатор</value> + <value>Загрузить классификатор...</value> 1 diff --git a/SSL/src/Catalogs/КлассификаторБанков/КлассификаторБанков.mdo b/SSL/src/Catalogs/КлассификаторБанков/КлассификаторБанков.mdo index 44ec65dc9..e3b493951 100644 --- a/SSL/src/Catalogs/КлассификаторБанков/КлассификаторБанков.mdo +++ b/SSL/src/Catalogs/КлассификаторБанков/КлассификаторБанков.mdo @@ -12,6 +12,7 @@ ru Справочник БИК + АПК:58 true Catalog.КлассификаторБанков.StandardAttribute.Description Catalog.КлассификаторБанков.StandardAttribute.Code diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl index 2477dbeae..33f5f83ae 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl @@ -91,7 +91,7 @@ // параметрах дополнительных реквизитов и сведений. // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // Процедура ОбновитьСоставНаименованийПредопределенныхНаборов(ЕстьИзменения = Неопределено) Экспорт diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl index 00015a887..153af3008 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl @@ -78,8 +78,8 @@ КонецПроцедуры -// Обработчик обновления на версию 3.1.4.294: -// - заполняет реквизит "ТипПредопределеннойПапки" в справочнике "Папки электронных писем" +// Обработчик обновления на версию 3.1.5.108: +// - заполняет реквизит "ТипПредопределеннойПапки" в справочнике "Папки электронных писем". // Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт @@ -172,5 +172,4 @@ #КонецОбласти - #КонецЕсли diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl index 6bf7e23b2..64ab73c3e 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl @@ -1185,12 +1185,13 @@ ХранимыеПараметры.Вставить("ИспользоватьГруппы", ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей")); КонецЕсли; - Если ХранимыеПараметры.Свойство("ТекущаяСтрока") Тогда + ТекущиеХранимыеПараметры = ХранимыеПараметры; // Структура + Если ТекущиеХранимыеПараметры.Свойство("ТекущаяСтрока") Тогда - Если ТипЗнч(ХранимыеПараметры.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") Тогда + Если ТипЗнч(ТекущиеХранимыеПараметры.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") Тогда Если ХранимыеПараметры.ИспользоватьГруппы Тогда - Элементы.ГруппыПользователей.ТекущаяСтрока = ХранимыеПараметры.ТекущаяСтрока; + Элементы.ГруппыПользователей.ТекущаяСтрока = ТекущиеХранимыеПараметры.ТекущаяСтрока; Иначе Параметры.ТекущаяСтрока = Неопределено; КонецЕсли; @@ -1341,9 +1342,9 @@ // Параметры: // Ответ - КодВозвратаДиалога // ДополнительныеПараметры - Структура: -// * ПараметрыПеретаскивания - ПараметрыПеретаскивания +// * ПараметрыПеретаскивания - Массив из СправочникСсылка.Пользователи // * Строка - Строка -// * Перемещение - ДействиеПеретаскивания +// * Перемещение - Булево // &НаКлиенте Процедура ГруппыПользователейПеретаскиваниеЗавершение(Ответ, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl index 525dd3cc5..d9bf3c47a 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl @@ -2071,7 +2071,10 @@ ИначеЕсли Параметры.Свойство("ИдентификаторПользователяИБ") И ЗначениеЗаполнено(Параметры.ИдентификаторПользователяИБ) Тогда - Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ; + Если Объект.ИдентификаторПользователяИБ <> Параметры.ИдентификаторПользователяИБ Тогда + Объект.ИдентификаторПользователяИБ = Параметры.ИдентификаторПользователяИБ; + Модифицированность = Истина; + КонецЕсли; ПрочитанныеСвойства = Пользователи.СвойстваПользователяИБ(Объект.ИдентификаторПользователяИБ); Если ПрочитанныеСвойства <> Неопределено Тогда diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl index 03a24f56b..3d6fc22d6 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl @@ -62,11 +62,10 @@ // // Параметры: // ПараметрыВыгрузки - Структура: -// - ДляПисемВПапке - Справочник.ПапкиЭлектронныхПисем - письма, которые находятся в этой папке -// будут обработаны. -// - ВключаяПодчиненные - Булево - признак, того что должны обрабатываться письма в подчиненных папках. -// - ТаблицаПравил - ТаблицаЗначений - таблица правил, которые должны быть применены. -// АдресХранилища - Строка - сообщение о результате применения правил. +// * ДляПисемВПапке - СправочникСсылка.ПапкиЭлектронныхПисем - письма, которые находятся в этой папке будут обработаны. +// * ВключаяПодчиненные - Булево - признак, того что должны обрабатываться письма в подчиненных папках. +// * ТаблицаПравил - ТаблицаЗначений - таблица правил, которые должны быть применены. +// АдресХранилища - Строка - сообщение о результате применения правил. // Процедура ПрименитьПравила(ПараметрыВыгрузки, АдресХранилища) Экспорт diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl index 7dc3d7608..9a916f2bf 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl @@ -235,7 +235,7 @@ КонецПроцедуры // Параметры: -// ОписаниеОшибки - ДанныеФормыКоллекция: +// ОписаниеОшибок - ДанныеФормыКоллекция: // * Ошибки - Массив из Структура // ОшибкаНаСервере - Булево // diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl index e0d65c8c4..d8e072319 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl @@ -231,6 +231,7 @@ // ТаблицаЗначений - выполненные изменения данных производственных календарей: // * КодПроизводственногоКалендаря - Строка - код измененного календаря, // * Год - Число - год, за который календарь был изменен. +// Функция ОбновитьДанныеПроизводственныхКалендарей(Знач ТаблицаДанных) Экспорт ТаблицаИзменений = ТаблицаИзмененийПроизводственныхКалендарей(); @@ -359,12 +360,13 @@ // КодБазовогоКалендаря - Строка - код базового календаря // // Возвращаемое значение: -// ТаблицаЗначений - Результат заполнения производственного календаря по умолчанию: -// * КодПроизводственногоКалендаря - Строка - -// * ВидДня - ПеречислениеСсылка.ВидыДнейПроизводственногоКалендаря - -// * Год - Число - -// * Дата - Дата - -// * ДатаПереноса - Дата - +// ТаблицаЗначений - результат заполнения производственного календаря по умолчанию: +// * КодПроизводственногоКалендаря - Строка +// * ВидДня - ПеречислениеСсылка.ВидыДнейПроизводственногоКалендаря +// * Год - Число +// * Дата - Дата +// * ДатаПереноса - Дата +// Функция РезультатЗаполненияПроизводственногоКалендаряПоУмолчанию(КодКалендаря, НомерГода, Знач КодБазовогоКалендаря = Неопределено) Экспорт ВидыДней = Новый Соответствие; @@ -524,11 +526,11 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// * КодПроизводственногоКалендаря -// * ВидДня -// * Год -// * Дата -// * ДатаПереноса. +// * КодПроизводственногоКалендаря - Строка +// * ВидДня - ПеречислениеСсылка.ВидыДнейПроизводственногоКалендаря +// * Год - Число +// * Дата - Дата +// * ДатаПереноса - Дата // Функция ДанныеПроизводственныхКалендарейИзXML(Знач ДанныеXML, ТаблицаКалендарей, КодыКалендарей = Неопределено, ФормироватьПолныйНабор = Истина) Экспорт @@ -981,7 +983,7 @@ // Параметры: // ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - текущий элемент справочника. // НомерГода - Число - номер года, за который необходимо записать производственный календарь. -// ДанныеПроизводственногоКалендаря - ТаблицаЗначений - см. Справочник.ПроизводственныеКалендари.ДанныеПроизводственногоКалендаря. +// ДанныеПроизводственногоКалендаря - см. Справочник.ПроизводственныеКалендари.ДанныеПроизводственногоКалендаря. // Процедура ЗаписатьДанныеПроизводственногоКалендаря(ПроизводственныйКалендарь, НомерГода, ДанныеПроизводственногоКалендаря) Экспорт @@ -1013,6 +1015,7 @@ // // Возвращаемое значение: // Соответствие - соответствие видов дня и цветов оформления. +// Функция ЦветаОформленияВидовДнейПроизводственногоКалендаря() Экспорт ЦветаОформления = Новый Соответствие; @@ -1032,6 +1035,7 @@ // // Возвращаемое значение: // СписокЗначений - список, содержащий значение перечисления и его синоним в качестве представления. +// Функция СписокВидовДня() Экспорт СписокВидовДня = Новый СписокЗначений; @@ -1048,7 +1052,8 @@ // для использования, например, в качестве шаблона. // // Возвращаемое значение: -// Массив - Список производственных календарей +// Массив - список производственных календарей +// Функция СписокПроизводственныхКалендарей() Экспорт Запрос = Новый Запрос( diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Commands/ГруппыДоступа/CommandModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Commands/ГруппыДоступа/CommandModule.bsl index 3769ad606..da5d51b81 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Commands/ГруппыДоступа/CommandModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Commands/ГруппыДоступа/CommandModule.bsl @@ -11,10 +11,34 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Профиль", ПараметрКоманды); - ОткрытьФорму("Справочник.ГруппыДоступа.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + Если УпрощенныйИнтерфейс() Тогда + КлючВарианта = "ПраваПользователейНаТаблицы"; + + Отбор = Новый Структура; + Отбор.Вставить("ГруппаДоступа", ПараметрКоманды); + Отбор.Вставить("ВходВПрограммуРазрешен", Истина); + + ПараметрыОтчета = Новый Структура; + ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина); + ПараметрыОтчета.Вставить("Отбор", Отбор); + ПараметрыОтчета.Вставить("КлючВарианта", КлючВарианта); + ПараметрыОтчета.Вставить("КлючНазначенияИспользования", КлючВарианта); + + ОткрытьФорму("Отчет.АнализПравДоступа.Форма", ПараметрыОтчета, ЭтотОбъект); + + Иначе + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Профиль", ПараметрКоманды); + ОткрытьФорму("Справочник.ГруппыДоступа.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + КонецЕсли; КонецПроцедуры +&НаСервере +Функция УпрощенныйИнтерфейс() + + Возврат УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа(); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl index 51271c5ed..638172914 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Module.bsl @@ -15,6 +15,12 @@ ТолькоПросмотр = Истина; КонецЕсли; + БезРедактированияПоставляемыхЗначений = ТолькоПросмотр + Или Не Объект.Ссылка.Пустая() + И Справочники.ПрофилиГруппДоступа.ЗапретИзмененияПрофиля(Объект, Элементы.Родитель.ТолькоПросмотр); + + Элементы.Наименование.ТолькоПросмотр = БезРедактированияПоставляемыхЗначений; + КонецПроцедуры &НаСервере diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl index 09cce87fc..44cd5d26e 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Module.bsl @@ -20,7 +20,7 @@ // Скрытие профиля Администратор. ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Список, "Ссылка", Справочники.ПрофилиГруппДоступа.Администратор, + Список, "Ссылка", УправлениеДоступом.ПрофильАдминистратор(), ВидСравненияКомпоновкиДанных.НеРавно, , Истина); Элементы.Список.ВыборГруппИЭлементов = Параметры.ВыборГруппИЭлементов; diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl index 5770fcfc8..66760309b 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl @@ -27,16 +27,17 @@ // Установка постоянной доступности свойств. // Определение необходимости настройки ограничений доступа. - Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда + Если Не УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда Элементы.ВидыИЗначенияДоступа.Видимость = Ложь; КонецЕсли; // Определение возможности редактирования элементов формы (перезапись доступна). БезРедактированияПоставляемыхЗначений = ТолькоПросмотр - ИЛИ НЕ Объект.Ссылка.Пустая() И Справочники.ПрофилиГруппДоступа.ЗапретИзмененияПрофиля(Объект); - + Или Не Объект.Ссылка.Пустая() + И Справочники.ПрофилиГруппДоступа.ЗапретИзмененияПрофиля(Объект, Элементы.Родитель.ТолькоПросмотр); + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); - Если Объект.Ссылка = Справочники.ПрофилиГруппДоступа.Администратор + Если Объект.Ссылка = УправлениеДоступом.ПрофильАдминистратор() И Не Пользователи.ЭтоПолноправныйПользователь(, Не РазделениеВключено) Тогда ТолькоПросмотр = Истина; КонецЕсли; @@ -668,7 +669,7 @@ ПараметрыДействия.Вставить("КоллекцияРолей", КоллекцияРолей); ПараметрыДействия.Вставить("СкрытьРольПолныеПрава", - Объект.Ссылка <> Справочники.ПрофилиГруппДоступа.Администратор); + Объект.Ссылка <> УправлениеДоступом.ПрофильАдминистратор()); ПараметрыДействия.Вставить("НазначениеРолей", УправлениеДоступомСлужебныйКлиентСервер.НазначениеПрофиля(Объект)); diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl index 79024b631..83befcf93 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl @@ -102,7 +102,7 @@ // параметрах ограничения доступа при изменении конфигурации. // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // Процедура ОбновитьОписаниеПоставляемыхПрофилей(ЕстьИзменения = Неопределено) Экспорт @@ -137,7 +137,7 @@ // параметрах ограничения доступа при изменении конфигурации. // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // Процедура ОбновитьСоставПредопределенныхПрофилей(ЕстьИзменения = Неопределено) Экспорт @@ -215,82 +215,30 @@ КонецПроцедуры -// Обновляет поставляемые профили, и при необходимости обновляет группы доступа этих профилей. -// Создаются не найденные поставляемые профили групп доступа. +// Обновляет поставляемые папки профилей и профили. +// При необходимости обновляет группы доступа обновленных профилей. +// Создаются не найденные поставляемые папки профилей и профили групп доступа. // // Особенности обновления настраиваются в процедуре ЗаполнитьПоставляемыеПрофилиГруппДоступа // общего модуля УправлениеДоступомПереопределяемый (см. комментарий к процедуре). // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // Процедура ОбновитьПоставляемыеПрофили(ЕстьИзменения = Неопределено) Экспорт ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); // См. ОписаниеПоставляемыхПрофилей - ОписанияПрофилей = ПоставляемыеПрофили.ОписанияПрофилейМассив; - ПараметрыОбновления = ПоставляемыеПрофили.ПараметрыОбновления; - ОбновленныеПрофили = Новый Массив; + ТекущиеПапкиПрофилей = ТекущиеПапкиПрофилей(); + ОбновитьПоставляемыеПапкиПрофилей("", ТекущиеПапкиПрофилей, ПоставляемыеПрофили, ЕстьИзменения); + ОтвязатьУстаревшиеПоставляемыеДанные(ТекущиеПапкиПрофилей, ЕстьИзменения); ТекущиеПрофили = ТекущиеПрофили(); - - Для Каждого СвойстваПрофиля Из ОписанияПрофилей Цикл - - СтрокаТекущегоПрофиля = ТекущиеПрофили.Найти( - Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор), - "ИдентификаторПоставляемыхДанных"); - - ПрофильОбновлен = Ложь; - - Если СтрокаТекущегоПрофиля = Неопределено Тогда - // Создание нового поставляемого профиля. - Если ОбновитьПрофильГруппДоступа(СвойстваПрофиля, Истина) Тогда - ЕстьИзменения = Истина; - КонецЕсли; - Профиль = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Идентификатор); - - Иначе - СтрокаТекущегоПрофиля.Найден = Истина; - - Профиль = СтрокаТекущегоПрофиля.Ссылка; - Если НЕ СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен - ИЛИ ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда - // Обновление поставляемого профиля. - ПрофильОбновлен = ОбновитьПрофильГруппДоступа(СвойстваПрофиля, Истина); - КонецЕсли; - КонецЕсли; - - Если ПараметрыОбновления.ОбновлятьГруппыДоступа Тогда - ГруппыДоступаПрофиляОбновлены = Справочники.ГруппыДоступа.ОбновитьГруппыДоступаПрофиля( - Профиль, ПараметрыОбновления.ОбновлятьГруппыДоступаСУстаревшимиНастройками); - - ПрофильОбновлен = ПрофильОбновлен ИЛИ ГруппыДоступаПрофиляОбновлены; - КонецЕсли; - - Если ПрофильОбновлен Тогда - ЕстьИзменения = Истина; - ОбновленныеПрофили.Добавить(Профиль); - КонецЕсли; - КонецЦикла; - - Для Каждого СтрокаТекущегоПрофиля Из ТекущиеПрофили Цикл - Если СтрокаТекущегоПрофиля.Найден Тогда - Продолжить; - КонецЕсли; - Если СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен Тогда - Продолжить; - КонецЕсли; - ПрофильОбъект = СтрокаТекущегоПрофиля.Ссылка.ПолучитьОбъект(); - Если ПрофильОбъект.ПометкаУдаления Тогда - Продолжить; - КонецЕсли; - ПрофильОбъект.ПометкаУдаления = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект); - ОбновленныеПрофили.Добавить(ПрофильОбъект.Ссылка); - ЕстьИзменения = Истина; - КонецЦикла; - + ОбновленныеПрофили = Новый Массив; + ОбновитьПоставляемыеПрофилиБезПапок(ОбновленныеПрофили, + ТекущиеПрофили, ТекущиеПапкиПрофилей, ПоставляемыеПрофили, ЕстьИзменения); + ОтвязатьУстаревшиеПоставляемыеДанные(ТекущиеПрофили, ЕстьИзменения, ОбновленныеПрофили); ОбновитьВспомогательныеДанныеПрофилей(ОбновленныеПрофили, ЕстьИзменения); КонецПроцедуры @@ -373,24 +321,172 @@ КонецФункции -// Возвращает ссылку на поставляемый профиль по идентификатору. +// См. УправлениеДоступом.ПрофильАдминистратор +Функция ПрофильАдминистратор() Экспорт + + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПрофилиГруппДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных = &ИдентификаторПоставляемыхДанных + | + |УПОРЯДОЧИТЬ ПО + | Ссылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПрофилиГруппДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | ПрофилиГруппДоступа.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + + Идентификатор = Новый УникальныйИдентификатор(ИдентификаторПрофиляАдминистратор()); + Запрос.УстановитьПараметр("ИдентификаторПоставляемыхДанных", Идентификатор); + Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", "Администратор"); + + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + ВыборкаПоИдентификатору = РезультатыЗапроса[0].Выбрать(); + ВыборкаПоПредопределенному = РезультатыЗапроса[1].Выбрать(); + + Если ВыборкаПоИдентификатору.Следующий() + И ВыборкаПоПредопределенному.Следующий() + И ВыборкаПоИдентификатору.Количество() = 1 + И ВыборкаПоПредопределенному.Количество() = 1 + И ВыборкаПоИдентификатору.Ссылка = ВыборкаПоПредопределенному.Ссылка Тогда + + Возврат ВыборкаПоИдентификатору.Ссылка; + КонецЕсли; + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + Блокировка.Добавить("Справочник.ГруппыДоступа"); + + ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); + СвойстваПрофиляАдминистратор = ПоставляемыеПрофили.ОписанияПрофилей.Получить( + ИдентификаторПрофиляАдминистратор()); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + ВыборкаПоИдентификатору = РезультатыЗапроса[0].Выбрать(); + ВыборкаПоПредопределенному = РезультатыЗапроса[1].Выбрать(); + Если ВыборкаПоИдентификатору.Следующий() Тогда + ПрофильОбъект = ВыборкаПоИдентификатору.Ссылка.ПолучитьОбъект(); + Если ПрофильОбъект.ИмяПредопределенныхДанных <> "Администратор" Тогда + ПрофильОбъект.ИмяПредопределенныхДанных = "Администратор"; + КонецЕсли; + ИначеЕсли ВыборкаПоПредопределенному.Следующий() Тогда + ПрофильОбъект = ВыборкаПоПредопределенному.Ссылка.ПолучитьОбъект(); + ПрофильОбъект.ИдентификаторПоставляемыхДанных = Идентификатор; + Иначе + ПрофильПоНаименованию = ПрофильПоНаименованию( + НСтр("ru = 'Администратор'", ОбщегоНазначения.КодОсновногоЯзыка())); + Если ЗначениеЗаполнено(ПрофильПоНаименованию) Тогда + ПрофильОбъект = ПрофильПоНаименованию.ПолучитьОбъект(); + Иначе + ПрофильОбъект = СоздатьЭлемент(); + КонецЕсли; + ПрофильОбъект.ИдентификаторПоставляемыхДанных = Идентификатор; + ПрофильОбъект.ИмяПредопределенныхДанных = "Администратор"; + КонецЕсли; + Если ПрофильОбъект.Модифицированность() Тогда + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь, Ложь); + КонецЕсли; + + ОбъектыДляОтвязки = Новый Соответствие; + Пока ВыборкаПоИдентификатору.Следующий() Цикл + Если ВыборкаПоИдентификатору.Ссылка <> ПрофильОбъект.Ссылка Тогда + ОбъектыДляОтвязки.Вставить(ВыборкаПоИдентификатору.Ссылка); + КонецЕсли; + КонецЦикла; + Пока ВыборкаПоПредопределенному.Следующий() Цикл + Если ВыборкаПоПредопределенному.Ссылка <> ПрофильОбъект.Ссылка Тогда + ОбъектыДляОтвязки.Вставить(ВыборкаПоПредопределенному.Ссылка); + КонецЕсли; + КонецЦикла; + Для Каждого КлючИЗначение Из ОбъектыДляОтвязки Цикл + ТекущийПрофильОбъект = КлючИЗначение.Ключ.ПолучитьОбъект(); + ТекущийПрофильОбъект.ИдентификаторПоставляемыхДанных = Неопределено; + ТекущийПрофильОбъект.ИмяПредопределенныхДанных = ""; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийПрофильОбъект, Ложь, Ложь); + КонецЦикла; + Для Каждого КлючИЗначение Из ОбъектыДляОтвязки Цикл + ТекущийПрофильОбъект = КлючИЗначение.Ключ.ПолучитьОбъект(); + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийПрофильОбъект); + КонецЦикла; + + ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиляАдминистратор); + Справочники.ГруппыДоступа.ГруппаДоступаАдминистраторы(ПрофильОбъект.Ссылка); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Возврат ПрофильОбъект.Ссылка; + +КонецФункции + +// Для функции ПрофильАдминистратор. +Функция ПрофильПоНаименованию(Наименование) + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Наименование", Наименование); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ПрофилиГруппДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | ПрофилиГруппДоступа.Наименование = &Наименование + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Возврат Выборка.Ссылка; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Возвращает ссылку на поставляемый профиль или папку профилей по идентификатору. // // Параметры: -// Идентификатор - Строка - имя или уникальный идентификатор поставляемого профиля. +// Идентификатор - Строка - имя или уникальный идентификатор поставляемого профиля или папки профилей, +// как указано в процедуре ПриЗаполненииПоставляемыхПрофилейГруппДоступа +// общего модуля УправлениеДоступомПереопределяемый. +// // ВызыватьИсключениеЕслиНетВБазеДанных - Булево +// БезПапок - Булево // // Возвращаемое значение: -// СправочникСсылка.ПрофилиГруппДоступа -// Неопределено +// СправочникСсылка.ПрофилиГруппДоступа - если поставляемый профиль или папка профилей найдена в справочнике. +// Неопределено - если поставляемый профиль или папка профилей не существует в справочнике. // -Функция ПоставляемыйПрофильПоИдентификатору(Идентификатор, ВызыватьИсключениеЕслиНетВБазеДанных = Ложь) Экспорт +Функция ПоставляемыйПрофильПоИдентификатору(Идентификатор, ВызыватьИсключениеЕслиНетВБазеДанных = Ложь, БезПапок = Ложь) Экспорт УстановитьПривилегированныйРежим(Истина); ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей(); СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(Строка(Идентификатор)); // См. СвойстваПоставляемогоПрофиля - Если СвойстваПрофиля = Неопределено Тогда + Если СвойстваПрофиля = Неопределено Или СвойстваПрофиля.ЭтоГруппа И БезПапок Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Профиль c идентификатором ""%1"" |не поставляется в программе.'"), @@ -407,7 +503,10 @@ |ИЗ | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа |ГДЕ - | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных = &ИдентификаторПоставляемыхДанных"; + | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных = &ИдентификаторПоставляемыхДанных + | + |УПОРЯДОЧИТЬ ПО + | Ссылка"; Выборка = Запрос.Выполнить().Выбрать(); @@ -461,7 +560,7 @@ КонецФункции -// Проверяет изменен ли поставляемый профиль по сравнению с описанием из процедуры. +// Проверяет изменен ли поставляемый профиль или папка профилей по сравнению с описанием из процедуры // УправлениеДоступомПереопределяемый.ЗаполнитьПоставляемыеПрофилиГруппДоступа(). // // Параметры: @@ -477,7 +576,8 @@ Функция ПоставляемыйПрофильИзменен(Профиль) Экспорт Если ТипЗнч(Профиль) = Тип("СправочникСсылка.ПрофилиГруппДоступа") Тогда - Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Профиль, "ПоставляемыйПрофильИзменен"); + Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Профиль, + "ПоставляемыйПрофильИзменен") = Истина; КонецЕсли; ОписанияПрофилей = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилей().ОписанияПрофилей; @@ -487,16 +587,27 @@ Возврат Ложь; КонецЕсли; - ОписаниеРолейПрофиля = ОписаниеРолейПрофиля(СвойстваПрофиля); - Если ВРег(Профиль.Наименование) <> ВРег(СвойстваПрофиля.Наименование) Тогда Возврат Истина; КонецЕсли; + Если ЗначениеЗаполнено(СвойстваПрофиля.Родитель) Тогда + Родитель = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Родитель); + Если ЗначениеЗаполнено(Родитель) И Профиль.Родитель <> Родитель Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Если СвойстваПрофиля.ЭтоГруппа Тогда + Возврат Ложь; + КонецЕсли; + + ОписаниеРолейПрофиля = ОписаниеРолейПрофиля(СвойстваПрофиля); + Если Профиль.Роли.Количество() <> ОписаниеРолейПрофиля.Количество() - ИЛИ Профиль.ВидыДоступа.Количество() <> СвойстваПрофиля.ВидыДоступа.Количество() - ИЛИ Профиль.ЗначенияДоступа.Количество() <> СвойстваПрофиля.ЗначенияДоступа.Количество() - ИЛИ Профиль.Назначение.Количество() <> СвойстваПрофиля.Назначение.Количество() Тогда + Или Профиль.ВидыДоступа.Количество() <> СвойстваПрофиля.ВидыДоступа.Количество() + Или Профиль.ЗначенияДоступа.Количество() <> СвойстваПрофиля.ЗначенияДоступа.Количество() + Или Профиль.Назначение.Количество() <> СвойстваПрофиля.Назначение.Количество() Тогда Возврат Истина; КонецЕсли; @@ -515,7 +626,7 @@ КонецЕсли; КонецЦикла; - Для каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл + Для Каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеВидаДоступа.Ключ); Отбор = Новый Структура; Отбор.Вставить("ВидДоступа", СвойстваВидаДоступа.Ссылка); @@ -526,7 +637,7 @@ КонецЕсли; КонецЦикла; - Для каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл + Для Каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл Отбор = Новый Структура; Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(ЗначениеДоступа) КАК Значение", "ЗначениеДоступа", ОписаниеЗначенияДоступа.ЗначениеДоступа)); @@ -572,13 +683,17 @@ // Не поставляемый профиль не может иметь запрета изменения. // // Параметры: -// Профиль - СправочникОбъект.ПрофилиГруппДоступа, -// ДанныеФормыСтруктура созданные по объекту. +// Профиль - СправочникОбъект.ПрофилиГруппДоступа +// - ДанныеФормыСтруктура - созданные по объекту. +// +// РодительТолькоПросмотр - Булево - возвращаемое значение - устанавливается Истина, +// если родитель заполнен у поставляемого профиля и +// изменение поставляемого профиля запрещено. // // Возвращаемое значение: // Булево // -Функция ЗапретИзмененияПрофиля(Знач Профиль) Экспорт +Функция ЗапретИзмененияПрофиля(Знач Профиль, РодительТолькоПросмотр = Ложь) Экспорт Если Профиль.ИдентификаторПоставляемыхДанных = Новый УникальныйИдентификатор(ИдентификаторПрофиляАдминистратор()) Тогда @@ -591,8 +706,15 @@ СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить( Строка(Профиль.ИдентификаторПоставляемыхДанных)); - Возврат СвойстваПрофиля <> Неопределено - И ПоставляемыеПрофили.ПараметрыОбновления.ЗапретитьИзменениеПрофилей; + ЗапретИзменения = СвойстваПрофиля <> Неопределено + И (ПоставляемыеПрофили.ПараметрыОбновления.ЗапретитьИзменениеПрофилей + Или СвойстваПрофиля.ЭтоГруппа); + + Если ЗапретИзменения И ЗначениеЗаполнено(СвойстваПрофиля.Родитель) Тогда + РодительТолькоПросмотр = Истина; + КонецЕсли; + + Возврат ЗапретИзменения; КонецФункции @@ -637,9 +759,9 @@ Если СвойстваПрофиля <> Неопределено Тогда - ОбновитьПрофильГруппДоступа(СвойстваПрофиля); + ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля); - Если ОбновитьГруппыДоступа Тогда + Если ОбновитьГруппыДоступа И Не СвойстваПрофиля.ЭтоГруппа Тогда Справочники.ГруппыДоступа.ОбновитьГруппыДоступаПрофиля(Профиль, Истина); КонецЕсли; КонецЕсли; @@ -770,35 +892,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Начальное заполнение - -// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов -// -// Параметры: -// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки -// -Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт - - Настройки.ПриНачальномЗаполненииЭлемента = Ложь; - -КонецПроцедуры - -// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов -// -// Параметры: -// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков -// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы -// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти -// -Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт - - Элемент = Элементы.Добавить(); - Элемент.ИмяПредопределенныхДанных = "Администратор"; - Элемент.Наименование = НСтр("ru = 'Администратор'", ОбщегоНазначения.КодОсновногоЯзыка()); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для поддержки обмена данными в РИБ. @@ -863,9 +956,10 @@ Выборка = Запрос.Выполнить().Выбрать(); // АПК:1328-вкл. + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + Пока Выборка.Следующий() Цикл - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); НачатьТранзакцию(); Попытка @@ -906,29 +1000,47 @@ ТребуетсяРегистрация = Ложь; Профиль = ЭлементДанных.Ссылка; + ИзмененныеРоли = Неопределено; Если ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта") Тогда ТребуетсяРегистрация = Истина; + ИзмененныеРоли = ?(СтарыеЗначения.ПометкаУдаления, Новый Массив, + СтарыеЗначения.Роли.Выгрузить().ВыгрузитьКолонку("Роль")); ИначеЕсли СтарыеЗначения.Ссылка <> ЭлементДанных.Ссылка Тогда ТребуетсяРегистрация = Истина; Профиль = ПользователиСлужебный.СсылкаОбъекта(ЭлементДанных); + ИзмененныеРоли = ?(ЭлементДанных.ПометкаУдаления, Новый Массив, + ЭлементДанных.Роли.ВыгрузитьКолонку("Роль")); - ИначеЕсли СтарыеЗначения.ПометкаУдаления <> ЭлементДанных.ПометкаУдаления - Или ИзменилисьВидыИлиЗначенияДоступаИлиНазначение(СтарыеЗначения, ЭлементДанных) Тогда - + ИначеЕсли СтарыеЗначения.ПометкаУдаления <> ЭлементДанных.ПометкаУдаления Тогда ТребуетсяРегистрация = Истина; - Иначе - СтарыеРоли = СтарыеЗначения.Роли.Выгрузить(); - Если СтарыеРоли.Количество() <> ЭлементДанных.Роли.Количество() Тогда + ИзмененныеРоли = ?(ЭлементДанных.ПометкаУдаления, + СтарыеЗначения.Роли.Выгрузить().ВыгрузитьКолонку("Роль"), + ЭлементДанных.Роли.ВыгрузитьКолонку("Роль")); + + ИначеЕсли ИзменилисьВидыИлиЗначенияДоступаИлиНазначение(СтарыеЗначения, ЭлементДанных) Тогда + ТребуетсяРегистрация = Истина; + КонецЕсли; + + Если ИзмененныеРоли = Неопределено Тогда + СтарыеРоли = СтарыеЗначения.Роли.Выгрузить(); // ТаблицаЗначений + СтарыеРоли.Индексы.Добавить("Роль"); + НовыеРоли = ЭлементДанных.Роли.Выгрузить(); + НовыеРоли.Индексы.Добавить("Роль"); + ИзмененныеРоли = Новый Массив; + Для Каждого Строка Из НовыеРоли Цикл + Если СтарыеРоли.Найти(Строка.Роль, "Роль") = Неопределено Тогда + ИзмененныеРоли.Добавить(Строка.Роль); + КонецЕсли; + КонецЦикла; + Для Каждого Строка Из СтарыеРоли Цикл + Если НовыеРоли.Найти(Строка.Роль, "Роль") = Неопределено Тогда + ИзмененныеРоли.Добавить(Строка.Роль); + КонецЕсли; + КонецЦикла; + Если ИзмененныеРоли.Количество() > 0 Тогда ТребуетсяРегистрация = Истина; - Иначе - Для Каждого Строка Из ЭлементДанных.Роли Цикл - Если СтарыеРоли.Найти(Строка.Роль, "Роль") = Неопределено Тогда - ТребуетсяРегистрация = Истина; - Прервать; - КонецЕсли; - КонецЦикла; КонецЕсли; КонецЕсли; @@ -938,6 +1050,10 @@ Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("Профили", Профиль); + Если УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда + Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("Роли", ИзмененныеРоли); + КонецЕсли; + КонецПроцедуры // Только для внутреннего использования. @@ -964,6 +1080,26 @@ Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("Профили", Null); + Если Не УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда + Возврат; + КонецЕсли; + + ИзмененныеРоли = Справочники.ГруппыДоступа.ЗарегистрированныеСсылки("Роли"); + Если ИзмененныеРоли.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если ИзмененныеРоли.Количество() = 1 + И ИзмененныеРоли[0] = Неопределено Тогда + + ИзмененныеРоли = Неопределено; + КонецЕсли; + + УправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступаПриИзмененииРолейПрофиля( + "ОбновитьВспомогательныеДанныеПрофилейИзмененныхПриЗагрузке", ИзмененныеРоли); + + Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("Роли", Null); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -984,9 +1120,12 @@ // Описание для заполнения предопределенного профиля "Администратор". ОписаниеПрофиляАдминистратор = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(); ЗаполнитьПрофильАдминистратор(ОписаниеПрофиляАдминистратор); - ОписанияПрофилей.Добавить(ОписаниеПрофиляАдминистратор); + ОписаниеПапкиПрофилей = УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа(); + ЗаполнитьПапкуПрофилейДополнительныеПрофили(ОписаниеПапкиПрофилей); + ОписанияПрофилей.Добавить(ОписаниеПапкиПрофилей); + ИнтеграцияПодсистемБСП.ПриЗаполненииПоставляемыхПрофилейГруппДоступа( ОписанияПрофилей, ПараметрыОбновления); @@ -1040,6 +1179,20 @@ КонецПроцедуры +// Для функции ЗаполненныеПоставляемыеПрофили. +// +// Параметры: +// ОписаниеПрофиляАдминистратор - см. УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа +// +Процедура ЗаполнитьПапкуПрофилейДополнительныеПрофили(ОписаниеПапки) + + ОписаниеПапки = УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа(); + ОписаниеПапки.Имя = "ДополнительныеПрофили"; + ОписаниеПапки.Идентификатор = "69a066e7-ce81-11eb-881c-b06ebfbf08c7"; + ОписаниеПапки.Наименование = НСтр("ru = 'Дополнительные профили'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецПроцедуры + // Возвращаемое значение: // см. ОписаниеПоставляемыхПрофилей // @@ -1058,309 +1211,437 @@ Если ПараметрыОбновления.ЗапретитьИзменениеПрофилей И НЕ ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда - ВызватьИсключение ЗаголовокОшибки + ТекстОшибки = ЗаголовокОшибки + НСтр("ru = 'Когда в параметре ПараметрыОбновления свойство |ОбновлятьИзмененныеПрофили установлено Ложь, |тогда свойство ЗапретитьИзменениеПрофилей тоже |должно быть установлено Ложь.'"); + ВызватьИсключение ТекстОшибки; КонецЕсли; ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие; - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); // Преобразование описаний в соответствие идентификаторов и // свойств для хранения и быстрой обработки. - СвойстваПрофилей = Новый Соответствие; + ВсеИмена = Новый Соответствие; + ВсеИдентификаторы = Новый Соответствие; + ИменаПапокПрофилей = Новый Соответствие; + СвойстваПрофилей = Новый Соответствие; ОписанияПрофилейМассив = Новый Массив; Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл ОписаниеПрофиля.Удалить("Описание"); - // Идентификатор профиля. + ЭтоГруппа = Не ОписаниеПрофиля.Свойство("Роли"); + Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Идентификатор) Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" не заполнено свойство Идентификатор.'"), + ШаблонОшибки = ?(ЭтоГруппа, + НСтр("ru = 'В описании папки профилей ""%1"" не заполнено свойство Идентификатор.'"), + НСтр("ru = 'В описании профиля ""%1"" не заполнено свойство Идентификатор.'")); + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование)); - + ВызватьИсключение ТекстОшибки; ИначеЕсли Не СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ОписаниеПрофиля.Идентификатор) Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" указан некорректный идентификатор: ""%2"".'"), + ШаблонОшибки = ?(ЭтоГруппа, + НСтр("ru = 'В описании папки профилей ""%1"" указан некорректный идентификатор: ""%2"".'"), + НСтр("ru = 'В описании профиля ""%1"" указан некорректный идентификатор: ""%2"".'")); + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование), ОписаниеПрофиля.Идентификатор); + ВызватьИсключение ТекстОшибки; КонецЕсли; СвойстваПрофиля = Новый Структура; СвойстваПрофиля.Вставить("Имя", ""); + СвойстваПрофиля.Вставить("Родитель", ""); СвойстваПрофиля.Вставить("Идентификатор", ""); СвойстваПрофиля.Вставить("Наименование", ""); СвойстваПрофиля.Вставить("Роли", Новый Массив); ЗаполнитьЗначенияСвойств(СвойстваПрофиля, ОписаниеПрофиля); + СвойстваПрофиля.Вставить("ЭтоГруппа", ЭтоГруппа); - // Назначение профиля. - Если ОписаниеПрофиля.Назначение.Количество() = 0 Тогда - ОписаниеПрофиля.Назначение.Добавить(Тип("СправочникСсылка.Пользователи")); - КонецЕсли; - МассивНазначений = Новый Массив; - Для Каждого Тип Из ОписаниеПрофиля.Назначение Цикл - Если ТипЗнч(Тип) = Тип("ОписаниеТипов") Тогда - Типы = Тип.Типы(); - Иначе - Типы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Тип); - КонецЕсли; - Для Каждого Тип Из Типы Цикл - Если ТипЗнч(Тип) <> Тип("Тип") - Или Не ОбщегоНазначения.ЭтоСсылка(Тип) - Или Не Метаданные.ОпределяемыеТипы.Пользователь.Тип.СодержитТип(Тип) - Или Тип <> Тип("СправочникСсылка.Пользователи") - И Не Метаданные.ОпределяемыеТипы.ВнешнийПользователь.Тип.СодержитТип(Тип) Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |указано недопустимое назначение ""%2 (%3)"". - |Ожидается назначение, как значение типа ""Тип"" для ссылки, - |указанное в определяемом типе Пользователь и - |указанное в определяемом типе ВнешнийПользователь - |(кроме типа СправочникСсылка.Пользователи).'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - Строка(Тип), Строка(ТипЗнч(Тип))); - КонецЕсли; - ОписаниеТипаСсылки = Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Тип)); - Значение = ОписаниеТипаСсылки.ПривестиЗначение(Неопределено); - МассивНазначений.Добавить(Значение); - КонецЦикла; - КонецЦикла; - СвойстваПрофиля.Вставить("Назначение", МассивНазначений); - - // Проверка ролей. - НазначениеПрофиля = УправлениеДоступомСлужебныйКлиентСервер.НазначениеПрофиля(СвойстваПрофиля); - НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеПрофиля, Ложь); - ПроверенныеРоли = Новый Соответствие; - ИндексРоли = ОписаниеПрофиля.Роли.Количество(); - Пока ИндексРоли > 0 Цикл - ИндексРоли = ИндексРоли - 1; - Роль = ОписаниеПрофиля.Роли[ИндексРоли]; - // Проверка наличия ролей в метаданных. - Если ВсеРоли.Получить(Роль) = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1 (%2)"" - |указана несуществующая роль ""%3"".'"), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор, - Роль); - КонецЕсли; - // Удаление дублей ролей. - Если ПроверенныеРоли.Получить(ВРег(Роль)) <> Неопределено Тогда - ОписаниеПрофиля.Роли.Удалить(ИндексРоли); - Продолжить; - КонецЕсли; - ПроверенныеРоли.Вставить(ВРег(Роль), Истина); - // Проверка соответствия назначения ролей и профиля. - Если НедоступныеРоли.Получить(Роль) <> Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1 (%2)"" - |указана роль ""%3"", - |которая не соответствует назначению профиля: - |""%4"".'"), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор, - Роль, - ПредставлениеНазначенияПрофиля(НазначениеПрофиля)); - КонецЕсли; - КонецЦикла; - Если ОбщегоНазначения.РазделениеВключено() Тогда - // Заполнение списка недоступных ролей в модели сервиса - // для определения необходимости обновления поставляемых профилей. - СвойстваПрофиля.Вставить("РолиНедоступныеВСервисе", - РолиПрофиляНедоступныеВСервисе(ОписаниеПрофиля, НазначениеПрофиля)); - КонецЕсли; - - Если СвойстваПрофилей.Получить(СвойстваПрофиля.Идентификатор) <> Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Профиль с идентификатором ""%1"" уже существует.'"), + Если ВсеИдентификаторы.Получить(ВРег(СвойстваПрофиля.Идентификатор)) <> Неопределено Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идентификатор ""%1"" уже используется в описании другого профиля или папки профилей.'"), СвойстваПрофиля.Идентификатор); + ВызватьИсключение ТекстОшибки; КонецЕсли; + ВсеИдентификаторы.Вставить(ВРег(СвойстваПрофиля.Идентификатор), Истина); СвойстваПрофилей.Вставить(СвойстваПрофиля.Идентификатор, СвойстваПрофиля); ОписанияПрофилейМассив.Добавить(СвойстваПрофиля); - Если ЗначениеЗаполнено(СвойстваПрофиля.Имя) Тогда - Если СвойстваПрофилей.Получить(СвойстваПрофиля.Имя) <> Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Профиль с именем ""%1"" уже существует.'"), + + Если ЭтоГруппа И Не ЗначениеЗаполнено(СвойстваПрофиля.Имя) Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании папки профилей ""%1"" не заполнено свойство Имя.'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Наименование), ОписаниеПрофиля.Наименование, ОписаниеПрофиля.Идентификатор)); + ВызватьИсключение ТекстОшибки; + ИначеЕсли ЗначениеЗаполнено(СвойстваПрофиля.Имя) Тогда + Если СокрЛП(СвойстваПрофиля.Имя) <> СвойстваПрофиля.Имя Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя ""%1"" профиля или папки профилей содержит непечатаемые символы.'"), СвойстваПрофиля.Имя); + ВызватьИсключение ТекстОшибки; КонецЕсли; + Если ВсеИмена.Получить(ВРег(СвойстваПрофиля.Имя)) <> Неопределено Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя ""%1"" уже используется в описании другого профиля или папки профилей.'"), + СвойстваПрофиля.Имя); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ВсеИмена.Вставить(ВРег(СвойстваПрофиля.Имя), Истина); СвойстваПрофилей.Вставить(СвойстваПрофиля.Имя, СвойстваПрофиля); КонецЕсли; - // Преобразование СпискаЗначений к Соответствию для фиксации. - ВидыДоступа = Новый Соответствие; - Для Каждого ЭлементСписка Из ОписаниеПрофиля.ВидыДоступа Цикл - ИмяВидаДоступа = ЭлементСписка.Значение; - УточнениеВидаДоступа = ЭлементСписка.Представление; - Если СвойстваВидовДоступа.ПоИменам.Получить(ИмяВидаДоступа) = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |указан несуществующий вид доступа ""%2"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ИмяВидаДоступа); - КонецЕсли; - - ВидДоступаСоответствуетНазначениюПрофиля = - УправлениеДоступомСлужебныйКлиентСервер.ВидДоступаСоответствуетНазначениюПрофиля( - ИмяВидаДоступа, НазначениеПрофиля); - - Если Не ВидДоступаСоответствуетНазначениюПрофиля Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |указан вид доступа ""%2"" - |который не соответствует назначению профиля: - |""%3"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ИмяВидаДоступа, - ПредставлениеНазначенияПрофиля(НазначениеПрофиля)); - КонецЕсли; - Если УточнениеВидаДоступа <> "" - И УточнениеВидаДоступа <> "ВначалеВсеЗапрещены" - И УточнениеВидаДоступа <> "Предустановленный" - И УточнениеВидаДоступа <> "ВначалеВсеРазрешены" Тогда - - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |для вида доступа ""%2"" указано неизвестное уточнение ""%3"". - | - |Допустимы только следующие уточнения: - |- ""ВначалеВсеЗапрещены"" или """", - |- ""ВначалеВсеРазрешены"", - |- ""Предустановленный"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ИмяВидаДоступа, - УточнениеВидаДоступа); - КонецЕсли; - ВидыДоступа.Вставить(ИмяВидаДоступа, УточнениеВидаДоступа); - КонецЦикла; - СвойстваПрофиля.Вставить("ВидыДоступа", ВидыДоступа); - // Удаление повторяющихся значений. - ЗначенияДоступа = Новый Массив; - ТаблицаЗначенийДоступа = Новый ТаблицаЗначений; - ТаблицаЗначенийДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); - ТаблицаЗначенийДоступа.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + Если ЭтоГруппа Тогда + ИменаПапокПрофилей.Вставить(ВРег(СвойстваПрофиля.Имя), СвойстваПрофиля.Родитель); + Продолжить; + КонецЕсли; - Для Каждого ЭлементСписка Из ОписаниеПрофиля.ЗначенияДоступа Цикл - Отбор = Новый Структура; - Отбор.Вставить("ВидДоступа", ЭлементСписка.Значение); - Отбор.Вставить("ЗначениеДоступа", ЭлементСписка.Представление); - ВидДоступа = Отбор.ВидДоступа; - ЗначениеДоступа = Отбор.ЗначениеДоступа; - - СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ВидДоступа); - Если СвойстваВидаДоступа = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |указан несуществующий вид доступа ""%2"" - |для значения доступа - |""%3"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ВидДоступа, - ЗначениеДоступа); + ПодготовитьНазначениеПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, ЗаголовокОшибки); + + НазначениеПрофиля = УправлениеДоступомСлужебныйКлиентСервер.НазначениеПрофиля(СвойстваПрофиля); + ПодготовитьРолиПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, НазначениеПрофиля, ВсеРоли, ЗаголовокОшибки); + + ПодготовитьВидыДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, НазначениеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки); + ПодготовитьЗначенияДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки); + КонецЦикла; + + Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл + Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Родитель) Тогда + Продолжить; + КонецЕсли; + Если ИменаПапокПрофилей.Получить(ВРег(ОписаниеПрофиля.Родитель)) <> Неопределено Тогда + Продолжить; + КонецЕсли; + ЭтоГруппа = Не ОписаниеПрофиля.Свойство("Роли"); + ШаблонОшибки = ?(ЭтоГруппа, + НСтр("ru = 'В описании папки профилей ""%1"" в свойстве родитель + |указано несуществующее имя папки профилей ""%2"".'"), + НСтр("ru = 'В описании профиля ""%1"" в свойстве родитель + |указано несуществующее имя папки профилей ""%2"".'")); + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование), + ОписаниеПрофиля.Родитель); + ВызватьИсключение ТекстОшибки; + КонецЦикла; + + ПапкиПоРодителям = Новый Соответствие; + Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл + ЭтоГруппа = Не ОписаниеПрофиля.Свойство("Роли"); + Если Не ЭтоГруппа Тогда + Продолжить; + КонецЕсли; + ПапкиРодителя = ПапкиПоРодителям.Получить(ОписаниеПрофиля.Родитель); + Если ПапкиРодителя = Неопределено Тогда + ПапкиРодителя = Новый Соответствие; + ПапкиПоРодителям.Вставить(ОписаниеПрофиля.Родитель, ПапкиРодителя); + КонецЕсли; + ПапкиРодителя.Вставить(ОписаниеПрофиля.Имя, Истина); + Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Родитель) Тогда + Продолжить; + КонецЕсли; + РодителиПапки = Новый Массив; + Родитель = ОписаниеПрофиля.Родитель; + Пока Истина Цикл + РодителиПапки.Добавить(Родитель); + Родитель = ИменаПапокПрофилей.Получить(ВРег(Родитель)); + Если Не ЗначениеЗаполнено(Родитель) Тогда + Прервать; КонецЕсли; - - ОбъектМетаданных = Неопределено; - ПозицияТочки = СтрНайти(ЗначениеДоступа, "."); - Если ПозицияТочки > 0 Тогда - ВидОбъектаМетаданных = Лев(ЗначениеДоступа, ПозицияТочки - 1); - ОстатокСтроки = Сред(ЗначениеДоступа, ПозицияТочки + 1); - ПозицияТочки = СтрНайти(ОстатокСтроки, "."); - Если ПозицияТочки > 0 Тогда - ИмяОбъектаМетаданных = Лев(ОстатокСтроки, ПозицияТочки - 1); - ПолноеИмяОбъектаМетаданных = ВидОбъектаМетаданных + "." + ИмяОбъектаМетаданных; - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); - КонецЕсли; + Если РодителиПапки.Найти(Родитель) = Неопределено Тогда + Продолжить; КонецЕсли; - - Если ОбъектМетаданных = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |для вида доступа ""%2"" - |не существует тип указанного значения доступа - |""%3"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ВидДоступа, - ЗначениеДоступа); - КонецЕсли; - - Попытка - ПустаяСсылкаЗначенияДоступа = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( - ПолноеИмяОбъектаМетаданных).ПустаяСсылка(); - Исключение - ПустаяСсылкаЗначенияДоступа = Неопределено; - КонецПопытки; - - Если ПустаяСсылкаЗначенияДоступа = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |для вида доступа ""%2"" - |указан не ссылочный тип значения доступа - |""%3"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ВидДоступа, - ЗначениеДоступа); - КонецЕсли; - ТипЗначенияДоступа = ТипЗнч(ПустаяСсылкаЗначенияДоступа); - - СвойстваВидаДоступаПоТипу = СвойстваВидовДоступа.ПоТипамЗначений.Получить(ТипЗначенияДоступа); // См. УправлениеДоступомСлужебный.СвойстваВидаДоступа - Если СвойстваВидаДоступаПоТипу = Неопределено - ИЛИ СвойстваВидаДоступаПоТипу.Имя <> ВидДоступа Тогда - - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |указано значение доступа ""%3"" - |типа, который не указан в свойствах вида доступа ""%2"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ВидДоступа, - ЗначениеДоступа); - КонецЕсли; - - Если ТаблицаЗначенийДоступа.НайтиСтроки(Отбор).Количество() > 0 Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |для вида доступа ""%2"" - |повторно указано значение доступа - |""%3"".'"), - ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), - ОписаниеПрофиля.Имя, - ОписаниеПрофиля.Идентификатор), - ВидДоступа, - ЗначениеДоступа); - КонецЕсли; - ЗначенияДоступа.Добавить(Отбор); + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании папки профилей ""%1"" в свойстве родитель + |указано имя папки профилей ""%2"", + |создающее циклическую зависимость: ""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование), + ОписаниеПрофиля.Родитель, + СтрСоединить(РодителиПапки, " -> ")); + ВызватьИсключение ТекстОшибки; КонецЦикла; - СвойстваПрофиля.Вставить("ЗначенияДоступа", ЗначенияДоступа); КонецЦикла; ПоставляемыеПрофили = Новый Структура; ПоставляемыеПрофили.Вставить("ПараметрыОбновления", ПараметрыОбновления); ПоставляемыеПрофили.Вставить("ОписанияПрофилей", СвойстваПрофилей); ПоставляемыеПрофили.Вставить("ОписанияПрофилейМассив", ОписанияПрофилейМассив); + ПоставляемыеПрофили.Вставить("ПапкиПоРодителям", ПапкиПоРодителям); Возврат ОбщегоНазначения.ФиксированныеДанные(ПоставляемыеПрофили); КонецФункции +// Для функции ПоставляемыеПрофили. +Процедура ПодготовитьНазначениеПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, ЗаголовокОшибки) + + Если ОписаниеПрофиля.Назначение.Количество() = 0 Тогда + ОписаниеПрофиля.Назначение.Добавить(Тип("СправочникСсылка.Пользователи")); + КонецЕсли; + МассивНазначений = Новый Массив; + Для Каждого Тип Из ОписаниеПрофиля.Назначение Цикл + Если ТипЗнч(Тип) = Тип("ОписаниеТипов") Тогда + Типы = Тип.Типы(); + Иначе + Типы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Тип); + КонецЕсли; + Для Каждого Тип Из Типы Цикл + Если ТипЗнч(Тип) <> Тип("Тип") + Или Не ОбщегоНазначения.ЭтоСсылка(Тип) + Или Не Метаданные.ОпределяемыеТипы.Пользователь.Тип.СодержитТип(Тип) + Или Тип <> Тип("СправочникСсылка.Пользователи") + И Не Метаданные.ОпределяемыеТипы.ВнешнийПользователь.Тип.СодержитТип(Тип) Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указано недопустимое назначение ""%2 (%3)"". + |Ожидается назначение, как значение типа ""Тип"" для ссылки, + |указанное в определяемом типе Пользователь и + |указанное в определяемом типе ВнешнийПользователь + |(кроме типа СправочникСсылка.Пользователи).'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + Строка(Тип), Строка(ТипЗнч(Тип))); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ОписаниеТипаСсылки = Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Тип)); + Значение = ОписаниеТипаСсылки.ПривестиЗначение(Неопределено); + МассивНазначений.Добавить(Значение); + КонецЦикла; + КонецЦикла; + СвойстваПрофиля.Вставить("Назначение", МассивНазначений); + +КонецПроцедуры + +// Для функции ПоставляемыеПрофили. +Процедура ПодготовитьРолиПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, + НазначениеПрофиля, ВсеРоли, ЗаголовокОшибки) + + НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеПрофиля, Ложь); + ПроверенныеРоли = Новый Соответствие; + ИндексРоли = ОписаниеПрофиля.Роли.Количество(); + Пока ИндексРоли > 0 Цикл + ИндексРоли = ИндексРоли - 1; + Роль = ОписаниеПрофиля.Роли[ИндексРоли]; + // Проверка наличия ролей в метаданных. + Если ВсеРоли.Получить(Роль) = Неопределено Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1 (%2)"" + |указана несуществующая роль ""%3"".'"), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор, + Роль); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + // Удаление дублей ролей. + Если ПроверенныеРоли.Получить(ВРег(Роль)) <> Неопределено Тогда + ОписаниеПрофиля.Роли.Удалить(ИндексРоли); + Продолжить; + КонецЕсли; + ПроверенныеРоли.Вставить(ВРег(Роль), Истина); + // Проверка соответствия назначения ролей и профиля. + Если НедоступныеРоли.Получить(Роль) <> Неопределено Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1 (%2)"" + |указана роль ""%3"", + |которая не соответствует назначению профиля: + |""%4"".'"), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор, + Роль, + ПредставлениеНазначенияПрофиля(НазначениеПрофиля)); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + КонецЦикла; + Если ОбщегоНазначения.РазделениеВключено() Тогда + // Заполнение списка недоступных ролей в модели сервиса + // для определения необходимости обновления поставляемых профилей. + СвойстваПрофиля.Вставить("РолиНедоступныеВСервисе", + РолиПрофиляНедоступныеВСервисе(ОписаниеПрофиля, НазначениеПрофиля)); + КонецЕсли; + +КонецПроцедуры + +// Для функции ПоставляемыеПрофили. +Процедура ПодготовитьВидыДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, + НазначениеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки) + + ВидыДоступа = Новый Соответствие; + Для Каждого ЭлементСписка Из ОписаниеПрофиля.ВидыДоступа Цикл + ИмяВидаДоступа = ЭлементСписка.Значение; + УточнениеВидаДоступа = ЭлементСписка.Представление; + Если СвойстваВидовДоступа.ПоИменам.Получить(ИмяВидаДоступа) = Неопределено Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указан несуществующий вид доступа ""%2"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ИмяВидаДоступа); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + ВидДоступаСоответствуетНазначениюПрофиля = + УправлениеДоступомСлужебныйКлиентСервер.ВидДоступаСоответствуетНазначениюПрофиля( + ИмяВидаДоступа, НазначениеПрофиля); + + Если Не ВидДоступаСоответствуетНазначениюПрофиля Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указан вид доступа ""%2"" + |который не соответствует назначению профиля: + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ИмяВидаДоступа, + ПредставлениеНазначенияПрофиля(НазначениеПрофиля)); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Если УточнениеВидаДоступа <> "" + И УточнениеВидаДоступа <> "ВначалеВсеЗапрещены" + И УточнениеВидаДоступа <> "Предустановленный" + И УточнениеВидаДоступа <> "ВначалеВсеРазрешены" Тогда + + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" указано неизвестное уточнение ""%3"". + | + |Допустимы только следующие уточнения: + |- ""ВначалеВсеЗапрещены"" или """", + |- ""ВначалеВсеРазрешены"", + |- ""Предустановленный"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ИмяВидаДоступа, + УточнениеВидаДоступа); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ВидыДоступа.Вставить(ИмяВидаДоступа, УточнениеВидаДоступа); + КонецЦикла; + СвойстваПрофиля.Вставить("ВидыДоступа", ВидыДоступа); + +КонецПроцедуры + +// Для функции ПоставляемыеПрофили. +Процедура ПодготовитьЗначенияДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки); + + // Удаление повторяющихся значений. + ЗначенияДоступа = Новый Массив; + ТаблицаЗначенийДоступа = Новый ТаблицаЗначений; + ТаблицаЗначенийДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + ТаблицаЗначенийДоступа.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + + Для Каждого ЭлементСписка Из ОписаниеПрофиля.ЗначенияДоступа Цикл + Отбор = Новый Структура; + Отбор.Вставить("ВидДоступа", ЭлементСписка.Значение); + Отбор.Вставить("ЗначениеДоступа", ЭлементСписка.Представление); + ВидДоступа = Отбор.ВидДоступа; + ЗначениеДоступа = Отбор.ЗначениеДоступа; + + СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ВидДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указан несуществующий вид доступа ""%2"" + |для значения доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + ОбъектМетаданных = Неопределено; + ПозицияТочки = СтрНайти(ЗначениеДоступа, "."); + Если ПозицияТочки > 0 Тогда + ВидОбъектаМетаданных = Лев(ЗначениеДоступа, ПозицияТочки - 1); + ОстатокСтроки = Сред(ЗначениеДоступа, ПозицияТочки + 1); + ПозицияТочки = СтрНайти(ОстатокСтроки, "."); + Если ПозицияТочки > 0 Тогда + ИмяОбъектаМетаданных = Лев(ОстатокСтроки, ПозицияТочки - 1); + ПолноеИмяОбъектаМетаданных = ВидОбъектаМетаданных + "." + ИмяОбъектаМетаданных; + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + КонецЕсли; + КонецЕсли; + + Если ОбъектМетаданных = Неопределено Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" + |не существует тип указанного значения доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Попытка + ПустаяСсылкаЗначенияДоступа = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + ПолноеИмяОбъектаМетаданных).ПустаяСсылка(); + Исключение + ПустаяСсылкаЗначенияДоступа = Неопределено; + КонецПопытки; + + Если ПустаяСсылкаЗначенияДоступа = Неопределено Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" + |указан не ссылочный тип значения доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ТипЗначенияДоступа = ТипЗнч(ПустаяСсылкаЗначенияДоступа); + + СвойстваВидаДоступаПоТипу = СвойстваВидовДоступа.ПоТипамЗначений.Получить(ТипЗначенияДоступа); // См. УправлениеДоступомСлужебный.СвойстваВидаДоступа + Если СвойстваВидаДоступаПоТипу = Неопределено + ИЛИ СвойстваВидаДоступаПоТипу.Имя <> ВидДоступа Тогда + + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указано значение доступа ""%3"" + |типа, который не указан в свойствах вида доступа ""%2"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Если ТаблицаЗначенийДоступа.НайтиСтроки(Отбор).Количество() > 0 Тогда + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" + |повторно указано значение доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ЗначенияДоступа.Добавить(Отбор); + КонецЦикла; + СвойстваПрофиля.Вставить("ЗначенияДоступа", ЗначенияДоступа); + +КонецПроцедуры + // Возвращает свойства профиля, указанные в переопределяемом модуле, // преобразованные в фиксированный формат сохранения в базе данных. -// Подробное описание свойств см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа. +// Подробное описание свойств смотри УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа +// и УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа // // Параметры: // Идентификатор - Строка - имя или идентификатор поставляемого профиля. @@ -1369,6 +1650,7 @@ // ФиксированнаяСтруктура: // * Имя - Строка // * Идентификатор - Строка +// * ЭтоГруппа - Булево // * Наименование - Строка // * Роли - ФиксированныйМассив из Строка // * Назначение - ФиксированныйМассив из ОпределяемыйТип.Пользователь @@ -1401,7 +1683,8 @@ ПредставлениеВидовДоступа = Новый Соответствие; Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл - ПредставлениеВидовДоступа.Вставить(ОписаниеПрофиля.Идентификатор, ОписаниеПрофиля.Описание); + Описание = ?(ОписаниеПрофиля.Свойство("Описание"), ОписаниеПрофиля.Описание, ""); + ПредставлениеВидовДоступа.Вставить(ОписаниеПрофиля.Идентификатор, Описание); КонецЦикла; Возврат Новый ФиксированноеСоответствие(ПредставлениеВидовДоступа); @@ -1422,6 +1705,7 @@ КонецФункции +// Для процедуры ОбновитьСоставПредопределенныхПрофилей. Функция ПредопределенныеПрофилиСовпадают(НовыеПрофили, СтарыеПрофили, ЕстьУдаленные) Если ТипЗнч(НовыеПрофили) <> ТипЗнч(СтарыеПрофили) Тогда @@ -1444,6 +1728,122 @@ КонецФункции +// Для процедуры ОбновитьПоставляемыеПрофили. +Процедура ОбновитьПоставляемыеПапкиПрофилей(Родитель, ТекущиеПапкиПрофилей, ПоставляемыеПрофили, ЕстьИзменения) + + ПапкиРодителя = ПоставляемыеПрофили.ПапкиПоРодителям.Получить(Родитель); + Если Не ЗначениеЗаполнено(ПапкиРодителя) Тогда + Возврат; + КонецЕсли; + + Для Каждого КлючИЗначение Из ПапкиРодителя Цикл + СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(КлючИЗначение.Ключ); + + Идентификатор = Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор); + СтрокаТекущейПапки = ТекущиеПапкиПрофилей.Найти(Идентификатор, "ИдентификаторПоставляемыхДанных"); + Если СтрокаТекущейПапки <> Неопределено Тогда + СтрокаТекущейПапки.Найден = Истина; + КонецЕсли; + + Если ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Истина) Тогда + ЕстьИзменения = Истина; + КонецЕсли; + + ОбновитьПоставляемыеПапкиПрофилей(КлючИЗначение.Ключ, + ТекущиеПапкиПрофилей, ПоставляемыеПрофили, ЕстьИзменения); + КонецЦикла; + +КонецПроцедуры + +// Для процедуры ОбновитьПоставляемыеПрофили. +Процедура ОтвязатьУстаревшиеПоставляемыеДанные(ПапкиИлиПрофили, ЕстьИзменения, ОбновленныеПрофили = Неопределено) + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + + Для Каждого СтрокаТекущегоПрофиля Из ПапкиИлиПрофили Цикл + Если СтрокаТекущегоПрофиля.Найден Тогда + Продолжить; + КонецЕсли; + Если Не СтрокаТекущегоПрофиля.ЭтоГруппа + И СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен Тогда + Продолжить; + КонецЕсли; + ЭлементБлокировки.УстановитьЗначение("Ссылка", СтрокаТекущегоПрофиля.Ссылка); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ПрофильОбъект = СтрокаТекущегоПрофиля.Ссылка.ПолучитьОбъект(); + Если Не ПрофильОбъект.ПометкаУдаления Тогда + ПрофильОбъект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект); + Если ОбновленныеПрофили <> Неопределено Тогда + ОбновленныеПрофили.Добавить(ПрофильОбъект.Ссылка); + КонецЕсли; + ЕстьИзменения = Истина; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЦикла; + +КонецПроцедуры + +// Для процедуры ОбновитьПоставляемыеПрофили. +Процедура ОбновитьПоставляемыеПрофилиБезПапок(ОбновленныеПрофили, ТекущиеПрофили, + ТекущиеПапкиПрофилей, ПоставляемыеПрофили, ЕстьИзменения) + + ОписанияПрофилей = ПоставляемыеПрофили.ОписанияПрофилейМассив; + ПараметрыОбновления = ПоставляемыеПрофили.ПараметрыОбновления; + + Для Каждого СвойстваПрофиля Из ОписанияПрофилей Цикл + Если СвойстваПрофиля.ЭтоГруппа Тогда + Продолжить; + КонецЕсли; + + Идентификатор = Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор); + СтрокаТекущегоПрофиля = ТекущиеПрофили.Найти(Идентификатор, "ИдентификаторПоставляемыхДанных"); + + ПрофильОбновлен = Ложь; + + Если СтрокаТекущегоПрофиля = Неопределено Тогда + // Создание нового поставляемого профиля. + Если ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Истина) Тогда + ЕстьИзменения = Истина; + КонецЕсли; + Профиль = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Идентификатор); + + Иначе + СтрокаТекущегоПрофиля.Найден = Истина; + + Профиль = СтрокаТекущегоПрофиля.Ссылка; + Если Не СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен + Или ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда + // Обновление поставляемого профиля. + ПрофильОбновлен = ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Истина); + КонецЕсли; + КонецЕсли; + + Если ПараметрыОбновления.ОбновлятьГруппыДоступа Тогда + ГруппыДоступаПрофиляОбновлены = Справочники.ГруппыДоступа.ОбновитьГруппыДоступаПрофиля( + Профиль, ПараметрыОбновления.ОбновлятьГруппыДоступаСУстаревшимиНастройками); + + ПрофильОбновлен = ПрофильОбновлен Или ГруппыДоступаПрофиляОбновлены; + КонецЕсли; + + Если ПрофильОбновлен Тогда + ЕстьИзменения = Истина; + ОбновленныеПрофили.Добавить(Профиль); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Для процедур ОбновитьПоставляемыеПапкиПрофилей, ОбновитьПоставляемыеПрофилиБезПапок и +// ЗаполнитьПоставляемыйПрофиль. +// // Замещает имеющийся или создает новый поставляемый профиль групп доступа по его описанию. // // Параметры: @@ -1452,7 +1852,7 @@ // Возвращаемое значение: // Булево - Истина - профиль изменен. // -Функция ОбновитьПрофильГруппДоступа(СвойстваПрофиля, НеОбновлятьРолиПользователей = Ложь) +Функция ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, НеОбновлятьРолиПользователей = Ложь) ПрофильИзменен = Ложь; @@ -1480,11 +1880,33 @@ КонецЦикла; КонецЕсли; + Если ПрофильСсылка = Неопределено + И СвойстваПрофиля.ЭтоГруппа + И ЗначениеЗаполнено(СвойстваПрофиля.Наименование) Тогда + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПрофилиГруппДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | ПрофилиГруппДоступа.Предопределенный = ЛОЖЬ + | И ПрофилиГруппДоступа.ЭтоГруппа + | И ПрофилиГруппДоступа.Наименование = &Наименование"; + Запрос.УстановитьПараметр("Наименование", СвойстваПрофиля.Наименование); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ПрофильСсылка = Выборка.Ссылка; + КонецЕсли; + КонецЕсли; + Если ПрофильСсылка = Неопределено Тогда - // Поставляемый профиль не существует, нужно создать новый. - ПрофильОбъект = СоздатьЭлемент(); + // Поставляемый элемент не существует, нужно создать новый. + ПрофильОбъект = ?(СвойстваПрофиля.ЭтоГруппа, СоздатьГруппу(), СоздатьЭлемент()); Иначе - // Поставляемый профиль связан с предопределенным элементом. + // Поставляемый элемент связан с предопределенным элементом. ПрофильОбъект = ПрофильСсылка.ПолучитьОбъект(); КонецЕсли; @@ -1507,47 +1929,56 @@ ПрофильОбъект.Наименование = СвойстваПрофиля.Наименование; - ПрофильОбъект.Роли.Очистить(); - Для каждого Роль Из ОписаниеРолейПрофиля(СвойстваПрофиля) Цикл - МетаданныеРоли = Метаданные.Роли.Найти(Роль); - Если МетаданныеРоли = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При обновлении поставляемого профиля ""%1"" - |обнаружена несуществующая роль ""%2"".'"), - СвойстваПрофиля.Наименование, - Роль); + Если ЗначениеЗаполнено(СвойстваПрофиля.Родитель) Тогда + Родитель = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Родитель); + Если ЗначениеЗаполнено(Родитель) Тогда + ПрофильОбъект.Родитель = Родитель; КонецЕсли; - ПрофильОбъект.Роли.Добавить().Роль = - ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеРоли); - КонецЦикла; + КонецЕсли; - ПрофильОбъект.ВидыДоступа.Очистить(); - Для каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл - СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеВидаДоступа.Ключ); - Строка = ПрофильОбъект.ВидыДоступа.Добавить(); - Строка.ВидДоступа = СвойстваВидаДоступа.Ссылка; - Строка.Предустановленный = ОписаниеВидаДоступа.Значение = "Предустановленный"; - Строка.ВсеРазрешены = ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены"; - КонецЦикла; - - ПрофильОбъект.ЗначенияДоступа.Очистить(); - Для каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл - СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеЗначенияДоступа.ВидДоступа); - СтрокаЗначения = ПрофильОбъект.ЗначенияДоступа.Добавить(); - СтрокаЗначения.ВидДоступа = СвойстваВидаДоступа.Ссылка; - Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(ЗначениеДоступа) КАК Значение", - "ЗначениеДоступа", ОписаниеЗначенияДоступа.ЗначениеДоступа)); - СтрокаЗначения.ЗначениеДоступа = Запрос.Выполнить().Выгрузить()[0].Значение; - КонецЦикла; - - ПрофильОбъект.Назначение.Очистить(); - Для каждого ТипНазначения Из СвойстваПрофиля.Назначение Цикл - СтрокаНазначения = ПрофильОбъект.Назначение.Добавить(); - СтрокаНазначения.ТипПользователей = ТипНазначения; - КонецЦикла; - - Если НеОбновлятьРолиПользователей Тогда - ПрофильОбъект.ДополнительныеСвойства.Вставить("НеОбновлятьРолиПользователей"); + Если Не СвойстваПрофиля.ЭтоГруппа Тогда + ПрофильОбъект.Роли.Очистить(); + Для каждого Роль Из ОписаниеРолейПрофиля(СвойстваПрофиля) Цикл + МетаданныеРоли = Метаданные.Роли.Найти(Роль); + Если МетаданныеРоли = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При обновлении поставляемого профиля ""%1"" + |обнаружена несуществующая роль ""%2"".'"), + СвойстваПрофиля.Наименование, + Роль); + КонецЕсли; + ПрофильОбъект.Роли.Добавить().Роль = + ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеРоли); + КонецЦикла; + + ПрофильОбъект.ВидыДоступа.Очистить(); + Для каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеВидаДоступа.Ключ); + Строка = ПрофильОбъект.ВидыДоступа.Добавить(); + Строка.ВидДоступа = СвойстваВидаДоступа.Ссылка; + Строка.Предустановленный = ОписаниеВидаДоступа.Значение = "Предустановленный"; + Строка.ВсеРазрешены = ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены"; + КонецЦикла; + + ПрофильОбъект.ЗначенияДоступа.Очистить(); + Для каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеЗначенияДоступа.ВидДоступа); + СтрокаЗначения = ПрофильОбъект.ЗначенияДоступа.Добавить(); + СтрокаЗначения.ВидДоступа = СвойстваВидаДоступа.Ссылка; + Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(ЗначениеДоступа) КАК Значение", + "ЗначениеДоступа", ОписаниеЗначенияДоступа.ЗначениеДоступа)); + СтрокаЗначения.ЗначениеДоступа = Запрос.Выполнить().Выгрузить()[0].Значение; + КонецЦикла; + + ПрофильОбъект.Назначение.Очистить(); + Для каждого ТипНазначения Из СвойстваПрофиля.Назначение Цикл + СтрокаНазначения = ПрофильОбъект.Назначение.Добавить(); + СтрокаНазначения.ТипПользователей = ТипНазначения; + КонецЦикла; + + Если НеОбновлятьРолиПользователей Тогда + ПрофильОбъект.ДополнительныеСвойства.Вставить("НеОбновлятьРолиПользователей"); + КонецЕсли; КонецЕсли; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект); @@ -1564,6 +1995,7 @@ КонецФункции +// Для функций ПоставляемыйПрофильИзменен и ОбновитьПрофильГруппДоступа. Функция ОписаниеРолейПрофиля(ОписаниеПрофиля) Если Не ОбщегоНазначения.РазделениеВключено() Тогда @@ -1585,6 +2017,7 @@ КонецФункции +// Для процедуры ПодготовитьРолиПоставляемогоПрофиля. Функция РолиПрофиляНедоступныеВСервисе(ОписаниеПрофиля, НазначениеПрофиля) НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеПрофиля, Истина); @@ -1600,12 +2033,45 @@ КонецФункции +// Для процедуры ОбновитьПоставляемыеПрофили. +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * ИдентификаторПоставляемыхДанных - УникальныйИдентификатор +// * Ссылка - СправочникСсылка.ПрофилиГруппДоступа +// * ЭтоГруппа - Булево +// +Функция ТекущиеПапкиПрофилей() + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + Запрос.Текст = + "ВЫБРАТЬ + | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, + | ПрофилиГруппДоступа.Ссылка КАК Ссылка, + | ПрофилиГруппДоступа.ЭтоГруппа КАК ЭтоГруппа, + | ЛОЖЬ КАК Найден + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | ПрофилиГруппДоступа.ЭтоГруппа + | И ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных <> &ПустойУникальныйИдентификатор"; + ТекущиеПрофили = Запрос.Выполнить().Выгрузить(); + + Возврат ТекущиеПрофили; + +КонецФункции + +// Для процедуры ОбновитьПоставляемыеПрофили. +// // Возвращаемое значение: // ТаблицаЗначений: // * ПоставляемыйПрофильИзменен - Булево // * ИдентификаторПоставляемыхДанных - УникальныйИдентификатор // * Ссылка - СправочникСсылка.ПрофилиГруппДоступа -// +// * ЭтоГруппа - Булево +// Функция ТекущиеПрофили() Запрос = Новый Запрос; @@ -1615,6 +2081,7 @@ "ВЫБРАТЬ | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен, | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, + | ПрофилиГруппДоступа.ЭтоГруппа КАК ЭтоГруппа, | ПрофилиГруппДоступа.Ссылка КАК Ссылка, | ЛОЖЬ КАК Найден |ИЗ @@ -1628,6 +2095,8 @@ КонецФункции +// Для функции НесовместимыеПрофилиГруппДоступа. +// // Возвращаемое значение: // ТаблицаЗначений: // * Ссылка - СправочникСсылка.ПрофилиГруппДоступа diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl index b25a693ae..8cb06b195 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl @@ -37,6 +37,7 @@ РолиАдминистратора.Добавить("Роль.АдминистраторСистемы"); ИдентификаторыРолей = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(РолиАдминистратора); ОбработанныеРоли = Новый Соответствие; + ПрофильАдминистратор = УправлениеДоступом.ПрофильАдминистратор(); Индекс = Роли.Количество(); Пока Индекс > 0 Цикл Индекс = Индекс - 1; @@ -46,7 +47,7 @@ Продолжить; КонецЕсли; ОбработанныеРоли.Вставить(Роль, Истина); - Если Ссылка = Справочники.ПрофилиГруппДоступа.Администратор Тогда + Если Ссылка = ПрофильАдминистратор Тогда Продолжить; КонецЕсли; Если Роль = ИдентификаторыРолей["Роль.ПолныеПрава"] @@ -206,12 +207,13 @@ Возврат; КонецЕсли; - Если ОбъектКопирования.Ссылка = Справочники.ПрофилиГруппДоступа.Администратор Тогда + ИдентификаторПоставляемыхДанных = Неопределено; + + Если Не ОбъектКопирования.ДополнительныеСвойства.Свойство("ПропуститьОчисткуРолей") + И ОбъектКопирования.Ссылка = УправлениеДоступом.ПрофильАдминистратор() Тогда Роли.Очистить(); КонецЕсли; - ИдентификаторПоставляемыхДанных = Неопределено; - КонецПроцедуры #КонецОбласти @@ -224,9 +226,12 @@ Функция ОбновитьРолиПользователейПриИзмененииРолейПрофиля() Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Профиль", Ссылка); - Запрос.УстановитьПараметр("СтарыеРолиПрофиля", ?(Ссылка = СтарыеЗначения.Ссылка, - СтарыеЗначения.Роли.Выгрузить(), Роли.Выгрузить(Новый Массив))); + Запрос.УстановитьПараметр("Профиль", ?(ПометкаУдаления, + Справочники.ПрофилиГруппДоступа.ПустаяСсылка(), Ссылка)); + + Запрос.УстановитьПараметр("СтарыеРолиПрофиля", + ?(Ссылка = СтарыеЗначения.Ссылка И Не СтарыеЗначения.ПометкаУдаления, + СтарыеЗначения.Роли.Выгрузить(), Роли.Выгрузить(Новый Массив))); Запрос.Текст = "ВЫБРАТЬ @@ -270,14 +275,14 @@ "ВЫБРАТЬ | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолейРасширений.Роль КАК Роль, - | ПраваРолейРасширений.Добавление КАК Добавление, - | ПраваРолейРасширений.Изменение КАК Изменение, - | ПраваРолейРасширений.ЧтениеБезОграничения КАК ЧтениеБезОграничения, - | ПраваРолейРасширений.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения, - | ПраваРолейРасширений.ИзменениеБезОграничения КАК ИзменениеБезОграничения, - | ПраваРолейРасширений.Просмотр КАК Просмотр, - | ПраваРолейРасширений.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, - | ПраваРолейРасширений.Редактирование КАК Редактирование, + | ПраваРолейРасширений.ПравоДобавление КАК ПравоДобавление, + | ПраваРолейРасширений.ПравоИзменение КАК ПравоИзменение, + | ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + | ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, + | ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + | ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр, + | ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, + | ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование, | ПраваРолейРасширений.ВидИзмененияСтроки КАК ВидИзмененияСтроки |ПОМЕСТИТЬ ПраваРолейРасширений |ИЗ @@ -288,14 +293,14 @@ |ВЫБРАТЬ | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолейРасширений.Роль КАК Роль, - | ПраваРолейРасширений.Добавление КАК Добавление, - | ПраваРолейРасширений.Изменение КАК Изменение, - | ПраваРолейРасширений.ЧтениеБезОграничения КАК ЧтениеБезОграничения, - | ПраваРолейРасширений.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения, - | ПраваРолейРасширений.ИзменениеБезОграничения КАК ИзменениеБезОграничения, - | ПраваРолейРасширений.Просмотр КАК Просмотр, - | ПраваРолейРасширений.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, - | ПраваРолейРасширений.Редактирование КАК Редактирование + | ПраваРолейРасширений.ПравоДобавление КАК ПравоДобавление, + | ПраваРолейРасширений.ПравоИзменение КАК ПравоИзменение, + | ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + | ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, + | ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + | ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр, + | ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, + | ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование |ПОМЕСТИТЬ ПраваРолей |ИЗ | ПраваРолейРасширений КАК ПраваРолейРасширений @@ -307,14 +312,14 @@ |ВЫБРАТЬ | ПраваРолей.ОбъектМетаданных, | ПраваРолей.Роль, - | ПраваРолей.Добавление, - | ПраваРолей.Изменение, - | ПраваРолей.ЧтениеБезОграничения, - | ПраваРолей.ДобавлениеБезОграничения, - | ПраваРолей.ИзменениеБезОграничения, - | ПраваРолей.Просмотр, - | ПраваРолей.ИнтерактивноеДобавление, - | ПраваРолей.Редактирование + | ПраваРолей.ПравоДобавление, + | ПраваРолей.ПравоИзменение, + | ПраваРолей.ПравоЧтениеБезОграничения, + | ПраваРолей.ПравоДобавлениеБезОграничения, + | ПраваРолей.ПравоИзменениеБезОграничения, + | ПраваРолей.ПравоПросмотр, + | ПраваРолей.ПравоИнтерактивноеДобавление, + | ПраваРолей.ПравоРедактирование |ИЗ | РегистрСведений.ПраваРолей КАК ПраваРолей | ЛЕВОЕ СОЕДИНЕНИЕ ПраваРолейРасширений КАК ПраваРолейРасширений @@ -326,11 +331,18 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ПраваРолей.ОбъектМетаданных + | ПраваРолей.ОбъектМетаданных КАК ОбъектМетаданных |ИЗ | ПраваРолей КАК ПраваРолей | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИзмененныеРоли КАК ИзмененныеРоли - | ПО ПраваРолей.Роль = ИзмененныеРоли.Роль"; + | ПО ПраваРолей.Роль = ИзмененныеРоли.Роль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ИзмененныеРоли.Роль КАК Роль + |ИЗ + | ИзмененныеРоли КАК ИзмененныеРоли"; Запрос.Текст = Запрос.Текст + " |; @@ -341,8 +353,16 @@ Запрос.УстановитьПараметр("ПраваРолейРасширений", УправлениеДоступомСлужебный.ПраваРолейРасширений()); РезультатыЗапросов = Запрос.ВыполнитьПакет(); - Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") - И НЕ РезультатыЗапросов[1].Пустой() Тогда + Если УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() + И Не РезультатыЗапросов[5].Пустой() Тогда + + ИзмененныеРоли = РезультатыЗапросов[5].Выгрузить().ВыгрузитьКолонку("Роль"); + УправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступаПриИзмененииРолейПрофиля( + "ОбновитьРолиПользователейПриИзмененииРолейПрофиля", ИзмененныеРоли); + КонецЕсли; + + Если Не ДополнительныеСвойства.Свойство("НеОбновлятьРолиПользователей") + И Не РезультатыЗапросов[5].Пустой() Тогда ПользователиДляОбновленияРолей = Справочники.ГруппыДоступа.ПользователиДляОбновленияРолейПоПрофилю(Ссылка); УправлениеДоступом.ОбновитьРолиПользователей(ПользователиДляОбновленияРолей); diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo index 5ffa799f8..24628f36b 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo @@ -151,12 +151,13 @@ ru - Для профилей, поставляемых в составе конфигурации, содержит идентификатор по которому можно найти описание поставляемого профиля. + Для профилей и папок профилей, поставляемых в составе конфигурации, содержит идентификатор по которому можно найти описание поставляемого профиля или папки профиля. Index + ForFolderAndItem Use diff --git a/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl b/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl index 8a376f179..190c9f54a 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl @@ -11,11 +11,7 @@ #Область ОбработчикиСобытий Процедура ПередЗаписью(Отказ) - // Вызывается непосредственно до записи объекта в базу данных. - Если ОбменДанными.Загрузка Тогда - Возврат; - КонецЕсли; - Если ЭтоГруппа Тогда + Если ОбменДанными.Загрузка Или ЭтоГруппа Тогда Возврат; КонецЕсли; @@ -23,7 +19,7 @@ УстановитьПривилегированныйРежим(Истина); РегламентныеЗаданияСервер.ЗаблокироватьРегламентноеЗадание(РегламентноеЗадание); - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); + Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); // АПК:453 задание запускается от имени пользователя, выбранного в форме рассылки. Если Задание = Неопределено Тогда // Из-за выполнения индивидуального регламентного задания непосредственно в необходимой области модели сервиса. @@ -65,7 +61,7 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); + Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); // АПК:453 задание запускается от имени пользователя, выбранного в форме рассылки. Если Задание <> Неопределено Тогда Задание.Удалить(); КонецЕсли; @@ -94,7 +90,7 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); + Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗадание); // АПК:453 задание запускается от имени пользователя, выбранного в форме рассылки. Если Задание <> Неопределено Тогда ЗаданиеИзменено = Ложь; diff --git a/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo b/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo index 451d2a564..d5353a826 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo +++ b/SSL/src/Catalogs/РассылкиОтчетов/РассылкиОтчетов.mdo @@ -115,6 +115,7 @@ ru + Catalog.РассылкиОтчетов.Attribute.ТипПолучателейРассылки Managed Use diff --git a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl index 9820caf6f..8923b836f 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl @@ -181,9 +181,10 @@ Элемент.КраткоеПредставление = НСтр("ru = '000000001'", ОбщегоНазначения.КодОсновногоЯзыка()); Элемент.ТипыОсновногоОбъектаАдресации = ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.ВсеОбъектыАдресации; - Элемент.Назначение = ТабличныеЧасти.Назначение.Скопировать(); - ЭлементТЧ = Элемент.Назначение.Добавить(); + Назначение = ТабличныеЧасти.Назначение.Скопировать(); // ТаблицаЗначений + ЭлементТЧ = Назначение.Добавить(); ЭлементТЧ.ТипПользователей = Справочники.Пользователи.ПустаяСсылка(); + Элемент.Назначение = Назначение; БизнесПроцессыИЗадачиПереопределяемый.ПриНачальномЗаполненииРолейИсполнителей(КодыЯзыков, Элементы, ТабличныеЧасти); @@ -192,7 +193,7 @@ // Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлемента // // Параметры: -// Объект - заполняемый объект. +// Объект - СправочникОбъект.РолиИсполнителей - заполняемый объект. // Данные - СтрокаТаблицыЗначений - данные заполнения объекта. // ДополнительныеПараметры - Структура: // * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов. diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form index 5ce594ad5..2aa12311c 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Form.form @@ -127,6 +127,10 @@ СертификатыНедоступныНаСервереЗначок 797 + + <key>ru</key> + <value>Сертификаты недоступны на сервере значок</value> + true true @@ -251,6 +255,112 @@ Auto + + ГруппаАвторизацииОблачнойПодписи + 858 + + ТребуетсяАутентификацияОблачнойПодписиЗначок + 860 + + <key>ru</key> + <value>Требуется аутентификация облачной подписи значок</value> + + true + true + + true + + + ТребуетсяАутентификацияОблачнойПодписиЗначокРасширеннаяПодсказка + 862 + Label + true + true + + Left + + + + ТребуетсяАутентификацияОблачнойПодписиЗначокКонтекстноеМеню + 861 + true + + true + true + + + CommonPicture.Предупреждение + + AsFileRef + + + + ТребуетсяАутентификацияОблачнойПодписиНадпись + 863 + + <key>ru</key> + <value>Чтобы отобразить сертификаты необходимо авторизоваться на сервере облачной подписи</value> + + true + true + + true + + + ТребуетсяАутентификацияОблачнойПодписиНадписьРасширеннаяПодсказка + 865 + Label + true + true + + Left + + + + ТребуетсяАутентификацияОблачнойПодписиНадписьКонтекстноеМеню + 864 + true + + Label + true + + + Click + ТребуетсяАутентификацияОблачнойПодписиНадписьНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Авторизации облачной подписи</value> + + + ГруппаАвторизацииОблачнойПодписиРасширеннаяПодсказка + 859 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + Сертификаты 217 @@ -689,6 +799,9 @@ true true true + + Сертификаты.ТипРазмещения + true @@ -2136,6 +2249,22 @@ true + + ТипРазмещения + 8 + + Number + + 10 + + + + true + + + true + + СертификатНаименование @@ -2535,6 +2664,48 @@ true + + СписокУчетныхЗаписей + 28 + + ValueList + + + true + + + true + + + + + + + СертификатОблачнойПодписи + 29 + + Boolean + + + true + + + true + + + + ЕстьОблачнаяПодпись + 30 + + Boolean + + + true + + + true + + Далее diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl index 826f352f3..4d2e63cc2 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl @@ -28,6 +28,13 @@ Если Параметры.Свойство("Организация") Тогда СертификатПараметрыРеквизитов.Вставить("Организация", Параметры.Организация); КонецЕсли; + ВыполнятьНаСервере = Параметры.ВыполнятьНаСервере; + + ЕстьОблачнаяПодпись = ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи(); + Если ЕстьОблачнаяПодпись Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + Элементы.Сертификаты.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов"); + КонецЕсли; ОтборПоОрганизации = Параметры.ОтборПоОрганизации; @@ -62,9 +69,17 @@ Заголовок = НСтр("ru = 'Добавление сертификата для подписания данных'"); КонецЕсли; - Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда - Элементы.ГруппаСертификаты.Заголовок = - НСтр("ru = 'Личные сертификаты на компьютере и сервере'"); + Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() + И ВыполнятьНаСервере <> Ложь + Или ЕстьОблачнаяПодпись Тогда + + Если ВыполнятьНаСервере = Истина Тогда + Элементы.ГруппаСертификаты.Заголовок = + НСтр("ru = 'Личные сертификаты на сервере'"); + Иначе + Элементы.ГруппаСертификаты.Заголовок = + НСтр("ru = 'Личные сертификаты на компьютере и сервере'"); + КонецЕсли; КонецЕсли; ЕстьОрганизации = Не Метаданные.ОпределяемыеТипы.Организация.Тип.СодержитТип(Тип("Строка")); @@ -240,6 +255,27 @@ КонецПроцедуры +&НаКлиенте +Процедура ТребуетсяАутентификацияОблачнойПодписиНадписьНажатие(Элемент) + + ОповещениеСледующее = Новый ОписаниеОповещения("ТребуетсяАутентификацияОблачнойПодписиНадписьПослеАутентификации", ЭтотОбъект); + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("СписокУчетныхЗаписей", СписокУчетныхЗаписей.ВыгрузитьЗначения()); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ПроверкаАутентификацииПользователя(ОповещениеСледующее, Неопределено, ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура ТребуетсяАутентификацияОблачнойПодписиНадписьПослеАутентификации(РезультатВызова, ДополнительныеПараметры) Экспорт + + Если РезультатВызова.Выполнено Тогда + ОбновитьСписокСертификатов(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыСертификаты @@ -281,7 +317,18 @@ Возврат; КонецЕсли; - ЭлектроннаяПодписьКлиент.ОткрытьСертификат(ТекущиеДанные.Отпечаток, Не ТекущиеДанные.ЭтоЗаявление); + Если ТекущиеДанные.ТипРазмещения = 3 Тогда + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + ОтпечатокСертификата = Новый Структура(); + ОтпечатокСертификата.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(ТекущиеДанные.Отпечаток)); + + ПараметрыОперации = Новый Структура("ЭтоЗаявление", ТекущиеДанные.ЭтоЗаявление); + ОповещениеСледующее = Новый ОписаниеОповещения("ОткрытьСертификатОблачнойПодписи", ЭтотОбъект, ПараметрыОперации); + МодульСервисКриптографииDSSКлиент.НайтиСертификат(ОповещениеСледующее, ОтпечатокСертификата); + Иначе + ЭлектроннаяПодписьКлиент.ОткрытьСертификат(ТекущиеДанные.Отпечаток, Не ТекущиеДанные.ЭтоЗаявление); + КонецЕсли; КонецПроцедуры @@ -341,7 +388,24 @@ Возврат; КонецЕсли; - Если СертификатВОблачномСервисе Тогда + Если СертификатОблачнойПодписи Тогда + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSСлужебныйВызовСервера = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSСлужебныйВызовСервера"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + ОтпечатокСертификата = МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(ОтпечатокВыбранногоСертификата); + НастройкиПользователя = МодульСервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователяПоСертификату(ОтпечатокСертификата); + + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("УчетнаяЗапись", НастройкиПользователя.Ссылка); + ПараметрыОперации.Вставить("ОтпечатокСертификата", ОтпечатокСертификата); + + МодульСервисКриптографииDSSКлиент.ПроверитьСертификат( + Новый ОписаниеОповещения("ВыбратьПослеПроверкиСертификатаОблачнойПодписи", ЭтотОбъект, ПараметрыОперации), + НастройкиПользователя, + ПолучитьИзВременногоХранилища(СертификатАдрес)); + + ИначеЕсли СертификатВОблачномСервисе Тогда МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент"); МодульСервисКриптографииКлиент.ПроверитьСертификат( @@ -401,6 +465,43 @@ КонецПроцедуры +// Продолжение процедуры Выбрать. +&НаКлиенте +Процедура ВыбратьПослеПроверкиСертификатаОблачнойПодписи(Результат, Контекст) Экспорт + + ДополнительныеПараметры = Новый Структура; + Если Не Результат.Выполнено Тогда + ОписаниеОшибки = Результат.Ошибка; + ИначеЕсли Не Результат.Результат Тогда + ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиСервисаСертификатНедействителен(); + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + Если ДляШифрованияИРасшифровки = Истина Тогда + ЗаголовокФормы = НСтр("ru = 'Проверка шифрования и расшифровки'"); + Иначе + ЗаголовокФормы = НСтр("ru = 'Проверка установки электронной подписи'"); + КонецЕсли; + ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( + ЗаголовокФормы, "", Новый Структура("ОписаниеОшибки", ОписаниеОшибки), Новый Структура); + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Сертификат) Тогда + ДополнительныеПараметры.Вставить("ЭтоНовый"); + КонецЕсли; + + ЗаписатьСертификатВСправочникОблачнаяПодпись(Контекст.УчетнаяЗапись); + + ОповеститьОбИзменении(Сертификат); + Оповестить("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования", + ДополнительныеПараметры, Сертификат); + + ОповеститьОВыборе(Сертификат); + +КонецПроцедуры + +// Продолжение процедуры Выбрать. &НаКлиенте Процедура ВыбратьПослеПроверкиСертификатаВМоделиСервиса(Результат, Контекст) Экспорт @@ -524,8 +625,18 @@ Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); - ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСвойстваСертификатовНаКлиенте(Новый ОписаниеОповещения( - "ОбновитьСписокСертификатовПродолжение", ЭтотОбъект, Контекст), Истина, ПоказыватьВсе); + Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И ВыполнятьНаСервере = Истина Тогда + + Результат = Новый Структура; + Результат.Вставить("СвойстваСертификатовНаКлиенте", Новый Массив); + Результат.Вставить("ОшибкаПолученияСертификатовНаКлиенте", Новый Структура); + + ОбновитьСписокСертификатовПродолжение(Результат, Контекст); + Иначе + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСвойстваСертификатовНаКлиенте(Новый ОписаниеОповещения( + "ОбновитьСписокСертификатовПродолжение", ЭтотОбъект, Контекст), Истина, ПоказыватьВсе); + КонецЕсли; КонецПроцедуры @@ -548,8 +659,12 @@ ОшибкаПолученияСертификатовНаСервере = Новый Структура; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОтборПоОрганизации", ОтборПоОрганизации); + ДополнительныеПараметры.Вставить("ВыполнятьНаСервере", ВыполнятьНаСервере); + ЭлектроннаяПодписьСлужебный.ОбновитьСписокСертификатов(Сертификаты, СвойстваСертификатовНаКлиенте, - ДобавлениеВСписок, Истина, ОшибкаПолученияСертификатовНаСервере, ПоказыватьВсе, ОтборПоОрганизации); + ДобавлениеВСписок, Истина, ОшибкаПолученияСертификатовНаСервере, ПоказыватьВсе, ДополнительныеПараметры); Если ЗначениеЗаполнено(ОтпечатокВыбранногоСертификата) И ( Элементы.Сертификаты.ТекущаяСтрока = Неопределено @@ -570,6 +685,15 @@ Элементы.ГруппаСертификатыНедоступныНаСервере.Видимость = ЗначениеЗаполнено(ОшибкаПолученияСертификатовНаСервере); + ВидимостьАутентификации = Ложь; + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + СписокУчетныхЗаписей.ЗагрузитьЗначения(МодульСервисКриптографииDSSСлужебный.УчетныеЗаписиБезСертификатов()); + ВидимостьАутентификации = СписокУчетныхЗаписей.Количество() > 0; + КонецЕсли; + + Элементы.ГруппаАвторизацииОблачнойПодписи.Видимость = ВидимостьАутентификации; + Если Элементы.Сертификаты.ТекущаяСтрока = Неопределено Тогда ОтпечатокВыбранногоСертификата = ""; Иначе @@ -579,6 +703,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ОткрытьСертификатОблачнойПодписи(РезультатПоиска, ДополнительныеПараметры) Экспорт + + Если РезультатПоиска.Выполнено Тогда + ЭлектроннаяПодписьКлиент.ОткрытьСертификат(РезультатПоиска.ДанныеСертификата.Сертификат, Не ДополнительныеПараметры.ЭтоЗаявление); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура ПерейтиКВыборуТекущегоСертификата(Оповещение) @@ -606,6 +739,7 @@ СертификатНаКлиенте = ТекущиеДанные.НаКлиенте; СертификатНаСервере = ТекущиеДанные.НаСервере; СертификатВОблачномСервисе = ТекущиеДанные.ВОблачномСервисе; + СертификатОблачнойПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.РазмещениеСертификата(ТекущиеДанные.ТипРазмещения) = "ОблачнаяПодпись"; Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); @@ -624,7 +758,16 @@ Возврат; КонецЕсли; - Если ТекущиеДанные.ВОблачномСервисе Тогда + Если ЭлектроннаяПодписьСлужебныйКлиентСервер.РазмещениеСертификата(ТекущиеДанные.ТипРазмещения) = "ОблачнаяПодпись" Тогда + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(ТекущиеДанные.Отпечаток)); + МодульСервисКриптографииDSSКлиент.НайтиСертификат(Новый ОписаниеОповещения( + "ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачнойПодписи", ЭтотОбъект, Контекст), СтруктураПоиска); + + ИначеЕсли ТекущиеДанные.ВОблачномСервисе Тогда СтруктураПоиска = Новый Структура; СтруктураПоиска.Вставить("Отпечаток", Base64Значение(ТекущиеДанные.Отпечаток)); МодульХранилищеСертификатовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ХранилищеСертификатовКлиент"); @@ -678,22 +821,42 @@ &НаКлиенте Процедура ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачномСервисе(РезультатПоиска, Контекст) Экспорт + ТекущиеДанные = Элементы.Сертификаты.ТекущиеДанные; + + Если ЕстьОблачнаяПодпись Тогда + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + ОбработкаСледующая = Новый ОписаниеОповещения("ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачнойПодписи", ЭтотОбъект, Контекст); + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(ТекущиеДанные.Отпечаток)); + МодульСервисКриптографииDSSКлиент.НайтиСертификат(ОбработкаСледующая, СтруктураПоиска); + Иначе + ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачнойПодписи(РезультатПоиска, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПерейтиКВыборуТекущегоСертификата. +&НаКлиенте +Процедура ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачнойПодписи(РезультатПоиска, Контекст) Экспорт + Если Не РезультатПоиска.Выполнено Тогда - Контекст.Результат.ОписаниеОшибки = РезультатПоиска.ОписаниеОшибки.Описание; + Контекст.Результат.ОписаниеОшибки = РезультатПоиска.Ошибка; Контекст.Результат.ОбновитьСписокСертификатов = Истина; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Результат); Возврат; КонецЕсли; - Если Не ЗначениеЗаполнено(РезультатПоиска.Сертификат) Тогда - Контекст.Результат.ОписаниеОшибки = НСтр("ru = 'Сертификат отсутствует в облачном сервисе (возможно удален).'"); + Если Не ЗначениеЗаполнено(РезультатПоиска.ДанныеСертификата) Тогда + Контекст.Результат.ОписаниеОшибки = НСтр("ru = 'Сертификат отсутствует на сервере облачной подписи (возможно удален).'"); Контекст.Результат.ОбновитьСписокСертификатов = Истина; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Результат); Возврат; КонецЕсли; - Контекст.Вставить("СертификатКриптографии", РезультатПоиска.Сертификат); - ПерейтиКВыборуТекущегоСертификатаПослеВыгрузкиСертификата(РезультатПоиска.Сертификат.Сертификат, Контекст); + Контекст.Вставить("СертификатКриптографии", РезультатПоиска.ДанныеСертификата); + ПерейтиКВыборуТекущегоСертификатаПослеВыгрузкиСертификата(РезультатПоиска.ДанныеСертификата.Сертификат, Контекст); КонецПроцедуры @@ -768,7 +931,7 @@ КонецЕсли; КонецЕсли; - Если СертификатВОблачномСервисе Тогда + Если СертификатВОблачномСервисе ИЛИ СертификатОблачнойПодписи Тогда Элементы.ГруппаУсиленнаяЗащитаЗакрытогоКлюча.Видимость = Ложь; Иначе Элементы.ГруппаУсиленнаяЗащитаЗакрытогоКлюча.Видимость = Истина; @@ -796,4 +959,13 @@ КонецПроцедуры +&НаСервере +Процедура ЗаписатьСертификатВСправочникОблачнаяПодпись(УчетнаяЗапись) + + СертификатУсиленнаяЗащитаЗакрытогоКлюча = Ложь; + + ЭлектроннаяПодписьСлужебный.ЗаписатьСертификатВСправочник(ЭтотОбъект, УчетнаяЗапись, Ложь); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form index 8a94f9f27..c6e941636 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификата/Form.form @@ -703,6 +703,7 @@ <event>OnCreateAtServer</event> <name>ПриСозданииНаСервере</name> </handlers> + <width>35</width> <windowOpeningMode>LockOwner</windowOpeningMode> <saveWindowSettings>true</saveWindowSettings> <autoTitle>true</autoTitle> diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form index ae0a500d5..b032f6394 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Form.form @@ -690,6 +690,9 @@ <verticalStretch>true</verticalStretch> <enableStartDrag>true</enableStartDrag> <enableDrag>true</enableDrag> + <rowPictureDataPath xsi:type="form:DataPath"> + <segments>Сертификаты.ТипРазмещения</segments> + </rowPictureDataPath> <autoMaxCardHeight>true</autoMaxCardHeight> <rowFilter xsi:type="core:UndefinedValue"/> </items> @@ -1695,6 +1698,22 @@ <common>true</common> </edit> </columns> + <columns> + <name>ТипРазмещения</name> + <id>8</id> + <valueType> + <types>Number</types> + <numberQualifiers> + <precision>10</precision> + </numberQualifiers> + </valueType> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + </columns> </attributes> <attributes> <name>СертификатНаименование</name> @@ -1931,6 +1950,19 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>УчетнаяЗапись</name> + <id>14</id> + <valueType> + <types>CatalogRef</types> + </valueType> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + </attributes> <formCommands> <name>Далее</name> <title> diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl index 46a94bdc9..8f193400c 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl @@ -49,6 +49,11 @@ ОпределяемыйТипОрганизацияНастроен = Истина; КонецЕсли; + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + Элементы.Сертификаты.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов"); + КонецЕсли; + Элементы.СертификатПользователь.Подсказка = Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.Реквизиты.Пользователь.Подсказка; @@ -225,7 +230,23 @@ Элементы.Далее.Доступность = Ложь; - Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() И ТекущиеДанные.ВОблачномСервисе Тогда + УчетнаяЗапись = Неопределено; + Если ЭлектроннаяПодписьСлужебныйКлиентСервер.РазмещениеСертификата(ТекущиеДанные.ТипРазмещения) = "ОблачнаяПодпись" Тогда + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSСлужебныйВызовСервера = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSСлужебныйВызовСервера"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + ОтпечатокСертификата = МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(ТекущиеДанные.Отпечаток); + НастройкиПользователя = МодульСервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователяПоСертификату(ОтпечатокСертификата); + УчетнаяЗапись = НастройкиПользователя.Ссылка; + + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Отпечаток", ОтпечатокСертификата); + + МодульСервисКриптографииDSSКлиент.НайтиСертификат(Новый ОписаниеОповещения( + "ДалееПослеПоискаСертификатаОблачнаяПодпись", ЭтотОбъект, УчетнаяЗапись), СтруктураПоиска); + + ИначеЕсли ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() И ТекущиеДанные.ВОблачномСервисе Тогда СтруктураПоиска = Новый Структура; СтруктураПоиска.Вставить("Отпечаток", Base64Значение(ТекущиеДанные.Отпечаток)); МодульХранилищеСертификатовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ХранилищеСертификатовКлиент"); @@ -261,6 +282,30 @@ КонецПроцедуры +// Продолжение процедуры Далее. +&НаКлиенте +Процедура ДалееПослеПоискаСертификатаОблачнаяПодпись(Результат, Контекст) Экспорт + + Если Не Результат.Выполнено Тогда + Контекст = Новый Структура; + Контекст.Вставить("ОписаниеОшибки", Результат.Ошибка); + ОбновитьСписокСертификатов(Новый ОписаниеОповещения( + "ДалееПослеОбновленияСпискаСертификатов", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Результат.ДанныеСертификата) Тогда + Контекст = Новый Структура; + Контекст.Вставить("ОписаниеОшибки", НСтр("ru = 'Сертификат отсутствует в облачном сервисе (возможно удален).'")); + ОбновитьСписокСертификатов(Новый ОписаниеОповещения( + "ДалееПослеОбновленияСпискаСертификатов", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; + + ДалееПослеВыгрузкиСертификата(Результат.ДанныеСертификата.Сертификат, Результат.ДанныеСертификата); + +КонецПроцедуры + // Продолжение процедуры Далее. &НаКлиенте Процедура ДалееПослеВыгрузкиСертификата(ВыгруженныеДанные, СертификатКриптографии) Экспорт @@ -476,7 +521,11 @@ &НаСервере Процедура ЗаписатьСертификатВСправочник() - ЭлектроннаяПодписьСлужебный.ЗаписатьСертификатВСправочник(ЭтотОбъект, , Истина); + Если ЗначениеЗаполнено(УчетнаяЗапись) Тогда + ЭлектроннаяПодписьСлужебный.ЗаписатьСертификатВСправочник(ЭтотОбъект, УчетнаяЗапись, Истина); + Иначе + ЭлектроннаяПодписьСлужебный.ЗаписатьСертификатВСправочник(ЭтотОбъект, , Истина); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПередачаПараметров/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПередачаПараметров/Module.bsl index b28dde97c..9c2a602c3 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПередачаПараметров/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПередачаПараметров/Module.bsl @@ -189,4 +189,14 @@ КонецПроцедуры +&НаКлиенте +Процедура СброситьПарольСертификата(СертификатСсылка) Экспорт // АПК:78 - исключение для безопасного хранения паролей. + + ХранилищеПаролей = ОбщиеВнутренниеДанные.Получить("ХранилищеПаролей"); + Если ХранилищеПаролей <> Неопределено Тогда + ХранилищеПаролей.Вставить(СертификатСсылка, Неопределено); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form index 6ceade2e5..5a71ef0e9 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Form.form @@ -1219,9 +1219,24 @@ СертификатыПереопределяемый.Пользователь КАК Пользователь, СертификатыПереопределяемый.ПользовательОповещенОСрокеДействия КАК ПользовательОповещенОСрокеДействия, СертификатыПереопределяемый.Предопределенный КАК Предопределенный, - СертификатыПереопределяемый.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных + СертификатыПереопределяемый.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, + ВЫБОР + КОГДА ПрограммыЭлектроннойПодписиИШифрованияПереопределяемый.ЭтоПрограммаОблачногоСервиса + ТОГДА 4 + КОГДА СертификатыПереопределяемый.Программа = НЕОПРЕДЕЛЕНО + ИЛИ СертификатыПереопределяемый.Программа = ЗНАЧЕНИЕ(Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка) + ИЛИ НЕ ПрограммыЭлектроннойПодписиИШифрованияПереопределяемый.Ссылка ЕСТЬ NULL + ТОГДА 1 + ИНАЧЕ 3 + КОНЕЦ + ВЫБОР + КОГДА СертификатыПереопределяемый.ПометкаУдаления + ТОГДА 4 + ИНАЧЕ 0 + КОНЕЦ КАК ТипРазмещения ИЗ Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК СертификатыПереопределяемый + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыЭлектроннойПодписиИШифрованияПереопределяемый + ПО СертификатыПереопределяемый.Программа = ПрограммыЭлектроннойПодписиИШифрованияПереопределяемый.Ссылка ГДЕ &ДополнительноеУсловие {ГДЕ @@ -1234,7 +1249,6 @@ СоставыГруппПользователейПереопределяемый.Пользователь = СертификатыПереопределяемый.Пользователь И СоставыГруппПользователейПереопределяемый.ГруппаПользователей В (&ГруппаПользователей)))}</queryText> <mainTable>Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования</mainTable> - <dynamicDataRead>true</dynamicDataRead> <autoFillAvailableFields>true</autoFillAvailableFields> <customQuery>true</customQuery> <autoSaveUserSettings>true</autoSaveUserSettings> diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Help/ru.html index f34ac0920..d99a62e07 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Help/ru.html +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Help/ru.html @@ -2,8 +2,7 @@ <p>Предназначен для подбора сертификата электронной подписи.</p> <p>Открывается по кнопке <strong>Подобрать</strong> из окна <a href="Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования.Form.ШифрованиеДанных/Help">Шифрование данных</a>.</p> <p>В списке выводится:</p> -<ul><li><strong>Представление</strong> - полное наименование сертификата; -</li><li><strong>Фирма</strong> - организация, которой выдан сертификат; +<ul><li><strong>Представление</strong> - полное наименование сертификата; </li><li><strong>Фирма</strong> - организация, которой выдан сертификат; </li><li><strong>Пользователь</strong> - пользователь, который является владельцем подписи; </li><li><strong>Кем выдан</strong> - организация, которая выдала сертификат.</li></ul><h3>Отборы</h3> <ul><li>Если <a href="Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования/Help">сертификатов</a> много, то можно отобрать нужные: diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl index 0882d01c0..1c5eaaeca 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодборСертификатовДляШифрования/Module.bsl @@ -35,6 +35,12 @@ ГруппаПользователейПриИзмененииНаСервере(); + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + Элементы.Список.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов");; + Элементы.Список.ПутьКДаннымКартинкиСтроки = "Список.ТипРазмещения"; + КонецЕсли; + КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form index 34b740d37..3766ec22d 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Form.form @@ -74,10 +74,8 @@ <extInfo xsi:type="form:UsualGroupExtInfo"> <group>Vertical</group> <behavior>Auto</behavior> - <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> - <throughAlign>Auto</throughAlign> <currentRowUse>Auto</currentRowUse> </extInfo> </items> @@ -146,7 +144,6 @@ <event>ChoiceProcessing</event> <name>СертификатОбработкаВыбора</name> </handlers> - <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> <wrap>true</wrap> <dropListButton>false</dropListButton> @@ -226,6 +223,7 @@ <dataPath xsi:type="form:DataPath"> <segments>ЗапомнитьПароль</segments> </dataPath> + <skipOnInput>true</skipOnInput> <titleLocation>Right</titleLocation> <toolTip> <key>ru</key> @@ -513,6 +511,37 @@ <showLeftMargin>true</showLeftMargin> <united>true</united> <showTitle>auto</showTitle> + <currentRowUse>Auto</currentRowUse> + </extInfo> + </items> + <items xsi:type="form:FormGroup"> + <name>ГруппаКонтейнер</name> + <id>468</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Контейнер</value> + + + ГруппаКонтейнерРасширеннаяПодсказка + 469 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true Auto Auto @@ -532,6 +561,7 @@ Комментарий + true 2 КомментарийРасширеннаяПодсказка @@ -554,7 +584,6 @@ Left true - true 1 true true @@ -564,6 +593,38 @@ Normal + + ГруппаКонтейнер1 + 470 + true + true + + true + + + <key>ru</key> + <value>Контейнер1</value> + + + ГруппаКонтейнер1РасширеннаяПодсказка + 471 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + true true @@ -573,6 +634,7 @@ ru Подписание и комментарий + true ГруппаПодписаниеИКомментарийРасширеннаяПодсказка 453 @@ -588,96 +650,189 @@ Vertical Auto true + Auto + + + + ГруппаКоманды + 456 + + ГруппаКомандыПодтверждения + 458 + true + true + + true + + + <key>ru</key> + <value>Команды подтверждения</value> + + + ГруппаКомандыПодтвержденияРасширеннаяПодсказка + 459 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаОсновныеКоманды + 460 + + Подписать + 462 + true + true + + true + + + ПодписатьРасширеннаяПодсказка + 463 + Label + true + true + + Left + + + Form.Command.Подписать + Auto + true + true + true + UserCmds + Auto + + + Отмена + 464 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + + ОтменаРасширеннаяПодсказка + 465 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + + ФормаСправка + 466 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 467 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Основные команды</value> + + false + Right + + ГруппаОсновныеКомандыРасширеннаяПодсказка + 461 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + + ГруппаКомандыРасширеннаяПодсказка + 457 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true Auto Auto - Bottom - true + None + false ФормаКоманднаяПанель -1 - - Подписать - 307 - true - true - - true - - - ПодписатьРасширеннаяПодсказка - 308 - Label - true - true - - Left - - - Form.Command.Подписать - Auto - true - true - true - UserCmds - Auto - - - Отмена - 303 - - <key>ru</key> - <value>Отмена</value> - - true - true - - true - - - ОтменаРасширеннаяПодсказка - 304 - Label - true - true - - Left - - - Form.StandardCommand.Close - Normal - true - true - UserCmds - Auto - - - ФормаСправка - 448 - true - true - - true - - - ФормаСправкаРасширеннаяПодсказка - 449 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - Right @@ -696,7 +851,7 @@ OnClose ПриЗакрытии - 45 + 56 LockOwner true true @@ -851,7 +1006,7 @@ СертификатПрограмма 9 - CatalogRef.ПрограммыЭлектроннойПодписиИШифрования + DefinedType.ПрограммаЭлектроннойПодписи true @@ -949,9 +1104,7 @@ ВыполнятьНаСервере 19 - - Boolean - + true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html index 42f80996e..7b411566c 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Help/ru.html @@ -7,10 +7,14 @@
  • Если Сертификат не выбран - выберите его из списка. Если при следующем открытии сертификат будет среди установленных на компьютере, повторный выбор не потребуется.
  • При выборе из выпадающего списка будут показаны только сертификаты, у которых поле Пользователь не заполнено или совпадает с текущим пользователем сеанса, а поле Программа заполнено. Если при открытии окна Подписание был указан отбор по организации, то в выпадающем списке не будет сертификатов, у которых поле Организация не совпадает с организацией, указанной в отборе. Если при открытии окна Подписание был указан конкретный список сертификатов, то будет показан только этот список.
  • При выборе из списка личных сертификатов (установленных на компьютере и на сервере) путем нажатия Показать все, показываются все сертификаты без учета полей Пользователь и Программа. Если при открытии окна Подписание был указан отбор по организации, то в списке не будет сертификатов, у которых поле Организация не совпадает с организацией, указанной в отборе. Но будут показаны все сертификаты, которых еще нет в списке (то есть те, которые есть только в хранилище сертификатов операционный системы компьютера или сервера). -
  • Введите Пароль к закрытому ключу (указанный при установке или создании сертификата). -
  • Включите флажок Запомнить пароль, для того чтобы не вводить пароль в следующий раз. +
  • Введите Пароль к закрытому ключу (указанный при установке или создании сертификата) или Пин-код, если местом хранения сертификата является сервис + облачной подписи. + + +
  • Включите флажок Запомнить пароль, для того чтобы не вводить пароль (пин-код +для облачной подписи) в следующий раз.
  • В некоторых случаях можно ввести Комментарий к подписи - дополнительную информацию о подписи.
  • Для выполнения подписи нажмите Подписать.
  • Данные будут подписаны с использованием указанного сертификата. -
  • Созданная электронная подпись хранится в программе. Подписанный объект становится недоступным для редактирования и отображается в списках со значком .
  • См. также:

    - \ No newline at end of file +
  • Созданная электронная подпись хранится в программе. Подписанный объект становится недоступным для редактирования и отображается в списках со значком .
    • См. также:

      + \ No newline at end of file diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl index f1e74884f..587f39c3a 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl @@ -23,6 +23,17 @@ ЭлектроннаяПодписьСлужебный.НастроитьФормуПодписанияШифрованияРасшифровки(ЭтотОбъект); + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер"); + + МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Подписание", + "ГруппаПодписаниеИКомментарий", + "ГруппаКонтейнер", + "ГруппаКонтейнер1", + "ГруппаКомандыПодтверждения"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -36,6 +47,11 @@ ТекущийЭлемент = Элементы[ИмяПоляАктивизироватьПоУмолчанию]; КонецЕсли; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриОткрытии(ЭтотОбъект, Отказ, ЗначениеЗаполнено(Пароль) И ЗапомнитьПароль, ОписаниеДанных); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -50,6 +66,30 @@ Если ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда ПодключитьОбработчикОжидания("ПриИзмененииСпискаСертификатов", 0.1, Истина); + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ПодтверждениеВыполнитьОсновнуюОперацию") И Источник = УникальныйИдентификатор Тогда + Если Параметр.Выполнено Тогда + ДанныеПакета = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметр, "ДанныеПакета"); + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, Новый Структура("ДанныеПакета", ДанныеПакета)); + СвойстваОблачнойПодписи = ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных); + ОповещениеПриПодтверждении = СвойстваОблачнойПодписи.ОповещениеПриПодтверждении; + + Если ОповещениеПриПодтверждении = Неопределено Тогда + ПодписатьДанные(Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект)); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеПриПодтверждении, ЭтотОбъект); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ПодтверждениеАвторизация") И Источник = УникальныйИдентификатор Тогда + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте( + Новый ОписаниеОповещения("СертификатОбработкаВыбораЗавершение", ЭтотОбъект)); + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ПодтверждениеПодготовитьДанные") И Источник = УникальныйИдентификатор Тогда + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьДанныеДляОблачнойПодписи( + Параметр.ОбработчикСледующий, Параметр.КонтекстФормы, + Параметр.ОписаниеДанных, Параметр.Данные, Истина); + КонецЕсли; КонецПроцедуры @@ -80,7 +120,14 @@ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте); - ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля); + ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриОткрытии", Истина)); + + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверитьНаОшибкуСертификата(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, СвойстваПароля.Значение); + КонецЕсли; КонецПроцедуры @@ -101,6 +148,7 @@ Если ТипЗнч(ОтборСертификатов) <> Тип("СписокЗначений") Тогда ПараметрыФормы.Вставить("ОтборПоОрганизации", ОтборСертификатов); КонецЕсли; + ПараметрыФормы.Вставить("ВыполнятьНаСервере", ВыполнятьНаСервере); ЭлектроннаяПодписьСлужебныйКлиент.ВыборСертификатаДляПодписанияИлиРасшифровки(ПараметрыФормы, Элемент); @@ -149,6 +197,13 @@ ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля); КонецЕсли; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверитьНаОшибкуСертификата(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -203,19 +258,27 @@ &НаКлиенте Процедура Подписать(Команда) - Если Не Элементы.Подписать.Доступность Тогда - Возврат; - КонецЕсли; - ОписаниеДанных.Вставить("ПользовательНажалКнопкуПодписать", Истина); Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли; - Элементы.Подписать.Доступность = Ложь; - - ПодписатьДанные(Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект)); + Если ЭлектроннаяПодписьСлужебныйКлиент.ЭтоОперацияОблачнойПодписи(ЭтотОбъект) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + Если МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверкаПередВыполнениемОперации(ЭтотОбъект, СвойстваПароля.Значение) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + КонецЕсли; + Иначе + Если Не Элементы.Подписать.Доступность Тогда + Возврат; + КонецЕсли; + + Элементы.Подписать.Доступность = Ложь; + + ПодписатьДанные(Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект)); + + КонецЕсли; КонецПроцедуры @@ -274,24 +337,44 @@ КонецЕсли; ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПриОткрытии", Истина); Если СвойстваПароля <> Неопределено Тогда ДополнительныеПараметры.Вставить("ПриУстановкеПароляИзДругойОперации", Истина); КонецЕсли; ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля, ДополнительныеПараметры); + МодульСервисКриптографииDSSПодтверждениеКлиент = Неопределено; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + КонецЕсли; + Если БезПодтверждения И ( ДополнительныеПараметры.ПарольУказан Или ДополнительныеПараметры.УсиленнаяЗащитаЗакрытогоКлюча Или ОблачныйПарольПодтвержден) Тогда - ОбработкаПослеПредупреждения = Неопределено; - ПодписатьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеПодписанияДанных", ЭтотОбъект, Контекст)); - Возврат; + Если МодульСервисКриптографииDSSПодтверждениеКлиент <> Неопределено Тогда + Если НЕ МодульСервисКриптографииDSSПодтверждениеКлиент.ОблачнаяПодписьТребуетПодтверждения(ЭтотОбъект, ДополнительныеПараметры.ПарольУказан) Тогда + ОбработкаПослеПредупреждения = Неопределено; + ПодписатьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеПодписанияДанных", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; + Иначе + ОбработкаПослеПредупреждения = Неопределено; + ПодписатьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеПодписанияДанных", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; КонецЕсли; Открыть(); + Если МодульСервисКриптографииDSSПодтверждениеКлиент <> Неопределено Тогда + Если МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверкаВыполненияНачальнойОперации(ЭтотОбъект, БезПодтверждения И ДополнительныеПараметры.ПарольУказан) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + КонецЕсли; + КонецЕсли; + ПродолжитьОткрытиеЗавершение(Контекст); КонецПроцедуры @@ -356,9 +439,7 @@ &НаКлиенте Процедура ВыполнитьПодписаниеЗавершение(Результат, Контекст) Экспорт - Если Результат = Истина Тогда - ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина); - КонецЕсли; + ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Результат); КонецПроцедуры @@ -393,11 +474,24 @@ ЭлектроннаяПодписьСлужебный.СертификатПриИзмененииНаСервере(ЭтотОбъект, ОтпечаткиСертификатовНаКлиенте); + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ПодписатьДанные(Оповещение) + Если ЭлектроннаяПодписьСлужебныйКлиент.ЭтоОперацияОблачнойПодписи(ЭтотОбъект) Тогда + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, + Новый Структура("УчетнаяЗапись, ДанныеПодтверждения", ЭтотОбъект.НастройкиПользователя, ЭтотОбъект.ДанныеПодтверждения)); + Иначе + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, + Новый Структура("УчетнаяЗапись, ДанныеПодтверждения")); + КонецЕсли; + Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура); @@ -489,7 +583,9 @@ Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); - Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() Тогда + Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И ВыполнятьНаСервере <> Ложь Тогда + Если ЗначениеЗаполнено(СертификатНаСервереОписаниеОшибки) Тогда Результат = Новый Структура("Ошибка", СертификатНаСервереОписаниеОшибки); СертификатНаСервереОписаниеОшибки = Новый Структура; @@ -523,6 +619,10 @@ Иначе Если Результат <> Неопределено Тогда Контекст.ОшибкаНаСервере = Результат.Ошибка; + Если ВыполнятьНаСервере = Истина Тогда + ПодписатьДанныеПослеВыполненияНаСторонеКлиента(Новый Структура, Контекст); + Возврат; + КонецЕсли; КонецЕсли; // Попытка подписания на клиенте. @@ -635,4 +735,53 @@ КонецПроцедуры +#Область ПодключаемыеОбработчики + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработкаКоманды(Команда) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаКоманды(ЭтотОбъект, Команда, ОписаниеДанных, СвойстваПароля.Значение); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, ОписаниеДанных, СвойстваПароля.Значение); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработчикОжидания() + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаОжидания(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form index 1dcc70159..77a8bb3aa 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form @@ -4298,7 +4298,7 @@ Программа 4 - CatalogRef.ПрограммыЭлектроннойПодписиИШифрования + DefinedType.ПрограммаЭлектроннойПодписи true @@ -4575,6 +4575,19 @@ true
      + + ЭтоПрограммаОблачнойПодписи + 22 + + Boolean + + + true + + + true + + Проверить diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl index 50b8a9b48..d16c89bf2 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl @@ -128,20 +128,36 @@ КонецЕсли; СвойстваСертификата = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Сертификат, - "ДанныеСертификата, Программа, УсиленнаяЗащитаЗакрытогоКлюча"); + "ДанныеСертификата, Программа, УсиленнаяЗащитаЗакрытогоКлюча, Отпечаток"); Программа = СвойстваСертификата.Программа; АдресСертификата = ПоместитьВоВременноеХранилище( СвойстваСертификата.ДанныеСертификата.Получить(), УникальныйИдентификатор); СертификатУсиленнаяЗащитаЗакрытогоКлюча = СвойстваСертификата.УсиленнаяЗащитаЗакрытогоКлюча; + ЭтоПрограммаОблачнойПодписи = ТипЗнч(Программа) = ЭлектроннаяПодписьСлужебный.ПолучитьТипОблачнойПодписи() + И ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи(); + ЭтоПрограммаОблачногоСервиса = Программа = ЭлектроннаяПодписьСлужебный.ПрограммаОблачногоСервиса(); - Если Программа.ЭтоПрограммаОблачногоСервиса Тогда - ЭтоПрограммаОблачногоСервиса = Истина; + Если ЭтоПрограммаОблачнойПодписи Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + ДанныеСертификата = МодульСервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоОтпечатку( + МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(СвойстваСертификата.Отпечаток)); + Если ДанныеСертификата = Неопределено ИЛИ ДанныеСертификата.УчетнаяЗапись <> Программа Тогда + ВызватьИсключение МодульСервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, "ЧужойСертификат"); + КонецЕсли; + + МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Проверка", "", ""); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат); + + ИначеЕсли ЭтоПрограммаОблачногоСервиса Тогда Элементы.ГруппаВводаПароля.Видимость = Ложь; + ИначеЕсли Не СтандартныеПроверки И Не ВводитьПароль Тогда - Элементы.ГруппаВводаПароля.Видимость = Ложь; + КонецЕсли; ОбновитьВидимостьНаСервере(); @@ -164,6 +180,11 @@ Отказ = Истина; КонецЕсли; + Если ЭтоПрограммаОблачнойПодписи Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриОткрытии(ЭтотОбъект, Отказ, ЗначениеЗаполнено(Пароль) И ЗапомнитьПароль); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -319,6 +340,7 @@ КлиентскиеПараметры.Вставить("Результат"); ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПриОткрытии", Истина); Если КлиентскиеПараметры.Свойство("УказанКонтекстДругойОперации") Тогда СвойстваСертификата = ОбщиеВнутренниеДанные; @@ -560,7 +582,11 @@ ПроверитьЗаконныйСертификатНаКлиенте(Контекст); // Наличие сертификата в личном списке. - Если ЭтоПрограммаОблачногоСервиса Тогда + Если ЭтоОперацияОблачнойПодписи() Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("ПроверитьНаСторонеКлиентаПослеАвторизацииВОблачнойПодписи", ЭтотОбъект, Контекст); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ПроверкаАутентификацииПользователя(ОповещениеСледующее, Программа); + ИначеЕсли ЭтоПрограммаОблачногоСервиса Тогда СтруктураПоиска = Новый Структура; СтруктураПоиска.Вставить("Отпечаток", Контекст.СертификатКриптографии.Отпечаток); МодульХранилищеСертификатовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ХранилищеСертификатовКлиент"); @@ -1056,6 +1082,24 @@ КонецПроцедуры +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки(Неопределен, Контекст) Экспорт + + ПараметрыВыполнения = ПараметрыВыполненияКонтекста.Получить(Контекст); + ПараметрыВыполненияКонтекста.Удалить(Контекст); + + УстановитьЭлемент(ЭтотОбъект, Контекст.ЭлементСписка.Имя, Ложь, + ПараметрыВыполнения.ОписаниеОшибки, + ПараметрыВыполнения.ЭтоПредупреждение <> Истина, + ОбъединятьРезультаты); + + ПроверитьНаСторонеКлиентаЦиклНачало(Контекст); + +КонецПроцедуры + +#КонецОбласти + // Продолжение процедуры ПроверитьНаСторонеКлиента. &НаКлиенте Процедура ПроверитьНаСторонеКлиентаЦиклНачало(Контекст) @@ -1098,21 +1142,293 @@ КонецПроцедуры +#Область ПроверкаНаКлиентеОблачнаяПодпись + // Продолжение процедуры ПроверитьНаСторонеКлиента. &НаКлиенте -Процедура ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки(Неопределен, Контекст) Экспорт +Процедура ПроверитьНаСторонеКлиентаПослеАвторизацииВОблачнойПодписи(РезультатВызова, Контекст) Экспорт - ПараметрыВыполнения = ПараметрыВыполненияКонтекста.Получить(Контекст); - ПараметрыВыполненияКонтекста.Удалить(Контекст); + Если Не РезультатВызова.Выполнено Тогда + ОписаниеОшибки = РезультатВызова.Ошибка; + КонецЕсли; - УстановитьЭлемент(ЭтотОбъект, Контекст.ЭлементСписка.Имя, Ложь, - ПараметрыВыполнения.ОписаниеОшибки, - ПараметрыВыполнения.ЭтоПредупреждение <> Истина, - ОбъединятьРезультаты); + // Если не авторизовались, проверки прекращаются. + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + Возврат; + КонецЕсли; - ПроверитьНаСторонеКлиентаЦиклНачало(Контекст); + ЭтотОбъект.НастройкиПользователя = РезультатВызова.НастройкиПользователя; + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Контекст.СертификатКриптографии.Отпечаток)); + МодульСервисКриптографииDSSКлиент.НайтиСертификат(Новый ОписаниеОповещения( + "ПроверитьНаСторонеКлиентаПослеПоискаСертификатаОблачнойПодписи", ЭтотОбъект, Контекст), СтруктураПоиска); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаПослеПоискаСертификатаОблачнойПодписи(РезультатВызова, Контекст) Экспорт + + ОписаниеОшибки = ""; + Если НЕ ОперацияАктивна() Тогда + ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'"); + ИначеЕсли Не РезультатВызова.Выполнено Тогда + ОписаниеОшибки = РезультатВызова.Ошибка; + ИначеЕсли Не ЗначениеЗаполнено(РезультатВызова.ДанныеСертификата) Тогда + ОписаниеОшибки = НСтр("ru = 'Сертификат отсутствует в сервисе ""Облачная подпись"" (возможно удален).'"); + КонецЕсли; + + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + + НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'"); + КонецЕсли; + УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Ложь, ОписаниеОшибки, , ОбъединятьРезультаты); + + // Если не нашли сертификат в хранилище сертификатов, проверки прекращаются. + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда + Возврат; + КонецЕсли; + + // Проверка данных сертификата. + Контекст.Вставить("НастройкиПользователя", ЭтотОбъект.НастройкиПользователя); + ОбработчикСледующий = Новый ОписаниеОповещения( + "ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаОблачнойПодписи", ЭтотОбъект, Контекст); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ПроверитьСертификат(ОбработчикСледующий, Контекст.НастройкиПользователя, РезультатВызова.ДанныеСертификата.Сертификат); КонецПроцедуры + +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаПослеПроверкиСертификатаОблачнойПодписи(Результат, Контекст) Экспорт + + Если НЕ ОперацияАктивна() Тогда + ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'"); + ИначеЕсли Результат.Выполнено И Результат.Результат Тогда + ОписаниеОшибки = ""; + Иначе + ОписаниеОшибки = Результат.Ошибка; + КонецЕсли; + УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты); + + // Наличие программы + Если ЗначениеЗаполнено(Программа) Тогда + ПроверитьНаСторонеКлиентаОблачнаяПодпись("ОблачнаяПодпись", Контекст); + Иначе + ОписаниеОшибки = НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'"); + ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(ОписаниеОшибки, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаОблачнаяПодпись(Результат, Контекст) + + Контекст.Вставить("МенеджерКриптографии", Неопределено); + + Если НЕ ОперацияАктивна() Тогда + ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'"); + ИначеЕсли ТипЗнч(Результат) = Тип("Строка") И Результат = "ОблачнаяПодпись" Тогда + Контекст.МенеджерКриптографии = Результат; + ОписаниеОшибки = ""; + Иначе + ОписаниеОшибки = Результат + Символы.ПС + Символы.ПС + + НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и + |расшифровки не могут быть выполнены.'"); + КонецЕсли; + УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты); + + Если Контекст.МенеджерКриптографии = Неопределено Тогда + ВыполнитьОбработкуОповещения(Контекст.Оповещение); + Возврат; + КонецЕсли; + + // Подписание. + Если ПроверкиНаКлиенте.НаличиеСертификата Тогда + + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + ОбработчикСледующий = Новый ОписаниеОповещения( + "ПроверитьНаСторонеКлиентаПослеПодписанияОблачнаяПодпись", ЭтотОбъект, Контекст, + "ПроверитьНаСторонеКлиентаПослеОшибкиПодписания", ЭтотОбъект); + + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Контекст.СертификатКриптографии.Отпечаток)); + + ЗначениеПинКода = ?(ЗначениеЗаполнено(СвойстваПароля.Значение), СвойстваПароля.Значение, Неопределено); + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("ПинКод", МодульСервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ЗначениеПинКода)); + + МодульСервисКриптографииDSSКлиент.Подписать( + ОбработчикСледующий, + Контекст.НастройкиПользователя, + Контекст.ДанныеСертификата, + , + СтруктураПоиска, + ПараметрыОперации); + + Иначе + ПроверитьНаСторонеКлиентаПослеПодписания(Неопределено, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаПослеПодписанияОблачнаяПодпись(РезультатВызова, Контекст) Экспорт + + ОписаниеОшибки = Неопределено; + + Если НЕ ОперацияАктивна() Тогда + ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'"); + ИначеЕсли РезультатВызова <> Неопределено Тогда + Если Не РезультатВызова.Выполнено Тогда + ОписаниеОшибки = РезультатВызова.Ошибка; + Иначе + ДанныеПодписи = РезультатВызова.Результат; + ОписаниеОшибки = ""; + ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ПарольПринят = Истина; + КонецЕсли; + КонецЕсли; + + УстановитьЭлемент(ЭтотОбъект, "Подписание", Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты); + + // Проверка подписи. + Если ПроверкиНаКлиенте.НаличиеСертификата И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ОбработчикСледующий = Новый ОписаниеОповещения( + "ПроверитьНаСторонеКлиентаПослеПроверкиПодписиОблачнаяПодпись", ЭтотОбъект, Контекст, + "ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи", ЭтотОбъект); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ПроверитьПодпись(ОбработчикСледующий, + Контекст.НастройкиПользователя, + ДанныеПодписи, + Контекст.ДанныеСертификата, + "CMS"); + Иначе + ПроверитьНаСторонеКлиентаПослеПроверкиПодписиОблачнаяПодпись(Неопределено, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаПослеПроверкиПодписиОблачнаяПодпись(РезультатВызова, Контекст) Экспорт + + ОписаниеОшибки = Неопределено; + + Если НЕ ОперацияАктивна() Тогда + ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'"); + ИначеЕсли РезультатВызова <> Неопределено Тогда + Если Не РезультатВызова.Выполнено Тогда + ОписаниеОшибки = РезультатВызова.Ошибка; + Иначе + ОписаниеОшибки = ""; + КонецЕсли; + УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты); + КонецЕсли; + + // Шифрование. + Если НЕ ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ОбработчикСледующий = Новый ОписаниеОповещения( + "ПроверитьНаСторонеКлиентаПослеШифрованияОблачнаяПодпись", ЭтотОбъект, Контекст, + "ПроверитьНаСторонеКлиентаПослеОшибкиШифрования", ЭтотОбъект); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.Зашифровать(ОбработчикСледующий, + Контекст.НастройкиПользователя, + Контекст.ДанныеСертификата, + Контекст.ДанныеСертификата); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаПослеШифрованияОблачнаяПодпись(РезультатВызова, Контекст) Экспорт + + ОписаниеОшибки = Неопределено; + Если НЕ ОперацияАктивна() Тогда + ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'"); + ИначеЕсли РезультатВызова <> Неопределено Тогда + Если Не РезультатВызова.Выполнено Тогда + ОписаниеОшибки = РезультатВызова.Ошибка; + Иначе + ОписаниеОшибки = ""; + КонецЕсли; + КонецЕсли; + УстановитьЭлемент(ЭтотОбъект, "Шифрование", Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты); + + // Расшифровка. + Если ПроверкиНаКлиенте.НаличиеСертификата И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ОбработчикСледующий = Новый ОписаниеОповещения( + "ПроверитьНаСторонеКлиентаПослеРасшифровкиОблачнаяПодпись", ЭтотОбъект, Контекст, + "ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки", ЭтотОбъект); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Контекст.СертификатКриптографии.Отпечаток)); + + ЗначениеПинКода = ?(ЗначениеЗаполнено(СвойстваПароля.Значение), СвойстваПароля.Значение, Неопределено); + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("ПинКод", МодульСервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ЗначениеПинКода)); + + МодульСервисКриптографииDSSКлиент.Расшифровать(ОбработчикСледующий, Контекст.НастройкиПользователя, РезультатВызова.Результат, , СтруктураПоиска, ПараметрыОперации); + Иначе + ПроверитьНаСторонеКлиентаПослеРасшифровкиОблачнаяПодпись(Неопределено, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьНаСторонеКлиента. +&НаКлиенте +Процедура ПроверитьНаСторонеКлиентаПослеРасшифровкиОблачнаяПодпись(РезультатВызова, Контекст) Экспорт + + ОписаниеОшибки = Неопределено; + Если НЕ ОперацияАктивна() Тогда + ОписаниеОшибки = НСтр("ru = 'Форма проверки закрыта.'"); + ИначеЕсли РезультатВызова <> Неопределено Тогда + Если Не РезультатВызова.Выполнено Тогда + ОписаниеОшибки = РезультатВызова.Ошибка; + Иначе + ОписаниеОшибки = ""; + ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РезультатВызова.Результат, ОписаниеОшибки); + КонецЕсли; + УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты); + КонецЕсли; + + ПроверитьНаСторонеКлиентаДополнительныеПроверки(Контекст); + +КонецПроцедуры + +&НаКлиенте +Функция ЭтоОперацияОблачнойПодписи() + + Результат = ТипЗнч(Программа) = ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьТипОблачнойПодписи(); + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ОперацияАктивна() + + Результат = Открыта(); + Возврат Результат; + +КонецФункции #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form index caed583dd..676bd9773 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form @@ -48,6 +48,7 @@ <name>ПредставлениеДанныхНажатие</name> </handlers> <autoMaxHeight>true</autoMaxHeight> + <horizontalStretch>true</horizontalStretch> <hyperlink>true</hyperlink> </extInfo> </items> @@ -72,12 +73,11 @@ </extendedTooltip> <type>UsualGroup</type> <extInfo xsi:type="form:UsualGroupExtInfo"> - <group>HorizontalIfPossible</group> + <group>Vertical</group> <behavior>Auto</behavior> <representation>NormalSeparation</representation> <showLeftMargin>true</showLeftMargin> <united>true</united> - <throughAlign>Auto</throughAlign> <currentRowUse>Auto</currentRowUse> </extInfo> </items> @@ -159,113 +159,27 @@ <choiceHistoryOnInput>DontUse</choiceHistoryOnInput> </extInfo> </items> - <items xsi:type="form:FormField"> - <name>Пароль</name> - <id>316</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>Пароль</segments> - </dataPath> - <handlers> - <event>OnChange</event> - <name>ПарольПриИзменении</name> - </handlers> - <extendedTooltip> - <name>ПарольРасширеннаяПодсказка</name> - <id>318</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ПарольКонтекстноеМеню</name> - <id>317</id> - <autoFill>true</autoFill> - </contextMenu> - <type>InputField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:InputFieldExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <horizontalStretch>false</horizontalStretch> - <passwordMode>true</passwordMode> - <chooseType>true</chooseType> - <typeDomainEnabled>true</typeDomainEnabled> - <textEdit>true</textEdit> - <textSize>Normal</textSize> - </extInfo> - </items> <items xsi:type="form:FormGroup"> - <name>Страницы</name> - <id>416</id> - <items xsi:type="form:FormGroup"> - <name>СтраницаЗапоминаниеПароля</name> - <id>418</id> - <items xsi:type="form:FormField"> - <name>ЗапомнитьПароль</name> - <id>324</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>ЗапомнитьПароль</segments> - </dataPath> - <titleLocation>Right</titleLocation> - <toolTip> - <key>ru</key> - <value>Запомнить пароль сертификата до закрытия программы. При снятии флажка пароль стирается из памяти, если запоминался ранее.</value> - </toolTip> - <toolTipRepresentation>Button</toolTipRepresentation> - <handlers> - <event>OnChange</event> - <name>ЗапомнитьПарольПриИзменении</name> - </handlers> - <extendedTooltip> - <name>ЗапомнитьПарольРасширеннаяПодсказка</name> - <id>326</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ЗапомнитьПарольКонтекстноеМеню</name> - <id>325</id> - <autoFill>true</autoFill> - </contextMenu> - <type>CheckBoxField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:CheckBoxFieldExtInfo"/> - </items> + <name>ГруппаПароль</name> + <id>455</id> + <items xsi:type="form:FormField"> + <name>Пароль</name> + <id>316</id> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> - <title> - <key>ru</key> - <value>Страница запоминание пароля</value> - + + Пароль + + + OnChange + ПарольПриИзменении + - СтраницаЗапоминаниеПароляРасширеннаяПодсказка - 419 + ПарольРасширеннаяПодсказка + 318 Label true true @@ -273,13 +187,106 @@ Left - Page - - HorizontalIfPossible - auto - false + + ПарольКонтекстноеМеню + 317 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + Normal + + ЗапомнитьПароль + 324 + + <key>ru</key> + <value>Запомнить на время сеанса</value> + + true + true + + true + + + ЗапомнитьПароль + + Right + + ru + Запомнить пароль сертификата до закрытия программы. При снятии флажка пароль стирается из памяти, если запоминался ранее. + + Button + + OnChange + ЗапомнитьПарольПриИзменении + + + ЗапомнитьПарольРасширеннаяПодсказка + 326 + Label + true + true + + Left + + + + ЗапомнитьПарольКонтекстноеМеню + 325 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Пароль</value> + + + ГруппаПарольРасширеннаяПодсказка + 456 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + Страницы + 416 СтраницаПояснениеУсиленногоПароля 438 @@ -475,6 +482,38 @@ Auto + + ГруппаКонтейнер + 457 + true + true + + true + + + <key>ru</key> + <value>Контейнер</value> + + + ГруппаКонтейнерРасширеннаяПодсказка + 458 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + true true @@ -502,6 +541,180 @@ true true auto + Auto + + + + ГруппаКоманды + 459 + + ГруппаКомандыПодтверждения + 461 + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандыПодтвержденияРасширеннаяПодсказка + 462 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаОсновныеКоманды + 463 + + ФормаРасшифровать + 465 + true + true + + true + + + ФормаРасшифроватьРасширеннаяПодсказка + 466 + Label + true + true + + Left + + + Form.Command.Расшифровать + Auto + true + true + true + UserCmds + Auto + + + ФормаЗакрыть + 467 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 468 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + + ФормаСправка + 469 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 470 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Основные команды</value> + + false + Right + + ГруппаОсновныеКомандыРасширеннаяПодсказка + 464 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + + ГруппаКомандыРасширеннаяПодсказка + 460 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true Auto Auto @@ -511,87 +724,6 @@ ФормаКоманднаяПанель -1 - - ФормаРасшифровать - 307 - true - true - - true - - - ФормаРасшифроватьРасширеннаяПодсказка - 308 - Label - true - true - - Left - - - Form.Command.Расшифровать - Auto - true - true - true - UserCmds - Auto - - - ФормаЗакрыть - 303 - - <key>ru</key> - <value>Отмена</value> - - true - true - - true - - - ФормаЗакрытьРасширеннаяПодсказка - 304 - Label - true - true - - Left - - - Form.StandardCommand.Close - Normal - true - true - UserCmds - Auto - - - ФормаСправка - 448 - true - true - - true - - - ФормаСправкаРасширеннаяПодсказка - 449 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - Right @@ -610,7 +742,7 @@ OnClose ПриЗакрытии - 45 + 56 LockOwner true true @@ -766,7 +898,7 @@ СертификатПрограмма 9 - CatalogRef.ПрограммыЭлектроннойПодписиИШифрования + DefinedType.ПрограммаЭлектроннойПодписи true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html index eab88e053..6bfba0bcf 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html @@ -9,7 +9,8 @@
      В поле Пароль введите пароль для выбранного сертификата.
    • Включите флажок Запомнить пароль, для того чтобы не вводить пароль в следующий раз.
      -
    • +
    • +
    • Нажмите Расшифровать.
    • См. также:

      \ No newline at end of file diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl index 3e0254a28..f27fdb9bd 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl @@ -31,6 +31,16 @@ Элементы.ПояснениеУсиленногоПароля.Заголовок = НСтр("ru = 'Нажмите ОК, чтобы перейти к вводу пароля.'"); КонецЕсли; + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Расшифрование", + "ГруппаРасшифровка", + "ГруппаКонтейнер", + , + "ГруппаКомандыПодтверждения"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -44,6 +54,11 @@ ТекущийЭлемент = Элементы[ИмяПоляАктивизироватьПоУмолчанию]; КонецЕсли; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриОткрытии(ЭтотОбъект, Отказ, ЗначениеЗаполнено(Пароль) И ЗапомнитьПароль, ОписаниеДанных); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -58,6 +73,28 @@ Если ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда ПодключитьОбработчикОжидания("ПриИзмененииСпискаСертификатов", 0.1, Истина); + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ПодтверждениеВыполнитьОсновнуюОперацию") И Источник = УникальныйИдентификатор Тогда + Если Параметр.Выполнено Тогда + СвойстваОблачнойПодписи = ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных); + ОповещениеПриПодтверждении = СвойстваОблачнойПодписи.ОповещениеПриПодтверждении; + Если ОповещениеПриПодтверждении = Неопределено Тогда + РасшифроватьДанные(Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект)); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеПриПодтверждении, ЭтотОбъект); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ПодтверждениеАвторизация") И Источник = УникальныйИдентификатор Тогда + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте( + Новый ОписаниеОповещения("СертификатПриИзмененииЗавершение", ЭтотОбъект), + ЗначениеЗаполнено(ОтборОтпечатков)); + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ПодтверждениеПодготовитьДанные") И Источник = УникальныйИдентификатор Тогда + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьДанныеДляОблачнойПодписи( + Параметр.ОбработчикСледующий, Параметр.КонтекстФормы, + Параметр.ОписаниеДанных, Параметр.Данные, Истина); + КонецЕсли; КонецПроцедуры @@ -89,7 +126,14 @@ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте); - ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля); + ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриОткрытии", Истина)); + + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверитьНаОшибкуСертификата(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, СвойстваПароля.Значение); + КонецЕсли; КонецПроцедуры @@ -107,6 +151,7 @@ ПараметрыФормы.Вставить("ВыбранныйСертификат", Сертификат); ПараметрыФормы.Вставить("ДляШифрованияИРасшифровки", Истина); ПараметрыФормы.Вставить("ВернутьПароль", Истина); + ПараметрыФормы.Вставить("ВыполнятьНаСервере", ВыполнятьНаСервере); ЭлектроннаяПодписьСлужебныйКлиент.ВыборСертификатаДляПодписанияИлиРасшифровки(ПараметрыФормы, Элемент); @@ -139,6 +184,7 @@ ПараметрыФормы.Вставить("ОтпечатокВыбранногоСертификата", ВыбранноеЗначение); ПараметрыФормы.Вставить("ДляШифрованияИРасшифровки", Истина); ПараметрыФормы.Вставить("ВернутьПароль", Истина); + ПараметрыФормы.Вставить("ВыполнятьНаСервере", ВыполнятьНаСервере); ЭлектроннаяПодписьСлужебныйКлиент.ВыборСертификатаДляПодписанияИлиРасшифровки(ПараметрыФормы, Элемент); Возврат; @@ -149,7 +195,12 @@ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте( Новый ОписаниеОповещения("СертификатОбработкаВыбораЗавершение", ЭтотОбъект, ВыбранноеЗначение), ЗначениеЗаполнено(ОтборОтпечатков)); - + + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, СвойстваПароля.Значение); + КонецЕсли; + КонецПроцедуры // Продолжение процедуры СертификатОбработкаВыбора. @@ -169,6 +220,13 @@ ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля); КонецЕсли; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, СвойстваПароля.Значение); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверитьНаОшибкуСертификата(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -237,17 +295,25 @@ &НаКлиенте Процедура Расшифровать(Команда) - Если Не Элементы.ФормаРасшифровать.Доступность Тогда - Возврат; - КонецЕсли; - Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли; - - Элементы.ФормаРасшифровать.Доступность = Ложь; - - РасшифроватьДанные(Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект)); + + Если ЭлектроннаяПодписьСлужебныйКлиент.ЭтоОперацияОблачнойПодписи(ЭтотОбъект) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + Если МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверкаПередВыполнениемОперации(ЭтотОбъект, СвойстваПароля.Значение) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + КонецЕсли; + + Иначе + Если Не Элементы.ФормаРасшифровать.Доступность Тогда + Возврат; + КонецЕсли; + + Элементы.ФормаРасшифровать.Доступность = Ложь; + + РасшифроватьДанные(Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект)); + КонецЕсли; КонецПроцедуры @@ -305,7 +371,13 @@ Возврат; КонецЕсли; + МодульСервисКриптографииDSSПодтверждениеКлиент = Неопределено; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + КонецЕсли; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПриОткрытии", Истина); Если СвойстваПароля <> Неопределено Тогда ДополнительныеПараметры.Вставить("ПриУстановкеПароляИзДругойОперации", Истина); КонецЕсли; @@ -323,14 +395,28 @@ И ( ДополнительныеПараметры.ПарольУказан Или ДополнительныеПараметры.УсиленнаяЗащитаЗакрытогоКлюча Или ОблачныйПарольПодтвержден) Тогда - - ОбработкаПослеПредупреждения = Неопределено; - РасшифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеРасшифровкиДанных", ЭтотОбъект, Контекст)); - Возврат; + + Если МодульСервисКриптографииDSSПодтверждениеКлиент <> Неопределено Тогда + Если НЕ МодульСервисКриптографииDSSПодтверждениеКлиент.ОблачнаяПодписьТребуетПодтверждения(ЭтотОбъект, ДополнительныеПараметры.ПарольУказан) Тогда + ОбработкаПослеПредупреждения = Неопределено; + РасшифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеРасшифровкиДанных", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; + Иначе + ОбработкаПослеПредупреждения = Неопределено; + РасшифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеРасшифровкиДанных", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; КонецЕсли; Открыть(); + Если МодульСервисКриптографииDSSПодтверждениеКлиент <> Неопределено Тогда + Если МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверкаВыполненияНачальнойОперации(ЭтотОбъект, БезПодтверждения И ДополнительныеПараметры.ПарольУказан) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + КонецЕсли; + КонецЕсли; + ПродолжитьОткрытиеЗавершение(Контекст); КонецПроцедуры @@ -395,9 +481,7 @@ &НаКлиенте Процедура ВыполнитьРасшифровкуЗавершение(Результат, Контекст) Экспорт - Если Результат = Истина Тогда - ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина); - КонецЕсли; + ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Результат); КонецПроцедуры @@ -433,11 +517,24 @@ ЭлектроннаяПодписьСлужебный.СертификатПриИзмененииНаСервере(ЭтотОбъект, ОтпечаткиСертификатовНаКлиенте,, Истина); + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура РасшифроватьДанные(Оповещение) + Если ЭлектроннаяПодписьСлужебныйКлиент.ЭтоОперацияОблачнойПодписи(ЭтотОбъект) Тогда + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, + Новый Структура("УчетнаяЗапись, ДанныеПодтверждения", ЭтотОбъект.НастройкиПользователя, ЭтотОбъект.ДанныеПодтверждения)); + Иначе + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, + Новый Структура("УчетнаяЗапись, ДанныеПодтверждения")); + КонецЕсли; + Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура); @@ -500,7 +597,9 @@ ПараметрыВыполнения.Вставить("ЗначениеПароля", СвойстваПароля.Значение); Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); - Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() Тогда + Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И ВыполнятьНаСервере <> Ложь Тогда + Если ЗначениеЗаполнено(СертификатНаСервереОписаниеОшибки) Тогда Результат = Новый Структура("Ошибка", СертификатНаСервереОписаниеОшибки); СертификатНаСервереОписаниеОшибки = Новый Структура; @@ -535,6 +634,10 @@ Иначе Если Результат <> Неопределено Тогда Контекст.ОшибкаНаСервере = Результат.Ошибка; + Если ВыполнятьНаСервере = Истина Тогда + РасшифроватьДанныеПослеВыполненияНаСторонеКлиента(Новый Структура, Контекст); + Возврат; + КонецЕсли; КонецЕсли; // Попытка подписания на клиенте. @@ -703,4 +806,49 @@ КонецПроцедуры +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработкаКоманды(Команда) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаКоманды(ЭтотОбъект, Команда, ОписаниеДанных, СвойстваПароля.Значение); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, ОписаниеДанных, СвойстваПароля.Значение); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработчикОжидания() + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаОжидания(ЭтотОбъект, ОписаниеДанных, СвойстваПароля.Значение); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Form.form new file mode 100644 index 000000000..73653df37 --- /dev/null +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Form.form @@ -0,0 +1,761 @@ + + + + <key>ru</key> + <value>Список пользователей</value> + + + ГруппаДанные + 42 + + ГруппаАвтор + 32 + + СпособВыбора + 36 + true + true + + true + + + СпособВыбора + + None + + OnChange + СпособВыбораПриИзменении + + + СпособВыбораРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + СпособВыбораКонтекстноеМеню + 37 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + Только для меня + + + ТолькоДляМеня + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Автор</value> + + + ГруппаАвторРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаСписок + 34 + + СпособВыбораСписок + 39 + true + true + + true + + + СпособВыбора + + None + + OnChange + СпособВыбораПриИзменении + + + СпособВыбораСписокРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + СпособВыбораСписокКонтекстноеМеню + 40 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + Добавить пользователей + + + СписокПользователей + + + Vertical + + + + ТаблицаПользователей + 7 + + <key>ru</key> + <value>Таблица пользователей</value> + + true + true + + true + + + ТаблицаПользователей + + None + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + OutputList + ShowRowRearrangement + SortListAsc + SortListDesc + + ПользователиПометка + 23 + true + true + + true + + + ТаблицаПользователей.Пометка + + + ПользователиПометкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ПользователиПометкаКонтекстноеМеню + 24 + true + + CheckBoxField + Auto + true + Left + true + + + + ПользователиПользователь + 20 + true + true + + true + + + ТаблицаПользователей.Пользователь + + + ПользователиПользовательРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ПользователиПользовательКонтекстноеМеню + 21 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаПользователейКоманднаяПанель + 9 + + ПользователиПометитьВсе + 26 + true + true + + true + + + ПользователиПометитьВсеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.ПометитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ПользователиОтменитьПометку + 28 + true + true + + true + + + ПользователиОтменитьПометкуРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.Command.ОтменитьПометку + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + ТаблицаПользователейСтрокаПоиска + 11 + + ТаблицаПользователейСтрокаПоискаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТаблицаПользователейСтрокаПоискаКонтекстноеМеню + 12 + true + + ТаблицаПользователей + + true + + + + ТаблицаПользователейСостояниеПросмотра + 14 + + ТаблицаПользователейСостояниеПросмотраРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТаблицаПользователейСостояниеПросмотраКонтекстноеМеню + 15 + true + + ViewStatusAddition + ТаблицаПользователей + + true + + + + ТаблицаПользователейУправлениеПоиском + 17 + + ТаблицаПользователейУправлениеПоискомРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ТаблицаПользователейУправлениеПоискомКонтекстноеМеню + 18 + true + + SearchControlAddition + ТаблицаПользователей + + true + + + + ТаблицаПользователейРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ТаблицаПользователейКонтекстноеМеню + 8 + true + + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + AsFileRef + true + + + true + true + + true + + + <key>ru</key> + <value>Список</value> + + + ГруппаСписокРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Данные</value> + + + ГруппаДанныеРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаКоманды + 1 + + ОК + 30 + true + true + + true + + true + + ОКРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 5 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандыРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + ТаблицаПользователей + + <key>ru</key> + <value>Таблица пользователей</value> + + 1 + + ValueTable + + + true + + + true + + + Пользователь + + <key>ru</key> + <value>Пользователь</value> + + 1 + + CatalogRef.Пользователи + + + true + + + true + + + + Пометка + + <key>ru</key> + <value>Пометка</value> + + 2 + + Boolean + + + true + + + true + + + + Основной + 3 + + Boolean + + + true + + + true + + + + + СпособВыбора + + <key>ru</key> + <value>Способ выбора</value> + + 2 + + String + + + + true + + + true + + + + РежимПросмотра + 3 + + Boolean + + + true + + + true + + + + ПометитьВсе + + <key>ru</key> + <value>Пометить все</value> + + 1 + + ru + Пометить все + + + true + + + StdPicture.CheckAll + + + + ПометитьВсе + + + Picture + Auto + + ТаблицаПользователей + + Auto + + + ОтменитьПометку + + <key>ru</key> + <value>Отменить пометку</value> + + 2 + + ru + Отменить пометку + + + true + + + StdPicture.UncheckAll + + + + ОтменитьПометку + + + Picture + Auto + + ТаблицаПользователей + + Auto + + + ОК + + <key>ru</key> + <value>ОК</value> + + 3 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Пользователи + + + + Пользователь + + CatalogRef.Пользователи + + + + РежимПросмотра + + Boolean + + + + + + + diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Module.bsl new file mode 100644 index 000000000..748fc5090 --- /dev/null +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/СписокПользователей/Module.bsl @@ -0,0 +1,192 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПользователиСертификата = Параметры.Пользователи; + ВладелецСертификата = Параметры.Пользователь; + РежимПросмотра = Параметры.РежимПросмотра; + + Если ПользователиСертификата = Неопределено Тогда + ПользователиСертификата = Новый Массив; + КонецЕсли; + + Если ПользователиСертификата.Количество() > 0 + ИЛИ ВладелецСертификата <> Пользователи.ТекущийПользователь() + ИЛИ НЕ ЗначениеЗаполнено(ВладелецСертификата) Тогда + СпособВыбора = "СписокПользователей"; + Иначе + СпособВыбора = "ТолькоДляМеня"; + КонецЕсли; + + ЗаполнитьПолныйСписок(ПользователиСертификата, ВладелецСертификата); + УправлениеФормой(ЭтотОбъект); + НастроитьУсловноеОформление(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СпособВыбораПриИзменении(Элемент) + + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + Если РежимПросмотра Тогда + Результат = Неопределено; + Иначе + Результат = Новый Структура; + Результат.Вставить("Пользователи", Новый Массив); + Результат.Вставить("Пользователь", ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка")); + + Если СпособВыбора = "СписокПользователей" Тогда + Для Каждого СтрокаПользователя Из ТаблицаПользователей Цикл + Если СтрокаПользователя.Пометка Тогда + Результат.Пользователи.Добавить(СтрокаПользователя.Пользователь); + КонецЕсли; + КонецЦикла; + Иначе + Результат.Пользователь = ПользователиКлиент.ТекущийПользователь(); + КонецЕсли; + КонецЕсли; + + Закрыть(Результат); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьПометку(Команда) + + ИзменитьПометкиСписка(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПометитьВсе(Команда) + + ИзменитьПометкиСписка(Истина); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьПометкиСписка(ЗначениеПометки) + + Для Каждого СтрокаПользователя Из ТаблицаПользователей Цикл + СтрокаПользователя.Пометка = ЗначениеПометки; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура НастроитьУсловноеОформление() + + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("BackColor"); + ЭлементЦветаОформления.Значение = ЦветаСтиля.ДобавленныйРеквизитФон; + ЭлементЦветаОформления.Использование = Истина; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаПользователей.Основной"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Истина; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементПоляОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ЭлементПоляОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаПользователей"); + ЭлементПоляОформления.Использование = Истина; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьПолныйСписок(ПользователиСертификата, ВладелецСертификата) + + МассивПользователей = Новый Массив; + Если ПользователиСертификата <> Неопределено Тогда + МассивПользователей = ПользователиСертификата; + КонецЕсли; + + Если ЗначениеЗаполнено(ВладелецСертификата) + И СпособВыбора = "СписокПользователей" Тогда + МассивПользователей.Добавить(ВладелецСертификата); + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Пользователи.Ссылка КАК Пользователь, + | ВЫБОР + | КОГДА Пользователи.Ссылка В (&Пользователи) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Пометка, + | ВЫБОР + | КОГДА Пользователи.Ссылка = &ВладелецСертификата + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Основной + |ИЗ + | Справочник.Пользователи КАК Пользователи + |ГДЕ + | (НЕ Пользователи.ПометкаУдаления + | И НЕ Пользователи.Недействителен + | И (НЕ Пользователи.Служебный + | И Пользователи.ИдентификаторПользователяИБ <> &ПустойИдентификаторПользователяИБ + | ИЛИ Пользователи.Ссылка = &ТекущийПользователь) + | ИЛИ Пользователи.Ссылка В (&Пользователи)) + | + |УПОРЯДОЧИТЬ ПО + | Пользователи.Наименование"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Пользователи", МассивПользователей); + Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); + Запрос.УстановитьПараметр("ПустойИдентификаторПользователяИБ", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + Запрос.УстановитьПараметр("ВладелецСертификата", ВладелецСертификата); + + ТаблицаПользователей.Загрузить(Запрос.Выполнить().Выгрузить()); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(КонтекстФормы) + + ЭлементыФормы = КонтекстФормы.Элементы; + + Если КонтекстФормы.РежимПросмотра Тогда + ЭлементыФормы.ТаблицаПользователей.ТолькоПросмотр = Истина; + ЭлементыФормы.СпособВыбора.ТолькоПросмотр = Истина; + ЭлементыФормы.СпособВыбораСписок.ТолькоПросмотр = Истина; + Иначе + ЭлементыФормы.ТаблицаПользователей.ТолькоПросмотр = НЕ КонтекстФормы.СпособВыбора = "СписокПользователей"; + КонецЕсли; + + ЭлементыФормы.ПользователиПометитьВсе.Доступность = НЕ ЭлементыФормы.ТаблицаПользователей.ТолькоПросмотр; + ЭлементыФормы.ПользователиОтменитьПометку.Доступность = НЕ ЭлементыФормы.ТаблицаПользователей.ТолькоПросмотр; + + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form index 44106586d..879b206ff 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form @@ -747,10 +747,9 @@ Left true - 37 true true - false + true true true true @@ -759,105 +758,20 @@ DontUse
      - - ГоризонтальнаяГруппа - 259 - - Пользователь - 171 - true - true - - true - - - Объект.Пользователь - - - ПользовательРасширеннаяПодсказка - 173 - Label - true - true - - Left - - - - ПользовательКонтекстноеМеню - 172 - true - - InputField - Enter - true - Left - true - - 37 - true - true - false - true - true - true - true - Normal - - - - Добавил - 256 - true - true - - true - - - Объект.Добавил - - - ДобавилРасширеннаяПодсказка - 258 - Label - true - true - - Left - - - - ДобавилКонтекстноеМеню - 257 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - + + Пользователи + 273 true true true - - <key>ru</key> - <value>Горизонтальная группа</value> - + + ПредставлениеПользователей + - ГоризонтальнаяГруппаРасширеннаяПодсказка - 260 + ПользователиРасширеннаяПодсказка + 275 Label true true @@ -865,14 +779,72 @@ Left - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - Auto + + ПользователиКонтекстноеМеню + 274 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПользователиНачалоВыбора + + + Opening + ПользователиОткрытие + + true + true + true + true + true + Normal + + + + Добавил + 256 + true + true + + true + + + Объект.Добавил + + + ДобавилРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + + ДобавилКонтекстноеМеню + 257 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal true @@ -904,6 +876,121 @@ Auto + + ДляЭлектроннойПодписиИРасшифровки + 221 + + Программа + 129 + true + true + + true + + + Объект.Программа + + + OnChange + ПрограммаПриИзменении + + + ПрограммаРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ПрограммаКонтекстноеМеню + 130 + true + + InputField + Enter + true + Left + true + + true + true + true + false + true + true + true + true + Normal + + + + УсиленнаяЗащитаЗакрытогоКлюча + 158 + true + true + + true + + + Объект.УсиленнаяЗащитаЗакрытогоКлюча + + Right + Button + + УсиленнаяЗащитаЗакрытогоКлючаРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + УсиленнаяЗащитаЗакрытогоКлючаКонтекстноеМеню + 159 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Настройки закрытого ключа (для создания электронных подписей или расшифровки данных)</value> + + + ДляЭлектроннойПодписиИРасшифровкиРасширеннаяПодсказка + 222 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + true true @@ -926,7 +1013,7 @@
      UsualGroup - HorizontalIfPossible + Vertical Auto true true @@ -934,120 +1021,6 @@ Auto - - ДляЭлектроннойПодписиИРасшифровки - 221 - - Программа - 129 - true - true - - true - - - Объект.Программа - - - OnChange - ПрограммаПриИзменении - - - ПрограммаРасширеннаяПодсказка - 131 - Label - true - true - - Left - - - - ПрограммаКонтекстноеМеню - 130 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - УсиленнаяЗащитаЗакрытогоКлюча - 158 - true - true - - true - - - Объект.УсиленнаяЗащитаЗакрытогоКлюча - - Right - Button - - УсиленнаяЗащитаЗакрытогоКлючаРасширеннаяПодсказка - 160 - Label - true - true - - Left - - - - УсиленнаяЗащитаЗакрытогоКлючаКонтекстноеМеню - 159 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Настройки закрытого ключа (для создания электронных подписей или расшифровки данных)</value> - - 60 - - ДляЭлектроннойПодписиИРасшифровкиРасширеннаяПодсказка - 222 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - auto - Auto - Auto - - ФормаКоманднаяПанель -1 @@ -1157,6 +1130,59 @@ UserCmds Auto + + ФормаСменитьПинКод + 269 + true + true + + true + + + ФормаСменитьПинКодРасширеннаяПодсказка + 270 + Label + true + true + + Left + + + Form.Command.СменитьПинКод + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСброситьПароль + 271 + true + true + + true + + + ФормаСброситьПарольРасширеннаяПодсказка + 272 + Label + true + true + + Left + + + Form.Command.СброситьПароль + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + true true @@ -1315,6 +1341,10 @@ Left + + NotificationProcessing + ОбработкаОповещения + OnOpen ПриОткрытии @@ -1505,6 +1535,35 @@ true + + СертификатОблачнойПодписи + 11 + + + true + + + true + + + + ПредставлениеПользователей + + <key>ru</key> + <value>Пользователи</value> + + 12 + + String + + + + true + + + true + + СертификатОтозван @@ -1657,6 +1716,50 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>СменитьПинКод</name> + <title> + <key>ru</key> + <value>Сменить пин-код</value> + + 8 + + ru + Сменить пин код + + + true + + + + СменитьПинКод + + + Auto + Auto + + + СброситьПароль + + <key>ru</key> + <value>Сбросить пароль в памяти</value> + + 9 + + ru + Сбросить пароль + + + true + + + + СброситьПароль + + + Auto + Auto + diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl index 328424edd..28e1c5083 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl @@ -14,6 +14,14 @@ ЭлектроннаяПодписьСлужебный.НастроитьПояснениеВводаПароля(ЭтотОбъект, Элементы.УсиленнаяЗащитаЗакрытогоКлюча.Имя); + СертификатОблачнойПодписи = ИнформацияОблачнойПодписи(Объект.Программа); + ЗаполнитьСписокПрограммСервер(); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") + И ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + Элементы.Программа.Заголовок = НСтр("ru = 'Программа или сервис'"); + КонецЕсли; + Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда Возврат; КонецЕсли; @@ -56,6 +64,8 @@ Возврат; КонецЕсли; + ОформитьСписокПользователей(); + КонецПроцедуры &НаСервере @@ -86,6 +96,16 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "Запись_ПрограммыЭлектроннойПодписиИШифрования" + ИЛИ ИмяСобытия = "Запись_УчетнойЗаписиDSS" Тогда + ЗаполнитьСписокПрограммСервер(); + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) @@ -129,6 +149,22 @@ КонецПроцедуры +&НаКлиенте +Процедура ПользователиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОткрытьСписокПользователей(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользователиОткрытие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОткрытьСписокПользователей(Истина); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -216,6 +252,28 @@ КонецПроцедуры +&НаКлиенте +Процедура СброситьПароль(Команда) + + ЭлектроннаяПодписьСлужебныйКлиент.СброситьПарольВПамяти(Объект.Ссылка); + +КонецПроцедуры + +&НаКлиенте +Процедура СменитьПинКод(Команда) + + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + ПредставлениеОтпечатка = МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Объект.Отпечаток); + ОписаниеСледующее = Новый ОписаниеОповещения("ПослеСменыПинКода", ЭтотОбъект); + МодульСервисКриптографииDSSКлиент.СменитьПинКодСертификата( + ОписаниеСледующее, + Объект.Программа, + Новый Структура("Отпечаток", ПредставлениеОтпечатка)); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -262,17 +320,20 @@ КонецЕсли; Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - Если Объект.Добавил <> Пользователи.ТекущийПользователь() - И Объект.Пользователь <> Пользователи.ТекущийПользователь() Тогда + ЭтоАвтор = Объект.Добавил = Пользователи.ТекущийПользователь(); + СертификатДоступен = СертификатДоступенПользователю(); + + Если НЕ ЭтоАвтор И НЕ СертификатДоступен Тогда // Обычный пользователь может изменять только свои сертификаты. ТолькоПросмотр = Истина; Иначе // Обычный пользователь не может изменить права доступа. Элементы.Добавил.ТолькоПросмотр = Истина; - Если Объект.Добавил <> Пользователи.ТекущийПользователь() Тогда + Если НЕ СертификатДоступен Тогда // Обычный пользователь не может изменять реквизит Пользователь, // если не он добавил сертификат. - Элементы.Пользователь.ТолькоПросмотр = Истина; + Элементы.Пользователи.ТолькоПросмотр = Истина; + Элементы.Пользователи.КнопкаОткрытия = Истина; КонецЕсли; КонецЕсли; КонецЕсли; @@ -361,8 +422,185 @@ Процедура ОбновитьВидимостьЭлементаУсиленнаяЗащитаЗакрытогоКлюча(Форма) Форма.Элементы.УсиленнаяЗащитаЗакрытогоКлюча.Видимость = - Форма.Объект.Программа <> Форма.ПрограммаОблачногоСервиса; + Форма.Объект.Программа <> Форма.ПрограммаОблачногоСервиса + И НЕ Форма.СертификатОблачнойПодписи.ОблачнаяПодпись; + + Форма.Элементы.ФормаСменитьПинКод.Видимость = Форма.СертификатОблачнойПодписи.ОблачнаяПодпись; КонецПроцедуры +&НаКлиенте +Процедура ОформитьСписокПользователей() + + КоличествоПользователей = Объект.Пользователи.Количество(); + Если КоличествоПользователей = 1 Тогда + ПредставлениеПользователей = СокрЛП(Объект.Пользователи[0].Пользователь); + ИначеЕсли КоличествоПользователей > 1 Тогда + ПредставлениеПользователей = НСтр("ru = 'Несколько пользователей'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()) + + " (" + Формат(КоличествоПользователей, "ЧГ=0") + ")"; + ИначеЕсли ЗначениеЗаполнено(Объект.Пользователь) Тогда + ПредставлениеПользователей = СокрЛП(Объект.Пользователь); + Иначе + ПредставлениеПользователей = НСтр("ru = 'Не указаны'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПользователейЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора <> Неопределено И ТипЗнч(РезультатВыбора) = Тип("Структура") Тогда + Объект.Пользователи.Очистить(); + Объект.Пользователь = РезультатВыбора.Пользователь; + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицуИзМассива(Объект.Пользователи, РезультатВыбора.Пользователи, "Пользователь"); + ОформитьСписокПользователей(); + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеСменыПинКода(РезультатВызова, ДополнительныеПараметры) Экспорт + + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + Если РезультатВызова.Выполнено Тогда + ПоказатьПредупреждение(Неопределено, + НСтр("ru = 'Смена пин-кода выполнена успешно.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), 30); + + ИначеЕсли НЕ МодульСервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(РезультатВызова.Ошибка) Тогда + МодульСервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, РезультатВызова.Ошибка); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСписокПользователей(РежимПросмотра) + + МассивПользователей = Новый Массив; + Для Каждого СтрокаТаблицы Из Объект.Пользователи Цикл + МассивПользователей.Добавить(СтрокаТаблицы.Пользователь); + КонецЦикла; + + ОповещениеЗавершения = Новый ОписаниеОповещения("СписокПользователейЗавершение", ЭтотОбъект); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", Объект.Пользователь); + ПараметрыФормы.Вставить("Пользователи", МассивПользователей); + ПараметрыФормы.Вставить("РежимПросмотра", РежимПросмотра ИЛИ ТолькоПросмотр); + + ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.СписокПользователей", + ПараметрыФормы, ЭтотОбъект, , , , ОповещениеЗавершения); + +КонецПроцедуры + +&НаСервере +Функция СертификатДоступенПользователю() + + ТекПользователь = Пользователи.ТекущийПользователь(); + НашлиСтроки = Объект.Пользователи.НайтиСтроки(Новый Структура("Пользователь", ТекПользователь)); + Результат = НашлиСтроки.Количество() > 0 ИЛИ Объект.Пользователь = ТекПользователь; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьСписокПрограммСервер() + + СписокВыбора = Элементы.Программа.СписокВыбора; + СписокВыбора.Очистить(); + ВесьСписок = ЗаполнитьСписокПрограмм(Объект.Программа); + + Для каждого СтрокаСписка Из ВесьСписок Цикл + НоваяСтрока = СписокВыбора.Добавить(СтрокаСписка.Значение); + НоваяСтрока.Картинка = СтрокаСписка.Картинка; + НоваяСтрока.Представление = СтрокаСписка.Представление; + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ИнформацияОблачнойПодписи(ТекущаяПрограмма) + + Результат = Новый Структура(); + Результат.Вставить("ОблачнаяПодпись", Ложь); + Результат.Вставить("МенятьПинКод", Ложь); + + Если ЗначениеЗаполнено(ТекущаяПрограмма) + И ТипЗнч(ТекущаяПрограмма) = ЭлектроннаяПодписьСлужебный.ПолучитьТипОблачнойПодписи() Тогда + МодульСервисКриптографииDSSСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебныйВызовСервера"); + ДанныеУчетнойЗаписи = МодульСервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(ТекущаяПрограмма); + Результат.ОблачнаяПодпись = Истина; + Результат.МенятьПинКод = ДанныеУчетнойЗаписи.Политика.РежимПинКода <> "Запрещено"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ЗаполнитьСписокПрограмм(Знач ВыбраннаяПрограмма) + + ДобавитьКартинку = ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() ИЛИ ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса(); + КартинкаКомпьютера = Новый Картинка; + КартинкаСервиса = Новый Картинка; + КартинкаОблака = Новый Картинка; + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + КартинкаКомпьютера = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("КомпьютерКлиент"); + КартинкаСервиса = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ПодписьСервиса"); + КартинкаОблака = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ПодписьОблако"); + КонецЕсли; + + Результат = Новый СписокЗначений; + + ТекстЗапроса = + "ВЫБРАТЬ + | ПрограммыЭлектроннойПодписиИШифрования.Ссылка КАК Ссылка, + | ПрограммыЭлектроннойПодписиИШифрования.ЭтоПрограммаОблачногоСервиса КАК ЭтоПрограммаОблачногоСервиса, + | ПрограммыЭлектроннойПодписиИШифрования.ТипПрограммы КАК ТипПрограммы, + | ЛОЖЬ КАК ОблачнаяПодпись + |ИЗ + | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыЭлектроннойПодписиИШифрования"; + + Запрос = Новый Запрос(ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + НоваяСтрока = Результат.Добавить(Выборка.Ссылка); + Если Выборка.ЭтоПрограммаОблачногоСервиса И ДобавитьКартинку Тогда + НоваяСтрока.Картинка = КартинкаСервиса; + ИначеЕсли ДобавитьКартинку Тогда + НоваяСтрока.Картинка = КартинкаКомпьютера; + КонецЕсли; + КонецЦикла; + + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + МассивУчетныхЗаписей = МодульСервисКриптографииDSSСлужебный.ПолучитьВсеУчетныеЗаписи(); + + Для каждого СтрокаМассива Из МассивУчетныхЗаписей Цикл + НоваяСтрока = Результат.Добавить(СтрокаМассива.Ссылка); + Если ДобавитьКартинку Тогда + НоваяСтрока.Картинка = КартинкаОблака; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Если Результат.НайтиПоЗначению(ВыбраннаяПрограмма) = Неопределено Тогда + ПредставлениеПрограммы = ?(ЗначениеЗаполнено(ВыбраннаяПрограмма), + СокрЛ(ВыбраннаяПрограмма), + НСтр("ru = 'Не выбрана'")); + Результат.Добавить(ВыбраннаяПрограмма, ПредставлениеПрограммы); + КонецЕсли; + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form index 8b67ae99d..c03eb6489 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form @@ -200,6 +200,38 @@ Auto + + ГруппаКонтейнер + 538 + true + true + + true + + + <key>ru</key> + <value>Контейнер</value> + + + ГруппаКонтейнерРасширеннаяПодсказка + 539 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + ГруппаСертификатыШифрования 489 @@ -219,6 +251,7 @@ СертификатыШифрования true + true None Change Copy @@ -305,6 +338,7 @@ true + true СертификатыШифрованияДобавитьРасширеннаяПодсказка 484 @@ -873,92 +907,187 @@ Auto + + ГруппаКомандыФормы + 526 + + ГруппаКомандыПодтверждения + 528 + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандыПодтвержденияРасширеннаяПодсказка + 529 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаОсновныеКоманды + 530 + + ФормаЗашифровать + 532 + true + true + + true + + + ФормаЗашифроватьРасширеннаяПодсказка + 533 + Label + true + true + + Left + + + Form.Command.Зашифровать + Auto + true + true + true + UserCmds + Auto + + + ФормаЗакрыть + 534 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + true + + ФормаЗакрытьРасширеннаяПодсказка + 535 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + + ФормаСправка + 536 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 537 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Основные команды</value> + + false + Right + + ГруппаОсновныеКомандыРасширеннаяПодсказка + 531 + Label + true + true + + Left + + + CommandBar + + Left + + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + + ГруппаКомандыФормыРасширеннаяПодсказка + 527 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + Bottom true ФормаКоманднаяПанель -1 - - ФормаЗашифровать - 307 - true - true - - true - - - ФормаЗашифроватьРасширеннаяПодсказка - 308 - Label - true - true - - Left - - - Form.Command.Зашифровать - Auto - true - true - true - UserCmds - Auto - - - ФормаЗакрыть - 303 - - <key>ru</key> - <value>Отмена</value> - - true - true - - true - - - ФормаЗакрытьРасширеннаяПодсказка - 304 - Label - true - true - - Left - - - Form.StandardCommand.Close - Normal - true - true - UserCmds - Auto - - - ФормаСправка - 448 - true - true - - true - - - ФормаСправкаРасширеннаяПодсказка - 449 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - Right @@ -1073,7 +1202,7 @@ СертификатПрограмма 9 - CatalogRef.ПрограммыЭлектроннойПодписиИШифрования + DefinedType.ПрограммаЭлектроннойПодписи true @@ -1335,7 +1464,7 @@ ПерваяПрограммаНаСервере 19 - CatalogRef.ПрограммыЭлектроннойПодписиИШифрования + DefinedType.ПрограммаЭлектроннойПодписи true diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl index 4bbd16844..7b1cc4b8a 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl @@ -38,6 +38,16 @@ ЗаполнитьПрограммуШифрованияНаСервере(); КонецЕсли; + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Шифрование", + "ПодборИзСправочника", + "ГруппаКонтейнер", + , + "ГруппаКомандыПодтверждения"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, ПолучитьОсновнойСертификат()); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -51,6 +61,11 @@ ТекущийЭлемент = Элементы[ИмяПоляАктивизироватьПоУмолчанию]; КонецЕсли; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриОткрытии(ЭтотОбъект, Отказ, Ложь, ОписаниеДанных); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -77,6 +92,24 @@ ПодключитьОбработчикОжидания("ПриИзмененииСпискаСертификатов", 0.1, Истина); КонецЕсли; + Если ВРег(ИмяСобытия) = ВРег("ПодтверждениеВыполнитьОсновнуюОперацию") И Источник = УникальныйИдентификатор Тогда + Если Параметр.Выполнено Тогда + СвойстваОблачнойПодписи = ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных); + ОповещениеПриПодтверждении = СвойстваОблачнойПодписи.ОповещениеПриПодтверждении; + Если ОповещениеПриПодтверждении = Неопределено Тогда + ЗашифроватьДанные(Новый ОписаниеОповещения("ЗашифроватьЗавершение", ЭтотОбъект)); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеПриПодтверждении, ЭтотОбъект); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ПодтверждениеПодготовитьДанные") И Источник = УникальныйИдентификатор Тогда + ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьДанныеДляОблачнойПодписи( + Параметр.ОбработчикСледующий, Параметр.КонтекстФормы, + Параметр.ОписаниеДанных, Параметр.Данные, Истина); + + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -105,13 +138,26 @@ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте); + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверитьНаОшибкуСертификата(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, ""); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура СертификатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ЭлектроннаяПодписьКлиент.СертификатНачалоВыбораСПодтверждением(Элемент, - Сертификат, СтандартнаяОбработка, Истина); + СтандартнаяОбработка = Ложь; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ВыбранныйСертификат", Сертификат); + ПараметрыФормы.Вставить("ДляШифрованияИРасшифровки", Истина); + ПараметрыФормы.Вставить("ВыполнятьНаСервере", ВыполнятьНаСервере); + + ЭлектроннаяПодписьСлужебныйКлиент.ВыборСертификатаДляПодписанияИлиРасшифровки(ПараметрыФормы, Элемент); КонецПроцедуры @@ -143,6 +189,13 @@ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте); + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверитьНаОшибкуСертификата(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элементы.Сертификат, ОписаниеДанных, ""); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -217,19 +270,21 @@ &НаКлиенте Процедура Зашифровать(Команда) - Если Не Элементы.ФормаЗашифровать.Доступность Тогда - Возврат; - КонецЕсли; - - Если Не УказанНеизменяемыйНаборСертификатов - И Не ПроверитьЗаполнение() Тогда + Если ЭлектроннаяПодписьСлужебныйКлиент.ЭтоОперацияОблачнойПодписи(ЭтотОбъект) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + Если МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверкаПередВыполнениемОперации(ЭтотОбъект, "") Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса(ЭтотОбъект, ОписаниеДанных, ""); + КонецЕсли; - Возврат; - КонецЕсли; + Иначе + Если Не Элементы.ФормаЗашифровать.Доступность Тогда + Возврат; + КонецЕсли; - Элементы.ФормаЗашифровать.Доступность = Ложь; - - ЗашифроватьДанные(Новый ОписаниеОповещения("ЗашифроватьЗавершение", ЭтотОбъект)); + Элементы.ФормаЗашифровать.Доступность = Ложь; + + ЗашифроватьДанные(Новый ОписаниеОповещения("ЗашифроватьЗавершение", ЭтотОбъект)); + КонецЕсли; КонецПроцедуры @@ -239,7 +294,7 @@ Элементы.ФормаЗашифровать.Доступность = Истина; - Если Результат = Истина Тогда + Если Результат = Истина И Открыта() Тогда Закрыть(Истина); КонецЕсли; @@ -536,7 +591,8 @@ // // Параметры: // Контекст - Структура: -// * ОписаниеПрограммы - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// * ОписаниеПрограммы - Структура: +// ** Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования // &НаКлиенте Процедура ЗаполнитьПрограммуШифрованияЦиклНачало(Контекст) @@ -566,8 +622,11 @@ // Продолжение процедуры ЗаполнитьПрограммуШифрования. // // Параметры: -// Контекст - Структура: -// * ОписаниеПрограммы - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// МенеджерКриптографии - МенеджерКриптографии +// - Неопределено +// Контекст - Структура: +// * ОписаниеПрограммы - Структура: +// ** Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования // &НаКлиенте Процедура ЗаполнитьПрограммуШифрованияПослеСозданияМенеджераКриптографии(МенеджерКриптографии, Контекст) Экспорт @@ -600,8 +659,11 @@ // Продолжение процедуры ЗаполнитьПрограммуШифрования. // // Параметры: -// Контекст - Структура: -// * ОписаниеПрограммы - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// ЗашифрованныеДанные - ДвоичныеДанные +// - Неопределено +// Контекст - Структура: +// * ОписаниеПрограммы - Структура: +// ** Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования // &НаКлиенте Процедура ЗаполнитьПрограммуШифрованияПослеШифрования(ЗашифрованныеДанные, Контекст) Экспорт @@ -674,14 +736,34 @@ &НаКлиенте Процедура ПродолжитьОткрытиеПослеЗаполненияПрограммы(Результат, Контекст) Экспорт + МодульСервисКриптографииDSSПодтверждениеКлиент = Неопределено; + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + КонецЕсли; + Если БезПодтверждения Тогда - ОбработкаПослеПредупреждения = Неопределено; - ЗашифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеШифрованияДанных", ЭтотОбъект, Контекст)); - Возврат; + Если МодульСервисКриптографииDSSПодтверждениеКлиент <> Неопределено Тогда + ТребуетПодтверждения = МодульСервисКриптографииDSSПодтверждениеКлиент.ОблачнаяПодписьТребуетПодтверждения(ЭтотОбъект); + Если НЕ ТребуетПодтверждения Тогда + ОбработкаПослеПредупреждения = Неопределено; + ЗашифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеШифрованияДанных", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; + Иначе + ОбработкаПослеПредупреждения = Неопределено; + ЗашифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеШифрованияДанных", ЭтотОбъект, Контекст)); + Возврат; + КонецЕсли; КонецЕсли; Открыть(); + Если МодульСервисКриптографииDSSПодтверждениеКлиент <> Неопределено Тогда + Если МодульСервисКриптографииDSSПодтверждениеКлиент.ПроверкаВыполненияНачальнойОперации(ЭтотОбъект, БезПодтверждения) Тогда + МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса(ЭтотОбъект, ОписаниеДанных, ""); + КонецЕсли; + КонецЕсли; + ПродолжитьОткрытиеЗавершение(Контекст); КонецПроцедуры @@ -746,9 +828,7 @@ &НаКлиенте Процедура ВыполнитьШифрованиеЗавершение(Результат, Контекст) Экспорт - Если Результат = Истина Тогда - ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина); - КонецЕсли; + ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Результат); КонецПроцедуры @@ -780,11 +860,23 @@ ЭлектроннаяПодписьСлужебный.СертификатПриИзмененииНаСервере(ЭтотОбъект, ОтпечаткиСертификатовНаКлиенте, Истина); + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер"); + МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, ПолучитьОсновнойСертификат()); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ЗашифроватьДанные(Оповещение) + Если ЭлектроннаяПодписьСлужебныйКлиент.ЭтоОперацияОблачнойПодписи(ЭтотОбъект) Тогда + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, + Новый Структура("УчетнаяЗапись", ЭтотОбъект.НастройкиПользователя)); + Иначе + ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, Новый Структура("УчетнаяЗапись")); + КонецЕсли; + Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура); @@ -831,7 +923,9 @@ ПараметрыВыполнения.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы); Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); - Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() Тогда + Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И ВыполнятьНаСервере <> Ложь Тогда + Если ЗначениеЗаполнено(СертификатНаСервереОписаниеОшибки) Тогда Результат = Новый Структура("Ошибка", СертификатНаСервереОписаниеОшибки); СертификатНаСервереОписаниеОшибки = Новый Структура; @@ -865,6 +959,10 @@ Иначе Если Результат <> Неопределено Тогда Контекст.ОшибкаНаСервере = Результат.Ошибка; + Если ВыполнятьНаСервере = Истина Тогда + ЗашифроватьДанныеПослеВыполненияНаСторонеКлиента(Новый Структура, Контекст); + Возврат; + КонецЕсли; КонецЕсли; // Попытка подписания на клиенте. @@ -1103,4 +1201,65 @@ КонецПроцедуры +&НаСервере +Функция ПолучитьОсновнойСертификат() + + Результат = Неопределено; + Если УказанНеизменяемыйНаборСертификатов Тогда + Если СертификатыШифрования.Количество() > 0 Тогда + Результат = СертификатыШифрования[0].Сертификат; + КонецЕсли; + Иначе + Результат = Сертификат; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработкаКоманды(Команда) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаКоманды(ЭтотОбъект, Команда, ОписаниеДанных, ""); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, ОписаниеДанных, ""); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработчикОжидания() + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеОбработкаОжидания(ЭтотОбъект, ОписаниеДанных, ""); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html index e722ff622..cc72f1b0c 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html @@ -1,7 +1,7 @@

      Предназначен для управления сертификатами ключей электронной подписи и шифрования.

      -

      Электронная подпись - реквизит любого электронного документа, с помощью которого можно удостовериться в неизменности электронного документа с момента его подписи. Для подписи необходимо иметь сертификат ключа электронной подписи. Сертификат ключа электронной подписи можно получить с помощью криптографических сервисов (провайдеров) или операционной системы.

      -

      Контроль неизменности электронного документа осуществляется в результате проверки соответствия электронной подписи документа и сертификата ключа электронной подписи. Если электронная подпись соответствует сертификату, то это является гарантией того, что документ не был изменен кем-либо с момента его подписания. Контроль неизменности электронного документа можно выполнить в любой момент времени.

      +

      Электронная подпись - реквизит любого электронного документа, с помощью которого можно удостовериться в неизменности электронного документа с момента его подписи. Для подписи необходимо иметь сертификат ключа электронной подписи. Сертификат ключа электронной подписи можно получить с помощью криптографических сервисов (провайдеров) или операционной системы.

      +Контроль неизменности электронного документа осуществляется в результате проверки соответствия электронной подписи документа и сертификата ключа электронной подписи. Если электронная подпись соответствует сертификату, то это является гарантией того, что документ не был изменен кем-либо с момента его подписания. Контроль неизменности электронного документа можно выполнить в любой момент времени.

      С помощью электронной подписи можно:

      • Подписывать объекты программы (например, поля Наименование и Краткое содержание);
      • diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ObjectModule.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ObjectModule.bsl index 71b2ce7a3..f22ff308c 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ObjectModule.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ObjectModule.bsl @@ -16,6 +16,26 @@ КонецПроцедуры +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) + + Если ДанныеЗаполнения = Неопределено Тогда + Программа = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка(); + КонецЕсли; + +КонецПроцедуры + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если Программа = Неопределено Тогда + Программа = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка(); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Иначе diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаXMLDSIG/Template.addin b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаXMLDSIG/Template.addin index 18595d0e9..487fa25ea 100644 Binary files a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаXMLDSIG/Template.addin and b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаXMLDSIG/Template.addin differ diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo index 061301aa1..dba800fd2 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo @@ -396,7 +396,7 @@ Программа - CatalogRef.ПрограммыЭлектроннойПодписиИШифрования + DefinedType.ПрограммаЭлектроннойПодписи ru @@ -564,6 +564,39 @@ Use Use + + + + + + Пользователи + + ru + Пользователи + + + Use + LineNumber + + Use + + + + + Пользователь + + ru + Пользователь + + + CatalogRef.Пользователи + + + + Use + Use + + ФормаЭлемента @@ -716,6 +749,15 @@ PersonalComputer MobileDevice + + СписокПользователей + + ru + Список пользователей + + PersonalComputer + MobileDevice + КомпонентаXMLDSIG diff --git a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl index 257b40ab0..fc57469a4 100644 --- a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl +++ b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl @@ -32,22 +32,22 @@ Элемент = Элементы.Добавить(); Элемент.ИмяПредопределенныхДанных = "ФормаНапечатана"; - Элемент.Наименование = НСтр("ru='Форма напечатана'",ОбщегоНазначения.КодОсновногоЯзыка()); - Элемент.Описание = НСтр("ru='Состояние, означающее, что печатная форма только печаталась.'") ; + Элемент.Наименование = НСтр("ru='Форма напечатана'", ОбщегоНазначения.КодОсновногоЯзыка()); + Элемент.Описание = НСтр("ru='Состояние, означающее, что печатная форма только печаталась.'", ОбщегоНазначения.КодОсновногоЯзыка()); Элемент.Код = "000000001"; Элемент.РеквизитДопУпорядочивания = "1"; Элемент = Элементы.Добавить(); Элемент.ИмяПредопределенныхДанных = "ОригиналыНеВсе"; - Элемент.Наименование = НСтр("ru='Оригиналы не все'",ОбщегоНазначения.КодОсновногоЯзыка()); - Элемент.Описание = НСтр("ru='Общее состояние для документа, у которого оригиналы печатных форм находятся в разных состояниях.'"); + Элемент.Наименование = НСтр("ru='Оригиналы не все'", ОбщегоНазначения.КодОсновногоЯзыка()); + Элемент.Описание = НСтр("ru='Общее состояние для документа, у которого оригиналы печатных форм находятся в разных состояниях.'", ОбщегоНазначения.КодОсновногоЯзыка()); Элемент.Код = "000000002"; Элемент.РеквизитДопУпорядочивания = "99998"; Элемент = Элементы.Добавить(); Элемент.ИмяПредопределенныхДанных = "ОригиналПолучен"; - Элемент.Наименование = НСтр("ru='Оригинал получен'",ОбщегоНазначения.КодОсновногоЯзыка()); - Элемент.Описание = НСтр("ru='Состояние, означающее, что подписанный оригинал печатной формы есть в наличии.'"); + Элемент.Наименование = НСтр("ru='Оригинал получен'", ОбщегоНазначения.КодОсновногоЯзыка()); + Элемент.Описание = НСтр("ru='Состояние, означающее, что подписанный оригинал печатной формы есть в наличии.'", ОбщегоНазначения.КодОсновногоЯзыка()); Элемент.Код = "000000003"; Элемент.РеквизитДопУпорядочивания = "99999"; diff --git a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl index 1766ad687..f74a160b2 100644 --- a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl +++ b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl @@ -74,7 +74,7 @@ // * НаименованиеПолное - Строка // * КодАльфа2 - Строка // * КодАльфа3 - Строка -// * Ссылка - СправочникаСсылка.СтраныМира +// * Ссылка - СправочникСсылка.СтраныМира // Неопределено - страна не существует. // Функция ДанныеСтраныМира(Знач КодСтраны = Неопределено, Знач Наименование = Неопределено) Экспорт @@ -245,9 +245,27 @@ ДанныеКлассификатора = УправлениеКонтактнойИнформацией.ДанныеКлассификатораСтранМираПоКоду(СтранаМираСсылка.Ссылка.Код); Если ДанныеКлассификатора <> Неопределено Тогда - СтранаМира = СтранаМираСсылка.Ссылка.ПолучитьОбъект(); - ЗаполнитьЗначенияСвойств(СтранаМира, ДанныеКлассификатора); - ОбновлениеИнформационнойБазы.ЗаписатьДанные(СтранаМира); + + Блокировка = Новый БлокировкаДанных(); + ЭлементБлокировки = Блокировка.Добавить("Справочник.СтраныМира"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", СтранаМираСсылка.Ссылка); + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + СтранаМира = СтранаМираСсылка.Ссылка.ПолучитьОбъект(); + ЗаполнитьЗначенияСвойств(СтранаМира, ДанныеКлассификатора); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(СтранаМира); + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + Иначе ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(СтранаМираСсылка.Ссылка); КонецЕсли; diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html index 1b25c95f5..f2e5a5904 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html @@ -1,5 +1,5 @@ -

        Основное назначение сценария - это выполнение синхронизации данных автоматически по заданному расписанию. Сценарий необходим для задания расписания и порядка отправки и получения данных.

        +

        Основное назначение сценария - это выполнение синхронизации данных автоматически по заданному расписанию. Сценарий необходим для задания расписания и порядка отправки и получения данных.

        Не рекомендуется выполнять только отправку данных или только получение данных, хотя сценарий позволяет это сделать. Рекомендуется выполнять полноценную синхронизацию данных в одном сценарии.

        Настройка сценария синхронизации

        • Введите Наименование сценария. Необходимо указать наименования баз данных, участвующих в синхронизации, редакцию программы, для того чтобы все пользователи могли понять назначение данного сценария. diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html b/SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html index 45e7b4a16..01aa1670c 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html @@ -14,7 +14,7 @@

          Настройка сценария синхронизации данных состоит из следующих этапов:

          • Настроить расписание выполнения сценария синхронизации данных.
          • Выбрать информационные базы, для которых будет выполняться сценарий синхронизации данных. -
          • Для каждой информационной базы выбрать способ подключения и выполняемое действие (отправка или получение).
        • После того как настроен сценарий синхронизации данных, около настройки синхронизации данных в списке появляется значок . Синхронизация данных производится по расписанию с помощью регламентного задания.

        Включение выгрузки и загрузки данных

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

      • С помощью выпадающего меню Включить/Отключить можно управлять выгрузкой и загрузкой данных.
      • diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl index 9eafb98ee..b788f73a2 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl @@ -205,7 +205,7 @@ КонецПроцедуры &НаКлиенте -Процедура УдалитьФайлНаКлиенте(ПутьКФайлу, ДополнительныеПараметры) Экспорт +Процедура УдалитьФайлНаКлиенте(ПутьКФайлу, ДополнительныеПараметры) Результат = УдалитьФайл(ПутьКФайлу); Если Результат.Успешно Тогда ОбработатьУдалениеОчередногоФайлаЗавершение(ДополнительныеПараметры); @@ -310,7 +310,7 @@ КонецПроцедуры &НаКлиенте -Процедура ОбработатьУдалениеОчередногоФайлаЗавершение(ДополнительныеПараметры) Экспорт +Процедура ОбработатьУдалениеОчередногоФайлаЗавершение(ДополнительныеПараметры) ОбработатьОчереднойФайлЗавершение(ДополнительныеПараметры); diff --git a/SSL/src/Catalogs/УчетныеЗаписиDSS/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиDSS/Help/ru.html new file mode 100644 index 000000000..33c0886b6 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиDSS/Help/ru.html @@ -0,0 +1,13 @@ + +

        Предназначен для управления подключением к +сервисам облачной подписи. Для подключения к сервису необходимо указать данные web-адресов +и параметров подключения к нему. Это информация указывается в отдельном +справочнике серверы облачной подписи. +

        + +

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

        + + + \ No newline at end of file diff --git a/SSL/src/Catalogs/УчетныеЗаписиDSS/ManagerModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиDSS/ManagerModule.bsl new file mode 100644 index 000000000..4c87e9a20 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиDSS/ManagerModule.bsl @@ -0,0 +1,142 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Возвращает реквизиты объекта, которые не рекомендуется редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив - список имен реквизитов объекта. +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + НеРедактируемыеРеквизиты = Новый Массив; + НеРедактируемыеРеквизиты.Добавить("Логин"); + + Возврат НеРедактируемыеРеквизиты; + +КонецФункции + +// СтандартныеПодсистемы.ВариантыОтчетов + +// Определяет список команд отчетов. +// +// Параметры: +// КомандыОтчетов - ТаблицаЗначений - таблица с командами отчетов. Для изменения. +// См. описание 1 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов(). +// Параметры - Структура - вспомогательные параметры. Для чтения. +// См. описание 2 параметра процедуры ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов(). +// +Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт + + Если ПравоДоступа("Просмотр", Метаданные.Отчеты.СостояниеУчетнойЗаписиDSS) Тогда + Команда = КомандыОтчетов.Добавить(); + Команда.Представление = НСтр("ru = 'Состояние учетной записи'"); + Команда.МножественныйВыбор = Ложь; + Команда.Обработчик = "СервисКриптографииDSSКлиент.ПоказатьОтчетСостояниеУчетнойЗаписи"; + Команда.ИмяПараметраФормы = "УчетнаяЗапись"; + Команда.РежимЗаписи = "ЗаписыватьТолькоНовые"; + Команда.Менеджер = "Отчет.СостояниеУчетнойЗаписиDSS"; + Команда.РежимЗаписи = "Запись"; + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ВариантыОтчетов + +// СтандартныеПодсистемы.УправлениеДоступом + +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// +Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт + + Ограничение.Текст = + "РазрешитьЧтениеИзменение + |ГДЕ + | ЭтоАвторизованныйПользователь(Автор)"; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.УправлениеДоступом + +#КонецОбласти + +#КонецОбласти + +#Область ОбработчикиСобытий + +Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) + + Если НЕ (ЭлектроннаяПодпись.ИспользоватьЭлектронныеПодписи() ИЛИ ЭлектроннаяПодпись.ИспользоватьШифрование()) Тогда + СтандартнаяОбработка = Ложь; + ВызватьИсключение НСтр("ru = 'Не включен режим использования электронной подписи'"); + + ИначеЕсли НЕ ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + СтандартнаяОбработка = Ложь; + ВызватьИсключение СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, "ПодсистемаОтключена"); + + ИначеЕсли ВидФормы = "ФормаОбъекта" Тогда + СтандартнаяОбработка = Ложь; + Если Параметры.Свойство("Ключ") Тогда + ВыбраннаяФорма = Метаданные.Обработки.УправлениеПодключениемDSS.Формы.ФормаУчетнойЗаписи; + Иначе + ВыбраннаяФорма = Метаданные.Обработки.УправлениеПодключениемDSS.Формы.ФормаУчетнойЗаписи; + КонецЕсли; + + ИначеЕсли ВидФормы = "ФормаВыбора" Тогда + СтандартнаяОбработка = Ложь; + ВыбраннаяФорма = Метаданные.Обработки.УправлениеПодключениемDSS.Формы.ВыборУчетнойЗаписи; + + ИначеЕсли ВидФормы = "ФормаСписка" Тогда + СтандартнаяОбработка = Ложь; + ВыбраннаяФорма = Метаданные.Обработки.УправлениеПодключениемDSS.Формы.СписокУчетныхЗаписей; + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьДанныеСсылки(СсылкаСправочника) Экспорт + + Результат = Новый Структура("Владелец, Логин"); + + Если НЕ СервисКриптографииDSSСлужебный.ПроверитьПраво("УчетныеЗаписиDSS") Тогда + Возврат Результат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | УчетныеЗаписиDSS.Владелец КАК Владелец, + | УчетныеЗаписиDSS.Логин КАК Логин, + | УчетныеЗаписиDSS.Ссылка КАК Ссылка + |ИЗ + | Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS + |ГДЕ + | УчетныеЗаписиDSS.Ссылка = &СсылкаСправочника"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("СсылкаСправочника", СсылкаСправочника); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + ЗаполнитьЗначенияСвойств(Результат, Выборка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецЕсли + diff --git a/SSL/src/Catalogs/УчетныеЗаписиDSS/ObjectModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиDSS/ObjectModule.bsl new file mode 100644 index 000000000..b713bc6cd --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиDSS/ObjectModule.bsl @@ -0,0 +1,107 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Возвращает реквизиты объекта, которые не рекомендуется редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив - список имен реквизитов объекта. +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + НеРедактируемыеРеквизиты = Новый Массив; + НеРедактируемыеРеквизиты.Добавить("Логин"); + НеРедактируемыеРеквизиты.Добавить("Автор"); + + Возврат НеРедактируемыеРеквизиты; + +КонецФункции + +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +#КонецОбласти + +#КонецОбласти + +#Область ОбработчикиСобытий + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Наименование = СокрЛП(Логин) + " на " + СокрЛП(Владелец); + + Если НЕ ЭтоНовый() И НЕ Отказ Тогда + ДанныеСсылки = Справочники.УчетныеЗаписиDSS.ПолучитьДанныеСсылки(Ссылка); + + Если ДанныеСсылки.Владелец <> Владелец + ИЛИ ДанныеСсылки.Логин <> Логин Тогда + СервисКриптографииDSSСлужебный.ОчиститьСписокСертификатов(Ссылка); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + +КонецПроцедуры + +Процедура ПриКопировании(ОбъектКопирования) + + Логин = ""; + ПервичнаяАутентификация = Неопределено; + СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено; + СодержаниеЗаявления = Неопределено; + +КонецПроцедуры + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + КлючиПроверки = СервисКриптографииDSSСлужебный.КлючиУникальностиСправочника("УчетныеЗаписиDSS"); + Если ЗначениеЗаполнено(КлючиПроверки) Тогда + ДанныеКлюча = Новый Структура(КлючиПроверки); + ЗаполнитьЗначенияСвойств(ДанныеКлюча, ЭтотОбъект); + НашлиДубль = СервисКриптографииDSSСлужебный.ПроверитьДублированиеЛогинов(Ссылка, ДанныеКлюча); + Если ЗначениеЗаполнено(НашлиДубль) Тогда + ТекстСообщения = НСтр("ru = 'Обнаружена дублирующая запись в справочнике Учетные записи DSS:'") + " " + Логин; + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "Логин", "Объект", Отказ); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) + + Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.ЭкземплярыСервераDSS") Тогда + Владелец = ДанныеЗаполнения; + КонецЕсли; + + Автор = Пользователи.ТекущийПользователь(); + +КонецПроцедуры + +#КонецОбласти + +#Иначе +ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/УчетныеЗаписиDSS/УчетныеЗаписиDSS.mdo b/SSL/src/Catalogs/УчетныеЗаписиDSS/УчетныеЗаписиDSS.mdo new file mode 100644 index 000000000..b23bdbb98 --- /dev/null +++ b/SSL/src/Catalogs/УчетныеЗаписиDSS/УчетныеЗаписиDSS.mdo @@ -0,0 +1,255 @@ + + + + + + + + + + УчетныеЗаписиDSS + + ru + Учетные записи DSS + + true + Catalog.УчетныеЗаписиDSS.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + + ru + Сервер + + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Учетная запись облачной подписи + + + ru + Учетные записи облачной подписи + + 2 + true + Catalog.ЭкземплярыСервераDSS + 100 + String + Variable + AsDescription + InDialog + BothWays + + Автор + + ru + Автор + + + CatalogRef.Пользователи + + + + + Use + Use + + + ВторичнаяАвторизация + + ru + Вторичная авторизация + + + EnumRef.СпособыАвторизацииDSS + + + + + Use + Use + + + ДополнительнаяИнформация + + ru + Дополнительная информация + + + String + + + + + + Use + Use + + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + Логин + + ru + Логин + + + String + + 50 + + + + + ShowError + + Use + Use + + + ПервичнаяАутентификация + + ru + Первичная аутентификация + + + EnumRef.СпособыАвторизацииDSS + + + + ShowError + + Use + Use + + + СодержаниеЗаявления + + ru + Содержание заявления + + + ValueStorage + + + ru + Содержит заявление, как оно была оформлено в момент создания закрытого ключа. + + + + + Use + Use + + + СостояниеЗаявления + + ru + Состояние заявления + + + EnumRef.СостоянияЗаявленияУчетнойЗаписиDSS + + + + + Use + Use + + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl index 6bbaf86fc..2b6739940 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl @@ -613,7 +613,8 @@ Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда ПараметрыПриложения.Вставить(ИмяПараметра, Новый Массив); КонецЕсли; - ПараметрыПриложения[ИмяПараметра].Добавить(ОписаниеОповещения); + ОбработчикОжиданияПередЗаписьюВФорме = ПараметрыПриложения[ИмяПараметра]; // Массив + ОбработчикОжиданияПередЗаписьюВФорме.Добавить(ОписаниеОповещения); ПодключитьОбработчикОжидания("ВыполнитьПроверкуПередЗаписьюВФорме", 0.1, Истина); Возврат; diff --git a/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl index dacbf7b39..fefb7d636 100644 --- a/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl @@ -690,11 +690,6 @@ Возврат; КонецЕсли; - Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов возможна только в Windows.'")); - Возврат; - КонецЕсли; - ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; Если ВыделенныеСтроки.Количество() > 0 Тогда РаботаСФайламиКлиент.НапечататьФайлы(ВыделенныеСтроки, ЭтотОбъект.УникальныйИдентификатор); diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl index 733d430e0..dc7cf1c49 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl @@ -834,13 +834,7 @@ &НаКлиенте Процедура Печать(Команда) - Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов возможна только в Windows.'")); - Возврат; - КонецЕсли; - - Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) - Или Записать() Тогда + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Ссылка) Или Записать() Тогда Файлы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЭтотОбъект.Объект.Ссылка); РаботаСФайламиКлиент.НапечататьФайлы(Файлы, ЭтотОбъект.УникальныйИдентификатор); КонецЕсли; @@ -1273,10 +1267,8 @@ Модифицированность = Ложь; ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - - Оповестить("Запись_Файл", - Новый Структура("ЭтоНовый", ФайлБылСоздан), - ЭтотОбъект.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.ВладелецФайла); + Оповестить("Запись_Файл", Новый Структура("ЭтоНовый", ФайлБылСоздан), ЭтотОбъект.Объект.Ссылка); УстановитьДоступностьКомандСпискаЭП(); УстановитьДоступностьКомандСпискаШифрования(); diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl index f19f6f490..bafc15f8b 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl @@ -766,8 +766,7 @@ // Очищает ответы и заполняет их вариантами ответов. // // Параметры: -// ЭлементарныйВопрос - ПланВидовХарактеристик.ВопросыДляАнкетирования - вопрос для которого будут заполнены его -// варианты ответов. +// ЭлементарныйВопрос - ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования. // &НаСервере Процедура ОчиститьЗаполнитьВариантыОтветов(ЭлементарныйВопрос) @@ -776,7 +775,7 @@ Возврат; КонецЕсли; - НайденныеСтроки = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ЭлементарныйВопрос)); + НайденныеСтроки = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос", ЭлементарныйВопрос)); Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл Ответы.Удалить(Ответы.Индекс(НайденнаяСтрока)); КонецЦикла; diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl index ae2aebc02..71a3a3bed 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl @@ -333,15 +333,15 @@ Отказ = Истина; - СписокВыбора = Новый СписокЗначений; - СписокВыбора.Добавить(НСтр("ru = 'Раздел'")); - СписокВыбора.Добавить(НСтр("ru = 'Простой вопрос'")); - СписокВыбора.Добавить(НСтр("ru = 'Комплексный вопрос'")); - СписокВыбора.Добавить(НСтр("ru = 'Условный вопрос'")); - СписокВыбора.Добавить(НСтр("ru = 'Табличный вопрос'")); + СписокВыбора = Новый СписокЗначений; + СписокВыбора.Добавить("Раздел", НСтр("ru = 'Раздел'")); + СписокВыбора.Добавить("Простой", НСтр("ru = 'Простой вопрос'")); + СписокВыбора.Добавить("Комплексный", НСтр("ru = 'Комплексный вопрос'")); + СписокВыбора.Добавить("Условный", НСтр("ru = 'Условный вопрос'")); + СписокВыбора.Добавить("Табличный", НСтр("ru = 'Табличный вопрос'")); ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВыборТипаДобавляемогоЭлементаПриЗавершении", ЭтотОбъект); - СписокВыбора.ПоказатьВыборЭлемента(ОбработчикОповещенияОЗакрытии, НСтр("ru = 'Выберите тип добавляемого элемента.'"),СписокВыбора[0]); + СписокВыбора.ПоказатьВыборЭлемента(ОбработчикОповещенияОЗакрытии, НСтр("ru = 'Выберите тип добавляемого элемента.'"), СписокВыбора[0]); КонецПроцедуры @@ -579,10 +579,13 @@ КонецПроцедуры // Добавляет новую строку в дерево формы. -// Родитель - СтрокаДереваАнкеты - элемент дерева значений формы, от которого отращивается новая ветка. -// ТипСтроки - Строка - Тип строки дерева. +// +// Параметры: +// Родитель - СтрокаДереваЗначений - элемент дерева значений формы, от которого отращивается новая ветка. +// ТипСтроки - Строка - тип строки дерева. +// // Возвращаемое значение: -// Строка - новая строка дерева. +// Строка // &НаКлиенте Функция ДобавитьСтрокуДеревоАнкеты(Родитель,ТипСтроки,ТипВопроса = Неопределено) @@ -846,18 +849,18 @@ // Добавляет вопрос в шаблон анкеты. // // Параметры: -// ТекущиеДанные - ДанныеФормыЭлементДерева - данные текущей строки дерева. -// ТипВопроса - Перечисления.ТипыВопросовШаблонаАнкет - тип добавляемого вопроса. +// ТекущиеДанные - ДанныеФормыЭлементДерева. +// ТипВопроса - ПеречислениеСсылка.ТипыВопросовШаблонаАнкеты. // &НаКлиенте -Процедура ДобавитьВопрос(ТекущиеДанные,ТипВопроса) +Процедура ДобавитьВопрос(ТекущиеДанные, ТипВопроса) - Родитель = ПолучитьРодителяДеревоАнкеты(ТекущиеДанные,Ложь,ТипВопроса); + Родитель = ПолучитьРодителяДеревоАнкеты(ТекущиеДанные, Ложь, ТипВопроса); Если Родитель.ТипСтроки = "Корень" Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Вопросы нельзя добавлять в корень анкеты.'"),15,НСтр("ru = 'Ошибка добавления'")); + ПоказатьПредупреждение(, НСтр("ru = 'Вопросы нельзя добавлять в корень анкеты.'")); Возврат; КонецЕсли; - ДобавитьСтрокуДеревоАнкеты(Родитель,"Вопрос",ТипВопроса); + ДобавитьСтрокуДеревоАнкеты(Родитель, "Вопрос", ТипВопроса); КонецПроцедуры @@ -995,23 +998,23 @@ Если НЕ ВыбранныйЭлемент = Неопределено Тогда - Если ВыбранныйЭлемент.Значение = НСтр("ru = 'Раздел'") Тогда + Если ВыбранныйЭлемент.Значение = "Раздел" Тогда ДобавитьРаздел(Команды.ДобавитьРаздел); - ИначеЕсли ВыбранныйЭлемент.Значение = НСтр("ru = 'Простой вопрос'") Тогда + ИначеЕсли ВыбранныйЭлемент.Значение = "Простой" Тогда ДобавитьПростойВопрос(Команды.ДобавитьПростойВопрос) - ИначеЕсли ВыбранныйЭлемент.Значение = НСтр("ru = 'Комплексный вопрос'") Тогда + ИначеЕсли ВыбранныйЭлемент.Значение = "Комплексный" Тогда ДобавитьКомплексныйВопрос(Команды.ДобавитьПростойВопрос) - ИначеЕсли ВыбранныйЭлемент.Значение = НСтр("ru = 'Условный вопрос'") Тогда + ИначеЕсли ВыбранныйЭлемент.Значение = "Условный" Тогда ДобавитьВопросСУсловием(Команды.ДобавитьВопросСУсловием) - ИначеЕсли ВыбранныйЭлемент.Значение = НСтр("ru = 'Табличный вопрос'") Тогда + ИначеЕсли ВыбранныйЭлемент.Значение = "Табличный" Тогда ДобавитьТабличныйВопрос(Команды.ДобавитьТабличныйВопрос); diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl index 6ae0e39c6..9f44afa36 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/СформироватьСообщение/Module.bsl @@ -82,8 +82,10 @@ Процедура ПриОткрытии(Отказ) Если ПоказыватьФормуВыбораШаблонов Тогда - УстановитьВыборФормата(); - СформироватьПредставлениеВыбранныхФорматов(); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + УстановитьВыборФормата(); + СформироватьПредставлениеВыбранныхФорматов(); + КонецЕсли; Иначе ПараметрыОтправки = КонструкторПараметровОтправки(); ПараметрыОтправки.ДополнительныеПараметры.ПреобразовыватьHTMLДляФорматированногоДокумента = Ложь; @@ -116,7 +118,7 @@ Если Элемент.ТекущиеДанные <> Неопределено Тогда ШаблонВыбран = Элемент.ТекущиеДанные.Имя <> "<БезШаблона>"; Элементы.ФормаСформироватьИОтправить.Доступность = ШаблонВыбран; - Если ШаблонВыбран Тогда + Если ШаблонВыбран Или Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда Если Элемент.ТекущиеДанные.ТипТекстаПисьма = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML") Тогда Элементы.СтраницыПредпросмотра.ТекущаяСтраница = Элементы.СтраницаФорматированныйДокумент; ПодключитьОбработчикОжидания("ОбновитьДанныеПредпросмотра", 0.2, Истина); diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl index 1374a2bae..a897cb42d 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl @@ -36,8 +36,7 @@ Элементы.ФормаСоздатьШаблонСообщенияSMS.Видимость = Ложь; Элементы.ФормаСоздатьШаблонЭлектронногоПисьма.Заголовок = НСтр("ru='Создать'"); ШаблонДля = ШаблоныСообщенийКлиентСервер.ИмяШаблонаЭлектронныхПисем(); - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, - "ШаблонДля", НСтр("ru = 'Электронного письма'"), ВидСравненияКомпоновкиДанных.Равно); + УстановитьОтборВСпискеШаблонов(Список, ШаблонДля); КонецЕсли; @@ -49,8 +48,7 @@ Элементы.ФормаСоздатьШаблонЭлектронногоПисьма.Видимость = Ложь; Элементы.ФормаСоздатьШаблонСообщенияSMS.Заголовок = НСтр("ru='Создать'"); ШаблонДля = ШаблоныСообщенийКлиентСервер.ИмяШаблонаSMS(); - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, - "ШаблонДля", НСтр("ru = 'Сообщения SMS'"), ВидСравненияКомпоновкиДанных.Равно); + УстановитьОтборВСпискеШаблонов(Список, ШаблонДля); КонецЕсли; @@ -76,7 +74,7 @@ &НаКлиенте Процедура ШаблонДляФильтрОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - УстановитьОтборВСпискеШаблонов(ВыбранноеЗначение); + УстановитьОтборВСпискеШаблонов(Список, ВыбранноеЗначение); КонецПроцедуры @@ -160,15 +158,18 @@ ОткрытьФорму("Справочник.ШаблоныСообщений.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры -&НаКлиенте -Процедура УстановитьОтборВСпискеШаблонов(Знач ВыбранноеЗначение) +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьОтборВСпискеШаблонов(Список, Знач ЗначениеОтбора) - Если ВыбранноеЗначение = ШаблоныСообщенийКлиентСервер.ИмяШаблонаSMS() Тогда - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ШаблонДля", НСтр("ru = 'Сообщения SMS'"), ВидСравненияКомпоновкиДанных.Равно); - ИначеЕсли ВыбранноеЗначение = ШаблоныСообщенийКлиентСервер.ИмяШаблонаЭлектронныхПисем() Тогда - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ШаблонДля", НСтр("ru = 'Электронного письма'"), ВидСравненияКомпоновкиДанных.Равно); + Если ЗначениеОтбора = ШаблоныСообщенийКлиентСервер.ИмяШаблонаSMS() Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ПредназначенДляSMS", Истина, ВидСравненияКомпоновкиДанных.Равно); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ПредназначенДляЭлектронныхПисем", Ложь, ВидСравненияКомпоновкиДанных.Равно); + ИначеЕсли ЗначениеОтбора = ШаблоныСообщенийКлиентСервер.ИмяШаблонаЭлектронныхПисем() Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ПредназначенДляSMS", Ложь, ВидСравненияКомпоновкиДанных.Равно); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ПредназначенДляЭлектронныхПисем", Истина, ВидСравненияКомпоновкиДанных.Равно); Иначе - ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "ШаблонДля"); + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "ПредназначенДляSMS"); + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "ПредназначенДляЭлектронныхПисем"); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl index 78355b4b8..979d4e2f8 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl @@ -1662,7 +1662,8 @@ // // Параметры: // Ссылка - ДокументСсылка - ссылка на владельца присоединенных файлов. -// ТипТекстаПисьма - Перечисление.СпособыРедактированияЭлектронныхПисем - для определения необходимости выполнения преобразований. +// ТипТекстаПисьма - ПеречислениеСсылка.СпособыРедактированияЭлектронныхПисем - для определения необходимости +// выполнения преобразований. // ТаблицаСоответствийИменВложенийИдентификаторам - ТаблицаЗначений - позволяет определить какому вложению // соответствует какая картинка. // УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы из которого выполняется сохранение. diff --git a/SSL/src/Catalogs/ЭкземплярыСервераDSS/Help/ru.html b/SSL/src/Catalogs/ЭкземплярыСервераDSS/Help/ru.html new file mode 100644 index 000000000..687e4041b --- /dev/null +++ b/SSL/src/Catalogs/ЭкземплярыСервераDSS/Help/ru.html @@ -0,0 +1,21 @@ + +

        Предназначен для хранения настроек подключения +к сервисам облачной подписи (КриптоПро DSS)

        + +

         Сервис +облачной подписи – это сервис на базе КриптоПро DSS предоставляемый +провайдером. Данный сервис позволяет хранить сертификаты и закрытые ключи к ним +в «Облаке». С помощью «облачных» сертификатов пользователь может задействовать функции +подписания, шифрования, расшифровки данных практически с любого компьютера. Для +использования этого функционала не требуется установки криптопровайдеров и +сертификатов на локальный компьютер, достаточно предоставить данные для +авторизации на настроенном сервисе.

        + +

         К каждому серверу облачной подписи +привязываются реестр учетных записей этого сервиса, указываемые в справочнике +«Учетные записи облачной подписи»

        + +

         

        + + + \ No newline at end of file diff --git a/SSL/src/Catalogs/ЭкземплярыСервераDSS/ManagerModule.bsl b/SSL/src/Catalogs/ЭкземплярыСервераDSS/ManagerModule.bsl new file mode 100644 index 000000000..0b7b14b22 --- /dev/null +++ b/SSL/src/Catalogs/ЭкземплярыСервераDSS/ManagerModule.bsl @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// Возвращает реквизиты объекта, которые разрешается редактировать +// с помощью обработки группового изменения реквизитов. +// +// Возвращаемое значение: +// Массив - список имен реквизитов объекта. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов + +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +// Возвращает реквизиты справочника, которые образуют естественный ключ для элементов справочника. +// +// Возвращаемое значение: +// Массив из Строка - массив имен реквизитов, образующих естественный ключ. +// +Функция ПоляЕстественногоКлюча() Экспорт + + Результат = Новый Массив; + Результат.Добавить("АдресСервера"); + Результат.Добавить("ИдентификаторЦИ"); + + Возврат Результат; + +КонецФункции + +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + +#КонецОбласти + +#КонецОбласти + +#Область ОбработчикиСобытий + +Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) + + Если НЕ (ЭлектроннаяПодпись.ИспользоватьЭлектронныеПодписи() ИЛИ ЭлектроннаяПодпись.ИспользоватьШифрование()) Тогда + СтандартнаяОбработка = Ложь; + ВызватьИсключение НСтр("ru = 'Не включен режим использования электронной подписи'"); + + ИначеЕсли НЕ ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + СтандартнаяОбработка = Ложь; + ВызватьИсключение СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, "ПодсистемаОтключена"); + + ИначеЕсли ВидФормы = "ФормаОбъекта" Тогда + СтандартнаяОбработка = Ложь; + ВыбраннаяФорма = Метаданные.Обработки.УправлениеПодключениемDSS.Формы.ФормаЭкземпляраСервераDSS; + + ИначеЕсли ВидФормы = "ФормаВыбора" Тогда + СтандартнаяОбработка = Ложь; + ВыбраннаяФорма = Метаданные.Обработки.УправлениеПодключениемDSS.Формы.ВыборЭкземпляровСервераDSS; + + ИначеЕсли ВидФормы = "ФормаСписка" Тогда + СтандартнаяОбработка = Ложь; + ВыбраннаяФорма = Метаданные.Обработки.УправлениеПодключениемDSS.Формы.СписокЭкземпляровСервераDSS; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли + diff --git a/SSL/src/Catalogs/ЭкземплярыСервераDSS/ObjectModule.bsl b/SSL/src/Catalogs/ЭкземплярыСервераDSS/ObjectModule.bsl new file mode 100644 index 000000000..4bb49ef71 --- /dev/null +++ b/SSL/src/Catalogs/ЭкземплярыСервераDSS/ObjectModule.bsl @@ -0,0 +1,77 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ОбработчикиСобытий + +Процедура ПриКопировании(ОбъектКопирования) + + ВнутреннийИдентификатор = ""; + ИдентификаторЦИ = ""; + Используется = Истина; + +КонецПроцедуры + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(ВнутреннийИдентификатор) + И НЕ ДополнительныеСвойства.Свойство("ПоставляемыеДанные") Тогда + ТекстСообщения = НСтр("ru = 'Поставляемые серверы облачной подписи предназначены для программного изменения.'"); + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "АдресСервера", "Объект", Отказ); + Отказ = Истина; + КонецЕсли; + + Если ПустаяСтрока(Наименование) Тогда + Наименование = СокрЛП(АдресСервера); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + КлючиПроверки = СервисКриптографииDSSСлужебный.КлючиУникальностиСправочника("ЭкземплярыСервераDSS"); + Если ЗначениеЗаполнено(КлючиПроверки) + И НЕ ДополнительныеСвойства.Свойство("ПоставляемыеДанные") Тогда + ДанныеКлюча = Новый Структура(КлючиПроверки); + ЗаполнитьЗначенияСвойств(ДанныеКлюча, ЭтотОбъект); + ЕстьПовтор = СервисКриптографииDSSСлужебный.ПроверитьДублированиеСерверов(Ссылка, ДанныеКлюча); + Если ЗначениеЗаполнено(ЕстьПовтор) Тогда + ТекстСообщения = НСтр("ru = 'Обнаружена дублирующая запись в справочнике Экземпляры сервера DSS:'") + " " + АдресСервера; + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "АдресСервера", "Объект"); + КонецЕсли; + КонецЕсли; + + ИдВерсии = СервисКриптографииDSSКлиентСервер.ИдентификаторВерсииСервера(ВерсияАПИ); + + Если ИдВерсии > 1 Тогда + ПроверяемыеРеквизиты.Добавить("СервисАудита"); + ПроверяемыеРеквизиты.Добавить("СервисОбработкиДокументов"); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) + + ВсеВерсии = СервисКриптографииDSSКлиентСервер.ПоддерживаемыеВерсии(); + + ТаймАут = 120; + ВерсияАПИ = ВсеВерсии[0]; + Используется = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Иначе +ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ЭкземплярыСервераDSS/ЭкземплярыСервераDSS.mdo b/SSL/src/Catalogs/ЭкземплярыСервераDSS/ЭкземплярыСервераDSS.mdo new file mode 100644 index 000000000..b898e7173 --- /dev/null +++ b/SSL/src/Catalogs/ЭкземплярыСервераDSS/ЭкземплярыСервераDSS.mdo @@ -0,0 +1,429 @@ + + + + + + + + + + ЭкземплярыСервераDSS + + ru + Экземпляры сервера DSS + + true + Catalog.ЭкземплярыСервераDSS.StandardAttribute.Description + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + Use + + + + Use + true + + + ru + + + Managed + Use + + ru + Сервер облачной подписи + + + ru + Серверы облачной подписи + + 2 + true + 100 + String + Variable + AsDescription + InDialog + BothWays + + АдресСервера + + ru + Адрес сервера + + + String + + 200 + + + + + ShowError + + Use + Use + + + ТаймАут + + ru + Тайм-аут (сек.) + + + Number + + 4 + true + + + + + + 0 + + Use + Use + + + ШаблонПодтверждения + + ru + Шаблон подтверждения + + + String + + 30 + + + + + + Use + Use + + + ИдентификаторЦИ + + ru + Идентификатор ЦИ (центр идентификации) + + + String + + 50 + + + + + ShowError + + Use + Use + + + ИдентификаторСЭП + + ru + Идентификатор СЭП + + + String + + 100 + + + + + ShowError + + Use + Use + + + СервисАудита + + ru + Сервис аудита + + + String + + 250 + + + + + + Use + Use + + + СервисИдентификации + + ru + Сервис идентификации + + + String + + 250 + + + + + ShowError + + Use + Use + + + СервисОбработкиДокументов + + ru + Сервис обработки документов + + + String + + 250 + + + + + + Use + Use + + + СервисПодписи + + ru + Сервис подписи + + + String + + 250 + + + + + ShowError + + Use + Use + + + СервисПроверки + + ru + Сервис проверки + + + String + + 200 + + + + + + Use + Use + + + ВерсияАПИ + + ru + Версия + + + String + + 10 + + + + + ShowError + + Use + Use + + + Комментарий + + ru + Комментарий + + + String + + + + + + Use + Use + + + Используется + + ru + Используется + + + Boolean + + + + + true + + Use + Use + + + АдресЛичногоКабинета + + ru + Адрес личного кабинета + + + String + + 250 + + + + + + Use + Use + + + ВнутреннийИдентификатор + + ru + Внутренний идентификатор + + Данное поле заполняется программно, элементы с заполненным полем блокируются от изменения. + + String + + 40 + + + + + + Use + Use + + + + + + + ОграничениеАвторизации + + ru + Ограничение авторизации + + + Use + LineNumber + + Use + + + + + СпособАвторизации + + ru + Способ авторизации + + + EnumRef.СпособыАвторизацииDSS + + + + Use + Use + + + diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form index fcd92b58a..afe6fc46a 100644 --- a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form @@ -440,28 +440,6 @@ Auto - - Группа1 - 24 - true - true - - true - - - Группа1РасширеннаяПодсказка - 25 - Label - true - true - - Left - - - - Form - - Left diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl index c05c77935..8e4fe6396 100644 --- a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl @@ -24,7 +24,7 @@ Если Не ЗначениеЗаполнено(Справочники.ЯзыкиПечатныхФорм.НайтиПоКоду(КодЯзыка)) Тогда Язык = Справочники.ЯзыкиПечатныхФорм.СоздатьЭлемент(); Язык.Код = КодЯзыка; - Язык.Записать(); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Язык); КонецЕсли; ЗафиксироватьТранзакцию(); diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo index bc5722789..c7a45b76a 100644 --- a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo @@ -12,6 +12,7 @@ ru Языки печатных форм + АПК:1206 true Catalog.ЯзыкиПечатныхФорм.StandardAttribute.Code DontUse @@ -124,6 +125,7 @@ ru Порядок + АПК:58 Number diff --git a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo index dd837a526..61be3bfaf 100644 --- a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo +++ b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo @@ -626,6 +626,10 @@ ScheduledJob.СинхронизацияДанных DontUse + + Constant.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных + DontUse + Constant.ДополнительныйЯзык1 DontUse diff --git a/SSL/src/CommonCommands/НастройкиПодключения/CommandModule.bsl b/SSL/src/CommonCommands/НастройкиПодключения/CommandModule.bsl index 7adfd7866..45448a4ac 100644 --- a/SSL/src/CommonCommands/НастройкиПодключения/CommandModule.bsl +++ b/SSL/src/CommonCommands/НастройкиПодключения/CommandModule.bsl @@ -40,9 +40,30 @@ Отбор = Новый Структура("Корреспондент", Корреспондент); ЗначенияЗаполнения = Новый Структура("Корреспондент", Корреспондент); + + РезультатПроверки = ЭтоОбменВРежимеСервисаЧерезWS(Корреспондент); + Если РезультатПроверки.РазделениеВключено Тогда + + Если РезультатПроверки.ВидТранспортаПоУмолчанию = ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.WS") + Или РезультатПроверки.ВидТранспортаПоУмолчанию = ПредопределенноеЗначение("Перечисление.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим") Тогда + + РазрешенныеНастройкиТранспорта = Новый Массив; + РазрешенныеНастройкиТранспорта.Добавить(РезультатПроверки.ВидТранспортаПоУмолчанию); + + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("РазрешенныеНастройкиТранспорта", РазрешенныеНастройкиТранспорта); + + Иначе + + ТекстИсключения = НСтр("ru ='Настройка транспорта сообщений в режиме сервиса актуальна только для синхронизаций использующих ВЕБ-сервисы'"); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + КонецЕсли; ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, - ЗначенияЗаполнения, "НастройкиТранспортаОбменаДанными", ПараметрыВыполненияКоманды.Источник); + ЗначенияЗаполнения, "НастройкиТранспортаОбменаДанными", ПараметрыВыполненияКоманды.Источник, , ПараметрыОткрытияФормы); КонецПроцедуры @@ -57,4 +78,14 @@ КонецФункции +&НаСервере +Функция ЭтоОбменВРежимеСервисаЧерезWS(Корреспондент) + + РезультатПроверки = Новый Структура; + РезультатПроверки.Вставить("РазделениеВключено", ОбщегоНазначения.РазделениеВключено()); + РезультатПроверки.Вставить("ВидТранспортаПоУмолчанию", РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(Корреспондент)); + + Возврат РезультатПроверки; + +КонецФункции #КонецОбласти diff --git a/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl b/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl index 8370b0daa..79c624477 100644 --- a/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl +++ b/SSL/src/CommonCommands/НастройкиСинхронизацииДанных/CommandModule.bsl @@ -11,7 +11,10 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму("ОбщаяФорма.СинхронизацияДанных"); + ОткрытьФорму("ОбщаяФорма.НастройкиСинхронизацииДанных",, + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); КонецПроцедуры diff --git a/SSL/src/CommonCommands/СинхронизацияДанныхВМоделиСервиса/CommandModule.bsl b/SSL/src/CommonCommands/НастройкиСинхронизацииДанныхВМоделиСервиса/CommandModule.bsl similarity index 91% rename from SSL/src/CommonCommands/СинхронизацияДанныхВМоделиСервиса/CommandModule.bsl rename to SSL/src/CommonCommands/НастройкиСинхронизацииДанныхВМоделиСервиса/CommandModule.bsl index 4dc008e41..79c624477 100644 --- a/SSL/src/CommonCommands/СинхронизацияДанныхВМоделиСервиса/CommandModule.bsl +++ b/SSL/src/CommonCommands/НастройкиСинхронизацииДанныхВМоделиСервиса/CommandModule.bsl @@ -11,7 +11,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму("ОбщаяФорма.СинхронизацияДанных",, + ОткрытьФорму("ОбщаяФорма.НастройкиСинхронизацииДанных",, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); diff --git a/SSL/src/CommonCommands/СинхронизацияДанныхВМоделиСервиса/СинхронизацияДанныхВМоделиСервиса.mdo b/SSL/src/CommonCommands/НастройкиСинхронизацииДанныхВМоделиСервиса/НастройкиСинхронизацииДанныхВМоделиСервиса.mdo similarity index 71% rename from SSL/src/CommonCommands/СинхронизацияДанныхВМоделиСервиса/СинхронизацияДанныхВМоделиСервиса.mdo rename to SSL/src/CommonCommands/НастройкиСинхронизацииДанныхВМоделиСервиса/НастройкиСинхронизацииДанныхВМоделиСервиса.mdo index fe53e3797..297e98055 100644 --- a/SSL/src/CommonCommands/СинхронизацияДанныхВМоделиСервиса/СинхронизацияДанныхВМоделиСервиса.mdo +++ b/SSL/src/CommonCommands/НастройкиСинхронизацииДанныхВМоделиСервиса/НастройкиСинхронизацииДанныхВМоделиСервиса.mdo @@ -1,9 +1,9 @@ - СинхронизацияДанныхВМоделиСервиса + НастройкиСинхронизацииДанныхВМоделиСервиса ru - Синхронизация данных + Настройки синхронизации данных NavigationPanelOrdinary Auto diff --git a/SSL/src/CommonCommands/ПредупрежденияПриСинхронизацииДанных/CommandModule.bsl b/SSL/src/CommonCommands/ПредупрежденияПриСинхронизацииДанных/CommandModule.bsl index e5559dd6e..8e300f1b6 100644 --- a/SSL/src/CommonCommands/ПредупрежденияПриСинхронизацииДанных/CommandModule.bsl +++ b/SSL/src/CommonCommands/ПредупрежденияПриСинхронизацииДанных/CommandModule.bsl @@ -11,7 +11,10 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.Форма", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупрежденияСинхронизаций",, + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); КонецПроцедуры diff --git a/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl b/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl index 4de261991..0718386b1 100644 --- a/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl +++ b/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl @@ -251,7 +251,7 @@ Если ОбменДаннымиПовтИсп.ИспользуетсяВерсионирование() Тогда - СтруктураЗаголовка = ОбменДаннымиСервер.СтруктураЗаголовкаГиперссылкиМонитораПроблем(ПриложениеВСервисе); + СтруктураЗаголовка = РегистрыСведений.РезультатыОбменаДанными.КоличествоПредупрежденийДляЭлементаФормы(ПриложениеВСервисе); ЗаполнитьЗначенияСвойств (Элементы.ПерейтиККонфликтам, СтруктураЗаголовка); ЗаполнитьЗначенияСвойств (Элементы.ПерейтиККонфликтам1, СтруктураЗаголовка); diff --git a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form index bd1168d87..0b77cf26b 100644 --- a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form +++ b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form @@ -1222,10 +1222,6 @@ true - - <key>ru</key> - <value>Автономных рабочих мест группа 3</value> - СписокАвтономныхРабочихМестГруппа3ExtendedTooltip 157 @@ -1300,10 +1296,6 @@ true - - <key>ru</key> - <value>Автономных рабочих мест группа 1</value> - СписокАвтономныхРабочихМестГруппа1ExtendedTooltip 159 @@ -1378,10 +1370,6 @@ true - - <key>ru</key> - <value>Автономных рабочих мест группа 2</value> - СписокАвтономныхРабочихМестГруппа2ExtendedTooltip 162 @@ -1684,10 +1672,6 @@ true - - <key>ru</key> - <value>Автономных рабочих мест группа 4</value> - СписокАвтономныхРабочихМестГруппа4ExtendedTooltip 151 diff --git a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl index 55b26502e..d1117b6c9 100644 --- a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl @@ -247,8 +247,8 @@ Если ОбменДаннымиПовтИсп.ИспользуетсяВерсионирование() Тогда - СтруктураЗаголовка = ОбменДаннымиСервер.СтруктураЗаголовкаГиперссылкиМонитораПроблем( - МассивИспользуемыхУзлов(АвтономноеРабочееМесто, СписокАвтономныхРабочихМест)); + МассивИспользуемыхУзлов = МассивИспользуемыхУзлов(АвтономноеРабочееМесто, СписокАвтономныхРабочихМест); + СтруктураЗаголовка = РегистрыСведений.РезультатыОбменаДанными.КоличествоПредупрежденийДляЭлементаФормы(МассивИспользуемыхУзлов); ЗаполнитьЗначенияСвойств (Элементы.ПерейтиККонфликтам, СтруктураЗаголовка); ЗаполнитьЗначенияСвойств (Элементы.ПерейтиККонфликтам1, СтруктураЗаголовка); diff --git a/SSL/src/CommonForms/АдреснаяКнига/Form.form b/SSL/src/CommonForms/АдреснаяКнига/Form.form index 4f75dab90..835250338 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Form.form +++ b/SSL/src/CommonForms/АдреснаяКнига/Form.form @@ -2275,7 +2275,7 @@ true true - Windows.Highlight + Style.ГиперссылкаЦвет Normal diff --git a/SSL/src/CommonForms/АдреснаяКнига/Module.bsl b/SSL/src/CommonForms/АдреснаяКнига/Module.bsl index 912330449..5c280880b 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Module.bsl +++ b/SSL/src/CommonForms/АдреснаяКнига/Module.bsl @@ -793,7 +793,7 @@ УсловноеОформление.Элементы.Очистить(); - Взаимодействия.УстановитьУсловноеОформлениеСпискаВыбора(ЭтотОбъект, "Группа", "ПолучателиПисьма.Группа"); + ОбщегоНазначения.УстановитьУсловноеОформлениеСпискаВыбора(ЭтотОбъект, "Группа", "ПолучателиПисьма.Группа"); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form b/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form index 7ff498d6d..191adab2c 100644 --- a/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form +++ b/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form @@ -1847,6 +1847,10 @@ Left true + + BeforeClose + ПередЗакрытием + OnCreateAtServer ПриСозданииНаСервере diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl b/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl index d442adc5c..39aec87b5 100644 --- a/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl +++ b/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl @@ -42,6 +42,14 @@ КонецПроцедуры +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьОповещение", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы); + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -176,6 +184,17 @@ #Область СлужебныеПроцедурыИФункции +&НаКлиенте +Процедура ЗаписатьИЗакрытьОповещение(Результат, Контекст) Экспорт + + Если НастройкиВосстановленияПароляКорректные() Тогда + СохранитьНастройкиВосстановленияПароля(); + Модифицированность = Ложь; + Закрыть(); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Функция НастройкиВосстановленияПароляКорректные() diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl index e6f870b9c..685745984 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl @@ -1131,8 +1131,7 @@ КонецПроцедуры // Параметры: -// КоллекцияЭлементовДерева - ДанныеФормыДерева -// - ДанныеФормыЭлементДерева: +// ЭлементДеревоРазделовПоиска - ДанныеФормыЭлементДерева: // * Пометка - Число - обязательный реквизит дерева. // * ЭтоОбъектМетаданных - Булево - обязательный реквизит дерева. // ЗначениеПометки - Число - устанавливаемое значение. diff --git a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Help/ru.html b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Help/ru.html index 7ca63d799..bb041c5fb 100644 --- a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Help/ru.html +++ b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Help/ru.html @@ -1,7 +1,7 @@

        Предназначена для ввода пути к архиву с файлами начального образа (при хранении файлов в томах).

        Если для хранения файлов используются тома на диске, то вместе с созданием начального образа автоматически будет создан архив с файлами, хранящимися в томах.

        -

        Затем в процессе создания информационной базы подчиненного узла из начального образа в программе-приемнике следует получить файлы из этого архива. Для этого необходимо воспользоваться командой Разместить файлы начального образа. В последующих итерациях синхронизации данных файлы в томах будут участвовать автоматически.

        +

        Затем в процессе создания информационной базы подчиненного узла из начального образа в программе-приемнике следует получить файлы из этого архива. Для этого необходимо воспользоваться командой Разместить файлы начального образа. В последующих итерациях синхронизации данных файлы в томах будут участвовать автоматически.

        В одном из полей укажите Путь к архиву с файлами начального образа:

        • Для сервера 1С:Предприятия под управлением Microsoft Windows - укажите путь к архиву с помощью кнопки ;

        или

        • Для сервера 1С:Предприятия под управлением Linux - напишите путь к архиву.

        Нажмите Разместить.

        diff --git a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Help/ru.html b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Help/ru.html index 00b6829c5..101d29e8c 100644 --- a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Help/ru.html +++ b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Help/ru.html @@ -3,7 +3,7 @@

        Вызывается по команде Подобрать или Добавить из других объектов программы, например, при установке Даты запрета загрузки данных.

        В списке выводится:

        • Программа - перечень программ, с которыми настроена синхронизация данных.  -
        • Информационная база - перечень информационных баз, с которыми настроена синхронизация данных. 

        Выбор узла плана обмена

        +
      • Информационная база - перечень информационных баз, с которыми настроена синхронизация данных. 

      Выбор узла плана обмена

      • Выделите нужное значение, нажмите Выбрать.

      Подбор узлов плана обмена

      • Выделите несколько значений, нажмите Выбрать.

      См. также:

      \ No newline at end of file diff --git a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form b/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form index d5ff5af85..ec542292c 100644 --- a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form +++ b/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form @@ -58,6 +58,12 @@ UseIfNecessary auto true + + Ключ + + CatalogRef.Пользователи + + diff --git a/SSL/src/CommonForms/НастройкаКолонтитулов/Help/ru.html b/SSL/src/CommonForms/НастройкаКолонтитулов/Help/ru.html new file mode 100644 index 000000000..4c34521ea --- /dev/null +++ b/SSL/src/CommonForms/НастройкаКолонтитулов/Help/ru.html @@ -0,0 +1,17 @@ +Предназначена для настройки колонтитулов. +
      Доступна общая и индивидуальная настройка. Для общей настройки перейдите по ссылке Колонтитулы в разделе Администрирование - Печатные формы, отчеты и обработки.
      +
      В настройках каждого отчета (расширенный режим) имеется возможность настроить индивидуальные колонтитулы.
      Колонтитулы - удобное средство сделать отчет более наглядным, применяются чаще для больших по объему отчетов, в этом случае на страницах отчета размещается справочная информация для удобства его восприятия:
      +
      +
      • Наименование отчета;
      • +
      • Номер/количество страниц;
      • +
      • Дата и время формирования отчета;
      • +
      • Автор.

      Возможна настройка шрифта, размера для каждого колонтитула с помощью стандартных кнопок форматирования.

      +

      Размещение колонтитулов

      +

      +
      • С помощью кнопок панели навигации разместите колонтитулы в нужном месте (лево, право, центр) верхней или нижней части отчета, укажите, с какой страницы начинать вывод колонтитулов. Для этого выделите нужную ячейку, например, левую верхнюю, нажмите кнопку панели навигации, например Время. 
      • +
      • В выделенной ячейке выводится обозначение колонтитула, например [&Время]. 
      • +
      • В средней части окна выводится Образец отчета с размещенными колонтитулами, для того чтобы можно было сразу увидеть результат настройки.
      • +
      • После окончания настройки нажмите Сохранить.

      +

      См. также:

      +

      +

      \ No newline at end of file diff --git a/SSL/src/CommonForms/НастройкаКолонтитулов/НастройкаКолонтитулов.mdo b/SSL/src/CommonForms/НастройкаКолонтитулов/НастройкаКолонтитулов.mdo index 8868effaa..e39aac4de 100644 --- a/SSL/src/CommonForms/НастройкаКолонтитулов/НастройкаКолонтитулов.mdo +++ b/SSL/src/CommonForms/НастройкаКолонтитулов/НастройкаКолонтитулов.mdo @@ -5,6 +5,11 @@ ru Настройка колонтитулов + + + ru + + PersonalComputer MobileDevice true diff --git a/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl index f24fbbee7..7eb5dc05e 100644 --- a/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl @@ -546,24 +546,16 @@ // Добавление прямых и обратных зависимостей прав. ПрямыеЗависимостиПрав.Вставить(ПредставленияПрава.Имя, ОписаниеПрава.ТребуемыеПрава); - Для каждого ЗависимоеПраво Из ОписаниеПрава.ТребуемыеПрава Цикл - Если ТипЗнч(ЗависимоеПраво) = Тип("Массив") Тогда - ЗависимыеПрава = ЗависимоеПраво; + Для каждого ТребуемоеПраво Из ОписаниеПрава.ТребуемыеПрава Цикл + Если ОбратныеЗависимостиПрав.Свойство(ТребуемоеПраво) Тогда + ЗависимыеПрава = ОбратныеЗависимостиПрав[ТребуемоеПраво]; Иначе ЗависимыеПрава = Новый Массив; - ЗависимыеПрава.Добавить(ЗависимоеПраво); + ОбратныеЗависимостиПрав.Вставить(ТребуемоеПраво, ЗависимыеПрава); + КонецЕсли; + Если ЗависимыеПрава.Найти(ПредставленияПрава.Имя) = Неопределено Тогда + ЗависимыеПрава.Добавить(ПредставленияПрава.Имя); КонецЕсли; - Для каждого ЗависимоеПраво Из ЗависимыеПрава Цикл - Если ОбратныеЗависимостиПрав.Свойство(ЗависимоеПраво) Тогда - ЗависимыеПрава = ОбратныеЗависимостиПрав[ЗависимоеПраво]; - Иначе - ЗависимыеПрава = Новый Массив; - ОбратныеЗависимостиПрав.Вставить(ЗависимоеПраво, ЗависимыеПрава); - КонецЕсли; - Если ЗависимыеПрава.Найти(ПредставленияПрава.Имя) = Неопределено Тогда - ЗависимыеПрава.Добавить(ПредставленияПрава.Имя); - КонецЕсли; - КонецЦикла; КонецЦикла; Иначе Элемент = ДобавитьЭлемент("ГруппыПрав" + ПредставленияПрава.Имя, Тип("ПолеФормы"), Элементы.ГруппыПрав); diff --git a/SSL/src/CommonForms/СинхронизацияДанных/Form.form b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Form.form similarity index 80% rename from SSL/src/CommonForms/СинхронизацияДанных/Form.form rename to SSL/src/CommonForms/НастройкиСинхронизацииДанных/Form.form index a2155ceae..255b13643 100644 --- a/SSL/src/CommonForms/СинхронизацияДанных/Form.form +++ b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Form.form @@ -1,9 +1,5 @@ - - <key>ru</key> - <value>Настройки синхронизации данных</value> - ГруппаСинхронизацияНеНастроена 615 @@ -257,10 +253,10 @@ ИнформационнаяПанельТребуетсяОбновление - 306 + 740 КартинкаПредупреждениеОбновление - 307 + 742 <key>ru</key> <value>Картинка предупреждение обновление</value> @@ -272,7 +268,7 @@ </userVisible> <extendedTooltip> <name>КартинкаПредупреждениеОбновлениеРасширеннаяПодсказка</name> - <id>409</id> + <id>744</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -282,7 +278,7 @@ </extendedTooltip> <contextMenu> <name>КартинкаПредупреждениеОбновлениеКонтекстноеМеню</name> - <id>308</id> + <id>743</id> <autoFill>true</autoFill> </contextMenu> <autoMaxWidth>true</autoMaxWidth> @@ -295,13 +291,13 @@ </items> <items xsi:type="form:FormGroup"> <name>ПравоОбновленияСтраницы</name> - <id>316</id> + <id>745</id> <items xsi:type="form:FormGroup"> <name>ИнформацияОбменДаннымиПриостановленЕстьПравоОбновления</name> - <id>312</id> + <id>747</id> <items xsi:type="form:Decoration"> <name>НадписьОбменДаннымиПриостановленЕстьПравоОбновления</name> - <id>313</id> + <id>749</id> <title> <key>ru</key> <value>Необходимо установить обновление программы, после чего синхронизация данных будет продолжена.</value> @@ -313,7 +309,7 @@ </userVisible> <extendedTooltip> <name>НадписьОбменДаннымиПриостановленЕстьПравоОбновленияРасширеннаяПодсказка</name> - <id>412</id> + <id>751</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -323,7 +319,7 @@ </extendedTooltip> <contextMenu> <name>НадписьОбменДаннымиПриостановленЕстьПравоОбновленияКонтекстноеМеню</name> - <id>314</id> + <id>750</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -334,7 +330,7 @@ </items> <items xsi:type="form:Button"> <name>УстановитьОбновление</name> - <id>315</id> + <id>752</id> <visible>true</visible> <enabled>true</enabled> <userVisible> @@ -342,7 +338,7 @@ </userVisible> <extendedTooltip> <name>УстановитьОбновлениеРасширеннаяПодсказка</name> - <id>413</id> + <id>753</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -370,7 +366,7 @@ ИнформацияОбменДаннымиПриостановленЕстьПравоОбновленияРасширеннаяПодсказка - 411 + 748 Label true true @@ -387,10 +383,10 @@ ИнформацияОбменДаннымиПриостановленНетПраваОбновления - 309 + 754 НадписьОбменДаннымиПриостановленНетПраваОбновления - 310 + 756 <key>ru</key> <value>Синхронизация данных приостановлена в связи с необходимостью установки полученного обновления. @@ -403,7 +399,7 @@ </userVisible> <extendedTooltip> <name>НадписьОбменДаннымиПриостановленНетПраваОбновленияРасширеннаяПодсказка</name> - <id>415</id> + <id>758</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -413,7 +409,7 @@ </extendedTooltip> <contextMenu> <name>НадписьОбменДаннымиПриостановленНетПраваОбновленияКонтекстноеМеню</name> - <id>311</id> + <id>757</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -433,7 +429,7 @@ ИнформацияОбменДаннымиПриостановленНетПраваОбновленияРасширеннаяПодсказка - 414 + 755 Label true true @@ -459,7 +455,7 @@ ПравоОбновленияСтраницыExtendedTooltip - 410 + 746 Label true true @@ -484,7 +480,7 @@ 45 ИнформационнаяПанельТребуетсяОбновлениеРасширеннаяПодсказка - 408 + 741 Label true true @@ -497,6 +493,117 @@ Auto true true + + Style.ЦветФонаПредупреждения + + Auto + Auto + + + + ИнформационнаяПанельТребуетсяПерезагрузка + 759 + + ПредупреждениеОПерезагрузкеКартинка + 761 + + <key>ru</key> + <value>Предупреждение о перезагрузке картинка</value> + + true + true + + true + + + ПредупреждениеОПерезагрузкеКартинкаРасширеннаяПодсказка + 763 + Label + true + true + + Left + + + + ПредупреждениеОПерезагрузкеКартинкаКонтекстноеМеню + 762 + true + + true + true + + + CommonPicture.Предупреждение32 + + + + + ПредупреждениеОПерезагрузкеОписание + 764 + + <key>ru</key> + <value>Изменены расширения конфигурации. Чтобы продолжить работу с учетом сделанных изменений, необходимо <link 1>перезапустить</> программу.</value> + + true + true + + true + + + ПредупреждениеОПерезагрузкеОписаниеРасширеннаяПодсказка + 766 + Label + true + true + + Left + + + + ПредупреждениеОПерезагрузкеОписаниеКонтекстноеМеню + 765 + true + + true + Label + true + + + URLProcessing + ПредупреждениеОПерезагрузкеОписаниеОбработкаНавигационнойСсылки + + Left + + + true + true + + true + + + <key>ru</key> + <value>Предупреждение</value> + + + ИнформационнаяПанельТребуетсяПерезагрузкаРасширеннаяПодсказка + 760 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + + Style.ЦветФонаПредупреждения + Auto Auto @@ -507,50 +614,24 @@ СтраницаСписокПриложений 703 - - ОткрытьРезультатыСинхронизацииДанных - 367 - true - true - - true - - - ОткрытьРезультатыСинхронизацииДанныхExtendedTooltip - 461 - Label - true - true - - Left - - - Hyperlink - Form.Command.ОткрытьРезультатыСинхронизацииДанных - Normal - Auto - true - true - UserCmds - Auto - КоманднаяПанель 145 - СписокПриложенийГруппаУправление - 366 + СписокПриложенийГруппаВыполненияОбменаДанными + 390 - СписокПриложенийСоздатьНастройкуСинхронизации - 634 + СписокПриложенийВыполнитьСинхронизацию + 52 true true true + false - СписокПриложенийСоздатьНастройкуСинхронизацииРасширеннаяПодсказка - 635 + СписокПриложенийВыполнитьСинхронизациюРасширеннаяПодсказка + 467 Label true true @@ -558,7 +639,34 @@ Left - Form.Command.СоздатьНастройкуСинхронизации + Form.Command.ВыполнитьСинхронизацию + Auto + true + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СписокПриложенийВыполнитьСинхронизациюСДополнительнымиОтборами + 713 + true + true + + true + + + СписокПриложенийВыполнитьСинхронизациюСДополнительнымиОтборамиРасширеннаяПодсказка + 714 + Label + true + true + + Left + + + Form.Command.ВыполнитьСинхронизациюСДополнительнымиОтборами Normal Auto true @@ -566,6 +674,139 @@ UserCmds Auto + + СписокПриложенийНачальнаяВыгрузкаДанных + 681 + true + true + + true + + + СписокПриложенийНачальнаяВыгрузкаДанныхРасширеннаяПодсказка + 682 + Label + true + true + + Left + + + Form.Command.НачальнаяВыгрузкаДанных + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Приложений группа выполнения обмена данными</value> + + + СписокПриложенийГруппаВыполненияОбменаДаннымиРасширеннаяПодсказка + 466 + Label + true + true + + Left + + + + Compact + + + + СписокПриложенийГруппаУправление + 366 + + СписокПриложенийИзменитьНастройкуСинхронизации + 53 + true + true + + true + + false + + СписокПриложенийИзменитьНастройкуСинхронизацииРасширеннаяПодсказка + 470 + Label + true + true + + Left + + + Form.Command.ИзменитьНастройкиСинхронизации + Normal + Auto + true + true + UserCmds + Auto + + + СписокПриложенийСоставОтправляемыхДанных + 360 + true + true + + true + + + СписокПриложенийСоставОтправляемыхДанныхРасширеннаяПодсказка + 471 + Label + true + true + + Left + + + Form.Command.СоставОтправляемыхДанных + Normal + Auto + true + true + UserCmds + Auto + + + СписокПриложенийЗагрузитьПравилаСинхронизацииДанных + 535 + true + true + + true + + + СписокПриложенийЗагрузитьПравилаСинхронизацииДанныхРасширеннаяПодсказка + 536 + Label + true + true + + Left + + + Form.Command.ЗагрузитьПравилаСинхронизацииДанных + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + СписокПриложенийУдалитьНастройкуСинхронизации 364 @@ -612,157 +853,21 @@ Left
      - + + Compact + - - СписокПриложенийГруппаИзменениеИСостав - 361 - - СписокПриложенийИзменитьНастройкуСинхронизации - 53 - true - true - - true - - false - - СписокПриложенийИзменитьНастройкуСинхронизацииРасширеннаяПодсказка - 470 - Label - true - true - - Left - - - Form.Command.ИзменитьНастройкуСинхронизации - Normal - Auto - true - true - UserCmds - Auto - - - СписокПриложенийСоставОтправляемыхДанных - 360 - true - true - - true - - - СписокПриложенийСоставОтправляемыхДанныхРасширеннаяПодсказка - 471 - Label - true - true - - Left - - - Form.Command.СоставОтправляемыхДанных - Normal - Auto - true - true - UserCmds - Auto - - - СписокПриложенийНачальнаяВыгрузкаДанных - 681 - true - true - - true - - - СписокПриложенийНачальнаяВыгрузкаДанныхРасширеннаяПодсказка - 682 - Label - true - true - - Left - - - Form.Command.НачальнаяВыгрузкаДанных - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СписокПриложенийИнформацияПоОбмену - 338 - true - true - - true - - - СписокПриложенийИнформацияПоОбменуРасширеннаяПодсказка - 484 - Label - true - true - - Left - - - Form.Command.ИнформацияПоОбмену - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СписокПриложенийЗагрузитьПравилаСинхронизацииДанных - 535 - true - true - - true - - - СписокПриложенийЗагрузитьПравилаСинхронизацииДанныхРасширеннаяПодсказка - 536 - Label - true - true - - Left - - - Form.Command.ЗагрузитьПравилаСинхронизацииДанных - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - + + СписокПриложенийСоздатьНастройкуСинхронизации + 634 true true true - - <key>ru</key> - <value>Командной панели изменение и состав</value> - - СписокПриложенийГруппаИзменениеИСоставРасширеннаяПодсказка - 469 + СписокПриложенийСоздатьНастройкуСинхронизацииРасширеннаяПодсказка + 635 Label true true @@ -770,77 +875,26 @@ Left - + Form.Command.СоздатьНастройкуСинхронизации + Normal + Auto + true + true + UserCmds + Balloon + Auto - - СписокПриложенийГруппаВыполненияОбменаДанными - 390 - - СписокПриложенийВыполнитьСинхронизацию - 52 - true - true - - true - - false - - СписокПриложенийВыполнитьСинхронизациюРасширеннаяПодсказка - 467 - Label - true - true - - Left - - - Form.Command.ВыполнитьСинхронизацию - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - СписокПриложенийВыполнитьСинхронизациюСДополнительнымиОтборами - 713 - true - true - - true - - - СписокПриложенийВыполнитьСинхронизациюСДополнительнымиОтборамиРасширеннаяПодсказка - 714 - Label - true - true - - Left - - - Form.Command.ВыполнитьСинхронизациюСДополнительнымиОтборами - Normal - Auto - true - true - UserCmds - Auto - + + СписокПриложенийОбновитьМонитор + 671 true true true - - <key>ru</key> - <value>Приложений группа выполнения обмена данными</value> - - СписокПриложенийГруппаВыполненияОбменаДаннымиРасширеннаяПодсказка - 466 + СписокПриложенийОбновитьМониторРасширеннаяПодсказка + 672 Label true true @@ -848,58 +902,14 @@ Left - - - - СписокПриложенийГруппаРасписаниеВыполненияОбмена - 594 - - СписокПриложенийНастроитьРасписаниеВыполненияОбмена - 102 - true - true - - true - - - СписокПриложенийНастроитьРасписаниеВыполненияОбменаРасширеннаяПодсказка - 475 - Label - true - true - - Left - - - Form.Command.НастроитьСценарииОбменаДанными - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Приложений группа расписание выполнения обмена</value> - - - СписокПриложенийГруппаРасписаниеВыполненияОбменаРасширеннаяПодсказка - 595 - Label - true - true - - Left - - - + Form.Command.ОбновитьМонитор + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu СписокПриложенийГруппаСобытия @@ -980,16 +990,16 @@ - СписокПриложенийОбновитьМонитор - 671 + СписокПриложенийПредыдущаяФормаПредупреждений + 738 true true true - СписокПриложенийОбновитьМониторРасширеннаяПодсказка - 672 + СписокПриложенийПредыдущаяФормаПредупрежденийРасширеннаяПодсказка + 739 Label true true @@ -997,7 +1007,7 @@ Left - Form.Command.ОбновитьМонитор + Form.Command.ПредыдущаяФормаПредупреждений Normal Auto true @@ -1110,6 +1120,37 @@ + + СписокПриложенийНовыйКодПредопределенногоУзла + 767 + + <key>ru</key> + <value>Новый код предопределенного узла...</value> + + true + true + + true + + + СписокПриложенийНовыйКодПредопределенногоУзлаРасширеннаяПодсказка + 768 + Label + true + true + + Left + + + Form.Command.НовыйКодПредопределенногоУзла + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + ФормаИзменитьФорму 134 @@ -1402,23 +1443,153 @@ - СписокПриложенийГруппаПоследняяВыгрузка - 650 - - СписокПриложенийСостояниеВыгрузкиКартинка - 654 + СписокПриложенийГруппаОтправкаДанных + 720 + + СписокПриложенийГруппаПоследняяВыгрузка + 650 + + СписокПриложенийСостояниеВыгрузкиКартинка + 654 + true + true + + true + + + СписокПриложений.СостояниеВыгрузкиКартинка + + None + + СписокПриложенийСостояниеВыгрузкиКартинкаРасширеннаяПодсказка + 656 + Label + true + true + + Left + + + + СписокПриложенийСостояниеВыгрузкиКартинкаКонтекстноеМеню + 655 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + true + + CommonPicture.СинхронизацияДанныхСостояниеСинхронизации + + + + 1 + + + + + СписокПриложенийПредставлениеДатыПоследнейУспешнойВыгрузки + 666 + true + true + + true + + + СписокПриложений.ПредставлениеДатыПоследнейУспешнойВыгрузки + + + СписокПриложенийПредставлениеДатыПоследнейУспешнойВыгрузкиРасширеннаяПодсказка + 668 + Label + true + true + + Left + + + + СписокПриложенийПредставлениеДатыПоследнейУспешнойВыгрузкиКонтекстноеМеню + 667 + true + + LabelField + Auto + true + true + Left + true + Show + Always + + true + true + true + + + + СписокПриложенийОтправкаПредупреждения + 732 + true + true + + true + + + СписокПриложений.ОтправкаПредупреждения + + + СписокПриложенийОтправкаПредупрежденияРасширеннаяПодсказка + 734 + Label + true + true + + Left + + + + СписокПриложенийОтправкаПредупрежденияКонтекстноеМеню + 733 + true + + InputField + Auto + true + Left + true + Show + Always + + true + true + true + true + true + true + Normal + + true true true - - СписокПриложений.СостояниеВыгрузкиКартинка - - None + + <key>ru</key> + <value>Приложений группа последняя выгрузка</value> + - СписокПриложенийСостояниеВыгрузкиКартинкаРасширеннаяПодсказка - 656 + СписокПриложенийГруппаПоследняяВыгрузкаРасширеннаяПодсказка + 651 Label true true @@ -1426,64 +1597,11 @@ Left - - СписокПриложенийСостояниеВыгрузкиКартинкаКонтекстноеМеню - 655 - true - - PictureField - Auto - true - Left - true - - true - true - true - true - - CommonPicture.СинхронизацияДанныхСостояниеСинхронизации - - - - 1 - - - - - СписокПриложенийПредставлениеДатыПоследнейУспешнойВыгрузки - 666 - true - true - - true - - - СписокПриложений.ПредставлениеДатыПоследнейУспешнойВыгрузки - - - СписокПриложенийПредставлениеДатыПоследнейУспешнойВыгрузкиРасширеннаяПодсказка - 668 - Label - true - true - - Left - - - - СписокПриложенийПредставлениеДатыПоследнейУспешнойВыгрузкиКонтекстноеМеню - 667 - true - - LabelField - Auto - true - Left - true - - true - true + ColumnGroup + + InCell + auto + true true @@ -1493,11 +1611,15 @@ <key>ru</key> - <value>Приложений группа последняя выгрузка</value> + <value>Последнее отправление</value> + + ru + Сведения об отправке данных + - СписокПриложенийГруппаПоследняяВыгрузкаРасширеннаяПодсказка - 651 + СписокПриложенийГруппаОтправкаДанныхРасширеннаяПодсказка + 721 Label true true @@ -1507,29 +1629,157 @@ ColumnGroup - InCell auto true - СписокПриложенийГруппаПоследняяЗагрузка - 652 - - СписокПриложенийСостояниеЗагрузкиКартинка - 657 + СписокПриложенийГруппаПолучениеДанных + 730 + + СписокПриложенийГруппаПоследняяЗагрузка + 652 + + СписокПриложенийСостояниеЗагрузкиКартинка + 657 + true + true + + true + + + СписокПриложений.СостояниеЗагрузкиКартинка + + None + + СписокПриложенийСостояниеЗагрузкиКартинкаРасширеннаяПодсказка + 659 + Label + true + true + + Left + + + + СписокПриложенийСостояниеЗагрузкиКартинкаКонтекстноеМеню + 658 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.СинхронизацияДанныхСостояниеСинхронизации + + + + 1 + + + + + СписокПриложенийПредставлениеДатыПоследнейУспешнойЗагрузки + 663 + true + true + + true + + + СписокПриложений.ПредставлениеДатыПоследнейУспешнойЗагрузки + + + СписокПриложенийПредставлениеДатыПоследнейУспешнойЗагрузкиРасширеннаяПодсказка + 665 + Label + true + true + + Left + + + + СписокПриложенийПредставлениеДатыПоследнейУспешнойЗагрузкиКонтекстноеМеню + 664 + true + + LabelField + true + Auto + true + true + Left + true + Show + Always + + true + true + + + + СписокПриложенийПолучениеПредупреждения + 735 + true + true + + true + + + СписокПриложений.ПолучениеПредупреждения + + + СписокПриложенийПолучениеПредупрежденияРасширеннаяПодсказка + 737 + Label + true + true + + Left + + + + СписокПриложенийПолучениеПредупрежденияКонтекстноеМеню + 736 + true + + InputField + Auto + true + Left + true + Show + Always + + true + true + true + true + true + true + Normal + + true true true - - СписокПриложений.СостояниеЗагрузкиКартинка - - None + + <key>ru</key> + <value>Приложений группа последняя загрузка</value> + - СписокПриложенийСостояниеЗагрузкиКартинкаРасширеннаяПодсказка - 659 + СписокПриложенийГруппаПоследняяЗагрузкаРасширеннаяПодсказка + 653 Label true true @@ -1537,64 +1787,11 @@ Left - - СписокПриложенийСостояниеЗагрузкиКартинкаКонтекстноеМеню - 658 - true - - PictureField - Auto - true - Left - true - - true - true - true - true - - CommonPicture.СинхронизацияДанныхСостояниеСинхронизации - - - - 1 - - - - - СписокПриложенийПредставлениеДатыПоследнейУспешнойЗагрузки - 663 - true - true - - true - - - СписокПриложений.ПредставлениеДатыПоследнейУспешнойЗагрузки - - - СписокПриложенийПредставлениеДатыПоследнейУспешнойЗагрузкиРасширеннаяПодсказка - 665 - Label - true - true - - Left - - - - СписокПриложенийПредставлениеДатыПоследнейУспешнойЗагрузкиКонтекстноеМеню - 664 - true - - LabelField - Auto - true - Left - true - - true - true + ColumnGroup + + InCell + auto + true true @@ -1604,11 +1801,15 @@ <key>ru</key> - <value>Приложений группа последняя загрузка</value> + <value>Последнее получение</value> + + ru + Сведения о получении данных + - СписокПриложенийГруппаПоследняяЗагрузкаРасширеннаяПодсказка - 653 + СписокПриложенийГруппаПолучениеДанныхРасширеннаяПодсказка + 731 Label true true @@ -1618,7 +1819,7 @@ ColumnGroup - InCell + Vertical auto true @@ -1675,10 +1876,6 @@ Selection СписокПриложенийВыбор - - OnActivateRow - СписокПриложенийПриАктивизацииСтроки - СписокПриложенийСтрокаПоиска 537 @@ -1763,82 +1960,6 @@ СписокПриложенийКонтекстноеМеню 2 - - СписокПриложенийКонтекстноеМенюГруппаИзменениеИСостав - 693 - - СписокПриложенийКонтекстноеМенюИзменитьНастройкуСинхронизации - 679 - true - true - - true - - - СписокПриложенийКонтекстноеМенюИзменитьНастройкуСинхронизацииРасширеннаяПодсказка - 680 - Label - true - true - - Left - - - Form.Command.ИзменитьНастройкуСинхронизации - Normal - Auto - true - true - UserCmds - Auto - - - СписокПриложенийКонтекстноеМенюСоставОтправляемыхДанных - 687 - true - true - - true - - - СписокПриложенийКонтекстноеМенюСоставОтправляемыхДанныхРасширеннаяПодсказка - 688 - Label - true - true - - Left - - - Form.Command.СоставОтправляемыхДанных - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Приложений контекстное меню группа изменение и состав</value> - - - СписокПриложенийКонтекстноеМенюГруппаИзменениеИСоставРасширеннаяПодсказка - 694 - Label - true - true - - Left - - - - СписокПриложенийКонтекстноеМенюГруппаВыполненияОбменаДанными 695 @@ -1890,19 +2011,19 @@ - СписокПриложенийКонтекстноеМенюГруппаРасписаниеВыполненияОбмена - 699 + СписокПриложенийКонтекстноеМенюГруппаУправление + 697 - СписокПриложенийКонтекстноеМенюНастроитьСценарииОбменаДанными - 685 + СписокПриложенийКонтекстноеМенюИзменитьНастройкуСинхронизации + 679 true true true - СписокПриложенийКонтекстноеМенюНастроитьСценарииОбменаДаннымиРасширеннаяПодсказка - 686 + СписокПриложенийКонтекстноеМенюИзменитьНастройкуСинхронизацииРасширеннаяПодсказка + 680 Label true true @@ -1910,7 +2031,59 @@ Left - Form.Command.НастроитьСценарииОбменаДанными + Form.Command.ИзменитьНастройкиСинхронизации + Normal + Auto + true + true + UserCmds + Auto + + + СписокПриложенийКонтекстноеМенюСоставОтправляемыхДанных + 687 + true + true + + true + + + СписокПриложенийКонтекстноеМенюСоставОтправляемыхДанныхРасширеннаяПодсказка + 688 + Label + true + true + + Left + + + Form.Command.СоставОтправляемыхДанных + Normal + Auto + true + true + UserCmds + Auto + + + СписокПриложенийКонтекстноеМенюУдалитьНастройкуСинхронизации + 683 + true + true + + true + + + СписокПриложенийКонтекстноеМенюУдалитьНастройкуСинхронизацииРасширеннаяПодсказка + 684 + Label + true + true + + Left + + + Form.Command.УдалитьНастройкуСинхронизации Normal Auto true @@ -1925,11 +2098,11 @@ <key>ru</key> - <value>Приложений контекстное меню группа расписание выполнения обмена</value> + <value>Приложений контекстное меню группа управление</value> - СписокПриложенийКонтекстноеМенюГруппаРасписаниеВыполненияОбменаРасширеннаяПодсказка - 700 + СписокПриложенийКонтекстноеМенюГруппаУправлениеРасширеннаяПодсказка + 698 Label true true @@ -2041,56 +2214,6 @@ UserCmds Auto - - СписокПриложенийКонтекстноеМенюГруппаУправление - 697 - - СписокПриложенийКонтекстноеМенюУдалитьНастройкуСинхронизации - 683 - true - true - - true - - - СписокПриложенийКонтекстноеМенюУдалитьНастройкуСинхронизацииРасширеннаяПодсказка - 684 - Label - true - true - - Left - - - Form.Command.УдалитьНастройкуСинхронизации - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Приложений контекстное меню группа управление</value> - - - СписокПриложенийКонтекстноеМенюГруппаУправлениеРасширеннаяПодсказка - 698 - Label - true - true - - Left - - - - true true @@ -2098,7 +2221,6 @@ true true true - Row
      true
      1 1 @@ -2322,15 +2444,14 @@ ПрефиксИБ true - - ru - Префикс добавляется автоматически к кодам элементов справочников -и номерам документов для того, чтобы различать, в какой из программ -они были введены, и избежать дублирования данных - + Button ПрефиксИБРасширеннаяПодсказка 515 + + <key>ru</key> + <value>Префикс добавляется автоматически к кодам элементов справочников и номерам документов для того, чтобы различать, в какой из программ они были введены, и избежать дублирования данных. Префикс вводиться в панели администрирования до настройки первой синхронизации и неизменен до тех пор, пока в информационной базе есть хотя бы одна синхронизация.</value> + Label true true @@ -2359,6 +2480,69 @@ Normal
      + + СписокПриложенийГруппаРасписаниеВыполненияОбмена + 594 + + СписокПриложенийНастроитьРасписаниеВыполненияОбмена + 102 + true + true + + true + + + СписокПриложенийНастроитьРасписаниеВыполненияОбменаРасширеннаяПодсказка + 475 + Label + true + true + + Left + + + Hyperlink + Form.Command.НастроитьСценарииОбменаДанными + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Приложений группа расписание выполнения обмена</value> + + true + Right + + СписокПриложенийГруппаРасписаниеВыполненияОбменаРасширеннаяПодсказка + 595 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + true true @@ -2408,6 +2592,7 @@ DontBlock true + true Vertical true true @@ -2910,6 +3095,75 @@ true + + Ошибка + 33 + + String + + 100 + + + + true + + + true + + + + ОтправкаПредупреждения + + <key>ru</key> + <value>Предупреждения</value> + + 34 + + String + + 30 + + + + true + + + true + + + + ПолучениеПредупреждения + + <key>ru</key> + <value>Предупреждения</value> + + 36 + + String + + 30 + + + + true + + + true + + + + ИспользуютсяПравилаКонвертации + 35 + + Boolean + + + true + + + true + + ЕстьПраваНаАдминистрированиеОбменов @@ -3136,6 +3390,30 @@ true + + ТребуетсяПерезагрузка + 5 + + Boolean + + + true + + + true + + + + КэшЗначений + 37 + + + true + + + true + + ОбновитьМонитор @@ -3190,15 +3468,15 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ИзменитьНастройкуСинхронизации</name> + <name>ИзменитьНастройкиСинхронизации</name> <title> <key>ru</key> - <value>Настроить...</value> + <value>Изменить настройки</value> 4 ru - Настроить правила синхронизации данных + Изменить настройки синхронизации данных true @@ -3208,7 +3486,7 @@ - ИзменитьУзелИнформационнойБазы + ИзменитьНастройкиСинхронизации TextPicture @@ -3269,7 +3547,7 @@ НастроитьСценарииОбменаДанными <key>ru</key> - <value>Сценарии синхронизации данных</value> + <value>Синхронизация по расписанию</value> 5 @@ -3287,50 +3565,7 @@ НастроитьСценарииОбменаДанными - DontUse - Auto - - - УстановитьОбновление - - <key>ru</key> - <value>Установить обновление</value> - - 6 - - ru - Установить обновление - - - true - - - - УстановитьОбновление - - - DontUse - Auto - - - ОткрытьРезультатыСинхронизацииДанных - - <key>ru</key> - <value>Предупреждений нет</value> - - 16 - - ru - Открыть предупреждения при синхронизации данных - - - true - - - - ОткрытьРезультатыСинхронизацииДанных - - + Text DontUse Auto @@ -3363,7 +3598,7 @@ УдалитьНастройкуСинхронизации <key>ru</key> - <value>Удалить настройку синхронизации</value> + <value>Удалить настройку</value> 18 @@ -3414,12 +3649,12 @@ СоздатьНастройкуСинхронизации <key>ru</key> - <value>Новая синхронизация данных</value> + <value>Создать</value> 10 ru - Создать настройку синхронизации + Создать настройку новой синхронизации true @@ -3436,31 +3671,6 @@ Auto Auto
      - - ИнформацияПоОбмену - - <key>ru</key> - <value>Подробнее о синхронизации данных с этой программой</value> - - 2 - - ru - Информация по обмену - - - true - - - CommonPicture.Информация - - - - ИнформацияПоОбмену - - - DontUse - Auto - НачальнаяВыгрузкаДанных @@ -3512,6 +3722,72 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ПредыдущаяФормаПредупреждений</name> + <title> + <key>ru</key> + <value>Предыдущая форма предупреждений</value> + + 2 + + ru + Предыдущая форма предупреждений + + + true + + + + ПредыдущаяФормаПредупреждений + + + Auto + Auto + + + УстановитьОбновление + + <key>ru</key> + <value>Установить обновление</value> + + 6 + + ru + Установить обновление + + + true + + + + УстановитьОбновление + + + DontUse + Auto + + + НовыйКодПредопределенногоУзла + + <key>ru</key> + <value>Новый код предопределенного узла</value> + + 12 + + ru + Новый код предопределенного узла + + + true + + + + НовыйКодПредопределенногоУзла + + + Auto + Auto + diff --git a/SSL/src/CommonForms/СинхронизацияДанных/Help/ru.html b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Help/ru.html similarity index 78% rename from SSL/src/CommonForms/СинхронизацияДанных/Help/ru.html rename to SSL/src/CommonForms/НастройкиСинхронизацииДанных/Help/ru.html index e10b25844..4ff95419b 100644 --- a/SSL/src/CommonForms/СинхронизацияДанных/Help/ru.html +++ b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Help/ru.html @@ -5,34 +5,40 @@
      • Программа - наименование программы, с которой настроена данная синхронизация;
        -
      • +
      • +
      • Префикс информационной базы-корреспондента;
        -
      • +
      • +
      • Состояние синхронизации данных;
        -
      • -

        Информация по датам выполненных отправок и получений, для наглядности неуспешные отправки и получения данных отмечаются красным значком . Значком  обозначаются предупреждения. Отражается также состояние синхронизации (время, прошедшее с последней попытки синхронизации в минутах, Сейчас, Никогда):

        -
        • -

          Данные отправлены - отражается время последней отправки данных;

          -
        • -
          Данные получены - отражается время последнего получения данных.
      •  - синхронизация данных выполняется по расписанию. В этой колонке проставляется аналогичный значок для синхронизаций, которые выполняются автоматически по заданному сценарию; +
      • +
      • Информация по датам выполненных отправок и получений, для наглядности неуспешные отправки и получения данных отмечаются красным значком . Отражается также состояние синхронизации (время, прошедшее с последней попытки синхронизации в минутах, Сейчас, Никогда). 
      • +
      • Если при синхронизации произошли ошибки или она не состоялась, по ссылке можно просмотреть список ошибок и проблем. Ссылка также показывает количество предупреждений, перейдя по ссылке можно ознакомиться с предупреждениями, возникшими при синхронизации данных:
      • +
        • Данные отправлены - отражается время последней отправки данных, ссылка показывает количество предупреждений;
        • +
        • Данные получены - отражается время последнего получения данных, ссылка показывает количество предупреждений.
      •  - синхронизация данных выполняется по расписанию. В этой колонке проставляется аналогичный значок для синхронизаций, которые выполняются автоматически по заданному сценарию;
        -
      • В нижней части списка выводится Префикс этой информационной базы.

      Состояния синхронизации данных

      + +
    • В нижней части списка выводится Префикс этой информационной базы.
    • Состояния синхронизации данных

      • В списке в соответствующей колонке отражаются Состояния синхронизации данных:
        • Прошлый запуск - синхронизация успешно настроена и работает, при этом указывается дата запуска синхронизации данных;
          -
        • +
        • +
        • Не запускалась - синхронизация успешно настроена, но обмен данными еще не производился. В этом случае нажмите кнопку Запустить синхронизацию;
          -
        • +
        • +
        • Настройка не завершена - настройка синхронизации была прервана. В этом случае можно продолжить настройку, нажав кнопку Настроить.
          -
        • +
        • +
        • Настройка не завершена, получены данные для сопоставления - в таком состоянии настройка синхронизации данных между разными программами отражается в программе-приемнике в случае прямого подключения и тогда необходимо продолжать настройку;
          -
        • +
        • +
        • Получены данные для сопоставления - для анализа и сопоставления полученных данных нажмите кнопку Запустить синхронизацию.

      Настройка синхронизации данных

      • Для настройки новой синхронизации данных с другой программой выберите соответствующую команду из подменю Новая синхронизация данных. Откроется настройка синхронизации данных.

      Просмотр информации о настройке

      @@ -40,11 +46,13 @@
      Для того чтобы получить информацию об особенностях ведения учета в программах, между которыми настроена синхронизация данных и получить рекомендации по настройке синхронизации данных, нажмите Еще - Подробнее о синхронизации данных с этой программой.

      Синхронизация данных

      • Выделите нужную настройку, нажмите  Запустить синхронизацию, для того чтобы начать синхронизацию данных.
        -
      • +
      • +
      • Для синхронизации данных между двумя программами запускается сопоставление одинаковых данных. Такая процедура полезна в тех случаях, когда в обеих программах по каким-то причинам были независимо друг от друга введены одни и те же данные. Для снижения вероятности таких ситуаций можно настроить частую синхронизацию данных по расписанию.

      Изменение синхронизации данных

      • Для того чтобы изменить или продолжить настройку синхронизации данных, нажмите кнопку Настроить.
        -
      • +
      • +
      • Также можно воспользоваться двойным щелчком мыши.

      Просмотр состава отправляемых данных

      Выгрузка данных для сопоставления

      @@ -52,32 +60,39 @@
      Выполните команду меню Еще - Выгрузка данных для сопоставления. 

      Настройка синхронизации по расписанию

      • С помощью команды Еще - Сценарии синхронизации данных можно  Настроить синхронизацию данных по заданному расписанию. В этом случае в клиент-серверном режиме работы синхронизация данных будет выполняться в фоне, с помощью регламентного задания Синхронизация данных, а в файловом режиме дополнительно потребуется запустить отдельный сеанс для выполнения регламентных заданий.
        -
      • -
        Также команду можно найти в контекстном меню по правой кнопке мыши.

      Просмотр предупреждений

      -
      • -
        Пройдите по ссылке  Предупреждения (в скобках отражается количество предупреждений), для того чтобы подробнее ознакомиться с предупреждениями при синхронизации данных.

      Просмотр журнала регистрации

      + +
    • +
      Также команду можно найти в контекстном меню по правой кнопке мыши.
    • Просмотр журнала регистрации

      • С помощью команд меню Еще - События отправки данных или События получения данных можно подробно узнать, как проходила синхронизация данных, из журнала регистрации программы, отфильтрованного по событиям синхронизации, а также просмотреть каждое событие.

      Замена правил для синхронизации из внешнего файла

      • Для замены типовых правил конвертации объектов и правил регистрации объектов правилами из внешнего файла необходимо:
        • Открыть синхронизацию данных, для которой требуется изменить правила. -
        • Выполнить команду Еще - Загрузить правила. -
        • В окне правил конвертации или регистрации объектов установить значение переключателя в положение Загрузить из файла на компьютере и по кнопке Загрузить выбрать файл правил на компьютере или в сетевой папке.
        • Обратить внимание, что загружены корректные правила, подходящие для используемых версий программы-источника и программы-приемника. -
        • Нажать на кнопку Записать и закрыть. Загруженные правила будут применены немедленно.

      Удаление настройки синхронизации

      + +
    • Выполнить команду Еще - Загрузить правила. +
    • +
    • В окне правил конвертации или регистрации объектов установить значение переключателя в положение Загрузить из файла на компьютере и по кнопке Загрузить выбрать файл правил на компьютере или в сетевой папке.
      • Обратить внимание, что загружены корректные правила, подходящие для используемых версий программы-источника и программы-приемника. +
      • +
      • Нажать на кнопку Записать и закрыть. Загруженные правила будут применены немедленно.

      Удаление настройки синхронизации

      • Выделите настройку, нажмите Еще -  Удалить настройку синхронизации.
        -
      • +
      • +
      • Внимание! Настройка будет удалена безвозвратно.

      Действия при восстановлении информационной базы из резервной копии

      • При восстановлении информационной базы из резервной копии рекомендуется:
        • Временно отключить автоматическое выполнение синхронизации данных (снять флажок Автоматически по расписанию во всех сценариях синхронизации данных);
          -
        • +
        • +
        • Отменить отправку данных, приготовленных для других программ (для каждой настройки синхронизации данных выполнить команду Еще – Состав отправляемых данных, в открывшемся окне Регистрация изменений в дереве объектов отметить корень и выполнить команду Отменить регистрацию – Всех объектов выбранных типов);
          -
        • +
        • +
        • Заново выполнить отправку данных, введенных в других программах с момента выполнения резервной копии этой информационной базы, из других программ в эту информационную базу;
          -
        • -
          Восстановить автоматическое выполнение синхронизации данных.
      • +
      • +
      • +
        Восстановить автоматическое выполнение синхронизации данных.
      +
    • При потере существенной части данных рекомендуется удалить все настройки синхронизации данных с другими программами и выполнить настройку синхронизации заново. В противном случае, может произойти потеря данных в программах, с которыми настроена синхронизация, из-за отправки в них устаревших данных из восстановленной информационной базы.
    • См. также:

      \ No newline at end of file diff --git a/SSL/src/CommonForms/СинхронизацияДанных/Module.bsl b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Module.bsl similarity index 56% rename from SSL/src/CommonForms/СинхронизацияДанных/Module.bsl rename to SSL/src/CommonForms/НастройкиСинхронизацииДанных/Module.bsl index 3e3f51427..5ef748b47 100644 --- a/SSL/src/CommonForms/СинхронизацияДанных/Module.bsl +++ b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/Module.bsl @@ -14,14 +14,37 @@ УстановитьУсловноеОформление(); ПроверитьВозможностьНастройкиСинхронизацииДанных(Отказ); - Если Отказ Тогда + Возврат; + КонецЕсли; - НавигационнаяСсылка = "e1cib/app/ОбщаяФорма.СинхронизацияДанных"; + НавигационнаяСсылка = "e1cib/app/ОбщаяФорма.НастройкиСинхронизацииДанных"; + ЕстьПраваНаАдминистрированиеОбменов = ОбменДаннымиСервер.ЕстьПраваНаАдминистрированиеОбменов(); + ЕстьПраваНаПросмотрЖурналаРегистрации = ПравоДоступа("ЖурналРегистрации", Метаданные); + ЕстьПраваНаВыполнениеОбновленияКонфигурации = ПравоДоступа("ОбновлениеКонфигурацииБазыДанных", Метаданные); + ПрефиксИБ = ОбменДаннымиСервер.ПрефиксИнформационнойБазы(); + МодельСервиса = ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); - ИнициализироватьРеквизитыФормы(); + ПодсистемаВерсионированияСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов"); + + КэшЗначений = Новый Структура; + КэшЗначений.Вставить("ПодсистемаВерсионированияСуществует", ПодсистемаВерсионированияСуществует); + КэшЗначений.Вставить("НепринятыеДанныеПоКоллизии", Неопределено); + КэшЗначений.Вставить("ПринятыеДанныеПоКоллизии", Неопределено); + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе", Неопределено); + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектСуществуетВБазе", Неопределено); + + Если ПодсистемаВерсионированияСуществует Тогда + + МенеджерПеречисления = Перечисления["ТипыВерсийОбъекта"]; + КэшЗначений.НепринятыеДанныеПоКоллизии = МенеджерПеречисления.НепринятыеДанныеПоКоллизии; + КэшЗначений.ПринятыеДанныеПоКоллизии = МенеджерПеречисления.ПринятыеДанныеПоКоллизии; + КэшЗначений.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе = МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе; + КэшЗначений.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе = МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе; + + КонецЕсли; УстановитьОтображениеЭлементовФормы(); @@ -55,41 +78,32 @@ #КонецОбласти -#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокСостоянияУзлов +#Область ОбработчикиСобытийЭлементовШапкиФормы &НаКлиенте Процедура СписокПриложенийВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); - - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; - - ОткрытьФормуНастройкиПараметровСинхронизации(ТекущиеДанные); - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПриложенийПриАктивизацииСтроки(Элемент) - - ТекущиеДанные = Элементы.СписокПриложений.ТекущиеДанные; - - Если ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; + Если Поле.Имя = "СписокПриложенийСостояниеВыгрузкиКартинка" + ИЛИ Поле.Имя = "СписокПриложенийПредставлениеДатыПоследнейУспешнойВыгрузки" + ИЛИ Поле.Имя = "СписокПриложенийОтправкаПредупреждения" + Тогда - Элементы.СписокПриложенийВыполнитьСинхронизациюСДополнительнымиОтборами.Доступность = - ТекущиеДанные.ДоступнаИнтерактивнаяОтправка И Не ТекущиеДанные.ЗапускОбменаИзКорреспондента; + ВыполнитьКомандуСПредварительнойПроверкой("ОткрытьРезультатыСинхронизацииСобытияВыгрузки"); + + ИначеЕсли Поле.Имя = "СписокПриложенийСостояниеЗагрузкиКартинка" + ИЛИ Поле.Имя = "СписокПриложенийПредставлениеДатыПоследнейУспешнойЗагрузки" + ИЛИ Поле.Имя = "СписокПриложенийПолучениеПредупреждения" + Тогда + + ВыполнитьКомандуСПредварительнойПроверкой("ОткрытьРезультатыСинхронизацииСобытияЗагрузки"); + + Иначе + + ВыполнитьКомандуСПредварительнойПроверкой("ИзменитьНастройкиСинхронизации"); + + КонецЕсли; КонецПроцедуры @@ -100,63 +114,140 @@ &НаКлиенте Процедура ВыполнитьСинхронизацию(Команда) - ОбработкаКомандыВыполненияСинхронизации(); + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура ВыполнитьСинхронизациюСДополнительнымиОтборами(Команда) - ОбработкаКомандыВыполненияСинхронизации(Истина); + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьНастройкиСинхронизации(Команда) + + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); + +КонецПроцедуры + +&НаКлиенте +Процедура СоставОтправляемыхДанных(Команда) + + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура НастроитьСценарииОбменаДанными(Команда) - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); - - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; - - ОбменДаннымиКлиент.ОбработкаКомандыНастроитьРасписаниеВыполненияОбмена(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект); + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); КонецПроцедуры &НаКлиенте -Процедура ОбновитьМонитор(Команда) +Процедура УдалитьНастройкуСинхронизации(Команда) - ОбновитьДанныеМонитораИнтерактивно(); + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); КонецПроцедуры &НаКлиенте -Процедура ИзменитьУзелИнформационнойБазы(Команда) +Процедура ЗагрузитьПравилаСинхронизацииДанных(Команда) - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); +КонецПроцедуры + +&НаКлиенте +Процедура НачальнаяВыгрузкаДанных(Команда) + + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); + +КонецПроцедуры + +&НаКлиенте +Процедура НовыйКодПредопределенногоУзла(Команда) + + Список = ПланыОбменаСПоддержкойИдентификаторов(); + + Если Список.Количество() = 0 Тогда + + ПоказатьПредупреждение(,НСтр("ru = 'Нет планов обмена, доступных для установки нового кода'")); + + ИначеЕсли Список.Количество() = 1 Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ИмяПланаОбмена", Список[0].Значение); + + ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.НовыйКодПредопределенногоУзла", + ПараметрыФормы, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + Иначе + + ОбработкаОповещения = Новый ОписаниеОповещения("НовыйКодПредопределенногоУзлаЗавершение", ЭтотОбъект); + Список.ПоказатьВыборЭлемента(ОбработкаОповещения, НСтр("ru = 'Выберите план обмена'")) + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ПланыОбменаСПоддержкойИдентификаторов() + + Результат = Новый СписокЗначений; + + Для Каждого ИмяПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл + + Узел = ПланыОбмена[ИмяПланаОбмена].ЭтотУзел(); + + Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(Узел) + И ОбменДаннымиXDTOСервер.ПоддерживаетсяВерсияСИдентификаторомОбменаДанными(Узел) Тогда + + Результат.Добавить(ИмяПланаОбмена, Метаданные.ПланыОбмена[ИмяПланаОбмена]); + + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура НовыйКодПредопределенногоУзлаЗавершение(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда Возврат; КонецЕсли; - ОткрытьФормуНастройкиПараметровСинхронизации(ТекущиеДанные); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ИмяПланаОбмена", Результат.Значение); + + ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.НовыйКодПредопределенногоУзла", + ПараметрыФормы, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредыдущаяФормаПредупреждений(Команда) + + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных(Команда) - ПерейтиВЖурналРегистрацииСобытий("ЗагрузкаДанных"); + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных(Команда) - ПерейтиВЖурналРегистрацииСобытий("ВыгрузкаДанных"); + ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя); КонецПроцедуры @@ -167,66 +258,205 @@ КонецПроцедуры -&НаКлиенте -Процедура ИнформацияПоОбмену(Команда) - - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); - - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; - - СсылкаНаПодробноеОписание = ПодробнаяИнформацияНаСервере(ТекущиеДанные.УзелИнформационнойБазы); - - ОбменДаннымиКлиент.ОткрытьПодробноеОписаниеСинхронизации(СсылкаНаПодробноеОписание); - -КонецПроцедуры +#Область КомандыНеТребующиеПроверкиАктуальности &НаКлиенте -Процедура ОткрытьРезультатыСинхронизацииДанных(Команда) +Процедура ОбновитьМонитор(Команда) - ОбменДаннымиКлиент.ОткрытьРезультатыОбменаДанными(МассивИспользуемыхУзлов(СписокПриложений)); - -КонецПроцедуры - -&НаКлиенте -Процедура СоставОтправляемыхДанных(Команда) - - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); - - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; - - ОбменДаннымиКлиент.ОткрытьСоставОтправляемыхДанных(ТекущиеДанные.УзелИнформационнойБазы); + ОбновитьДанныеМонитораИнтерактивно(); КонецПроцедуры &НаКлиенте Процедура СоздатьНастройкуСинхронизации(Команда) - ОбменДаннымиКлиент.ОткрытьФормуНастройкиНовойСинхронизацииДанных(ФормаНовойСинхронизацииДанных, - ПараметрыФормыНовойСинхронизацииДанных); + ОбменДаннымиКлиент.ОткрытьФормуНастройкиНовойСинхронизацииДанных(ФормаНовойСинхронизацииДанных, ПараметрыФормыНовойСинхронизацииДанных); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ВыполнениеКоманд + +&НаКлиенте +Процедура ОбработкаКомандыВыполненияСинхронизации(ТекущиеДанные, ИспользоватьДопОтборы = Ложь) + Перем ДанныеДляЗавершенияНастройки; + + ОписаниеСтрокиПриложения = Новый Структура; + ОписаниеСтрокиПриложения.Вставить("УзелИнформационнойБазы", ТекущиеДанные.УзелИнформационнойБазы); + ОписаниеСтрокиПриложения.Вставить("ИмяПланаОбмена", ТекущиеДанные.ИмяПланаОбмена); + ОписаниеСтрокиПриложения.Вставить("ВерсияКорреспондента", ТекущиеДанные.ВерсияКорреспондента); + ОписаниеСтрокиПриложения.Вставить("ВнешняяСистема", ТекущиеДанные.ВнешняяСистема); + ОписаниеСтрокиПриложения.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанных); + ОписаниеСтрокиПриложения.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); + ОписаниеСтрокиПриложения.Вставить("ЗапускОбменаИзКорреспондента", ТекущиеДанные.ЗапускОбменаИзКорреспондента); + ОписаниеСтрокиПриложения.Вставить("ДоступнаИнтерактивнаяОтправка", ТекущиеДанные.ДоступнаИнтерактивнаяОтправка); + ОписаниеСтрокиПриложения.Вставить("ВариантОбменаДанными", ТекущиеДанные.ВариантОбменаДанными); + ОписаниеСтрокиПриложения.Вставить("ИспользоватьДопОтборы", ИспользоватьДопОтборы); + ОписаниеСтрокиПриложения.Вставить("ЭтоНачальнаяВыгрузка", Ложь); + ОписаниеСтрокиПриложения.Вставить("ОписаниеОшибки", Неопределено); + + РезультатыПроверок = СерверныеПроверкиПередВыполнениемКоманд(ОписаниеСтрокиПриложения, ДанныеДляЗавершенияНастройки, "Максимум"); + ОписаниеСтрокиПриложения.Вставить("ПолученоСообщениеДляСопоставленияДанных", РезультатыПроверок.ПолученоСообщениеДляСопоставления); + + Если РезультатыПроверок.ПродолжитьНастройкуНовойСинхронизации Тогда + + Если ТекущиеДанные.ВнешняяСистема + И РезультатыПроверок.ФоновоеЗаданиеНастройки <> Неопределено Тогда + + ОписаниеСтрокиПриложения.Вставить("ОбменДаннымиСВнешнейСистемой", Истина); + ОткрытьФормуОжиданияОкончанияНастройки(РезультатыПроверок.ФоновоеЗаданиеНастройки, ОписаниеСтрокиПриложения); + + Иначе + + ЗавершитьНастройкуСинхронизацииВДиалоге(ОписаниеСтрокиПриложения, ДанныеДляЗавершенияНастройки); + + КонецЕсли; + + ИначеЕсли ОписаниеСтрокиПриложения.ЗапускОбменаИзКорреспондента + И НЕ РезультатыПроверок.ПолученоСообщениеДляСопоставления Тогда + + ШаблонПредупреждения = НСтр("ru = 'Запуск синхронизации с ""%1"" из этой программы не поддерживается. + |Перейдите в ""%1"" и запустите синхронизацию из нее.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ПоказатьПредупреждение(, СтрШаблон(ШаблонПредупреждения, ТекущиеДанные.НаименованиеКорреспондента)); + + ИначеЕсли НЕ ОписаниеСтрокиПриложения.ЭтоОбменСПриложениемВСервисе + И НЕ РезультатыПроверок.ПравилаКонвертацииСовместимы Тогда + + ДиалогПользователяСНесовместимымиПравилами(ОписаниеСтрокиПриложения, РезультатыПроверок.ОписаниеОшибки); + + Иначе + + СинхронизацияДанных(ОписаниеСтрокиПриложения); + + КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура УдалитьНастройкуСинхронизации(Команда) +Процедура ОткрытьФормуНастройкиПараметровСинхронизации(ТекущиеДанные) + Перем ДанныеДляЗавершенияНастройки; - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); + ОписаниеСтрокиПриложения = Новый Структура; + ОписаниеСтрокиПриложения.Вставить("УзелИнформационнойБазы", ТекущиеДанные.УзелИнформационнойБазы); + ОписаниеСтрокиПриложения.Вставить("ИмяПланаОбмена", ТекущиеДанные.ИмяПланаОбмена); + ОписаниеСтрокиПриложения.Вставить("ВерсияКорреспондента", ТекущиеДанные.ВерсияКорреспондента); + ОписаниеСтрокиПриложения.Вставить("ВнешняяСистема", ТекущиеДанные.ВнешняяСистема); + ОписаниеСтрокиПриложения.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанных); + ОписаниеСтрокиПриложения.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); + ОписаниеСтрокиПриложения.Вставить("ЭтоНачальнаяВыгрузка", Истина); - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; + РезультатыПроверок = СерверныеПроверкиПередВыполнениемКоманд(ОписаниеСтрокиПриложения, ДанныеДляЗавершенияНастройки, "Минимум"); + Если РезультатыПроверок.ПродолжитьНастройкуНовойСинхронизации Тогда + + Если ТекущиеДанные.ВнешняяСистема + И РезультатыПроверок.ФоновоеЗаданиеНастройки <> Неопределено Тогда + + ОписаниеСтрокиПриложения.Вставить("ОбменДаннымиСВнешнейСистемой", Истина); + ОткрытьФормуОжиданияОкончанияНастройки(РезультатыПроверок.ФоновоеЗаданиеНастройки, ОписаниеСтрокиПриложения); + + Иначе + + ОткрытьФормуПомощникаНастройкиНовойСинхронизации(ОписаниеСтрокиПриложения, ДанныеДляЗавершенияНастройки); + + КонецЕсли; + + Иначе + + ПараметрыПомощника = Новый Структура; + ПараметрыПомощника.Вставить("Ключ", ОписаниеСтрокиПриложения.УзелИнформационнойБазы); + + ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗавершенияНастройкиПараметровСинхронизации", ЭтотОбъект); + + ИмяОткрываемойФормы = СтрШаблон("ПланОбмена.%1.ФормаОбъекта", ОписаниеСтрокиПриложения.ИмяПланаОбмена); + ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыПомощника, ЭтотОбъект, , , , ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗавершенияНастройкиПараметровСинхронизации(РезультатЗакрытия, ДополнительныеПараметры) Экспорт + + ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораИнтерактивно", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРезультатыСинхронизации(ДанныеТекущейСтроки = Неопределено, ИмяНабораСобытий = "") + + МассивУзловПланаОбмена = Новый Массив; + Для Каждого СтрокаМонитора Из СписокПриложений Цикл + + МассивУзловПланаОбмена.Добавить(СтрокаМонитора.УзелИнформационнойБазы); + + КонецЦикла; + + ОтборУзловПланаОбмена = Новый Массив; + Если ДанныеТекущейСтроки <> Неопределено Тогда + + ОтборУзловПланаОбмена.Добавить(ДанныеТекущейСтроки.УзелИнформационнойБазы); + + КонецЕсли; + + ОтборТипыПредупреждений = Новый Массив; + Если ПустаяСтрока(ИмяНабораСобытий) + ИЛИ ИмяНабораСобытий = "СобытияВыгрузки" Тогда + + ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта")); + ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных")); + + КонецЕсли; + + Если ПустаяСтрока(ИмяНабораСобытий) + ИЛИ ИмяНабораСобытий = "СобытияЗагрузки" Тогда + + ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент")); + ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты")); + ОтборТипыПредупреждений.Добавить(ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных")); + + Если КэшЗначений.ПодсистемаВерсионированияСуществует Тогда + + ОтборТипыПредупреждений.Добавить(КэшЗначений.НепринятыеДанныеПоКоллизии); + ОтборТипыПредупреждений.Добавить(КэшЗначений.ПринятыеДанныеПоКоллизии); + ОтборТипыПредупреждений.Добавить(КэшЗначений.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе); + ОтборТипыПредупреждений.Добавить(КэшЗначений.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе); + + КонецЕсли; + + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("УзлыОбмена", МассивУзловПланаОбмена); + ПараметрыФормы.Вставить("ОтборУзловОбменов", ОтборУзловПланаОбмена); + ПараметрыФормы.Вставить("ОтборТипыПредупреждений", ОтборТипыПредупреждений); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияФормыПредупреждений", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупрежденияСинхронизаций", ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОткрытияФормыПредупреждений(Результат, ДополнительныеПараметры) Экспорт + + ОбновитьДанныеМонитораИнтерактивно(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьУдалениеНастройкиСинхронизации(ТекущиеДанные) + Если ТекущиеДанные.ЭтоОбменСПриложениемВСервисе И ТекущиеДанные.НастройкаСинхронизацииВМенеджереСервиса Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Для удаления настройки синхронизации данных перейдите в менеджер сервиса. - |В менеджере сервиса воспользуйтесь командой ""Синхронизация данных"".'")); + ПоказатьПредупреждение(, НСтр("ru = 'Для удаления настройки синхронизации данных перейдите в личный кабинет облачной программы и + |воспользуйтесь командой ""Синхронизация данных"".'")); Иначе @@ -237,32 +467,27 @@ ПараметрыПомощника.Вставить("НаименованиеКорреспондента", ТекущиеДанные.НаименованиеКорреспондента); ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); - ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.УдалениеНастройкиСинхронизации", - ПараметрыПомощника, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + ИмяОткрываемойФормы = "Обработка.ПомощникСозданияОбменаДанными.Форма.УдалениеНастройкиСинхронизации"; + ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыПомощника, ЭтотОбъект); КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ЗагрузитьПравилаСинхронизацииДанных(Команда) +Процедура ВыполнитьЗагрузкуПравилСинхронизацииДанных(ТекущиеДанные) - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); - - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; - - СведенияОПланеОбмена = СведенияОПланеОбмена(ТекущиеДанные.ИмяПланаОбмена); - - Если СведенияОПланеОбмена.ИспользуютсяПравилаКонвертации Тогда - ОбменДаннымиКлиент.ЗагрузитьПравилаСинхронизацииДанных(СведенияОПланеОбмена.ИмяПланаОбмена); + Если ТекущиеДанные.ИспользуютсяПравилаКонвертации Тогда + + ОбменДаннымиКлиент.ЗагрузитьПравилаСинхронизацииДанных(ТекущиеДанные.ИмяПланаОбмена); + Иначе + ВидПравил = ПредопределенноеЗначение("Перечисление.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов"); - Отбор = Новый Структура("ИмяПланаОбмена, ВидПравил", СведенияОПланеОбмена.ИмяПланаОбмена, ВидПравил); - ЗначенияЗаполнения = Новый Структура("ИмяПланаОбмена, ВидПравил", СведенияОПланеОбмена.ИмяПланаОбмена, ВидПравил); + Отбор = Новый Структура("ИмяПланаОбмена, ВидПравил", ТекущиеДанные.ИмяПланаОбмена, ВидПравил); + ЗначенияЗаполнения = Новый Структура("ИмяПланаОбмена, ВидПравил", ТекущиеДанные.ИмяПланаОбмена, ВидПравил); + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "ПравилаДляОбменаДанными", ТекущиеДанные.УзелИнформационнойБазы, "ПравилаРегистрацииОбъектов"); @@ -271,144 +496,49 @@ КонецПроцедуры &НаКлиенте -Процедура НачальнаяВыгрузкаДанных(Команда) +Процедура ВыполнитьНачальнуюВыгрузкуДанных(ТекущиеДанные) + Перем ДанныеДляЗавершенияНастройки; - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); + ОписаниеСтрокиПриложения = Новый Структура; + ОписаниеСтрокиПриложения.Вставить("УзелИнформационнойБазы", ТекущиеДанные.УзелИнформационнойБазы); + ОписаниеСтрокиПриложения.Вставить("ИмяПланаОбмена", ТекущиеДанные.ИмяПланаОбмена); + ОписаниеСтрокиПриложения.Вставить("ВерсияКорреспондента", ТекущиеДанные.ВерсияКорреспондента); + ОписаниеСтрокиПриложения.Вставить("ВнешняяСистема", ТекущиеДанные.ВнешняяСистема); + ОписаниеСтрокиПриложения.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанных); + ОписаниеСтрокиПриложения.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); + ОписаниеСтрокиПриложения.Вставить("ЭтоНачальнаяВыгрузка", Истина); - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; - - ДанныеДляЗавершенияНастройки = Неопределено; - Если ПродолжитьНастройкуНовойСинхронизации(ТекущиеДанные, ДанныеДляЗавершенияНастройки) Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ТекущиеДанные", ТекущиеДанные); - ДополнительныеПараметры.Вставить("ДанныеДляЗавершенияНастройки", ДанныеДляЗавершенияНастройки); + ПродолжитьНастройкуНовойСинхронизации = НЕ НастройкаСинхронизацииЗавершена(ОписаниеСтрокиПриложения, ДанныеДляЗавершенияНастройки); + Если ПродолжитьНастройкуНовойСинхронизации Тогда + + ЗавершитьНастройкуСинхронизацииВДиалоге(ОписаниеСтрокиПриложения, ДанныеДляЗавершенияНастройки); + + ИначеЕсли НЕ ТекущиеДанные.ДоступнаИнтерактивнаяОтправка Тогда - ОповещениеЗавершения = Новый ОписаниеОповещения("ВопросПродолжитьНастройкуСинхронизацииЗавершение", ЭтотОбъект, ДополнительныеПараметры); - ПоказатьВопрос(ОповещениеЗавершения, - НСтр("ru = 'Перед выгрузкой данных для сопоставления необходимо завершить настройку синхронизации. - |Открыть форму помощника настройки?'"), - РежимДиалогаВопрос.ДаНет); - ИначеЕсли Не ТекущиеДанные.ДоступнаИнтерактивнаяОтправка Тогда ПоказатьПредупреждение(, НСтр("ru = 'Для выбранного варианта настройки синхронизации выгрузка данных для сопоставления не поддерживается.'")); - Возврат; + Иначе + ПараметрыПомощника = Новый Структура; ПараметрыПомощника.Вставить("УзелОбмена", ТекущиеДанные.УзелИнформационнойБазы); ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); ПараметрыПомощника.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанных); + Если ДанныеДляЗавершенияНастройки.ПассивноеПодключение Тогда + ПараметрыПомощника.Вставить("НачальнаяВыгрузка", Истина); + КонецЕсли; ОповещениеОЗакрытии = Новый ОписаниеОповещения("НачальнаяВыгрузкаДанныхЗавершение", ЭтотОбъект); - ОткрытьФорму("Обработка.ПомощникИнтерактивногоОбменаДанными.Форма.ВыгрузкаДанныхДляСопоставления", - ПараметрыПомощника, ЭтотОбъект, , , , ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + ИмяОткрываемойФормы = "Обработка.ПомощникИнтерактивногоОбменаДанными.Форма.ВыгрузкаДанныхДляСопоставления"; + ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыПомощника, ЭтотОбъект, , , , ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервере -Процедура УстановитьУсловноеОформление() - - УсловноеОформление.Элементы.Очистить(); - - // Тусклый цвет шрифта настроенной, но ни разу не запускавшейся синхронизации. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеПредставление.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеПредставление"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = НСтр("ru = 'Не запускалась'"); - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - - // Текст "н/д" и тусклый цвет шрифта для отсутствующего префикса программы-корреспондента. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийПрефиксКорреспондента.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.ПрефиксКорреспондента"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'н/д'")); - - // Особый цвет шрифта синхронизации, по которой не завершена настройка. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеПредставление.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеПредставление"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = НСтр("ru = 'Настройка не завершена'"); - Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноКрасный); - - // Скрыть пустую картинку состояния синхронизации данных. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеКартинка.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеКартинка"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = 0; - - Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - - // Скрыть пустую картинку состояния выгрузки данных. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеВыгрузкиКартинка.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеВыгрузкиКартинка"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = 0; - - Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - - // Скрыть пустую картинку состояния загрузки данных. - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеЗагрузкиКартинка.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеЗагрузкиКартинка"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = 0; - - Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); - -КонецПроцедуры - -&НаКлиенте -Процедура ВопросПродолжитьНастройкуСинхронизацииЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт - - Если Не РезультатВопроса = КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - ОткрытьФормуПомощникаНастройкиНовойСинхронизации( - ДополнительныеПараметры.ТекущиеДанные, - ДополнительныеПараметры.ДанныеДляЗавершенияНастройки); - -КонецПроцедуры - &НаКлиенте Процедура НачальнаяВыгрузкаДанныхЗавершение(РезультатЗакрытия, ДополнительныеПараметры) Экспорт @@ -417,30 +547,538 @@ КонецПроцедуры &НаКлиенте -Процедура ОткрытьФормуНастройкиПараметровСинхронизации(ТекущиеДанные) +Процедура ПерейтиВЖурналРегистрацииСобытий(ТекущиеДанные, ДействиеПриОбмене) - ДанныеДляЗавершенияНастройки = Неопределено; - Если ПродолжитьНастройкуНовойСинхронизации(ТекущиеДанные, ДанныеДляЗавершенияНастройки) Тогда - ОткрытьФормуПомощникаНастройкиНовойСинхронизации(ТекущиеДанные, ДанныеДляЗавершенияНастройки); - Возврат; - КонецЕсли; - - ОткрытьФормуУзлаПланаОбмена(ТекущиеДанные); + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект, ДействиеПриОбмене); КонецПроцедуры &НаКлиенте -Функция ПродолжитьНастройкуНовойСинхронизации(ТекущиеДанные, ДанныеДляЗавершенияНастройки) +Процедура ПредыдущаяФормаПредупрежденийСинхронизации() - СтрокаПриложение = Новый Структура("УзелИнформационнойБазы, ИмяПланаОбмена, ВерсияКорреспондента, ВнешняяСистема"); - ЗаполнитьЗначенияСвойств(СтрокаПриложение, ТекущиеДанные); + ПараметрыОткрытия = Новый Структура; + МассивУзловПланаОбмена = Новый Массив; - ДанныеДляЗавершенияНастройки = Неопределено; + Для Каждого СтрокаМонитора Из СписокПриложений Цикл + + МассивУзловПланаОбмена.Добавить(СтрокаМонитора.УзелИнформационнойБазы); + + КонецЦикла; - Возврат Не НастройкаСинхронизацииЗавершена(СтрокаПриложение, ДанныеДляЗавершенияНастройки); + ПараметрыОткрытия.Вставить("УзлыОбмена", МассивУзловПланаОбмена); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.Форма", ПараметрыОткрытия, ЭтотОбъект); + +КонецПроцедуры + +// Стартовый метод выполнения команд формы +// +&НаКлиенте +Процедура ВыполнитьКомандуСПредварительнойПроверкой(КомандаСтрокой) + + ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); + Если ТекущиеДанные = Неопределено Тогда + + ОбновитьДанныеМонитораИнтерактивно(); + Возврат; + + КонецЕсли; + + Если КомандаСтрокой = "ВыполнитьСинхронизацию" Тогда + + ОбработкаКомандыВыполненияСинхронизации(ТекущиеДанные, Ложь); + + ИначеЕсли КомандаСтрокой = "ВыполнитьСинхронизациюСДополнительнымиОтборами" Тогда + + ОбработкаКомандыВыполненияСинхронизации(ТекущиеДанные, Истина); + + ИначеЕсли КомандаСтрокой = "ИзменитьНастройкиСинхронизации" Тогда + + ОткрытьФормуНастройкиПараметровСинхронизации(ТекущиеДанные); + + ИначеЕсли КомандаСтрокой = "ОткрытьРезультатыСинхронизацииСобытияВыгрузки" Тогда + + ОткрытьРезультатыСинхронизации(ТекущиеДанные, "СобытияВыгрузки"); + + ИначеЕсли КомандаСтрокой = "ОткрытьРезультатыСинхронизацииСобытияЗагрузки" Тогда + + ОткрытьРезультатыСинхронизации(ТекущиеДанные, "СобытияЗагрузки"); + + ИначеЕсли КомандаСтрокой = "СоставОтправляемыхДанных" Тогда + + ОбменДаннымиКлиент.ОткрытьСоставОтправляемыхДанных(ТекущиеДанные.УзелИнформационнойБазы); + + ИначеЕсли КомандаСтрокой = "НастроитьСценарииОбменаДанными" Тогда + + ОбменДаннымиКлиент.ОбработкаКомандыНастроитьРасписаниеВыполненияОбмена(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект); + + ИначеЕсли КомандаСтрокой = "УдалитьНастройкуСинхронизации" Тогда + + ВыполнитьУдалениеНастройкиСинхронизации(ТекущиеДанные); + + ИначеЕсли КомандаСтрокой = "ЗагрузитьПравилаСинхронизацииДанных" Тогда + + ВыполнитьЗагрузкуПравилСинхронизацииДанных(ТекущиеДанные); + + ИначеЕсли КомандаСтрокой = "НачальнаяВыгрузкаДанных" Тогда + + ВыполнитьНачальнуюВыгрузкуДанных(ТекущиеДанные); + + ИначеЕсли КомандаСтрокой = "ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных" Тогда + + ПерейтиВЖурналРегистрацииСобытий(ТекущиеДанные, "ВыгрузкаДанных"); + + ИначеЕсли КомандаСтрокой = "ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных" Тогда + + ПерейтиВЖурналРегистрацииСобытий(ТекущиеДанные, "ЗагрузкаДанных"); + + ИначеЕсли КомандаСтрокой = "ПредыдущаяФормаПредупреждений" Тогда + + ПредыдущаяФормаПредупрежденийСинхронизации(); + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция НастройкаСинхронизацииЗавершена(СтрокаПриложение, ДанныеДляЗавершенияНастройки = Неопределено) + + МодульПомощник = ОбменДаннымиСервер.МодульПомощникСозданияОбменаДанными(); + ОписаниеВариантаНастройки = МодульПомощник.СтруктураОписанияВариантаНастройки(); + + ИдентификаторНастройки = ОбменДаннымиСервер.СохраненныйВариантНастройкиУзлаПланаОбмена(СтрокаПриложение.УзелИнформационнойБазы); + + Если Не СтрокаПриложение.ВнешняяСистема Тогда + ЗначенияНастроекДляВарианта = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(СтрокаПриложение.ИмяПланаОбмена, + "НаименованиеКонфигурацииКорреспондента, + |ЗаголовокКомандыДляСозданияНовогоОбменаДанными, + |ЗаголовокПомощникаСозданияОбмена, + |КраткаяИнформацияПоОбмену, + |ПодробнаяИнформацияПоОбмену", + ИдентификаторНастройки, + СтрокаПриложение.ВерсияКорреспондента); + + ЗаполнитьЗначенияСвойств(ОписаниеВариантаНастройки, ЗначенияНастроекДляВарианта); + ОписаниеВариантаНастройки.НаименованиеКорреспондента = ЗначенияНастроекДляВарианта.НаименованиеКонфигурацииКорреспондента; + КонецЕсли; + + НомераСообщений = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаПриложение.УзелИнформационнойБазы, "НомерПринятого, НомерОтправленного"); + ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(СтрокаПриложение.УзелИнформационнойБазы); + + Если Не ЗначениеЗаполнено(ВидТранспорта) Тогда + + ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим; + + КонецЕсли; + + ДанныеДляЗавершенияНастройки = Новый Структура; + ДанныеДляЗавершенияНастройки.Вставить("ИдентификаторНастройки", ИдентификаторНастройки); + ДанныеДляЗавершенияНастройки.Вставить("ОписаниеВариантаНастройки", ОписаниеВариантаНастройки); + ДанныеДляЗавершенияНастройки.Вставить("ПассивноеПодключение", ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим); + + Возврат ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(СтрокаПриложение.УзелИнформационнойБазы) + И Не (НомераСообщений.НомерПринятого = 0 + И НомераСообщений.НомерОтправленного = 0 + И ОбменДаннымиСервер.ПолученоСообщениеСДаннымиДляСопоставления(СтрокаПриложение.УзелИнформационнойБазы)); КонецФункции +&НаСервере +Функция СерверныеПроверкиПередВыполнениемКоманд(СтрокаПриложение, ДанныеДляЗавершенияНастройки, ВариантПроверки = "") + Перем ОписаниеОшибки; + + РезультатыПроверок = Новый Структура; + + НастройкаЗавершена = НастройкаСинхронизацииЗавершена(СтрокаПриложение, ДанныеДляЗавершенияНастройки); + РезультатыПроверок.Вставить("ПродолжитьНастройкуНовойСинхронизации", НЕ НастройкаЗавершена); + + ФоновоеЗаданиеНастройки = ФоновоеЗаданиеВариантыНастроекОбменаДаннымиСВнешнимиСистемами(СтрокаПриложение.УзелИнформационнойБазы, УникальныйИдентификатор); + РезультатыПроверок.Вставить("ФоновоеЗаданиеНастройки", ФоновоеЗаданиеНастройки); + + Если ВариантПроверки <> "Минимум" Тогда + + ПолученоСообщениеДляСопоставления = ОбменДаннымиСервер.ПолученоСообщениеСДаннымиДляСопоставления(СтрокаПриложение.УзелИнформационнойБазы); + РезультатыПроверок.Вставить("ПолученоСообщениеДляСопоставления", ПолученоСообщениеДляСопоставления); + + ПравилаКонвертацииСовместимы = ПравилаКонвертацииСовместимыСТекущейВерсией(СтрокаПриложение.ИмяПланаОбмена, ОписаниеОшибки); + РезультатыПроверок.Вставить("ПравилаКонвертацииСовместимы", ПравилаКонвертацииСовместимы); + РезультатыПроверок.Вставить("ОписаниеОшибки", ОписаниеОшибки); + + КонецЕсли; + + Возврат РезультатыПроверок; + +КонецФункции + +#КонецОбласти + +#Область ОбновлениеФормыСписка + +&НаКлиенте +Процедура ПриЗавершенииОбновленияДанныхМонитораВФоне() + + ПриЗавершенииПолученияСпискаПриложенийНаСервере(); + ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); + + ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииОбновленияДанныхМонитора() + + ПриЗавершенииПолученияСпискаПриложенийНаСервере(); + ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); + + Элементы.ПанельСписокПриложений.ТекущаяСтраница = Элементы.СтраницаСписокПриложений; + Элементы.КоманднаяПанель.Доступность = Истина; + + ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОжиданииОбновленияДанныхМонитораВФоне() + + ПродолжитьОжидание = Ложь; + ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + + ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); + ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитораВФоне", ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); + + Иначе + + ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено; + ПриЗавершенииОбновленияДанныхМонитораВФоне(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОжиданииОбновленияДанныхМонитора() + + ПродолжитьОжидание = Ложь; + ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + + ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); + ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитора", ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); + + Иначе + + ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено; + ПриЗавершенииОбновленияДанныхМонитора(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриНачалеОбновленияДанныхМонитораВФоне() + + Если Не ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено Тогда + + Возврат; + + КонецЕсли; + + ПараметрыОбработчикаПолученияСпискаПриложений = Неопределено; + ПродолжитьОжидание = Ложь; + + ПриНачалеПолученияСпискаПриложенийНаСервере(ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + + ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); + ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитораВФоне", ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); + + Иначе + + ПриЗавершенииОбновленияДанныхМонитораВФоне(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриНачалеОбновленияДанныхМонитора() + + Если Не ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено Тогда + + Возврат; + + КонецЕсли; + + ПараметрыОбработчикаПолученияСпискаПриложений = Неопределено; + ПродолжитьОжидание = Ложь; + + ПриНачалеПолученияСпискаПриложенийНаСервере(ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); + + Если ПродолжитьОжидание Тогда + + Элементы.ПанельСписокПриложений.ТекущаяСтраница = Элементы.СтраницаОжидание; + Элементы.КоманднаяПанель.Доступность = Ложь; + + ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); + ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитора", ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); + + Иначе + + ПриЗавершенииОбновленияДанныхМонитора(); + + КонецЕсли; + +КонецПроцедуры + +// Стартовая процедура обновления списка интерактивно +// +&НаКлиенте +Процедура ОбновитьДанныеМонитораИнтерактивно() + + ИндексСтрокиСписокПриложений = ПолучитьТекущийИндексСтроки(); + + Если МодельСервиса Тогда + + ПриНачалеОбновленияДанныхМонитора(); + + Иначе + + ОбновитьСписокПриложений(); + ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); + + ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); + + КонецЕсли; + +КонецПроцедуры + +// Стартовая процедура обновления списка интерактивно +// +&НаКлиенте +Процедура ОбновитьДанныеМонитораВФоне() + + ИндексСтрокиСписокПриложений = ПолучитьТекущийИндексСтроки(); + + ОбновитьПриложенияМоделиСервиса = МодельСервиса; + ОбновитьСписокПриложений(ОбновитьПриложенияМоделиСервиса); + + Если МодельСервиса + И ОбновитьПриложенияМоделиСервиса Тогда + + ПриНачалеОбновленияДанныхМонитораВФоне(); + + Иначе + + ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); + + ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Синхронизация + +&НаКлиенте +Процедура СинхронизацияДанных(ОписаниеСтрокиПриложения) + + РезультатДополнительнойПроверки = (ОписаниеСтрокиПриложения.ВариантОбменаДанными <> "Синхронизация" ИЛИ ОписаниеСтрокиПриложения.ИспользоватьДопОтборы); + + Если ОписаниеСтрокиПриложения.ПолученоСообщениеДляСопоставленияДанных + ИЛИ (ОписаниеСтрокиПриложения.ДоступнаИнтерактивнаяОтправка И РезультатДополнительнойПроверки) + Тогда + + ОткрытьПомощникИнтерактивнойСинхронизации(ОписаниеСтрокиПриложения); + + Иначе + + ОткрытьПомощникАвтоматическойСинхронизации(ОписаниеСтрокиПриложения); + + КонецЕсли; + +КонецПроцедуры + +// Стартовая процедура интерактивной синхронизации +// +&НаКлиенте +Процедура ОткрытьПомощникИнтерактивнойСинхронизации(ДополнительныеПараметры) + + РежимДополненияВыгрузки = ДополнительныеПараметры.ИспользоватьДопОтборы ИЛИ (ДополнительныеПараметры.ВариантОбменаДанными = "ПолучениеИОтправка"); + + ПараметрыПомощника = Новый Структура; + ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ДополнительныеПараметры.ЭтоОбменСПриложениемВСервисе); + ПараметрыПомощника.Вставить("ОбластьДанныхКорреспондента", ДополнительныеПараметры.ОбластьДанныхКорреспондента); + ПараметрыПомощника.Вставить("ОтправитьДанные", Не ДополнительныеПараметры.ЗапускОбменаИзКорреспондента); + ПараметрыПомощника.Вставить("РежимДополненияВыгрузки", РежимДополненияВыгрузки); + ПараметрыПомощника.Вставить("НастройкаРасписания", Ложь); + + ВспомогательныеПараметры = Новый Структура; + ВспомогательныеПараметры.Вставить("ПараметрыПомощника", ПараметрыПомощника); + ВспомогательныеПараметры.Вставить("ОповещениеОЗакрытии", Новый ОписаниеОповещения("ПослеЗакрытияПомощникаОбменов", ЭтотОбъект, ДополнительныеПараметры)); + + ОбменДаннымиКлиент.ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(ДополнительныеПараметры.УзелИнформационнойБазы, ЭтотОбъект, ВспомогательныеПараметры); + +КонецПроцедуры + +// Стартовая процедура автоматической синхронизации +// +&НаКлиенте +Процедура ОткрытьПомощникАвтоматическойСинхронизации(ДополнительныеПараметры) + + ПараметрыПомощника = Новый Структура; + ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ДополнительныеПараметры.ЭтоОбменСПриложениемВСервисе); + ПараметрыПомощника.Вставить("ОбластьДанныхКорреспондента", ДополнительныеПараметры.ОбластьДанныхКорреспондента); + + ВспомогательныеПараметры = Новый Структура; + ВспомогательныеПараметры.Вставить("ПараметрыПомощника", ПараметрыПомощника); + ВспомогательныеПараметры.Вставить("ОповещениеОЗакрытии", Новый ОписаниеОповещения("ПослеЗакрытияПомощникаОбменов", ЭтотОбъект, ДополнительныеПараметры)); + + ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(ДополнительныеПараметры.УзелИнформационнойБазы, ЭтотОбъект, , Истина, ВспомогательныеПараметры); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗакрытияПомощникаОбменов(Результат, ДополнительныеПараметры) Экспорт + + Если НЕ ДополнительныеПараметры.Свойство("УзелИнформационнойБазы") Тогда + + Возврат; + + КонецЕсли; + + ПараметрыОтбора = Новый Структура("УзелИнформационнойБазы", ДополнительныеПараметры.УзелИнформационнойБазы); + + НайденныеСтроки = СписокПриложений.НайтиСтроки(ПараметрыОтбора); + Если НайденныеСтроки.Количество() > 0 Тогда + + СтруктураЗаголовков = АктуализироватьИнформациюОПроблемахСинхронизацииДанных(ДополнительныеПараметры.УзелИнформационнойБазы); + НайденныеСтроки[0].ОтправкаПредупреждения = СтруктураЗаголовков.ЗаголовокПредупрежденийОтправки; + НайденныеСтроки[0].ПолучениеПредупреждения = СтруктураЗаголовков.ЗаголовокПредупрежденийПолучении; + + Иначе + + ОбновитьДанныеМонитораИнтерактивно(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +&НаКлиенте +Функция ПолучитьТекущийИндексСтроки() + + // Возвращаемое значение функции. + ИндексСтроки = Неопределено; + + // При обновлении монитора выполняем позиционирование курсора. + ТекущиеДанные = Элементы.СписокПриложений.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено Тогда + + ИндексСтроки = СписокПриложений.Индекс(ТекущиеДанные); + + КонецЕсли; + + Возврат ИндексСтроки; + +КонецФункции + +&НаКлиенте +Функция ТекущиеДанныеСпискаПриложений() + + ТекущиеДанные = Элементы.СписокПриложений.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + + Возврат ТекущиеДанные; + + КонецЕсли; + + Если Не УзелОбменаСуществует(ТекущиеДанные.УзелИнформационнойБазы) Тогда // Если строка протухла + + Возврат Неопределено; + + КонецЕсли; + + Возврат ТекущиеДанные; + +КонецФункции + +&НаКлиенте +Процедура ВыполнитьПозиционированиеКурсора(ИндексСтроки) + + Если ИндексСтроки <> Неопределено Тогда + + // Выполняем проверки позиционирования курсора после получения новых данных. + Если СписокПриложений.Количество() <> 0 Тогда + + Если ИндексСтроки > СписокПриложений.Количество() - 1 Тогда + + ИндексСтроки = СписокПриложений.Количество() - 1; + + КонецЕсли; + + // позиционируем курсор + Элементы.СписокПриложений.ТекущаяСтрока = СписокПриложений[ИндексСтроки].ПолучитьИдентификатор(); + + КонецЕсли; + + КонецЕсли; + + // Если спозиционировать строку не удалось, то устанавливаем текущей первую строку. + Если Элементы.СписокПриложений.ТекущаяСтрока = Неопределено + И СписокПриложений.Количество() <> 0 Тогда + + Элементы.СписокПриложений.ТекущаяСтрока = СписокПриложений[0].ПолучитьИдентификатор(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьНастройкуСинхронизацииВДиалоге(ОписаниеСтрокиПриложения, ДанныеДляЗавершенияНастройки) + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ТекущиеДанные", ОписаниеСтрокиПриложения); + ДополнительныеПараметры.Вставить("ДанныеДляЗавершенияНастройки", ДанныеДляЗавершенияНастройки); + + ОповещениеЗавершения = Новый ОписаниеОповещения("ВопросПродолжитьНастройкуСинхронизацииЗавершение", ЭтотОбъект, ДополнительныеПараметры); + + Если ОписаниеСтрокиПриложения.ЭтоНачальнаяВыгрузка Тогда + + ТекстЧасть1 = НСтр("ru = 'Перед выгрузкой данных для сопоставления необходимо завершить настройку синхронизации.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + Иначе + + ТекстЧасть1 = НСтр("ru = 'Перед запуском синхронизации данных необходимо завершить ее настройку.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + КонецЕсли; + + ТекстВопроса = ТекстЧасть1 + Символы.ПС + НСтр("ru = 'Открыть форму помощника настройки?'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ПоказатьВопрос(ОповещениеЗавершения, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура ВопросПродолжитьНастройкуСинхронизацииЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если Не РезультатВопроса = КодВозвратаДиалога.Да Тогда + + Возврат; + + КонецЕсли; + + ОткрытьФормуПомощникаНастройкиНовойСинхронизации(ДополнительныеПараметры.ТекущиеДанные, ДополнительныеПараметры.ДанныеДляЗавершенияНастройки); + +КонецПроцедуры + &НаКлиенте Процедура ОткрытьФормуПомощникаНастройкиНовойСинхронизации(ТекущиеДанные, ДанныеДляЗавершенияНастройки) @@ -448,91 +1086,52 @@ ПараметрыПомощника.Вставить("УзелОбмена", ТекущиеДанные.УзелИнформационнойБазы); ПараметрыПомощника.Вставить("ИмяПланаОбмена", ТекущиеДанные.ИмяПланаОбмена); ПараметрыПомощника.Вставить("ИдентификаторНастройки", ДанныеДляЗавершенияНастройки.ИдентификаторНастройки); - - Если МодельСервиса Тогда - ПараметрыПомощника.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанных); - ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); - КонецЕсли; - ПараметрыПомощника.Вставить("ОписаниеВариантаНастройки", ДанныеДляЗавершенияНастройки.ОписаниеВариантаНастройки); - ОповещениеОЗакрытии = Новый ОписаниеОповещения("ОткрытьФормуНастройкиПараметровСинхронизацииЗавершение", ЭтотОбъект); - - Если ТекущиеДанные.ВнешняяСистема Тогда - ПараметрыПомощника.Вставить("ОбменДаннымиСВнешнейСистемой", Истина); + Если МодельСервиса Тогда - ФоновоеЗадание = ФоновоеЗаданиеВариантыНастроекОбменаДаннымиСВнешнимиСистемами( - ПараметрыПомощника.УзелОбмена, УникальныйИдентификатор); + ПараметрыПомощника.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанныхКорреспондента); + ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); - Если Не ФоновоеЗадание = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ПараметрыПомощника", ПараметрыПомощника); - ДополнительныеПараметры.Вставить("ОповещениеОЗакрытии", ОповещениеОЗакрытии); - - ОповещениеОЗавершении = Новый ОписаниеОповещения( - "ПриЗавершенииПолученияВариантовНастроекОбменаДаннымиСВнешнимиСистемами", ЭтотОбъект, ДополнительныеПараметры); - - ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); - ПараметрыОжидания.ВыводитьОкноОжидания = Истина; - - ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, ОповещениеОЗавершении, ПараметрыОжидания); - КонецЕсли; - Возврат; КонецЕсли; - КлючУникальностиПомощника = ПараметрыПомощника.ИмяПланаОбмена - + "_" + ПараметрыПомощника.ИдентификаторНастройки + "_" + ПараметрыПомощника.УзелОбмена.УникальныйИдентификатор(); + ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗавершенияНастройкиПараметровСинхронизации", ЭтотОбъект); + + КлючУникальностиПомощника = СтрШаблон("%1_%2_%3", ПараметрыПомощника.ИмяПланаОбмена, ПараметрыПомощника.ИдентификаторНастройки, ПараметрыПомощника.УзелОбмена.УникальныйИдентификатор()); ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.НастройкаСинхронизации", ПараметрыПомощника, ЭтотОбъект, КлючУникальностиПомощника, , , ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.Независимый); КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФормуУзлаПланаОбмена(ТекущиеДанные) - - ИмяФормыПомощника = СтрЗаменить("ПланОбмена.[ИмяПланаОбмена].ФормаОбъекта", "[ИмяПланаОбмена]", ТекущиеДанные.ИмяПланаОбмена); - - ПараметрыПомощника = Новый Структура; - ПараметрыПомощника.Вставить("Ключ", ТекущиеДанные.УзелИнформационнойБазы); - - ОповещениеОЗакрытии = Новый ОписаниеОповещения("ОткрытьФормуНастройкиПараметровСинхронизацииЗавершение", ЭтотОбъект); - - ОткрытьФорму(ИмяФормыПомощника, - ПараметрыПомощника, ЭтотОбъект, , , , ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФормуНастройкиПараметровСинхронизацииЗавершение(РезультатЗакрытия, ДополнительныеПараметры) Экспорт - - ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораИнтерактивно", 0.1, Истина); - -КонецПроцедуры &НаКлиенте Процедура ПриЗавершенииПолученияВариантовНастроекОбменаДаннымиСВнешнимиСистемами(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; Если Результат.Статус = "Выполнено" Тогда Отказ = Ложь; СообщениеОбОшибке = ""; - ОбработатьРезультатПолученияВариантовНастроекНаСервере( - Результат.АдресРезультата, Отказ, СообщениеОбОшибке, ДополнительныеПараметры.ПараметрыПомощника); + ОбработатьРезультатПолученияВариантовНастроекНаСервере(Результат.АдресРезультата, Отказ, СообщениеОбОшибке, ДополнительныеПараметры.ПараметрыПомощника); Если Отказ Тогда + ПоказатьПредупреждение(, СообщениеОбОшибке); + Иначе - ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.НастройкаСинхронизации", - ДополнительныеПараметры.ПараметрыПомощника, ЭтотОбъект, , , , ДополнительныеПараметры.ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.Независимый); + + ИмяОткрываемойФормы = "Обработка.ПомощникСозданияОбменаДанными.Форма.НастройкаСинхронизации"; + ОткрытьФорму(ИмяОткрываемойФормы, ДополнительныеПараметры.ПараметрыПомощника, ЭтотОбъект, , , , ДополнительныеПараметры.ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.Независимый); + КонецЕсли; ИначеЕсли Результат.Статус = "Ошибка" Тогда - + ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки); КонецЕсли; @@ -540,60 +1139,94 @@ КонецПроцедуры &НаКлиенте -Процедура ОбработкаКомандыВыполненияСинхронизации(ИспользоватьДопОтборы = Ложь) +Процедура ДиалогПользователяСНесовместимымиПравилами(ОписаниеСтрокиПриложения, ОписаниеОшибки) - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("ПерейтиКЗагрузкеПравил", НСтр("ru = 'Загрузить правила'")); + Если ОписаниеОшибки.ВидОшибки <> "НекорректнаяКонфигурация" Тогда + + Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); + + КонецЕсли; + Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; + ПараметрыФормы = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю(); + ПараметрыФормы.Картинка = ОписаниеОшибки.Картинка; + ПараметрыФормы.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; - ДанныеДляЗавершенияНастройки = Неопределено; - Если ПродолжитьНастройкуНовойСинхронизации(ТекущиеДанные, ДанныеДляЗавершенияНастройки) Тогда - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ТекущиеДанные", ТекущиеДанные); - ДополнительныеПараметры.Вставить("ДанныеДляЗавершенияНастройки", ДанныеДляЗавершенияНастройки); + Если ОписаниеОшибки.ВидОшибки = "НекорректнаяКонфигурация" Тогда + + ПараметрыФормы.Заголовок = НСтр("ru = 'Синхронизация данных не может быть выполнена'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); - ОповещениеЗавершения = Новый ОписаниеОповещения("ВопросПродолжитьНастройкуСинхронизацииЗавершение", ЭтотОбъект, ДополнительныеПараметры); - ПоказатьВопрос(ОповещениеЗавершения, - НСтр("ru = 'Перед запуском синхронизации данных необходимо завершить ее настройку. - |Открыть форму помощника настройки?'"), - РежимДиалогаВопрос.ДаНет); - ИначеЕсли ТекущиеДанные.ЗапускОбменаИзКорреспондента - И Не ПолученоСообщениеДляСопоставленияДанных(ТекущиеДанные.УзелИнформационнойБазы) Тогда - ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Запуск синхронизации с ""%1"" из этой программы не поддерживается. - |Перейдите в ""%1"" и запустите синхронизацию из нее.'"), ТекущиеДанные.НаименованиеКорреспондента)); Иначе - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("УзелОбмена", ТекущиеДанные.УзелИнформационнойБазы); - ДополнительныеПараметры.Вставить("ИмяПланаОбмена", ТекущиеДанные.ИмяПланаОбмена); - ДополнительныеПараметры.Вставить("ЭтоОбменСПриложениемВСервисе", ТекущиеДанные.ЭтоОбменСПриложениемВСервисе); - ДополнительныеПараметры.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанных); + ПараметрыФормы.Заголовок = НСтр("ru = 'Синхронизация данных может быть выполнена некорректно'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); - ДополнительныеПараметры.Вставить("ИспользоватьДопОтборы", ИспользоватьДопОтборы); - ДополнительныеПараметры.Вставить("ДоступнаИнтерактивнаяОтправка", ТекущиеДанные.ДоступнаИнтерактивнаяОтправка); - ДополнительныеПараметры.Вставить("ВариантОбменаДанными", ТекущиеДанные.ВариантОбменаДанными); - ДополнительныеПараметры.Вставить("ПолученоСообщениеДляСопоставленияДанных", ПолученоСообщениеДляСопоставленияДанных(ТекущиеДанные.УзелИнформационнойБазы)); - ДополнительныеПараметры.Вставить("ЗапускОбменаИзКорреспондента", ТекущиеДанные.ЗапускОбменаИзКорреспондента); - - ОписаниеПродолжения = Новый ОписаниеОповещения("ПродолжитьВыполнениеСинхронизации", ЭтотОбъект, ДополнительныеПараметры); - - Если ТекущиеДанные.ЭтоОбменСПриложениемВСервисе Тогда - ВыполнитьОбработкуОповещения(ОписаниеПродолжения); - Иначе - ПроверитьСовместимостьПравилКонвертации(ОписаниеПродолжения); - КонецЕсли; КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПослеПроверкиПравилКонвертацииНаСовместимость", ЭтотОбъект, ОписаниеСтрокиПриложения); + + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Оповещение, ОписаниеОшибки.ТекстОшибки, Кнопки, ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеПроверкиПравилКонвертацииНаСовместимость(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + + Возврат; + + КонецЕсли; + + Если Результат.Значение = "Продолжить" Тогда + + СинхронизацияДанных(ДополнительныеПараметры); + + ИначеЕсли Результат.Значение = "ПерейтиКЗагрузкеПравил" Тогда + + ОбменДаннымиКлиент.ЗагрузитьПравилаСинхронизацииДанных(ДополнительныеПараметры.ИмяПланаОбмена); + + КонецЕсли; // При "Отмена" ничего не делаем. + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуОжиданияОкончанияНастройки(ФоновоеЗаданиеНастройки, ОписаниеСтрокиПриложения) + + ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗавершенияНастройкиПараметровСинхронизации", ЭтотОбъект); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПараметрыПомощника", ОписаниеСтрокиПриложения); + ДополнительныеПараметры.Вставить("ОповещениеОЗакрытии", ОповещениеОЗакрытии); + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ПриЗавершенииПолученияВариантовНастроекОбменаДаннымиСВнешнимиСистемами", ЭтотОбъект, ДополнительныеПараметры); + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗаданиеНастройки, ОповещениеОЗавершении, ПараметрыОжидания); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредупреждениеОПерезагрузкеОписаниеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ЗавершитьРаботуСистемы(Ложь, Истина); + КонецПроцедуры &НаСервереБезКонтекста -Функция ФоновоеЗаданиеВариантыНастроекОбменаДаннымиСВнешнимиСистемами( - УзелОбмена, - УникальныйИдентификатор) +Функция АктуализироватьИнформациюОПроблемахСинхронизацииДанных(УзелСинхронизации) + + УстановитьПривилегированныйРежим(Истина); + Возврат РегистрыСведений.РезультатыОбменаДанными.КоличествоПредупрежденийДетально(УзелСинхронизации); + +КонецФункции + +&НаСервереБезКонтекста +Функция ФоновоеЗаданиеВариантыНастроекОбменаДаннымиСВнешнимиСистемами(УзелОбмена, УникальныйИдентификатор) ФоновоеЗадание = Неопределено; @@ -619,472 +1252,6 @@ КонецФункции -&НаСервереБезКонтекста -Процедура ОбработатьРезультатПолученияВариантовНастроекНаСервере(АдресРезультата, Отказ, СообщениеОбОшибке, ПараметрыПомощника) - - Результат = ПолучитьИзВременногоХранилища(АдресРезультата); - - Если Не ЗначениеЗаполнено(Результат.КодОшибки) Тогда - Отбор = Новый Структура("ИмяПланаОбмена, ИдентификаторНастройки"); - ЗаполнитьЗначенияСвойств(Отбор, ПараметрыПомощника); - - СтрокиВариантыНастроек = Результат.ВариантыНастроек.НайтиСтроки(Отбор); - Если СтрокиВариантыНастроек.Количество() > 0 Тогда - ЗаполнитьЗначенияСвойств(ПараметрыПомощника.ОписаниеВариантаНастройки, СтрокиВариантыНастроек[0]); - Иначе - Отказ = Истина; - СообщениеОбОшибке = НСтр("ru = 'Настройка подключения к данному сервису недоступна.'"); - КонецЕсли; - Иначе - Отказ = Истина; - Если ЗначениеЗаполнено(Результат.КодОшибки) Тогда - СообщениеОбОшибке = Результат.СообщениеОбОшибке; - КонецЕсли; - КонецЕсли; - - УдалитьИзВременногоХранилища(АдресРезультата); - -КонецПроцедуры - -&НаСервере -Процедура ПроверитьВозможностьНастройкиСинхронизацииДанных(Отказ = Ложь) - - ТекстСообщения = ""; - Если ОбщегоНазначения.РазделениеВключено() Тогда - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - МодульОбменДаннымиВМоделиСервисаПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервисаПовтИсп"); - Если Не МодульОбменДаннымиВМоделиСервисаПовтИсп.СинхронизацияДанныхПоддерживается() Тогда - ТекстСообщения = НСтр("ru = 'Возможность настройки синхронизации данных в данной программе не предусмотрена.'"); - Отказ = Истина; - КонецЕсли; - Иначе - ТекстСообщения = НСтр("ru = 'В неразделенном режиме настройка синхронизации данных с другими программами недоступна.'"); - Отказ = Истина; - КонецЕсли; - Иначе - СписокПлановОбмена = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); - Если СписокПлановОбмена.Количество() = 0 Тогда - ТекстСообщения = НСтр("ru = 'Возможность настройки синхронизации данных в данной программе не предусмотрена.'"); - Отказ = Истина; - КонецЕсли; - КонецЕсли; - - Если Отказ - И Не ПустаяСтрока(ТекстСообщения) Тогда - ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция НастройкаСинхронизацииЗавершена(СтрокаПриложение, ДанныеДляЗавершенияНастройки = Неопределено) - - МодульПомощник = ОбменДаннымиСервер.МодульПомощникСозданияОбменаДанными(); - ОписаниеВариантаНастройки = МодульПомощник.СтруктураОписанияВариантаНастройки(); - - ИдентификаторНастройки = ОбменДаннымиСервер.СохраненныйВариантНастройкиУзлаПланаОбмена( - СтрокаПриложение.УзелИнформационнойБазы); - - Если Не СтрокаПриложение.ВнешняяСистема Тогда - ЗначенияНастроекДляВарианта = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(СтрокаПриложение.ИмяПланаОбмена, - "НаименованиеКонфигурацииКорреспондента, - |ЗаголовокКомандыДляСозданияНовогоОбменаДанными, - |ЗаголовокПомощникаСозданияОбмена, - |КраткаяИнформацияПоОбмену, - |ПодробнаяИнформацияПоОбмену", - ИдентификаторНастройки, - СтрокаПриложение.ВерсияКорреспондента); - - ЗаполнитьЗначенияСвойств(ОписаниеВариантаНастройки, ЗначенияНастроекДляВарианта); - ОписаниеВариантаНастройки.НаименованиеКорреспондента = ЗначенияНастроекДляВарианта.НаименованиеКонфигурацииКорреспондента; - КонецЕсли; - - НомераСообщений = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаПриложение.УзелИнформационнойБазы, "НомерПринятого, НомерОтправленного"); - ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(СтрокаПриложение.УзелИнформационнойБазы); - - Если Не ЗначениеЗаполнено(ВидТранспорта) Тогда - ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим; - КонецЕсли; - - ДанныеДляЗавершенияНастройки = Новый Структура; - ДанныеДляЗавершенияНастройки.Вставить("ИдентификаторНастройки", ИдентификаторНастройки); - ДанныеДляЗавершенияНастройки.Вставить("ОписаниеВариантаНастройки", ОписаниеВариантаНастройки); - ДанныеДляЗавершенияНастройки.Вставить("ПассивноеПодключение", ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим); - - Возврат ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(СтрокаПриложение.УзелИнформационнойБазы) - И Не (НомераСообщений.НомерПринятого = 0 - И НомераСообщений.НомерОтправленного = 0 - И ОбменДаннымиСервер.ПолученоСообщениеСДаннымиДляСопоставления(СтрокаПриложение.УзелИнформационнойБазы)); - -КонецФункции - -&НаСервереБезКонтекста -Функция СведенияОПланеОбмена(ИмяПланаОбмена) - - Результат = Новый Структура; - Результат.Вставить("ИмяПланаОбмена", ИмяПланаОбмена); - Результат.Вставить("ИспользуютсяПравилаКонвертации", - ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(ИмяПланаОбмена, "ПравилаОбмена")); - - Возврат Результат; - -КонецФункции - -&НаСервереБезКонтекста -Функция УзелОбменаСуществует(УзелОбмена) - - Возврат ОбщегоНазначения.СсылкаСуществует(УзелОбмена); - -КонецФункции - -&НаКлиенте -Функция ТекущиеДанныеСпискаПриложений() - - ТекущиеДанные = Элементы.СписокПриложений.ТекущиеДанные; - - Если ТекущиеДанные <> Неопределено Тогда - Если Не УзелОбменаСуществует(ТекущиеДанные.УзелИнформационнойБазы) Тогда - ТекущиеДанные = Неопределено; - КонецЕсли; - КонецЕсли; - - Возврат ТекущиеДанные; - -КонецФункции - -&НаКлиенте -Процедура ПерейтиВЖурналРегистрацииСобытий(ДействиеПриОбмене) - - ТекущиеДанные = ТекущиеДанныеСпискаПриложений(); - - Если ТекущиеДанные = Неопределено Тогда - ОбновитьДанныеМонитораИнтерактивно(); - Возврат; - КонецЕсли; - - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, - ЭтотОбъект, ДействиеПриОбмене); - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьДанныеМонитораИнтерактивно() - - ИндексСтрокиСписокПриложений = ПолучитьТекущийИндексСтроки(); - - Если МодельСервиса Тогда - ПриНачалеОбновленияДанныхМонитора(); - Иначе - ОбновитьСписокПриложений(); - ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); - - ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьДанныеМонитораВФоне() - - ИндексСтрокиСписокПриложений = ПолучитьТекущийИндексСтроки(); - - ОбновитьПриложенияМоделиСервиса = МодельСервиса; - ОбновитьСписокПриложений(ОбновитьПриложенияМоделиСервиса); - - Если МодельСервиса - И ОбновитьПриложенияМоделиСервиса Тогда - ПриНачалеОбновленияДанныхМонитораВФоне(); - Иначе - ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); - - ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриНачалеОбновленияДанныхМонитора() - - Если Не ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено Тогда - Возврат; - КонецЕсли; - - ПараметрыОбработчикаПолученияСпискаПриложений = Неопределено; - ПродолжитьОжидание = Ложь; - - ПриНачалеПолученияСпискаПриложенийНаСервере( - ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); - - Если ПродолжитьОжидание Тогда - - Элементы.ПанельСписокПриложений.ТекущаяСтраница = Элементы.СтраницаОжидание; - Элементы.КоманднаяПанель.Доступность = Ложь; - - ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания( - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); - - ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитора", - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); - - Иначе - ПриЗавершенииОбновленияДанныхМонитора(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОжиданииОбновленияДанныхМонитора() - - ПродолжитьОжидание = Ложь; - ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); - - Если ПродолжитьОжидание Тогда - ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); - - ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитора", - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); - Иначе - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено; - ПриЗавершенииОбновленияДанныхМонитора(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗавершенииОбновленияДанныхМонитора() - - ПриЗавершенииПолученияСпискаПриложенийНаСервере(); - ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); - - Элементы.ПанельСписокПриложений.ТекущаяСтраница = Элементы.СтраницаСписокПриложений; - Элементы.КоманднаяПанель.Доступность = Истина; - - ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриНачалеОбновленияДанныхМонитораВФоне() - - Если Не ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено Тогда - Возврат; - КонецЕсли; - - ПараметрыОбработчикаПолученияСпискаПриложений = Неопределено; - ПродолжитьОжидание = Ложь; - - ПриНачалеПолученияСпискаПриложенийНаСервере( - ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); - - Если ПродолжитьОжидание Тогда - - ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания( - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); - - ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитораВФоне", - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); - - Иначе - ПриЗавершенииОбновленияДанныхМонитораВФоне(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОжиданииОбновленияДанныхМонитораВФоне() - - ПродолжитьОжидание = Ложь; - ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчикаПолученияСпискаПриложений, ПродолжитьОжидание); - - Если ПродолжитьОжидание Тогда - ОбменДаннымиКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжиданияПолученияСпискаПриложений); - - ПодключитьОбработчикОжидания("ПриОжиданииОбновленияДанныхМонитораВФоне", - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений.ТекущийИнтервал, Истина); - Иначе - ПараметрыОбработчикаОжиданияПолученияСпискаПриложений = Неопределено; - ПриЗавершенииОбновленияДанныхМонитораВФоне(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗавершенииОбновленияДанныхМонитораВФоне() - - ПриЗавершенииПолученияСпискаПриложенийНаСервере(); - ВыполнитьПозиционированиеКурсора(ИндексСтрокиСписокПриложений); - - ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораВФоне", 60, Истина); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ПриНачалеПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание) - - МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); - - Если МодульПомощникНастройки = Неопределено Тогда - ПродолжитьОжидание = Ложь; - Возврат; - КонецЕсли; - - ПараметрыПомощника = Новый Структура("Режим", "НастроенныеОбмены"); - - МодульПомощникНастройки.ПриНачалеПолученияСпискаПриложений(ПараметрыПомощника, - ПараметрыОбработчика, ПродолжитьОжидание); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание) - - МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); - - Если МодульПомощникНастройки = Неопределено Тогда - ПродолжитьОжидание = Ложь; - Возврат; - КонецЕсли; - - МодульПомощникНастройки.ПриОжиданииПолученияСпискаПриложений( - ПараметрыОбработчика, ПродолжитьОжидание); - -КонецПроцедуры - -&НаСервере -Процедура ПриЗавершенииПолученияСпискаПриложенийНаСервере() - - ПриложенияМоделиСервиса.Очистить(); - - МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); - - Если Не МодульПомощникНастройки = Неопределено Тогда - СтатусЗавершения = Неопределено; - МодульПомощникНастройки.ПриЗавершенииПолученияСпискаПриложений( - ПараметрыОбработчикаПолученияСпискаПриложений, СтатусЗавершения); - - Если Не СтатусЗавершения.Отказ Тогда - ТаблицаПриложений = СтатусЗавершения.Результат; - ПриложенияМоделиСервиса.Загрузить(ТаблицаПриложений.Скопировать(, "Корреспондент, ОбластьДанных, НаименованиеПриложения")); - КонецЕсли; - КонецЕсли; - - ОбновитьСписокПриложений(); - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьСписокПриложений(ОбновитьПриложенияМоделиСервиса = Ложь) - - Элементы.ПанельСписокПриложений.ТекущаяСтраница = Элементы.СтраницаСписокПриложений; - Элементы.КоманднаяПанель.Доступность = Истина; - - ПланыОбменаБСП = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); - - ПриложенияДоОбновления = СписокПриложений.Выгрузить(, "УзелИнформационнойБазы").ВыгрузитьКолонку("УзелИнформационнойБазы"); - ТаблицаМонитора = ОбменДаннымиСервер.ТаблицаМонитораОбменаДанными(ПланыОбменаБСП); - ПриложенияПослеОбновления = ТаблицаМонитора.ВыгрузитьКолонку("УзелИнформационнойБазы"); - - ЕстьНастроенныеОбмены = (ПриложенияПослеОбновления.Количество() > 0); - - Если ОбновитьПриложенияМоделиСервиса - И ЕстьНастроенныеОбмены Тогда - ОбновитьПриложенияМоделиСервиса = Ложь; - Для Каждого Приложение Из ПриложенияПослеОбновления Цикл - Если ПриложенияДоОбновления.Найти(Приложение) = Неопределено Тогда - ОбновитьПриложенияМоделиСервиса = Истина; - Возврат; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - СписокПриложений.Загрузить(ТаблицаМонитора); - - Для Каждого СтрокаПриложение Из СписокПриложений Цикл - - УстановитьПривилегированныйРежим(Истина); - СтрокаПриложение.НаименованиеКорреспондента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( - СтрокаПриложение.УзелИнформационнойБазы, "Наименование"); - УстановитьПривилегированныйРежим(Ложь); - - СтрокиПриложениеМоделиСервиса = ПриложенияМоделиСервиса.НайтиСтроки( - Новый Структура("Корреспондент", СтрокаПриложение.УзелИнформационнойБазы)); - - Если СтрокиПриложениеМоделиСервиса.Количество() > 0 Тогда - СтрокаПриложениеМоделиСервиса = СтрокиПриложениеМоделиСервиса[0]; - - СтрокаПриложение.ЭтоОбменСПриложениемВСервисе = Истина; - СтрокаПриложение.ОбластьДанных = СтрокаПриложениеМоделиСервиса.ОбластьДанных; - СтрокаПриложение.НаименованиеКорреспондента = СтрокаПриложениеМоделиСервиса.НаименованиеПриложения; - КонецЕсли; - - Если СтрокаПриложение.ЭтоОбменСПриложениемВСервисе Тогда - - СтрокаПриложение.РежимРаботыПриложения = 1; - СтрокаПриложение.ДоступнаИнтерактивнаяОтправка = Истина; - - Иначе - - ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию( - СтрокаПриложение.УзелИнформационнойБазы); - - Если ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS - Или ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема Тогда - СтрокаПриложение.РежимРаботыПриложения = 1; // сервис - Иначе - СтрокаПриложение.РежимРаботыПриложения = 0; - КонецЕсли; - - Если Не ЗначениеЗаполнено(ВидТранспорта) - Или (ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим) Тогда - // Обмен с этой базой настроен через WS. - СтрокаПриложение.ЗапускОбменаИзКорреспондента = Истина; - КонецЕсли; - - СтрокаПриложение.ВнешняяСистема = (ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема); - - СтрокаПриложение.ДоступнаИнтерактивнаяОтправка = - Не ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(СтрокаПриложение.ИмяПланаОбмена) - И Не ОбменДаннымиПовтИсп.ЭтоУзелСтандартногоОбменаДанными(СтрокаПриложение.ИмяПланаОбмена) - И Не СтрокаПриложение.ВнешняяСистема; - - КонецЕсли; - - СтрокаПриложение.ДоступнаИнтерактивнаяОтправка = СтрокаПриложение.ДоступнаИнтерактивнаяОтправка - И Не (СтрокаПриложение.ВариантОбменаДанными = "ТолькоПолучение"); - - СостояниеСинхронизации = СостояниеСинхронизацииДанных(СтрокаПриложение); - СтрокаПриложение.СостояниеПредставление = СостояниеСинхронизации.Представление; - СтрокаПриложение.СостояниеКартинка = СостояниеСинхронизации.Картинка; - - Если ЗначениеЗаполнено(СтрокаПриложение.ДатаПоследнегоЗапуска) Тогда - СтрокаПриложение.СостояниеВыгрузкиКартинка = КартинкаРезультатаВыполнения(СтрокаПриложение.РезультатПоследнейВыгрузкиДанных); - - Если Не СтрокаПриложение.ПолученоСообщениеДляСопоставленияДанных Тогда - СтрокаПриложение.СостояниеЗагрузкиКартинка = КартинкаРезультатаВыполнения(СтрокаПриложение.РезультатПоследнейЗагрузкиДанных); - КонецЕсли; - Иначе - // Не отображаем надпись "Никогда", если синхронизация еще ни разу не выполнялась, - // чтобы не перегружать интерфейс. - СтрокаПриложение.ПредставлениеДатыПоследнейУспешнойВыгрузки = ""; - СтрокаПриложение.ПредставлениеДатыПоследнейУспешнойЗагрузки = ""; - КонецЕсли; - - Если СтрокаПриложение.ПолученоСообщениеДляСопоставленияДанных Тогда - // Если получены данные для выполнения сопоставление, отображаем соответствующую дату получения сообщения. - СтрокаПриложение.ПредставлениеДатыПоследнейУспешнойЗагрузки = СтрокаПриложение.ПредставлениеДатыСообщенияДляСопоставленияДанных; - СтрокаПриложение.СостояниеЗагрузкиКартинка = 5; - КонецЕсли; - - КонецЦикла; - - ТребуетсяОбновление = ОбменДаннымиСервер.ТребуетсяУстановкаОбновления(); - - УстановитьОтображениеЭлементовФормы(); - - ОбновитьКомандуРезультатовСинхронизации(); - -КонецПроцедуры - &НаСервереБезКонтекста Функция СостояниеСинхронизацииДанных(СтрокаПриложение) @@ -1143,18 +1310,236 @@ КонецФункции +&НаСервереБезКонтекста +Функция УзелОбменаСуществует(УзелОбмена) + + Возврат ОбщегоНазначения.СсылкаСуществует(УзелОбмена); + +КонецФункции + +&НаСервереБезКонтекста +Процедура ОбработатьРезультатПолученияВариантовНастроекНаСервере(АдресРезультата, Отказ, СообщениеОбОшибке, ПараметрыПомощника) + + Результат = ПолучитьИзВременногоХранилища(АдресРезультата); + + Если Не ЗначениеЗаполнено(Результат.КодОшибки) Тогда + Отбор = Новый Структура("ИмяПланаОбмена, ИдентификаторНастройки"); + ЗаполнитьЗначенияСвойств(Отбор, ПараметрыПомощника); + + СтрокиВариантыНастроек = Результат.ВариантыНастроек.НайтиСтроки(Отбор); + Если СтрокиВариантыНастроек.Количество() > 0 Тогда + ЗаполнитьЗначенияСвойств(ПараметрыПомощника.ОписаниеВариантаНастройки, СтрокиВариантыНастроек[0]); + Иначе + Отказ = Истина; + СообщениеОбОшибке = НСтр("ru = 'Настройка подключения к данному сервису недоступна.'"); + КонецЕсли; + Иначе + Отказ = Истина; + Если ЗначениеЗаполнено(Результат.КодОшибки) Тогда + СообщениеОбОшибке = Результат.СообщениеОбОшибке; + КонецЕсли; + КонецЕсли; + + УдалитьИзВременногоХранилища(АдресРезультата); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПриНачалеПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание) + + МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульПомощникНастройки = Неопределено Тогда + ПродолжитьОжидание = Ложь; + Возврат; + КонецЕсли; + + ПараметрыПомощника = Новый Структура("Режим", "НастроенныеОбмены"); + + МодульПомощникНастройки.ПриНачалеПолученияСпискаПриложений(ПараметрыПомощника, + ПараметрыОбработчика, ПродолжитьОжидание); + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ПриОжиданииПолученияСпискаПриложенийНаСервере(ПараметрыОбработчика, ПродолжитьОжидание) + + МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если МодульПомощникНастройки = Неопределено Тогда + ПродолжитьОжидание = Ложь; + Возврат; + КонецЕсли; + + МодульПомощникНастройки.ПриОжиданииПолученияСпискаПриложений( + ПараметрыОбработчика, ПродолжитьОжидание); + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПравилаКонвертацииСовместимыСТекущейВерсией(ИмяПланаОбмена, ОписаниеОшибки) + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена); + + Запрос.Текст = + "ВЫБРАТЬ + | ПравилаДляОбменаДанными.ПравилаЗачитанные, + | ПравилаДляОбменаДанными.ВидПравил + |ИЗ + | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными + |ГДЕ + | ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена + | И ПравилаДляОбменаДанными.ИсточникПравил = ЗНАЧЕНИЕ(Перечисление.ИсточникиПравилДляОбменаДанными.Файл) + | И ПравилаДляОбменаДанными.ПравилаЗагружены = ИСТИНА + | И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов)"; + + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + + СтруктураПравил = Выборка.ПравилаЗачитанные.Получить().Конвертация; // Структура + + ИнформацияОПравилах = Новый Структура; + ИнформацияОПравилах.Вставить("ИмяКонфигурации", СтруктураПравил.Источник); + ИнформацияОПравилах.Вставить("ВерсияКонфигурации", СтруктураПравил.ВерсияКонфигурацииИсточника); + ИнформацияОПравилах.Вставить("СинонимКонфигурацииВПравилах", СтруктураПравил.СинонимКонфигурацииИсточника); + + Возврат РегистрыСведений.ПравилаДляОбменаДанными.ПравилаКонвертацииСовместимыСТекущейВерсией(ИмяПланаОбмена, ОписаниеОшибки, ИнформацияОПравилах); + + КонецЕсли; + + Возврат Истина; + +КонецФункции + &НаСервере -Процедура ИнициализироватьРеквизитыФормы() +Процедура ПроверитьВозможностьНастройкиСинхронизацииДанных(Отказ = Ложь) - ЕстьПраваНаАдминистрированиеОбменов = ОбменДаннымиСервер.ЕстьПраваНаАдминистрированиеОбменов(); - ЕстьПраваНаПросмотрЖурналаРегистрации = ПравоДоступа("ЖурналРегистрации", Метаданные); + ТекстСообщения = ""; + Если ОбщегоНазначения.РазделениеВключено() Тогда + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + МодульОбменДаннымиВМоделиСервисаПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервисаПовтИсп"); + Если Не МодульОбменДаннымиВМоделиСервисаПовтИсп.СинхронизацияДанныхПоддерживается() Тогда + ТекстСообщения = НСтр("ru = 'Возможность настройки синхронизации данных в данной программе не предусмотрена.'"); + Отказ = Истина; + КонецЕсли; + Иначе + ТекстСообщения = НСтр("ru = 'В неразделенном режиме настройка синхронизации данных с другими программами недоступна.'"); + Отказ = Истина; + КонецЕсли; + Иначе + СписокПлановОбмена = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); + Если СписокПлановОбмена.Количество() = 0 Тогда + ТекстСообщения = НСтр("ru = 'Возможность настройки синхронизации данных в данной программе не предусмотрена.'"); + Отказ = Истина; + КонецЕсли; + КонецЕсли; - ЕстьПраваНаВыполнениеОбновленияКонфигурации = ПравоДоступа("ОбновлениеКонфигурацииБазыДанных", Метаданные); + Если Отказ + И Не ПустаяСтрока(ТекстСообщения) Тогда + ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); + КонецЕсли; - ПрефиксИБ = ОбменДаннымиСервер.ПрефиксИнформационнойБазы(); +КонецПроцедуры + +&НаСервере +Процедура УстановитьУсловноеОформление() - МодельСервиса = ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(); + УсловноеОформление.Элементы.Очистить(); + + // Тусклый цвет шрифта настроенной, но ни разу не запускавшейся синхронизации. + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеПредставление.Имя); + + ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(Элемент.Отбор, "СписокПриложений.СостояниеПредставление", ВидСравненияКомпоновкиДанных.Равно, НСтр("ru = 'Не запускалась'")); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + + // Особый цвет шрифта синхронизации, по которой не завершена настройка. + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеПредставление.Имя); + + ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(Элемент.Отбор, "СписокПриложений.СостояниеПредставление", ВидСравненияКомпоновкиДанных.Равно, НСтр("ru = 'Настройка не завершена'")); + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноКрасный); + + // Текст "н/д" и тусклый цвет шрифта для отсутствующего префикса программы-корреспондента. + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийПрефиксКорреспондента.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.ПрефиксКорреспондента"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; + Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'н/д'")); + + // Скрыть пустую картинку состояния синхронизации данных. + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеКартинка.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеКартинка"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // Скрыть пустую картинку состояния выгрузки данных. + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеВыгрузкиКартинка.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеВыгрузкиКартинка"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // Скрыть пустую картинку состояния загрузки данных. + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПриложенийСостояниеЗагрузкиКартинка.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПриложений.СостояниеЗагрузкиКартинка"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = 0; + + Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + +КонецПроцедуры + +&НаСервере +Процедура ПриЗавершенииПолученияСпискаПриложенийНаСервере() + + ПриложенияМоделиСервиса.Очистить(); + + МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете(); + + Если Не МодульПомощникНастройки = Неопределено Тогда + СтатусЗавершения = Неопределено; + МодульПомощникНастройки.ПриЗавершенииПолученияСпискаПриложений( + ПараметрыОбработчикаПолученияСпискаПриложений, СтатусЗавершения); + + Если Не СтатусЗавершения.Отказ Тогда + ТаблицаПриложений = СтатусЗавершения.Результат; + ПриложенияМоделиСервиса.Загрузить(ТаблицаПриложений.Скопировать(, "Корреспондент, ОбластьДанных, НаименованиеПриложения")); + КонецЕсли; + КонецЕсли; + + ОбновитьСписокПриложений(); КонецПроцедуры @@ -1162,19 +1547,16 @@ Процедура УстановитьОтображениеЭлементовФормы() // Командная панель. - Элементы.СписокПриложенийГруппаУправление.Видимость = ЕстьПраваНаАдминистрированиеОбменов; - Элементы.СписокПриложенийГруппаИзменениеИСостав.Видимость = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийГруппаВыполненияОбменаДанными.Видимость = ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийГруппаРасписаниеВыполненияОбмена.Видимость = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийГруппаСобытия.Видимость = ЕстьПраваНаПросмотрЖурналаРегистрации И ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийУдалитьНастройкуСинхронизации.Видимость = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; + Элементы.СписокПриложенийГруппаВыполненияОбменаДанными.Доступность = ЕстьНастроенныеОбмены; + Элементы.СписокПриложенийГруппаУправление.Доступность = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; + Элементы.СписокПриложенийГруппаРасписаниеВыполненияОбмена.Доступность = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; + Элементы.СписокПриложенийСоздатьНастройкуСинхронизации.Доступность = ЕстьПраваНаАдминистрированиеОбменов; + Элементы.СписокПриложенийГруппаСобытия.Доступность = ЕстьПраваНаПросмотрЖурналаРегистрации И ЕстьНастроенныеОбмены; // Контекстное меню. - Элементы.СписокПриложенийКонтекстноеМенюГруппаИзменениеИСостав.Видимость = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийКонтекстноеМенюГруппаВыполненияОбменаДанными.Видимость = ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийКонтекстноеМенюГруппаРасписаниеВыполненияОбмена.Видимость = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийКонтекстноеМенюГруппаСобытия.Видимость = ЕстьПраваНаПросмотрЖурналаРегистрации И ЕстьНастроенныеОбмены; - Элементы.СписокПриложенийКонтекстноеМенюГруппаУправление.Видимость = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; + Элементы.СписокПриложенийКонтекстноеМенюГруппаВыполненияОбменаДанными.Доступность = ЕстьНастроенныеОбмены; + Элементы.СписокПриложенийКонтекстноеМенюГруппаУправление.Доступность = ЕстьПраваНаАдминистрированиеОбменов И ЕстьНастроенныеОбмены; + Элементы.СписокПриложенийКонтекстноеМенюГруппаСобытия.Доступность = ЕстьПраваНаПросмотрЖурналаРегистрации И ЕстьНастроенныеОбмены; // Видимость элементов в шапке формы. Элементы.ИнформационнаяПанельТребуетсяОбновление.Видимость = ТребуетсяОбновление; @@ -1185,327 +1567,144 @@ Элементы.ПравоОбновленияСтраницы.ТекущаяСтраница = Элементы.ИнформацияОбменДаннымиПриостановленНетПраваОбновления; КонецЕсли; - // Доступность элементов в шапке формы. - Элементы.ОткрытьРезультатыСинхронизацииДанных.Доступность = ЕстьНастроенныеОбмены; + Элементы.ИнформационнаяПанельТребуетсяПерезагрузка.Видимость = ТребуетсяПерезагрузка; // Безусловное отключение видимости команд настройки расписания и загрузки правил в модели сервиса. Если МодельСервиса Тогда - // Командная панель. - Элементы.СписокПриложенийЗагрузитьПравилаСинхронизацииДанных.Видимость = Ложь; Элементы.СписокПриложенийГруппаРасписаниеВыполненияОбмена.Видимость = Ложь; - // Контекстное меню. - Элементы.СписокПриложенийКонтекстноеМенюГруппаРасписаниеВыполненияОбмена.Видимость = Ложь; - КонецЕсли; КонецПроцедуры &НаСервере -Процедура ОбновитьКомандуРезультатовСинхронизации() +Процедура ОбновитьСписокПриложений(ОбновитьПриложенияМоделиСервиса = Ложь) - СтруктураЗаголовка = Новый Структура; - СтруктураЗаголовка.Вставить("Заголовок", НСтр("ru = 'Предупреждений нет'")); - СтруктураЗаголовка.Вставить("Картинка", Новый Картинка); + Элементы.ПанельСписокПриложений.ТекущаяСтраница = Элементы.СтраницаСписокПриложений; + Элементы.КоманднаяПанель.Доступность = Истина; - ЕстьПроблемы = Ложь; - УзлыОбмена = МассивИспользуемыхУзлов(СписокПриложений); + ПланыОбменаБСП = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("УзлыОбмена", УзлыОбмена); + ПриложенияДоОбновления = СписокПриложений.Выгрузить(, "УзелИнформационнойБазы").ВыгрузитьКолонку("УзелИнформационнойБазы"); + ТаблицаМонитора = ОбменДаннымиСервер.ТаблицаМонитораОбменаДанными(ПланыОбменаБСП); + ПриложенияПослеОбновления = ТаблицаМонитора.ВыгрузитьКолонку("УзелИнформационнойБазы"); - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЕстьПроблемыОбменов - |ИЗ - | РегистрСведений.РезультатыОбменаДанными КАК РезультатыОбменаДанными - |ГДЕ - | НЕ РезультатыОбменаДанными.Пропущена - | И РезультатыОбменаДанными.УзелИнформационнойБазы В (&УзлыОбмена) - | И РезультатыОбменаДанными.ТипПроблемы В (ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты), - | ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент), - | ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта)) - |"; + ЕстьНастроенныеОбмены = (ПриложенияПослеОбновления.Количество() > 0); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - - ЕстьПроблемы = Выборка.ЕстьПроблемыОбменов; - + Если ОбновитьПриложенияМоделиСервиса + И ЕстьНастроенныеОбмены Тогда + ОбновитьПриложенияМоделиСервиса = Ложь; + Для Каждого Приложение Из ПриложенияПослеОбновления Цикл + Если ПриложенияДоОбновления.Найти(Приложение) = Неопределено Тогда + ОбновитьПриложенияМоделиСервиса = Истина; + Возврат; + КонецЕсли; + КонецЦикла; КонецЕсли; - Если НЕ ЕстьПроблемы Тогда + СписокПриложений.Загрузить(ТаблицаМонитора); + + Для Каждого СтрокаПриложение Из СписокПриложений Цикл - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + УстановитьПривилегированныйРежим(Истина); + СтрокаПриложение.НаименованиеКорреспондента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( + СтрокаПриложение.УзелИнформационнойБазы, "Наименование"); + УстановитьПривилегированныйРежим(Ложь); + + СтрокиПриложениеМоделиСервиса = ПриложенияМоделиСервиса.НайтиСтроки( + Новый Структура("Корреспондент", СтрокаПриложение.УзелИнформационнойБазы)); - МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - ЕстьПроблемы = МодульВерсионированиеОбъектов.ЕстьПроблемыВерсийПриСинхронизацииДанных(УзлыОбмена); + Если СтрокиПриложениеМоделиСервиса.Количество() > 0 Тогда + СтрокаПриложениеМоделиСервиса = СтрокиПриложениеМоделиСервиса[0]; + СтрокаПриложение.ЭтоОбменСПриложениемВСервисе = Истина; + СтрокаПриложение.ОбластьДанных = СтрокаПриложениеМоделиСервиса.ОбластьДанных; + СтрокаПриложение.НаименованиеКорреспондента = СтрокаПриложениеМоделиСервиса.НаименованиеПриложения; КонецЕсли; - КонецЕсли; - - Если ЕстьПроблемы Тогда - - СтруктураЗаголовка.Вставить("Заголовок", НСтр("ru = 'Предупреждения (есть, требуется ознакомиться)'")); - СтруктураЗаголовка.Вставить("Картинка", БиблиотекаКартинок.Предупреждение); - - КонецЕсли; - - ЗаполнитьЗначенияСвойств(Элементы.ОткрытьРезультатыСинхронизацииДанных, СтруктураЗаголовка); - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Функция МассивИспользуемыхУзлов(ТаблицаМонитора) - - Результат = Новый Массив; - - Для Каждого СтрокаМонитора Из ТаблицаМонитора Цикл - Результат.Добавить(СтрокаМонитора.УзелИнформационнойБазы); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -&НаКлиенте -Функция ПолучитьТекущийИндексСтроки() - - // Возвращаемое значение функции. - ИндексСтроки = Неопределено; - - // При обновлении монитора выполняем позиционирование курсора. - ТекущиеДанные = Элементы.СписокПриложений.ТекущиеДанные; - - Если ТекущиеДанные <> Неопределено Тогда - - ИндексСтроки = СписокПриложений.Индекс(ТекущиеДанные); - - КонецЕсли; - - Возврат ИндексСтроки; - -КонецФункции - -&НаКлиенте -Процедура ВыполнитьПозиционированиеКурсора(ИндексСтроки) - - Если ИндексСтроки <> Неопределено Тогда - - // Выполняем проверки позиционирования курсора после получения новых данных. - Если СписокПриложений.Количество() <> 0 Тогда + Если СтрокаПриложение.ЭтоОбменСПриложениемВСервисе Тогда - Если ИндексСтроки > СписокПриложений.Количество() - 1 Тогда - - ИндексСтроки = СписокПриложений.Количество() - 1; + СтрокаПриложение.РежимРаботыПриложения = 1; + СтрокаПриложение.ДоступнаИнтерактивнаяОтправка = Истина; + + Иначе + + ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию( + СтрокаПриложение.УзелИнформационнойБазы); + + Если ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS + Или ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема Тогда + СтрокаПриложение.РежимРаботыПриложения = 1; // сервис + Иначе + СтрокаПриложение.РежимРаботыПриложения = 0; + КонецЕсли; + Если Не ЗначениеЗаполнено(ВидТранспорта) + Или (ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим) Тогда + // Обмен с этой базой настроен через WS. + СтрокаПриложение.ЗапускОбменаИзКорреспондента = Истина; КонецЕсли; - // позиционируем курсор - Элементы.СписокПриложений.ТекущаяСтрока = СписокПриложений[ИндексСтроки].ПолучитьИдентификатор(); + СтрокаПриложение.ВнешняяСистема = (ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема); + + СтрокаПриложение.ДоступнаИнтерактивнаяОтправка = + Не ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(СтрокаПриложение.ИмяПланаОбмена) + И Не ОбменДаннымиПовтИсп.ЭтоУзелСтандартногоОбменаДанными(СтрокаПриложение.ИмяПланаОбмена) + И Не СтрокаПриложение.ВнешняяСистема; КонецЕсли; - КонецЕсли; - - // Если спозиционировать строку не удалось, то устанавливаем текущей первую строку. - Если Элементы.СписокПриложений.ТекущаяСтрока = Неопределено - И СписокПриложений.Количество() <> 0 Тогда + СтрокаПриложение.ДоступнаИнтерактивнаяОтправка = СтрокаПриложение.ДоступнаИнтерактивнаяОтправка + И Не (СтрокаПриложение.ВариантОбменаДанными = "ТолькоПолучение"); - Элементы.СписокПриложений.ТекущаяСтрока = СписокПриложений[0].ПолучитьИдентификатор(); + СостояниеСинхронизации = СостояниеСинхронизацииДанных(СтрокаПриложение); + СтрокаПриложение.СостояниеПредставление = СостояниеСинхронизации.Представление; + СтрокаПриложение.СостояниеКартинка = СостояниеСинхронизации.Картинка; - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ПодробнаяИнформацияНаСервере(УзелОбмена) - - ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелОбмена); - - ВариантНастройкиОбмена = ОбменДаннымиСервер.СохраненныйВариантНастройкиУзлаПланаОбмена(УзелОбмена); - ВерсияКорреспондента = ОбменДаннымиСервер.ВерсияКорреспондента(УзелОбмена); - - СсылкаНаПодробноеОписание = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена( - ИмяПланаОбмена, "ПодробнаяИнформацияПоОбмену", ВариантНастройкиОбмена, ВерсияКорреспондента); - - Возврат СсылкаНаПодробноеОписание; - -КонецФункции - -&НаКлиенте -Процедура ОткрытьПомощникИнтерактивнойСинхронизации(ДополнительныеПараметры) - - ПараметрыПомощника = Новый Структура; - ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ДополнительныеПараметры.ЭтоОбменСПриложениемВСервисе); - ПараметрыПомощника.Вставить("ОбластьДанныхКорреспондента", ДополнительныеПараметры.ОбластьДанныхКорреспондента); - - ПараметрыПомощника.Вставить("ОтправитьДанные", Не ДополнительныеПараметры.ЗапускОбменаИзКорреспондента); - - ПараметрыПомощника.Вставить("РежимДополненияВыгрузки", - ДополнительныеПараметры.ИспользоватьДопОтборы Или ДополнительныеПараметры.ВариантОбменаДанными = "ПолучениеИОтправка"); - - ПараметрыПомощника.Вставить("НастройкаРасписания", Ложь); - - ВспомогательныеПараметры = Новый Структура; - ВспомогательныеПараметры.Вставить("ПараметрыПомощника", ПараметрыПомощника); - - ОбменДаннымиКлиент.ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(ДополнительныеПараметры.УзелОбмена, - ЭтотОбъект, ВспомогательныеПараметры); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьПомощникАвтоматическойСинхронизации(ДополнительныеПараметры) - - ПараметрыПомощника = Новый Структура; - ПараметрыПомощника.Вставить("ЭтоОбменСПриложениемВСервисе", ДополнительныеПараметры.ЭтоОбменСПриложениемВСервисе); - ПараметрыПомощника.Вставить("ОбластьДанныхКорреспондента", ДополнительныеПараметры.ОбластьДанныхКорреспондента); - - ВспомогательныеПараметры = Новый Структура; - ВспомогательныеПараметры.Вставить("ПараметрыПомощника", ПараметрыПомощника); - - ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(ДополнительныеПараметры.УзелОбмена, - ЭтотОбъект, , Истина, ВспомогательныеПараметры); - -КонецПроцедуры - -&НаКлиенте -Процедура ПродолжитьВыполнениеСинхронизации(Результат, ДополнительныеПараметры) Экспорт - - Если ДополнительныеПараметры.ПолученоСообщениеДляСопоставленияДанных Тогда - - ОткрытьПомощникИнтерактивнойСинхронизации(ДополнительныеПараметры); + Если СтрокаПриложение.НастройкаЗавершена Тогда - Иначе + СтруктураЗаголовков = АктуализироватьИнформациюОПроблемахСинхронизацииДанных(СтрокаПриложение.УзелИнформационнойБазы); + СтрокаПриложение.ОтправкаПредупреждения = СтруктураЗаголовков.ЗаголовокПредупрежденийОтправки; + СтрокаПриложение.ПолучениеПредупреждения = СтруктураЗаголовков.ЗаголовокПредупрежденийПолучении; + + КонецЕсли; - Если Не ДополнительныеПараметры.ДоступнаИнтерактивнаяОтправка - Или (ДополнительныеПараметры.ВариантОбменаДанными = "Синхронизация" - И Не ДополнительныеПараметры.ИспользоватьДопОтборы) Тогда - - ОткрытьПомощникАвтоматическойСинхронизации(ДополнительныеПараметры); + Если ЗначениеЗаполнено(СтрокаПриложение.ДатаПоследнегоЗапуска) Тогда + СтрокаПриложение.СостояниеВыгрузкиКартинка = КартинкаРезультатаВыполнения(СтрокаПриложение.РезультатПоследнейВыгрузкиДанных); + Если Не СтрокаПриложение.ПолученоСообщениеДляСопоставленияДанных Тогда + СтрокаПриложение.СостояниеЗагрузкиКартинка = КартинкаРезультатаВыполнения(СтрокаПриложение.РезультатПоследнейЗагрузкиДанных); + КонецЕсли; Иначе - ОткрытьПомощникИнтерактивнойСинхронизации(ДополнительныеПараметры); - + // Не отображаем надпись "Никогда", если синхронизация еще ни разу не выполнялась, + // чтобы не перегружать интерфейс. + СтрокаПриложение.ПредставлениеДатыПоследнейУспешнойВыгрузки = ""; + СтрокаПриложение.ПредставлениеДатыПоследнейУспешнойЗагрузки = ""; + КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПроверитьСовместимостьПравилКонвертации(ОбработкаПродолжения) - - ОписаниеОшибки = Неопределено; - Если ПравилаКонвертацииСовместимыСТекущейВерсией(ОбработкаПродолжения.ДополнительныеПараметры.ИмяПланаОбмена, ОписаниеОшибки) Тогда - - ВыполнитьОбработкуОповещения(ОбработкаПродолжения); - - Иначе - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("ПерейтиКЗагрузкеПравил", НСтр("ru = 'Загрузить правила'")); - Если ОписаниеОшибки.ВидОшибки <> "НекорректнаяКонфигурация" Тогда - Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); - КонецЕсли; - Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); - ДополнительныеПараметры.Вставить("ИмяПланаОбмена", ОбработкаПродолжения.ДополнительныеПараметры.ИмяПланаОбмена); - - Оповещение = Новый ОписаниеОповещения("ПослеПроверкиПравилКонвертацииНаСовместимость", ЭтотОбъект, ДополнительныеПараметры); - - ПараметрыФормы = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю(); - ПараметрыФормы.Картинка = ОписаниеОшибки.Картинка; - ПараметрыФормы.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; - Если ОписаниеОшибки.ВидОшибки = "НекорректнаяКонфигурация" Тогда - ПараметрыФормы.Заголовок = НСтр("ru = 'Синхронизация данных не может быть выполнена'"); - Иначе - ПараметрыФормы.Заголовок = НСтр("ru = 'Синхронизация данных может быть выполнена некорректно'"); + Если СтрокаПриложение.ПолученоСообщениеДляСопоставленияДанных Тогда + // Если получены данные для выполнения сопоставление, отображаем соответствующую дату получения сообщения. + СтрокаПриложение.ПредставлениеДатыПоследнейУспешнойЗагрузки = СтрокаПриложение.ПредставлениеДатыСообщенияДляСопоставленияДанных; + СтрокаПриложение.СостояниеЗагрузкиКартинка = 5; КонецЕсли; - СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Оповещение, ОписаниеОшибки.ТекстОшибки, Кнопки, ПараметрыФормы); + СтрокаПриложение.ИспользуютсяПравилаКонвертации = ОбменДаннымиПовтИсп.ЕстьМакетПланаОбмена(СтрокаПриложение.ИмяПланаОбмена, "ПравилаОбмена") + КонецЦикла; + + ТребуетсяОбновление = ОбменДаннымиСервер.ТребуетсяУстановкаОбновления(); + + Если ТребуетсяОбновление Тогда + ТребуетсяПерезагрузка = Ложь; + Иначе + ТребуетсяПерезагрузка = Справочники.ВерсииРасширений.РасширенияИзмененыДинамически(); КонецЕсли; + УстановитьОтображениеЭлементовФормы(); + КонецПроцедуры -&НаКлиенте -Процедура ПослеПроверкиПравилКонвертацииНаСовместимость(Результат, ДополнительныеПараметры) Экспорт - - Если Результат <> Неопределено Тогда - - Если Результат.Значение = "Продолжить" Тогда - - ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработкаПродолжения); - - ИначеЕсли Результат.Значение = "ПерейтиКЗагрузкеПравил" Тогда - - ОбменДаннымиКлиент.ЗагрузитьПравилаСинхронизацииДанных(ДополнительныеПараметры.ИмяПланаОбмена); - - КонецЕсли; // При "Отмена" ничего не делаем. - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция ПравилаКонвертацииСовместимыСТекущейВерсией(ИмяПланаОбмена, ОписаниеОшибки) - - ДанныеОПравилах = Неопределено; - Если Не ПравилаКонвертацииЗагруженыИзФайла(ИмяПланаОбмена, ДанныеОПравилах) Тогда - Возврат Истина; - КонецЕсли; - - Возврат РегистрыСведений.ПравилаДляОбменаДанными.ПравилаКонвертацииСовместимыСТекущейВерсией(ИмяПланаОбмена, - ОписаниеОшибки, ДанныеОПравилах); - -КонецФункции - -&НаСервере -Функция ПравилаКонвертацииЗагруженыИзФайла(ИмяПланаОбмена, ИнформацияОПравилах) - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос( - "ВЫБРАТЬ - | ПравилаДляОбменаДанными.ПравилаЗачитанные, - | ПравилаДляОбменаДанными.ВидПравил - |ИЗ - | РегистрСведений.ПравилаДляОбменаДанными КАК ПравилаДляОбменаДанными - |ГДЕ - | ПравилаДляОбменаДанными.ИмяПланаОбмена = &ИмяПланаОбмена - | И ПравилаДляОбменаДанными.ИсточникПравил = ЗНАЧЕНИЕ(Перечисление.ИсточникиПравилДляОбменаДанными.Файл) - | И ПравилаДляОбменаДанными.ПравилаЗагружены = ИСТИНА - | И ПравилаДляОбменаДанными.ВидПравил = ЗНАЧЕНИЕ(Перечисление.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов)"); - Запрос.УстановитьПараметр("ИмяПланаОбмена", ИмяПланаОбмена); - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - СтруктураПравил = Выборка.ПравилаЗачитанные.Получить().Конвертация; // Структура - - ИнформацияОПравилах = Новый Структура; - ИнформацияОПравилах.Вставить("ИмяКонфигурации", СтруктураПравил.Источник); - ИнформацияОПравилах.Вставить("ВерсияКонфигурации", СтруктураПравил.ВерсияКонфигурацииИсточника); - ИнформацияОПравилах.Вставить("СинонимКонфигурацииВПравилах", СтруктураПравил.СинонимКонфигурацииИсточника); - - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -&НаСервереБезКонтекста -Функция ПолученоСообщениеДляСопоставленияДанных(УзелОбмена) - - Возврат ОбменДаннымиСервер.ПолученоСообщениеСДаннымиДляСопоставления(УзелОбмена); - -КонецФункции - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/СинхронизацияДанных/СинхронизацияДанных.mdo b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/НастройкиСинхронизацииДанных.mdo similarity index 71% rename from SSL/src/CommonForms/СинхронизацияДанных/СинхронизацияДанных.mdo rename to SSL/src/CommonForms/НастройкиСинхронизацииДанных/НастройкиСинхронизацииДанных.mdo index dc326eb9c..c7684eaee 100644 --- a/SSL/src/CommonForms/СинхронизацияДанных/СинхронизацияДанных.mdo +++ b/SSL/src/CommonForms/НастройкиСинхронизацииДанных/НастройкиСинхронизацииДанных.mdo @@ -1,9 +1,9 @@ - СинхронизацияДанных + НастройкиСинхронизацииДанных ru - Синхронизация данных + Настройки синхронизации данных diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form index 99c68e1ff..d4f81b5cc 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form @@ -418,7 +418,7 @@ true - Сертификаты.Description + Сертификаты.Наименование СертификатыНаименованиеРасширеннаяПодсказка @@ -606,7 +606,7 @@ true - Сертификаты.Ref + Сертификаты.Ссылка СертификатыСсылкаРасширеннаяПодсказка @@ -2507,12 +2507,69 @@ true - Сертификаты.Ref + Сертификаты.Ссылка + ВЫБРАТЬ + СертификатыПереопределяемый.Ссылка КАК Ссылка, + СертификатыПереопределяемый.ПометкаУдаления КАК ПометкаУдаления, + СертификатыПереопределяемый.Наименование КАК Наименование, + СертификатыПереопределяемый.КомуВыдан КАК КомуВыдан, + СертификатыПереопределяемый.Фирма КАК Фирма, + СертификатыПереопределяемый.Фамилия КАК Фамилия, + СертификатыПереопределяемый.Имя КАК Имя, + СертификатыПереопределяемый.Отчество КАК Отчество, + СертификатыПереопределяемый.Должность КАК Должность, + СертификатыПереопределяемый.КемВыдан КАК КемВыдан, + СертификатыПереопределяемый.ДействителенДо КАК ДействителенДо, + СертификатыПереопределяемый.Подписание КАК Подписание, + СертификатыПереопределяемый.Шифрование КАК Шифрование, + СертификатыПереопределяемый.Отпечаток КАК Отпечаток, + СертификатыПереопределяемый.ДанныеСертификата КАК ДанныеСертификата, + СертификатыПереопределяемый.Программа КАК Программа, + СертификатыПереопределяемый.Отозван КАК Отозван, + СертификатыПереопределяемый.УсиленнаяЗащитаЗакрытогоКлюча КАК УсиленнаяЗащитаЗакрытогоКлюча, + СертификатыПереопределяемый.Организация КАК Организация, + СертификатыПереопределяемый.Пользователь КАК Пользователь, + СертификатыПереопределяемый.ПользовательОповещенОСрокеДействия КАК ПользовательОповещенОСрокеДействия, + СертификатыПереопределяемый.Добавил КАК Добавил, + &ДополнительноеПоле КАК СостояниеЗаявления, + СертификатыПереопределяемый.Предопределенный КАК Предопределенный, + СертификатыПереопределяемый.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, + ВЫБОР + КОГДА ПрограммыПереопределяемый.ЭтоПрограммаОблачногоСервиса + ТОГДА 4 + КОГДА СертификатыПереопределяемый.Программа = НЕОПРЕДЕЛЕНО + ИЛИ СертификатыПереопределяемый.Программа = ЗНАЧЕНИЕ(Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка) + ИЛИ НЕ ПрограммыПереопределяемый.Ссылка ЕСТЬ NULL + ТОГДА 1 + ИНАЧЕ 3 + КОНЕЦ + ВЫБОР + КОГДА СертификатыПереопределяемый.ПометкаУдаления + ТОГДА 4 + ИНАЧЕ 0 + КОНЕЦ КАК ТипРазмещения +ИЗ + Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК СертификатыПереопределяемый + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК ПрограммыПереопределяемый + ПО СертификатыПереопределяемый.Программа = ПрограммыПереопределяемый.Ссылка +ГДЕ + (&ПользовательСертификата = НЕОПРЕДЕЛЕНО + ИЛИ СертификатыПереопределяемый.Пользователь = &ПользовательСертификата + ИЛИ СертификатыПереопределяемый.Ссылка В + (ВЫБРАТЬ РАЗЛИЧНЫЕ + СертификатыКлючейЭлектроннойПодписиИШифрованияПользователиПереопределяемый.Ссылка КАК Ссылка + ИЗ + Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Пользователи КАК + СертификатыКлючейЭлектроннойПодписиИШифрованияПользователиПереопределяемый + ГДЕ + (СертификатыКлючейЭлектроннойПодписиИШифрованияПользователиПереопределяемый.Пользователь = &ПользовательСертификата + ИЛИ + СертификатыКлючейЭлектроннойПодписиИШифрованияПользователиПереопределяемый.Ссылка.Пользователь = &ПользовательСертификата))) Catalog.СертификатыКлючейЭлектроннойПодписиИШифрования true true + true true true @@ -2537,7 +2594,7 @@ Ссылка 1 - CatalogRef.ПрограммыЭлектроннойПодписиИШифрования + DefinedType.ПрограммаЭлектроннойПодписи true @@ -2749,6 +2806,22 @@ true + + ТипРазмещения + 15 + + Number + + 10 + + + + true + + + true + + ПроверятьПодписиНаСервере diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl index 6b824d6b5..64a9c48ec 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl @@ -78,18 +78,26 @@ НСтр("ru = 'Список программ, предусмотренных администратором, которые можно использовать на компьютере'"); КонецЕсли; + ТекстЗапроса = Сертификаты.ТекстЗапроса; Если ЭлектроннаяПодпись.ОбщиеНастройки().ЗаявлениеНаВыпускСертификатаДоступно Тогда МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ЗаполнитьСписокВыбораСостоянияЗаявления(Элементы.СертификатыПоказатьЗаявления.СписокВыбора); + МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДополнитьЗапросСостояниемВСпискеСертификатов(ТекстЗапроса); Иначе + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ДополнительноеПоле", "НЕОПРЕДЕЛЕНО"); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "СертификатыСоздать", "Видимость", Истина); Элементы.СертификатыДобавить.Видимость = Ложь; Элементы.СертификатыПоказатьЗаявления.Видимость = Ложь; - Элементы.Инструкция.Видимость = Ложь; + Элементы.СертификатыСостояниеЗаявления.Видимость = Ложь; КонецЕсли; + СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); + СвойстваСписка.ТекстЗапроса = ТекстЗапроса; + ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Сертификаты, СвойстваСписка); + СертификатыОбновитьОтбор(ЭтотОбъект, Пользователи.ТекущийПользователь()); Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда @@ -113,6 +121,15 @@ ЗаполнитьПрограммыИНастройки(); + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() + ИЛИ ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + Элементы.Программы.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов"); + Элементы.Программы.ПутьКДаннымКартинкиСтроки = "Программы.ТипРазмещения"; + Элементы.Сертификаты.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов");; + Элементы.Сертификаты.ПутьКДаннымКартинкиСтроки = "Сертификаты.ТипРазмещения"; + КонецЕсли; + ОбновитьТекущуюВидимостьЭлементов(); КонецПроцедуры @@ -350,7 +367,12 @@ Отказ = Истина; Если Элементы.Программы.ИзменятьСоставСтрок Тогда - ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.ФормаОбъекта"); + Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ДобавлениеПрограммыЭлектроннойПодписи(Неопределено); + Иначе + ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.ФормаОбъекта"); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -513,6 +535,9 @@ ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( Форма.Сертификаты, "Пользователь", ТекущийПользователь,,, ПоказатьСвои); + Форма.Сертификаты.Параметры.УстановитьЗначениеПараметра("ПользовательСертификата", + ?(ПоказатьСвои, ТекущийПользователь, Неопределено)); + Элементы.СертификатыПользователь.Видимость = Не ПоказатьСвои; Если Элементы.СертификатыПоказатьЗаявления.Видимость Тогда @@ -553,30 +578,36 @@ &НаСервере Процедура ИзменитьПометкуУдаленияПрограммы(Программа) - ЗаблокироватьДанныеДляРедактирования(Программа, , УникальныйИдентификатор); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); - ЭлементБлокировки.УстановитьЗначение("Ссылка", Программа); - - НачатьТранзакцию(); - Попытка + Если ТипЗнч(Программа) = ЭлектроннаяПодписьСлужебный.ПолучитьТипОблачнойПодписи() Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ИзменитьПометкуУдаленияПрограммы(Программа, УникальныйИдентификатор); - Блокировка.Заблокировать(); + Иначе + ЗаблокироватьДанныеДляРедактирования(Программа, , УникальныйИдентификатор); - Объект = Программа.ПолучитьОбъект(); - Объект.ПометкаУдаления = Не Объект.ПометкаУдаления; - Объект.Записать(); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Программа); - ЗафиксироватьТранзакцию(); + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + Объект = Программа.ПолучитьОбъект(); + Объект.ПометкаУдаления = Не Объект.ПометкаУдаления; + Объект.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + РазблокироватьДанныеДляРедактирования(Программа, УникальныйИдентификатор); + ВызватьИсключение; + КонецПопытки; - Исключение - ОтменитьТранзакцию(); РазблокироватьДанныеДляРедактирования(Программа, УникальныйИдентификатор); - ВызватьИсключение; - КонецПопытки; - - РазблокироватьДанныеДляРедактирования(Программа, УникальныйИдентификатор); + КонецЕсли; ЗаполнитьПрограммыИНастройки(Истина); @@ -613,7 +644,10 @@ КонецЕсли; Если Константы.ИспользоватьШифрование.Получить() Тогда - Если ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = + НСтр("ru = 'Из установленных в сервисе облачной подписи и на компьютере...'"); + ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = НСтр("ru = 'Из установленных в облачном сервисе и на компьютере...'"); Иначе @@ -621,7 +655,10 @@ НСтр("ru = 'Из установленных на компьютере...'"); КонецЕсли; Иначе - Если ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = + НСтр("ru = 'Из установленных в сервисе облачной подписи и на компьютере...'"); + ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок = НСтр("ru = 'Из установленных в облачном сервисе и на компьютере'"); Иначе @@ -809,6 +846,11 @@ ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина); ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст); Возврат; + ИначеЕсли ЭлектроннаяПодписьСлужебныйКлиентСервер.РазмещениеСертификата(ОписаниеПрограммы.ТипРазмещения) = "ОблачнаяПодпись" Тогда + ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, НСтр("ru = 'Доступен.'")); + ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина); + ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст); + Возврат; КонецЕсли; ОписанияПрограмм = Новый Массив; @@ -944,7 +986,8 @@ | Программы.АлгоритмХеширования, | Программы.АлгоритмШифрования, | Программы.ПометкаУдаления КАК ПометкаУдаления, - | Программы.ЭтоПрограммаОблачногоСервиса + | Программы.ЭтоПрограммаОблачногоСервиса, + | 1 КАК ТипРазмещения |ИЗ | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы |ГДЕ @@ -961,7 +1004,8 @@ | Программы.АлгоритмХеширования, | Программы.АлгоритмШифрования, | Программы.ПометкаУдаления, - | Программы.ЭтоПрограммаОблачногоСервиса + | Программы.ЭтоПрограммаОблачногоСервиса, + | 4 |ИЗ | Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы |ГДЕ @@ -974,16 +1018,21 @@ Запрос.УстановитьПараметр("ИспользоватьЭлектроннуюПодписьВМоделиСервиса", ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса()); - Выборка = Запрос.Выполнить().Выбрать(); + ТаблицаВыборки = Запрос.Выполнить().Выгрузить(); + + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ДополнитьВыборкуПрограмм(ТаблицаВыборки); + КонецЕсли; ОбработанныеСтроки = Новый Соответствие; Индекс = 0; - Пока Выборка.Следующий() Цикл - Если Не Пользователи.ЭтоПолноправныйПользователь() И Выборка.ПометкаУдаления Тогда + Для каждого СтрокаВыборки Из ТаблицаВыборки Цикл + Если Не Пользователи.ЭтоПолноправныйПользователь() И СтрокаВыборки.ПометкаУдаления Тогда Продолжить; КонецЕсли; - Строки = Программы.НайтиСтроки(Новый Структура("Ссылка", Выборка.Ссылка)); + Строки = Программы.НайтиСтроки(Новый Структура("Ссылка", СтрокаВыборки.Ссылка)); Если Строки.Количество() = 0 Тогда Если Программы.Количество()-1 < Индекс Тогда Строка = Программы.Добавить(); @@ -998,20 +1047,25 @@ КонецЕсли; КонецЕсли; // Обновление только измененных значений, чтобы таблица формы не обновлялась лишний раз. - ОбновитьЗначение(Строка.Ссылка, Выборка.Ссылка); - ОбновитьЗначение(Строка.ПометкаУдаления, Выборка.ПометкаУдаления); - ОбновитьЗначение(Строка.Наименование, Выборка.Наименование); - ОбновитьЗначение(Строка.ИмяПрограммы, Выборка.ИмяПрограммы); - ОбновитьЗначение(Строка.ТипПрограммы, Выборка.ТипПрограммы); - ОбновитьЗначение(Строка.АлгоритмПодписи, Выборка.АлгоритмПодписи); - ОбновитьЗначение(Строка.АлгоритмХеширования, Выборка.АлгоритмХеширования); - ОбновитьЗначение(Строка.АлгоритмШифрования, Выборка.АлгоритмШифрования); - ОбновитьЗначение(Строка.LinuxПутьКПрограмме, ПутиКПрограммам.Получить(Выборка.Ссылка)); - ОбновитьЗначение(Строка.НомерКартинки, ?(Выборка.ПометкаУдаления, 4, 3)); - ОбновитьЗначение(Строка.ЭтоПрограммаОблачногоСервиса, Выборка.ЭтоПрограммаОблачногоСервиса); + ОбновитьЗначение(Строка.Ссылка, СтрокаВыборки.Ссылка); + ОбновитьЗначение(Строка.ПометкаУдаления, СтрокаВыборки.ПометкаУдаления); + ОбновитьЗначение(Строка.Наименование, СтрокаВыборки.Наименование); + ОбновитьЗначение(Строка.ИмяПрограммы, СтрокаВыборки.ИмяПрограммы); + ОбновитьЗначение(Строка.ТипПрограммы, СтрокаВыборки.ТипПрограммы); + ОбновитьЗначение(Строка.АлгоритмПодписи, СтрокаВыборки.АлгоритмПодписи); + ОбновитьЗначение(Строка.АлгоритмХеширования, СтрокаВыборки.АлгоритмХеширования); + ОбновитьЗначение(Строка.АлгоритмШифрования, СтрокаВыборки.АлгоритмШифрования); + ОбновитьЗначение(Строка.LinuxПутьКПрограмме, ПутиКПрограммам.Получить(СтрокаВыборки.Ссылка)); + ОбновитьЗначение(Строка.НомерКартинки, ?(СтрокаВыборки.ПометкаУдаления, 4, 3)); + ОбновитьЗначение(Строка.ЭтоПрограммаОблачногоСервиса, СтрокаВыборки.ЭтоПрограммаОблачногоСервиса); + ОбновитьЗначение(Строка.ТипРазмещения, СтрокаВыборки.ТипРазмещения + ?(СтрокаВыборки.ПометкаУдаления, 4, 0)); Если Строка.ЭтоПрограммаОблачногоСервиса И Не Строка.ПометкаУдаления Тогда ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'")); ОбновитьЗначение(Строка.Установлена, Истина); + ИначеЕсли ЭлектроннаяПодписьСлужебныйКлиентСервер.РазмещениеСертификата(СтрокаВыборки.ТипРазмещения) = "ОблачнаяПодпись" + И Не Строка.ПометкаУдаления Тогда + ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'")); + ОбновитьЗначение(Строка.Установлена, Истина); КонецЕсли; ОбработанныеСтроки.Вставить(Строка, Истина); diff --git a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl index d058ea7e8..558d862f2 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl +++ b/SSL/src/CommonForms/ОписаниеИзмененийПрограммы/Module.bsl @@ -140,7 +140,8 @@ &НаКлиенте Процедура ОписаниеОбновленийВыбор(Элемент, Область, СтандартнаяОбработка) - Если СтрНайти(Область.Текст, "http://") = 1 Или СтрНайти(Область.Текст, "https://") = 1 Тогда + Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") + И (СтрНайти(Область.Текст, "http://") = 1 Или СтрНайти(Область.Текст, "https://") = 1) Тогда ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(Область.Текст); КонецЕсли; diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Form.form b/SSL/src/CommonForms/ОтправкаСообщения/Form.form index a555cafa9..c2a733b78 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Form.form +++ b/SSL/src/CommonForms/ОтправкаСообщения/Form.form @@ -130,7 +130,7 @@ Кому: - Кому: + Кому @@ -139,7 +139,7 @@ Копия: - Копия: + Копия @@ -148,7 +148,7 @@ Скрытая копия: - Скрытая копия: + СкрытаяКопия Normal diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl index d34f4b999..f6f783545 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl @@ -18,6 +18,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ОбщегоНазначения.УстановитьУсловноеОформлениеСпискаВыбора(ЭтотОбъект, "ПочтовыйАдресПолучателейВариантОтправки", "ПочтовыеАдресаПолучателей.ВариантОтправки"); + РезультатУспехЦвет = ЦветаСтиля.РезультатУспехЦвет; ВложенияДляПисьма = Новый Структура; @@ -76,7 +78,7 @@ Для Каждого ЭлементПочтовыйАдрес Из Параметры.Получатель Цикл НовыйПолучатель = ПочтовыеАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = НСтр("ru = 'Кому:'"); + НовыйПолучатель.ВариантОтправки = "Кому"; Если ЗначениеЗаполнено(ЭлементПочтовыйАдрес.Представление) Тогда НовыйПолучатель.Представление = ЭлементПочтовыйАдрес.Представление + " <" @@ -89,7 +91,7 @@ ИначеЕсли ТипЗнч(Параметры.Получатель) = Тип("Строка") Тогда НовыйПолучатель = ПочтовыеАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = НСтр("ru = 'Кому:'"); + НовыйПолучатель.ВариантОтправки = "Кому"; НовыйПолучатель.Представление = Параметры.Получатель; ИначеЕсли ТипЗнч(Параметры.Получатель) = Тип("Массив") Тогда Для Каждого СтруктураПолучателя Из Параметры.Получатель Цикл @@ -101,7 +103,7 @@ КонецЕсли; Если (ЕстьСвойствоВыбран И СтруктураПолучателя.Выбран) ИЛИ (НЕ ЕстьСвойствоВыбран) Тогда НовыйПолучатель = ПочтовыеАдресаПолучателей.Добавить(); - НовыйПолучатель.ВариантОтправки = НСтр("ru = 'Кому:'"); + НовыйПолучатель.ВариантОтправки = "Кому"; НовыйПолучатель.Представление = СтруктураПолучателя.Представление + " <" + СокрЛП(Адрес) + ">"; КонецЕсли; КонецЦикла; @@ -124,7 +126,7 @@ Если ПочтовыеАдресаПолучателей.Количество() = 0 Тогда НоваяСтрока = ПочтовыеАдресаПолучателей.Добавить(); - НоваяСтрока.ВариантОтправки = НСтр("ru = 'Кому:'"); + НоваяСтрока.ВариантОтправки = "Кому"; НоваяСтрока.Представление = ""; КонецЕсли; @@ -258,7 +260,7 @@ &НаКлиенте Процедура ПочтовыйАдресаПолучателейПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Если НоваяСтрока Тогда - Элемент.ТекущиеДанные.ВариантОтправки = Элементы.ПочтовыйАдресПолучателейВариантОтправки.СписокВыбора.НайтиПоЗначению("Кому:"); + Элемент.ТекущиеДанные.ВариантОтправки = "Кому"; Элемент.ТекущийЭлемент = Элементы.ПочтовыйАдресПолучателейПредставление; КонецЕсли; КонецПроцедуры @@ -712,9 +714,9 @@ Для каждого Получатель Из ПочтовыеАдресаПолучателей Цикл ПочтаПолучателей = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель.Представление); Для каждого ПочтаПолучателя Из ПочтаПолучателей Цикл - Если Получатель.ВариантОтправки = НСтр("ru = 'Скрытая копия:'") Тогда + Если Получатель.ВариантОтправки = "СкрытаяКопия" Тогда СкрытыеКопии.Добавить(Новый Структура("Адрес, Представление", ПочтаПолучателя.Адрес, ПочтаПолучателя.Псевдоним)); - ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Копия:'") Тогда + ИначеЕсли Получатель.ВариантОтправки = "Копия" Тогда Копии.Добавить(Новый Структура("Адрес, Представление", ПочтаПолучателя.Адрес, ПочтаПолучателя.Псевдоним)); Иначе Кому.Добавить(Новый Структура("Адрес, Представление", ПочтаПолучателя.Адрес, ПочтаПолучателя.Псевдоним)); @@ -978,7 +980,7 @@ Если ТипЗнч(Результат.Получатель) = Тип("СписокЗначений") Тогда Для Каждого Получатель Из Результат.Получатель Цикл АдресПолучателя = ПочтовыеАдресаПолучателей.Добавить(); - АдресПолучателя.ВариантОтправки = НСтр("ru = 'Кому:'"); + АдресПолучателя.ВариантОтправки = "Кому"; АдресПолучателя.Представление = Получатель.Представление; КонецЦикла; КонецЕсли; diff --git a/SSL/src/CommonForms/ПанельОтчетов/Form.form b/SSL/src/CommonForms/ПанельОтчетов/Form.form index 52be1cfe2..7891f8ef5 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Form.form +++ b/SSL/src/CommonForms/ПанельОтчетов/Form.form @@ -14,6 +14,7 @@ СтрокаПоиска + None ru Поиск отчетов по наименованиям, описаниям, именам авторов, а также по наименованиям полей и другим настройкам. @@ -57,6 +58,10 @@ true true Normal + + ru + Наименование, поле или автор отчета + @@ -2632,6 +2637,7 @@ ВыполнитьПоиск + Picture DontUse Auto diff --git a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl index 8192ba14d..62bb658a2 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl +++ b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl @@ -905,7 +905,7 @@ ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива); КонецЕсли; - ИмяВременногоКаталога = ПолучитьИмяВременногоФайла(); + ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); СоздатьКаталог(ИмяВременногоКаталога); ВыбранныеФорматыСохранения = НастройкиСохранения.ФорматыСохранения; @@ -923,8 +923,7 @@ Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл ИмяФайла = УправлениеПечатью.ИмяФайлаОфисногоДокумента(ФайлОфисногоДокумента.Значение); Если ЗаписьZipФайла <> Неопределено Тогда - ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) - + ИмяФайла); + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ИмяВременногоКаталога + ИмяФайла); ДвоичныеДанные = ПолучитьИзВременногоХранилища(ФайлОфисногоДокумента.Ключ); // ДвоичныеДанные - ДвоичныеДанные.Записать(ПолноеИмяФайла); ЗаписьZipФайла.Добавить(ПолноеИмяФайла); @@ -982,9 +981,21 @@ ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла); КонецЕсли; - ИмяФайла = ИмяФайла + "." + НастройкиФормата.Расширение; + РасширениеФайла = НастройкиФормата.Расширение; + ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла; + ПолноеИмяФайла = ИмяВременногоКаталога + ИмяФайлаСРасширением; - ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ИмяФайла); + МаксимальнаяДлина = 218; // https://docs.microsoft.com/en-us/office/troubleshoot/office-suite-issues/error-open-document + Если ТипФайла = ТипФайлаТабличногоДокумента.XLS И СтрДлина(ПолноеИмяФайла) > МаксимальнаяДлина Тогда + МаксимальнаяДлина = МаксимальнаяДлина - 5; // Резерв для формирования уникального имени. + Если СтрДлина(ИмяВременногоКаталога) < МаксимальнаяДлина Тогда + ИмяФайла = Лев(ИмяФайла, МаксимальнаяДлина - СтрДлина(ИмяВременногоКаталога) - СтрДлина(РасширениеФайла) - 1); + ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла; + ПолноеИмяФайла = ИмяВременногоКаталога + ИмяФайлаСРасширением; + КонецЕсли; + КонецЕсли; + + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ПолноеИмяФайла); ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла); Если ТипФайла = ТипФайлаТабличногоДокумента.HTML Тогда @@ -997,7 +1008,7 @@ ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла); ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища); ОписаниеФайла = Новый Структура; - ОписаниеФайла.Вставить("Представление", ИмяФайла); + ОписаниеФайла.Вставить("Представление", ИмяФайлаСРасширением); ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище); Если ТипФайла = ТипФайлаТабличногоДокумента.ANSITXT Тогда ОписаниеФайла.Вставить("Кодировка", "windows-1251"); diff --git a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form index 7fd959c68..9aac09bb5 100644 --- a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form +++ b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form @@ -430,10 +430,6 @@ true - - <key>ru</key> - <value>Получатели контекстное меню группа управление выбором</value> - ПолучателиКонтекстноеМенюГруппаУправлениеВыборомExtendedTooltip 69 diff --git a/SSL/src/CommonForms/ПраваДоступа/Form.form b/SSL/src/CommonForms/ПраваДоступа/Form.form index 52efc7d47..114d3a2ea 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Form.form +++ b/SSL/src/CommonForms/ПраваДоступа/Form.form @@ -1461,6 +1461,19 @@ true + + ГруппаДоступаАдминистраторы + 7 + + CatalogRef.ГруппыДоступа + + + true + + + true + + ВключитьВГруппу diff --git a/SSL/src/CommonForms/ПраваДоступа/Module.bsl b/SSL/src/CommonForms/ПраваДоступа/Module.bsl index 4114d4c71..1e5c55811 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступа/Module.bsl @@ -14,6 +14,8 @@ ПользовательИБПолноправный = Пользователи.ЭтоПолноправныйПользователь(); СвойДоступ = Параметры.Пользователь = Пользователи.АвторизованныйПользователь(); + ГруппаДоступаАдминистраторы = УправлениеДоступом.ГруппаДоступаАдминистраторы(); + ПользовательИБОтветственный = НЕ ПользовательИБПолноправный И ПравоДоступа("Редактирование", Метаданные.Справочники.ГруппыДоступа); @@ -238,7 +240,7 @@ ДополнительныеПараметры.Вставить("ВключитьВГруппуДоступа", ВключитьВГруппуДоступа); Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().РазделениеВключено - И ГруппаДоступа = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + И ГруппаДоступа = ГруппаДоступаАдминистраторы Тогда ПользователиСлужебныйКлиент.ЗапроситьПарольДляАутентификацииВСервисе( Новый ОписаниеОповещения( @@ -407,7 +409,7 @@ КонецЕсли; Если ОбщегоНазначения.РазделениеВключено() - И ГруппаДоступа = Справочники.ГруппыДоступа.Администраторы + И ГруппаДоступа = ГруппаДоступаАдминистраторы И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); @@ -441,7 +443,7 @@ КонецЕсли; КонецЕсли; - Если ГруппаДоступаОбъект.Ссылка = Справочники.ГруппыДоступа.Администраторы Тогда + Если ГруппаДоступаОбъект.Ссылка = ГруппаДоступаАдминистраторы Тогда Если ОбщегоНазначения.РазделениеВключено() Тогда ГруппаДоступаОбъект.ДополнительныеСвойства.Вставить( diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl index 84c9d82c7..08ec3e642 100644 --- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl @@ -10,7 +10,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - + + ПрофильАдминистратор = УправлениеДоступом.ПрофильАдминистратор(); УстановитьУсловноеОформление(); Если НЕ ЗначениеЗаполнено(Параметры.Пользователь) Тогда @@ -58,8 +59,6 @@ КонецЦикла; ТекущаяГруппаДоступа = ""; - ПрофильАдминистратор = Справочники.ПрофилиГруппДоступа.Администратор; - // Определение необходимости настройки ограничений доступа. Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда Элементы.Доступ.Видимость = Ложь; @@ -178,7 +177,7 @@ КонецЕсли; Если ТекущиеДанные <> Неопределено - И ТекущиеДанные.Профиль = ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда + И ТекущиеДанные.Профиль = ПрофильАдминистратор Тогда ТребуетсяСинхронизацияССервисом = Истина; КонецЕсли; @@ -372,7 +371,7 @@ ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Профили.Профиль"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = Справочники.ПрофилиГруппДоступа.Администратор; + ОтборЭлемента.ПравоеЗначение = ПрофильАдминистратор; Элемент.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь); @@ -397,7 +396,7 @@ ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Профили.Профиль"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = Справочники.ПрофилиГруппДоступа.Администратор; + ОтборЭлемента.ПравоеЗначение = ПрофильАдминистратор; Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); @@ -488,6 +487,7 @@ Запрос = Новый Запрос; Запрос.УстановитьПараметр("Пользователь", Параметры.Пользователь); + Запрос.УстановитьПараметр("ПрофильАдминистратор", ПрофильАдминистратор); Запрос.УстановитьПараметр("ОтборПрофилейТолькоТекущегоПользователя", ОтборПрофилейТолькоТекущегоПользователя); Запрос.Текст = @@ -505,7 +505,7 @@ | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа | ПО Профили.Ссылка = ГруппыДоступа.Профиль | И (НЕ(ГруппыДоступа.Пользователь <> &Пользователь - | И НЕ Профили.Ссылка В (ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)))) + | И Профили.Ссылка <> &ПрофильАдминистратор)) | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи | ПО (ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка) | И (ГруппыДоступаПользователи.Пользователь = &Пользователь) @@ -595,6 +595,7 @@ // Получение списка изменений. Запрос = Новый Запрос; Запрос.УстановитьПараметр("Пользователь", Параметры.Пользователь); + Запрос.УстановитьПараметр("ПрофильАдминистратор", ПрофильАдминистратор); Запрос.УстановитьПараметр("Профили", Профили.Выгрузить(, "Профиль, Пометка")); Запрос.УстановитьПараметр("ВидыДоступа", ВидыДоступа.Выгрузить(, "ГруппаДоступа, ВидДоступа, ВсеРазрешены")); @@ -659,7 +660,7 @@ | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа | ПО Профили.Ссылка = ГруппыДоступа.Профиль | И (НЕ(ГруппыДоступа.Пользователь <> &Пользователь - | И НЕ Профили.Ссылка В (ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)))) + | И Профили.Ссылка <> &ПрофильАдминистратор)) | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи | ПО (ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка) | И (ГруппыДоступаПользователи.Пользователь = &Пользователь) @@ -806,7 +807,7 @@ ГруппаДоступаОбъект.Профиль = Изменение.Профиль; КонецЕсли; - Если Изменение.Профиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда + Если Изменение.Профиль = ПрофильАдминистратор Тогда Если ТребуетсяСинхронизацияССервисом Тогда ГруппаДоступаОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса); diff --git a/SSL/src/CommonForms/Расширения/Module.bsl b/SSL/src/CommonForms/Расширения/Module.bsl index 6a5323acd..0d76db576 100644 --- a/SSL/src/CommonForms/Расширения/Module.bsl +++ b/SSL/src/CommonForms/Расширения/Module.bsl @@ -729,11 +729,12 @@ КонецПроцедуры // Параметры: -// ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла -// МодульОбновлениеКонфигурацииКлиент - CommonModule.ОбновлениеКонфигурацииКлиент +// ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла +// МодульОбновлениеКонфигурацииКлиент - ОбщийМодуль +// // Возвращаемое значение: // Булево -// +// &НаКлиенте Функция ВыбранныеФайлыСодержатИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент) @@ -750,9 +751,10 @@ // Параметры: // ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла -// МодульОбновлениеКонфигурацииКлиент - CommonModule.ОбновлениеКонфигурацииКлиент +// МодульОбновлениеКонфигурацииКлиент - ОбщийМодуль +// // Возвращаемое значение: -// Булево +// Булево // &НаКлиенте Функция ВыбранныеФайлыСодержатТолькоИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент) @@ -770,6 +772,7 @@ // Параметры: // ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла +// // Возвращаемое значение: // Строка // diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl index 7b693248c..80ad6557f 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl @@ -178,7 +178,7 @@ Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл Размер = Область.Шрифт.Размер; Размер = Размер + ШагИзмененияРазмераШрифтаУвеличение(Размер); - Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); + Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); // АПК:1345 - Применение стиля не требуется. КонецЦикла; КонецПроцедуры @@ -192,7 +192,7 @@ Если Размер < 1 Тогда Размер = 1; КонецЕсли; - Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); + Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); // АПК:1345 - Применение стиля не требуется. КонецЦикла; КонецПроцедуры @@ -205,7 +205,7 @@ Если УстанавливаемоеЗначение = Неопределено Тогда УстанавливаемоеЗначение = Не Область.Шрифт.Зачеркивание = Истина; КонецЕсли; - Область.Шрифт = Новый Шрифт(Область.Шрифт,,,,,,УстанавливаемоеЗначение); + Область.Шрифт = Новый Шрифт(Область.Шрифт,,,,,,УстанавливаемоеЗначение); // АПК:1345 - Применение стиля не требуется. КонецЦикла; ОбновитьПометкиКнопокКоманднойПанели(); diff --git a/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl b/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl index 761a144f9..d146721ad 100644 --- a/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl +++ b/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl @@ -105,10 +105,8 @@ // Выводит строки дерева родительских объектов. // // Параметры: -// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева -// которые выводятся в табличный документ. -// Макет - МакетТабличногоДокумента - макет, на основании которого -// происходит вывод в табличный документ. +// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева которые выводятся в табличный документ. +// Макет - ТабличныйДокумент - макет, на основании которого происходит вывод в табличный документ. // УровниРекурсии - Число - уровень рекурсии процедуры. // &НаСервере @@ -311,7 +309,7 @@ // Выводит в табличный документ строку с документом, для которого формируется структура подчиненности. // // Параметры: -// Макет - МакетТабличногоДокумента - макет, на основании которого формируется табличный документ. +// Макет - ТабличныйДокумент - макет, на основании которого формируется табличный документ. // &НаСервере Процедура ВывестиТекущийОбъект(Макет) @@ -337,11 +335,11 @@ // Формирует представление документа для вывода в табличный документ. // // Параметры: -// Выборка - ВыборкаИзРезультатаЗапроса или ДанныеФормыЭлементДерева - набор данных -// на основании которого формируется представление. +// Выборка - ВыборкаИзРезультатаЗапроса +// - ДанныеФормыЭлементДерева - набор данных на основании которого формируется представление. // // Возвращаемое значение: -// Строка - сформированное представление. +// Строка - сформированное представление. // &НаСервере Функция ПредставлениеОбъектаДляВыводаВОтчет(Выборка) @@ -367,10 +365,8 @@ // Выводит строки дерева подчиненных документов. // // Параметры: -// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева -// которые выводятся в табличный документ. -// Макет - МакетТабличногоДокумента - макет, на основании которого -// происходит вывод в табличный документ. +// СтрокиДерева - ДанныеФормыКоллекцияЭлементовДерева - строки дерева которые выводятся в табличный документ. +// Макет - ТабличныйДокумент - макет, на основании которого происходит вывод в табличный документ. // УровниРекурсии - Число - уровень рекурсии процедуры. // &НаСервере @@ -485,8 +481,7 @@ // Параметры: // ТекущийОбъект - ДокументСсылка // - СправочникСсылка -// - ПВХСсылка - ссылка на объект, значения реквизитов которого -// получаются запросом. +// - ПланВидовХарактеристикСсылка - ссылка на объект, значения реквизитов которого получаются запросом. // // Возвращаемое значение: // ВыборкаИзРезультатаЗапроса @@ -1439,7 +1434,10 @@ Иначе ВыбранныйОбъект = Документ.ПолучитьОбъект(); // ДокументОбъект - ВыбранныйОбъект.Записать(Режим); + + Если ВыбранныйОбъект.ПроверитьЗаполнение() Тогда + ВыбранныйОбъект.Записать(Режим); + КонецЕсли; ОбработанныеДокументы.Вставить(Документ, СвойстваДокумента.Представление); diff --git a/SSL/src/CommonForms/Сертификат/Form.form b/SSL/src/CommonForms/Сертификат/Form.form index ace7d79b4..be6d80d2d 100644 --- a/SSL/src/CommonForms/Сертификат/Form.form +++ b/SSL/src/CommonForms/Сертификат/Form.form @@ -1393,6 +1393,10 @@ <horizontalAlign>Left</horizontalAlign> <autoFill>true</autoFill> </autoCommandBar> + <handlers> + <event>OnOpen</event> + <name>ПриОткрытии</name> + </handlers> <handlers> <event>OnCreateAtServer</event> <name>ПриСозданииНаСервере</name> @@ -1768,6 +1772,28 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ОшибкаНаСервере</name> + <id>13</id> + <valueType/> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + </attributes> + <attributes> + <name>ОшибкаНаКлиенте</name> + <id>14</id> + <valueType/> + <view> + <common>true</common> + </view> + <edit> + <common>true</common> + </edit> + </attributes> <formCommands> <name>СохранитьВФайл</name> <title> @@ -1828,6 +1854,10 @@ <stringQualifiers/> </valueType> </parameters> + <parameters> + <name>ОшибкаНаКлиенте</name> + <valueType/> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/CommonForms/Сертификат/Module.bsl b/SSL/src/CommonForms/Сертификат/Module.bsl index 1410d4db6..fb38e5fb3 100644 --- a/SSL/src/CommonForms/Сертификат/Module.bsl +++ b/SSL/src/CommonForms/Сертификат/Module.bsl @@ -11,6 +11,8 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ОшибкаНаКлиенте = Параметры.ОшибкаНаКлиенте; + Если ЗначениеЗаполнено(Параметры.АдресСертификата) Тогда ДанныеСертификата = ПолучитьИзВременногоХранилища(Параметры.АдресСертификата); Сертификат = Новый СертификатКриптографии(ДанныеСертификата); @@ -19,18 +21,21 @@ ИначеЕсли ЗначениеЗаполнено(Параметры.Ссылка) Тогда АдресСертификата = АдресСертификата(Параметры.Ссылка, УникальныйИдентификатор); - Если АдресСертификата = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось открыть сертификат ""%1"", - |т.к. он не существует в справочнике.'"), Параметры.Ссылка); + Если Не ЗначениеЗаполнено(АдресСертификата) Тогда + ОшибкаНаСервере = Новый Структура; + ОшибкаНаСервере.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат ""%1"", + |не найден в справочнике сертификатов.'"), Параметры.Ссылка)); + Возврат; КонецЕсли; Иначе // Отпечаток АдресСертификата = АдресСертификата(Параметры.Отпечаток, УникальныйИдентификатор); - Если АдресСертификата = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось открыть сертификат, т.к. он не найден - |по отпечатку ""%1"".'"), Параметры.Отпечаток); + Если Не ЗначениеЗаполнено(АдресСертификата) Тогда + ОшибкаНаСервере = Новый Структура; + ОшибкаНаСервере.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сертификат не найден по отпечатку ""%1"".'"), Параметры.Отпечаток)); + Возврат; КонецЕсли; КонецЕсли; @@ -70,6 +75,18 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если ЗначениеЗаполнено(ОшибкаНаСервере) Тогда + Отказ = Истина; + ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме( + НСтр("ru = 'Не удалось открыть сертификат'"), "", + ОшибкаНаКлиенте, ОшибкаНаСервере); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -150,7 +167,7 @@ КонецЕсли; Для каждого ЭлементСписка Из ПредставленияСвойств Цикл - ЗначениеСвойства = Коллекция[ЭлементСписка.Ключ]; + ЗначениеСвойства = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Коллекция, ЭлементСписка.Ключ); Если Не ЗначениеЗаполнено(ЗначениеСвойства) Тогда Продолжить; КонецЕсли; @@ -182,7 +199,7 @@ КонецЕсли; Для каждого ЭлементСписка Из ПредставленияСвойств Цикл - ЗначениеСвойства = Коллекция[ЭлементСписка.Ключ]; + ЗначениеСвойства = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Коллекция, ЭлементСписка.Ключ); Если Не ЗначениеЗаполнено(ЗначениеСвойства) Тогда Продолжить; КонецЕсли; @@ -365,7 +382,7 @@ Возврат ПоместитьВоВременноеХранилище(ДанныеСертификата, ИдентификаторФормы); КонецЕсли; - Возврат Неопределено; + Возврат ""; КонецФункции diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html index fd38c8c0b..4515e4f78 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html @@ -1,6 +1,6 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html;charset=utf-8" http-equiv="content-type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 11.00.10570.1001"></meta></head><body> <p style="MARGIN-RIGHT: 0px" dir="ltr">Предназначена для указания параметров файловой или клиент-серверной базы при создании начального образа РИБ. При настройке синхронизации РИБ (внешние файлы) необходимо указать, где будет создан начальный образ РИБ. Если файлы хранятся в <a href="Catalog.ТомаХраненияФайлов/Help">томах</a>, также потребуется указать путь к файлу, в который будет записан архив (.zip) со всеми файлами в томах. </p> -<p style="MARGIN-RIGHT: 0px" dir="ltr">Открывается по команде <img src="StdPicture.CreateInitialImage" width="16" height="16"></img> <strong>Создать начальный образ </strong>из <a href="DataProcessor.ПомощникСозданияОбменаДанными/Help">Помощника создания синхронизации данных</a> при настройке синхронизации РИБ (внешние файлы). Также можно в списке <a href="CommonForm.СинхронизацияДанных/Help">Синхронизация данных</a> с помощью кнопки <img src="StdPicture.Change"></img> открыть настройку синхронизации РИБ (внешние файлы), нажать кнопку<img src="StdPicture.CreateInitialImage"></img> <strong>Создание начального образа подчиненного узла распределенной информационной базы</strong>.</p> +<p style="MARGIN-RIGHT: 0px" dir="ltr">Открывается по команде <img src="StdPicture.CreateInitialImage" width="16" height="16"></img> <strong>Создать начальный образ </strong>из <a href="DataProcessor.ПомощникСозданияОбменаДанными/Help">Помощника создания синхронизации данных</a> при настройке синхронизации РИБ (внешние файлы). Также можно в списке <a href="CommonForm.НастройкиСинхронизацииДанных/Help">Синхронизация данных</a> с помощью кнопки <img src="StdPicture.Change"></img> открыть настройку синхронизации РИБ (внешние файлы), нажать кнопку<img src="StdPicture.CreateInitialImage"></img> <strong>Создание начального образа подчиненного узла распределенной информационной базы</strong>.</p> <h3 style="MARGIN-RIGHT: 0px" dir="ltr">Параметры информационной базы</h3> <p style="MARGIN-RIGHT: 0px" dir="ltr">Укажите с помощью переключателя, где будет создаваться начальный образ информационной базы: </p> <ul style="MARGIN-RIGHT: 0px" dir="ltr"><li> diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl index 28b6cac8c..156037101 100644 --- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl +++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl @@ -89,8 +89,9 @@ &НаКлиенте Процедура ПапкаДляСохраненияФайловНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - ФайловаяСистемаКлиент.ВыбратьКаталог(Новый ОписаниеОповещения("ПапкаДляСохраненияФайловЗавершениеВыбора", ЭтотОбъект)); + + ВыбраннаяПапка = Элемент.ТекстРедактирования; + ФайловаяСистемаКлиент.ВыбратьКаталог(Новый ОписаниеОповещения("ПапкаДляСохраненияФайловЗавершениеВыбора", ЭтотОбъект), , ВыбраннаяПапка); КонецПроцедуры diff --git a/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form b/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form index ef1cec498..5bff858c5 100644 --- a/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form @@ -1500,7 +1500,7 @@ <id>47</id> <title> <key>ru</key> - <value>Текущий элемент имеет собственный отбор (для фильтрации записей, выводимых в элементе)</value> + <value>Текущий элемент имеет собственный фильтр (для фильтрации записей, выводимых в элементе)</value> true true @@ -1548,7 +1548,7 @@ 51 <key>ru</key> - <value>Доступные поля отбора</value> + <value>Доступные поля фильтров</value> true true @@ -1683,7 +1683,7 @@ 54 <key>ru</key> - <value>Таблица отбора</value> + <value>Таблица фильтров</value> true true @@ -1848,9 +1848,9 @@ 58 <key>ru</key> - <value>В текущем элементе отбор не установлен. -Выберите в дереве структуры отчет для редактирования отбора отчета в целом. -Если необходимо, чтобы текущий элемент имел собственный отбор, установите флажок, расположенный над этим текстом.</value> + <value>В текущем элементе фильтр не установлен. +Выберите в дереве структуры отчет для редактирования фильтра отчета в целом. +Если необходимо, чтобы текущий элемент имел собственный фильтр, установите флажок, расположенный над этим текстом.</value> true true @@ -1883,7 +1883,7 @@ 60 <key>ru</key> - <value>Нажмите здесь для перехода к отбору отчета.</value> + <value>Нажмите здесь для перехода к фильтру отчета.</value> true true @@ -1923,7 +1923,7 @@ <key>ru</key> - <value>Страница отключенного отбора</value> + <value>Страница отключенного фильтра</value> ОтключенныеНастройкиОтбораExtendedTooltip @@ -1950,8 +1950,8 @@ 63 <key>ru</key> - <value>У текущего элемента не может быть установлен отбор. -Выберите в дереве структуры отчет для редактирования отбора отчета в целом.</value> + <value>У текущего элемента не может быть установлен фильтр. +Выберите в дереве структуры отчет для редактирования фильтра отчета в целом.</value> true true @@ -1984,7 +1984,7 @@ 65 <key>ru</key> - <value>Нажмите здесь для перехода к отбору отчета.</value> + <value>Нажмите здесь для перехода к фильтру отчета.</value> true true @@ -2024,7 +2024,7 @@ <key>ru</key> - <value>Страница недоступного отбора</value> + <value>Страница недоступного фильтра</value> НедоступныеНастройкиОтбораExtendedTooltip @@ -2050,7 +2050,7 @@ <key>ru</key> - <value>Страницы отбора</value> + <value>Страницы фильтры</value> СтраницыОтбораExtendedTooltip @@ -2074,7 +2074,7 @@ <key>ru</key> - <value>Отбор</value> + <value>Фильтры</value> СтраницаОтбораExtendedTooltip @@ -3792,7 +3792,7 @@ ЛокальныйОтбор <key>ru</key> - <value>Локальный отбор</value> + <value>Локальный фильтр</value> 3 @@ -3911,6 +3911,13 @@ DontUse Auto + + ИмяСтраницы + + String + + + diff --git a/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl index ae9ff3320..2de364dbb 100644 --- a/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl @@ -62,6 +62,16 @@ Если ЭлементСтруктуры <> Неопределено Тогда ИдентификаторЭлементаСтруктурыНастроек = НастройкиКД.ПолучитьИдентификаторПоОбъекту(ЭлементСтруктуры); КонецЕсли; + + Если Параметры.Свойство("ВариантМодифицирован") Тогда + ВариантМодифицирован = Параметры.ВариантМодифицирован; + КонецЕсли; + + Если Параметры.Свойство("ПользовательскиеНастройкиМодифицированы") Тогда + ПользовательскиеНастройкиМодифицированы = Параметры.ПользовательскиеНастройкиМодифицированы; + КонецЕсли; + + УстановитьТекущуюСтраницу(); КонецПроцедуры &НаСервере @@ -148,6 +158,27 @@ ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто; КонецПроцедуры +&НаСервере +Процедура УстановитьТекущуюСтраницу() + Если Не Параметры.Свойство("ИмяСтраницы") + Или Не ЗначениеЗаполнено(Параметры.ИмяСтраницы) Тогда + + Возврат; + КонецЕсли; + + СвязиСтраниц = Новый Соответствие; + СвязиСтраниц.Вставить("СтраницаОтборы", "СтраницаОтбора"); + СвязиСтраниц.Вставить("СтраницаВыбранныеПоляИСортировки", "СтраницаПолейВыбора"); + СвязиСтраниц.Вставить("СтраницаОформление", "СтраницаУсловногоОформления"); + + ИмяСтраницы = СвязиСтраниц[Параметры.ИмяСтраницы]; + НайденнаяСтраница = Элементы.Найти(ИмяСтраницы); + + Если НайденнаяСтраница <> Неопределено Тогда + Элементы.СтраницыНастроек.ТекущаяСтраница = НайденнаяСтраница; + КонецЕсли; +КонецПроцедуры + &НаКлиенте Процедура УстановитьТекущуюСтроку() Элементы.КомпоновщикНастроекНастройки.ТекущаяСтрока = ИдентификаторЭлементаСтруктурыНастроек; diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form index 9db610bbb..b9eb83b00 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form @@ -630,7 +630,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu СоставГруппировки_Удалить1 @@ -657,7 +656,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -708,7 +706,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu СоставГруппировки_ПереместитьВниз1 @@ -735,7 +732,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -869,25 +865,101 @@ ПредопределенныеНастройки 1143 - - ВыводитьЗаголовок - 1145 + + ПараметрыВыводаДляПечати + 1397 + + ВыводитьЗаголовок + 1145 + + <key>ru</key> + <value>Выводить заголовок для печати: ...</value> + + true + true + + true + + + ВыводитьЗаголовок + + Right + + OnChange + ВыводитьЗаголовокПриИзменении + + + ВыводитьЗаголовокРасширеннаяПодсказка + 1147 + Label + true + true + + Left + + + + ВыводитьЗаголовокКонтекстноеМеню + 1146 + true + + CheckBoxField + Enter + true + Left + true + + + + ВыводитьФильтры + 1148 + true + true + + true + + + ВыводитьФильтры + + Right + + OnChange + ВыводитьФильтрыПриИзменении + + + ВыводитьФильтрыРасширеннаяПодсказка + 1150 + Label + true + true + + Left + + + + ВыводитьФильтрыКонтекстноеМеню + 1149 + true + + CheckBoxField + Enter + true + Left + true + + true true true - - ВыводитьЗаголовок - - Right - - OnChange - ВыводитьЗаголовокПриИзменении - + + <key>ru</key> + <value>Параметры вывода для печати</value> + - ВыводитьЗаголовокРасширеннаяПодсказка - 1147 + ПараметрыВыводаДляПечатиРасширеннаяПодсказка + 1398 Label true true @@ -895,55 +967,15 @@ Left - - ВыводитьЗаголовокКонтекстноеМеню - 1146 - true - - CheckBoxField - Enter - true - Left - true - - - - ВыводитьПараметрыИОтборы - 1148 - true - true - - true - - - ВыводитьПараметрыИОтборы - - Right - - OnChange - ВыводитьПараметрыИОтборыПриИзменении - - - ВыводитьПараметрыИОтборыРасширеннаяПодсказка - 1150 - Label - true - true - - Left - - - - ВыводитьПараметрыИОтборыКонтекстноеМеню - 1149 - true - - CheckBoxField - Enter - true - Left - true - + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + true true @@ -1044,7 +1076,7 @@ 342 <key>ru</key> - <value>Отборы</value> + <value>Фильтры</value> true true @@ -1546,7 +1578,7 @@ 326 <key>ru</key> - <value>Добавить отбор</value> + <value>Добавить фильтр</value> true true @@ -1606,7 +1638,7 @@ <key>ru</key> - <value>Команды отборов добавление удаление</value> + <value>Команды фильтров добавление, удаление</value> КомандыОтборов_ДобавлениеУдалениеРасширеннаяПодсказка @@ -1682,7 +1714,7 @@ <key>ru</key> - <value>Команды отборов приоритет</value> + <value>Команды фильтров приоритет</value> КомандыОтборов_ПриоритетРасширеннаяПодсказка @@ -1765,7 +1797,7 @@ <key>ru</key> - <value>Команды отборов группы</value> + <value>Команды фильтров группы</value> КомандыОтборов_ГруппыРасширеннаяПодсказка @@ -1841,7 +1873,7 @@ <key>ru</key> - <value>Команды отборов флажки</value> + <value>Команды фильтров флажки</value> КомандыОтборов_ФлажкиРасширеннаяПодсказка @@ -2015,6 +2047,57 @@ Normal + + КомандыОтборов_Общее + 1389 + + ОтборыПерейтиКНастройкамДляТехническогоСпециалиста + 1387 + true + true + + true + + + ОтборыПерейтиКНастройкамДляТехническогоСпециалистаРасширеннаяПодсказка + 1388 + Label + true + true + + Left + + + Form.Command.ПерейтиКНастройкамДляТехническогоСпециалиста + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Команды фильтров общее</value> + + + КомандыОтборов_ОбщееРасширеннаяПодсказка + 1390 + Label + true + true + + Left + + + + Left @@ -2129,7 +2212,7 @@ 405 <key>ru</key> - <value>Добавить отбор</value> + <value>Добавить фильтр</value> true true @@ -2153,7 +2236,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu Отборы_Удалить1 @@ -2180,7 +2262,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -2189,7 +2270,7 @@ <key>ru</key> - <value>Команды отборов добавление удаление 1</value> + <value>Команды фильтров добавление удаление 1</value> КомандыОтборов_ДобавлениеУдаление1РасширеннаяПодсказка @@ -2265,7 +2346,7 @@ <key>ru</key> - <value>Команды отборов приоритет 1</value> + <value>Команды фильтров приоритет 1</value> КомандыОтборов_Приоритет1РасширеннаяПодсказка @@ -2310,7 +2391,6 @@ StdPicture.CreateFolder Auto - InAdditionalSubmenu Отборы_Разгруппировать1 @@ -2337,7 +2417,6 @@ true UserCmds Auto - InAdditionalSubmenu true true @@ -2422,7 +2501,7 @@ <key>ru</key> - <value>Команды отборов флажки</value> + <value>Команды фильтров флажки</value> КомандыОтборов_Флажки1РасширеннаяПодсказка @@ -2580,7 +2659,7 @@ ru - Команды отборов показывать + Команды фильтров показывать КомандыОтборов_Показывать1РасширеннаяПодсказка @@ -2678,7 +2757,7 @@ 811 <key>ru</key> - <value>В отчете имеются вложенные отборы, которые можно настроить на странице <b>Структура</>.</value> + <value><bgcolor #ffec9d><color #9d5600>В отчете установлены фильтры для группировок, которые можно настроить на странице </></><b><color #9d5600>Структура</></><bgcolor #ffec9d><color #9d5600>.</></></value> true true @@ -2704,7 +2783,7 @@ Label true - Style.ПоясняющийТекст + Style.ЦветТекстаВнимание @@ -2712,6 +2791,9 @@ ПодсказкаЕстьВложенныеОтчетыОбработкаНавигационнойСсылки Left + + Style.ЦветФонаВнимание + true @@ -2721,7 +2803,7 @@ <key>ru</key> - <value>Есть вложенные отборы</value> + <value>Есть вложенные фильтры</value> ГруппаЕстьВложенныеОтборыРасширеннаяПодсказка @@ -2750,7 +2832,7 @@ <key>ru</key> - <value>Отборы</value> + <value>Фильтры</value> ru @@ -2918,6 +3000,50 @@ true + + ВыбранныеПоляИндикаторФормулы + 1405 + true + true + + true + + + ВыбранныеПоля.ИндикаторФормулы + + + ВыбранныеПоляИндикаторФормулыРасширеннаяПодсказка + 1407 + Label + true + true + + Left + + + + ВыбранныеПоляИндикаторФормулыКонтекстноеМеню + 1406 + true + + PictureField + true + Auto + true + Left + true + + true + true + true + true + + + 1 + + AsFileRef + + Top ВыбранныеПоляКоманднаяПанель @@ -2956,6 +3082,32 @@ Auto InCommandBarAndInAdditionalSubmenu + + ВыбранныеПоляИзменитьФормулу + 1403 + true + true + + true + + + ВыбранныеПоляИзменитьФормулуРасширеннаяПодсказка + 1404 + Label + true + true + + Left + + + Form.Command.ИзменитьФормулу + Normal + Auto + true + true + UserCmds + Auto + ВыбранныеПоля_Удалить 216 @@ -3084,6 +3236,84 @@ Compact + + КомандыВыбранныхПолей_Флажки + 1035 + + ВыбранныеПоляВыбранныеПоля_УстановитьФлажки + 1037 + true + true + + true + + + ВыбранныеПоляВыбранныеПоля_УстановитьФлажкиРасширеннаяПодсказка + 1038 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_УстановитьФлажки + Normal + Auto + true + true + UserCmds + Auto + + + ВыбранныеПоляВыбранныеПоля_СнятьФлажки + 1039 + true + true + + true + + + ВыбранныеПоляВыбранныеПоля_СнятьФлажкиРасширеннаяПодсказка + 1040 + Label + true + true + + Left + + + Form.Command.ВыбранныеПоля_СнятьФлажки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды выбранных полей флажки</value> + + + КомандыВыбранныхПолей_ФлажкиРасширеннаяПодсказка + 1036 + Label + true + true + + Left + + + + Compact + + КомандыВыбранныхПолей_Группы 284 @@ -3165,73 +3395,17 @@ - - КомандыВыбранныхПолей_Флажки - 1035 - - ВыбранныеПоляВыбранныеПоля_УстановитьФлажки - 1037 - true - true - - true - - - ВыбранныеПоляВыбранныеПоля_УстановитьФлажкиРасширеннаяПодсказка - 1038 - Label - true - true - - Left - - - Form.Command.ВыбранныеПоля_УстановитьФлажки - Normal - Auto - true - true - UserCmds - Auto - - - ВыбранныеПоляВыбранныеПоля_СнятьФлажки - 1039 - true - true - - true - - - ВыбранныеПоляВыбранныеПоля_СнятьФлажкиРасширеннаяПодсказка - 1040 - Label - true - true - - Left - - - Form.Command.ВыбранныеПоля_СнятьФлажки - Normal - Auto - true - true - UserCmds - Auto - + + ВыбранныеПоляПерейтиКНастройкамДляТехническогоСпециалиста + 1391 true true true - - <key>ru</key> - <value>Команды выбранных полей флажки</value> - - КомандыВыбранныхПолей_ФлажкиРасширеннаяПодсказка - 1036 + ВыбранныеПоляПерейтиКНастройкамДляТехническогоСпециалистаРасширеннаяПодсказка + 1392 Label true true @@ -3239,9 +3413,14 @@ Left - - Compact - + Form.Command.ПерейтиКНастройкамДляТехническогоСпециалиста + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu Left @@ -3261,6 +3440,10 @@ BeforeDeleteRow ВыбранныеПоляПередУдалением + + OnActivateRow + ВыбранныеПоляПриАктивизацииСтроки + DragStart ВыбранныеПоляНачалоПеретаскивания @@ -3389,7 +3572,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu ВыбранныеПоля_Удалить1 @@ -3416,7 +3598,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -3467,7 +3648,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu ВыбранныеПоля_ПереместитьВниз1 @@ -3494,7 +3674,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -3548,7 +3727,6 @@ StdPicture.CreateFolder Auto - InAdditionalSubmenu ВыбранныеПоля_Разгруппировать1 @@ -3575,7 +3753,6 @@ true UserCmds Auto - InAdditionalSubmenu true true @@ -3705,7 +3882,7 @@ ВыбранныеПоля.Картинка - CommonPicture.ПиктограммыНастроекОтчета + CommonPicture.ПиктограммыТиповДанных true @@ -4461,7 +4638,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu Сортировка_Удалить2 @@ -4488,7 +4664,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -4767,7 +4942,7 @@ Сортировка.Картинка - CommonPicture.ПиктограммыНастроекОтчета + CommonPicture.ПиктограммыТиповДанных true @@ -4872,7 +5047,7 @@ 1007 <key>ru</key> - <value>В отчете имеются вложенные поля и сортировки, которые можно настроить на странице <b>Структура</>.</value> + <value><bgcolor #ffec9d><color #9d5600>В отчете выбраны поля и сортировки для группировок, которые можно настроить на странице </></><b><color #9d5600>Структура</></><bgcolor #ffec9d><color #9d5600>.</></></value> true true @@ -4898,7 +5073,7 @@ Label true - Style.ПоясняющийТекст + Style.ЦветТекстаВнимание @@ -4906,6 +5081,9 @@ ПодсказкаЕстьВложенныеОтчетыОбработкаНавигационнойСсылки Left + + Style.ЦветФонаВнимание + true @@ -4995,6 +5173,7 @@ MoveUp OutputList SelectAll + ShowRowRearrangement SortListAsc SortListDesc Tree @@ -5427,7 +5606,59 @@ UserCmds Auto + + КомандыОформления_Общее + 1401 + + ОформлениеПерейтиКНастройкамДляТехническогоСпециалиста + 1399 + true + true + + true + + + ОформлениеПерейтиКНастройкамДляТехническогоСпециалистаРасширеннаяПодсказка + 1400 + Label + true + true + + Left + + + Form.Command.ПерейтиКНастройкамДляТехническогоСпециалиста + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Команды оформления общее</value> + + + КомандыОформления_ОбщееРасширеннаяПодсказка + 1402 + Label + true + true + + Left + + + + Left + true Selection @@ -5604,7 +5835,7 @@ 931 <key>ru</key> - <value>В отчете имеется оформление вложенных элементов, которое можно настроить на странице <b>Структура</>.</value> + <value><bgcolor #ffec9d><color #9d5600>В отчете установлено оформление для группировок, которое можно настроить на странице </></><b><color #9d5600>Структура</></><bgcolor #ffec9d><color #9d5600>.</></></value> true true @@ -5630,7 +5861,7 @@ Label true - Style.ПоясняющийТекст + Style.ЦветТекстаВнимание @@ -5638,6 +5869,9 @@ ПодсказкаЕстьВложенныеОтчетыОбработкаНавигационнойСсылки Left + + Style.ЦветФонаВнимание + true @@ -5897,7 +6131,7 @@ None ru - Картинка отображается когда у элемента настроены отборы. + Картинка отображается когда у элемента настроены фильтры. СтруктураВариантаСодержитОтборыРасширеннаяПодсказка @@ -6616,6 +6850,57 @@ Auto InAdditionalSubmenu + + КомандыСтруктурыВарианта_Общее + 1395 + + СтруктураВариантаПерейтиКНастройкамДляТехническогоСпециалиста + 1393 + true + true + + true + + + СтруктураВариантаПерейтиКНастройкамДляТехническогоСпециалистаРасширеннаяПодсказка + 1394 + Label + true + true + + Left + + + Form.Command.ПерейтиКНастройкамДляТехническогоСпециалиста + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Команды структуры варианта общее</value> + + + КомандыСтруктурыВарианта_ОбщееРасширеннаяПодсказка + 1396 + Label + true + true + + Left + + + + Left @@ -6813,7 +7098,6 @@ true UserCmds Auto - InAdditionalSubmenu СтруктураВарианта_ДобавитьДиаграмму1 @@ -6840,7 +7124,6 @@ true UserCmds Auto - InAdditionalSubmenu true true @@ -6912,7 +7195,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu СтруктураВарианта_Удалить1 @@ -6939,7 +7221,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -7220,7 +7501,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu СтруктураВарианта_СнятьФлажки1 @@ -7247,7 +7527,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -7736,10 +8015,9 @@ 115 <key>ru</key> - <value>В <b>простом режиме </>можно донастроить отчет для более удобной работы с ним. Это личные настройки, которые автоматически сохраняются и действуют при следующем открытии отчета. -<b>Расширенный режим</> позволяет менять структуру отчета так, чтобы, например, полностью пересмотреть состав группировок, управлять списком полей в шапке отчета и доступными полями в простом режиме настройки. Эти изменения можно сохранить как новый вариант отчета (или перезаписать существующий) и они становятся доступны всем, кто работает с этим вариантом отчета.</value> + <value>Простой режим предназначен для изменения текущих настроек отчета, которые сохраняются автоматически. +Расширенный режим предназначен для изменения структуры отчета. После изменения структуры отчет необходимо сохранить как новый или перезаписать существующий.</value> - true Label true true @@ -7816,7 +8094,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true @@ -7862,7 +8139,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu Закрыть @@ -7888,7 +8164,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu ИзменитьУсловияОтборов @@ -7915,7 +8190,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu Справка @@ -7942,7 +8216,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true @@ -8006,6 +8279,37 @@ Период1 1243 + + СдвинутьПериодНазад1 + 1379 + true + true + + true + + + СдвинутьПериодНазад1РасширеннаяПодсказка + 1380 + Label + true + true + + Left + + + UsualButton + Form.Command.СдвинутьПериодНазад1 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + WhenActive + Период1ДатаНачала 1245 @@ -8144,17 +8448,80 @@ Normal + + ГруппаВыбратьПериод1 + 1375 + + ВыбратьПериод1 + 1254 + true + true + + true + + + ВыбратьПериод1РасширеннаяПодсказка + 1255 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыбратьПериод1 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + + true + true + + true + + + <key>ru</key> + <value>Выбрать период</value> + + + ГруппаВыбратьПериод1РасширеннаяПодсказка + 1376 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Center + Auto + true + true + Auto + Auto + + - ВыбратьПериод1 - 1254 + СдвинутьПериодВперед1 + 1381 true true true - ВыбратьПериод1РасширеннаяПодсказка - 1255 + СдвинутьПериодВперед1РасширеннаяПодсказка + 1382 Label true true @@ -8163,13 +8530,17 @@ UsualButton - Form.Command.ВыбратьПериод1 + Form.Command.СдвинутьПериодВперед1 Normal Auto true true UserCmds + + Style.ВажнаяНадписьШрифт + Auto + WhenActive true true @@ -8204,6 +8575,37 @@ Период2 1344 + + СдвинутьПериодНазад2 + 1383 + true + true + + true + + + СдвинутьПериодНазад2РасширеннаяПодсказка + 1384 + Label + true + true + + Left + + + UsualButton + Form.Command.СдвинутьПериодНазад2 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + WhenActive + Период2ДатаНачала 1346 @@ -8342,17 +8744,80 @@ Normal + + ГруппаВыбратьПериод2 + 1377 + + ВыбратьПериод2 + 1355 + true + true + + true + + + ВыбратьПериод2РасширеннаяПодсказка + 1356 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыбратьПериод2 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + + true + true + + true + + + <key>ru</key> + <value>Выбрать период</value> + + + ГруппаВыбратьПериод2РасширеннаяПодсказка + 1378 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Center + Auto + true + true + Auto + Auto + + - ВыбратьПериод2 - 1355 + СдвинутьПериодВперед2 + 1385 true true true - ВыбратьПериод2РасширеннаяПодсказка - 1356 + СдвинутьПериодВперед2РасширеннаяПодсказка + 1386 Label true true @@ -8361,13 +8826,17 @@ UsualButton - Form.Command.ВыбратьПериод2 + Form.Command.СдвинутьПериодВперед2 Normal Auto true true UserCmds + + Style.ВажнаяНадписьШрифт + Auto + WhenActive true true @@ -9582,11 +10051,6 @@ true auto true - - - КомандыФормы_Правая - - НастройкиОтчета 2 @@ -9977,6 +10441,36 @@ true + + ЭтоФормула + 10 + + Boolean + + + true + + + true + + + + ИндикаторФормулы + + <key>ru</key> + <value>Индикатор формулы</value> + + 11 + + Picture + + + true + + + true + + СтруктураВарианта @@ -10132,7 +10626,7 @@ СодержитОтборы <key>ru</key> - <value>Содержит отборы</value> + <value>Содержит фильтры</value> 5 @@ -10862,10 +11356,10 @@ - ВыводитьПараметрыИОтборы + ВыводитьФильтры <key>ru</key> - <value>Выводить параметры и отборы</value> + <value>Выводить фильтры</value> 44 @@ -10882,7 +11376,7 @@ Отборы <key>ru</key> - <value>Отборы</value> + <value>Фильтры</value> 46 @@ -11851,7 +12345,7 @@ 3 ru - Создать группу и поместить в нее выделенные отборы + Создать группу и поместить в нее выделенные фильтры true @@ -11876,7 +12370,7 @@ 4 ru - Удалить выделенную группу, сохранив вложенные отборы + Удалить выделенную группу, сохранив вложенные фильтры true @@ -12376,12 +12870,12 @@ ИзменитьУсловияОтборов <key>ru</key> - <value>Изменить условия отборов...</value> + <value>Изменить условия фильтров...</value> 32 ru - Изменить условия отборов + Изменить условия фильтров true @@ -12510,7 +13004,7 @@ 37 ru - Включить все параметры и отборы + Включить все фильтры true @@ -12535,7 +13029,7 @@ 38 ru - Отключить все параметры и отборы + Отключить все фильтры true @@ -12585,7 +13079,7 @@ 40 ru - Отборы показывать в настройках отчета + Фильтры показывать в настройках отчета true @@ -12610,7 +13104,7 @@ 41 ru - Отборы показывать в шапке отчета + Фильтры показывать в шапке отчета true @@ -12635,7 +13129,7 @@ 42 ru - Отборы не показывать + Фильтры не показывать true @@ -12660,7 +13154,7 @@ 43 ru - Отборы показывать в шапке отчета + Фильтры показывать в шапке отчета true @@ -12685,7 +13179,7 @@ 44 ru - Отборы показывать в настройках отчета + Фильтры показывать в настройках отчета true @@ -12732,7 +13226,7 @@ 46 ru - Оформление установить флажки + Установить флажки использования для выбранных элементов оформления true @@ -12758,7 +13252,7 @@ 47 ru - Оформление снять флажки + Оформление снять флажки использования для выбранных элементов оформления true @@ -12807,9 +13301,6 @@ true - - StdPicture.InputFieldSelect - Подключаемый_ВыбратьПериод @@ -12993,9 +13484,6 @@ true - - StdPicture.InputFieldSelect - Подключаемый_ВыбратьПериод @@ -13057,6 +13545,142 @@ DontUse Auto + + СдвинутьПериодВперед1 + + <key>ru</key> + <value>></value> + + 61 + + ru + Перейти вперед + + + true + + + + Подключаемый_СдвинутьПериодВперед + + + Auto + Auto + + + СдвинутьПериодВперед2 + + <key>ru</key> + <value>></value> + + 62 + + ru + Перейти вперед + + + true + + + + Подключаемый_СдвинутьПериодВперед + + + Auto + Auto + + + СдвинутьПериодНазад1 + + <key>ru</key> + <value><</value> + + 63 + + ru + Перейти назад + + + true + + + + Подключаемый_СдвинутьПериодНазад + + + Auto + Auto + + + СдвинутьПериодНазад2 + + <key>ru</key> + <value><</value> + + 64 + + ru + Перейти назад + + + true + + + + Подключаемый_СдвинутьПериодНазад + + + Auto + Auto + + + ПерейтиКНастройкамДляТехническогоСпециалиста + + <key>ru</key> + <value>Настройки для технического специалиста...</value> + + 65 + + ru + Перейти к настройкам для технического специалиста + + + true + + + + ПерейтиКНастройкамДляТехническогоСпециалиста + + + DontUse + Auto + + + ИзменитьФормулу + + <key>ru</key> + <value>Изменить формулу</value> + + 66 + + ru + Изменить выбранную формулу + + + true + + + StdPicture.Change + + + + ИзменитьФормулу + + + Picture + Auto + Auto + diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Help/ru.html b/SSL/src/CommonForms/ФормаНастроекОтчета/Help/ru.html index 91ea9e6ca..769ed96af 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Help/ru.html +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Help/ru.html @@ -3,53 +3,94 @@

      Открывается из формы отчета по кнопке Настройки.

      С помощью кнопки Вид можно перевести настройки в один из режимов:

      • Простой - можно только менять уже имеющиеся параметры, с помощью флажков добавлять или убирать их; -
      • Расширенный - можно управлять настройками: добавлять параметры, менять поля, структуру отчета. После того, как настройки в расширенном режиме закончены и сохранены, в простом режиме появляется возможность включать и отключать их с помощью флажка.

      Окно настроек в зависимости от сложности отчета состоит из нескольких вкладок:

      + +
    • Расширенный - можно управлять настройками: добавлять параметры, менять поля, структуру отчета. После того, как настройки в расширенном режиме закончены и сохранены, в простом режиме появляется возможность включать и отключать их с помощью флажка.
    • Окно настроек в зависимости от сложности отчета состоит из нескольких вкладок:

      • Отборы - вводятся условия для отборов значений в отчете; -
      • Поля и сортировки- с помощью флажков можно добавлять в отчет поля или убирать их. Можно добавлять поля для сортировки отчета, убирать их или отключать; -
      • Оформление - управление оформлением отчета; -
      • Структура - управление структурой отчета.

      Отборы

      + +
    • Поля и сортировки- с помощью флажков можно добавлять в отчет поля или убирать их. Можно добавлять поля для сортировки отчета, убирать их или отключать; +
    • +
    • Оформление - управление оформлением отчета; +
    • +
    • Структура - управление структурой отчета.
    • Отборы

      • При формировании отчетов могут использоваться различные параметры и отборы. -
      • На вкладке можно менять параметры отборов. С помощью флажка отбор по параметру (например, Период) можно сделать активным или отключить. -
      • В Простом режиме можно в каждом поле с помощью соответствующей команды контекстного меню по правой кнопке мыши Изменить условия отбора. -
      • Для выбора значений может быть предусмотрена ссылка Подбор. Выберите конкретное значение из списка. -
      • С помощью кнопки  можно выбрать значения из буфера обмена. -
      • В режиме Расширенный можно перейти к настройке всех предусмотренных параметров отчета. -
      • С помощью соответствующей кнопки можно Добавить отбор. -
      • Для изменения настроек отборов отчета применяется таблица, состоящая из колонок: +
      • +
      • На вкладке можно менять параметры отборов. С помощью флажка отбор по параметру (например, Период) можно сделать активным или отключить. +
      • +
      • В Простом режиме можно в каждом поле с помощью соответствующей команды контекстного меню по правой кнопке мыши Изменить условия отбора. +
      • +
      • Для выбора значений может быть предусмотрена ссылка Подбор. Выберите конкретное значение из списка. +
      • +
      • С помощью кнопки  можно выбрать значения из буфера обмена. +
      • +
      • В режиме Расширенный можно перейти к настройке всех предусмотренных параметров отчета. +
      • +
      • С помощью соответствующей кнопки можно Добавить отбор. +
      • +
      • Для изменения настроек отборов отчета применяется таблица, состоящая из колонок:
        • Поле - перечисление полей, по которым производится отбор; -
        • Условие - выбор операции для отбора по каждому полю; +
        • +
        • Условие - выбор операции для отбора по каждому полю;
          • Операции Равно, Не равно, В группе, Не в группе предполагают выбор одного значения (единичный отбор). -
          • Операции В списке, В группе из списка, Не в списке, Не в группе из списка предполагают выбор нескольких значений (множественный отбор). -
          • Для операций Заполнено и Не заполнено не требуется выбор значения.
        • Значение - можно указать одно или несколько значений каждого поля для отбора в зависимости от операции. +
        • +
        • Операции В списке, В группе из списка, Не в списке, Не в группе из списка предполагают выбор нескольких значений (множественный отбор). +
        • +
        • Для операций Заполнено и Не заполнено не требуется выбор значения.
      • +
      • Значение - можно указать одно или несколько значений каждого поля для отбора в зависимости от операции.
        • Для ввода значения можно дважды щелкнуть мышью по полю. -
        • Введите значение параметра с помощью кнопки  Выбрать. Включите флажки рядом с параметрами, по которым необходимо произвести отбор. Можно задействовать все параметры для отбора или часть, включая или выключая флажки. -
        • Для выбора нескольких значений предусмотрена кнопка Подбор. Откройте список, выберите несколько значений из списка. Включите флажки рядом с нужными для отбора параметрами. Введите значения параметров для отбора или выберите из списка.
      •  Размещение - видимость параметра или отбора в окне отчета. Для смены видимости отбора с помощью двойного щелчка мышью можно выбрать одно из нескольких значений: +
      • +
      • Введите значение параметра с помощью кнопки  Выбрать. Включите флажки рядом с параметрами, по которым необходимо произвести отбор. Можно задействовать все параметры для отбора или часть, включая или выключая флажки. +
      • +
      • Для выбора нескольких значений предусмотрена кнопка Подбор. Откройте список, выберите несколько значений из списка. Включите флажки рядом с нужными для отбора параметрами. Введите значения параметров для отбора или выберите из списка.
      +
    •  Размещение - видимость параметра или отбора в окне отчета. Для смены видимости отбора с помощью двойного щелчка мышью можно выбрать одно из нескольких значений:
      •  В шапке отчета - параметр или отбор выводится в шапке отчета и в шапке настроек отчета; -
      •  Только флажок в шапке отчета - в шапке отчета и шапке настроек отчета выводится только флажок отбора. С помощью флажка можно только включить или отключить этот отбор. При таком размещении рекомендуется задать полностью понятный заголовок, описывающий значение отбора, поскольку значение отбора не выводится. Применимо только для отборов; -
      •  В настройках отчета - параметр или отбор выводится в форме настроек. Используется по умолчанию; -
      •  Только флажок в настройках отчета - в настройках отчета выводится только флажок отбора. С помощью флажка можно только включить или отключить этот отбор. При таком размещении рекомендуется задать полностью понятный заголовок, описывающий значение отбора, поскольку значение отбора не выводится. Применимо только для отборов; -
      •  Не показывать - параметр или отбор выводится только в расширенном режиме настроек отчета.
    • Заголовок - можно ввести свой заголовок для отбора.
    • Отборы можно группировать. Для этого выделите несколько условий для отбора, выполните команду Сгруппировать отборы контекстного меню по правой кнопке мыши или меню Еще. Объединить отборы можно в группы И, Или, Не. Для отмены группировки выполните команду Разгруппировать. -
    • Подробнее об отчетах и операциях отборов см. книгу 1С:Предприятие 8.3 Руководство пользователя.
    • Поля и сортировки

      + +
    •  Только флажок в шапке отчета - в шапке отчета и шапке настроек отчета выводится только флажок отбора. С помощью флажка можно только включить или отключить этот отбор. При таком размещении рекомендуется задать полностью понятный заголовок, описывающий значение отбора, поскольку значение отбора не выводится. Применимо только для отборов; +
    • +
    •  В настройках отчета - параметр или отбор выводится в форме настроек. Используется по умолчанию; +
    • +
    •  Только флажок в настройках отчета - в настройках отчета выводится только флажок отбора. С помощью флажка можно только включить или отключить этот отбор. При таком размещении рекомендуется задать полностью понятный заголовок, описывающий значение отбора, поскольку значение отбора не выводится. Применимо только для отборов; +
    • +
    •  Не показывать - параметр или отбор выводится только в расширенном режиме настроек отчета.
    • +
    • Заголовок - можно ввести свой заголовок для отбора.
    • +
    • Отборы можно группировать. Для этого выделите несколько условий для отбора, выполните команду Сгруппировать отборы контекстного меню по правой кнопке мыши или меню Еще. Объединить отборы можно в группы И, Или, Не. Для отмены группировки выполните команду Разгруппировать. +
    • +
    • Подробнее об отчетах и операциях отборов см. книгу 1С:Предприятие 8.3 Руководство пользователя.
    • Поля и сортировки

      • Вкладка Поля и сортировки состоит из двух частей:
        • В правой частиможно с помощью флажков удалить или добавить поля в отчет. Данная настройка меняет вид всего отчета; -
        • В левой части можно: +
        • +
        • В левой части можно:
          • с помощью кнопок  и  можно добавлять или удалять поля для сортировки. -
          • с помощью кнопки  Удалить все сортировки. -
          • нажав на ссылку, изменить порядок сортировки, с помощью флажка включить или отключить сортировку. -
          • если сортировок несколько, то с помощью кнопок  и  поднять или понизить приоритет сортировки.
      • В расширенном режиме можно: +
      • +
      • с помощью кнопки  Удалить все сортировки. +
      • +
      • нажав на ссылку, изменить порядок сортировки, с помощью флажка включить или отключить сортировку. +
      • +
      • если сортировок несколько, то с помощью кнопок  и  поднять или понизить приоритет сортировки.
      +
    • В расширенном режиме можно:
      • в правой части с помощью кнопки Добавить вывести в отчет другие поля документов и списков программы; -
      • в левой части с помощью соответствующей кнопки Добавить сортировку по полю. Выберите поле для сортировки из предлагаемого программой списка.
    • Оформление

      + +
    • в левой части с помощью соответствующей кнопки Добавить сортировку по полю. Выберите поле для сортировки из предлагаемого программой списка.
    • Оформление

      • На вкладке в простом режиме можно поменять некоторые параметры оформления отчета, например, с помощью флажка включить или выключить Цвет фона, в который можно окрасить все поля. -
      • В расширенном режиме: -
      • С помощью кнопки Добавить можно ввести новый Элемент условного оформления отчета.

      Структура

      + +
    • В расширенном режиме: +
    • +
    • С помощью кнопки Добавить можно ввести новый Элемент условного оформления отчета.
    • Структура

      • Изменить параметры на вкладке можно только в Расширенном режиме. -
      • На вкладке можно добавить группируемые поля в отчет. С помощью кнопок панели навигации можно добавить, изменить поля, поменять их местами. -
      • С помощью кнопки  можно изменить группировку отчета. Для каждого элемента структуры отчета можно на одноименных вкладках настроить: +
      • +
      • На вкладке можно добавить группируемые поля в отчет. С помощью кнопок панели навигации можно добавить, изменить поля, поменять их местами. +
      • +
      • С помощью кнопки  можно изменить группировку отчета. Для каждого элемента структуры отчета можно на одноименных вкладках настроить:
        • Состав группировки;
          • На вкладке можно с помощью кнопки Добавить выбрать поле для группировки. Выберите из списка Тип группировки: Без иерархии, Иерархия, Только иерархия. -
          • Работа с остальными вкладками окна Настройка группировки аналогична работе с одноименными вкладками настройки варианта отчета.
        • Поля и сортировки; -
        • Отборы; -
        • Оформление.

      Изменение условий отборов

      + +
    • Работа с остальными вкладками окна Настройка группировки аналогична работе с одноименными вкладками настройки варианта отчета.
    • +
    • Поля и сортировки; +
    • +
    • Отборы; +
    • +
    • Оформление.
    • Изменение условий отборов

      • С помощью кнопки  можно просмотреть и при необходимости Изменить условия отборов по каждому полю.

      Получение данных отчета

      -
      • Укажите нужные параметры, нажмите кнопку Закрыть и сформировать. Последние настройки будут сохранены автоматически. Если были применены ошибочные настройки, их можно не только изменить, но и сбросить с помощью команд формы отчета.
      \ No newline at end of file +
      • Укажите нужные параметры, нажмите кнопку Закрыть и сформировать. Последние настройки будут сохранены автоматически. Если были применены ошибочные настройки, их можно не только изменить, но и сбросить с помощью команд формы отчета.

      Изменение варианта отчета

      +
      • Нажмите Еще - Настройки для технического специалиста. Можно добавить поля, изменить параметры и настройки отчета. 
      • +
      • Внесенные изменения можно сохранить в другой вариант отчета.
      \ No newline at end of file diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl index 0c82655a5..b94622667 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl @@ -188,6 +188,10 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) ВариантМодифицирован = Ложь; + + Если РезультатВыбораСформирован Тогда + СтандартнаяОбработка = Ложь; + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -265,19 +269,19 @@ КонецПроцедуры &НаКлиенте -Процедура ВыводитьПараметрыИОтборыПриИзменении(Элемент) +Процедура ВыводитьФильтрыПриИзменении(Элемент) ПредопределенныеПараметры = Отчет.КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы; ЭлементНастройки = ПредопределенныеПараметры.Найти("DATAPARAMETERSOUTPUT"); ЭлементНастройки.Использование = Истина; - Если ВыводитьПараметрыИОтборы Тогда + Если ВыводитьФильтры Тогда ЭлементНастройки.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто; Иначе ЭлементНастройки.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить; КонецЕсли; - СинхронизироватьПредопределенныеПараметрыВывода(ВыводитьПараметрыИОтборы, ЭлементНастройки); + СинхронизироватьПредопределенныеПараметрыВывода(ВыводитьФильтры, ЭлементНастройки); УстановитьМодифицированность(); КонецПроцедуры @@ -571,11 +575,8 @@ КонецПроцедуры &НаКлиенте -Процедура ВыбранныеПоляПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) - Отказ = Истина; - - Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект); - ВыбратьПоле("ВыбранныеПоля", Обработчик); +Процедура ВыбранныеПоляПриАктивизацииСтроки(Элемент) + ПодключитьОбработчикОжидания("ПослеАктивизацииВыбранныхПолей", 0.1, Истина); КонецПроцедуры &НаКлиенте @@ -901,7 +902,7 @@ Иначе СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); КонецЕсли; - ВыбратьРежимОтображения(СвойствоЭлементаСтруктуры, "Отборы", ИдентификаторСтроки, Истина, Не Строка.ЭтоПараметр); + ВыбратьРежимОтображенияДляСтроки(СвойствоЭлементаСтруктуры, "Отборы", ИдентификаторСтроки, Истина, Не Строка.ЭтоПараметр); Иначе СтандартнаяОбработка = Истина; КонецЕсли; @@ -1096,6 +1097,33 @@ #КонецОбласти +#Область ОбработчикиСобытийЭлементовТаблицыФормыВыбранныеПоля + +&НаКлиенте +Процедура ИзменитьФормулу(Команда) + + Строка = Элементы.ВыбранныеПоля.ТекущиеДанные; + + Если Строка = Неопределено Или Не Строка.ЭтоФормула Тогда + Возврат; + КонецЕсли; + + ВариантыОтчетовСлужебныйКлиент.ИзменитьФормулу( + ЭтотОбъект, Отчет.КомпоновщикНастроек.Настройки, Строка(Строка.Поле),, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеИзмененияФормулы(ОписаниеФормулы, Формула) Экспорт + + ВариантыОтчетовСлужебныйКлиент.ПослеИзмененияФормулы(ОписаниеФормулы, Формула); + + УстановитьМодифицированность(); + +КонецПроцедуры + +#КонецОбласти + #Область ОбработчикиСобытийЭлементовТаблицыФормыСтруктураВарианта &НаКлиенте @@ -1597,12 +1625,6 @@ &НаКлиенте Процедура ОформлениеПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; - - Строка = КорневаяСтрокаПоУмолчанию("Оформление"); - Если Строка <> Неопределено Тогда - Элементы.Оформление.ТекущаяСтрока = Строка.ПолучитьИдентификатор(); - КонецЕсли; - ОформлениеИзменитьЭлемент(); КонецПроцедуры @@ -1620,14 +1642,14 @@ И Поле = Элементы.ОформлениеЗаголовок Тогда Обработчик = Новый ОписаниеОповещения("ОформлениеВводЗаголовкаЗавершение", ЭтотОбъект, ИдентификаторСтроки); - ПоказатьВводСтроки(Обработчик, Строка.Значение, ЗаголовокПредставленияЗаголовкаДляПечати(),, Истина); + ПоказатьВводСтроки(Обработчик, Строка.Значение, НСтр("ru = 'Заголовок для печати'"),, Истина); КонецЕсли; ИначеЕсли Поле = Элементы.ОформлениеЗаголовок Тогда // Изменение порядка. ОформлениеИзменитьЭлемент(ИдентификаторСтроки, Строка); ИначеЕсли Поле = Элементы.ОформлениеИндексКартинкиДоступа Тогда // Изменение быстрого доступа к отбору. СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек); - ВыбратьРежимОтображения(СвойствоЭлементаСтруктуры, "Оформление", ИдентификаторСтроки, Истина, Ложь); + ВыбратьРежимОтображенияДляСтроки(СвойствоЭлементаСтруктуры, "Оформление", ИдентификаторСтроки, Истина, Ложь); КонецЕсли; КонецПроцедуры @@ -1728,6 +1750,29 @@ ОбновитьФорму(ПараметрыОбновления); КонецПроцедуры +&НаКлиенте +Процедура ПерейтиКНастройкамДляТехническогоСпециалиста(Команда) + ПараметрыФормы = Новый Структура; + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина); + ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта)); + ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки); + ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); + ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); + ПараметрыФормы.Вставить("ВариантНаименование", ВариантНаименование); + ПараметрыФормы.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторЭлементаСтруктурыНастроек); + ПараметрыФормы.Вставить("ИмяСтраницы", Элементы.СтраницыНастроек.ТекущаяСтраница.Имя); + ПараметрыФормы.Вставить("Заголовок", ВариантНаименование); + ПараметрыФормы.Вставить("ВариантМодифицирован", ВариантИзменен); + ПараметрыФормы.Вставить( + "ПользовательскиеНастройкиМодифицированы", + ВариантИзменен Или ПользовательскиеНастройкиМодифицированы); + + ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ВладелецФормы); + + РезультатВыбораСформирован = Истина; + Закрыть(); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Подключаемые команды @@ -1736,6 +1781,16 @@ ОтчетыКлиент.ВыбратьПериод(ЭтотОбъект, Команда.Имя); КонецПроцедуры +&НаКлиенте +Процедура Подключаемый_СдвинутьПериодНазад(Команда) + ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СдвинутьПериодВперед(Команда) + ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); +КонецПроцедуры + &НаКлиенте Процедура Подключаемый_Список_Подбор(Команда) ПутьКСписку = СтрЗаменить(Команда.Имя, "Подбор", ""); @@ -1856,6 +1911,9 @@ Возврат; КонецЕсли; + Настройки = Отчет.КомпоновщикНастроек.Настройки; + ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, ОписаниеНастройки); + СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "ПоляГруппировки", ИдентификаторЭлементаСтруктурыНастроек); @@ -2153,6 +2211,9 @@ Возврат; КонецЕсли; + Настройки = Отчет.КомпоновщикНастроек.Настройки; + ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляОтбора, ОписаниеНастройки); + СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); @@ -2264,19 +2325,45 @@ &НаКлиенте Процедура ОтборыУстановитьРежимОтображения(РежимОтображения) - Строка = Элементы.Отборы.ТекущиеДанные; - Если Строка = Неопределено Тогда + + ИдентификаторСтрок = Элементы.Отборы.ВыделенныеСтроки; + Если ИдентификаторСтрок.Количество() = 0 Тогда Возврат; КонецЕсли; - Если Строка.ЭтоПараметр Тогда - СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных"); - Иначе - СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( - Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); - КонецЕсли; + СвойстваЭлементовНастроек = Новый Массив; + КоличествоПараметров = 0; + + Для Каждого ИдентификаторСтроки Из ИдентификаторСтрок Цикл + + Строка = Отборы.НайтиПоИдентификатору(ИдентификаторСтроки); + + Если Строка.ЭтоРаздел Тогда + Продолжить; + КонецЕсли; + + Если Строка.ЭтоПараметр Тогда + СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек(Отчет.КомпоновщикНастроек, "ПараметрыДанных"); + КоличествоПараметров = КоличествоПараметров + 1; + Иначе + СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( + Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); + КонецЕсли; + + ЭлементНастроек = СвойствоЭлементаСтруктуры.ПолучитьОбъектПоИдентификатору(Строка.Идентификатор); + + СвойстваЭлементаНастроек = Новый Структура; + СвойстваЭлементаНастроек.Вставить("ИдентификаторСтроки", ИдентификаторСтроки); + СвойстваЭлементаНастроек.Вставить("ИдентификаторЭлементаНастроек", Строка.Идентификатор); + СвойстваЭлементаНастроек.Вставить("ЭлементНастроек", ЭлементНастроек); + + СвойстваЭлементовНастроек.Добавить(СвойстваЭлементаНастроек); + + КонецЦикла; + + ПоказыватьРежимыФлажков = (КоличествоПараметров = СвойстваЭлементовНастроек.Количество()); + ВыбратьРежимОтображенияДляСтрок(СвойстваЭлементовНастроек, "Отборы", ПоказыватьРежимыФлажков, РежимОтображения); - ВыбратьРежимОтображения(СвойствоЭлементаСтруктуры, "Отборы", Строка.ПолучитьИдентификатор(), Истина, Строка.ЭтоПараметр, РежимОтображения); КонецПроцедуры // Изменение группировки элементов. @@ -2483,14 +2570,11 @@ Раздел = ВыбранныеПоля.ПолучитьЭлементы().Добавить(); Раздел.ЭтоРаздел = Истина; Раздел.Заголовок = НСтр("ru = 'Поля'"); - Раздел.Картинка = ОтчетыКлиентСервер.ИндексКартинки("ВыбранныеПоля"); + Раздел.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено); Раздел.Идентификатор = "ВыбранныеПоля"; Строки = Раздел.ПолучитьЭлементы(); КонецЕсли; - КартинкаГруппы = ОтчетыКлиентСервер.ИндексКартинки("Группа"); - КартинкаЭлемента = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); - Если ЭлементыНастроек = Неопределено Тогда ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; КонецЕсли; @@ -2502,13 +2586,13 @@ Если ТипЗнч(ЭлементНастройки) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда Строка.Заголовок = НСтр("ru = 'Авто (поля родителя)'"); - Строка.Картинка = 6; + Строка.Картинка = 18; Продолжить; КонецЕсли; Если ТипЗнч(ЭлементНастройки) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда Строка.ЭтоГруппа = Истина; - Строка.Картинка = КартинкаГруппы; + Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено, Истина); Строка.Заголовок = ЗаголовокГруппыВыбранныхПолей(ЭлементНастройки); ОбновитьВыбранныеПоля(Строка.ПолучитьЭлементы(), ЭлементНастройки.Элементы); @@ -2518,7 +2602,9 @@ УстановитьПометкуУдаления("ВыбранныеПоля", Строка); Иначе ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); - Строка.Картинка = КартинкаЭлемента; + Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); + + УстановитьИндикаторФормулы(Отчет.КомпоновщикНастроек.Настройки, ОписаниеНастройки, Строка); КонецЕсли; КонецЕсли; КонецЦикла; @@ -2590,6 +2676,9 @@ Возврат; КонецЕсли; + Настройки = Отчет.КомпоновщикНастроек.Настройки; + ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляВыбора, ОписаниеНастройки); + СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); @@ -2621,11 +2710,41 @@ ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); Строка.Идентификатор = СвойствоЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройки); - Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); + Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); + + УстановитьИндикаторФормулы(Настройки, ОписаниеНастройки, Строка); УстановитьМодифицированность(); КонецПроцедуры +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьИндикаторФормулы(Настройки, ОписаниеНастройки, Строка) + Формула = ВариантыОтчетовСлужебныйКлиентСервер.ФормулаПоПутиКДанным(Настройки, Строка(ОписаниеНастройки.Поле)); + Строка.ЭтоФормула = (Формула <> Неопределено); + + Если Строка.ЭтоФормула Тогда + Строка.ИндикаторФормулы = БиблиотекаКартинок.ТипФункция; + Иначе + Строка.ИндикаторФормулы = БиблиотекаКартинок.Пустая; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеАктивизацииВыбранныхПолей() + Строка = Элементы.ВыбранныеПоля.ТекущиеДанные; + + Элементы.ВыбранныеПоляИзменитьФормулу.Доступность = Строка <> Неопределено + И Строка.ЭтоФормула; +КонецПроцедуры + +&НаКлиенте +Процедура ВыбранныеПоляПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) + Отказ = Истина; + + Обработчик = Новый ОписаниеОповещения("ВыбранныеПоляПослеВыбораПоля", ЭтотОбъект); + ВыбратьПоле("ВыбранныеПоля", Обработчик); +КонецПроцедуры + // Изменение группировки элементов. // Возвращаемое значение: @@ -3198,7 +3317,7 @@ Раздел = Сортировка.ПолучитьЭлементы().Добавить(); Раздел.ЭтоРаздел = Истина; Раздел.Заголовок = НСтр("ru = 'Сортировки'"); - Раздел.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Сортировки"); + Раздел.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(Неопределено); Строки = Раздел.ПолучитьЭлементы(); ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; @@ -3211,7 +3330,7 @@ Если ТипЗнч(ЭлементНастройки) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда Строка.Заголовок = НСтр("ru = 'Авто (сортировки родителя)'"); Строка.ЭтоАвтоПоле = Истина; - Строка.Картинка = 6; + Строка.Картинка = 18; Продолжить; КонецЕсли; @@ -3220,7 +3339,7 @@ УстановитьПометкуУдаления("Сортировка", Строка); Иначе ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки); - Строка.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); + Строка.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); КонецЕсли; КонецЦикла; КонецПроцедуры @@ -3244,6 +3363,9 @@ Возврат; КонецЕсли; + Настройки = Отчет.КомпоновщикНастроек.Настройки; + ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляПорядка, ОписаниеНастройки); + СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "Порядок", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); @@ -3349,7 +3471,7 @@ ЗаполнитьЗначенияСвойств(СтрокаПриемник, ЭлементНастройкиПриемник); ЗаполнитьЗначенияСвойств(СтрокаПриемник, ОписаниеНастройки); СтрокаПриемник.Идентификатор = СортировкаЭлементаСтруктуры.ПолучитьИдентификаторПоОбъекту(ЭлементНастройкиПриемник); - СтрокаПриемник.Картинка = ОтчетыКлиентСервер.ИндексКартинки("Элемент"); + СтрокаПриемник.Картинка = ВариантыОтчетовСлужебныйКлиентСервер.ИндексКартинкиПоля(ОписаниеНастройки.ТипЗначения); КонецЕсли; КонецЦикла; @@ -3497,16 +3619,7 @@ ПрочитатьПредопределенныеПараметрыОформления(); - Если РежимИзмененияЭлементаСтруктурыНастроек Тогда - Строки = Оформление.ПолучитьЭлементы(); - Иначе - Раздел = Оформление.ПолучитьЭлементы().Добавить(); - Раздел.Заголовок = НСтр("ru = 'Условное оформление'"); - Раздел.Представление = НСтр("ru = 'Условное оформление'"); - Раздел.Картинка = ОтчетыКлиентСервер.ИндексКартинки("УсловноеОформление"); - Раздел.ЭтоРаздел = Истина; - Строки = Раздел.ПолучитьЭлементы(); - КонецЕсли; + Строки = Оформление.ПолучитьЭлементы(); Для Каждого ЭлементНастройки Из СвойствоЭлементаСтруктуры.Элементы Цикл Строка = Строки.Добавить(); @@ -3561,8 +3674,10 @@ Строка = Оформление.ПолучитьЭлементы().Добавить(); ЗаполнитьЗначенияСвойств(Строка, Объект, "Использование, Значение"); - Строка.Заголовок = ПредставлениеЗаголовкаДляПечати(Объект.Значение); - Строка.Представление = НСтр("ru = 'Заголовок'"); + Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выводить заголовок для печати: %1'"), + ?(ЗначениеЗаполнено(Объект.Значение), Объект.Значение, НСтр("ru = '<Отсутствует>'"))); + Строка.Представление = НСтр("ru = 'Выводить заголовок для печати'"); Строка.Идентификатор = ПредопределенныеПараметры.TITLE.Идентификатор; Строка.Картинка = -1; Строка.КартинкаРежимаОтображения = 4; @@ -3575,35 +3690,14 @@ Строка = Оформление.ПолучитьЭлементы().Добавить(); Строка.Использование = (Объект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить Или СвязанныйОбъект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить); - Строка.Заголовок = НСтр("ru = 'Выводить параметры и отборы'"); - Строка.Представление = НСтр("ru = 'Выводить параметры и отборы'"); + Строка.Заголовок = НСтр("ru = 'Выводить фильтры'"); + Строка.Представление = НСтр("ru = 'Выводить фильтры'"); Строка.Идентификатор = ПредопределенныеПараметры.DATAPARAMETERSOUTPUT.Идентификатор; Строка.Картинка = -1; Строка.КартинкаРежимаОтображения = 4; Строка.ЭтоПараметрВывода = Истина; КонецПроцедуры -&НаКлиентеНаСервереБезКонтекста -Функция ПредставлениеЗаголовкаДляПечати(Знач ЗаголовокДляПечати) - - Если Не ЗначениеЗаполнено(ЗаголовокДляПечати) Тогда - ЗаголовокДляПечати = НСтр("ru = '<Отсутствует>'"); - КонецЕсли; - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1: %2'"), - ЗаголовокПредставленияЗаголовкаДляПечати(), - ЗаголовокДляПечати); - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ЗаголовокПредставленияЗаголовкаДляПечати() - - Возврат НСтр("ru = 'Заголовок для печати'"); - -КонецФункции - // Добавление, изменение элементов. &НаКлиенте @@ -3640,6 +3734,12 @@ Возврат; КонецЕсли; + Настройки = Отчет.КомпоновщикНастроек.Настройки; + + Если Результат.Свойство("ОписаниеФормул") Тогда + ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулы(Настройки, Настройки.ДоступныеПоляВыбора, Результат.ОписаниеФормул); + КонецЕсли; + СвойствоЭлементаСтруктуры = СвойствоЭлементаСтруктурыНастроек( Отчет.КомпоновщикНастроек, "УсловноеОформление", ИдентификаторЭлементаСтруктурыНастроек); @@ -3685,9 +3785,7 @@ Строка.Картинка = -1; Строка.КартинкаРежимаОтображения = КартинкаРежимаОтображенияЭлементаНастройки(ЭлементНастройки); - Если Раздел <> Неопределено Тогда - Элементы.Оформление.Развернуть(Раздел.ПолучитьИдентификатор()); - КонецЕсли; + Элементы.Оформление.ТекущаяСтрока = Строка.ПолучитьИдентификатор(); УстановитьМодифицированность(); КонецПроцедуры @@ -3717,7 +3815,9 @@ Строка = Оформление.НайтиПоИдентификатору(Идентификатор); Строка.Использование = Истина; Строка.Значение = Значение; - Строка.Заголовок = ПредставлениеЗаголовкаДляПечати(Значение); + Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выводить заголовок для печати: %1'"), + ?(ЗначениеЗаполнено(Значение), Значение, "<Отсутствует>")); Настройки = Отчет.КомпоновщикНастроек.Настройки; @@ -3947,7 +4047,8 @@ Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных") Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда - СвойстваЭлемента.Представление = ПредставлениеПолейГруппировки(Элемент, СвойстваЭлемента.ПометкаУдаления); + СвойстваЭлемента.Представление = ВариантыОтчетовСлужебный.ПредставлениеПолейГруппировки( + Элемент, СвойстваЭлемента.ПометкаУдаления); ИначеЕсли ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда @@ -4021,47 +4122,6 @@ Возврат СвойстваЭлемента; КонецФункции -&НаСервере -Функция ПредставлениеПолейГруппировки(ЭлементНастройки, ПометкаУдаления) - Если ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) Тогда - Возврат ЭлементНастройки.ПредставлениеПользовательскойНастройки; - КонецЕсли; - - Поля = ЭлементНастройки.ПоляГруппировки; // ПоляГруппировкиКомпоновкиДанных - Если Поля.Элементы.Количество() = 0 Тогда - Возврат НСтр("ru = '<Детальные записи>'"); - КонецЕсли; - - ПредставлениеПолей = Новый Массив; - - Для Каждого Элемент Из Поля.Элементы Цикл - Если Не Элемент.Использование - Или ТипЗнч(Элемент) = Тип("АвтоПолеГруппировкиКомпоновкиДанных") Тогда - Продолжить; - КонецЕсли; - - ОписаниеПоля = Поля.ДоступныеПоляПолейГруппировок.НайтиПоле(Элемент.Поле); - Если ОписаниеПоля = Неопределено Тогда - ПометкаУдаления = Истина; - ПредставлениеПоля = Строка(Элемент.Поле); - Иначе - ПредставлениеПоля = ОписаниеПоля.Заголовок; - КонецЕсли; - - Если Элемент.ТипГруппировки <> ТипГруппировкиКомпоновкиДанных.Элементы Тогда - ПредставлениеПоля = ПредставлениеПоля + " (" + Элемент.ТипГруппировки + ")"; - КонецЕсли; - - ПредставлениеПолей.Добавить(ПредставлениеПоля); - КонецЦикла; - - Если ПредставлениеПолей.Количество() = 0 Тогда - Возврат НСтр("ru = '<Детальные записи>'"); - КонецЕсли; - - Возврат СтрСоединить(ПредставлениеПолей, ", "); -КонецФункции - &НаСервере Функция ДоступныеОбъектыНастройки(НастройкиВложенногоОбъекта) Если ТипЗнч(НастройкиВложенногоОбъекта.Родитель) = Тип("НастройкиКомпоновкиДанных") Тогда @@ -4230,6 +4290,9 @@ Возврат; КонецЕсли; + Настройки = Отчет.КомпоновщикНастроек.Настройки; + ВариантыОтчетовСлужебныйКлиент.ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, ОписаниеНастройки); + ТекущаяСтрока = Элементы.СтруктураВарианта.ТекущиеДанные; СтрокиПеремещаемыеВНовуюГруппировку = Новый Массив; @@ -5362,49 +5425,55 @@ // Клиент - Таблицы полей (универсальные точки входа). &НаКлиенте -Процедура ВыбратьРежимОтображения(ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки, ПоказыватьРежимыВвода, ПоказыватьРежимыФлажков, ТекущийРежимОтображения = Неопределено) - Контекст = Новый Структура("ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки", ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки); - Обработчик = Новый ОписаниеОповещения("РежимОтображенияПослеВыбора", ЭтотОбъект, Контекст); +Процедура ВыбратьРежимОтображенияДляСтрок(СвойстваЭлементовНастроек, ИмяКоллекции, ПоказыватьРежимыФлажков = Ложь, ТекущийРежимОтображения = Неопределено) - Список = Новый СписокЗначений; - Если ПоказыватьРежимыВвода Тогда - Список.Добавить("ПоказыватьВШапкеОтчета", НСтр("ru = 'В шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступ); - КонецЕсли; - Если ПоказыватьРежимыФлажков Тогда - Список.Добавить("ПоказыватьТолькоФлажокВШапкеОтчета", НСтр("ru = 'Только флажок в шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступСФлажком); - КонецЕсли; - Если ПоказыватьРежимыВвода Тогда - Список.Добавить("ПоказыватьВНастройкахОтчета", НСтр("ru = 'В настройках отчета'"), , БиблиотекаКартинок.Реквизит); - КонецЕсли; - Если ПоказыватьРежимыФлажков Тогда - Список.Добавить("ПоказыватьТолькоФлажокВНастройкахОтчета", НСтр("ru = 'Только флажок в настройках отчета'"), , БиблиотекаКартинок.ОбычныйДоступСФлажком); - КонецЕсли; - Список.Добавить("НеПоказывать", НСтр("ru = 'Не показывать'"), , БиблиотекаКартинок.СкрытаяНастройкаОтчета); + ДоступныеРежимыОтображения = ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков); + РежимОтображения = ДоступныеРежимыОтображения.НайтиПоЗначению(ТекущийРежимОтображения); - Если ТекущийРежимОтображения = Неопределено Тогда - ПоказатьВыборИзМеню(Обработчик, Список); - Иначе - РежимОтображения = Список.НайтиПоЗначению(ТекущийРежимОтображения); - ВыполнитьОбработкуОповещения(Обработчик, РежимОтображения); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура РежимОтображенияПослеВыбора(РежимОтображения, Контекст) Экспорт Если РежимОтображения = Неопределено Тогда Возврат; КонецЕсли; - Если РежимОтображения.Значение = "ПоказыватьВШапкеОтчета" Тогда - КартинкаРежимаОтображения = 2; - ИначеЕсли РежимОтображения.Значение = "ПоказыватьТолькоФлажокВШапкеОтчета" Тогда - КартинкаРежимаОтображения = 1; - ИначеЕсли РежимОтображения.Значение = "ПоказыватьВНастройкахОтчета" Тогда - КартинкаРежимаОтображения = 4; - ИначеЕсли РежимОтображения.Значение = "ПоказыватьТолькоФлажокВНастройкахОтчета" Тогда - КартинкаРежимаОтображения = 3; + ДоступныеКартинки = ДоступныеКартинкиРежимовОтображения(); + КартинкаРежимаОтображения = ДоступныеКартинки[РежимОтображения.Значение]; + + Для Каждого СвойстваЭлементаНастроек Из СвойстваЭлементовНастроек Цикл + + Строка = ЭтотОбъект[ИмяКоллекции].НайтиПоИдентификатору(СвойстваЭлементаНастроек.ИдентификаторСтроки); // см. ЭлементКоллекцииФормыНастроек + ЭлементНастроек = СвойстваЭлементаНастроек.ЭлементНастроек; + + Если Строка <> Неопределено И ЭлементНастроек <> Неопределено Тогда + УстановитьРежимОтображения(ИмяКоллекции, Строка, ЭлементНастроек, КартинкаРежимаОтображения); + КонецЕсли; + + КонецЦикла; + + УстановитьМодифицированность(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьРежимОтображенияДляСтроки(ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки, ПоказыватьРежимыВвода, ПоказыватьРежимыФлажков, ТекущийРежимОтображения = Неопределено) + + Контекст = Новый Структура("ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки", ОтборыУзлаНастроек, ИмяКоллекции, ИдентификаторСтроки); + Обработчик = Новый ОписаниеОповещения("ПослеВыбораРежимаОтображенияСтроки", ЭтотОбъект, Контекст); + + ДоступныеРежимыОтображения = ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков); + + Если ТекущийРежимОтображения = Неопределено Тогда + ПоказатьВыборИзМеню(Обработчик, ДоступныеРежимыОтображения); Иначе - КартинкаРежимаОтображения = 5; + РежимОтображения = ДоступныеРежимыОтображения.НайтиПоЗначению(ТекущийРежимОтображения); + ВыполнитьОбработкуОповещения(Обработчик, РежимОтображения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеВыбораРежимаОтображенияСтроки(РежимОтображения, Контекст) Экспорт + + Если РежимОтображения = Неопределено Тогда + Возврат; КонецЕсли; Строка = ЭтотОбъект[Контекст.ИмяКоллекции].НайтиПоИдентификатору(Контекст.ИдентификаторСтроки); // см. ЭлементКоллекцииФормыНастроек @@ -5417,11 +5486,50 @@ Возврат; КонецЕсли; - УстановитьРежимОтображения(Контекст.ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения); + ДоступныеКартинки = ДоступныеКартинкиРежимовОтображения(); + КартинкаРежимаОтображения = ДоступныеКартинки[РежимОтображения.Значение]; + УстановитьРежимОтображения(Контекст.ИмяКоллекции, Строка, ЭлементНастройки, КартинкаРежимаОтображения); УстановитьМодифицированность(); + КонецПроцедуры +&НаКлиенте +Функция ДоступныеРежимыОтображения(ПоказыватьРежимыФлажков) + + ДоступныеРежимыОтображения = Новый СписокЗначений; + ДоступныеРежимыОтображения.Добавить("ПоказыватьВШапкеОтчета", НСтр("ru = 'В шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступ); + + Если ПоказыватьРежимыФлажков Тогда + ДоступныеРежимыОтображения.Добавить("ПоказыватьТолькоФлажокВШапкеОтчета", НСтр("ru = 'Только флажок в шапке отчета'"), , БиблиотекаКартинок.БыстрыйДоступСФлажком); + КонецЕсли; + + ДоступныеРежимыОтображения.Добавить("ПоказыватьВНастройкахОтчета", НСтр("ru = 'В настройках отчета'"), , БиблиотекаКартинок.Реквизит); + + Если ПоказыватьРежимыФлажков Тогда + ДоступныеРежимыОтображения.Добавить("ПоказыватьТолькоФлажокВНастройкахОтчета", НСтр("ru = 'Только флажок в настройках отчета'"), , БиблиотекаКартинок.ОбычныйДоступСФлажком); + КонецЕсли; + + ДоступныеРежимыОтображения.Добавить("НеПоказывать", НСтр("ru = 'Не показывать'"), , БиблиотекаКартинок.СкрытаяНастройкаОтчета); + + Возврат ДоступныеРежимыОтображения; + +КонецФункции + +&НаКлиенте +Функция ДоступныеКартинкиРежимовОтображения() + + ДоступныеКартинки = Новый Соответствие; + ДоступныеКартинки.Вставить("ПоказыватьТолькоФлажокВШапкеОтчета", 1); + ДоступныеКартинки.Вставить("ПоказыватьВШапкеОтчета", 2); + ДоступныеКартинки.Вставить("ПоказыватьТолькоФлажокВНастройкахОтчета", 3); + ДоступныеКартинки.Вставить("ПоказыватьВНастройкахОтчета", 4); + ДоступныеКартинки.Вставить("НеПоказывать", 5); + + Возврат ДоступныеКартинки; + +КонецФункции + // Параметры: // ИмяКоллекции - Строка // Строка - см. ЭлементКоллекцииФормыНастроек @@ -5703,7 +5811,7 @@ КонецЕсли; ИначеЕсли ИмяКоллекции = "Оформление" Тогда Если Не РежимИзмененияЭлементаСтруктурыНастроек Тогда - КорневаяСтрока = Оформление.ПолучитьЭлементы()[2]; + КорневаяСтрока = Оформление; КонецЕсли; КонецЕсли; @@ -5857,7 +5965,7 @@ Элементы.Дополнительно.Видимость = Не ЭтоРасширенныйРежим; Элементы.ВыводитьЗаголовок.Видимость = Не ЭтоРасширенныйРежим; - Элементы.ВыводитьПараметрыИОтборы.Видимость = Не ЭтоРасширенныйРежим; + Элементы.ВыводитьФильтры.Видимость = Не ЭтоРасширенныйРежим; #КонецОбласти @@ -5879,7 +5987,7 @@ И ТипЭлементаСтруктурыНастроек <> "ДиаграммаКомпоновкиДанных"); Если ЭтоРасширенныйРежим Тогда - Элементы.СтраницаОтборы.Заголовок = НСтр("ru = 'Отборы'"); + Элементы.СтраницаОтборы.Заголовок = НСтр("ru = 'Фильтры'"); Иначе Элементы.СтраницаОтборы.Заголовок = НСтр("ru = 'Основное'"); КонецЕсли; @@ -5890,6 +5998,9 @@ И СодержитВложенныеОтборы И ОтображатьИнформацию; + Элементы.ОтборыПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим + И Не РежимИзмененияЭлементаСтруктурыНастроек; + #КонецОбласти #Область СвойстваЭлементовСтраницыПоляИСортировки @@ -5929,6 +6040,9 @@ Элементы.ГруппаЕстьВложенныеПоляИлиСортировки.Видимость = СодержитВложенныеПоляИлиСортировки И ОтображатьИнформацию; + Элементы.ВыбранныеПоляПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим + И Не РежимИзмененияЭлементаСтруктурыНастроек; + #КонецОбласти #Область СвойстваЭлементовСтраницыОформление @@ -5939,6 +6053,9 @@ И СодержитВложенноеУсловноеОформление И ОтображатьИнформацию; + Элементы.ОформлениеПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим + И Не РежимИзмененияЭлементаСтруктурыНастроек; + #КонецОбласти #Область СвойстваЭлементовСтраницыСтруктураВарианта @@ -5973,6 +6090,9 @@ Элементы.СтруктураВариантаСодержитПоляИлиСортировки.Видимость = ЭтоРасширенныйРежим; Элементы.СтруктураВариантаСодержитУсловноеОформление.Видимость = ЭтоРасширенныйРежим; + Элементы.СтруктураВариантаПерейтиКНастройкамДляТехническогоСпециалиста.Видимость = ЭтоРасширенныйРежим + И Не РежимИзмененияЭлементаСтруктурыНастроек; + #КонецОбласти #Область ОбщиеСвойстваЭлементов @@ -6550,6 +6670,17 @@ ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеЗаголовок.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Оформление.ЭтоПараметрВывода"); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = Истина; + + Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); + + // + Элемент = УсловноеОформление.Элементы.Добавить(); + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОформлениеИндексКартинкиДоступа.Имя); @@ -6558,7 +6689,7 @@ ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = Истина; - Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); + Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); // Элемент = УсловноеОформление.Элементы.Добавить(); @@ -6741,10 +6872,18 @@ Объект = ПредопределенныеПараметры.Найти("TITLE"); ВыводитьЗаголовок = Объект.Использование; + ПолеВыводаЗаголовка = Элементы.Найти("ВыводитьЗаголовок"); + + Если ПолеВыводаЗаголовка <> Неопределено Тогда + ПолеВыводаЗаголовка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выводить заголовок для печати: %1'"), + ?(ЗначениеЗаполнено(Объект.Значение), Объект.Значение, НСтр("ru = '<Отсутствует>'"))); + КонецЕсли; + Объект = ПредопределенныеПараметры.Найти("DATAPARAMETERSOUTPUT"); СвязанныйОбъект = ПредопределенныеПараметры.Найти("FILTEROUTPUT"); - ВыводитьПараметрыИОтборы = (Объект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить + ВыводитьФильтры = (Объект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить Или СвязанныйОбъект.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить); КонецПроцедуры diff --git a/SSL/src/CommonForms/ФормаОтчета/Form.form b/SSL/src/CommonForms/ФормаОтчета/Form.form index 782c0c2ea..b6191f4ff 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаОтчета/Form.form @@ -1,8 +1,98 @@ - КомпоновщикНастроекПользовательскиеНастройки - 758 + ПанельБыстрыхНастроек + 986 + + КомпоновщикНастроекПользовательскиеНастройки + 758 + true + true + + true + + + <key>ru</key> + <value>Настройки</value> + + true + false + + КомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 759 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + КомандыПанелиБыстрыхНастроек + 988 + + ИзменитьСоставБыстрыхНастроек + 990 + true + true + + true + + + ИзменитьСоставБыстрыхНастроекРасширеннаяПодсказка + 991 + Label + true + true + + Left + + + Form.Command.ИзменитьСоставБыстрыхНастроек + Normal + Auto + true + true + UserCmds + Auto + WhenActive + + true + true + + true + + + <key>ru</key> + <value>Команды панели быстрых настроек</value> + + Right + + КомандыПанелиБыстрыхНастроекРасширеннаяПодсказка + 989 + Label + true + true + + Left + + + CommandBar + + Right + + true true @@ -10,12 +100,11 @@ <key>ru</key> - <value>Настройки</value> + <value>Панель быстрых настроек</value> - false - КомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка - 759 + ПанельБыстрыхНастроекРасширеннаяПодсказка + 987 Label true true @@ -25,11 +114,13 @@ UsualGroup - Vertical + AlwaysHorizontal Auto - WeakSeparation true true + + Style.ToolTipBackColor + Auto Auto @@ -123,21 +214,82 @@ ГруппаСохранениеВыборВариантаОтчета 358 - - СохранитьВариант - 506 - - <key>ru</key> - <value>Сохранить вариант отчета...</value> - + + ГруппаСохранениеВариантаОтчета + 996 + + СохранитьВариант + 994 + true + true + + true + + + СохранитьВариантРасширеннаяПодсказка + 995 + Label + true + true + + Left + + + Form.Command.СохранитьВариант + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СохранитьВариантКак + 506 + + <key>ru</key> + <value>Сохранить как...</value> + + true + true + + true + + + СохранитьВариантКакРасширеннаяПодсказка + 507 + Label + true + true + + Left + + + Form.StandardCommand.SaveVariant + Normal + Picture + true + true + UserCmds + + CommonPicture.СохранитьКак + + Auto + InCommandBarAndInAdditionalSubmenu + true true true + + <key>ru</key> + <value>Сохранение варианта отчета</value> + - СохранитьВариантРасширеннаяПодсказка - 507 + ГруппаСохранениеВариантаОтчетаРасширеннаяПодсказка + 997 Label true true @@ -145,17 +297,9 @@ Left - Form.StandardCommand.SaveVariant - Normal - PictureAndText - true - true - UserCmds - - CommonPicture.СохранитьВариантОтчета - - Auto - InCommandBarAndInAdditionalSubmenu + + Compact + ГруппаВариантыОтчета @@ -265,17 +409,75 @@ ГруппаРаботаВТаблице 518 - - Найти - 62 + + ГруппаПоиск + 1047 + + Найти + 62 + true + true + + true + + + НайтиРасширеннаяПодсказка + 120 + Label + true + true + + Left + + + Form.Item.ОтчетТабличныйДокумент.StandardCommand.Find + Normal + Picture + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + НайтиСледующий + 1049 + true + true + + true + + + НайтиСледующийРасширеннаяПодсказка + 1050 + Label + true + true + + Left + + + Form.Item.ОтчетТабличныйДокумент.StandardCommand.FindNext + Normal + Picture + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + true true true + + <key>ru</key> + <value>Поиск</value> + - НайтиРасширеннаяПодсказка - 120 + ГруппаПоискРасширеннаяПодсказка + 1048 Label true true @@ -283,13 +485,9 @@ Left - Form.Item.ОтчетТабличныйДокумент.StandardCommand.Find - Normal - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu + + Compact + ГруппаУправлениеГруппировками @@ -348,6 +546,65 @@ Auto InCommandBarAndInAdditionalSubmenu + + ГруппаУровниГруппировок + 1002 + + ПоказатьУровеньГруппировок + 1008 + true + true + + true + + + ПоказатьУровеньГруппировокРасширеннаяПодсказка + 1009 + Label + true + true + + Left + + + Form.Command.ПоказатьУровеньГруппировок + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Разворачивать до</value> + + + ru + Развернуть группировки до выбранного уровня + + + ГруппаУровниГруппировокРасширеннаяПодсказка + 1003 + Label + true + true + + Left + + + Popup + + Auto + Normal + + true true @@ -503,6 +760,9 @@ true true UserCmds + + CommonPicture.Скачать + Auto InCommandBarAndInAdditionalSubmenu @@ -617,6 +877,48 @@ ГруппаПоказатель 724 + + ВыбратьПоказатель + 1024 + + <key>ru</key> + <value>Выбрать показатель</value> + + true + true + + true + + + ВыбратьПоказательРасширеннаяПодсказка + 1026 + Label + true + true + + Left + + + + ВыбратьПоказательКонтекстноеМеню + 1025 + true + + true + true + Center + + + Click + ВыбратьПоказательНажатие + + + CommonPicture.Сумма + + true + AsFileRef + + Показатель 721 @@ -629,13 +931,32 @@ Показатель None + Button + + OnChange + ПоказательПриИзменении + ПоказательРасширеннаяПодсказка 723 + + <key>ru</key> + <value>Введите слово для фильтра (название товара, покупателя и пр.). +Используйте: +<b>-</>, <b><<>></> если надо исключить значение +<b>>></>, <b>>>=</>, <b><<</>, <b><<=</> для фильтров по числам и датам + +<link Больше возможностей...>Больше возможностей...</></value> + + true Label true true + + URLProcessing + ПоказательРасширеннаяПодсказкаОбработкаНавигационнойСсылки + Left @@ -645,20 +966,32 @@ true InputField - true + Right Enter true Left true - 10 + + AutoComplete + ПоказательАвтоПодбор + + + ChoiceProcessing + ПоказательОбработкаВыбора + true true + true true true true true Normal + + ru + Введите слово для фильтра (название товара, покупателя и пр.) + @@ -696,6 +1029,7 @@ true UserCmds Auto + InCommandBarAndInAdditionalSubmenu РассчитатьКоличество @@ -726,6 +1060,7 @@ true UserCmds Auto + InCommandBarAndInAdditionalSubmenu РассчитатьСреднее @@ -756,6 +1091,7 @@ true UserCmds Auto + InCommandBarAndInAdditionalSubmenu РассчитатьМинимум @@ -786,6 +1122,7 @@ true UserCmds Auto + InCommandBarAndInAdditionalSubmenu РассчитатьМаксимум @@ -816,6 +1153,7 @@ true UserCmds Auto + InCommandBarAndInAdditionalSubmenu ВсеПоказатели @@ -849,6 +1187,7 @@ true UserCmds Auto + InCommandBarAndInAdditionalSubmenu true true @@ -904,7 +1243,6 @@ Normal - true true true @@ -918,6 +1256,7 @@ Выполняет расчет определенного или всех показателей выделенных ячеек true + false КомандыПоказателейРасширеннаяПодсказка 685 @@ -943,7 +1282,8 @@ Показатель true - false + true + Right ГруппаПоказательРасширеннаяПодсказка 725 @@ -1077,16 +1417,16 @@ InAdditionalSubmenu - ИзменитьУсловияОтборов - 630 + ИзменитьСоставБыстрыхНастроекЕще + 992 true true true - ИзменитьУсловияОтборовРасширеннаяПодсказка - 631 + ИзменитьСоставБыстрыхНастроекЕщеРасширеннаяПодсказка + 993 Label true true @@ -1094,7 +1434,7 @@ Left - Form.Command.ИзменитьУсловияОтборов + Form.Command.ИзменитьСоставБыстрыхНастроек Normal Auto true @@ -1131,23 +1471,84 @@ InAdditionalSubmenu - ГруппаСохранениеВариантаОтчетаЕще + ГруппаСохранениеВыборВариантаОтчетаЕще 736 - - СохранитьВариантЕще - 738 - - <key>ru</key> - <value>Сохранить...</value> - + + ГруппаСохранениеВариантаОтчетаЕще + 1000 + + СохранитьВариантЕще + 998 + true + true + + true + + + СохранитьВариантЕщеРасширеннаяПодсказка + 999 + Label + true + true + + Left + + + Form.Command.СохранитьВариант + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьВариантКакЕще + 738 + + <key>ru</key> + <value>Сохранить как...</value> + + true + true + + true + + + СохранитьВариантКакЕщеРасширеннаяПодсказка + 739 + Label + true + true + + Left + + + Form.StandardCommand.SaveVariant + Normal + PictureAndText + true + true + UserCmds + + CommonPicture.СохранитьКак + + Auto + InAdditionalSubmenu + true true true + + <key>ru</key> + <value>Сохранение варианта отчета</value> + - СохранитьВариантЕщеРасширеннаяПодсказка - 739 + ГруппаСохранениеВариантаОтчетаЕщеРасширеннаяПодсказка + 1001 Label true true @@ -1155,17 +1556,9 @@ Left - Form.StandardCommand.SaveVariant - Normal - PictureAndText - true - true - UserCmds - - CommonPicture.СохранитьВариантОтчета - - Auto - InAdditionalSubmenu + + Compact + ГруппаВариантыОтчетаЕще @@ -1192,6 +1585,37 @@
      + + ВыбратьВариант + 639 + + <key>ru</key> + <value>Выбрать...</value> + + true + true + + true + + + ВыбратьВариантРасширеннаяПодсказка + 640 + Label + true + true + + Left + + + Form.StandardCommand.LoadVariant + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + ДругиеОтчетыЕще 740 @@ -1297,230 +1721,6 @@
      - true - true - - true - - - <key>ru</key> - <value>Варианты отчета</value> - - - ru - Выбрать другой вариант отчета или сохранить новый - - true - - ГруппаСохранениеВариантаОтчетаЕщеРасширеннаяПодсказка - 737 - Label - true - true - - Left - - - Popup - - - CommonPicture.ВыбратьВариантОтчета - - Picture - Normal - - - - ГруппаПрочиеНастройкиОтчетаЕще - 502 - - ГруппаИзменениеВариантаОтчетаЕще - 450 - - ИзменитьВариант - 452 - true - true - - true - - - ИзменитьВариантРасширеннаяПодсказка - 453 - Label - true - true - - Left - - - Form.Command.ИзменитьВариантОтчета - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ВыбратьВариант - 639 - - <key>ru</key> - <value>Выбрать вариант отчета...</value> - - true - true - - true - - - ВыбратьВариантРасширеннаяПодсказка - 640 - Label - true - true - - Left - - - Form.StandardCommand.LoadVariant - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Варианты отчета</value> - - true - - ГруппаИзменениеВариантаОтчетаЕщеРасширеннаяПодсказка - 451 - Label - true - true - - Left - - - - - - ГруппаПользовательскиеНастройкиЕще - 504 - - ВыбратьНастройки - 462 - true - true - - true - - - ВыбратьНастройкиРасширеннаяПодсказка - 463 - Label - true - true - - Left - - - Form.StandardCommand.LoadReportSettings - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СохранитьНастройки - 460 - true - true - - true - - - СохранитьНастройкиРасширеннаяПодсказка - 461 - Label - true - true - - Left - - - Form.StandardCommand.SaveReportSettings - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ПоделитьсяНастройками - 828 - true - true - - true - - - ПоделитьсяНастройкамиРасширеннаяПодсказка - 829 - Label - true - true - - Left - - - Form.Command.ПоделитьсяНастройками - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Пользовательские настройки</value> - - - ГруппаПользовательскиеНастройкиЕщеРасширеннаяПодсказка - 505 - Label - true - true - - Left - - - - ГруппаСхемаОтчетаЕще 706 @@ -1633,7 +1833,124 @@ <key>ru</key> - <value>Прочее</value> + <value>Варианты отчета</value> + + + ru + Выбрать другой вариант отчета или сохранить новый + + true + + ГруппаСохранениеВыборВариантаОтчетаЕщеРасширеннаяПодсказка + 737 + Label + true + true + + Left + + + Popup + + + CommonPicture.ВыбратьВариантОтчета + + Picture + Normal + + + + ГруппаПрочиеНастройкиОтчетаЕще + 502 + + ВыбратьНастройки + 462 + true + true + + true + + + ВыбратьНастройкиРасширеннаяПодсказка + 463 + Label + true + true + + Left + + + Form.StandardCommand.LoadReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СохранитьНастройки + 460 + true + true + + true + + + СохранитьНастройкиРасширеннаяПодсказка + 461 + Label + true + true + + Left + + + Form.StandardCommand.SaveReportSettings + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПоделитьсяНастройками + 828 + true + true + + true + + + ПоделитьсяНастройкамиРасширеннаяПодсказка + 829 + Label + true + true + + Left + + + Form.Command.ПоделитьсяНастройками + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Персональные настройки</value> ГруппаПрочиеНастройкиОтчетаЕщеРасширеннаяПодсказка @@ -1702,17 +2019,134 @@ Auto InAdditionalSubmenu - - РазвернутьВсеГруппыЕще - 746 + + ГруппаУправлениеГруппировкамиЕще + 1004 + + РазвернутьВсеГруппыЕще + 746 + true + true + + true + + + РазвернутьВсеГруппыЕщеРасширеннаяПодсказка + 747 + Label + true + true + + Left + + + Form.Item.ОтчетТабличныйДокумент.StandardCommand.ExpandAllGroups + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СвернутьВсеГруппыЕще + 748 + true + true + + true + + + СвернутьВсеГруппыЕщеРасширеннаяПодсказка + 749 + Label + true + true + + Left + + + Form.Item.ОтчетТабличныйДокумент.StandardCommand.CollapseAllGroups + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ГруппаУровниГруппировокЕще + 1006 + + ПоказатьУровеньГруппировокЕще + 1010 + true + true + + true + + + ПоказатьУровеньГруппировокЕщеРасширеннаяПодсказка + 1011 + Label + true + true + + Left + + + Form.Command.ПоказатьУровеньГруппировок + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Разворачивать до</value> + + + ru + Развернуть группировки до выбранного уровня + + + ГруппаУровниГруппировокЕщеРасширеннаяПодсказка + 1007 + Label + true + true + + Left + + + Popup + + Auto + Normal + + true true true + + <key>ru</key> + <value>Управление группировками</value> + - РазвернутьВсеГруппыЕщеРасширеннаяПодсказка - 747 + ГруппаУправлениеГруппировкамиЕщеРасширеннаяПодсказка + 1005 Label true true @@ -1720,41 +2154,7 @@ Left
      - Form.Item.ОтчетТабличныйДокумент.StandardCommand.ExpandAllGroups - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - СвернутьВсеГруппыЕще - 748 - true - true - - true - - - СвернутьВсеГруппыЕщеРасширеннаяПодсказка - 749 - Label - true - true - - Left - - - Form.Item.ОтчетТабличныйДокумент.StandardCommand.CollapseAllGroups - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu + КомандыТабличногоДокумента @@ -1995,6 +2395,9 @@ true true UserCmds + + CommonPicture.Скачать + Auto InAdditionalSubmenu @@ -2453,7 +2856,7 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu + InAdditionalSubmenu true true @@ -2464,6 +2867,7 @@ ru Командная панель еще + false КоманднаяПанельЕщеРасширеннаяПодсказка 720 @@ -2540,6 +2944,32 @@ КонтекстноеМенюОбластиЗаголовкаИзменитьСоставПолей 836 + + КонтекстноеМенюОбластиЗаголовкаСгруппироватьПоВыбранномуПолю + 1045 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаСгруппироватьПоВыбранномуПолюРасширеннаяПодсказка + 1046 + Label + true + true + + Left + + + Form.Command.СгруппироватьПоВыбранномуПолю + Normal + Auto + true + true + UserCmds + Auto + КонтекстноеМенюОбластиЗаголовкаВставить 838 @@ -3255,6 +3685,766 @@ UserCmds Auto + + КонтекстноеМенюОбластиДанныхФильтроватьРавноНеРавно + 888 + + КонтекстноеМенюОбластиДанныхФильтроватьРавно + 890 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьРавноРасширеннаяПодсказка + 891 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеРавно + 892 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеРавноРасширеннаяПодсказка + 893 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Равно, не равно</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьРавноНеРавноРасширеннаяПодсказка + 889 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьБольшеМеньше + 894 + + КонтекстноеМенюОбластиДанныхФильтроватьБольше + 896 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьБольшеРасширеннаяПодсказка + 897 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьМеньше + 898 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьМеньшеРасширеннаяПодсказка + 899 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Больше, меньше</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьБольшеМеньшеРасширеннаяПодсказка + 895 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьБольшеИлиРавноМеньшеИлиРавно + 900 + + КонтекстноеМенюОбластиДанныхФильтроватьБольшеИлиРавно + 902 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьБольшеИлиРавноРасширеннаяПодсказка + 903 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьМеньшеИлиРавно + 904 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьМеньшеИлиРавноРасширеннаяПодсказка + 905 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Больше или равно, меньше или равно</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьБольшеИлиРавноМеньшеИлиРавноРасширеннаяПодсказка + 901 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьСодержитНеСодержит + 906 + + КонтекстноеМенюОбластиДанныхФильтроватьСодержит + 908 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьСодержитРасширеннаяПодсказка + 909 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеСодержит + 910 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеСодержитРасширеннаяПодсказка + 911 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Содержит, не содержит</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьСодержитНеСодержитРасширеннаяПодсказка + 907 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьВСпискеНеВСписке + 912 + + КонтекстноеМенюОбластиДанныхФильтроватьВСписке + 914 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьВСпискеРасширеннаяПодсказка + 915 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеВСписке + 916 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеВСпискеРасширеннаяПодсказка + 917 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>В списке, не в списке</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьВСпискеНеВСпискеРасширеннаяПодсказка + 913 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьВСпискеПоИерархииНеВСпискеПоИерархии + 918 + + КонтекстноеМенюОбластиДанныхФильтроватьВСпискеПоИерархии + 920 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьВСпискеПоИерархииРасширеннаяПодсказка + 921 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеВСпискеПоИерархии + 922 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеВСпискеПоИерархииРасширеннаяПодсказка + 923 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>В списке по иерархии, не в списке по иерархии</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьВСпискеПоИерархииНеВСпискеПоИерархииРасширеннаяПодсказка + 919 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьВИерархииНеВИерархии + 924 + + КонтекстноеМенюОбластиДанныхФильтроватьВИерархии + 926 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьВИерархииРасширеннаяПодсказка + 927 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеВИерархии + 928 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеВИерархииРасширеннаяПодсказка + 929 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>В иерархии, не в иерархии</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьВИерархииНеВИерархииРасширеннаяПодсказка + 925 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьЗаполненоНеЗаполнено + 930 + + КонтекстноеМенюОбластиДанныхФильтроватьЗаполнено + 932 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьЗаполненоРасширеннаяПодсказка + 933 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеЗаполнено + 934 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеЗаполненоРасширеннаяПодсказка + 935 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Заполнено, не заполнено</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьЗаполненоНеЗаполненоРасширеннаяПодсказка + 931 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьНачинаетсяСНеНачинаетсяС + 936 + + КонтекстноеМенюОбластиДанныхФильтроватьНачинаетсяС + 938 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНачинаетсяСРасширеннаяПодсказка + 939 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеНачинаетсяС + 940 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеНачинаетсяСРасширеннаяПодсказка + 941 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Начинается с, не начинается С</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьНачинаетсяСНеНачинаетсяСРасширеннаяПодсказка + 937 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанныхФильтроватьПодобноНеПодобно + 942 + + КонтекстноеМенюОбластиДанныхФильтроватьПодобно + 944 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьПодобноРасширеннаяПодсказка + 945 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиДанныхФильтроватьНеПодобно + 946 + true + true + + true + + + КонтекстноеМенюОбластиДанныхФильтроватьНеПодобноРасширеннаяПодсказка + 947 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Подобно, не подобно</value> + + + КонтекстноеМенюОбластиДанныхФильтроватьПодобноНеПодобноРасширеннаяПодсказка + 943 + Label + true + true + + Left + + + + true true @@ -3714,20 +4904,20 @@ КонтекстноеМенюОбластиОбщее - 996 + 1027 КонтекстноеМенюОбластиОбщееСвернутьРазвернуть - 520 + 1033 КонтекстноеМенюОбластиОбщееСвернутьВсеГруппы - 522 + 1035 true true КонтекстноеМенюОбластиОбщееСвернутьВсеГруппыРасширеннаяПодсказка - 523 + 1036 Label true true @@ -3742,18 +4932,17 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu КонтекстноеМенюОбластиОбщееРазвернутьВсеГруппы - 524 + 1037 true true КонтекстноеМенюОбластиОбщееРазвернутьВсеГруппыРасширеннаяПодсказка - 525 + 1038 Label true true @@ -3768,22 +4957,21 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu - КонтекстноеМенюОбластиОбщееМенюУровниГруппировок - 986 + ГруппаУровниГруппировокКонтекстноеМеню + 1039 - КонтекстноеМенюОбластиОбщееПоказатьУровеньГруппировок - 988 + ПоказатьУровеньГруппировокКонтекстноеМеню + 1041 true true true - КонтекстноеМенюОбластиОбщееПоказатьУровеньГруппировокРасширеннаяПодсказка - 989 + ПоказатьУровеньГруппировокКонтекстноеМенюРасширеннаяПодсказка + 1042 Label true true @@ -3809,8 +4997,8 @@ Уровни группировок - КонтекстноеМенюОбластиОбщееМенюУровниГруппировокРасширеннаяПодсказка - 987 + ГруппаУровниГруппировокКонтекстноеМенюРасширеннаяПодсказка + 1040 Label true true @@ -3835,7 +5023,7 @@ КонтекстноеМенюОбластиОбщееСвернутьРазвернутьРасширеннаяПодсказка - 521 + 1034 Label true true @@ -3847,13 +5035,13 @@ КонтекстноеМенюОбластиОбщееРедактирование - 998 + 1051 КонтекстноеМенюОбластиОбщееБуферОбмена - 1000 + 1053 КонтекстноеМенюОбластиОбщееКопироватьВБуферОбмена - 1002 + 1055 true true @@ -3861,7 +5049,7 @@ КонтекстноеМенюОбластиОбщееКопироватьВБуферОбменаРасширеннаяПодсказка - 1003 + 1056 Label true true @@ -3879,7 +5067,7 @@ КонтекстноеМенюОбластиОбщееВставитьИзБуфераОбмена - 1004 + 1057 true true @@ -3887,7 +5075,7 @@ КонтекстноеМенюОбластиОбщееВставитьИзБуфераОбменаРасширеннаяПодсказка - 1005 + 1058 Label true true @@ -3905,7 +5093,7 @@ КонтекстноеМенюОбластиОбщееВыделитьВсе - 1006 + 1059 true true @@ -3913,7 +5101,7 @@ КонтекстноеМенюОбластиОбщееВыделитьВсеРасширеннаяПодсказка - 1007 + 1060 Label true true @@ -3940,7 +5128,7 @@ КонтекстноеМенюОбластиОбщееБуферОбменаРасширеннаяПодсказка - 1001 + 1054 Label true true @@ -3952,10 +5140,10 @@ КонтекстноеМенюОбластиОбщееИзменитьОбласть - 1008 + 1061 КонтекстноеМенюОбластиОбщееОбъединить - 1010 + 1063 true true @@ -3963,7 +5151,7 @@ КонтекстноеМенюОбластиОбщееОбъединитьРасширеннаяПодсказка - 1011 + 1064 Label true true @@ -3981,7 +5169,7 @@ КонтекстноеМенюОбластиОбщееРаздвинуть - 1012 + 1065 true true @@ -3989,7 +5177,7 @@ КонтекстноеМенюОбластиОбщееРаздвинутьРасширеннаяПодсказка - 1013 + 1066 Label true true @@ -4007,7 +5195,7 @@ КонтекстноеМенюОбластиОбщееРазбитьЯчейку - 1014 + 1067 true true @@ -4015,7 +5203,7 @@ КонтекстноеМенюОбластиОбщееРазбитьЯчейкуРасширеннаяПодсказка - 1015 + 1068 Label true true @@ -4033,10 +5221,10 @@ КонтекстноеМенюОбластиОбщееУдалить - 1016 + 1069 КонтекстноеМенюОбластиОбщееУдалитьСтроки - 1018 + 1071 true true @@ -4044,7 +5232,7 @@ КонтекстноеМенюОбластиОбщееУдалитьСтрокиРасширеннаяПодсказка - 1019 + 1072 Label true true @@ -4062,7 +5250,7 @@ КонтекстноеМенюОбластиОбщееУдалитьКолонки - 1020 + 1073 true true @@ -4070,7 +5258,7 @@ КонтекстноеМенюОбластиОбщееУдалитьКолонкиРасширеннаяПодсказка - 1021 + 1074 Label true true @@ -4097,7 +5285,7 @@ КонтекстноеМенюОбластиОбщееУдалитьРасширеннаяПодсказка - 1017 + 1070 Label true true @@ -4113,10 +5301,10 @@ КонтекстноеМенюОбластиОбщееОчистить - 1022 + 1075 КонтекстноеМенюОбластиОбщееОчиститьСодержимое - 1024 + 1077 true true @@ -4124,7 +5312,7 @@ КонтекстноеМенюОбластиОбщееОчиститьСодержимоеРасширеннаяПодсказка - 1025 + 1078 Label true true @@ -4142,7 +5330,7 @@ КонтекстноеМенюОбластиОбщееОчиститьВсе - 1026 + 1079 true true @@ -4150,7 +5338,7 @@ КонтекстноеМенюОбластиОбщееОчиститьВсеРасширеннаяПодсказка - 1027 + 1080 Label true true @@ -4177,7 +5365,7 @@ КонтекстноеМенюОбластиОбщееОчиститьРасширеннаяПодсказка - 1023 + 1076 Label true true @@ -4202,7 +5390,7 @@ КонтекстноеМенюОбластиОбщееИзменитьОбластьРасширеннаяПодсказка - 1009 + 1062 Label true true @@ -4214,10 +5402,10 @@ КонтекстноеМенюОбластиОбщееПримечание - 1028 + 1081 КонтекстноеМенюОбластиОбщееВставитьПримечание - 1030 + 1083 true true @@ -4225,7 +5413,7 @@ КонтекстноеМенюОбластиОбщееВставитьПримечаниеРасширеннаяПодсказка - 1031 + 1084 Label true true @@ -4243,7 +5431,7 @@ КонтекстноеМенюОбластиОбщееУдалитьПримечание - 1032 + 1085 true true @@ -4251,7 +5439,7 @@ КонтекстноеМенюОбластиОбщееУдалитьПримечаниеРасширеннаяПодсказка - 1033 + 1086 Label true true @@ -4278,7 +5466,7 @@ КонтекстноеМенюОбластиОбщееПримечаниеРасширеннаяПодсказка - 1029 + 1082 Label true true @@ -4294,10 +5482,10 @@ КонтекстноеМенюОбластиОбщееПрочее - 1034 + 1087 КонтекстноеМенюОбластиОбщееСвойства - 1036 + 1089 true true @@ -4305,7 +5493,7 @@ КонтекстноеМенюОбластиОбщееСвойстваРасширеннаяПодсказка - 1037 + 1090 Label true true @@ -4332,7 +5520,7 @@ КонтекстноеМенюОбластиОбщееПрочееРасширеннаяПодсказка - 1035 + 1088 Label true true @@ -4353,7 +5541,7 @@ КонтекстноеМенюОбластиОбщееРедактированиеРасширеннаяПодсказка - 999 + 1052 Label true true @@ -4365,14 +5553,14 @@ КонтекстноеМенюОбластиОбщееСкомпоноватьРезультат - 168 + 1043 true true КонтекстноеМенюОбластиОбщееСкомпоноватьРезультатРасширеннаяПодсказка - 169 + 1044 Label true true @@ -4399,7 +5587,7 @@ КонтекстноеМенюОбластиОбщееРасширеннаяПодсказка - 997 + 1028 Label true true @@ -4782,6 +5970,37 @@ Период1 778 + + СдвинутьПериодНазад1 + 1012 + true + true + + true + + + СдвинутьПериодНазад1РасширеннаяПодсказка + 1013 + Label + true + true + + Left + + + UsualButton + Form.Command.СдвинутьПериодНазад1 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + WhenActive + Период1ДатаНачала 780 @@ -4920,17 +6139,80 @@ Normal + + ГруппаВыбратьПериод1 + 1020 + + ВыбратьПериод1 + 789 + true + true + + true + + + ВыбратьПериод1РасширеннаяПодсказка + 790 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыбратьПериод1 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + + true + true + + true + + + <key>ru</key> + <value>Выбрать период</value> + + + ГруппаВыбратьПериод1РасширеннаяПодсказка + 1021 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Center + Auto + true + true + Auto + Auto + + - ВыбратьПериод1 - 789 + СдвинутьПериодВперед1 + 1014 true true true - ВыбратьПериод1РасширеннаяПодсказка - 790 + СдвинутьПериодВперед1РасширеннаяПодсказка + 1015 Label true true @@ -4939,13 +6221,17 @@ UsualButton - Form.Command.ВыбратьПериод1 + Form.Command.СдвинутьПериодВперед1 Normal Auto true true UserCmds + + Style.ВажнаяНадписьШрифт + Auto + WhenActive true true @@ -4980,6 +6266,37 @@ Период2 793 + + СдвинутьПериодНазад2 + 1016 + true + true + + true + + + СдвинутьПериодНазад2РасширеннаяПодсказка + 1017 + Label + true + true + + Left + + + UsualButton + Form.Command.СдвинутьПериодНазад2 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + WhenActive + Период2ДатаНачала 795 @@ -5118,17 +6435,80 @@ Normal + + ГруппаВыбратьПериод2 + 1022 + + ВыбратьПериод2 + 804 + true + true + + true + + + ВыбратьПериод2РасширеннаяПодсказка + 805 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыбратьПериод2 + Normal + Auto + true + true + UserCmds + + Style.ВажнаяНадписьШрифт + + Auto + + true + true + + true + + + <key>ru</key> + <value>Выбрать период</value> + + + ГруппаВыбратьПериод2РасширеннаяПодсказка + 1023 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Center + Auto + true + true + Auto + Auto + + - ВыбратьПериод2 - 804 + СдвинутьПериодВперед2 + 1018 true true true - ВыбратьПериод2РасширеннаяПодсказка - 805 + СдвинутьПериодВперед2РасширеннаяПодсказка + 1019 Label true true @@ -5137,13 +6517,17 @@ UsualButton - Form.Command.ВыбратьПериод2 + Form.Command.СдвинутьПериодВперед2 Normal Auto true true UserCmds + + Style.ВажнаяНадписьШрифт + Auto + WhenActive true true @@ -5286,6 +6670,10 @@ -1 Left + + OnSaveDataInSettingsAtServer + ПриСохраненииДанныхВНастройкахНаСервере + ChoiceProcessing ОбработкаВыбора @@ -5317,57 +6705,6 @@ UseIfNecessary auto true - Show - - - СформироватьОтчет - - - - - ГруппаГлавноеЕще - - - - - ГруппаНастройкиОтчетаЕще - - - - - ГруппаРаботаВТаблицеЕще - - - - - ГруппаПрограммныйИнтерфейс - - - - - ГруппаВыводЕще - - - - - КомандыВидовПоказателейЕще - - - - - НовоеОкно - - - - - ИзменитьФорму - - - - - Справка - - Отчет 1 @@ -5843,11 +7180,8 @@ 42 - Number - - 25 - 5 - + String + true @@ -6010,6 +7344,23 @@ true + + ВыбранныйУровеньГруппировок + 15 + + Number + + 5 + true + + + + true + + + true + + ВсеНастройки @@ -6036,28 +7387,6 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>ИзменитьВариантОтчета</name> - <title> - <key>ru</key> - <value>Изменить вариант отчета...</value> - - 3 - - ru - Изменить вариант отчета - - - true - - - - ИзменитьВариантОтчета - - - DontUse - Auto - НастройкиПоУмолчанию @@ -6196,31 +7525,6 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> - <formCommands> - <name>ИзменитьУсловияОтборов</name> - <title> - <key>ru</key> - <value>Изменить условия отборов...</value> - - 11 - - ru - Изменить условия отборов - - - true - - - CommonPicture.ВидСравнения - - - - ИзменитьУсловияОтборов - - - DontUse - Auto - РассчитатьСумму @@ -6462,9 +7766,6 @@ <use> <common>true</common> </use> - <picture xsi:type="core:PictureRef"> - <picture>StdPicture.InputFieldSelect</picture> - </picture> <action xsi:type="form:FormCommandHandlerContainer"> <handler> <name>Подключаемый_ВыбратьПериод</name> @@ -6484,9 +7785,6 @@ <use> <common>true</common> </use> - <picture xsi:type="core:PictureRef"> - <picture>StdPicture.InputFieldSelect</picture> - </picture> <action xsi:type="form:FormCommandHandlerContainer"> <handler> <name>Подключаемый_ВыбратьПериод</name> @@ -7030,13 +8328,64 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ИзменитьСоставБыстрыхНастроек</name> + <title> + <key>ru</key> + <value>Изменить состав быстрых настроек</value> + + 48 + + ru + Изменить состав быстрых настроек + + + true + + + CommonPicture.Закрепить + + + + ИзменитьСоставБыстрыхНастроек + + + Picture + Auto + Auto + + + СохранитьВариант + + <key>ru</key> + <value>Сохранить</value> + + 11 + + ru + Сохранить (перезаписать) текущий вариант отчета + + + true + + + StdPicture.SaveFile + + + + СохранитьВариант + + + Auto + Auto + ПоказатьУровеньГруппировок <key>ru</key> <value>По умолчанию</value> - 48 + 49 true @@ -7048,6 +8397,119 @@ Auto Auto + + СдвинутьПериодНазад1 + + <key>ru</key> + <value><</value> + + 50 + + ru + Перейти назад + + + true + + + + Подключаемый_СдвинутьПериодНазад + + + Auto + Auto + + + СдвинутьПериодВперед1 + + <key>ru</key> + <value>></value> + + 51 + + ru + Перейти вперед + + + true + + + + Подключаемый_СдвинутьПериодВперед + + + Auto + Auto + + + СдвинутьПериодНазад2 + + <key>ru</key> + <value><</value> + + 52 + + ru + Перейти назад + + + true + + + + Подключаемый_СдвинутьПериодНазад + + + Auto + Auto + + + СдвинутьПериодВперед2 + + <key>ru</key> + <value>></value> + + 53 + + ru + Перейти вперед + + + true + + + + Подключаемый_СдвинутьПериодВперед + + + Auto + Auto + + + СгруппироватьПоВыбранномуПолю + + <key>ru</key> + <value>Сгруппировать по полю</value> + + 54 + + ru + Сгруппировать по выбранному полю + + + true + + + CommonPicture.Группировка + + + + СгруппироватьПоВыбранномуПолю + + + Auto + Auto + Ссылка diff --git a/SSL/src/CommonForms/ФормаОтчета/Help/ru.html b/SSL/src/CommonForms/ФормаОтчета/Help/ru.html index 2825a893e..0de20f912 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Help/ru.html +++ b/SSL/src/CommonForms/ФормаОтчета/Help/ru.html @@ -1,15 +1,30 @@

      Для просмотра отчета необходимо нажать кнопку Сформировать, предварительно задав параметры (если они предусмотрены). В клиент-серверном варианте работы программы предусмотрено формирование отчетов в фоновом режиме.

      Режим формирования

      -
      • Установите флажок Формировать сразу меню Еще, для того чтобы отчет формировался автоматически сразу после открытия, без нажатия кнопки Сформировать. 

      Варианты отчета

      +
      • Установите флажок Формировать сразу меню Еще, для того чтобы отчет формировался автоматически сразу после открытия, без нажатия кнопки Сформировать. 

      Панель быстрых (избранных) настроек

      +
      +
      • Размещается в шапке отчета, в панель выводятся наиболее важные настройки, некоторые из которых могут быть обязательными для заполнения.
      • +
      • С помощью кнопки  можно открыть быстрые настройки и изменить их состав с помощью флажков.
      • +
      • С помощью ссылки Больше возможностей можно открыть Настройки отчета (расширенный режим).
      +
      +

      Фильтр по значению

      +
      +
      • Для быстрой установки фильтра можно использовать универсальную строку поиска. С помощью знаков операций можно построить выражение для поиска. Подробнее см. подсказку "?". 
      • +
      • Если выделить несколько ячеек, можно воспользоваться расчетом показателей, в этом случае в данной строке появляется результат.

      Расчетные показатели

      +
      +
      • С помощью кнопки  можно открыть выпадающее меню расчетных показателей для выделенных ячеек (выбранный показатель отображается на кнопке): количество, среднее арифметическое выделенных ячеек, минимум и максимум, значение выводится в универсальной строке поиска.
      • +
      • Если включить Все показатели, то в нижней части варианта отчета показывается строка, в которой выводятся показатели.
      • +
      • При вычислении показателей выполняется преобразование текстовых строк в выбранных ячейках в числа. Преобразование происходит в соответствии с региональными настройками. При этом если форматирование числовых полей было перенастроено так, что представление числа перестает им соответствовать, то показатели не вычисляются.
      +

      Варианты отчета

      • В программе может быть предусмотрено несколько вариантов отчетов, выполняющих схожий анализ. Для их просмотра предусмотрена кнопка  Варианты отчета.
        • Выберите из выпадающего списка нужный вариант отчета. Текущий вариант отчета отмечен флажком.
        • для просмотра списка других вариантов отчетов предназначена команда Другие отчеты. В окне размещен список похожих по смыслу отчетов.
          • В списке выводятся наименования и описания отчетов. Список отчетов сгруппирован. Предусмотрены группы, в которых выводятся схожие по смыслу другие отчеты того же раздела программы. 
          • Для перехода к другому варианту отчета нажмите на заголовок левой кнопкой мыши.
          • С помощью соответствующего флажка можно Закрывать окно после перехода к отчету.

      Сохранение варианта отчета

      -
      • Нажмите  Варианты отчета - Сохранить вариант отчета, укажите Наименование и другие параметры.
      • -
      • Также можно воспользоваться командой Сохранить вариант отчета меню Еще - Варианты отчета.

      Сохранение варианта отчета в файл

      +
      • Нажмите  Варианты отчета - Сохранить как, укажите Наименование и другие параметры.
      • +
      • Также можно воспользоваться командой Сохранить вариант отчета меню Еще - Варианты отчета.
      • +
      • Для сохранения пользовательских отчетов предусмотрен быстрый вариант - Сохранить.

      Сохранение варианта отчета в файл

      • Нажмите Еще - Варианты отчета - Сохранить в файл для сохранения варианта отчета вместе с пользовательскими настройками в архивный файл на компьютере. Укажите путь к архивному файлу на компьютере. Вместе с вариантом отчета по умолчанию сохраняются и пользовательские настройки. Можно отменить сохранение всех или некоторых настроек с помощью флажков.
      • Эта возможность предназначена для обмена настройками вариантов отчетов между информационными базами идентичной структуры.
      @@ -19,12 +34,13 @@
    • Данная возможность предназначена для обмена настройками вариантов отчетов между информационными базами идентичной структуры.
    • Настройки отчета из контекстного меню

      • С помощью команд контекстного меню ячейки по правой кнопке мыши можно быстро изменить вид отчета, настроить фильтры, сортировки:  -
        • Открыть значение выделенной ячейки; 
        • +
          • изменить уровни группировок отчета;
          • +
          • Открыть значение выделенной ячейки; 
          • С помощью команды Фильтровать можно быстро установить отбор по текущему значению, используя предлагаемые команды сравнения. 
            • С помощью команды Еще можно получить дополнительные возможности по настройке фильтра. 
            • С помощью команды Больше возможностей можно перейти к расширенным настройкам отборов отчета.
          • Сортировать - по возрастанию или убыванию; 
          • Оформить - быстро изменить цвет выделенных ячеек, высоту и ширину колонки;
          • -
            • По команде Еще можно перейти к более сложному форматированию для выбранных ячеек.
          • Расшифровать - переход к выбору полей для расшифровки и формированию отчета.
          +
          • По команде Еще можно перейти к более сложному форматированию для выбранных ячеек.
        • Расшифровать - переход к выбору полей для расшифровки и формированию отчета.
      • Контекстное меню шапки отчета содержит полезные команды:
        • с помощью меню по левой кнопке мыши можно настроить сортировку в выбранном поле, задать фильтры по значению, выбрав из списка.
          • По команде Еще можно перейти к настройке поля, вставить в шапку дополнительные поля, выбрав их из списка, оформить поле, скрыть или переименовать.
        • С помощью меню по правой кнопке мыши можно оформить поля, настроить отборы и сортировки. 
        • @@ -32,14 +48,12 @@

          Настройки

          • По кнопке Настройки можно перейти к настройке параметров отчета. Часть настроек (отборы) иногда выведены в шапку отчета.
          • -
          • Нажмите Еще - Прочее - Стандартные настройки, для того чтобы вернуться к настройкам по умолчанию. +
          • Нажмите Еще - Стандартные настройки, для того чтобы вернуться к настройкам по умолчанию.
          • -
          • Нажмите Еще - Прочее - Сохранить настройки, для того чтобы записать текущие настройки отчета. +
          • Нажмите Еще - Персональные настройки - Сохранить настройки, для того чтобы записать текущие настройки отчета.
          • -
          • Нажмите Еще - Прочее - Выбрать настройки, для того чтобы воспользоваться ранее сохраненными настройками отчета. В списке можно посмотреть также настройки отчета, переданные другими пользователями.
          • -
          • Нажмите Еще - Прочее - Поделиться настройками, для того чтобы передать текущие настройки отчета другим пользователям. Настройки передаются и без предварительного сохранения. В открывшемся списке выберите пользователей или группы пользователей, нажмите Поделиться. Если все в порядке, через некоторое время программа выводит сообщение об успешной передаче настроек.

          Изменение условий отборов

          -
          • -
            С помощью соответствующей команды меню Еще можно просмотреть и при необходимости Изменить условия отборов по каждому полю.

          +
        • Нажмите Еще - Персональные настройки - Выбрать настройки, для того чтобы воспользоваться ранее сохраненными настройками отчета. В списке можно посмотреть также настройки отчета, переданные другими пользователями.
        • +
        • Нажмите Еще - Персональные настройки - Поделиться настройками, для того чтобы передать текущие настройки отчета другим пользователям. Настройки передаются и без предварительного сохранения. В открывшемся списке выберите пользователей или группы пользователей, нажмите Поделиться. Если все в порядке, через некоторое время программа выводит сообщение об успешной передаче настроек.

        Печать отчета

        • Сформированный отчет можно распечатать, нажав кнопку  Печать.
        • @@ -64,15 +78,12 @@
        • Включить в существующую рассылку отчетов. Для этого из списка рассылок выберите нужную.

        Выбор варианта отчета

        -
        • Для загрузки ранее сохраненного варианта отчета воспользуйтесь командой Еще - Прочее - Выбрать вариант отчета. -

        Изменение варианта отчета

        -
        • -
          Нажмите Еще - Прочее - Изменить вариант отчета. Можно добавить поля, изменить параметры и настройки отчета.
          -
        • -
        • Внесенные изменения можно сохранить в другой вариант отчета.

        Сброс настроек

        -
        • Нажмите Еще - Прочее - Стандартные настройки, для того чтобы сбросить пользовательские настройки.

        Другие доступные действия

        +
        • Для загрузки ранее сохраненного варианта отчета воспользуйтесь командой Еще - Варианты отчета - Выбрать вариант отчета. +

        Сброс настроек

        +
        • Нажмите Еще - Стандартные настройки, для того чтобы сбросить пользовательские настройки.

        Другие доступные действия

        • Для поиска в отчете воспользуйтесь командой Найти.
        • С помощью кнопок  Свернуть все группы или  Развернуть все группы можно скрыть или показать группировку отчета.
        • -
        • Для сохранения результата отчета в файл нажмите , укажите наименование файла и путь для сохранения.
        \ No newline at end of file +
      • С помощью кнопки Разворачивать до можно выбрать уровень группировки отчета.
      • +
      • Для сохранения результата отчета в файл нажмите Ctrl+S, укажите наименование файла и путь для сохранения.
      \ No newline at end of file diff --git a/SSL/src/CommonForms/ФормаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаОтчета/Module.bsl index b358a3104..ee46228c5 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаОтчета/Module.bsl @@ -30,7 +30,6 @@ ОпределитьПоведениеВМобильномКлиенте(); - // Определение ключевых параметров отчета. РежимРасшифровки = (Параметры.Свойство("Расшифровка") И Параметры.Расшифровка <> Неопределено) Или Параметры.Свойство("ПредставлениеВарианта") И Параметры.ПредставлениеВарианта = "Расшифровка"; @@ -80,6 +79,7 @@ Элементы.ГруппаПоказатель.Видимость = Ложь; Элементы.ОбластьПоказателей.Видимость = Ложь; Элементы.КомандыВидовПоказателейЕще.Видимость = Ложь; + Элементы.КоманднаяПанельЕще.РастягиватьПоГоризонтали = Неопределено; КонецЕсли; УстановитьРазрешенияПользователя(); @@ -111,6 +111,7 @@ Если ДоступнаОтправкаПисем Тогда Если НастройкиОтчета.РазрешеноИзменятьВарианты И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") + И ВариантыОтчетов.ОтчетПодключенКХранилищу(РеквизитФормыВЗначение("Отчет").Метаданные()) И Не НастройкиОтчета.СкрытьКомандыРассылки Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); @@ -151,9 +152,7 @@ КонецЕсли; Элементы.ПраваПользователей.Видимость = Пользователи.ЭтоПолноправныйПользователь() - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") - И (ТипЗнч(НастройкиОтчета.ОтчетСсылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") - Или ТипЗнч(НастройкиОтчета.ОтчетСсылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений")); + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом"); КонецПроцедуры @@ -175,7 +174,7 @@ КонецЕсли; ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей); - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент", ОсновнойПоказатель); + РассчитатьПоказатели(ОсновнойПоказатель); ПодключитьОбработчикОжидания("ОпределитьПоведениеНаНачальнойСтранице", 0.1, Истина); КонецПроцедуры @@ -383,6 +382,8 @@ ПараметрыОбновления = Новый Структура("ИмяСобытия", "ПриОбновленииСоставаПользовательскихНастроекНаСервере"); ОбновитьЭлементыФормыНастроекНаСервере(ПараметрыОбновления); + + ВосстановитьВыбранныйУровеньГруппировок(); КонецПроцедуры &НаСервере @@ -427,6 +428,13 @@ КонецЦикла; КонецПроцедуры +&НаСервере +Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки) + + СохранитьВыбранныйУровеньГруппировок(); + +КонецПроцедуры + &НаСервере Процедура ПриСохраненииВариантаНаСервере(НастройкиКД) Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда @@ -455,7 +463,125 @@ #Область ОбработчикиСобытийЭлементовШапкиФормы //////////////////////////////////////////////////////////////////////////////// -// Табличный документ +// Подключаемые + +&НаКлиенте +Процедура Подключаемый_ЭлементНастройки_ПриИзменении(Элемент) + КомпоновщикНастроек = Отчет.КомпоновщикНастроек; + + Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя]; + Если Индекс = Неопределено Тогда + Индекс = ОтчетыКлиентСервер.ИндексЭлементаНастройкиПоПути(Элемент.Имя); + КонецЕсли; + + ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; + + ЭтоФлажок = СтрНачинаетсяС(Элемент.Имя, "Флажок") Или СтрЗаканчиваетсяНа(Элемент.Имя, "Флажок"); + Если ЭтоФлажок Тогда + ЭлементНастройки.Значение = ЭтотОбъект[Элемент.Имя]; + КонецЕсли; + + Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") + И НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда + + КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); + + ПараметрыОбновления = Новый Структура; + ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроек); + ПараметрыОбновления.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); + + ОбновитьЭлементыФормыНастроек(ПараметрыОбновления); + КонецЕсли; + + ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ЭлементНастройки_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + ПоказатьСписокВыбора(Элемент, СтандартнаяОбработка) +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_Период_ПриИзменении(Элемент) + ОтчетыКлиент.УстановитьПериод(ЭтотОбъект, Элемент.Имя); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ВыбратьПериод(Команда) + ОтчетыКлиент.ВыбратьПериод(ЭтотОбъект, Команда.Имя); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СдвинутьПериодНазад(Команда) + ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СдвинутьПериодВперед(Команда) + ОтчетыКлиент.СдвинутьПериод(ЭтотОбъект, Команда.Имя); +КонецПроцедуры + +#Область ОбработчикиСобытийЭлементовУниверсальнойСтрокиПоиска + +&НаКлиенте +Процедура ПоказательРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если Элементы.ВсеНастройки.Видимость Тогда + ПерейтиКНастройкам(НастройкиОтчета.РазрешеноИзменятьВарианты); + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Расширенные возможности настройки фильтров недоступны'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказательПриИзменении(Элемент) + + ПереходКНастройкамВыполнен(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказательОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ТипЗнч(ВыбранноеЗначение) <> Тип("Массив") Тогда + + СброситьУниверсальныйПоиск(); + Возврат; + + КонецЕсли; + + СтандартнаяОбработка = Ложь; + + ПрименитьЗначениеУниверсальногоПоиска(ВыбранноеЗначение); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказательАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + Запрос = СокрЛП(Текст); + + Если ПереходКНастройкамВыполнен(Запрос) Тогда + Возврат; + КонецЕсли; + + ПодходящиеЗначения = ПодходящиеЗначенияУниверсальногоПоиска(Запрос); + + Если ПодходящиеЗначения.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ДанныеВыбора = ПодходящиеЗначения; + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийДокументаОтчетТабличныйДокумент &НаКлиенте Процедура ОтчетТабличныйДокументВыбор(Элемент, Область, СтандартнаяОбработка) @@ -543,59 +669,12 @@ #Иначе ПодготовитьКомандыКонтекстнойНастройки(); #КонецЕсли - + ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Подключаемые - -&НаКлиенте -Процедура Подключаемый_ЭлементНастройки_ПриИзменении(Элемент) - КомпоновщикНастроек = Отчет.КомпоновщикНастроек; - - Индекс = ПутьКДаннымЭлементов.ПоИмени[Элемент.Имя]; - Если Индекс = Неопределено Тогда - Индекс = ОтчетыКлиентСервер.ИндексЭлементаНастройкиПоПути(Элемент.Имя); - КонецЕсли; - - ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; - - ЭтоФлажок = СтрНачинаетсяС(Элемент.Имя, "Флажок") Или СтрЗаканчиваетсяНа(Элемент.Имя, "Флажок"); - Если ЭтоФлажок Тогда - ЭлементНастройки.Значение = ЭтотОбъект[Элемент.Имя]; - КонецЕсли; - - Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") - И НастройкиОтчета.ЗагрузитьНастройкиПриИзмененииПараметров.Найти(ЭлементНастройки.Параметр) <> Неопределено Тогда - - КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); - - ПараметрыОбновления = Новый Структура; - ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроек); - ПараметрыОбновления.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); - - ОбновитьЭлементыФормыНастроек(ПараметрыОбновления); - КонецЕсли; - - ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(ЭтотОбъект); -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_ЭлементНастройки_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ПоказатьСписокВыбора(Элемент, СтандартнаяОбработка) -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_Период_ПриИзменении(Элемент) - ОтчетыКлиент.УстановитьПериод(ЭтотОбъект, Элемент.Имя); -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_ВыбратьПериод(Команда) - ОтчетыКлиент.ВыбратьПериод(ЭтотОбъект, Команда.Имя); -КонецПроцедуры +#КонецОбласти #КонецОбласти @@ -603,65 +682,23 @@ &НаКлиенте Процедура ВсеНастройки(Команда) - Имя = НастройкиОтчета.ПолноеИмя + ".ФормаНастроек"; - ПараметрыФормы = Новый Структура; - ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина); - ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта)); - ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки); - ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); - ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); - ПараметрыФормы.Вставить("ВариантНаименование", Строка(ОтчетНаименованиеТекущегоВарианта)); + ПерейтиКНастройкам(); - Режим = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; - - Обработчик = Новый ОписаниеОповещения("ВсеНастройкиЗавершение", ЭтотОбъект); - - ВыполнятьЗамеры = НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров); - Если ВыполнятьЗамеры Тогда - МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); - ИдентификаторЗамера = МодульОценкаПроизводительностиКлиент.ЗамерВремени( - НастройкиОтчета.КлючЗамеров + ".Настройки", - Ложь, Ложь); - МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ИдентификаторЗамера, НастройкиОтчета.ПрефиксЗамеров); - КонецЕсли; - - ОткрытьФорму(Имя, ПараметрыФормы, ЭтотОбъект, , , , Обработчик, Режим); - - Если ВыполнятьЗамеры Тогда - МодульОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(ИдентификаторЗамера); - КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВсеНастройкиЗавершение(Результат, ПараметрыВыполнения) Экспорт - Если Результат = Неопределено Тогда + Если ТипЗнч(Результат) <> Тип("Структура") Тогда Возврат; КонецЕсли; НастройкиОтчета.Вставить("РезультатНастройки", Результат); - - Если ТипЗнч(Результат) = Тип("Структура") Тогда - НастройкиОтчета.Вставить("ОтчетСформирован", Результат.Переформировать); - КонецЕсли; + НастройкиОтчета.Вставить("ОтчетСформирован", Результат.Переформировать); ПодключитьОбработчикОжидания("ОбновитьЭлементыФормыНастроекОтложенно", 0.1, Истина); КонецПроцедуры -&НаКлиенте -Процедура ИзменитьВариантОтчета(Команда) - ПараметрыФормы = Новый Структура; - ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина); - ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); - ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки); - ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта)); - ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); - ПараметрыФормы.Вставить("ПредставлениеВарианта", Строка(ОтчетНаименованиеТекущегоВарианта)); - ПараметрыФормы.Вставить("ПредставлениеПользовательскихНастроек", ""); - - ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаВарианта", ПараметрыФормы, ЭтотОбъект); -КонецПроцедуры - &НаКлиенте Процедура НастройкиПоУмолчанию(Команда) ПараметрыЗаполнения = Новый Структура; @@ -678,6 +715,18 @@ ОбновитьЭлементыФормыНастроек(ПараметрыЗаполнения); КонецПроцедуры +&НаКлиенте +Процедура СохранитьВариант(Команда) + + Если Не ВариантМодифицирован Тогда + Возврат; + КонецЕсли; + + СохранитьТекущийВариантОтчета(); + ПоказатьОповещениеПользователя(НСтр("ru = 'Вариант отчета сохранен'"),, Заголовок); + +КонецПроцедуры + &НаКлиенте Процедура ОтправитьПоПочте(Команда) ОтображениеСостояния = Элементы.ОтчетТабличныйДокумент.ОтображениеСостояния; @@ -726,6 +775,24 @@ ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ПанельДругихОтчетов", ПараметрыФормы, ЭтотОбъект, Истина, , , , Блокировать); КонецПроцедуры +&НаКлиенте +Процедура ИзменитьСоставБыстрыхНастроек(Команда) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); + ПараметрыФормы.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек); + ПараметрыФормы.Вставить("КлючТекущегоВарианта", КлючТекущегоВарианта); + + Обработчик = Новый ОписаниеОповещения("ПослеИзмененияСоставаБыстрыхНастроек", ЭтотОбъект); + + ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.БыстрыеНастройкиОтчета", + ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор,,, Обработчик); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики команд модификации СКД. + &НаКлиенте Процедура ЗагрузитьСхему(Команда) @@ -780,16 +847,9 @@ &НаКлиенте Процедура СохранитьВариантОтчетаВФайл(Команда) - ПараметрыСохранения = Новый Структура(ВариантыОтчетовКлиентСервер.СвойстваСохраненияВариантаОтчета()); - ЗаполнитьЗначенияСвойств(ПараметрыСохранения, ЭтотОбъект); - - ПараметрыСохранения.ВариантОтчета = НастройкиОтчета.ВариантСсылка; - ПараметрыСохранения.ИмяОтчета = НастройкиОтчета.ПолноеИмя; - ПараметрыСохранения.НастройкиВариантаОтчета = Отчет.КомпоновщикНастроек.Настройки; - ОткрытьФорму( "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.СохранениеВариантаОтчетаВФайл", - ПараметрыСохранения, + ВариантыОтчетовСлужебныйКлиент.ПараметрыСохраненияВариантаОтчетаВФайл(ЭтотОбъект), ЭтотОбъект); КонецПроцедуры @@ -826,6 +886,13 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики команд контекстного меню табличного документа - результат отчета. +&НаКлиенте +Процедура СгруппироватьПоВыбранномуПолю(Команда) + + ВариантыОтчетовСлужебныйКлиент.СгруппироватьПоВыбранномуПолю(ЭтотОбъект, Команда); + +КонецПроцедуры + &НаКлиенте Процедура ВставитьПолеСправа(Команда) @@ -952,35 +1019,43 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики команд расчета показателей. +&НаКлиенте +Процедура ВыбратьПоказательНажатие(Элемент) + + Меню = МенюВидовПоказателей(Элементы.КомандыВидовПоказателей); + ПоказатьВыборИзМеню(Новый ОписаниеОповещения("ПослеВыбораПоказателя", ЭтотОбъект), Меню, Элемент); + +КонецПроцедуры + &НаКлиенте Процедура РассчитатьСумму(Команда) - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент", Команда.Имя); + РассчитатьПоказатели(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура РассчитатьКоличество(Команда) - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент", Команда.Имя); + РассчитатьПоказатели(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура РассчитатьСреднее(Команда) - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент", Команда.Имя); + РассчитатьПоказатели(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура РассчитатьМинимум(Команда) - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент", Команда.Имя); + РассчитатьПоказатели(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура РассчитатьМаксимум(Команда) - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент", Команда.Имя); + РассчитатьПоказатели(Команда.Имя); КонецПроцедуры &НаКлиенте Процедура РассчитатьВсеПоказатели(Команда) - ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей( - Элементы, Не Элементы.РассчитатьВсеПоказатели.Пометка); + РазвернутьОбластьПоказателей = Не Элементы.РассчитатьВсеПоказатели.Пометка; + ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей); КонецПроцедуры &НаКлиенте @@ -1034,7 +1109,7 @@ &НаКлиенте Процедура Подключаемый_ПоказатьУровеньГруппировок(Команда) - УровеньГруппировкиСтрокой = СтрЗаменить(Команда.Имя, Элементы.КонтекстноеМенюОбластиОбщееПоказатьУровеньГруппировок.Имя, ""); + УровеньГруппировкиСтрокой = СтрЗаменить(Команда.Имя, Элементы.ПоказатьУровеньГруппировок.Имя, ""); ОписаниеЧисла = Новый ОписаниеТипов("Число"); УровеньГруппировки = ОписаниеЧисла.ПривестиЗначение(УровеньГруппировкиСтрокой); @@ -1043,32 +1118,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ИзменитьУсловияОтборов(Команда) - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ТипФормыВладельца", ТипФормыОтчета); - ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); - ПараметрыФормы.Вставить("КомпоновщикНастроек", Отчет.КомпоновщикНастроек); - Обработчик = Новый ОписаниеОповещения("ИзменитьУсловияОтборовЗавершение", ЭтотОбъект); - ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.УсловияОтборовОтчета", ПараметрыФормы, ЭтотОбъект, Истина,,, Обработчик); -КонецПроцедуры - -&НаКлиенте -Процедура ИзменитьУсловияОтборовЗавершение(УсловияОтборов, Контекст) Экспорт - Если УсловияОтборов = Неопределено - Или УсловияОтборов = КодВозвратаДиалога.Отмена - Или УсловияОтборов.Количество() = 0 Тогда - Возврат; - КонецЕсли; - ПараметрыЗаполнения = Новый Структура; - ПараметрыЗаполнения.Вставить("ИмяСобытия", "ИзменитьУсловияОтборов"); - ПараметрыЗаполнения.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек); - ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); - ПараметрыЗаполнения.Вставить("УсловияОтборов", УсловияОтборов); - - ОбновитьЭлементыФормыНастроек(ПараметрыЗаполнения); -КонецПроцедуры - #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1214,8 +1263,6 @@ ЗагрузитьРезультатФормированияОтчета(); КонецЕсли; - ФоновоеЗаданиеИдентификатор = Неопределено; - НастройкиОтчета.СвойстваРезультата.ВремяФормирования = (ТекущаяУниверсальнаяДатаВМиллисекундах() - ПараметрыФормирования.ВремяНачалаФормирования) / 1000; @@ -1363,6 +1410,7 @@ УдалитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища); ФоновоеЗаданиеАдресХранилища = Неопределено; + ФоновоеЗаданиеИдентификатор = Неопределено; Если Результат = Неопределено Тогда ПоказатьОшибкиФормирования(НСтр("ru = 'Не удалось сформировать отчет (пустой результат)'")); @@ -1629,16 +1677,960 @@ ВариантыОтчетовСлужебныйКлиент.ПриАктивизацииРезультатаОтчета(ЭтотОбъект, Элементы.ОтчетТабличныйДокумент); КонецПроцедуры +#Область РасчетПоказателей + +// Параметры: +// Родитель - ГруппаФормы +// Меню - Неопределено +// - СписокЗначений +// +// Возвращаемое значение: +// - Неопределено +// - СписокЗначений +// +&НаКлиенте +Функция МенюВидовПоказателей(Родитель, Меню = Неопределено) + + Если Меню = Неопределено Тогда + Меню = Новый СписокЗначений; + КонецЕсли; + + ЭлементыМеню = Родитель.ПодчиненныеЭлементы; // ЭлементыФормы + + Для Каждого Элемент Из ЭлементыМеню Цикл + + Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда + МенюВидовПоказателей(Элемент, Меню); + Иначе + Меню.Добавить(Элемент.Имя, Элемент.Заголовок, ОсновнойПоказатель = Элемент.Имя); + КонецЕсли; + + КонецЦикла; + + ЭлементМеню = Меню.НайтиПоЗначению(Элементы.РассчитатьВсеПоказатели.Имя); + + Если ЭлементМеню <> Неопределено Тогда + ЭлементМеню.Пометка = РазвернутьОбластьПоказателей; + КонецЕсли; + + Возврат Меню; + +КонецФункции + +&НаКлиенте +Процедура ПослеВыбораПоказателя(ВыбранныйПоказатель, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(ВыбранныйПоказатель) <> Тип("ЭлементСпискаЗначений") Тогда + Возврат; + КонецЕсли; + + Если ВыбранныйПоказатель.Значение = Элементы.РассчитатьВсеПоказатели.Имя Тогда + + РазвернутьОбластьПоказателей = Не Элементы.РассчитатьВсеПоказатели.Пометка; + ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей); + + Иначе + РассчитатьПоказатели(ВыбранныйПоказатель.Значение); + КонецЕсли; + +КонецПроцедуры + // Выполняет расчет и вывод показателей выделенной области ячеек. // См. обработчик события ОтчетТабличныйДокументПриАктивизацииОбласти. // &НаКлиенте Процедура РассчитатьПоказателиДинамически() - Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиОтчета, "ВыводитьСуммуВыделенныхЯчеек", Истина) Тогда - ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент"); - КонецЕсли; + + РассчитатьПоказатели(); + КонецПроцедуры +&НаКлиенте +Процедура РассчитатьПоказатели(ТекущаяКоманда = "") + + Если Не ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиОтчета, "ВыводитьСуммуВыделенныхЯчеек", Истина) Тогда + Возврат; + КонецЕсли; + + Показатель = ""; + ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ОтчетТабличныйДокумент", ТекущаяКоманда, 2); + +КонецПроцедуры + +#КонецОбласти + +#Область УниверсальныйПоиск + +&НаКлиенте +Процедура ПерейтиКНастройкам(РасширенныйРежим = Неопределено) + + ВыполнятьЗамеры = НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров); + Если ВыполнятьЗамеры Тогда + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + ИдентификаторЗамера = МодульОценкаПроизводительностиКлиент.ЗамерВремени( + НастройкиОтчета.КлючЗамеров + ".Настройки", + Ложь, Ложь); + МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ИдентификаторЗамера, НастройкиОтчета.ПрефиксЗамеров); + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ФормаПараметры, Истина); + + Если РасширенныйРежим = Истина Тогда + + НастройкиОтчета.Вставить("ФормаНастроекРасширенныйРежим", 1); + + ПараметрыФормы.Вставить("ИмяСтраницы", "СтраницаОтборы"); + ПараметрыФормы.Вставить("СброситьПользовательскиеНастройки", Истина); + + КонецЕсли; + + ПараметрыФормы.Вставить("КлючВарианта", Строка(КлючТекущегоВарианта)); + ПараметрыФормы.Вставить("Вариант", Отчет.КомпоновщикНастроек.Настройки); + ПараметрыФормы.Вставить("ПользовательскиеНастройки", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); + ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); + ПараметрыФормы.Вставить("ВариантНаименование", Строка(ОтчетНаименованиеТекущегоВарианта)); + + Обработчик = Новый ОписаниеОповещения("ВсеНастройкиЗавершение", ЭтотОбъект); + + ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".ФормаНастроек", ПараметрыФормы, ЭтотОбъект,,,, Обработчик); + + Если ВыполнятьЗамеры Тогда + МодульОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(ИдентификаторЗамера); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПереходКНастройкамВыполнен(Запрос = Неопределено) + + ЗапросНормализованный = ВРег(?(ЗначениеЗаполнено(Запрос), Запрос, Показатель)); + + Если ЗапросНормализованный = "СКД" Тогда + + СброситьУниверсальныйПоиск(); + ПерейтиКНастройкам(НастройкиОтчета.РазрешеноИзменятьВарианты); + + Возврат Истина; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаКлиенте +Процедура СброситьУниверсальныйПоиск() + + Показатель = ""; + Элементы.Показатель.ОбновитьТекстРедактирования(); + +КонецПроцедуры + +&НаКлиенте +Функция ПодходящиеЗначенияУниверсальногоПоиска(Запрос) + + ПодходящиеЗначения = Новый СписокЗначений; + + ПараметрыПоиска = ПараметрыУниверсальногоПоиска(Запрос); + + Если Не ЗначениеЗаполнено(ПараметрыПоиска.СтрокаПоиска) Тогда + Возврат ПодходящиеЗначения; + КонецЕсли; + + ОформитьПолеУниверсальногоПоиска(ПараметрыПоиска.УправляющиеСимволы); + + ИспользуемыеПоляПоискаПоТипам = НастройкиОтчета.ИспользуемыеПоляУниверсальногоПоискаПоТипам; + + Если ИспользуемыеПоляПоискаПоТипам.Количество() = 0 Тогда + Возврат ПодходящиеЗначения; + КонецЕсли; + + Если ПараметрыУниверсальногоПоискаПрименимыКСсылкам(ПараметрыПоиска) Тогда + НайтиПодходящиеЗначенияУниверсальногоПоиска(ПодходящиеЗначения, ИспользуемыеПоляПоискаПоТипам, ПараметрыПоиска); + КонецЕсли; + + НайтиПодходящиеЗначенияУниверсальногоПоискаЧисла(ПодходящиеЗначения, ПараметрыПоиска); + + Если ПодходящиеЗначения.Количество() = 0 + И СтрДлина(ПараметрыПоиска.СтрокаПоиска) > 2 Тогда + + Представление = Новый ФорматированнаяСтрока(НСтр("ru = 'Совпадений не найдено'"),, WebЦвета.НейтральноСерый); + ПодходящиеЗначения.Добавить("", Представление); + + КонецЕсли; + + Возврат ПодходящиеЗначения; + +КонецФункции + +&НаКлиенте +Функция ПараметрыУниверсальногоПоиска(Запрос) + + ПараметрыПоиска = Новый Структура; + ПараметрыПоиска.Вставить("СтрокаПоиска", Запрос); + ПараметрыПоиска.Вставить("УправляющиеСимволы", ""); + + ПервыйСимвол = Лев(Запрос, 1); + ПервыеДваСимвола = Лев(Запрос, 2); + + Если ПервыеДваСимвола = ">=" Или ПервыеДваСимвола = "<=" Или ПервыеДваСимвола = "<>" Тогда + + ПараметрыПоиска.СтрокаПоиска = Сред(Запрос, 3); + ПараметрыПоиска.УправляющиеСимволы = ПервыеДваСимвола; + + ИначеЕсли ПервыйСимвол = "-" Или ПервыйСимвол = ">" Или ПервыйСимвол = "<" Или ПервыйСимвол = "=" Тогда + + ПараметрыПоиска.СтрокаПоиска = Сред(Запрос, 2); + ПараметрыПоиска.УправляющиеСимволы = ПервыйСимвол; + + КонецЕсли; + + Возврат ПараметрыПоиска; + +КонецФункции + +&НаКлиенте +Процедура ОформитьПолеУниверсальногоПоиска(УправляющиеСимволы) + + ПолеЗапроса = Элементы.Показатель; + + Если УправляющиеСимволы = "-" Тогда + + ПолеЗапроса.ЦветТекста = WebЦвета.Красный; + + ИначеЕсли Не ПустаяСтрока(УправляющиеСимволы) Тогда + + ПолеЗапроса.ЦветТекста = WebЦвета.Зеленый; + + Иначе + + ПолеЗапроса.ЦветТекста = Новый Цвет; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПараметрыУниверсальногоПоискаПрименимыКСсылкам(ПараметрыПоиска) + + НедопустимыеУправляющиеСимволы = Новый Массив; + НедопустимыеУправляющиеСимволы.Добавить(">"); + НедопустимыеУправляющиеСимволы.Добавить(">="); + НедопустимыеУправляющиеСимволы.Добавить("<"); + НедопустимыеУправляющиеСимволы.Добавить("<="); + + Если НедопустимыеУправляющиеСимволы.Найти(ПараметрыПоиска.УправляющиеСимволы) <> Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Возврат СтрДлина(ПараметрыПоиска.СтрокаПоиска) > 2 + Или ОбщегоНазначенияКлиентСервер.ЭтоЧисло(ПараметрыПоиска.СтрокаПоиска); + +КонецФункции + +&НаКлиенте +Процедура НайтиПодходящиеЗначенияУниверсальногоПоискаЧисла(ПодходящиеЗначения, ПараметрыПоиска) + + Если Не ОбщегоНазначенияКлиентСервер.ЭтоЧисло(ПараметрыПоиска.СтрокаПоиска) Тогда + Возврат; + КонецЕсли; + + ИспользуемыеПоляПоискаПоТипам = НастройкиОтчета.ИспользуемыеПоляУниверсальногоПоискаПоТипам; + ПоляПоиска = ИспользуемыеПоляПоискаПоТипам[Тип("Число")]; + + ОписаниеЧисла = Новый ОписаниеТипов("Число"); + ЗначениеПоиска = ОписаниеЧисла.ПривестиЗначение(ПараметрыПоиска.СтрокаПоиска); + + Для Каждого ПолеПоиска Из ПоляПоиска Цикл + + СвойстваПоиска = СвойстваУниверсальногоПоиска(ПолеПоиска.Ключ, ЗначениеПоиска, ПараметрыПоиска.УправляющиеСимволы); + ПредставлениеПоиска = ПредставлениеЗначенияУниверсальногоПоискаСтроки( + ПолеПоиска.Значение, СвойстваПоиска.ВидСравнения, СвойстваПоиска.ПравоеЗначение); + + ВариантыПоиска = Новый Массив; + ВариантыПоиска.Добавить(СвойстваПоиска); + + ПодходящиеЗначения.Добавить(ВариантыПоиска, ПредставлениеПоиска); + + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура НайтиПодходящиеЗначенияУниверсальногоПоиска(ПодходящиеЗначения, ИспользуемыеПоляПоискаПоТипам, ПараметрыПоиска) + + Если Не ЗначениеЗаполнено(ПараметрыПоиска.СтрокаПоиска) Тогда + Возврат; + КонецЕсли; + + #Область ГенерацияЗапроса + + ТекстыЗапросов = Новый Массив; + + Для Каждого Элемент Из ИспользуемыеПоляПоискаПоТипам Цикл + + Если Не ОбщегоНазначения.ЭтоСсылка(Элемент.Ключ) Тогда + Продолжить; + КонецЕсли; + + ОбъектМетаданных = Метаданные.НайтиПоТипу(Элемент.Ключ); + + Если Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + + Если Не ПравоДоступа("Чтение", ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + + ТекстЗапроса = ТекстЗапросаПоОбъектуПоиска(ОбъектМетаданных, ПараметрыПоиска.СтрокаПоиска); + ТекстыЗапросов.Добавить(ТекстЗапроса); + + КонецЦикла; + + Если ТекстыЗапросов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + УточнитьТекстПервогоЗапросаУниверсальногоПоиска(ТекстыЗапросов); + + Разделитель = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1ОБЪЕДИНИТЬ ВСЕ%2'"), Символы.ПС, Символы.ПС); + + ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Разделитель); + + #КонецОбласти + + #Область ОбработкаРезультатаЗапроса + + Запрос = Новый Запрос(ТекстЗапроса); + + Выборка = Запрос.Выполнить().Выбрать(); + + ИндексВариантовПоиска = Новый Соответствие; + ИндексПредставленийПоиска = Новый Соответствие; + + ИндексДополнительныхЗначений = Новый Соответствие; + ДополнительныеЗначения = Новый СписокЗначений; + + Пока Выборка.Следующий() Цикл + + ПоляПоиска = ИспользуемыеПоляПоискаПоТипам[ТипЗнч(Выборка.Ссылка)]; + + Для Каждого ПолеПоиска Из ПоляПоиска Цикл + + СвойстваПоиска = СвойстваУниверсальногоПоиска(ПолеПоиска.Ключ, Выборка.Ссылка, ПараметрыПоиска.УправляющиеСимволы); + + ВариантыПоиска = ИндексВариантовПоиска[СвойстваПоиска.ПравоеЗначение]; + + Если ВариантыПоиска = Неопределено Тогда + + ПредставлениеПоиска = ПредставлениеУниверсальногоПоискаСсылки( + Выборка, СвойстваПоиска.ВидСравнения, ПараметрыПоиска.СтрокаПоиска); + + ИндексПредставленийПоиска.Вставить(СвойстваПоиска.ПравоеЗначение, ПредставлениеПоиска); + ВариантыПоиска = Новый Массив; + + КонецЕсли; + + ВариантыПоиска.Добавить(СвойстваПоиска); + ИндексВариантовПоиска.Вставить(СвойстваПоиска.ПравоеЗначение, ВариантыПоиска); + + Если Не ЗначениеЗаполнено(Выборка.ПолеПоУсловию) + Или ИндексДополнительныхЗначений[ПолеПоиска.Ключ] <> Неопределено Тогда + + Продолжить; + КонецЕсли; + + ПутьКДанным = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "%1.%2", ПолеПоиска.Ключ, Выборка.ПолеПоУсловию); + + РеквизитПоля = Новый ПолеКомпоновкиДанных(ПутьКДанным); + + СвойстваПоиска = СвойстваУниверсальногоПоиска(РеквизитПоля, ПараметрыПоиска.СтрокаПоиска, ПараметрыПоиска.УправляющиеСимволы); + ПредставлениеПоиска = ПредставлениеЗначенияУниверсальногоПоискаСтроки( + ПолеПоиска.Значение, СвойстваПоиска.ВидСравнения, ПараметрыПоиска.СтрокаПоиска); + + ВариантыПоиска = Новый Массив; + ВариантыПоиска.Добавить(СвойстваПоиска); + + ДополнительныеЗначения.Добавить(ВариантыПоиска, ПредставлениеПоиска); + + ИндексДополнительныхЗначений.Вставить(ПолеПоиска.Ключ, Истина); + + КонецЦикла; + + КонецЦикла; + + Для Каждого ИндексЗначения Из ИндексВариантовПоиска Цикл + ПодходящиеЗначения.Добавить(ИндексЗначения.Значение, ИндексПредставленийПоиска[ИндексЗначения.Ключ]); + КонецЦикла; + + ПодходящиеЗначения.СортироватьПоПредставлению(); + ОтчетыКлиентСервер.ДополнитьСписок(ПодходящиеЗначения, ДополнительныеЗначения); + + #КонецОбласти + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ТекстЗапросаПоОбъектуПоиска(Объект, СтрокаПоиска) + + ШаблонТекстаЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5 + | ""&ПолноеИмяОбъекта"" КАК ПолноеИмяОбъекта, + | Ссылка КАК Ссылка, + | Представление КАК Представление, + | &ПолеПоУсловию КАК ПолеПоУсловию, + | &ДополнительныеДанные КАК ДополнительныеДанные + |ИЗ + | &ПолноеИмяОбъекта + |ГДЕ + | &Условие + |"; + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ПолноеИмяОбъекта", Объект.ПолноеИмя()); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеПоУсловию", ПолеТекстаЗапросаПоОбъектуПоиска(Объект, СтрокаПоиска)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Условие", УсловиеТекстаЗапросаПоОбъектуПоиска(Объект, СтрокаПоиска)); + + Возврат СтрЗаменить(ТекстЗапроса, "&ДополнительныеДанные", ДополнительныеДанныеТекстаЗапросаПоОбъектуПоиска(Объект)); + +КонецФункции + +// Параметры: +// Объект - ОбъектМетаданных +// СтрокаПоиска - Строка +// +// Возвращаемое значение: +// Строка +// +&НаСервереБезКонтекста +Функция ПолеТекстаЗапросаПоОбъектуПоиска(Объект, СтрокаПоиска) + + ОписаниеПоляПоУсловию = Новый Массив; + Поля = Объект.ВводПоСтроке; // СписокПолей + + Для Каждого Поле Из Поля Цикл + + ПолеПоУсловию = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'КОГДА %1 ПОДОБНО %2 ТОГДА ""%3""'"), + Поле.Имя, + """%" + СтрокаПоиска + "%""", + Поле.Имя); + + ОписаниеПоляПоУсловию.Добавить(ПолеПоУсловию); + + КонецЦикла; + + Если ОписаниеПоляПоУсловию.Количество() = 0 Тогда + Возврат """"""; + КонецЕсли; + + ОписаниеПоляПоУсловию.Вставить(0, НСтр("ru = 'ВЫБОР'")); + ОписаниеПоляПоУсловию.Добавить(НСтр("ru = 'ИНАЧЕ """"'")); + ОписаниеПоляПоУсловию.Добавить(НСтр("ru = 'КОНЕЦ'")); + + Возврат СтрСоединить(ОписаниеПоляПоУсловию, " "); + +КонецФункции + +// Параметры: +// Объект - ОбъектМетаданных +// СтрокаПоиска - Строка +// +// Возвращаемое значение: +// Строка +// +&НаСервереБезКонтекста +Функция УсловиеТекстаЗапросаПоОбъектуПоиска(Объект, СтрокаПоиска) + + Условия = Новый Массив; + Поля = Объект.ВводПоСтроке; // СписокПолей + + Для Каждого Поле Из Поля Цикл + + Условие = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 ПОДОБНО %2'"), + Поле.Имя, + """%" + СтрокаПоиска + "%"""); + + Условия.Добавить(Условие); + + КонецЦикла; + + Если Условия.Количество() = 0 Тогда + Возврат "ЛОЖЬ"; + КонецЕсли; + + Возврат СтрСоединить(Условия, " ИЛИ "); + +КонецФункции + +// Параметры: +// Объект - ОбъектМетаданных +// +// Возвращаемое значение: +// Строка +// +&НаСервереБезКонтекста +Функция ДополнительныеДанныеТекстаЗапросаПоОбъектуПоиска(Объект) + + ДополнительныеДанные = Новый Массив; + + Исключения = Новый Массив(); + Исключения.Добавить(НСтр("ru = 'Наименование'")); + Исключения.Добавить(НСтр("ru = 'Номер'")); + + Поля = Объект.ВводПоСтроке; // СписокПолей + + Для Каждого Поле Из Поля Цикл + + Если Исключения.Найти(Поле.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Данные = """" + Поле.Имя + ": "" + " + Поле.Имя; + ДополнительныеДанные.Добавить(Данные); + + КонецЦикла; + + Если ДополнительныеДанные.Количество() = 0 Тогда + Возврат """"""; + КонецЕсли; + + Возврат СтрСоединить(ДополнительныеДанные, " + "", """); + +КонецФункции + +&НаСервереБезКонтекста +Процедура УточнитьТекстПервогоЗапросаУниверсальногоПоиска(ТекстыЗапросов) + + ТекстЗапроса = ТекстыЗапросов[0]; + + Операторы = СтрПолучитьСтроку(ТекстЗапроса, 1); + + ОписаниеОператоров = СтрРазделить(Операторы, " "); + ОписаниеОператоров.Вставить(1, НСтр("ru = 'РАЗРЕШЕННЫЕ'")); + + УточненныеОператоры = СтрСоединить(ОписаниеОператоров, " "); + + ТекстыЗапросов[0] = СтрЗаменить(ТекстЗапроса, Операторы, УточненныеОператоры); + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПредставлениеУниверсальногоПоискаСсылки(Данные, Условие, СтрокаПоиска) + + ПредставлениеЗначения = Данные.Представление; + + Если ЗначениеЗаполнено(Данные.ДополнительныеДанные) Тогда + + ПредставлениеЗначения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (%2)'"), Данные.Представление, Данные.ДополнительныеДанные); + + КонецЕсли; + + ФрагментУсловия = ""; + + Если Условие <> ВидСравненияКомпоновкиДанных.Равно Тогда + ФрагментУсловия = ФрагментУсловия(Условие, ""); + КонецЕсли; + + НачалоСтрокиПоиска = СтрНайти(ВРег(ПредставлениеЗначения), ВРег(СтрокаПоиска)); + КонецСтрокиПоиска = НачалоСтрокиПоиска + СтрДлина(СтрокаПоиска); + + ФрагментДоСтрокиПоиска = Лев(ПредставлениеЗначения, НачалоСтрокиПоиска - 1); + ФрагментСтрокиПоиска = ФрагментСтрокиПоиска( + Сред(ПредставлениеЗначения, НачалоСтрокиПоиска, СтрДлина(СтрокаПоиска))); + + ФрагментПослеСтрокиПоиска = Сред(ПредставлениеЗначения, КонецСтрокиПоиска); + + Возврат Новый ФорматированнаяСтрока( + ФрагментУсловия, + ФрагментДоСтрокиПоиска, + ФрагментСтрокиПоиска, + ФрагментПослеСтрокиПоиска); + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПредставлениеЗначенияУниверсальногоПоискаСтроки(ПолеПоиска, Условие, ЗначениеПоиска) + + Если ТипЗнч(ЗначениеПоиска) = Тип("Число") Тогда + СтрокаУсловия = ОператорУниверсальногоПоиска(Условие); + Иначе + СтрокаУсловия = НРег(Условие); + КонецЕсли; + + СтрокаПоиска = Строка(ЗначениеПоиска); + + ФрагментУсловия = ФрагментУсловия(СтрокаУсловия); + ФрагментСтрокиПоиска = ФрагментСтрокиПоиска(СтрокаПоиска); + + Возврат Новый ФорматированнаяСтрока(ПолеПоиска, ФрагментУсловия, """", ФрагментСтрокиПоиска, """"); + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ФрагментУсловия(Условие, ОтступДоУсловия = " ", ОтступПослеУсловия = " ") + + ШаблонФрагментаУсловия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1%2%3'"), + ОтступДоУсловия, + НРег(Условие), + ОтступПослеУсловия); + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + ФрагментУсловия = СтроковыеФункции.ФорматированнаяСтрока(ШаблонФрагментаУсловия); +#Иначе + ФрагментУсловия = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ШаблонФрагментаУсловия); +#КонецЕсли + + Возврат ФрагментУсловия; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ФрагментСтрокиПоиска(СтрокаПоиска) + + ШаблонФрагментаСтрокиПоиска = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1'"), СтрокаПоиска); + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + ФрагментСтрокиПоиска = СтроковыеФункции.ФорматированнаяСтрока(ШаблонФрагментаСтрокиПоиска); +#Иначе + ФрагментСтрокиПоиска = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ШаблонФрагментаСтрокиПоиска); +#КонецЕсли + + Возврат ФрагментСтрокиПоиска; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция СвойстваУниверсальногоПоиска(ПолеПоиска, ЗначениеПоиска, УправляющиеСимволы) + + Условие = УсловиеУниверсальногоПоиска(ЗначениеПоиска, УправляющиеСимволы); + + Свойства = Новый Структура; + Свойства.Вставить("Использование", Истина); + Свойства.Вставить("ЛевоеЗначение", ПолеПоиска); + Свойства.Вставить("ВидСравнения", Условие); + Свойства.Вставить("ПравоеЗначение", ЗначениеПоиска); + + Возврат Свойства; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция УсловиеУниверсальногоПоиска(ЗначениеПоиска, УправляющиеСимволы) + + Если ТипЗнч(ЗначениеПоиска) = Тип("Строка") + И (Не ЗначениеЗаполнено(УправляющиеСимволы) + Или УправляющиеСимволы = "=") Тогда + + Условие = ВидСравненияКомпоновкиДанных.Содержит; + + ИначеЕсли ТипЗнч(ЗначениеПоиска) = Тип("Строка") + И (УправляющиеСимволы = "-" + Или УправляющиеСимволы = "<>") Тогда + + Условие = ВидСравненияКомпоновкиДанных.НеСодержит; + + ИначеЕсли УправляющиеСимволы = "-" + Или УправляющиеСимволы = "<>" Тогда + + Условие = ВидСравненияКомпоновкиДанных.НеРавно; + + ИначеЕсли УправляющиеСимволы = ">" Тогда + + Условие = ВидСравненияКомпоновкиДанных.Больше; + + ИначеЕсли УправляющиеСимволы = ">=" Тогда + + Условие = ВидСравненияКомпоновкиДанных.БольшеИлиРавно; + + ИначеЕсли УправляющиеСимволы = "<" Тогда + + Условие = ВидСравненияКомпоновкиДанных.Меньше; + + ИначеЕсли УправляющиеСимволы = "<=" Тогда + + Условие = ВидСравненияКомпоновкиДанных.Меньше; + + Иначе + + Условие = ВидСравненияКомпоновкиДанных.Равно; + + КонецЕсли; + + Возврат Условие; + +КонецФункции + +&НаСервереБезКонтекста +Функция ОператорУниверсальногоПоиска(Условие) + + Операторы = Новый Соответствие; + Операторы.Вставить(ВидСравненияКомпоновкиДанных.Равно, "="); + Операторы.Вставить(ВидСравненияКомпоновкиДанных.НеРавно, "<>"); + Операторы.Вставить(ВидСравненияКомпоновкиДанных.Больше, ">"); + Операторы.Вставить(ВидСравненияКомпоновкиДанных.БольшеИлиРавно, ">="); + Операторы.Вставить(ВидСравненияКомпоновкиДанных.Меньше, "<"); + Операторы.Вставить(ВидСравненияКомпоновкиДанных.МеньшеИлиРавно, "<="); + + Оператор = Операторы[Условие]; + + Возврат ?(Оператор = Неопределено, НРег(Условие), Оператор); + +КонецФункции + +&НаСервере +Процедура НайтиПоляУниверсальногоПоискаПоТипам() + + ИспользуемыеПоляПоискаПоТипам = Новый Соответствие; + + Настройки = Отчет.КомпоновщикНастроек.Настройки; + + Коллекции = Новый Массив; + Коллекции.Добавить(Настройки.ДоступныеПоляОтбора.Элементы); + + ПоляПараметровДанных = Настройки.ДоступныеПоляПараметровДанных.Элементы; + + Для Каждого ПолеПараметровДанных Из ПоляПараметровДанных Цикл + Коллекции.Добавить(ПолеПараметровДанных.Элементы); + КонецЦикла; + + Для Каждого Коллекция Из Коллекции Цикл + + Для Каждого ОписаниеПоля Из Коллекция Цикл + + Типы = ОписаниеПоля.ТипЗначения.Типы(); + + Для Каждого Тип Из Типы Цикл + + ПоляПоТипу = ИспользуемыеПоляПоискаПоТипам[Тип]; + + Если ПоляПоТипу = Неопределено Тогда + ПоляПоТипу = Новый Соответствие; + КонецЕсли; + + ПоляПоТипу.Вставить(ОписаниеПоля.Поле, ОписаниеПоля.Заголовок); + ИспользуемыеПоляПоискаПоТипам.Вставить(Тип, ПоляПоТипу); + + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + НастройкиОтчета.ИспользуемыеПоляУниверсальногоПоискаПоТипам = ИспользуемыеПоляПоискаПоТипам; + +КонецПроцедуры + +&НаКлиенте +Процедура ПрименитьЗначениеУниверсальногоПоиска(ВариантыПоиска) + + ЭтоПользовательскийПоиск = Ложь; + + Если Не ЗначениеУниверсальногоПоискаПримененоКПараметрам(ВариантыПоиска, ЭтоПользовательскийПоиск) Тогда + ПрименитьЗначениеУниверсальногоПоискаКОтборам(ВариантыПоиска, ЭтоПользовательскийПоиск); + КонецЕсли; + + КомпоновщикНастроек = Отчет.КомпоновщикНастроек; + + Если Не ЭтоПользовательскийПоиск Тогда + + КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); + + ПараметрыОбновления = Новый Структура; + ПараметрыОбновления.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроек); + ПараметрыОбновления.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); + + ОбновитьЭлементыФормыНастроек(ПараметрыОбновления); + + КонецЕсли; + + Если НастройкиОтчета.СвойстваРезультата.ВремяФормирования <= 5 Тогда + + ОчиститьСообщения(); + ПодключитьОбработчикОжидания("Сформировать", 0.1, Истина); + + Иначе + ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(ЭтотОбъект); + КонецЕсли; + + СброситьУниверсальныйПоиск(); + +КонецПроцедуры + +&НаКлиенте +Функция ЗначениеУниверсальногоПоискаПримененоКПараметрам(ВариантыПоиска, ЭтоПользовательскийПоиск) + + КомпоновщикНастроек = Отчет.КомпоновщикНастроек; + ПараметрыДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных; + + ПолеПараметра = Неопределено; + ПодходящийВариантПоиска = Неопределено; + + Для Каждого ВариантПоиска Из ВариантыПоиска Цикл + + ПолеПараметра = ПараметрыДанных.ДоступныеПоляПараметров.НайтиПоле(ВариантПоиска.ЛевоеЗначение); + + Если ПолеПараметра <> Неопределено Тогда + + ПодходящийВариантПоиска = ВариантПоиска; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если ПолеПараметра = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + ОписаниеИмениПоляПараметра = СтрРазделить(ПолеПараметра.Поле, "."); + ОписаниеИмениПараметра = Новый Массив; + + Для Индекс = 1 По ОписаниеИмениПоляПараметра.ВГраница() Цикл + ОписаниеИмениПараметра.Добавить(ОписаниеИмениПоляПараметра[Индекс]); + КонецЦикла; + + ИмяПараметра = СтрСоединить(ОписаниеИмениПараметра, "."); + НайденныйПараметр = ПараметрыДанных.Элементы.Найти(ИмяПараметра); + + Если НайденныйПараметр = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + ОписаниеПараметра = ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(НайденныйПараметр.Параметр); + + Если ОписаниеПараметра.ДоступенСписокЗначений Тогда + НайденныйПараметр.Значение = ОтчетыКлиентСервер.ЗначенияСписком(ПодходящийВариантПоиска.ПравоеЗначение); + Иначе + НайденныйПараметр.Значение = ПодходящийВариантПоиска.ПравоеЗначение; + КонецЕсли; + + НайденныйПараметр.Использование = Истина; + + ЭтоПользовательскийПоиск = ЗначениеЗаполнено(НайденныйПараметр.ИдентификаторПользовательскойНастройки); + + Если Не ЭтоПользовательскийПоиск Тогда + НайденныйПараметр.ИдентификаторПользовательскойНастройки = Строка(Новый УникальныйИдентификатор); + КонецЕсли; + + НайденныйПараметр.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; + + ПользовательскийПараметр = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти( + НайденныйПараметр.ИдентификаторПользовательскойНастройки); + + ПользовательскийПараметр.Значение = НайденныйПараметр.Значение; + ПользовательскийПараметр.Использование = НайденныйПараметр.Использование; + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Процедура ПрименитьЗначениеУниверсальногоПоискаКОтборам(ВариантыПоиска, ЭтоПользовательскийПоиск) + + КомпоновщикНастроек = Отчет.КомпоновщикНастроек; + Фильтры = КомпоновщикНастроек.Настройки.Отбор; + Фильтр = Неопределено; + ПодходящийВариантПоиска = ?(ВариантыПоиска.Количество() = 0, Неопределено, ВариантыПоиска[0]); + + Для Каждого ВариантПоиска Из ВариантыПоиска Цикл + + Фильтр = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрРазделаОтчета(Фильтры, ВариантПоиска.ЛевоеЗначение); + + Если Фильтр <> Неопределено Тогда + + ПодходящийВариантПоиска = ВариантПоиска; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если ПодходящийВариантПоиска = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Фильтр = Неопределено Тогда + + Фильтр = Фильтры.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + Фильтр.ЛевоеЗначение = ПодходящийВариантПоиска.ЛевоеЗначение; + + КонецЕсли; + + ЭтоПользовательскийПоиск = ЗначениеЗаполнено(Фильтр.ИдентификаторПользовательскойНастройки); + + Если Не ЭтоПользовательскийПоиск Тогда + + Фильтр.ИдентификаторПользовательскойНастройки = Строка(Новый УникальныйИдентификатор); + УточнитьСвойстваФильтра(Фильтр, ПодходящийВариантПоиска); + + КонецЕсли; + + Фильтр.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; + + ПользовательскийФильтр = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти( + Фильтр.ИдентификаторПользовательскойНастройки); + + УточнитьСвойстваФильтра(ПользовательскийФильтр, ПодходящийВариантПоиска); + +КонецПроцедуры + +&НаКлиенте +Процедура УточнитьСвойстваФильтра(Фильтр, Поиск) + + Значения = ОтчетыКлиентСервер.ЗначенияСписком(Фильтр.ПравоеЗначение); + + Если Значения.НайтиПоЗначению(Поиск.ПравоеЗначение) = Неопределено Тогда + Значения.Добавить(Поиск.ПравоеЗначение); + КонецЕсли; + + Если Фильтр.Использование + И Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно + И Поиск.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно + И Значения.Количество() > 1 Тогда + + Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + Фильтр.ПравоеЗначение = Значения; + + ИначеЕсли Фильтр.Использование + И Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке + И Поиск.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда + + Фильтр.ПравоеЗначение = Значения; + + ИначеЕсли Фильтр.Использование + И Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно + И Поиск.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно + И Значения.Количество() > 1 Тогда + + Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке; + Фильтр.ПравоеЗначение = Значения; + + ИначеЕсли Фильтр.Использование + И Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке + И Поиск.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно Тогда + + Фильтр.ПравоеЗначение = Значения; + + Иначе + + Фильтр.Использование = Поиск.Использование; + Фильтр.ВидСравнения = Поиск.ВидСравнения; + Фильтр.ПравоеЗначение = Поиск.ПравоеЗначение; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + #Область УровниГруппировок &НаСервере @@ -1648,7 +2640,7 @@ ИндексСтруктурыОтчета = Неопределено; Если ЭтоАдресВременногоХранилища(АдресИндексаСтруктурыОтчета) Тогда - ИндексСтруктурыОтчета = ПолучитьИзВременногоХранилища(АдресИндексаСтруктурыОтчета); // ТаблицаЗначений + ИндексСтруктурыОтчета = ПолучитьИзВременногоХранилища(АдресИндексаСтруктурыОтчета); КонецЕсли; ОчиститьМенюУровнейГруппировок(); @@ -1666,7 +2658,7 @@ &НаСервере Процедура ОчиститьМенюУровнейГруппировок() - Кнопки = Элементы.КонтекстноеМенюОбластиОбщееМенюУровниГруппировок.ПодчиненныеЭлементы; + Кнопки = Элементы.ГруппаУровниГруппировок.ПодчиненныеЭлементы; Индекс = Кнопки.Количество() - 1; Пока Индекс >= 0 Цикл @@ -1674,10 +2666,24 @@ Кнопка = Кнопки[Индекс]; Индекс = Индекс - 1; - Если Кнопка = Элементы.КонтекстноеМенюОбластиОбщееПоказатьУровеньГруппировок Тогда + Если Кнопка = Элементы.ПоказатьУровеньГруппировок Тогда Продолжить; КонецЕсли; + ИмяДополнительнойКнопки = Кнопка.Имя + "Еще"; + ДополнительнаяКнопка = Элементы.Найти(ИмяДополнительнойКнопки); + + Если ДополнительнаяКнопка <> Неопределено Тогда + Элементы.Удалить(ДополнительнаяКнопка); + КонецЕсли; + + ИмяКнопкиКонтекстного = Кнопка.Имя + "КонтекстноеМеню"; + КнопкаКонтекстногоМеню = Элементы.Найти(ИмяКнопкиКонтекстного); + + Если КнопкаКонтекстногоМеню <> Неопределено Тогда + Элементы.Удалить(КнопкаКонтекстногоМеню); + КонецЕсли; + Команда = Команды.Найти(Кнопка.Имя); Если Команда <> Неопределено Тогда @@ -1693,15 +2699,17 @@ &НаСервере Процедура ЗаполнитьМенюУровнейГруппировок(ИндексСтруктурыОтчета) - КоличествоРазделов = ИндексСтруктурыОтчета[0].КоличествоРазделов; - - ГруппировкиРазделов = ГруппировкиРазделовОтчета(ИндексСтруктурыОтчета); - - Если КоличествоРазделов = ГруппировкиРазделов.Количество() Тогда + Если ОтчетТабличныйДокумент.КоличествоУровнейГруппировокСтрок() = 0 Тогда Возврат; КонецЕсли; - СвойстваМеню = СвойстваМенюУровнейГруппировок(ИндексСтруктурыОтчета); + КоличествоРазделов = ИндексСтруктурыОтчета[0].КоличествоРазделов; + + Если КоличествоРазделов = 1 Тогда + СвойстваМеню = СвойстваМенюУровнейГруппировокПростогоОтчета(ИндексСтруктурыОтчета); + Иначе + СвойстваМеню = СвойстваМенюУровнейГруппировокСложногоОтчета(ИндексСтруктурыОтчета); + КонецЕсли; Для Каждого Свойства Из СвойстваМеню Цикл @@ -1709,35 +2717,49 @@ Команда.Заголовок = Свойства.ПредставлениеУровняГруппировки; Команда.Действие = "Подключаемый_ПоказатьУровеньГруппировок"; - Кнопка = Элементы.Добавить(Свойства.ИмяКоманды, Тип("КнопкаФормы"), Элементы.КонтекстноеМенюОбластиОбщееМенюУровниГруппировок); + Кнопка = Элементы.Добавить(Свойства.ИмяКоманды, Тип("КнопкаФормы"), Элементы.ГруппаУровниГруппировок); Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; Кнопка.ИмяКоманды = Свойства.ИмяКоманды; Кнопка.Заголовок = Свойства.ПредставлениеУровняГруппировки; + Кнопка.ТолькоВоВсехДействиях = Ложь; + + // Подменю Еще (Все действия). + ДополнительнаяКнопка = Элементы.Добавить(Свойства.ИмяКоманды + "Еще", Тип("КнопкаФормы"), Элементы.ГруппаУровниГруппировокЕще); + ДополнительнаяКнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + ДополнительнаяКнопка.ИмяКоманды = Свойства.ИмяКоманды; + ДополнительнаяКнопка.Заголовок = Свойства.ПредставлениеУровняГруппировки; + ДополнительнаяКнопка.ТолькоВоВсехДействиях = Истина; + + // Контекстное меню отчета. + КнопкаКонтекстногоМеню = Элементы.Добавить(Свойства.ИмяКоманды + "КонтекстноеМеню", Тип("КнопкаФормы"), Элементы.ГруппаУровниГруппировокКонтекстноеМеню); + КнопкаКонтекстногоМеню.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + КнопкаКонтекстногоМеню.ИмяКоманды = Свойства.ИмяКоманды; + КнопкаКонтекстногоМеню.Заголовок = Свойства.ПредставлениеУровняГруппировки; КонецЦикла; КонецПроцедуры &НаСервере -Функция СвойстваМенюУровнейГруппировок(ИндексСтруктурыОтчета) +Функция СвойстваМенюУровнейГруппировокСложногоОтчета(ИндексСтруктурыОтчета) - СвойстваМеню = ИндексСтруктурыОтчета.СкопироватьКолонки("ПорядокГруппировки, ПредставлениеГруппировки"); + СвойстваМеню = ИндексСтруктурыОтчета.СкопироватьКолонки("ПорядокГруппировки, ПредставлениеГруппировки"); // ТаблицаЗначений - КолонкиСвойстваМеню = СвойстваМеню.Колонки; // КоллекцияКолонокТаблицыЗначений - КолонкиСвойстваМеню.Вставить(1, "ИмяКоманды", Новый ОписаниеТипов("Строка")); + Колонки = СвойстваМеню.Колонки; // КоллекцияКолонокТаблицыЗначений + Колонки.Вставить(1, "ИмяКоманды", Новый ОписаниеТипов("Строка")); - НайденнаяКолонка = КолонкиСвойстваМеню.Найти("ПорядокГруппировки"); // КолонкаТаблицыЗначений - НайденнаяКолонка.Имя = "УровеньГруппировки"; + Колонка = Колонки.Найти("ПорядокГруппировки"); // КолонкаТаблицыЗначений + Колонка.Имя = "УровеньГруппировки"; - НайденнаяКолонка = КолонкиСвойстваМеню.Найти("ПредставлениеГруппировки"); // КолонкаТаблицыЗначений - НайденнаяКолонка.Имя = "ПредставлениеУровняГруппировки"; + Колонка = Колонки.Найти("ПредставлениеГруппировки"); // КолонкаТаблицыЗначений + Колонка.Имя = "ПредставлениеУровняГруппировки"; КоличествоУровнейГруппировок = ОтчетТабличныйДокумент.КоличествоУровнейГруппировокСтрок(); Для УровеньГруппировки = 1 По КоличествоУровнейГруппировок Цикл Свойства = СвойстваМеню.Добавить(); - Свойства.ИмяКоманды = Элементы.КонтекстноеМенюОбластиОбщееПоказатьУровеньГруппировок.Имя + УровеньГруппировки; + Свойства.ИмяКоманды = Элементы.ПоказатьУровеньГруппировок.Имя + УровеньГруппировки; Свойства.УровеньГруппировки = УровеньГруппировки; Свойства.ПредставлениеУровняГруппировки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Уровня %1'"), УровеньГруппировки); @@ -1751,36 +2773,137 @@ КонецФункции &НаСервере -Функция ГруппировкиРазделовОтчета(ИндексСтруктурыОтчета) +Функция СвойстваМенюУровнейГруппировокПростогоОтчета(ИндексСтруктурыОтчета) - ГруппировкиРазделов = ИндексСтруктурыОтчета.Скопировать(); + ПоляСИерархическойГруппировкой = ПоляОтчетаСИерархическойГруппировкой(ИндексСтруктурыОтчета); - Индекс = ГруппировкиРазделов.Количество() - 1; + Если ПоляСИерархическойГруппировкой.Количество() > 1 Тогда + Возврат СвойстваМенюУровнейГруппировокСложногоОтчета(ИндексСтруктурыОтчета); + КонецЕсли; + + КоличествоУровнейГруппировок = ОтчетТабличныйДокумент.КоличествоУровнейГруппировокСтрок(); + + ГруппировкиОтчета = ГруппировкиОтчетаСУчетомПоляСИерархическойГруппировкой( + ИндексСтруктурыОтчета, ПоляСИерархическойГруппировкой, КоличествоУровнейГруппировок); + + СвойстваМеню = ИндексСтруктурыОтчета.СкопироватьКолонки("ПорядокГруппировки, ПредставлениеГруппировки"); // ТаблицаЗначений + + КолонкиСвойстваМеню = СвойстваМеню.Колонки; // КоллекцияКолонокТаблицыЗначений + КолонкиСвойстваМеню.Вставить(1, "ИмяКоманды", Новый ОписаниеТипов("Строка")); + + Граница = Мин(ГруппировкиОтчета.Количество(), КоличествоУровнейГруппировок) - 1; + + Для Индекс = 0 По Граница Цикл + + УровеньГруппировки = Индекс + 1; + + Свойства = СвойстваМеню.Добавить(); + ЗаполнитьЗначенияСвойств(Свойства, ГруппировкиОтчета[Индекс]); + + Свойства.ИмяКоманды = Элементы.ПоказатьУровеньГруппировок.Имя + УровеньГруппировки; + Свойства.ПорядокГруппировки = УровеньГруппировки; + + КонецЦикла; + + Колонка = КолонкиСвойстваМеню.Найти("ПорядокГруппировки"); // КолонкаТаблицыЗначений + Колонка.Имя = "УровеньГруппировки"; + + Колонка = КолонкиСвойстваМеню.Найти("ПредставлениеГруппировки"); // КолонкаТаблицыЗначений + Колонка.Имя = "ПредставлениеУровняГруппировки"; + + СвойстваМеню.Сортировать("УровеньГруппировки"); + + Возврат СвойстваМеню; + +КонецФункции + +&НаСервере +Функция ПоляОтчетаСИерархическойГруппировкой(ИндексСтруктурыОтчета) + + Поиск = Новый Структура(); + Поиск.Вставить("ИспользуетсяВПоляхГруппировки", Истина); + Поиск.Вставить("ТипГруппировки", ТипГруппировкиКомпоновкиДанных.Иерархия); + + Возврат ИндексСтруктурыОтчета.Скопировать(Поиск); + +КонецФункции + +&НаСервере +Функция ГруппировкиОтчетаСУчетомПоляСИерархическойГруппировкой(ИндексСтруктурыОтчета, ПоляСИерархическойГруппировкой, КоличествоУровнейГруппировок) + + ГруппировкиОтчета = ИндексСтруктурыОтчета.Скопировать(); + + Индекс = ГруппировкиОтчета.Количество() - 1; Пока Индекс >= 0 Цикл - Если СтрНайти(ГруппировкиРазделов[Индекс].ИдентификаторГруппировки, "/column/") > 0 Тогда - ГруппировкиРазделов.Удалить(Индекс); + Если СтрНайти(ГруппировкиОтчета[Индекс].ИдентификаторГруппировки, "/column/") > 0 Тогда + ГруппировкиОтчета.Удалить(Индекс); КонецЕсли; Индекс = Индекс - 1; КонецЦикла; - ГруппировкиРазделов.Свернуть("ПорядокРаздела, ПорядокГруппировки, ПредставлениеГруппировки"); - ГруппировкиРазделов.Сортировать("ПорядокРаздела, ПорядокГруппировки"); + ГруппировкиОтчета.Свернуть("ПорядокГруппировки, ПредставлениеГруппировки"); + ГруппировкиОтчета.Сортировать("ПорядокГруппировки"); - Возврат ГруппировкиРазделов; + КоличествоУровнейПоляСИерархическойГруппировкой = КоличествоУровнейГруппировок - ГруппировкиОтчета.Количество(); + + Если ПоляСИерархическойГруппировкой.Количество() <> 1 + Или КоличествоУровнейПоляСИерархическойГруппировкой = 0 Тогда + + Возврат ГруппировкиОтчета; + КонецЕсли; + + Поиск = Новый Структура("ПорядокГруппировки, ПредставлениеГруппировки"); + ЗаполнитьЗначенияСвойств(Поиск, ПоляСИерархическойГруппировкой[0]); + + НайденнаяГруппировка = ГруппировкиОтчета.НайтиСтроки(Поиск)[0]; + ИндексНайденнойГруппировки = ГруппировкиОтчета.Индекс(НайденнаяГруппировка); + + ШаблонПредставленияГруппировки = НСтр("ru = '%1 - уровень %2'"); + УровеньПоляСИерархическойГруппировкой = 0; + + Пока КоличествоУровнейПоляСИерархическойГруппировкой > 0 Цикл + + УровеньПоляСИерархическойГруппировкой = УровеньПоляСИерархическойГруппировкой + 1; + + ДополнительнаяГруппировка = ГруппировкиОтчета.Вставить(ИндексНайденнойГруппировки); + ЗаполнитьЗначенияСвойств(ДополнительнаяГруппировка, НайденнаяГруппировка); + + ДополнительнаяГруппировка.ПредставлениеГруппировки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПредставленияГруппировки, + ДополнительнаяГруппировка.ПредставлениеГруппировки, + УровеньПоляСИерархическойГруппировкой); + + КоличествоУровнейПоляСИерархическойГруппировкой = КоличествоУровнейПоляСИерархическойГруппировкой - 1; + + КонецЦикла; + + УровеньПоляСИерархическойГруппировкой = УровеньПоляСИерархическойГруппировкой + 1; + + НайденнаяГруппировка.ПредставлениеГруппировки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПредставленияГруппировки, + НайденнаяГруппировка.ПредставлениеГруппировки, + УровеньПоляСИерархическойГруппировкой); + + Возврат ГруппировкиОтчета; КонецФункции &НаСервере Процедура УстановитьДоступностьМенюУровнейГруппировок() - МенюЗаполнено = (Элементы.КонтекстноеМенюОбластиОбщееМенюУровниГруппировок.ПодчиненныеЭлементы.Количество() > 1); + МенюЗаполнено = (Элементы.ГруппаУровниГруппировок.ПодчиненныеЭлементы.Количество() > 1); - Элементы.КонтекстноеМенюОбластиОбщееПоказатьУровеньГруппировок.Видимость = Не МенюЗаполнено; - Элементы.КонтекстноеМенюОбластиОбщееМенюУровниГруппировок.Видимость = МенюЗаполнено; + Элементы.ПоказатьУровеньГруппировок.Видимость = Не МенюЗаполнено; + Элементы.ПоказатьУровеньГруппировокЕще.Видимость = Не МенюЗаполнено; + Элементы.ПоказатьУровеньГруппировокКонтекстноеМеню.Видимость = Не МенюЗаполнено; + + Элементы.ГруппаУровниГруппировок.Видимость = МенюЗаполнено; + Элементы.ГруппаУровниГруппировокЕще.Видимость = МенюЗаполнено; + Элементы.ГруппаУровниГруппировокКонтекстноеМеню.Видимость = МенюЗаполнено; КонецПроцедуры @@ -1788,7 +2911,7 @@ Процедура ПоказатьВыбранныйУровеньГруппировок(УровеньГруппировки = Неопределено) Если УровеньГруппировки = Неопределено Тогда - УровеньГруппировки = 999; + УровеньГруппировки = ВыбранныйУровеньГруппировок; КонецЕсли; Индекс = УровеньГруппировки - 1; @@ -1803,21 +2926,74 @@ ОтчетТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(Индекс); - Кнопки = Элементы.КонтекстноеМенюОбластиОбщееМенюУровниГруппировок.ПодчиненныеЭлементы; + ВыбранныйУровеньГруппировок = УровеньГруппировки; - Для Каждого Кнопка Из Кнопки Цикл - Кнопка.Пометка = Ложь; + ЭталонноеМеню = Элементы.ГруппаУровниГруппировок; + ЭталоннаяКнопка = Элементы.ПоказатьУровеньГруппировок; + + ОбластиВыводаМеню = Новый Соответствие; + ОбластиВыводаМеню.Вставить(ЭталонноеМеню, ЭталоннаяКнопка); + ОбластиВыводаМеню.Вставить(Элементы.ГруппаУровниГруппировокЕще, Элементы.ПоказатьУровеньГруппировокЕще); + ОбластиВыводаМеню.Вставить(Элементы.ГруппаУровниГруппировокКонтекстноеМеню, Элементы.ПоказатьУровеньГруппировокКонтекстноеМеню); + + Для Каждого Область Из ОбластиВыводаМеню Цикл + + Кнопки = Область.Ключ.ПодчиненныеЭлементы; + + Для Каждого Кнопка Из Кнопки Цикл + Кнопка.Пометка = Ложь; + КонецЦикла; + + ИмяКнопки = ЭталоннаяКнопка.Имя + УровеньГруппировки + СтрЗаменить(Область.Значение.Имя, ЭталоннаяКнопка.Имя, ""); + Кнопка = Кнопки.Найти(ИмяКнопки); + + Если Кнопка <> Неопределено Тогда + Кнопка.Пометка = Истина; + КонецЕсли; + КонецЦикла; - ИмяКнопки = Элементы.КонтекстноеМенюОбластиОбщееПоказатьУровеньГруппировок.Имя + УровеньГруппировки; - Кнопка = Кнопки.Найти(ИмяКнопки); +КонецПроцедуры + +&НаСервере +Процедура СохранитьВыбранныйУровеньГруппировок() - Если Кнопка <> Неопределено Тогда - Кнопка.Пометка = Истина; + Если РежимРасшифровки Тогда + Возврат; + КонецЕсли; + + ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить( + КлючОбъектаВыбранногоУровняГруппировок(), "ВыбранныйУровеньГруппировок", ВыбранныйУровеньГруппировок); + +КонецПроцедуры + +&НаСервере +Процедура ВосстановитьВыбранныйУровеньГруппировок() + + Если РежимРасшифровки Тогда + Возврат; + КонецЕсли; + + СохраненноеЗначение = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить( + КлючОбъектаВыбранногоУровняГруппировок(), "ВыбранныйУровеньГруппировок"); + + Если ЗначениеЗаполнено(СохраненноеЗначение) Тогда + ВыбранныйУровеньГруппировок = СохраненноеЗначение; + Иначе + НеопределенныйУровеньГруппировок = 999; + ВыбранныйУровеньГруппировок = НеопределенныйУровеньГруппировок; КонецЕсли; КонецПроцедуры +&НаСервере +Функция КлючОбъектаВыбранногоУровняГруппировок() + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + "%1/%2", НастройкиОтчета.ПолноеИмя, КлючТекущегоВарианта); + +КонецФункции + #КонецОбласти //////////////////////////////////////////////////////////////////////////////// @@ -1839,18 +3015,31 @@ Элементы.ВсеНастройкиЕще.Видимость = Элементы.ВсеНастройки.Видимость; Элементы.ГруппаВариантыОтчета.Видимость = ПоказыватьКомандыВыбораВариантов; + ЭтоПредопределенныйВариант = Не НастройкиОтчета.Пользовательский + И ЗначениеЗаполнено(НастройкиОтчета.ПредопределенныйСсылка); + РазрешеноСохранятьВариант = ПоказыватьКомандыИзмененияВарианта И Не РазрешеноВыбиратьИНастраиватьВариантыБезСохранения; + + ДоступноСохранятьТекущийВариант = ЗначениеЗаполнено(НастройкиОтчета.ВариантСсылка) И Не ЭтоПредопределенныйВариант; + + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "СохранитьВариант", "Доступность", ДоступноСохранятьТекущийВариант); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "СохранитьВариантЕще", "Доступность", ДоступноСохранятьТекущийВариант); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "СохранитьВариант", "Видимость", РазрешеноСохранятьВариант); ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "СохранитьВариантЕще", "Видимость", РазрешеноСохранятьВариант); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "СохранитьВариантКак", "Видимость", РазрешеноСохранятьВариант); + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "СохранитьВариантКакЕще", "Видимость", РазрешеноСохранятьВариант); Элементы.ДругиеОтчеты.Видимость = НастройкиОтчета.Подсистема <> Неопределено И НастройкиОтчета.РазрешеноВыбиратьВарианты; Элементы.ДругиеОтчетыЕще.Видимость = Элементы.ДругиеОтчеты.Видимость; - Элементы.ИзменитьВариант.Видимость = ПоказыватьКомандыИзмененияВарианта; Элементы.ВыбратьВариант.Видимость = ПоказыватьКомандыВыбораВариантов; РазрешеноИспользоватьНастройки = @@ -1865,13 +3054,11 @@ ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "ПоделитьсяНастройками", "Видимость", РазрешеноИспользоватьНастройки); - Элементы.ИзменитьУсловияОтборов.Видимость = - КоличествоДоступныхНастроек.Итог > 0 - И ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта); - Если РазрешеноВыбиратьИНастраиватьВариантыБезСохранения Тогда ВариантМодифицирован = Ложь; КонецЕсли; + + Элементы.КомандыПанелиБыстрыхНастроек.Видимость = (КоличествоДоступныхНастроек.БыстрогоДоступа > 0); КонецЕсли; // Команды выбора вариантов. @@ -1905,6 +3092,8 @@ Элементы.ЗагрузитьСхему.Видимость = НастройкиОтчета.РазрешеноЗагружатьСхему И Не ОбщегоНазначения.РазделениеВключено(); // В модели сервиса загрузка произвольной СКД недоступна с точки зрения безопасности. + УстановитьДоступностьМенюУровнейГруппировок(); + // Заголовок. ОтчетНаименованиеТекущегоВарианта = СокрЛП(ОтчетНаименованиеТекущегоВарианта); Если ЗначениеЗаполнено(ОтчетНаименованиеТекущегоВарианта) Тогда @@ -1934,20 +3123,21 @@ &НаСервере Процедура ЗагрузитьВариант(КлючВарианта) Если Не РежимРасшифровки И Не ВариантМодифицирован Тогда - // Сохранение текущих пользовательских настроек. + КлючОбъекта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1/%2/ТекущиеПользовательскиеНастройки'"), НастройкиОтчета.ПолноеИмя, КлючТекущегоВарианта); + ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить( - НастройкиОтчета.ПолноеИмя + "/" + КлючТекущегоВарианта + "/ТекущиеПользовательскиеНастройки", - "", - Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); + КлючОбъекта, "", Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); КонецЕсли; + СохранитьВыбранныйУровеньГруппировок(); + РежимРасшифровки = Ложь; ВариантМодифицирован = Ложь; ПользовательскиеНастройкиМодифицированы = Ложь; НастройкиОтчета.ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек = Истина; УстановитьТекущийВариант(КлючВарианта); - ОтчетыКлиентСервер.ОтобразитьСостояниеОтчета( ЭтотОбъект, НСтр("ru = 'Выбран другой вариант отчета. Нажмите ""Сформировать"" для получения отчета.'"), @@ -2142,6 +3332,8 @@ // Свойства для контекстной настройки отчета. Настройки.Вставить("СвойстваРезультата", ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета()); + Настройки.Вставить("ИспользуемыеПоляУниверсальногоПоискаПоТипам", Новый Соответствие); + Возврат Настройки; КонецФункции @@ -2258,6 +3450,7 @@ ОтчетыСервер.ВосстановитьЗначенияОтборов(ЭтотОбъект); + НайтиПоляУниверсальногоПоискаПоТипам(); УстановитьВидимостьДоступность(); КонецПроцедуры @@ -2390,6 +3583,22 @@ КонецЕсли; КонецПроцедуры +&НаСервере +Процедура СохранитьТекущийВариантОтчета() + + КлючОтчета = НастройкиОтчета.ПолноеИмя; + ОписаниеНастроек = ХранилищаНастроек.ХранилищеВариантовОтчетов.ПолучитьОписание(КлючОтчета, КлючТекущегоВарианта); + + ХранилищаНастроек.ХранилищеВариантовОтчетов.Сохранить( + КлючОтчета, + КлючТекущегоВарианта, + Отчет.КомпоновщикНастроек.Настройки, + ОписаниеНастроек); + + ВариантМодифицирован = Ложь; + +КонецПроцедуры + &НаСервере Процедура ОбновитьКомандыВыбораВариантов() ВариантыФормы = РеквизитФормыВЗначение("ДобавленныеВарианты"); @@ -2605,9 +3814,7 @@ Возврат; КонецЕсли; - Если Не Результат.Переформировать - И Результат.УчитыватьВремяФормирования Тогда - + Если Не Результат.Переформировать Тогда Результат.Переформировать = (НастройкиОтчета.СвойстваРезультата.ВремяФормирования <= 5); КонецЕсли; @@ -2668,7 +3875,20 @@ КонецЕсли; #КонецЕсли + +КонецПроцедуры +&НаКлиенте +Процедура ПослеИзмененияСоставаБыстрыхНастроек(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Если Результат.ВариантМодифицирован Тогда + ОбновитьЭлементыФормыНастроек(Результат); + КонецЕсли; + КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl b/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl index 112e0d115..190908d97 100644 --- a/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl +++ b/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl @@ -23,10 +23,7 @@ // - БизнесПроцессОбъект // - ЗадачаОбъект // - ПланОбменаОбъект -// - РегистрСведенийМенеджерЗаписи -// - РегистрНакопленияМенеджерЗаписи -// - РегистрБухгалтерииМенеджерЗаписи -// - РегистрРасчетаМенеджерЗаписи - менеджер записи. +// - РегистрСведенийМенеджерЗаписи - менеджер записи. // ТолькоПросмотр - Булево - свойство ТолькоПросмотр формы. // Процедура ОбъектПриЧтенииНаСервере(ТекущийОбъект, ТолькоПросмотр) Экспорт diff --git a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl index b972f6990..dbf176cf7 100644 --- a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl @@ -85,6 +85,7 @@ Если АвтономноеРабочееМестоОбъект <> Неопределено Тогда + АвтономноеРабочееМестоОбъект.ДополнительныеСвойства.Вставить("УдалениеНастройкиСинхронизации"); АвтономноеРабочееМестоОбъект.Удалить(); КонецЕсли; @@ -325,7 +326,7 @@ Возврат ""; КонецЕсли; - // Нельзя менять данные, полученные из кэша, поэтому копируем структуру настроек для дальнейшего заполнения + // Нельзя менять данные, полученные из кэша, поэтому копируем структуру настроек для дальнешего заполнения НастройкаОтборовНаУзле = ОбщегоНазначения.СкопироватьРекурсивно(НастройкаОтборовНаУзлеПоУмолчанию, Ложь); Реквизиты = Новый Массив; @@ -771,6 +772,7 @@ ГлавныйУзелОбъект = ГлавныйУзелСсылка.ПолучитьОбъект(); ГлавныйУзелОбъект.ОбменДанными.Загрузка = Истина; ГлавныйУзелОбъект.ДополнительныеСвойства.Вставить("ЭтоГлавныйУзелАРМ"); + ГлавныйУзелОбъект.ДополнительныеСвойства.Вставить("УдалениеНастройкиСинхронизации"); ГлавныйУзелОбъект.Удалить(); ИзменитьИспользованиеРазделения(Ложь); diff --git a/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl index 7feff4251..b920b3a6d 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераRAS/Module.bsl @@ -69,9 +69,9 @@ // Параметры: // ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера // ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера -// ПроверятьПараметрыАдминистрированияКластера - Булево - флаг необходимости проверки параметров администрирования кластера // ПроверятьПараметрыАдминистрированияИнформационнойБазы - Булево - флаг необходимости проверки параметров // администрирования кластера. +// ПроверятьПараметрыАдминистрированияКластера - Булево - флаг необходимости проверки параметров администрирования кластера // Процедура ПроверитьПараметрыАдминистрирования(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, ПроверятьПараметрыАдминистрированияИнформационнойБазы = Истина, @@ -714,6 +714,7 @@ // Возвращает описания кластеров серверов. // +// Параметры: // ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера // Фильтр - Структура - параметры фильтрации кластеров серверов. // diff --git a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl index 0cac3e293..321960d10 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl @@ -654,6 +654,7 @@ // Возвращает описания кластеров серверов. // +// Параметры: // ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера // Фильтр - Структура - параметры фильтрации кластеров серверов. // diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl index f97b8676a..b75f74d70 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl @@ -48,8 +48,7 @@ // ПараметрыОткрытия - Структура - параметры открытия формы: // * Владелец - Произвольный - форма или элемент управления другой формы. // * Уникальность - Произвольный - ключ, значение которого будет использоваться для поиска уже открытых форм. -// * Окно - ОкноКлиентскогоПриложения -// - ВариантОткрытияОкна - окно приложения, в котором будет открыта форма. +// * Окно - ОкноКлиентскогоПриложения - окно приложения, в котором будет открыта форма. // * НавигационнаяСсылка - Строка - задает навигационную ссылку, возвращаемую формой. // Процедура ПоказатьФормуЗагрузкиАдресногоКлассификатора(ОповещениеОЗакрытие = Неопределено, ПараметрыФормы = Неопределено, ПараметрыОткрытия = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl index a4abdac2d..ee298df49 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl @@ -314,6 +314,7 @@ Функция МуниципальныеРайоны() Экспорт + // АПК: 1297-выкл Данные ФИАС, не локализуются Результат = Новый Соответствие; Результат.Вставить("Г.О.", "Городской округ"); // @Non-NLS-1, @Non-NLS-2 Результат.Вставить("М.Р-Н", "муниципальный район"); // @Non-NLS-1, @Non-NLS-2 @@ -321,6 +322,7 @@ Результат.Вставить("ВН.ТЕР.Г.", "Внутригородская территория"); // @Non-NLS-1, @Non-NLS-2 Результат.Вставить("М.О.", "Муниципальный округ"); // @Non-NLS-1, @Non-NLS-2 Результат.Вставить("МУН. ОКР.", "Муниципальный округ"); // @Non-NLS-1, @Non-NLS-2 + // АПК: 1297-вкл Возврат Новый ФиксированноеСоответствие(Результат); @@ -328,12 +330,15 @@ Функция Поселения() Экспорт + // АПК: 1297-выкл Данные ФИАС, не локализуются Результат = Новый Соответствие; Результат.Вставить("Г.П.", "Городское поселение"); // @Non-NLS-1, @Non-NLS-2 Результат.Вставить("Г. П.", "Городское поселение"); // @Non-NLS-1, @Non-NLS-2 Результат.Вставить("ВН.Р-Н", "Внутригородской район"); // @Non-NLS-1, @Non-NLS-2 Результат.Вставить("С.П.", "Сельское поселение"); // @Non-NLS-1, @Non-NLS-2 Результат.Вставить("МЕЖ.ТЕР.", "Межселенная территория"); // @Non-NLS-1, @Non-NLS-2 + // АПК: 1297-вкл + Возврат Новый ФиксированноеСоответствие(Результат); diff --git a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl index c5a636e51..aecf4a2af 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl @@ -350,11 +350,10 @@ // Возвращает данные классификатора поля выбора по уровню. // // Параметры: -// Родитель - УникальныйИдентификатор - родительский объект. -// Уровень - Число - требуемый уровень данных. 1-7, 90, 91 - адресные объекты, -1 -// - ориентиры. -// ТипАдреса - Строка -// ДополнительныеПараметры - Структура - описание настройке поиска. Поля: +// Родитель - УникальныйИдентификатор - родительский объект. +// Уровень - Число - уровень данных для выбора (по ФИАС от 1 до 7) +// ТипАдреса - Строка - варианты: Муниципальный, Административно-территориальный +// ДополнительныеПараметры - Структура - описание настроек поиска: // * ФорматАдреса - Строка - тип используемого классификатора. // * РазмерПорции - Число - необязательный размер порции возвращаемых данных. Если не указано // или 0, то возвращает все элементы. @@ -476,17 +475,10 @@ // Возвращает данные классификатора поля выбора по уровню. // // Параметры: -// Родитель - УникальныйИдентификатор - родительский объект. -// Уровень - Число - требуемый уровень данных. 1-7, 90, 91 - адресные объекты, -1 -// - ориентиры. -// ДополнительныеПараметры - Структура - описание настройке поиска. Поля: -// * ФорматАдреса - Строка - тип используемого классификатора. -// -// * РазмерПорции - Число - необязательный размер порции возвращаемых данных. Если не указано -// или 0, то возвращает все элементы. -// * ПерваяЗапись - УникальныйИдентификатор - элемент, с которого начинается порция данных. Сам элемент не -// входит в выборку. -// * Сортировка - Строка - направление сортировки для порции. +// Родитель - УникальныйИдентификатор - родительский адресный объект. +// Уровень - Число - уровень данных для выбора (по ФИАС от 1 до 7). +// ТипАдреса - Строка -Варианты: Муниципальный, Административно-территориальный. +// СтрокаПоиска - Строка - если указана, то будут отобраны адресные сведения совпадающей со строкой. // // Возвращаемое значение: // Структура - найденные варианты. Содержит поля: @@ -611,7 +603,7 @@ // = Ложь. // * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ // = Ложь. -// * Данные - СписокЗначение - содержит данные для выбора. Колонки: +// * Данные - СписокЗначений - содержит данные для выбора. Колонки: // ** Представление - Строка - представление варианта. // ** Значение - Структура - с полями Идентификатор, Муниципальный, ЗагруженныеДанные. // @@ -1663,6 +1655,12 @@ КонецФункции // Возвращает код региона и проверяет наличие загруженных адресных сведений по региону. +// +// Параметры: +// НаименованиеРегиона - Строка +// +// Возвращаемое значение: +// см. АдресныйКлассификаторПовтИсп.СведенияОРегионе // Функция СведенияОРегионе(НаименованиеРегиона) Экспорт @@ -1672,15 +1670,15 @@ КонецФункции // Возвращает информацию о состоянии загруженности регионов. -// -// Возвращаемое значение: -// ТаблицаЗначений - описание состояния. Содержит колонки: -// * КодСубъектаРФ - Число - код региона. -// * Идентификатор - УникальныйИдентификатор - идентификатор региона. -// * Представление - Строка - наименование и сокращение региона. -// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен. -// * ДатаВерсии - Дата - UTC версия загруженных данных. // +// Возвращаемое значение: +// ТаблицаЗначений - описание состояния. Содержит колонки:: +// * КодСубъектаРФ - Число - код региона. +// * Идентификатор - УникальныйИдентификатор - идентификатор региона. +// * Представление - Строка - наименование и сокращение региона. +// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен. +// * ДатаВерсии - Дата - UTC версия загруженных данных. +// Функция СведенияОЗагрузкеСубъектовРФ() Экспорт Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ(); @@ -1725,12 +1723,36 @@ Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()); РезультатВыборкиЗагруженныхСведений = Запрос.Выполнить(); + Если РезультатВыборкиЗагруженныхСведений.Пустой() Тогда ВыполнитьНачальноеЗаполнение(); РезультатВыборкиЗагруженныхСведений = Запрос.Выполнить(); - КонецЕсли; + ЗагруженныеСведения = РезультатВыборкиЗагруженныхСведений.Выгрузить(); + + Иначе + + ЗагруженныеСведения = РезультатВыборкиЗагруженныхСведений.Выгрузить(); + + ТребуетсяВосстановлениеРегиона = Ложь; + Для каждого РегионИзКлассификатора Из Классификатор Цикл + + НайденныйРегион = ЗагруженныеСведения.Найти(РегионИзКлассификатора.Идентификатор, "Идентификатор"); + Если НайденныйРегион = Неопределено Тогда + ТребуетсяВосстановлениеРегиона = Истина; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если ТребуетсяВосстановлениеРегиона Тогда + + ВыполнитьНачальноеЗаполнение(); + РезультатВыборкиЗагруженныхСведений = Запрос.Выполнить(); + ЗагруженныеСведения = РезультатВыборкиЗагруженныхСведений.Выгрузить(); + + КонецЕсли; - ЗагруженныеСведения = РезультатВыборкиЗагруженныхСведений.Выгрузить(); + КонецЕсли; ЗагруженныеСведения.Индексы.Добавить("Идентификатор"); ЗагруженныеСведения.Индексы.Добавить("КодСубъектаРФ"); @@ -3983,7 +4005,7 @@ | ИСТИНА КАК Муниципальный, | АдресныеОбъекты.Уровень КАК Уровень, | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс, - | Приоритеты.Порядок КАК Порядок + | ЕСТЬNULL(Приоритеты.Порядок, 0) КАК Порядок |ИЗ | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1 @@ -4004,7 +4026,6 @@ | (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы + ""%"" | ИЛИ АдресныеОбъекты.Наименование ПОДОБНО ""% "" + &НачалоФразы + ""%"") | И АдресныеОбъекты.Уровень <> 7 - | //И АдресныеОбъекты.Уровень <> 4 | И АдресныеОбъекты.Уровень <> 3 | |ОБЪЕДИНИТЬ ВСЕ @@ -4032,7 +4053,7 @@ | ЛОЖЬ, | АдресныеОбъекты.Уровень, | ДополнительныеСведения.ПочтовыйИндекс, - | Приоритеты.Порядок + | ЕСТЬNULL(Приоритеты.Порядок, 0) |ИЗ | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1 @@ -4088,7 +4109,7 @@ | ЛОЖЬ КАК Муниципальный, | АдресныеОбъекты.Уровень КАК Уровень, | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс, - | Приоритеты.Порядок КАК Порядок + | ЕСТЬNULL(Приоритеты.Порядок, 0) КАК Порядок |ИЗ | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1 @@ -4144,7 +4165,7 @@ | ИСТИНА КАК Муниципальный, | АдресныеОбъекты.Уровень КАК Уровень, | ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс, - | Приоритеты.Порядок КАК Порядок + | ЕСТЬNULL(Приоритеты.Порядок, 0) КАК Порядок | |ИЗ | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты @@ -5599,57 +5620,12 @@ НайденныеАдреса = ТаблицаАдресов.НайтиСтроки(Новый Структура("Ключ", КлючЗначение.Ключ)); КакиеУровниПроверять = СписокПроверяемыхУровней[КлючЗначение.Ключ]; - СписокКорректныхАдресов = Новый Массив; + СписокНекорректныхАдресов = Новый Массив; Адрес = КлючЗначение.Значение; - Для каждого АдресСтрока Из НайденныеАдреса Цикл - - Если КакиеУровниПроверять["Distict"] <> Неопределено И АдресСтрока["Наименование" + КакиеУровниПроверять["Distict"]] = NULL Тогда - ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "СвРайМО/Район", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Район ""%1"" отсутствует в ФИАС'"), Адрес.District + " " + Адрес.DistrictType)); - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "Area", НСтр("ru = 'Субъект РФ'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "MunDistrict", НСтр("ru = 'Муниципальный район'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "Distict", НСтр("ru = 'Район'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "Settlement", НСтр("ru = 'Поселение'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "City", НСтр("ru = 'Город'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "CityDistrict", НСтр("ru = 'Внутригородской район'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "Territory", НСтр("ru = 'Территория'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "Locality", НСтр("ru = 'Населенный пункт'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - Если НЕ ДанныеУровняКорректные(Адрес, "Street", НСтр("ru = 'Улица'"), АдресСтрока, КакиеУровниПроверять, ОшибкиПроверки) Тогда - Продолжить; - КонецЕсли; - - СписокКорректныхАдресов.Добавить(АдресСтрока); - КонецЦикла; + ПроверитьКорректностьАдресов(СписокНекорректныхАдресов, КакиеУровниПроверять, Адрес, НайденныеАдреса, ОшибкиПроверки); - Если СписокКорректныхАдресов.Количество() = 0 Тогда + Если СписокНекорректныхАдресов.Количество() = 0 Тогда Результат.АдресКорректный = Ложь; Результат.АдресПроверен = ?(ЭтоГородФедеральногоЗначения(ПолноеНаименованиеРегиона(Адрес.Area, Адрес.AreaType)), Ложь, Истина); // Для городов федерального значения выполняется дополнительная проверка. @@ -5672,6 +5648,96 @@ КонецПроцедуры +Процедура ПроверитьКорректностьАдресов(СписокНекорректныхАдресов, Знач КакиеУровниПроверять, Адрес, Знач НайденныеАдреса, ОшибкиПроверки) + + Для каждого АдресСтрока Из НайденныеАдреса Цикл + + Если КакиеУровниПроверять["Distict"] <> Неопределено И АдресСтрока["Наименование" + КакиеУровниПроверять["Distict"]] = NULL Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "СвРайМО/Район", + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Район ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.District, Адрес.DistrictType))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("Area", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Субъект РФ'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Субъект РФ ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес["Area"], Адрес["AreaType"], Истина))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("MunDistrict", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Муниципальный район'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Муниципальный район ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.MunDistrict, Адрес.MunDistrictType))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("Distict", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Район'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Район ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.District, Адрес.DistrictType))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("Settlement", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Поселение'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поселение ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Settlement, Адрес.SettlementType))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("City", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Город'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Город ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.City, Адрес.CityType))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("Territory", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Территория'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Территория ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Territory, Адрес.TerritoryType))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("Locality", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Населенный пункт'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Населенный пункт ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Locality, Адрес.LocalityType))); + Продолжить; + + КонецЕсли; + + Если НЕ ДанныеУровняКорректные("Street", АдресСтрока, КакиеУровниПроверять) Тогда + + ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Улица'"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Улица ""%1"" отсутствует в ФИАС'"), + СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Street, Адрес.StreetType))); + Продолжить; + + КонецЕсли; + + СписокНекорректныхАдресов.Добавить(АдресСтрока); + КонецЦикла; + +КонецПроцедуры + Процедура АнализДомовИДополнительныхСведений(Результаты, Знач Адреса, Знач Дома, Знач Участки, Знач ДополнительныеСведения) ТаблицаДомов = Дома.Выгрузить(); @@ -6559,18 +6625,18 @@ КонецЕсли; Иначе - - Если СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'м.р-н'")) = 0 Тогда + // АПК: 1297-выкл Данные ФИАС, не локализуются + Если СтрСравнить(ТипМуниципальногоРайона, "м.р-н") = 0 Тогда КодМуниципальногоРайона = "1"; - ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'г.о.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "г.о.") = 0 Тогда КодМуниципальногоРайона = "2"; - ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'вн.тер.'")) = 0 - Или СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'вн.тер. г.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "вн.тер.") = 0 + Или СтрСравнить(ТипМуниципальногоРайона, "вн.тер. г.") = 0 Тогда // @Non-NLS-1 КодМуниципальногоРайона = "3"; - ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'мун. окр.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "мун. окр.") = 0 Тогда КодМуниципальногоРайона = "4"; КонецЕсли; - + // АПК: 1297-вкл КонецЕсли; Возврат КодМуниципальногоРайона; @@ -6580,17 +6646,17 @@ Функция КодПоселения(Знач ТипПоселения) КодПоселения = ""; - - Если СтрСравнить(ТипПоселения, НСтр("ru = 'г. п.'")) = 0 Тогда + // АПК: 1297-выкл Данные ФИАС, не локализуются + Если СтрСравнить(ТипПоселения, "г. п.") = 0 Или СтрСравнить(ТипПоселения, "г.п.") = 0 Тогда // @Non-NLS-2 КодПоселения = "1"; - ИначеЕсли СтрСравнить(ТипПоселения, НСтр("ru = 'с.п.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипПоселения, "с.п.") = 0 Тогда КодПоселения = "2"; - ИначеЕсли СтрСравнить(ТипПоселения, НСтр("ru = 'меж.тер.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипПоселения, "меж.тер.") = 0 Тогда КодПоселения = "3"; - ИначеЕсли СтрСравнить(ТипПоселения, НСтр("ru = 'вн.р-н'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипПоселения, "вн.р-н") = 0 Тогда КодПоселения = "4"; КонецЕсли; - + // АПК: 1297-вкл Возврат КодПоселения; КонецФункции @@ -6994,12 +7060,9 @@ КонецФункции -Функция ДанныеУровняКорректные(Знач Адрес, Знач ИмяУровня, Знач ПредставлениеУровня, Знач АдресСтрока, Знач КакиеУровниПроверять, Знач ОшибкиПроверки) +Функция ДанныеУровняКорректные(Знач ИмяУровня, Знач АдресСтрока, Знач КакиеУровниПроверять) Если КакиеУровниПроверять[ИмяУровня] <> Неопределено И ПустаяСтрока(АдресСтрока["НаименованиеУровень" + КакиеУровниПроверять[ИмяУровня]]) Тогда - ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, ПредставлениеУровня, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 ""%2"" отсутствует в ФИАС'"), ПредставлениеУровня, - Адрес[ИмяУровня] + " " + Адрес[ИмяУровня + "Type"])); Возврат Ложь; КонецЕсли; @@ -7534,15 +7597,17 @@ КонецФункции Функция ПредставлениеРегиона(Наименование, Сокращение) - Если Сокращение = НСтр("ru = 'Респ'") Тогда - Возврат НСтр("ru = 'Республика'") + " " + Наименование; - ИначеЕсли Сокращение = НСтр("ru = 'обл'") Тогда - Возврат Наименование + " " + НСтр("ru = 'область'"); - ИначеЕсли Сокращение = НСтр("ru = 'г'") Тогда - Возврат НСтр("ru = 'г.'") + " " + Наименование; + + Если СтрСравнить(Сокращение, "Респ") = 0 Тогда + Возврат СоединитьНаименованиеИТипАдресногоОбъекта(Наименование, "Республика"); + ИначеЕсли СтрСравнить(Сокращение, "обл") = 0 Тогда + Возврат СоединитьНаименованиеИТипАдресногоОбъекта(Наименование, "область", Истина); + ИначеЕсли СтрСравнить(Сокращение, "г") = 0 Тогда + Возврат СоединитьНаименованиеИТипАдресногоОбъекта("г.", Наименование); КонецЕсли; - Возврат Наименование + " " + Сокращение; + Возврат СоединитьНаименованиеИТипАдресногоОбъекта(Наименование, Сокращение, Истина); + КонецФункции // Извлекает список домов полученного из регистра сведения описания и добавляет их в список значений. @@ -8312,6 +8377,7 @@ // Функция ИсправлениеСокращений(Сокращение) + // АПК: 1297-выкл Данные ФИАС, не локализуются Если СтрСравнить(Сокращение, "г. п.") = 0 Тогда Возврат "г.п."; КонецЕсли; @@ -8325,6 +8391,7 @@ Или СтрСравнить(Сокращение, "мун. окр.") = 0 Тогда Возврат "м.о."; КонецЕсли; + // АПК: 1297-вкл Возврат Сокращение; diff --git a/SSL/src/CommonModules/Анкетирование/Module.bsl b/SSL/src/CommonModules/Анкетирование/Module.bsl index 3abd846bd..b4037963f 100644 --- a/SSL/src/CommonModules/Анкетирование/Module.bsl +++ b/SSL/src/CommonModules/Анкетирование/Module.bsl @@ -2061,12 +2061,14 @@ // вопросов при выводе табличных вопросов. // // Параметры: -// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет, по которому проводился опрос. +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон, по которому проводился опрос. // -// ВозвращаемоеЗначение: +// Возвращаемое значение: // Соответствие из КлючИЗначение: -// * Ключ - ссылка на вопрос -// * Значение - его формулировка +// * Ключ - СправочникСсылка.ВопросыШаблонаАнкеты +// * Значение - Структура: +// ** Формулировка - Строка +// ** АгрегироватьСуммуВОтчетах - Булево // Функция ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты) Экспорт diff --git a/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl index aa4c7abf9..01b064c60 100644 --- a/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl @@ -124,10 +124,10 @@ // // Параметры: // ЭтоРаздел - Булево - признак раздела. -// ТипВопроса - Перечисление.ТипыВопросовШаблонаАнкеты. +// ТипВопроса - ПеречислениеСсылка.ТипыВопросовШаблонаАнкеты. // // Возвращаемое значение: -// Число - код картинки для отображения в дереве. +// Число // Функция ПолучитьКодКартинкиШаблонаАнкеты(ЭтоРаздел,ТипВопроса = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl index 9df03f9f3..4e5a0e325 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl @@ -267,7 +267,7 @@ Форма.Объект.ПринятаКИсполнению = Ложь; Форма.Объект.ДатаПринятияКИсполнению = "00010101000000"; Если Не Форма.Объект.РольИсполнителя.Пустая() Тогда - Форма.Объект.Исполнитель = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка"); + Форма.Объект.Исполнитель = Неопределено; КонецЕсли; ОчиститьСообщения(); diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl index 9fdb37eb4..d811e19ba 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl @@ -12,7 +12,7 @@ // Позволяет переопределить стандартную форму выбора. // // Параметры: -// ЭлементИсполнитель - ЭлементФормы - элемент формы, в которой выбирается исполнитель. +// ЭлементИсполнитель - ПолеФормы - элемент формы, в которой выбирается исполнитель. // РеквизитИсполнитель - СправочникСсылка.Пользователи - выбранный ранее исполнитель. // Используется для установки текущей строки в форме выбора исполнителя. // ТолькоПростыеРоли - Булево - если Истина, то указывает что для выбора нужно diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl index 4342e9994..f18021c87 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl @@ -620,8 +620,8 @@ // // Параметры: // РольИсполнителя - СправочникСсылка.РолиИсполнителей - роль исполнителя. -// ОсновнойОбъектАдресации - ЛюбаяСсылка - ссылка на основной объект адресации. -// ДополнительныйОбъектАдресации - ЛюбаяСсылка - ссылка на дополнительный объект адресации. +// ОсновнойОбъектАдресации - Характеристика.ОбъектыАдресацииЗадач - ссылка на основной объект адресации. +// ДополнительныйОбъектАдресации - Характеристика.ОбъектыАдресацииЗадач - ссылка на дополнительный объект адресации. // // Возвращаемое значение: // СправочникСсылка.ГруппыИсполнителейЗадач @@ -721,7 +721,7 @@ // Стартует отложенный бизнес-процесс, устанавливая признак старта. // // Параметры: -// БизнесПроцесс - ОпределяемыйТип.БизнесПроцессОбъект +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс // Процедура СтартоватьОтложенныйПроцесс(БизнесПроцесс) Экспорт @@ -765,7 +765,7 @@ // - Неопределено - если сведений нет. // - Структура: // * БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс. -// * ДатаОтложенногоСтарта - ДатаИВремя. +// * ДатаОтложенногоСтарта - Дата // * Состояние - ПеречислениеСсылка.СостоянияПроцессовДляЗапуска. // * ПричинаОтменыСтарта - Строка - причина отмены старта. // @@ -1874,7 +1874,7 @@ МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); СуффиксТекущегоЯзыка = МодульМультиязычностьСервер.СуффиксТекущегоЯзыка(); - + Если ЗначениеЗаполнено(СуффиксТекущегоЯзыка) Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РолиИсполнителей.Наименование", "РолиИсполнителей.Наименование" + СуффиксТекущегоЯзыка); @@ -2460,10 +2460,26 @@ // Процедура ЗаполнитьНаименованиеПредопределенногоЭлементаВсеОбъектыАдресации() Экспорт - ВсеОбъектыАдресации = ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.ВсеОбъектыАдресации.ПолучитьОбъект(); - ВсеОбъектыАдресации.Наименование = НСтр("ru = 'Все объекты адресации'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВсеОбъектыАдресации); - + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ОбъектыАдресацииЗадач"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.ВсеОбъектыАдресации.Ссылка); + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + ВсеОбъектыАдресации = ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.ВсеОбъектыАдресации.ПолучитьОбъект(); + ВсеОбъектыАдресации.Наименование = НСтр("ru = 'Все объекты адресации'"); + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ВсеОбъектыАдресации); + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецПроцедуры #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl index 9f0099602..b45fc070f 100644 --- a/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl +++ b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl @@ -55,10 +55,8 @@ ВызватьИсключение; КонецПопытки; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда - МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); - МодульОбсужденияСлужебный.Разблокировать(); - КонецЕсли; + ИнтеграцияПодсистемБСП.ПриРазрешенииРаботыСВнешнимиРесурсами(); + БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.ПриРазрешенииРаботыСВнешнимиРесурсами(); ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована = Ложь; @@ -90,10 +88,8 @@ ВызватьИсключение; КонецПопытки; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда - МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); - МодульОбсужденияСлужебный.Заблокировать(); - КонецЕсли; + ИнтеграцияПодсистемБСП.ПриЗапретеРаботыСВнешнимиРесурсами(); + БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.ПриЗапретеРаботыСВнешнимиРесурсами(); ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована = Истина; @@ -584,10 +580,8 @@ ПараметрыБлокировки.ПричинаБлокировки = ПредставлениеПричиныБлокировки(ПараметрыБлокировки); СохранитьПараметрыБлокировки(ПараметрыБлокировки); - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда - МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); - МодульОбсужденияСлужебный.Заблокировать(); - КонецЕсли; + ИнтеграцияПодсистемБСП.ПриЗапретеРаботыСВнешнимиРесурсами(); + БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.ПриЗапретеРаботыСВнешнимиРесурсами(); ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,,, ТекстСообщения); diff --git a/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый/Module.bsl b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый/Module.bsl new file mode 100644 index 000000000..c68e95996 --- /dev/null +++ b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый/Module.bsl @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Вызывается при снятии блокировки работы с внешними ресурсами. +// Для включения работы механизмов, отключенных в процедуре ПриЗапретеРаботыСВнешнимиРесурсами. +// +Процедура ПриРазрешенииРаботыСВнешнимиРесурсами() Экспорт + +КонецПроцедуры + +// Вызывается при установке блокировки работы с внешними ресурсами. +// Позволяет отключить произвольные механизмы, работа +// которых в копии информационной базы недопустима. +// +Процедура ПриЗапретеРаботыСВнешнимиРесурсами() Экспорт + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.mdo b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.mdo new file mode 100644 index 000000000..777267270 --- /dev/null +++ b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый/БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.mdo @@ -0,0 +1,11 @@ + + + БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый + + ru + Блокировка работы с внешними ресурсами переопределяемый + + true + true + true + diff --git a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl index 4d1d1f08b..cf290664e 100644 --- a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl @@ -213,10 +213,13 @@ // // Код процедуры. // КонецПроцедуры // -// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - полное имя или ссылка на отчет. -// * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета. -// * КлючВарианта - Строка - имя варианта отчета. -// * ОписаниеПолучено - Булево - флажок что описание строки уже получено. +// * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений +// - СправочникСсылка.ДополнительныеОтчетыИОбработки +// - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - Строка - полное имя или ссылка на отчет. +// * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета. +// * КлючВарианта - Строка - имя варианта отчета. +// * ОписаниеПолучено - Булево - флажок что описание строки уже получено. // Описание получается методом ОписаниеВарианта(). // * СистемнаяИнформация - Структура - другая служебная информация. // При этом колонки Отчет, Метаданные, КлючВарианта, ОписаниеПолучено, СистемнаяИнформация @@ -248,7 +251,7 @@ // // Параметры: // Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки. -// Отчет - СтрокаДерева +// Отчет - СтрокаДереваЗначений // - ОбъектМетаданных - описание настроек, метаданные или ссылка отчета. // КлючВарианта - Строка - имя варианта отчета как оно задано в схеме компоновки данных. // @@ -291,11 +294,14 @@ // // Код процедуры. // КонецПроцедуры // -// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - полное имя или ссылка на отчет. -// * Описание - Строка -// * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета. -// * КлючВарианта - Строка - имя варианта отчета. -// * ОписаниеПолучено - Булево - флажок что описание строки уже получено. +// * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений +// - СправочникСсылка.ДополнительныеОтчетыИОбработки +// - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - Строка - полное имя или ссылка на отчет. +// * Описание - Строка +// * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета. +// * КлючВарианта - Строка - имя варианта отчета. +// * ОписаниеПолучено - Булево - флажок что описание строки уже получено. // Описание получается методом ОписаниеВарианта(). // * СистемнаяИнформация - Структура - другая служебная информация. // При этом колонки Отчет, Метаданные, КлючВарианта, ОписаниеПолучено, СистемнаяИнформация @@ -343,22 +349,25 @@ // устанавливается рекурсивно для всех отчетов из ее состава. // ГруппироватьПоОтчетам - Булево // - Строка - режим вывода гиперссылок этого отчета в панели отчетов: -// * Истина, "ПоОтчетам" - варианты группируются по отчету. -// По умолчанию в панелях отчетов выводится только основной вариант отчета, -// а все прочие варианты этого отчета выводятся "под" основным и по умолчанию скрыты -// (но могут быть найдены поиском или включены при помощи флажков в режиме настройки). -// Основным вариантом считается первый предопределенный вариант в схеме отчета. -// Этот режим появился в версии 2.2.2 и позволяет уменьшить количество гиперссылок, выводимых в панелях отчетов. -// * Ложь, "ПоВариантам" - все варианты отчета считаются самостоятельными, -// по умолчанию видны и выводятся независимо в панелях отчетов. -// Этот режим использовался в версии 2.2.1 и ранее. +// Если Истина, "ПоОтчетам" - варианты группируются по отчету. +// По умолчанию в панелях отчетов выводится только основной вариант отчета, +// а все прочие варианты этого отчета выводятся "под" основным и по умолчанию скрыты +// (но могут быть найдены поиском или включены при помощи флажков в режиме настройки). +// Основным вариантом считается первый предопределенный вариант в схеме отчета. +// Этот режим появился в версии 2.2.2 и позволяет уменьшить количество гиперссылок, выводимых в +// панелях отчетов. Если Ложь, "ПоВариантам" - все варианты отчета считаются самостоятельными, +// по умолчанию видны и выводятся независимо в панелях отчетов. +// Этот режим использовался в версии 2.2.1 и ранее. // Процедура УстановитьРежимВыводаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ГруппироватьПоОтчетам) Экспорт Если ТипЗнч(ГруппироватьПоОтчетам) <> Тип("Булево") Тогда ГруппироватьПоОтчетам = (ГруппироватьПоОтчетам = ВРег("ПоОтчетам")); КонецЕсли; - Если ТипЗнч(ОтчетИлиПодсистема) = Тип("СтрокаТаблицыЗначений") Или Метаданные.Отчеты.Содержит(ОтчетИлиПодсистема) Тогда + + Если ТипЗнч(ОтчетИлиПодсистема) = Тип("СтрокаТаблицыЗначений") + Или Метаданные.Отчеты.Содержит(ОтчетИлиПодсистема) Тогда + УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, ОтчетИлиПодсистема, ГруппироватьПоОтчетам); Возврат; КонецЕсли; @@ -1676,9 +1685,11 @@ ИсходныеСообщенияПользователю = ПолучитьСообщенияПользователю(Истина); ПроверкаПройдена = ОтчетОбъект.ПроверитьЗаполнение(); СообщенияПользователю = ПолучитьСообщенияПользователю(Истина); + Для Каждого Сообщение Из ИсходныеСообщенияПользователю Цикл Сообщение.Сообщить(); КонецЦикла; + Если Не ПроверкаПройдена Тогда Результат.ТекстОшибки = НСтр("ru = 'Отчет не прошел проверку заполнения:'"); Для Каждого Сообщение Из СообщенияПользователю Цикл @@ -1721,7 +1732,7 @@ ЗаписьЖурналаРегистрации( НСтр("ru = 'Варианты отчетов.Формирование отчета'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Предупреждение, + УровеньЖурналаРегистрации.Ошибка, Результат.Метаданные, Результат.СсылкаВарианта, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); @@ -1905,7 +1916,7 @@ // - Строка // - СправочникСсылка.ДополнительныеОтчетыИОбработки // - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// * ТипОтчета - Перечисления.ТипыОтчетов +// * ТипОтчета - ПеречислениеСсылка.ТипыОтчетов // * ОтчетИмя - Строка - например, "ДинамикаИзмененийФайлов". // * ОтчетПолноеИмя - Строка - например, "Отчет.ДинамикаИзмененийФайлов". // * ОтчетМетаданные - ОбъектМетаданныхОтчет @@ -2480,7 +2491,17 @@ Настройка.ВидыПодключаемыхОбъектов = "ОТЧЕТ"; КонецПроцедуры -// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту +// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. +// +// Параметры: +// ВидыПодключаемыхКоманд - ТаблицаЗначений - поддерживаемые виды команд, где: +// * Имя - Строка - имя вида команд. +// * ИмяПодменю - Строка - имя подменю для размещения команд этого вида на формах объектов. +// * Заголовок - Строка - наименование подменю, выводимое пользователю. +// * Картинка - Картинка - картинка подменю. +// * Отображение - ОтображениеКнопки - режим отображения подменю. +// * Порядок - Число - порядок подменю в командной панели формы. +// Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт Вид = ВидыПодключаемыхКоманд.Добавить(); Вид.Имя = "Отчеты"; @@ -2786,9 +2807,9 @@ // Настройки - ТаблицаЗначений - передается "как есть" из процедуры НастроитьВариантыОтчетов. // Отчет - СтрокаТаблицыЗначений: // - ОбъектМетаданныхОтчет - описание настроек или метаданные отчета. -// ГруппироватьПоОтчетам - Булево - режим вывода в панели отчетов: -// - Истина - по отчетам (варианты скрыты, а отчет включен и видим). -// - Ложь - по вариантам (варианты видимы, а отчет отключен). +// ГруппироватьПоОтчетам - Булево - режим вывода в панели отчетов. +// Если Истина, то по отчетам (варианты скрыты, а отчет включен и видим). +// Если Ложь, то по вариантам (варианты видимы, а отчет отключен). // Процедура УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, Отчет, ГруппироватьПоОтчетам) Если ТипЗнч(Отчет) = Тип("СтрокаТаблицыЗначений") Тогда @@ -4407,11 +4428,15 @@ КонецПроцедуры // Запись параметров вариантов отчетов (кеш метаданных для ускорения работы): -// ТаблицаФункциональныхОпций - ТаблицаЗначений - связь функциональных опций и предопределенных вариантов отчетов: -// * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// * ПредопределенныйВариант - СправочникСсылка.ПредопределенныеВариантыОтчетов -// * ИмяФункциональнойОпции - Строка -// ОтчетыСНастройками - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - отчеты, +// +// Параметры: +// Режим - Строка - режим обновления: "ОбщиеДанныеКонфигурации" или "ОбщиеДанныеРасширений" +// Результат - Структура: +// * ТаблицаФункциональныхОпций - ТаблицаЗначений - связь функциональных опций и предопределенных вариантов отчетов: +// ** Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// ** ПредопределенныйВариант - СправочникСсылка.ПредопределенныеВариантыОтчетов +// ** ИмяФункциональнойОпции - Строка +// * ОтчетыСНастройками - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - отчеты, // в модуле объекта которых размещены процедуры интеграции с общей формой отчета. // Процедура ЗаписатьТаблицуФункциональныхОпций(Режим, Результат) @@ -5749,34 +5774,7 @@ // * ВариантыСвязанныеСПодсистемами - Соответствие из КлючИЗначение - варианты отчетов и их подсистемы, где: // ** Ключ - СправочникСсылка.ВариантыОтчетов - вариант. // ** Значение - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - подсистемы. -// * ТаблицаЗначений - ТаблицаЗначений - заполняется, если задан ПараметрыПоиска.ПолучатьИтоговуюТаблицу: -// ** Ссылка - СправочникСсылка.ВариантыОтчетов -// ** Родитель - СправочникСсылка.ВариантыОтчетов -// ** Наименование - Строка -// ** ТолькоДляАвтора - Булево -// ** Автор - СправочникСсылка.Пользователи -// - СправочникСсылка.ВнешниеПользователи -// ** АвторПредставление - Строка -// ** Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// - СправочникСсылка.ИдентификаторыОбъектовРасширений -// - Строка -// - СправочникСсылка.ДополнительныеОтчетыИОбработки -// ** ИмяОтчета - Строка -// ** КлючВарианта - Строка -// ** ТипОтчета - ПеречислениеСсылка.ТипыОтчетов -// ** Пользовательский - Булево -// ** ПредопределенныйВариант - СправочникСсылка.ПредопределенныеВариантыОтчетов -// - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений -// ** НаименованияПараметровИОтборов - Строка -// ** НаименованияПолей - Строка -// ** КлючевыеСлова - Строка -// ** Описание - Строка -// ** Подсистема - СправочникСсылка.ИдентификаторыОбъектовРасширений -// - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// ** НаименованиеПодсистемы - Строка -// ** КлючПользовательскойНастройки - Строка -// ** ПредставлениеПользовательскойНастройки - Строка -// ** ПометкаУдаления - Булево +// * ТаблицаЗначений - см. ИсходнаяТаблицаВариантовОтчетов // Функция НайтиВариантыОтчетов(Знач ПараметрыПоиска, Знач ПолучатьИтоговуюТаблицу = Ложь, Знач ПолучатьПодсветку = Ложь) Экспорт @@ -5882,7 +5880,7 @@ УстановитьПривилегированныйРежим(Истина); Запрос.Текст = ТекстЗапроса; - ИсходнаяТаблица = Запрос.Выполнить().Выгрузить(); + ИсходнаяТаблица = ИсходнаяТаблицаВариантовОтчетов(Запрос); Если ПолучатьИтоговуюТаблицу Тогда Результат.ТаблицаЗначений = ИсходнаяТаблица; @@ -6406,6 +6404,45 @@ КонецФункции +// Параметры: +// Запрос - Запрос +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.ВариантыОтчетов +// * Родитель - СправочникСсылка.ВариантыОтчетов +// * Наименование - Строка +// * ТолькоДляАвтора - Булево +// * Автор - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// * АвторПредставление - Строка +// * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// - Строка +// - СправочникСсылка.ДополнительныеОтчетыИОбработки +// * ИмяОтчета - Строка +// * КлючВарианта - Строка +// * ТипОтчета - ПеречислениеСсылка.ТипыОтчетов +// * Пользовательский - Булево +// * ПредопределенныйВариант - СправочникСсылка.ПредопределенныеВариантыОтчетов +// - СправочникСсылка.ПредопределенныеВариантыОтчетовРасширений +// * НаименованияПараметровИОтборов - Строка +// * НаименованияПолей - Строка +// * КлючевыеСлова - Строка +// * Описание - Строка +// * Подсистема - СправочникСсылка.ИдентификаторыОбъектовРасширений +// - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// * НаименованиеПодсистемы - Строка +// * КлючПользовательскойНастройки - Строка +// * ПредставлениеПользовательскойНастройки - Строка +// * ПометкаУдаления - Булево +// +Функция ИсходнаяТаблицаВариантовОтчетов(Запрос) Экспорт + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + // Визуализирует результат поиска вариантов отчетов. // // Параметры: @@ -7436,6 +7473,50 @@ #Область ОбменНастройкамиМеждуИнформационнымиБазами +// Параметры: +// ОписаниеФайлов - Массив из Структура: +// * Хранение - Строка +// * Имя - Строка +// +// Возвращаемое значение: +// Массив из Структура: +// * Ссылка - СправочникСсылка.ВариантыОтчетов +// * ИмяОтчета - Строка +// * Настройки - Неопределено +// - НастройкиКомпоновкиДанных +// * КлючВарианта - Строка +// * ПредставлениеВарианта - Строка +// * КлючТекущихПользовательскихНастроек - Строка +// * ПредставлениеТекущихПользовательскихНастроек - Строка +// * ПользовательскиеНастройки - СписокЗначений +// * Значение - Строка +// * Представление - Строка +// * ХранилищеПользовательскихНастроек - Соответствие из КлючИЗначение: +// ** Ключ - Строка +// ** Значение - ПользовательскиеНастройкиКомпоновкиДанных +// +Функция СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов) Экспорт + + ОписаниеВариантовОтчетов = Новый Массив; + + Для Каждого ОписаниеФайла Из ОписаниеФайлов Цикл + + ОписаниеВариантаОтчета = ОписаниеВариантаОтчета(ОписаниеФайла); + + ВариантОтчетаОснование = ВариантОтчетаОснование( + ОписаниеВариантаОтчета.ИмяОтчета, ОписаниеВариантаОтчета.КлючВарианта); + + Ссылка = ВариантОтчетаПоОписанию(ОписаниеВариантаОтчета, ВариантОтчетаОснование); + ОписаниеВариантаОтчета.Вставить("Ссылка", Ссылка); + + ОписаниеВариантовОтчетов.Добавить(ОписаниеВариантаОтчета); + + КонецЦикла; + + Возврат ОписаниеВариантовОтчетов; + +КонецФункции + // Параметры: // ОписаниеФайла - Структура: // * Хранение - Строка @@ -7445,7 +7526,7 @@ // Возвращаемое значение: // см. ОписаниеВариантаОтчета // -Функция СвойстваВариантОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт +Функция СвойстваВариантаОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт ОписаниеВариантаОтчета = ОписаниеВариантаОтчета(ОписаниеФайла); @@ -7718,6 +7799,70 @@ КонецФункции +// Параметры: +// ИмяОтчета - Строка +// КлючВарианта - Строка +// +// Возвращаемое значение: +// - СправочникСсылка.ВариантыОтчетов +// - Неопределено +// +Функция ВариантОтчетаОснование(ИмяОтчета, КлючВарианта) + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | Отчеты.Ссылка КАК Ссылка + |ПОМЕСТИТЬ Отчеты + |ИЗ + | Справочник.ИдентификаторыОбъектовМетаданных КАК Отчеты + |ГДЕ + | Отчеты.ПолноеИмя = &ИмяОтчета + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | Отчеты.Ссылка КАК Ссылка + |ИЗ + | Справочник.ИдентификаторыОбъектовРасширений КАК Отчеты + |ГДЕ + | Отчеты.ПолноеИмя = &ИмяОтчета + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ НЕОПРЕДЕЛЕНО + |; + | + |ВЫБРАТЬ + | ВариантыОтчетов.Ссылка + |ИЗ + | Отчеты КАК Отчеты + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыОтчетов КАК ВариантыОтчетов + | ПО ВариантыОтчетов.Отчет = Отчеты.Ссылка + |ГДЕ + | ВариантыОтчетов.КлючВарианта = &КлючВарианта"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + + ОписаниеИмениОтчета = СтрРазделить(ИмяОтчета, "."); + ИмяОбъекта = ?(ОписаниеИмениОтчета.Количество() > 1, ОписаниеИмениОтчета[1], ИмяОтчета); + + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + ТекстЗапросаДополнительныхОтчетов = МодульДополнительныеОтчетыИОбработки.ТекстЗапросаДополнительныхОтчетовПоИмениОбъекта(); + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ НЕОПРЕДЕЛЕНО", ТекстЗапросаДополнительныхОтчетов); + Запрос.УстановитьПараметр("ИмяОбъекта", ИмяОбъекта); + + КонецЕсли; + + Запрос.УстановитьПараметр("ИмяОтчета", ИмяОтчета); + Запрос.УстановитьПараметр("КлючВарианта", КлючВарианта); + + Выборка = Запрос.Выполнить().Выбрать(); + + Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено); + +КонецФункции + // Параметры: // ОписаниеВариантаОтчета - Структура: // * ОписаниеОшибки - Строка diff --git a/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl index 575c66e8b..c8790bc10 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовВызовСервера/Module.bsl @@ -66,6 +66,20 @@ КонецФункции +// Параметры: +// ОписаниеФайлов - Массив из Структура: +// * Хранение - Строка +// * Имя - Строка +// +// Возвращаемое значение: +// Массив из Структура +// +Функция СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов) Экспорт + + Возврат ВариантыОтчетов.СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов); + +КонецФункции + // Параметры: // ОписаниеФайла - Структура: // * Хранение - Строка @@ -75,9 +89,9 @@ // Возвращаемое значение: // см. ВариантыОтчетов.СвойстваВариантОтчетаИзФайла // -Функция СвойстваВариантОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт +Функция СвойстваВариантаОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование) Экспорт - Возврат ВариантыОтчетов.СвойстваВариантОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование); + Возврат ВариантыОтчетов.СвойстваВариантаОтчетаИзФайла(ОписаниеФайла, ВариантОтчетаОснование); КонецФункции diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl index 3538acdb6..acddc44a8 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl @@ -596,6 +596,41 @@ #Область ОбновлениеВариантаОтчетаИзФайла +Функция ИмяСобытияОбновленияВариантовОтчетовИзФайлов() Экспорт + + Возврат "ОбновитьВариантыОтчетовИзФайлов"; + +КонецФункции + +// Параметры: +// ОписаниеФайлов - Массив из Структура: +// * Хранение - Строка +// * Имя - Строка +// СвойстваВариантаОтчетаОснования - см. СвойстваВариантаОтчетаОснования +// +Процедура ОбновитьВариантыОтчетовИзФайлов(ОписаниеФайлов, СвойстваВариантаОтчетаОснования) Экспорт // АПК:299 является обработчиком оповещения (см. процедуру ОбновитьВариантОтчетаИзФайла модуля формы списка справочника ВариантыОтчетов). + + Если ТипЗнч(ОписаниеФайлов) <> Тип("Массив") Тогда + Возврат; + КонецЕсли; + + Если ОписаниеФайлов.Количество() = 1 Тогда + + ОбновитьВариантОтчетаИзФайла(ОписаниеФайлов[0], СвойстваВариантаОтчетаОснования); + Возврат; + + КонецЕсли; + + СвойстваВариантовОтчетов = ВариантыОтчетовВызовСервера.СвойстваВариантовОтчетовИзФайлов(ОписаниеФайлов); + + ТекстУведомления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Варианты отчетов (%1) загружены из файла'"), СвойстваВариантовОтчетов.Количество()); + + ПоказатьОповещениеПользователя(ТекстУведомления); + Оповестить(ИмяСобытияОбновленияВариантовОтчетовИзФайлов(), СвойстваВариантовОтчетов); + +КонецПроцедуры + // Параметры: // ОписаниеФайла - Структура: // * Хранение - Строка @@ -612,26 +647,26 @@ СвойстваВариантаОтчетаОснования = СвойстваВариантаОтчетаОснования(); КонецЕсли; - СвойстваВариантОтчета = ВариантыОтчетовВызовСервера.СвойстваВариантОтчетаИзФайла( + СвойстваВариантаОтчета = ВариантыОтчетовВызовСервера.СвойстваВариантаОтчетаИзФайла( ОписаниеФайла, СвойстваВариантаОтчетаОснования.Ссылка); - Если СвойстваВариантаОтчетаОснования.ИмяОтчета = СвойстваВариантОтчета.ИмяОтчета Тогда + Если СвойстваВариантаОтчетаОснования.ИмяОтчета = СвойстваВариантаОтчета.ИмяОтчета Тогда ПараметрыОбновленияФормы = Новый Структура("КлючВарианта"); - ЗаполнитьЗначенияСвойств(ПараметрыОбновленияФормы, СвойстваВариантОтчета); + ЗаполнитьЗначенияСвойств(ПараметрыОбновленияФормы, СвойстваВариантаОтчета); ОбновитьОткрытыеФормы(ПараметрыОбновленияФормы); ПоказатьОповещениеПользователя(НСтр("ru = 'Вариант отчета обновлен из файла'")); - ИначеЕсли СвойстваВариантаОтчетаОснования.ПредставлениеВарианта = СвойстваВариантОтчета.ПредставлениеВарианта Тогда + ИначеЕсли СвойстваВариантаОтчетаОснования.ПредставлениеВарианта = СвойстваВариантаОтчета.ПредставлениеВарианта Тогда - ОткрытьФормуОтчета(Неопределено, СвойстваВариантОтчета.Ссылка); + ОткрытьФормуОтчета(Неопределено, СвойстваВариантаОтчета.Ссылка); ПоказатьОповещениеПользователя(НСтр("ru = 'Вариант отчета найден и обновлен из файла'")); Иначе Обработчик = Новый ОписаниеОповещения( - "ОткрытьФормуВыбранногоВариантаОтчета", ВариантыОтчетовКлиент, СвойстваВариантОтчета.Ссылка); + "ОткрытьФормуВыбранногоВариантаОтчета", ВариантыОтчетовКлиент, СвойстваВариантаОтчета.Ссылка); ШаблонТекстаВопроса = НСтр("ru = 'Выбраны настройки варианта отчета ""%1"", |которые не совпадают с ""%2"". @@ -641,7 +676,7 @@ ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонТекстаВопроса, - СвойстваВариантОтчета.ПредставлениеВарианта, + СвойстваВариантаОтчета.ПредставлениеВарианта, СвойстваВариантаОтчетаОснования.ПредставлениеВарианта); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl index c136563b5..e9395f7bd 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl @@ -116,12 +116,6 @@ КонецЕсли; КонецФункции -Функция СвойстваСохраненияВариантаОтчета() Экспорт - Возврат "ВариантОтчета, ИмяОтчета, НастройкиВариантаОтчета, - |КлючТекущегоВарианта, ПредставлениеТекущегоВарианта, - |КлючТекущихПользовательскихНастроек, ПредставлениеТекущихПользовательскихНастроек"; -КонецФункции - #Область ОбменПользовательскимиНастройками Функция ИмяДействияПрименитьПереданныеНастройки() Экспорт diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl index cea7348fc..12344355e 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl @@ -107,6 +107,241 @@ КонецФункции +#Область ПредставлениеНастроекКомпоновкиДанных + +Функция ПредставлениеЭлементовСтруктуры(ЭлементыСтруктуры) Экспорт + + ПредставлениеЭлементов = Новый Массив; + + Для Каждого Элемент Из ЭлементыСтруктуры Цикл + + Если Не Элемент.Использование Тогда + Продолжить; + КонецЕсли; + + ПредставлениеЭлемента = ПредставлениеЭлементаСтруктуры(Элемент); + + Если ЗначениеЗаполнено(ПредставлениеЭлемента) Тогда + ПредставлениеЭлементов.Добавить(ПредставлениеЭлемента); + КонецЕсли; + + КонецЦикла; + + Возврат СтрСоединить(ПредставлениеЭлементов, ", "); + +КонецФункции + +Функция ПредставлениеЭлементаСтруктуры(Элемент) Экспорт + + ПредставлениеЭлемента = ""; + + Если ЗначениеЗаполнено(Элемент.ПредставлениеПользовательскойНастройки) Тогда + + ПредставлениеЭлемента = Элемент.ПредставлениеПользовательскойНастройки; + + Иначе + + ТипЭлемента = ТипЗнч(Элемент); + + ПараметрИспользованияЗаголовка = Элемент.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок"); + ПараметрЗаголовка = Элемент.ПараметрыВывода.Элементы.Найти("Заголовок"); + + Если ЗначениеЗаполнено(ПараметрЗаголовка.Значение) + И (ПараметрЗаголовка.Использование + Или ПараметрИспользованияЗаголовка.Использование + И ПараметрИспользованияЗаголовка.Значение <> ТипВыводаТекстаКомпоновкиДанных.НеВыводить) Тогда + + ПредставлениеЭлемента = ПараметрЗаголовка.Значение; + + ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Тогда + + ПредставлениеЭлемента = НСтр("ru = 'Таблица'"); + + ИначеЕсли ТипЭлемента = Тип("ДиаграммаКомпоновкиДанных") Тогда + + ПредставлениеЭлемента = НСтр("ru = 'Диаграмма'"); + + ИначеЕсли ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") + Или ТипЭлемента = Тип("ГруппировкаДиаграммыКомпоновкиДанных") + Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + ПредставлениеЭлемента = ПредставлениеПолейГруппировки(Элемент); + + КонецЕсли; + + КонецЕсли; + + Возврат ПредставлениеЭлемента; + +КонецФункции + +Функция ПредставлениеПолейГруппировки(Группировка, ПометкаУдаления = Ложь) Экспорт + + Если ЗначениеЗаполнено(Группировка.ПредставлениеПользовательскойНастройки) Тогда + Возврат Группировка.ПредставлениеПользовательскойНастройки; + КонецЕсли; + + Поля = Группировка.ПоляГруппировки; // ПоляГруппировкиКомпоновкиДанных + + Если Поля.Элементы.Количество() = 0 Тогда + Возврат НСтр("ru = '<Детальные записи>'"); + КонецЕсли; + + ПредставлениеПолей = Новый Массив; + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если Не Элемент.Использование + Или ТипЗнч(Элемент) = Тип("АвтоПолеГруппировкиКомпоновкиДанных") Тогда + + Продолжить; + КонецЕсли; + + ОписаниеПоля = Поля.ДоступныеПоляПолейГруппировок.НайтиПоле(Элемент.Поле); + + Если ОписаниеПоля = Неопределено Тогда + + ПометкаУдаления = Истина; + ПредставлениеПоля = Строка(Элемент.Поле); + + Иначе + ПредставлениеПоля = ОписаниеПоля.Заголовок; + КонецЕсли; + + Если Элемент.ТипГруппировки <> ТипГруппировкиКомпоновкиДанных.Элементы Тогда + ПредставлениеПоля = ПредставлениеПоля + " (" + Элемент.ТипГруппировки + ")"; + КонецЕсли; + + ПредставлениеПолей.Добавить(ПредставлениеПоля); + КонецЦикла; + + Если ПредставлениеПолей.Количество() = 0 Тогда + Возврат НСтр("ru = '<Детальные записи>'"); + КонецЕсли; + + Возврат СтрСоединить(ПредставлениеПолей, ", "); + +КонецФункции + +Функция ПредставлениеВыбранныхПолей(ВыбранныеПоля, Коллекция = Неопределено, ПредставлениеПолей = Неопределено) Экспорт + + Если ЗначениеЗаполнено(ВыбранныеПоля.ПредставлениеПользовательскойНастройки) Тогда + Возврат ВыбранныеПоля.ПредставлениеПользовательскойНастройки; + КонецЕсли; + + Если Коллекция = Неопределено Тогда + Коллекция = ВыбранныеПоля; + КонецЕсли; + + Если ПредставлениеПолей = Неопределено Тогда + ПредставлениеПолей = Новый Массив; + КонецЕсли; + + Для Каждого Элемент Из Коллекция.Элементы Цикл + + Если Не Элемент.Использование Тогда + Продолжить; + КонецЕсли; + + Если ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда + + ПредставлениеПолей.Добавить(НСтр("ru = 'Авто'")); + + ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + ПредставлениеВыбранныхПолей(ВыбранныеПоля, Элемент, ПредставлениеПолей); + + ИначеЕсли ЗначениеЗаполнено(Элемент.Заголовок) Тогда + + ПредставлениеПолей.Добавить(Элемент.Заголовок); + + Иначе + + ОписаниеПоля = ВыбранныеПоля.ДоступныеПоляВыбора.НайтиПоле(Элемент.Поле); // ДоступноеПолеКомпоновкиДанных + + ПредставлениеПоля = ?(ОписаниеПоля = Неопределено, Строка(Элемент.Поле), ОписаниеПоля.Заголовок); + ПредставлениеПолей.Добавить(ПредставлениеПоля); + + КонецЕсли; + + КонецЦикла; + + Возврат СтрСоединить(ПредставлениеПолей, ", "); + +КонецФункции + +Функция ПредставлениеУсловногоОформления(УсловноеОформление) Экспорт + + ПредставлениеОформления = Новый Массив; + + Для Каждого Элемент Из УсловноеОформление.Элементы Цикл + + Если Не Элемент.Использование Тогда + Продолжить; + КонецЕсли; + + ПредставлениеЭлемента = ОтчетыКлиентСервер.ПредставлениеЭлементаУсловногоОформления(Элемент, Неопределено, ""); + + Если ЗначениеЗаполнено(ПредставлениеЭлемента) Тогда + ПредставлениеОформления.Добавить(ПредставлениеЭлемента); + КонецЕсли; + + КонецЦикла; + + Если ПредставлениеОформления.Количество() = 0 Тогда + Возврат НСтр("ru = 'Оформление'"); + КонецЕсли; + + Возврат СтрСоединить(ПредставлениеОформления, ", "); + +КонецФункции + +Функция ПредставлениеСортировки(Сортировка) Экспорт + + ПредставлениеСортировки = Новый Массив; + + Для Каждого Элемент Из Сортировка.Элементы Цикл + + Если Не Элемент.Использование Тогда + Продолжить; + КонецЕсли; + + ПредставлениеЭлемента = ПредставлениеЭлементаСортировки(Элемент); + + Если ЗначениеЗаполнено(ПредставлениеЭлемента) Тогда + ПредставлениеСортировки.Добавить(ПредставлениеЭлемента); + КонецЕсли; + + КонецЦикла; + + Если ПредставлениеСортировки.Количество() = 0 Тогда + Возврат НСтр("ru = 'Сортировка'"); + КонецЕсли; + + Возврат СтрСоединить(ПредставлениеСортировки, ", "); + +КонецФункции + +Функция ПредставлениеЭлементаСортировки(Элемент) Экспорт + + Если Не Элемент.Использование Тогда + Возврат ""; + КонецЕсли; + + Если ТипЗнч(Элемент) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда + Возврат НСтр("ru = 'Авто'"); + КонецЕсли; + + Если Элемент.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда + Возврат Строка(Элемент.Поле); + КонецЕсли; + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (убыв)'"), Элемент.Поле); + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -345,7 +580,7 @@ ИндексГруппировки.ПорядокГруппировки = ПорядокГруппировки; ИндексГруппировки.ИдентификаторГруппировки = Настройки.ПолучитьИдентификаторПоОбъекту(Группировка); - ИндексГруппировки.ПредставлениеГруппировки = Строка(Группировка.ПоляГруппировки); + ИндексГруппировки.ПредставлениеГруппировки = ПредставлениеПолейГруппировки(Группировка); ИндексГруппировки.СодержитРодительскиеГруппировки = СодержитРодительскиеГруппировки(Группировка); ИндексГруппировки.СодержитДочерниеГруппировки = СодержитДочерниеГруппировки(Группировка); @@ -437,7 +672,7 @@ КонецФункции Процедура ИндексироватьВыбранныеПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) + Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) // АПК:134 реализация сложной логики для формирования индекса структуры отчета. Если Поля = Неопределено Тогда Поля = Группировка.Выбор; @@ -483,7 +718,7 @@ КонецПроцедуры Процедура ИндексироватьВыбранныеПоляНастроекОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, - Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) + Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) // АПК:134 реализация сложной логики для формирования индекса структуры отчета. ИспользуемыеНастройки = ИспользуемыеНастройкиГруппировкиОтчета(Настройки, Группировка); @@ -618,10 +853,15 @@ ОписаниеПоля.Вставить("ИдентификаторПоля", Родитель.ПолучитьИдентификаторПоОбъекту(Поле)); ОписаниеПоля.Вставить("ПредставлениеПоля", Строка(Поле.Поле)); ОписаниеПоля.Вставить("ТипПоля", ТипЗнч(Поле)); - ОписаниеПоля.Вставить("ИспользуетсяВПоляхГруппировки", ИспользуемыеПоляГруппировки[Поле.Поле] <> Неопределено); ОписаниеПоля.Вставить("ТипЗначения", Новый ОписаниеТипов("Неопределено")); ОписаниеПоля.Вставить("Ресурс", Ложь); + ПолеГруппировки = ИспользуемыеПоляГруппировки[Поле.Поле]; + ТипГруппировки = ?(ПолеГруппировки = Неопределено, ТипГруппировкиКомпоновкиДанных.Элементы, ПолеГруппировки.ТипГруппировки); + + ОписаниеПоля.Вставить("ИспользуетсяВПоляхГруппировки", ПолеГруппировки <> Неопределено); + ОписаниеПоля.Вставить("ТипГруппировки", ТипГруппировки); + ДоступноеПоле = Неопределено; Если ОписаниеПоля.ТипПоля = Тип("ПолеГруппировкиКомпоновкиДанных") Тогда @@ -804,6 +1044,7 @@ И ПолеГруппировки.ИспользуетсяВПоляхГруппировки; Индекс = ИндексСтруктурыОтчета.Найти(ПолеГруппировки.ИдентификаторИндекса, "ИдентификаторИндекса"); + Индекс.СгруппироватьПоВыбранномуПолю = Не ЭтоПолеГруппировкиКолонки; Индекс.ВставитьПолеСлева = Не ЭтоПолеГруппировкиКолонки; Индекс.ВставитьПолеСправа = Не ЭтоПолеГруппировкиКолонки; Индекс.ВставитьГруппировкуВыше = Не ЭтоПолеГруппировкиКолонки И Не ЭтоРесурс; @@ -927,6 +1168,7 @@ ОписаниеТипов = Новый ОписаниеТипов("ОписаниеТипов"); ОписаниеТипа = Новый ОписаниеТипов("Тип"); ОписаниеИдентификатора = Новый ОписаниеТипов("УникальныйИдентификатор"); + ОписаниеТипаГруппировки = Новый ОписаниеТипов("ТипГруппировкиКомпоновкиДанных"); Индекс = Новый ТаблицаЗначений; Индекс.Колонки.Добавить("ПорядокРаздела", ОписаниеЧисла); @@ -941,7 +1183,9 @@ Индекс.Колонки.Добавить("Поле", ОписаниеПоля); Индекс.Колонки.Добавить("ТипПоля", ОписаниеТипа); + Индекс.Колонки.Добавить("ИспользуетсяВПоляхГруппировки", ОписаниеПризнака); + Индекс.Колонки.Добавить("ТипГруппировки", ОписаниеТипаГруппировки); Индекс.Колонки.Добавить("ПредставлениеГруппировки", ОписаниеСтроки); Индекс.Колонки.Добавить("ПредставлениеПоля", ОписаниеСтроки); @@ -954,6 +1198,8 @@ Индекс.Колонки.Добавить("ПолеСортируется", ОписаниеПризнака); Индекс.Колонки.Добавить("НаправлениеСортировки"); + Индекс.Колонки.Добавить("СгруппироватьПоВыбранномуПолю", ОписаниеПризнака); + Индекс.Колонки.Добавить("ВставитьПолеСлева", ОписаниеПризнака); Индекс.Колонки.Добавить("ВставитьПолеСправа", ОписаниеПризнака); Индекс.Колонки.Добавить("ВставитьГруппировкуВыше", ОписаниеПризнака); @@ -1052,13 +1298,6 @@ КонецПроцедуры -// Параметры: -// РезультатОтчета - ПолеФормы, РасширениеПоляФормыДляПоляТабличногоДокумента -// РазрезСвойствЗаголовков - см. СтандартныйРазрезСвойствЗаголовковОтчета -// -// Возвращаемое значение: -// СписокЗначений -// Функция ГраницыРазделовОтчета(РезультатОтчета, РазрезСвойствЗаголовков) Границы = Новый СписокЗначений; @@ -1341,6 +1580,7 @@ // * ПереместитьПолеВыше - Булево // * ПереместитьПолеВправо - Булево // * ПереместитьПолеВлево - Булево +// * СгруппироватьПоВыбранномуПолю - Булево // * ВставитьГруппировкуНиже - Булево // * ВставитьГруппировкуВыше - Булево // * ВставитьПолеСправа - Булево @@ -1408,7 +1648,11 @@ Свойства.Вставить("ТипЗначения", Неопределено); Свойства.Вставить("ТипПоля", Неопределено); + Свойства.Вставить("ИспользуетсяВПоляхГруппировки", Ложь); + Свойства.Вставить("ТипГруппировки", Неопределено); + + Свойства.Вставить("СгруппироватьПоВыбранномуПолю", Ложь); Свойства.Вставить("ВставитьПолеСлева", Ложь); Свойства.Вставить("ВставитьПолеСправа", Ложь); @@ -1446,7 +1690,7 @@ Если Не РежимВариантаОтчета(Форма.КлючТекущегоВарианта) Или Не Форма.НастройкиОтчета.РазрешеноИзменятьВарианты - Или ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда + Или Не ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда Возврат Неопределено; КонецЕсли; @@ -1460,12 +1704,7 @@ Данные = ПолучитьИзВременногоХранилища(Форма.ОтчетДанныеРасшифровки); ЭлементРасшифровки = Данные.Элементы.Получить(Расшифровка); - Родители = ЭлементРасшифровки.ПолучитьРодителей(); - Родитель = ?(Родители.Количество() = 0, Неопределено, Родители[0]); - - Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") - Или ТипЗнч(Родитель) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда - + Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда ТипЭлементаРасшифровки = ВариантыОтчетовСлужебныйКлиентСервер.ТипЭлементаРасшифровкиГруппировка(); Иначе ТипЭлементаРасшифровки = ТипРеквизит(); @@ -1671,7 +1910,7 @@ Функция ТипРеквизит() - Возврат "Реквизит"; + Возврат "Реквизит"; КонецФункции @@ -1833,7 +2072,7 @@ КонецЕсли; - Если ЭтоЧисло(Ячейка.Текст) Тогда + Если ОбщегоНазначенияКлиентСервер.ЭтоЧисло(Ячейка.Текст) Тогда ОписаниеЧисла = Новый ОписаниеТипов("Число"); ЗначениеЯчейки.Значение = ОписаниеЧисла.ПривестиЗначение(Ячейка.Текст); @@ -1841,7 +2080,7 @@ КонецЕсли; - Значение = СтрокаВДату(ЗначениеЯчейки.Значение); + Значение = ОбщегоНазначенияКлиентСервер.СтрокаВДату(ЗначениеЯчейки.Значение); Если ЗначениеЗаполнено(Значение) Тогда ЗначениеЯчейки.Значение = Значение; @@ -1871,142 +2110,6 @@ КонецФункции -#Область ПроверкаТипаЗначения - -// Возвращает признак того, что переданное значение является, либо не является, числом. -// -// Параметры: -// ПроверяемоеЗначение - Строка - значение, которое проверяется на соответствие числу. -// -// Возвращаемое значение: -// Булево - признак того, что переданное значение является, либо не является, числом. -// -Функция ЭтоЧисло(Знач ПроверяемоеЗначение) - - Если ПроверяемоеЗначение = "0" Тогда - Возврат Истина; - КонецЕсли; - - ОписаниеЧисла = Новый ОписаниеТипов("Число"); - - Возврат ОписаниеЧисла.ПривестиЗначение(ПроверяемоеЗначение) <> 0; - -КонецФункции - -#КонецОбласти - -#Область ПриведениеЗначения - -// Приводит строковое значение к дате. -// -// Параметры: -// Значение - Строка - строковое значение, которое приводится к дате. -// -// Возвращаемое значение: -// Дата - приведенное значение. -// -Функция СтрокаВДату(Знач Значение) - - ПустаяДата = Дата(1, 1, 1); - - Если Не ЗначениеЗаполнено(Значение) Тогда - Возврат ПустаяДата; - КонецЕсли; - - ОписаниеДаты = Новый ОписаниеТипов("Дата"); - Дата = ОписаниеДаты.ПривестиЗначение(Значение); - - Если ТипЗнч(Дата) = Тип("Дата") - И ЗначениеЗаполнено(Дата) Тогда - - Возврат Дата; - КонецЕсли; - - #Область ПодготовкаЧастейДаты - - КоличествоСимволов = СтрДлина(Значение); - - Если КоличествоСимволов > 25 Тогда - Возврат ПустаяДата; - КонецЕсли; - - ЧастиЗначения = Новый Массив; - ЧастьЗначения = ""; - - Для НомерСимвола = 1 По КоличествоСимволов Цикл - - Символ = Сред(Значение, НомерСимвола, 1); - - Если ЭтоЧисло(Символ) Тогда - - ЧастьЗначения = ЧастьЗначения + Символ; - - Иначе - - Если Не ПустаяСтрока(ЧастьЗначения) Тогда - ЧастиЗначения.Добавить(ЧастьЗначения); - КонецЕсли; - - ЧастьЗначения = ""; - - КонецЕсли; - - Если НомерСимвола = КоличествоСимволов - И Не ПустаяСтрока(ЧастьЗначения) Тогда - - ЧастиЗначения.Добавить(ЧастьЗначения); - КонецЕсли; - - КонецЦикла; - - Если ЧастиЗначения.Количество() < 3 Тогда - Возврат ПустаяДата; - КонецЕсли; - - Если ЧастиЗначения.Количество() < 4 Тогда - ЧастиЗначения.Добавить("00"); - КонецЕсли; - - Если ЧастиЗначения.Количество() < 5 Тогда - ЧастиЗначения.Добавить("00"); - КонецЕсли; - - Если ЧастиЗначения.Количество() < 6 Тогда - ЧастиЗначения.Добавить("00"); - КонецЕсли; - - #КонецОбласти - - // Если формат ггггММддЧЧммсс: - НормализованноеЗначение = ЧастиЗначения[2] + ЧастиЗначения[1] + ЧастиЗначения[0] - + ЧастиЗначения[3] + ЧастиЗначения[4] + ЧастиЗначения[5]; - - Дата = ОписаниеДаты.ПривестиЗначение(НормализованноеЗначение); - - Если ТипЗнч(Дата) = Тип("Дата") - И ЗначениеЗаполнено(Дата) Тогда - - Возврат Дата; - КонецЕсли; - - // Если формат ггггддММЧЧммсс - НормализованноеЗначение = ЧастиЗначения[2] + ЧастиЗначения[0] + ЧастиЗначения[1] - + ЧастиЗначения[3] + ЧастиЗначения[4] + ЧастиЗначения[5]; - - Дата = ОписаниеДаты.ПривестиЗначение(НормализованноеЗначение); - - Если ТипЗнч(Дата) = Тип("Дата") - И ЗначениеЗаполнено(Дата) Тогда - - Возврат Дата; - КонецЕсли; - - Возврат ПустаяДата; - -КонецФункции - -#КонецОбласти - #КонецОбласти #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl index 859a12cca..453bb3b1d 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl @@ -155,17 +155,17 @@ СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета Элементы = Форма.Элементы; - Заголовки = СвойстваРезультата.Заголовки[Область.Имя]; + СвойстваЗаголовка = СвойстваРезультата.Заголовки[Область.Имя]; ЭтоРасшифровка = (ТипЗнч(Область.Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных")); - Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость = (ТипЗнч(Заголовки) = Тип("Структура")) - И ТипЗнч(Заголовки.Поле) = Тип("ПолеКомпоновкиДанных"); + Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость = (ТипЗнч(СвойстваЗаголовка) = Тип("Структура")) + И ТипЗнч(СвойстваЗаголовка.Поле) = Тип("ПолеКомпоновкиДанных"); Элементы.КонтекстноеМенюОбластиДанных.Видимость = Не Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник И ЭтоРасшифровка; - Элементы.КонтекстноеМенюОбластиОбщееМенюУровниГруппировок.Видимость = Не ЭтоРасшифровка; + Элементы.ГруппаУровниГруппировокКонтекстноеМеню.Видимость = Не ЭтоРасшифровка; Если Не ЭтоРасшифровка И (Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость @@ -176,7 +176,17 @@ Элементы.КонтекстноеМенюОбластиОбщееРедактирование.Вид = ВидГруппыФормы.ГруппаКнопок; КонецЕсли; - ВариантыОтчетовСлужебныйКлиентСервер.ОпределитьДоступностьДействийКонтекстногоМеню(Форма, Заголовки); + ВариантыОтчетовСлужебныйКлиентСервер.ОпределитьДоступностьДействийКонтекстногоМеню(Форма, СвойстваЗаголовка); + + Если Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость Тогда + + ЗаголовокКнопки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сгруппировать по полю %1'"), СвойстваЗаголовка.Текст); + + ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "КонтекстноеМенюОбластиЗаголовкаСгруппироватьПоВыбранномуПолю", "Заголовок", ЗаголовокКнопки); + + КонецЕсли; КонецПроцедуры @@ -192,6 +202,65 @@ #Область ВставкаПоляИлиГруппировки +Процедура СгруппироватьПоВыбранномуПолю(Форма, Команда) Экспорт + + Если Не ДействиеДоступно(Форма, Команда) Тогда + Возврат; + КонецЕсли; + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + + ВыбранноеПоле = Настройки.ДоступныеПоляГруппировок.НайтиПоле(СвойстваЗаголовка.Поле); + Если ВыбранноеПоле = Неопределено Тогда + Возврат; + КонецЕсли; + + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + Группировки = Раздел.Строки; + Иначе + Группировки = Раздел.Родитель.Структура; + КонецЕсли; + + ПеремещаемыеГруппировки = Новый Массив; + + Для Каждого Элемент Из Группировки Цикл + ПеремещаемыеГруппировки.Добавить(Элемент); + КонецЦикла; + + ДетальныеЗаписи = ДетальныеЗаписи(Группировки); + + Если ТипЗнч(Группировки) = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда + НоваяГруппировка = Группировки.Вставить(0, Тип("ГруппировкаКомпоновкиДанных")); // ГруппировкаКомпоновкиДанных + Иначе + НоваяГруппировка = Группировки.Вставить(0); + КонецЕсли; + + НовоеПоле = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + НовоеПоле.Поле = ВыбранноеПоле.Поле; + НовоеПоле.Использование = Истина; + + НоваяГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + НоваяГруппировка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); + + Если ДетальныеЗаписи <> Неопределено Тогда + + ПоискЭлементов = Новый Соответствие; + ОтчетыКлиентСервер.СкопироватьРекурсивно( + Настройки, ДетальныеЗаписи, НоваяГруппировка.Структура, 0, ПоискЭлементов); + + КонецЕсли; + + Для Каждого Группировка Из ПеремещаемыеГруппировки Цикл + Группировки.Удалить(Группировка); + КонецЦикла; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + Процедура ВставитьПолеСлева(Форма, Команда) Экспорт ВыбратьПолеОтчетаИзМеню(Форма, Команда); @@ -268,11 +337,15 @@ ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; ПараметрыРаскраски.Условие.ПравоеЗначение = 0; + ПараметрыРаскраски.Представление = НСтр("ru = 'Оформить отрицательные красным'"); + Иначе ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияУсловияОформления(Значение); ПараметрыРаскраски.Условие.ПравоеЗначение = Значение; + ПараметрыРаскраски.Представление = НСтр("ru = 'Оформить красным'"); + КонецЕсли; ЭлементыСтиля = СтандартныеПодсистемыКлиент.ЭлементыСтиля(); @@ -315,11 +388,15 @@ ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; ПараметрыРаскраски.Условие.ПравоеЗначение = 0; + ПараметрыРаскраски.Представление = НСтр("ru = 'Оформить положительные зеленым'"); + Иначе ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияУсловияОформления(Значение); ПараметрыРаскраски.Условие.ПравоеЗначение = Значение; + ПараметрыРаскраски.Представление = НСтр("ru = 'Оформить зеленым'"); + КонецЕсли; ЭлементыСтиля = СтандартныеПодсистемыКлиент.ЭлементыСтиля(); @@ -401,10 +478,10 @@ СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); КонецЕсли; + ПараметрыШириныКолонки = ПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, "Ширина"); + Если ШиринаКолонки = Неопределено Тогда - ПараметрыШириныКолонки = ПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, "Ширина"); - ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("Форма", Форма); ПараметрыОбработчика.Вставить("Команда", Команда); @@ -441,11 +518,18 @@ Раздел = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); Группировка = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); - ИдентификаторГруппировки = ИспользуемыеНастройки.ПолучитьИдентификаторПоОбъекту(Группировка); - ИдентификаторОформления = ИдентификаторЭлементаОформленияГруппировкиОтчета(Группировка, СвойстваЗаголовка.Поле); + Если СвойстваЗаголовка.КоличествоРазделов = 1 Тогда + ИдентификаторГруппировки = Неопределено; + ИдентификаторОформления = ИдентификаторЭлементаОформленияГруппировкиОтчета(ИспользуемыеНастройки, СвойстваЗаголовка.Поле); + Иначе + ИдентификаторГруппировки = ИспользуемыеНастройки.ПолучитьИдентификаторПоОбъекту(Группировка); + ИдентификаторОформления = ИдентификаторЭлементаОформленияГруппировкиОтчета(Группировка, СвойстваЗаголовка.Поле); + КонецЕсли; + + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); ПараметрыОформления = Новый Структура; - ПараметрыОформления.Вставить("КомпоновщикНастроек", КомпоновщикНастроекОтчета(Форма)); + ПараметрыОформления.Вставить("КомпоновщикНастроек", КомпоновщикНастроек); ПараметрыОформления.Вставить("НастройкиОтчета", Форма.НастройкиОтчета); ПараметрыОформления.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторГруппировки); ПараметрыОформления.Вставить("ИдентификаторКД", ИдентификаторОформления); @@ -455,11 +539,13 @@ ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("Форма", Форма); + ПараметрыОбработчика.Вставить("Настройки", КомпоновщикНастроек.Настройки); ПараметрыОбработчика.Вставить("Раздел", Раздел); ПараметрыОбработчика.Вставить("Группировка", Группировка); ПараметрыОбработчика.Вставить("Поле", СвойстваЗаголовка.Поле); ПараметрыОбработчика.Вставить("Ресурс", СвойстваЗаголовка.Ресурс); ПараметрыОбработчика.Вставить("Действие", ДействиеКоманды(Команда)); + ПараметрыОбработчика.Вставить("КоличествоРазделов", СвойстваЗаголовка.КоличествоРазделов); Обработчик = Новый ОписаниеОповещения("ПослеИзмененияЭлементаОформленияГруппировкиОтчета", ЭтотОбъект, ПараметрыОбработчика); @@ -1360,6 +1446,7 @@ Оформление.Значение = ЭлементыСтиля.ЦветФонаВнимание; ПараметрыРаскраски.Оформление.Добавить(Оформление); + ПараметрыРаскраски.Представление = НСтр("ru = 'Оформить желтым'"); РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка); @@ -1390,6 +1477,7 @@ ПараметрыРаскраски = Новый Структура; ПараметрыРаскраски.Вставить("Условие", Условие); ПараметрыРаскраски.Вставить("Оформление", Новый Массив); + ПараметрыРаскраски.Вставить("Представление", ""); Возврат ПараметрыРаскраски; @@ -1418,6 +1506,14 @@ Процедура РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка) Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + + Если СвойстваЗаголовка.КоличествоРазделов = 1 Тогда + + ПрименитьРаскраскуГруппировкиОтчета(Настройки, ПараметрыРаскраски, СвойстваЗаголовка); + Возврат; + + КонецЕсли; + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда @@ -1444,20 +1540,7 @@ Иначе - ПолеОформления = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаскраски.Условие, "ЛевоеЗначение"); - - ПараметрыРаскраскиПрименимы = ОформлениеПрименимоКГруппировке( - Группировка, ПолеОформления, СвойстваЗаголовка.Ресурс); - - Если ПараметрыРаскраскиПрименимы Тогда - - Раскраска = РаскраскаГруппировкиОтчета(Группировка.УсловноеОформление, ПараметрыРаскраски); - - Если Раскраска = Неопределено Тогда - ДобавитьРаскраскуГруппировкиОтчета(Группировка.УсловноеОформление, ПараметрыРаскраски); - КонецЕсли; - - КонецЕсли; + ПрименитьРаскраскуГруппировкиОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка); РаскраситьГруппировкиРазделаОтчета(Группировка.Структура, ПараметрыРаскраски, СвойстваЗаголовка) @@ -1465,6 +1548,25 @@ КонецПроцедуры +Процедура ПрименитьРаскраскуГруппировкиОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка) + + ПолеОформления = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаскраски.Условие, "ЛевоеЗначение"); + + ПараметрыРаскраскиПрименимы = ОформлениеПрименимоКГруппировке( + Группировка, ПолеОформления, СвойстваЗаголовка.Ресурс); + + Если ПараметрыРаскраскиПрименимы Тогда + + Раскраска = РаскраскаГруппировкиОтчета(Группировка.УсловноеОформление, ПараметрыРаскраски); + + Если Раскраска = Неопределено Тогда + ДобавитьРаскраскуГруппировкиОтчета(Группировка.УсловноеОформление, ПараметрыРаскраски); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + // Параметры: // Группировка - НастройкиКомпоновкиДанных // - НастройкиВложенногоОбъектаКомпоновкиДанных @@ -1484,6 +1586,12 @@ // Функция ОформлениеПрименимоКГруппировке(Группировка, Поле, ЭтоРесурс) + Если ТипЗнч(Группировка) <> Тип("ГруппировкаКомпоновкиДанных") + И ТипЗнч(Группировка)<> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + Возврат Истина; + КонецЕсли; + ПоляГруппировки = Группировка.ПоляГруппировки; Возврат ЭтоРесурс @@ -1571,6 +1679,8 @@ Оформление.Оформление.УстановитьЗначениеПараметра(Параметр.Параметр, Параметр.Значение); КонецЦикла; + Оформление.ПредставлениеПользовательскойНастройки = ПараметрыРаскраски.Представление; + УстановитьОбластьОформленияГруппировкиОтчета(Оформление); КонецПроцедуры @@ -1644,9 +1754,17 @@ КонецЕсли; Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); - Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); - Для Каждого Элемент Из Группировка.УсловноеОформление.Элементы Цикл + Если СвойстваЗаголовка.КоличествоРазделов = 1 Тогда + Оформление = Настройки.УсловноеОформление; + Иначе + + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Оформление = Группировка.УсловноеОформление; + + КонецЕсли; + + Для Каждого Элемент Из Оформление.Элементы Цикл ПараметрыОформления = Элемент.Оформление.Элементы; @@ -1699,7 +1817,13 @@ Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); - Элемент = Группировка.УсловноеОформление.Элементы.Добавить(); + Если Ориентация = "Ширина" + И СвойстваЗаголовка.КоличествоРазделов = 1 Тогда + + Элемент = Настройки.УсловноеОформление.Элементы.Добавить(); + Иначе + Элемент = Группировка.УсловноеОформление.Элементы.Добавить(); + КонецЕсли; ПараметрыОформления = Элемент.Оформление.Элементы; @@ -1876,22 +2000,51 @@ Возврат; КонецЕсли; - ОформитьРазделОтчета( - ДополнительныеПараметры.Раздел, - Результат.ЭлементКД, - ДополнительныеПараметры.Поле, - ДополнительныеПараметры.Ресурс); + Настройки = ИспользуемыеНастройки(ДополнительныеПараметры.Форма); + + Если Результат.Свойство("ОписаниеФормул") Тогда + ДобавитьФормулы(Настройки, Настройки.ДоступныеПоляВыбора, Результат.ОписаниеФормул); + КонецЕсли; + + Раздел = ДополнительныеПараметры.Раздел; + ОбразецОформления = Результат.ЭлементКД; + Поле = ДополнительныеПараметры.Поле; + ЭтоРесурс = ДополнительныеПараметры.Ресурс; + + Если ДополнительныеПараметры.КоличествоРазделов = 1 Тогда + + ПрименитьОформлениеГруппировкиОтчета(ДополнительныеПараметры.Настройки, ОбразецОформления, Поле, ЭтоРесурс); + + ИначеЕсли ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + + ОформитьГруппировкиРазделаОтчета(Раздел.Строки, Результат.ЭлементКД, Поле, ЭтоРесурс); + Иначе + ОформитьГруппировкуРазделаОтчета(Раздел, Результат.ЭлементКД, Поле, ЭтоРесурс); + КонецЕсли; ОповеститьОЗавершенииКонтекстнойНастройки(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Действие); КонецПроцедуры -Процедура ОформитьРазделОтчета(Раздел, ОбразецОформления, Поле, ЭтоРесурс) +Процедура ПрименитьОформлениеГруппировкиОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс) - Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда - ОформитьГруппировкиРазделаОтчета(Раздел.Строки, ОбразецОформления, Поле, ЭтоРесурс); - Иначе - ОформитьГруппировкуРазделаОтчета(Раздел, ОбразецОформления, Поле, ЭтоРесурс); + ОформлениеПрименимоКГруппировке = ОформлениеПрименимоКГруппировке(Группировка, Поле, ЭтоРесурс); + + Если ОформлениеПрименимоКГруппировке Тогда + + Оформление = Группировка.УсловноеОформление; + ЭлементОформления = ЭлементОформленияГруппировкиОтчета(Группировка, Поле); + + Если ЭлементОформления = Неопределено Тогда + ЭлементОформления = Оформление.Элементы.Добавить(); + Иначе + СброситьОформлениеГруппировкиОтчета(ЭлементОформления, Ложь); + КонецЕсли; + + ОтчетыКлиентСервер.ЗаполнитьСвойстваРекурсивно(Оформление, ЭлементОформления, ОбразецОформления); + + УстановитьОбластьОформленияГруппировкиОтчета(ЭлементОформления); + КонецЕсли; КонецПроцедуры @@ -1912,24 +2065,7 @@ Иначе - ОформлениеПрименимоКГруппировке = ОформлениеПрименимоКГруппировке(Группировка, Поле, ЭтоРесурс); - - Если ОформлениеПрименимоКГруппировке Тогда - - Оформление = Группировка.УсловноеОформление; - ЭлементОформления = ЭлементОформленияГруппировкиОтчета(Группировка, Поле); - - Если ЭлементОформления = Неопределено Тогда - ЭлементОформления = Оформление.Элементы.Добавить(); - Иначе - СброситьОформлениеГруппировкиОтчета(ЭлементОформления, Ложь); - КонецЕсли; - - ОтчетыКлиентСервер.ЗаполнитьСвойстваРекурсивно(Оформление, ЭлементОформления, ОбразецОформления); - - УстановитьОбластьОформленияГруппировкиОтчета(ЭлементОформления); - - КонецЕсли; + ПрименитьОформлениеГруппировкиОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс); ОформитьГруппировкиРазделаОтчета(Группировка.Структура, ОбразецОформления, Поле, ЭтоРесурс); @@ -2539,10 +2675,12 @@ Если СтрНачинаетсяС(Действие, "ВставитьПоле") Тогда + ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляВыбора, Поле); ВставитьПоле(КомпоновщикНастроек, Настройки, Поле, Действие, СвойстваЗаголовка, РолиПолей); ИначеЕсли СтрНачинаетсяС(Действие, "ВставитьГруппировку") Тогда + ДобавитьФормулу(Настройки, Настройки.ДоступныеПоляГруппировок, Поле); ВставитьГруппировку(Настройки, Действие, Поле, СвойстваЗаголовка); КонецЕсли; @@ -2704,7 +2842,7 @@ КонецЕсли; Если ДоступныеТипы.Количество() > 1 Тогда - Возврат БиблиотекаКартинок.ТипСоставной; + Возврат БиблиотекаКартинок.ТипСоставнойОсновной; КонецЕсли; Если ТипЗначенияПоля.СодержитТип(Тип("Число")) Тогда @@ -3048,7 +3186,8 @@ СвойстваЗаголовка = Элемент.Значение; Если СвойстваЗаголовка.ПорядокРаздела = ПорядокРаздела - И СвойстваЗаголовка.Поле = Поле Тогда + И СвойстваЗаголовка.Поле = Поле + И СвойстваЗаголовка.Лево = Область.Лево Тогда СвойстваОбласти.СвойстваЗаголовка = СвойстваЗаголовка; Возврат СвойстваОбласти; @@ -3457,6 +3596,31 @@ КонецФункции +Функция ДетальныеЗаписи(ЭлементыСтруктуры, ДетальныеЗаписи = Неопределено) + + Для Каждого Элемент Из ЭлементыСтруктуры Цикл + + ТипЭлемента = ТипЗнч(Элемент); + + Если ТипЭлемента = Тип("ГруппировкаКомпоновкиДанных") + Или ТипЭлемента = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + ПоляГруппировки = Элемент.ПоляГруппировки.Элементы; + + Если ПоляГруппировки.Количество() = 0 Тогда + ДетальныеЗаписи = Элемент; + Иначе + ДетальныеЗаписи(Элемент.Структура, ДетальныеЗаписи); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат ДетальныеЗаписи; + +КонецФункции + Процедура ОповеститьОЗавершенииКонтекстнойНастройки(Форма, Действие) ЭтоФормОтчета = СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") @@ -3512,6 +3676,8 @@ Функция СобытияКонтекстнойНастройки() События = Новый Соответствие; + События.Вставить("СгруппироватьПоВыбранномуПолю", Истина); + События.Вставить("ВставитьПолеСправа", Истина); События.Вставить("ВставитьПолеСправа", Истина); События.Вставить("ВставитьГруппировкуВыше", Истина); @@ -3596,6 +3762,134 @@ КонецПроцедуры +Процедура ДобавитьФормулы(Настройки, КоллекцияПолей, ОписаниеФормул) Экспорт + + Для Каждого ОписаниеФормулы Из ОписаниеФормул Цикл + ДобавитьФормулу(Настройки, КоллекцияПолей, ОписаниеФормулы); + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьФормулу(Настройки, КоллекцияПолей, ОписаниеФормулы) Экспорт + + ПутьКДанным = Неопределено; + + Если ТипЗнч(ОписаниеФормулы) = Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных") Тогда + + ПутьКДанным = ОписаниеФормулы.ПутьКДанным; + ОписаниеФормулы = ОписаниеФормулыПоОбразцу(ОписаниеФормулы); + + КонецЕсли; + + Если ТипЗнч(ОписаниеФормулы) <> Тип("Структура") + Или Не ОписаниеФормулы.Свойство("Формула") Тогда + + Возврат; + КонецЕсли; + + Формулы = Настройки.ПользовательскиеПоля.Элементы; + + Если ЗначениеЗаполнено(ПутьКДанным) Тогда + Формула = ВариантыОтчетовСлужебныйКлиентСервер.ФормулаПоПутиКДанным(Настройки, ПутьКДанным); + Иначе + Формула = ФормулаПоВыражению(Формулы, ОписаниеФормулы.Формула); + КонецЕсли; + + Если Формула = Неопределено Тогда + Формула = Формулы.Добавить(Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных")); + КонецЕсли; + + УстановитьСвойстваФормулы(Формула, ОписаниеФормулы); + + ОписаниеФормулы = КоллекцияПолей.НайтиПоле(Новый ПолеКомпоновкиДанных(Формула.ПутьКДанным)); + +КонецПроцедуры + +Функция ФормулаПоВыражению(Формулы, Выражение) + + Для Каждого Формула Из Формулы Цикл + + Если СокрЛП(Выражение) = Формула.ПолучитьВыражениеДетальныхЗаписей() Тогда + Возврат Формула; + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Процедура ИзменитьФормулу(Форма, Настройки, ПутьКДанным, ИмяКоллекции = "ДоступныеПоляВыбора", ОбработатьВФорме = Ложь) Экспорт + + Формула = ВариантыОтчетовСлужебныйКлиентСервер.ФормулаПоПутиКДанным(Настройки, ПутьКДанным); + + ПараметрыРедактированияФормулы = КонструкторФормулКлиент.ПараметрыРедактированияФормулы(); + ПараметрыРедактированияФормулы.Операнды = Форма.НастройкиОтчета.АдресСхемы; + ПараметрыРедактированияФормулы.ИмяКоллекцииСКДОперандов = ИмяКоллекции; + ПараметрыРедактированияФормулы.Формула = Формула.ПолучитьВыражениеДетальныхЗаписей(); + ПараметрыРедактированияФормулы.Наименование = Формула.Заголовок; + + Модуль = ?(ОбработатьВФорме, Форма, ЭтотОбъект); + Обработчик = Новый ОписаниеОповещения("ПослеИзмененияФормулы", Модуль, Формула); + + КонструкторФормулКлиент.НачатьРедактированиеФормулы(ПараметрыРедактированияФормулы, Обработчик); + +КонецПроцедуры + +Процедура ПослеИзмененияФормулы(ОписаниеФормулы, Формула) Экспорт + + Если ТипЗнч(ОписаниеФормулы) <> Тип("Структура") + Или Не ОписаниеФормулы.Свойство("Формула") Тогда + + Возврат; + КонецЕсли; + + УстановитьСвойстваФормулы(Формула, ОписаниеФормулы); + +КонецПроцедуры + +Функция ОписаниеФормулыПоОбразцу(Образец) + + ОписаниеФормулы = Новый Структура; + ОписаниеФормулы.Вставить("Формула", Образец.ПолучитьВыражениеДетальныхЗаписей()); + ОписаниеФормулы.Вставить("ПредставлениеФормулы", Образец.ПолучитьПредставлениеВыраженияДетальныхЗаписей()); + ОписаниеФормулы.Вставить("Наименование", Образец.Заголовок); + + Возврат ОписаниеФормулы; + +КонецФункции + +Процедура УстановитьСвойстваФормулы(Формула, ОписаниеФормулы) + + Выражение = СокрЛП(ОписаниеФормулы.Формула); + ПредставлениеВыражения = СокрЛП(ОписаниеФормулы.ПредставлениеФормулы); + Заголовок = СокрЛП(ОписаниеФормулы.Наименование); + + Формула.УстановитьВыражениеДетальныхЗаписей(Выражение); + Формула.УстановитьПредставлениеВыражений(ПредставлениеВыражения, ""); + Формула.Заголовок = ?(ЗначениеЗаполнено(Заголовок), Заголовок, ПредставлениеВыражения); + +КонецПроцедуры + +Функция ПараметрыСохраненияВариантаОтчетаВФайл(Форма) Экспорт + + ПараметрыСохранения = Новый Структура(); + + НастройкиОтчета = Форма.НастройкиОтчета; + КомпоновщикНастроек = Форма.Отчет.КомпоновщикНастроек; + + ПараметрыСохранения.Вставить("Ссылка", НастройкиОтчета.ВариантСсылка); + ПараметрыСохранения.Вставить("ИмяОтчета", НастройкиОтчета.ПолноеИмя); + ПараметрыСохранения.Вставить("Настройки", КомпоновщикНастроек.Настройки); + ПараметрыСохранения.Вставить("КлючВарианта", Форма.КлючТекущегоВарианта); + ПараметрыСохранения.Вставить("ПредставлениеВарианта", Форма.ПредставлениеТекущегоВарианта); + ПараметрыСохранения.Вставить("КлючПользовательскихНастроек", Форма.КлючТекущихПользовательскихНастроек); + ПараметрыСохранения.Вставить("ПредставлениеПользовательскихНастроек", Форма.ПредставлениеТекущихПользовательскихНастроек); + + Возврат ПараметрыСохранения; + +КонецФункции + #КонецОбласти #КонецОбласти diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl index 3c6bb2c4f..53e45b4aa 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl @@ -8,41 +8,6 @@ #Область СлужебныйПрограммныйИнтерфейс -// Параметры: -// Форма - ФормаКлиентскогоПриложения -// ТекстСостояния - Строка -// КартинкаСостояния - Картинка -// - Неопределено -// -Процедура ОтобразитьСостояниеОтчета(Форма, Знач ТекстСостояния = "", Знач КартинкаСостояния = Неопределено) Экспорт - - ПолеОтчета = Форма.Элементы.Найти("РезультатОтчета"); - Если ПолеОтчета = Неопределено Тогда - Возврат; - КонецЕсли; - - ОтображатьСостояние = Не ПустаяСтрока(ТекстСостояния); - - Если КартинкаСостояния = Неопределено Или Не ОтображатьСостояние Тогда - КартинкаСостояния = Новый Картинка; - КонецЕсли; - - РежимОтображения = ДополнительныйРежимОтображения.НеИспользовать; - Если ОтображатьСостояние Тогда - РежимОтображения = ДополнительныйРежимОтображения.Неактуальность; - КонецЕсли; - - ОтображениеСостояния = ПолеОтчета.ОтображениеСостояния; - ОтображениеСостояния.Видимость = ОтображатьСостояние; - ОтображениеСостояния.ДополнительныйРежимОтображения = РежимОтображения; - ОтображениеСостояния.Картинка = КартинкаСостояния; - ОтображениеСостояния.Текст = ТекстСостояния; - - ПолеОтчета.ТолькоПросмотр = ОтображатьСостояние - Или ПолеОтчета.Вывод = ИспользованиеВывода.Запретить; - -КонецПроцедуры - // Параметры: // Форма - ФормаКлиентскогоПриложения // СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета @@ -61,6 +26,42 @@ КонецПроцедуры +Функция КартинкаПоля(ТипЗначенияПоля) Экспорт + + ДоступныеТипы = ТипЗначенияПоля.Типы(); + + Если ДоступныеТипы.Количество() = 0 Тогда + Возврат БиблиотекаКартинок.Пустая; + КонецЕсли; + + Если ДоступныеТипы.Количество() > 1 Тогда + Возврат БиблиотекаКартинок.ТипСоставнойОсновной; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Число")) Тогда + Возврат БиблиотекаКартинок.ТипЧисло; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Строка")) Тогда + Возврат БиблиотекаКартинок.ТипСтрока; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Дата")) Тогда + Возврат БиблиотекаКартинок.ТипДата; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Булево")) Тогда + Возврат БиблиотекаКартинок.ТипБулево; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("УникальныйИдентификатор")) Тогда + Возврат БиблиотекаКартинок.ТипИдентификатор; + КонецЕсли; + + Возврат БиблиотекаКартинок.ТипСсылка; + +КонецФункции + // Параметры: // Поля - ПоляГруппировкиКомпоновкиДанных // - ВыбранныеПоляКомпоновкиДанных @@ -292,4 +293,64 @@ #КонецОбласти +Функция ФормулаПоПутиКДанным(Настройки, ПутьКДанным) Экспорт + + Формулы = Настройки.ПользовательскиеПоля.Элементы; + + Для Каждого Формула Из Формулы Цикл + + Если СтрЗаканчиваетсяНа(Формула.ПутьКДанным, ПутьКДанным) Тогда + Возврат Формула; + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Функция ИндексКартинкиПоля(Знач ТипЗначенияПоля, ЭтоГруппа = Ложь) Экспорт + + Если ЭтоГруппа Тогда + Возврат 14; + КонецЕсли; + + Если ТипЗначенияПоля = Неопределено Тогда + ТипЗначенияПоля = Новый ОписаниеТипов(); + КонецЕсли; + + ДоступныеТипы = ТипЗначенияПоля.Типы(); + + Если ДоступныеТипы.Количество() = 0 Тогда + Возврат -1; + КонецЕсли; + + Если ДоступныеТипы.Количество() > 1 Тогда + Возврат 15; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Число")) Тогда + Возврат 13; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Строка")) Тогда + Возврат 8; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Дата")) Тогда + Возврат 2; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Булево")) Тогда + Возврат 0; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("УникальныйИдентификатор")) Тогда + Возврат 4; + КонецЕсли; + + Возврат 16; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl index 6532162c3..5f8b9fc6a 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl @@ -190,7 +190,7 @@ // Записывает версию объекта в информационную базу. // // Параметры: -// Источник - СправочникОбъект, ДокументОбъект и т.п. - записываемый объект ИБ; +// Источник - СправочникОбъект, ДокументОбъект - записываемый объект ИБ; // РежимЗаписи - РежимЗаписиДокумента. // Процедура ЗаписатьВерсиюОбъекта(Знач Источник, РежимЗаписи = Неопределено) Экспорт @@ -241,7 +241,7 @@ // Записывает в информационную базу версию объекта, полученного при обмене данными. // // Параметры: -// Объект - Объект - записываемый объект. +// Объект - СправочникОбъект, ДокументОбъект - записываемый объект. // СведенияОВерсииОбъекта - Структура - содержит информацию о версии объекта. // СсылкаСуществует - Булево - признак наличия объекта по ссылке в информационной базе. // @@ -314,6 +314,78 @@ КонецПроцедуры +Процедура ИзменитьПредупреждениеСинхронизации(ПараметрыЗаписиРегистра, ПроверитьНаличиеЗаписи) Экспорт + Перем Ссылка, НомерВерсии; + + ПараметрыЗаписиРегистра.Свойство("Ссылка", Ссылка); + ПараметрыЗаписиРегистра.Свойство("НомерВерсии", НомерВерсии); + + Если Ссылка = Неопределено + ИЛИ НомерВерсии = Неопределено Тогда + + Возврат; + + КонецЕсли; + + ПроверитьНаличиеПравНаИзменениеОбъекта(Ссылка.Метаданные()); + УстановитьПривилегированныйРежим(Истина); + + ИменаОбновляемыхПолей = ""; + Для каждого ЭлементСтруктуры Из ПараметрыЗаписиРегистра Цикл + + Если СтрНайти("Ссылка,НомерВерсии", ЭлементСтруктуры.Ключ) <> 0 Тогда + + Продолжить; + + КонецЕсли; + + ИменаОбновляемыхПолей = ИменаОбновляемыхПолей + "," + ЭлементСтруктуры.Ключ; + + КонецЦикла; + + ИменаОбновляемыхПолей = СОКРЛП(Сред(ИменаОбновляемыхПолей, 2)); + Если ПустаяСтрока(ИменаОбновляемыхПолей) Тогда + + Возврат; + + КонецЕсли; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ВерсииОбъектов"); + ЭлементБлокировки.УстановитьЗначение("Объект", Ссылка); + ЭлементБлокировки.УстановитьЗначение("НомерВерсии", НомерВерсии); + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Объект = Ссылка; + МенеджерЗаписи.НомерВерсии = НомерВерсии; + + МенеджерЗаписи.Прочитать(); // читаем для сохранения реквизитов, которые не передаем на форму + Если НЕ МенеджерЗаписи.Выбран() Тогда + + // Сценарий: открыли карточку предупреждения, а параллельно поправили проблему + Возврат; + + КонецЕсли; + + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ПараметрыЗаписиРегистра, ИменаОбновляемыхПолей); + МенеджерЗаписи.Записать(Истина); + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; + +КонецПроцедуры + // Возвращает количество коллизий или непринятых объектов. // // Параметры: @@ -390,10 +462,15 @@ ТипыВерсий.Добавить(Перечисления.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе); Если ЗначениеЗаполнено(СтрокаПоиска) Тогда - СтрокаОтбора = "ВерсииОбъектов.Комментарий ПОДОБНО &Комментарий"; - Запрос.УстановитьПараметр("Комментарий", "%" + СтрокаПоиска + "%"); + + СтрокаОтбора = "Выразить(ВерсииОбъектов.Комментарий КАК Строка(1000)) ПОДОБНО &Комментарий + |ИЛИ Выразить(ВерсииОбъектов.ПредупреждениеСинхронизации КАК Строка(1000)) ПОДОБНО &Комментарий"; + Запрос.УстановитьПараметр("Комментарий", "%" + СокрЛП(Лев(СтрокаПоиска, 998)) + "%"); + Иначе + СтрокаОтбора = "ИСТИНА"; + КонецЕсли; КонецЕсли; @@ -423,23 +500,23 @@ КонецФункции -Функция ЕстьПроблемыВерсийПриСинхронизацииДанных(УзлыОбмена) Экспорт +Функция АктуализироватьИнформациюОПроблемахВерсийСинхронизацииДанных(УзлыСинхронизации) Экспорт Если Не ЕстьПравоЧтенияИнформацииОВерсияхОбъектов() Тогда Возврат Ложь; КонецЕсли; Запрос = Новый Запрос; - Запрос.УстановитьПараметр("УзлыОбмена", УзлыОбмена); + Запрос.УстановитьПараметр("УзлыСинхронизации", УзлыСинхронизации); Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ИСТИНА КАК ЕстьПроблемыВерсий + "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 101 + | Количество(1) КАК КоличествоПредупрежденийВерсий |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов |ГДЕ | НЕ ВерсииОбъектов.ВерсияПроигнорирована - | И ВерсииОбъектов.АвторВерсии В (&УзлыОбмена) + | И ВерсииОбъектов.АвторВерсии В(&УзлыСинхронизации) | И ВерсииОбъектов.ТипВерсииОбъекта В (ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.ПринятыеДанныеПоКоллизии), | ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НепринятыеДанныеПоКоллизии), | ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе), @@ -450,7 +527,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда - Возврат Выборка.ЕстьПроблемыВерсий; + Возврат Выборка.КоличествоПредупрежденийВерсий; КонецЕсли; @@ -681,7 +758,7 @@ Запись.ДатаВерсии = ТекущаяДатаСеанса(); Запись.АвторВерсии = Отправитель.Ссылка; Запись.Узел = ОбщегоНазначения.ПредметСтрокой(Запись.АвторВерсии); - Запись.Комментарий = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'"); + Запись.ПредупреждениеСинхронизации = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'", ОбщегоНазначения.КодОсновногоЯзыка()); НаборЗаписей.Записать(); НомерПоследнейВерсии = НомерВерсииСКоллизией; КоллизииВерсийОбъектов.Вставить(Объект, НомерВерсииСКоллизией); @@ -1168,6 +1245,7 @@ МенеджерЗаписи.ТипВерсииОбъекта = Перечисления.ТипыВерсийОбъекта.ИзмененоПользователем; МенеджерЗаписи.Синхронизируется = Истина; СведенияОВерсииОбъекта.Свойство("Комментарий", МенеджерЗаписи.Комментарий); + СведенияОВерсииОбъекта.Свойство("ПредупреждениеСинхронизации", МенеджерЗаписи.ПредупреждениеСинхронизации); Если Не Объект.ЭтоНовый() Тогда // Перед тем как посчитать контрольную сумму, необходимо установить проведенность в состояние, @@ -1262,7 +1340,9 @@ НаборЗаписей.Прочитать(); Для Каждого Запись Из НаборЗаписей Цикл - Запись.ВерсияОбъекта = ВерсияОбъекта; + Если Запись.ВерсияОбъекта.Получить() = Неопределено Тогда + Запись.ВерсияОбъекта = ВерсияОбъекта; + КонецЕсли; КонецЦикла; Если ОбменДаннымиЗагрузка Тогда @@ -1514,8 +1594,9 @@ | ВерсииОбъектов.АвторВерсии КАК АвторВерсии, | ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии, | ВерсииОбъектов.Комментарий КАК Комментарий, - | ВерсииОбъектов.ВерсияОбъекта, - | ВерсииОбъектов.КонтрольнаяСумма + | ВерсииОбъектов.ПредупреждениеСинхронизации КАК ПредупреждениеСинхронизации, + | ВерсииОбъектов.ВерсияОбъекта КАК ВерсияОбъекта, + | ВерсииОбъектов.КонтрольнаяСумма КАК КонтрольнаяСумма |ИЗ | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов |ГДЕ @@ -1525,11 +1606,13 @@ Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("НомерВерсии", Число(НомерВерсии)); - Результат = Новый Структура("ВерсияОбъекта, АвторВерсии, ДатаВерсии, Комментарий"); + Результат = Новый Структура("ВерсияОбъекта, АвторВерсии, ДатаВерсии, Комментарий, ПредупреждениеСинхронизации"); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда + ЗаполнитьЗначенияСвойств(Результат, Выборка); + Результат.ВерсияОбъекта = Результат.ВерсияОбъекта.Получить(); Если Результат.ВерсияОбъекта = Неопределено Тогда Результат.ВерсияОбъекта = ДанныеВерсииОбъекта(Ссылка, НомерВерсии, Выборка.КонтрольнаяСумма); @@ -1763,7 +1846,7 @@ Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ВерсииОбъектов") И ЭлементДанных.Количество() > 0 Тогда Запись = ЭлементДанных[0]; - Если Не Запись.Синхронизируется Тогда + Если Не Запись.Синхронизируется Или Запись.Объект = Неопределено Тогда ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; Возврат; КонецЕсли; @@ -2660,12 +2743,9 @@ КонецФункции -// ЗначениеЗаполнения - массив строк. -// ТипВывода - строка : -// "и" - изменение -// "д" - добавление -// "у" - удаление -// "" - обычный вывод. +// Параметры: +// ЗначениеЗаполнения - Массив из Строка. +// ТипВывода - Строка. // Функция СформироватьСекторСтрокиТЧ(Знач ЗначениеЗаполнения,Знач ТипВывода = "") @@ -2914,9 +2994,11 @@ КонецЕсли; МетаданныеАвтора = Запись.АвторВерсии.Метаданные(); Если ОбщегоНазначения.ЭтоПланОбмена(МетаданныеАвтора) Тогда - Запись.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("<АвторВерсии>%1;%2", + + Запись.ПредупреждениеСинхронизации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("<АвторВерсии>%1;%2", МетаданныеАвтора.Имя, ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Запись.АвторВерсии, "Код")) - + Запись.Комментарий; + + Запись.ПредупреждениеСинхронизации; + КонецЕсли; КонецПроцедуры @@ -2937,6 +3019,23 @@ Запись.АвторВерсии = АвторВерсии; КонецЕсли; КонецЕсли; + + ИначеЕсли СтрНачинаетсяС(Запись.ПредупреждениеСинхронизации, "<АвторВерсии>") Тогда + + Позиция = СтрНайти(Запись.ПредупреждениеСинхронизации, ""); + Если Позиция > 0 Тогда + ОписаниеУзла = Лев(Запись.ПредупреждениеСинхронизации, Позиция - 1); + Запись.ПредупреждениеСинхронизации = Сред(Запись.ПредупреждениеСинхронизации, Позиция + СтрДлина("")); + ОписаниеУзла = Сред(ОписаниеУзла, СтрДлина("<АвторВерсии>") + 1); + ОписаниеУзла = СтрРазделить(ОписаниеУзла, ";"); + ИмяУзла = ОписаниеУзла[0]; + КодУзла = ОписаниеУзла[1]; + АвторВерсии = ПланыОбмена[ИмяУзла].НайтиПоКоду(КодУзла); + Если ЗначениеЗаполнено(АвторВерсии) Тогда + Запись.АвторВерсии = АвторВерсии; + КонецЕсли; + КонецЕсли; + КонецЕсли; Если Запись.АвторВерсии = Неопределено Тогда @@ -3238,7 +3337,7 @@ ЗаполнитьЗначенияСвойств(Запись, ПоследняяВерсияКВыгрузке, , "ВерсияВладелец"); Запись.НомерВерсии = НомерВерсииСКоллизией; Запись.ДатаВерсии = ТекущаяДатаСеанса(); - Запись.Комментарий = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'"); + Запись.ПредупреждениеСинхронизации = НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'"); Запись.АвторВерсии = АвторВерсии; Если Не Запись.ЕстьДанныеВерсии Тогда diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl index f35242ca3..fd1d21016 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектовСобытия/Module.bsl @@ -11,7 +11,7 @@ // Записывает версию объекта (кроме документов) в информационную базу. // // Параметры: -// Источник - Объект - записываемый объект ИБ; +// Источник - СправочникОбъект - записываемый объект ИБ; // Отказ - Булево - признак отказа от записи объекта. // Процедура ЗаписатьВерсиюОбъекта(Источник, Отказ) Экспорт @@ -25,7 +25,7 @@ // Записывает версию документа в информационную базу. // // Параметры: -// Источник - Объект - записываемый документ ИБ; +// Источник - ДокументОбъект - записываемый документ ИБ; // Отказ - Булево - признак отказа от записи документа. // РежимЗаписи - РежимЗаписиДокумента - позволяет определить выполняется запись, проведение или отмена проведения. // Изменение значения параметра позволяет изменить режим записи. diff --git a/SSL/src/CommonModules/Взаимодействия/Module.bsl b/SSL/src/CommonModules/Взаимодействия/Module.bsl index cd965d135..429bb7b7a 100644 --- a/SSL/src/CommonModules/Взаимодействия/Module.bsl +++ b/SSL/src/CommonModules/Взаимодействия/Module.bsl @@ -102,8 +102,8 @@ // Устанавливает во всей цепочке взаимодействий в качестве предмета созданный объект. // Параметры: -// Предмет - ОбъектСсылка - созданный предмет взаимодействий, -// Взаимодействие - ДокументСсылка - взаимодействие, по которому создан предмет, +// Предмет - ОпределяемыйТип.ПредметВзаимодействия - созданный предмет взаимодействий. +// Взаимодействие - ДокументСсылка - взаимодействие, по которому создан предмет. // Отказ - Булево - флаг отказа от операции. // Процедура ПриЗаписиПредметаИзФормы(Предмет, Взаимодействие, Отказ) Экспорт @@ -751,7 +751,7 @@ // Устанавливает состояние "Исходящее" для документа сообщение SMS и всех входящих в него сообщений. // // Параметры: -// Объект - Документ.СообщениеSMS - документ, для которого устанавливается состояние. +// Объект - ДокументСсылка.СообщениеSMS - документ, для которого устанавливается состояние. // Процедура УстановитьСостояниеИсходящееДокументСообщениеSMS(Объект) Экспорт @@ -828,19 +828,19 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеСтатусовДоставкиSMS; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПрочиеВзаимодействия; Зависимость.РаботаетСВнешнимиРесурсами = Истина; - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОтправкаSMS; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПрочиеВзаимодействия; Зависимость.РаботаетСВнешнимиРесурсами = Истина; - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ПолучениеИОтправкаЭлектронныхПисем; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПочтовыйКлиент; Зависимость.РаботаетСВнешнимиРесурсами = Истина; @@ -1044,7 +1044,7 @@ Обработчик.БлокируемыеОбъекты = "Документ.ЭлектронноеПисьмоИсходящее"; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.4.294"; + Обработчик.Версия = "3.1.5.108"; Обработчик.Идентификатор = Новый УникальныйИдентификатор("35e85460-7125-4079-b5df-5a71dbb43a49"); Обработчик.Процедура = "Справочники.ПапкиЭлектронныхПисем.ОбработатьДанныеДляПереходаНаНовуюВерсию"; Обработчик.Комментарий = @@ -1059,7 +1059,9 @@ КонецПроцедуры -// См. РаботаСФайламиСлужебный.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов +// Параметры: +// Объекты - Массив из ОбъектМетаданных - для РаботаСФайламиПереопределяемый.ПриОпределенииНастроек. +// Процедура ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(Объекты) Экспорт Объекты.Добавить(Метаданные.Документы.СообщениеSMS); @@ -1087,7 +1089,7 @@ // Получает читаемые объекты при выполнении обработчика обновления учетных записей. // // Параметры: -// ЧитаемыеОбъекты - Массив - объекты, читаемые при выполнении обработчика. +// ЧитаемыеОбъекты - Массив из Строка - объекты, читаемые при выполнении обработчика. // Процедура ПриПолученииЧитаемыхОбъектовОбработчикаОбновленияУчетныхЗаписейЭлектроннойПочты(ЧитаемыеОбъекты) Экспорт @@ -1098,7 +1100,7 @@ // Получает изменяемые объекты при выполнении обработчика обновления учетных записей. // // Параметры: -// ИзменяемыеОбъекты - Массив - объекты, читаемые при выполнении обработчика. +// ИзменяемыеОбъекты - Массив из Строка - объекты, читаемые при выполнении обработчика. // Процедура ПриПолученииИзменяемыхОбъектовОбработчикаОбновленияУчетныхЗаписейЭлектроннойПочты(ИзменяемыеОбъекты) Экспорт @@ -1456,13 +1458,19 @@ // ТаблицаКонтактов - ТабличнаяЧасть - содержащая описания и ссылки на контакты взаимодействия // или участников предмета взаимодействия. // +// Возвращаемое значение: +// Массив из Структура: +// * Адрес - Строка +// * Представление - Строка +// * Контакт - ЛюбаяСсылка +// Функция ПреобразоватьТаблицуКонтактовВМассив(ТаблицаКонтактов) Экспорт Результат = Новый Массив; Для Каждого ЭлементМассива Из ТаблицаКонтактов Цикл Контакт = ?(ТипЗнч(ЭлементМассива.Контакт) = Тип("Строка"), Неопределено, ЭлементМассива.Контакт); Запись = Новый Структура( - "Адрес, Представление, Контакт", ЭлементМассива.Адрес, ЭлементМассива.Представление, Контакт); + "Адрес, Представление, Контакт", ЭлементМассива.Адрес, ЭлементМассива.Представление, Контакт); Результат.Добавить(Запись); КонецЦикла; @@ -1940,96 +1948,24 @@ // Ищет контакты с адресами электронной почты. // // Параметры: -// СтрокаПоиска +// СтрокаПоиска - Строка - текст поиска +// // Возвращаемое значение: -// ТаблицаЗначений: -// * Контакт - ОпределяемыйТип.КонтактВзаимодействия - найденный контакт. -// * Наименование - Строка - наименование контакта. -// * НаименованиеВладельца - Строка - наименование владельца контакта. -// * Представление - Строка - адрес электронной почты. +// см. УправлениеКонтактнойИнформациейСлужебный.НайтиКонтактыСАдресамиЭлектроннойПочты // Функция НайтиКонтактыСАдресами(СтрокаПоиска) Экспорт ОписанияКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов(); - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 20 - | СправочникКонтакт.Ссылка КАК Контакт, - | ПРЕДСТАВЛЕНИЕ(СправочникКонтакт.Ссылка) КАК Наименование, - | """" КАК НаименованиеВладельца, - | ТаблицаКонтактнаяИнформация.АдресЭП КАК Представление - |ИЗ - | Справочник.Пользователи КАК СправочникКонтакт - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация - | ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка) - | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)) - | И (ТаблицаКонтактнаяИнформация.АдресЭП <> """") - |ГДЕ - | НЕ СправочникКонтакт.ПометкаУдаления - | И (СправочникКонтакт.Наименование ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока)"; - - Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл - - Если ОписаниеКонтакта.Имя = "Пользователи" Тогда - Продолжить; - КонецЕсли; - - УсловиеПолейВводаПоСтроке = ""; - МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОписаниеКонтакта.Тип); - СписокПолей = МетаданныеОбъекта.ВводПоСтроке; // СписокПолей - Для Каждого Поле Из СписокПолей Цикл - ПолеСтроковогоТипа = Ложь; - Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(МетаданныеОбъекта.СтандартныеРеквизиты, Поле.Имя) Тогда - Если МетаданныеОбъекта.СтандартныеРеквизиты[Поле.Имя].Тип.Типы()[0] = Тип("Строка") Тогда - ПолеСтроковогоТипа = Истина; - КонецЕсли; - ИначеЕсли ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(МетаданныеОбъекта.Реквизиты, Поле.Имя) Тогда - Если МетаданныеОбъекта.Реквизиты[Поле.Имя].Тип.Типы()[0] = Тип("Строка") Тогда - ПолеСтроковогоТипа = Истина; - КонецЕсли; - КонецЕсли; - Если ПолеСтроковогоТипа Тогда - УсловиеПолейВводаПоСтроке = УсловиеПолейВводаПоСтроке + " ИЛИ СправочникКонтакт." + Поле.Имя + " ПОДОБНО &ВведеннаяСтрока"; - КонецЕсли; - КонецЦикла; - - ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ - |"; - - ТекстЗапроса = ТекстЗапроса + " - |ВЫБРАТЬ ПЕРВЫЕ 20 - | СправочникКонтакт.Ссылка КАК Контакт, - | &ПолеНаименование КАК Наименование, - | &ПолеНаименованиеВладельца КАК НаименованиеВладельца, - | ТаблицаКонтактнаяИнформация.АдресЭП КАК Представление - |ИЗ - | &ТаблицаСправочник КАК СправочникКонтакт - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИмяТаблицаКонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация - | ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка) - | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) И (ТаблицаКонтактнаяИнформация.АдресЭП <> """")) - |ГДЕ - | НЕ СправочникКонтакт.ПометкаУдаления - | И (ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока - | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока - | И &УсловиеПолейВводаПоСтроке) - |"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца" , ?(ОписаниеКонтакта.ЕстьВладелец, "ПРЕДСТАВЛЕНИЕ(СправочникКонтакт.Владелец)", """""")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование" , "СправочникКонтакт." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочник" ,"Справочник." + ОписаниеКонтакта.Имя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация" ,"Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПолейВводаПоСтроке" , УсловиеПолейВводаПоСтроке); - + Контакты = Новый Массив; + Для Каждого ОписанияКонтакта Из ОписанияКонтактов Цикл + НовыйКонтакт = УправлениеКонтактнойИнформациейСлужебный.НовоеОписаниеКонтакта(); + ЗаполнитьЗначенияСвойств(НовыйКонтакт, ОписанияКонтакта); + Контакты.Добавить(НовыйКонтакт); КонецЦикла; - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("ВведеннаяСтрока", "%" + СтрокаПоиска + "%"); - Возврат Запрос.Выполнить().Выгрузить(); + Результат = УправлениеКонтактнойИнформациейСлужебный.НайтиКонтактыСАдресамиЭлектроннойПочты(СтрокаПоиска, Контакты); + Возврат Результат; КонецФункции @@ -2586,7 +2522,7 @@ // Ссылка - ДокументСсылка - ссылка на документ взаимодействия. // // Возвращаемое значение: -// Массив - массив структур, содержащих информацию о контактах. +// Массив из Структура // Функция ПолучитьУчастниковПоТаблице(Ссылка) Экспорт @@ -4955,7 +4891,7 @@ // Возвращаемое значение: // ДокументHTML - созданный документ HTML. // -Функция ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекстHTML,Кодировка = Неопределено) Экспорт +Функция ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекстHTML, Кодировка = Неопределено) Экспорт Построитель = Новый ПостроительDOM; ЧтениеHTML = Новый ЧтениеHTML; @@ -5452,6 +5388,13 @@ КонецФункции // Выполняет отправку сообщений SMS по переданному документу Сообщение SMS. +// +// Параметры: +// Документ - ДокументОбъект.СообщениеSMS - документ, сообщения которого отправляются. +// +// Возвращаемое значение: +// Число - количество отправленных сообщений. +// Функция ОтправкаSMSПоДокументу(Документ) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -5463,7 +5406,7 @@ КонецЕсли; МассивНомеров = Документ.Адресаты.Выгрузить(,"НомерДляОтправки").ВыгрузитьКолонку("НомерДляОтправки"); - РезультатОтправки = ОтправкаSMS.ОтправитьSMS(МассивНомеров, Документ.ТекстСообщения," " , Документ.ОтправлятьВТранслите); + РезультатОтправки = ОтправкаSMS.ОтправитьSMS(МассивНомеров, Документ.ТекстСообщения, Неопределено, Документ.ОтправлятьВТранслите); ОтразитьРезультатыОтправкиSMSВДокументе(Документ, РезультатОтправки); @@ -6603,7 +6546,7 @@ | И ТипыПапокНазначения.УчетнаяЗапись = ПапкиПисем.УчетнаяЗапись"; Запрос.УстановитьПараметр("МассивПисем",МассивПисем); - + Результат = Запрос.Выполнить(); Если НЕ Результат.Пустой() Тогда ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Результат.Выгрузить(), ТаблицаПисем); @@ -7119,7 +7062,7 @@ // // Параметры: // ДанныеДляРасчета - Структура -// - ВыборкаИзРезультатовЗапроса +// - ВыборкаИзРезультатаЗапроса // - Массив - данные, на основании // которых будет формироваться таблица. // ИмяРеквизита - Строка - может принимать значения "Предмет" или "Папка". @@ -7632,11 +7575,11 @@ УстановитьПривилегированныйРежим(Истина); - Запрос = Новый Запрос; + Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ВстречаУчастники.Ссылка КАК Взаимодействие, - | ВстречаУчастники.Контакт, + | ВстречаУчастники.Ссылка КАК Взаимодействие, + | ВстречаУчастники.Контакт КАК Контакт, | ВстречаУчастники.ПредставлениеКонтакта КАК ПредставлениеКонтакта |ПОМЕСТИТЬ ИнформацияОКонтактах |ИЗ @@ -7741,24 +7684,49 @@ |ГДЕ | ЭлектронноеПисьмоИсходящееПолучателиСкрытыхКопий.Ссылка В | (&МассивВзаимодействий) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ИнформацияОКонтактах.Взаимодействие КАК Взаимодействие, + | ИнформацияОКонтактах.Контакт КАК Контакт + |ПОМЕСТИТЬ УникальныеКонтактыВзаимодействия + |ИЗ + | ИнформацияОКонтактах КАК ИнформацияОКонтактах + |; + |//////////////////////////////////////////////////////////////////////////////// + | + |ВЫБРАТЬ + | УникальныеКонтактыВзаимодействия.Взаимодействие КАК Взаимодействие, + | УникальныеКонтактыВзаимодействия.Контакт КАК Контакт, + | МАКСИМУМ(ЕСТЬNULL(ИнформацияОКонтактах.ПредставлениеКонтакта, """")) КАК ПредставлениеКонтакта + |ПОМЕСТИТЬ УникальныеКонтактыВзаимодействияПредставления + |ИЗ + | УникальныеКонтактыВзаимодействия КАК УникальныеКонтактыВзаимодействия + | ЛЕВОЕ СОЕДИНЕНИЕ ИнформацияОКонтактах КАК ИнформацияОКонтактах + | ПО УникальныеКонтактыВзаимодействия.Взаимодействие = ИнформацияОКонтактах.Взаимодействие + | И УникальныеКонтактыВзаимодействия.Контакт = ИнформацияОКонтактах.Контакт + |СГРУППИРОВАТЬ ПО + | УникальныеКонтактыВзаимодействия.Взаимодействие, + | УникальныеКонтактыВзаимодействия.Контакт | |ИНДЕКСИРОВАТЬ ПО | ПредставлениеКонтакта |; - | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ИнформацияОКонтактах.Взаимодействие КАК Взаимодействие, + | УникальныеКонтактыВзаимодействияПредставления.Взаимодействие КАК Взаимодействие, | ВЫБОР - | КОГДА ИнформацияОКонтактах.Контакт = НЕОПРЕДЕЛЕНО + | КОГДА УникальныеКонтактыВзаимодействияПредставления.Контакт = НЕОПРЕДЕЛЕНО | ТОГДА ЕСТЬNULL(СтроковыеКонтактыВзаимодействий.Ссылка, НЕОПРЕДЕЛЕНО) - | ИНАЧЕ ИнформацияОКонтактах.Контакт + | ИНАЧЕ УникальныеКонтактыВзаимодействияПредставления.Контакт | КОНЕЦ КАК Контакт, - | ИнформацияОКонтактах.ПредставлениеКонтакта + | УникальныеКонтактыВзаимодействияПредставления.ПредставлениеКонтакта |ИЗ - | ИнформацияОКонтактах КАК ИнформацияОКонтактах + | УникальныеКонтактыВзаимодействияПредставления КАК УникальныеКонтактыВзаимодействияПредставления | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтроковыеКонтактыВзаимодействий КАК СтроковыеКонтактыВзаимодействий - | ПО ИнформацияОКонтактах.ПредставлениеКонтакта = СтроковыеКонтактыВзаимодействий.Наименование + | ПО УникальныеКонтактыВзаимодействияПредставления.ПредставлениеКонтакта = СтроковыеКонтактыВзаимодействий.Наименование |ИТОГИ ПО | Взаимодействие"; @@ -8081,15 +8049,15 @@ // Формирует структуру для записи в регистр сведений ПредметыПапкиВзаимодействий. // // Параметры: -// Папка - Справочник.ПапкиЭлектронныхПисем - папка, имеет смысл для документов "Электронное письмо входящее" -// и "Электронное письмо исходящее". +// Папка - СправочникСсылка.ПапкиЭлектронныхПисем - папка, имеет смысл для документов "Электронное письмо входящее" +// и "Электронное письмо исходящее". // Предмет - СправочникСсылка, ДокументСсылка - указывает на предмет взаимодействия. // Рассмотрено - Булево - признак рассмотрения взаимодействия. -// РассмотретьПосле - ДатаВремя - дата, до которой отложено рассмотрение взаимодействия. +// РассмотретьПосле - Дата - дата, до которой отложено рассмотрение взаимодействия. // РассчитыватьРассмотрено - Булево - признак необходимости расчета состояний папки и предмета. // // Возвращаемое значение: -// Структура - сформированная структура. +// Структура // Функция СтруктураРеквизитовВзаимодействияДляЗаписи(Предмет, Рассмотрено) @@ -8336,37 +8304,6 @@ Возврат Константы.ЗапретитьОтображениеНебезопасногоСодержимогоВПисьмах.Получить(); КонецФункции -// Устанавливает условное оформление списка выбора -// -// Параметры: -// Форма - ФормаКлиентскогоПриложения - форма, для которой устанавливается оформление. -// ИмяЭлемента - Строка - имя элемента, для которого устанавливается оформление. -// ИмяПоляКомпоновкиДанных - Строка - имя поля компоновки данных. -// -Процедура УстановитьУсловноеОформлениеСпискаВыбора(Форма, ИмяЭлемента, ИмяПоляКомпоновкиДанных) Экспорт - - Элементы = Форма.Элементы; - УсловноеОформление = Форма.УсловноеОформление; - - Для каждого ЭлементВыбора Из Элементы[ИмяЭлемента].СписокВыбора Цикл - - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ЭлементФормы = Элементы[ИмяЭлемента]; // ПолеФормы - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ЭлементФормы.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоляКомпоновкиДанных); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = ЭлементВыбора.Значение; - - Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ЭлементВыбора.Представление); - - КонецЦикла; - -КонецПроцедуры - // Формирует текст запроса для поиска контактов по телефону и выполняет его. // // Параметры: diff --git a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl index e8b931977..8a5fdb2a9 100644 --- a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl @@ -17,8 +17,8 @@ // Контакт - ОпределяемыйТип.КонтактВзаимодействия - контакт для которого получается информация. // Представление - Строка - в данный параметр будет помещено полученное представление. // СтрокаКИ - Строка - в данный параметр будет помещено полученная контактная информация. -// ТипКонтактнойИнформации - Перечисления.ТипыКонтактнойИнформации - возможность установить отбор по типу получаемой -// контактной информации. +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - возможность установить отбор по типу +// получаемой контактной информации. // Процедура ПредставлениеИВсяКонтактнаяИнформациюКонтакта(Контакт, Представление, СтрокаКИ,ТипКонтактнойИнформации = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl index 4b49238a6..549e0d91c 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl @@ -124,12 +124,12 @@ // ПараметрыПеретаскивания - ПараметрыПеретаскивания - содержит перетаскиваемое значение, тип действия и возможные // действия при перетаскивании. // СтандартнаяОбработка - Булево - признак стандартной обработки события. -// Строка - СтрокаТаблицы - строка таблицы, над которой находится курсор. +// СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы, над которой находится курсор. // Поле - Поле - элемент управляемой формы, с которым связана данная колонка таблицы. // -Процедура СписокПредметПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) Экспорт +Процедура СписокПредметПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, СтрокаТаблицы, Поле) Экспорт - Если (Строка = Неопределено) ИЛИ (ПараметрыПеретаскивания.Значение = Неопределено) Тогда + Если (СтрокаТаблицы = Неопределено) ИЛИ (ПараметрыПеретаскивания.Значение = Неопределено) Тогда Возврат; КонецЕсли; @@ -148,24 +148,24 @@ КонецПроцедуры -// Обработчик для события формы Перетаскивание Вызывается для списка предметов при перетаскивании в него взаимодействий. +// Обработчик для события формы Перетаскивание. Вызывается для списка предметов при перетаскивании в него взаимодействий. // // Параметры: // Элемент - ТаблицаФормы - таблица, для которой обрабатывается событие. // ПараметрыПеретаскивания - ПараметрыПеретаскивания - содержит перетаскиваемое значение, тип действия и возможные // действия при перетаскивании. // СтандартнаяОбработка - Булево - признак стандартной обработки события. -// Строка - СтрокаТаблицы - строка таблицы, над которой находится курсор. +// СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы, над которой находится курсор. // Поле - Поле - элемент управляемой формы, с которым связана данная колонка таблицы. // -Процедура СписокПредметПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) Экспорт +Процедура СписокПредметПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, СтрокаТаблицы, Поле) Экспорт СтандартнаяОбработка = Ложь; Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда ВзаимодействияВызовСервера.УстановитьПредметДляМассиваВзаимодействий(ПараметрыПеретаскивания.Значение, - Строка, Истина); + СтрокаТаблицы, Истина); КонецЕсли; @@ -494,9 +494,9 @@ // Создает новый документ взаимодействий. // // Параметры: -// ТипОбъект - Строка - тип создаваемого объекта. +// ТипОбъекта - Строка - тип создаваемого объекта. // ПараметрыСоздания - Структура - параметры создаваемого документа. -// ЭлементСписок - ТаблицаФормы - элемент формы в котором происходит создание. +// Форма - ФормаКлиентскогоПриложения. // Процедура СоздатьНовоеВзаимодействие(ТипОбъекта, ПараметрыСоздания = Неопределено, Форма = Неопределено) Экспорт @@ -535,7 +535,8 @@ // Возвращает параметры открытия для ВзаимодействияКлиент.ВыбратьКонтакт. // -// Структура - состоит из: +// Возвращаемое значение: +// Структура: // * ТолькоEmail - Булево // * ТолькоТелефон - Булево // * ЗаменятьПустыеАдресИПредставление - Булево @@ -621,7 +622,7 @@ // - ДокументСсылка.ЭлектронноеПисьмоИсходящее - ссылка взаимодействие. // Отказ - Булево - признак отказа от добавления. // Копирование - Булево - признак копирования. -// ТолькоПочта - ТолькоПочта - признак того что используются только почтовый клиент. +// ТолькоПочта - Булево - признак того что используются только почтовый клиент. // ДокументыДоступныеДляСоздания - СписокЗначений - список доступных для создания документов. // ПараметрыСоздания - Структура - параметры создания нового документа. // @@ -650,7 +651,7 @@ // Обработчик для события формы ПриНажатии поля HTML документа. // // Параметры: -// Элемент - ЭлементФормы - для которой обрабатывается событие. +// Элемент - ПолеФормы - для которой обрабатывается событие. // ДанныеСобытия - ФиксированнаяСтруктура - данные содержит параметры события. // СтандартнаяОбработка - Булево - признак стандартной обработки события. // diff --git a/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl b/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl index 180b688f0..87b2f2fa5 100644 --- a/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияСобытия/Module.bsl @@ -37,41 +37,6 @@ КонецПроцедуры -// Обработчик подписок ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей* на событие ПередЗаписью -// вызывает заполнение значений доступа табличной части объекта НаборыЗначенийДоступа, -// когда для ограничения доступа к самому объекту используется шаблон #ПоНаборамЗначений. -// Возможен случай использования подсистемы Управление доступом, когда -// указанной подписки не существует, если для указанной цели наборы не применяются. -// -// Параметры: -// Источник - СправочникОбъект -// - ДокументОбъект -// - ПланВидовХарактеристикОбъект -// - ПланСчетовОбъект -// - ПланВидовРасчетаОбъект -// - БизнесПроцессОбъект -// - ЗадачаОбъект -// - ПланОбменаОбъект - объект данных, передаваемый в подписку на событие ПередЗаписью. -// -// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. -// -// РежимЗаписи - Булево - параметр, передаваемый в подписку на событие ПередЗаписью, -// когда тип параметра Источник - ДокументОбъект. -// -// РежимПроведения - Булево - параметр, передаваемый в подписку на событие ПередЗаписью, -// когда тип параметра Источник - ДокументОбъект. -// -Процедура ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Источник, Отказ = Неопределено, РежимЗаписи = Неопределено, РежимПроведения = Неопределено) Экспорт - - // ОбменДанными.Загрузка проверяется внутри вызова. - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); - МодульУправлениеДоступом.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Источник, Отказ, РежимЗаписи, РежимПроведения); - КонецЕсли; - -КонецПроцедуры - // Получает данные выбора для документов взаимодействия. Процедура ОбработкаПолученияДанныхВыбора(ИмяДокумента, ДанныеВыбора, Параметры, СтандартнаяОбработка) Экспорт diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl index 8ab4ed246..cad0dc418 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыВМоделиСервисаСлужебный/Module.bsl @@ -8,7 +8,9 @@ #Область СлужебныйПрограммныйИнтерфейс -// См. ВнешниеКомпонентыСервер.ОбновитьОбщуюКомпоненту +// Параметры: +// ОписаниеКомпоненты - см. ВнешниеКомпонентыСервер.ОписаниеПоставляемойОбщейКомпоненты. +// Процедура ОбновитьОбщуюКомпоненту(ОписаниеКомпоненты) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Или ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl index ee3ae08ac..e921efb4c 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl @@ -143,10 +143,10 @@ Процедура ПодключитьКомпонентуИзРеестраWindows(Оповещение, Идентификатор, ИдентификаторСозданияОбъекта = Неопределено) Экспорт - Контекст = Новый Структура; - Контекст.Вставить("Оповещение" , Оповещение); - Контекст.Вставить("Идентификатор" , Идентификатор); - Контекст.Вставить("ИдентификаторСозданияОбъекта", ИдентификаторСозданияОбъекта); + Контекст = ВнешниеКомпонентыСлужебныйКлиент.КонтекстПодключенияКомпонентыИзРеестраWindows(); + Контекст.Оповещение = Оповещение; + Контекст.Идентификатор = Идентификатор; + Контекст.ИдентификаторСозданияОбъекта = ИдентификаторСозданияОбъекта; ВнешниеКомпонентыСлужебныйКлиент.ПодключитьКомпонентуИзРеестраWindows(Контекст); @@ -317,12 +317,11 @@ ПараметрыЗагрузки = ПараметрыЗагрузки(); КонецЕсли; - Контекст = Новый Структура; - Контекст.Вставить("Оповещение", Оповещение); - Контекст.Вставить("Идентификатор", ПараметрыЗагрузки.Идентификатор); - Контекст.Вставить("Версия", ПараметрыЗагрузки.Версия); - Контекст.Вставить("ПараметрыПоискаДополнительнойИнформации", - ПараметрыЗагрузки.ПараметрыПоискаДополнительнойИнформации); + Контекст = ВнешниеКомпонентыСлужебныйКлиент.КонтекстЗагрузкиКомпонентыИзФайла(); + Контекст.Оповещение = Оповещение; + Контекст.Идентификатор = ПараметрыЗагрузки.Идентификатор; + Контекст.Версия = ПараметрыЗагрузки.Версия; + Контекст.ПараметрыПоискаДополнительнойИнформации = ПараметрыЗагрузки.ПараметрыПоискаДополнительнойИнформации; ВнешниеКомпонентыСлужебныйКлиент.ЗагрузитьКомпонентуИзФайла(Контекст); diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl index 19e7a2fa3..47b2d0a94 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl @@ -105,14 +105,14 @@ // Выполняет обновление внешних компонент. // // Параметры: -// ДанныеВнешнихКомпонент - ТаблицаЗначений - таблица обновляемых компонент: -// ** Идентификатор - Строка - идентификатор. -// ** Версия - Строка - версия. -// ** ДатаВерсии - Строка - дата версии. -// ** Наименование - Строка - наименование. -// ** ИмяФайла - Строка - имя файла. -// ** АдресФайла - Строка - адрес файла. -// ** КодОшибки - Строка - код ошибки. +// ДанныеВнешнихКомпонент - ТаблицаЗначений - сведения об обновляемых компонентах: +// * Идентификатор - Строка - идентификатор. +// * Версия - Строка - версия. +// * ДатаВерсии - Строка - дата версии. +// * Наименование - Строка - наименование. +// * ИмяФайла - Строка - имя файла. +// * АдресФайла - Строка - адрес файла. +// * КодОшибки - Строка - код ошибки. // АдресРезультата - Строка - адрес временного хранилища. // Если указан, в него будет помещено описание результата операции. // @@ -250,16 +250,14 @@ КонецПроцедуры -// Структура параметров для см. процедуру ОбновитьОбщуюКомпоненту. -// // Возвращаемое значение: // Структура: -// * Идентификатор - Строка - идентификатор. -// * Версия - Строка - версия. -// * ДатаВерсии - Дата - дата версии. -// * Наименование - Строка - наименование. -// * ИмяФайла - Строка - имя файла. -// * ПутьКФайлу - Строка - путь к файлу. +// * Идентификатор - Строка +// * Версия - Строка +// * ДатаВерсии - Дата +// * Наименование - Строка +// * ИмяФайла - Строка +// * ПутьКФайлу - Строка // Функция ОписаниеПоставляемойОбщейКомпоненты() Экспорт diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl index 6a3bbe340..9b752d26e 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl @@ -259,7 +259,7 @@ // ПараметрыПодключения - см. ОбщегоНазначения.ПараметрыПодключения. // // Возвращаемое значение: -// Местоположение - Строка - краткое описание ошибки. +// Строка - краткое описание ошибки. // Функция ПроверитьПодключениеКомпоненты(Знач Идентификатор, Знач Версия = Неопределено, @@ -653,6 +653,24 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * Идентификатор - Строка +// * Версия - Строка +// +Функция ПараметрыКомпонентаСПортала() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Идентификатор", ""); + Результат.Вставить("Версия", ""); + Возврат Результат; + +КонецФункции + +// Параметры: +// ПараметрыПроцедуры - см. ПараметрыКомпонентаСПортала. +// АдресРезультата - Строка +// Процедура НоваяКомпонентаСПортала(ПараметрыПроцедуры, АдресРезультата) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеВнешнихКомпонент") Тогда @@ -746,6 +764,22 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * ОбновляемыеКомпоненты - Массив из СправочникСсылка.ВнешниеКомпоненты +// +Функция ПараметрыОбновленияКомпонентСПортала() Экспорт + + Результат = Новый Структура; + Результат.Вставить("ОбновляемыеКомпоненты", Новый Массив); + Возврат Результат; + +КонецФункции + +// Параметры: +// ПараметрыПроцедуры - см. ПараметрыОбновленияКомпонентСПортала +// АдресРезультата - Строка +// Процедура ОбновитьКомпонентыСПортала(ПараметрыПроцедуры, АдресРезультата) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеВнешнихКомпонент") Тогда diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl index e2ad64183..ac2dddf86 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl @@ -279,7 +279,27 @@ #Область ПодключитьКомпонентуИзРеестраWindows -// См. ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindows +// Возвращаемое значение: +// Структура: +// * Оповещение - ОписаниеОповещения +// * Идентификатор - Строка +// * ИдентификаторСозданияОбъекта - Строка +// +Функция КонтекстПодключенияКомпонентыИзРеестраWindows() Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Неопределено); + Контекст.Вставить("Идентификатор", ""); + Контекст.Вставить("ИдентификаторСозданияОбъекта", ""); + Возврат Контекст; + +КонецФункции + +// Для вызова из ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindows. +// +// Параметры: +// Контекст - см. КонтекстПодключенияКомпонентыИзРеестраWindows. +// Процедура ПодключитьКомпонентуИзРеестраWindows(Контекст) Экспорт Если ПодключитьКомпонентуИзРеестраWindowsДоступноПодключение() Тогда @@ -440,7 +460,29 @@ #Область ЗагрузитьКомпонентуИзФайла -// См. ВнешниеКомпонентыКлиент.ЗагрузитьКомпонентуИзФайла +// Возвращаемое значение: +// Структура: +// * Оповещение - ОписаниеОповещения +// * Идентификатор - Строка +// * Версия - Строка +// * ПараметрыПоискаДополнительнойИнформации - Соответствие +// +Функция КонтекстЗагрузкиКомпонентыИзФайла() Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Неопределено); + Контекст.Вставить("Идентификатор", ""); + Контекст.Вставить("Версия", ""); + Контекст.Вставить("ПараметрыПоискаДополнительнойИнформации", Новый Соответствие); + Возврат Контекст; + +КонецФункции + +// Для вызова из ВнешниеКомпонентыКлиент.ЗагрузитьКомпонентуИзФайла. +// +// Параметры: +// Контекст - см. КонтекстЗагрузкиКомпонентыИзФайла. +// Процедура ЗагрузитьКомпонентуИзФайла(Контекст) Экспорт Информация = ВнешниеКомпонентыСлужебныйВызовСервера.ИнформацияОСохраненнойКомпоненте(Контекст.Идентификатор, Контекст.Версия); @@ -557,6 +599,7 @@ #Область ОбновитьКомпонентыСПортала // Параметры: +// Оповещение - ОписаниеОповещения // ОбновляемыеКомпоненты - Массив из СправочникСсылка.ВнешниеКомпоненты // Процедура ОбновитьКомпонентыСПортала(Оповещение, ОбновляемыеКомпоненты) Экспорт diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl index f3f082b84..3aa823935 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl @@ -13,7 +13,7 @@ // Параметры: // ИдентификаторКлиента - УникальныйИдентификатор - идентификатор клиента (программы) 1С. // -// ВозвращаемоеЗначение: +// Возвращаемое значение: // Строка - путь к исполняемому файлу на ПК текущего пользователя. // Функция РасположениеИсполняемогоФайла(ИдентификаторКлиента) Экспорт @@ -27,7 +27,7 @@ // Параметры: // Пользователь - УникальныйИдентификатор - текущий пользователь информационной базы. // -// ВозвращаемоеЗначение: +// Возвращаемое значение: // Структура - настройки пользователя для запуска приложения. // Функция НастройкиУчетнойЗаписиПользователя() Экспорт diff --git a/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl index da039d2b3..0090448b9 100644 --- a/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl +++ b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl @@ -182,13 +182,13 @@ // Определяет для каждой даты дату ближайшего к дня, включенного в график. // // Параметры: -// ГрафикРаботы - Справочник.Календари. +// ГрафикРаботы - СправочникСсылка.Календари // НачальныеДаты - Массив из Дата - даты, относительно которых нужно найти ближайшие. // ПараметрыПолучения - см. ПараметрыПолученияБлижайшихДатПоГрафику. // // Возвращаемое значение: // Соответствие из КлючИЗначение: -// * Ключ - Дата - начальная дата, +// * Ключ - Дата - начальная дата. // * Значение - Дата - ближайшая к ней дата, включенная в график. // Функция БлижайшиеДатыВключенныеВГрафик(ГрафикРаботы, НачальныеДаты, ПараметрыПолучения = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl index 785476216..bfc1cd6bc 100644 --- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl @@ -67,12 +67,26 @@ НачатьИзменениеВыделенных(ПараметрыКоманды); КонецПроцедуры +Процедура НачатьИзменениеВыделенныхСОповещением(ПараметрыГрупповогоИзменения, ОписаниеОповещения) Экспорт + + Если ПараметрыГрупповогоИзменения.МассивОбъектов.Количество() = 0 Тогда + + ПоказатьПредупреждение(, НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + + Иначе + + ОткрытьФорму("Обработка.ГрупповоеИзменениеРеквизитов.Форма", ПараметрыГрупповогоИзменения,,,,, ОписаниеОповещения); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции // Параметры: -// ПараметрыИзменения - Структура: +// ПараметрыГрупповогоИзменения - Структура: // * МассивОбъектов - Массив из ЛюбаяСсылка // * КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных // @@ -81,7 +95,7 @@ Если ПараметрыГрупповогоИзменения.МассивОбъектов.Количество() = 0 Тогда ПоказатьПредупреждение(, НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); Иначе - ОткрытьФорму("Обработка.ГрупповоеИзменениеРеквизитов.Форма", ПараметрыГрупповогоИзменения); + ОткрытьФорму("Обработка.ГрупповоеИзменениеРеквизитов.Форма", ПараметрыГрупповогоИзменения); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl index 8a2df1fda..c0c0f4d9d 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl @@ -42,9 +42,9 @@ // - Неопределено - если не требуется получать значение для проверки из базы данных, // а нужно проверить только данные самого объекта в ДанныеИлиПолноеИмя. // -// ОписаниеОшибки - Null - (значение по умолчанию) - сведения о запретах не требуются. -// - Строка - (возвращаемое значение) - вернуть текстовое описание найденных запретов. -// - Структура - (возвращаемое значение) - вернуть структурное описание найденных запретов, +// ОписаниеОшибки - Null - значение по умолчанию. Сведения о запретах не требуются. +// - Строка - возвращаемое значение. Вернуть текстовое описание найденных запретов. +// - Структура - возвращаемое значение. вернуть структурное описание найденных запретов, // подробнее см. функцию ДатыЗапретаИзменения.НайденЗапретИзмененияДанных. // // УзелПроверкиЗапретаЗагрузки - Неопределено @@ -133,9 +133,9 @@ // // Отказ - Булево - возвращаемый параметр: Истина, если загрузка запрещена. // -// ОписаниеОшибки - Null - (значение по умолчанию) - сведения о запретах не требуются. -// - Строка - (возвращаемое значение) - вернуть текстовое описание найденных запретов. -// - Структура - (возвращаемое значение) - вернуть структурное описание найденных запретов, +// ОписаниеОшибки - Null - значение по умолчанию. Сведения о запретах не требуются. +// - Строка - возвращаемое значение. Вернуть текстовое описание найденных запретов. +// - Структура - возвращаемое значение. Вернуть структурное описание найденных запретов, // подробнее см. функцию ДатыЗапретаИзменения.НайденЗапретИзмененияДанных. // Процедура ПроверитьДатыЗапретаЗагрузкиДанных(Данные, УзелПроверкиЗапретаЗагрузки, Отказ, ОписаниеОшибки = Null) Экспорт @@ -180,10 +180,7 @@ // - БизнесПроцессОбъект // - ЗадачаОбъект // - ПланОбменаОбъект -// - РегистрСведенийМенеджерЗаписи -// - РегистрНакопленияМенеджерЗаписи -// - РегистрБухгалтерииМенеджерЗаписи -// - РегистрРасчетаМенеджерЗаписи - менеджер записи. +// - РегистрСведенийМенеджерЗаписи - менеджер записи. // // Возвращаемое значение: // Булево - Истина, если проверка запрета изменения была пропущена программно. @@ -253,9 +250,9 @@ // ПараметрыСообщенияОЗапрете - см. ДатыЗапретаИзменения.ПараметрыСообщенияОЗапрете // - Неопределено - формировать текст сообщения о запрете не требуется. // -// ОписаниеОшибки - Null - (значение по умолчанию) - сведения о запретах не требуются. -// - Строка - (возвращаемое значение) - вернуть текстовое описание найденных запретов. -// - Структура - (возвращаемое значение) - вернуть структурное описание найденных запретов: +// ОписаниеОшибки - Null - значение по умолчанию. Сведения о запретах не требуются. +// - Строка - возвращаемое значение. Вернуть текстовое описание найденных запретов. +// - Структура - возвращаемое значение. Вернуть структурное описание найденных запретов: // * ПредставлениеДанных - Строка - представление данных, используемое в заголовке ошибки. // * ЗаголовокОшибки - Строка - строка, подобная следующей: // "Заказ 10 от 01.01.2017 невозможно изменить в запрещенном периоде.". diff --git a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl index 5f9370f5d..600f1817c 100644 --- a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl @@ -18,9 +18,8 @@ // // Параметры: // ПараметрыВыполнения - ФормаКлиентскогоПриложения - форма, из которой из которой выполняется вызов; -// - УникальныйИдентификатор - идентификатор формы, из которой выполняется вызов. -// - см. ПараметрыВыполненияФункции -// +// - УникальныйИдентификатор - идентификатор формы, из которой выполняется вызов; +// - Структура - см. ПараметрыВыполненияФункции // ИмяФункции - Строка - имя экспортной функции общего модуля, модуля менеджера объекта // или модуля обработки, которую необходимо выполнить в фоне. // Например, "МойОбщийМодуль.МояПроцедура", "Отчеты.ЗагруженныеДанные.Сформировать" @@ -216,6 +215,8 @@ // без использования фонового задания. // * БезРасширений - Булево - если Истина, то фоновое задание будет запущено без подключения // расширений конфигурации. Имеет приоритет над параметром ЗапуститьНеВФоне. +// * СРасширениямиБазыДанных - Булево - если Истина, то фоновое задание будет запущено с последней версией +// расширений конфигурации. Имеет приоритет над параметром ЗапуститьНеВФоне. // Функция ПараметрыВыполненияФункции(Знач ИдентификаторФормы) Экспорт @@ -255,6 +256,8 @@ // без использования фонового задания. // * БезРасширений - Булево - если Истина, то фоновое задание будет запущено без подключения // расширений конфигурации. Имеет приоритет над параметром ЗапуститьНеВФоне. +// * СРасширениямиБазыДанных - Булево - если Истина, то фоновое задание будет запущено с последней версией +// расширений конфигурации. Имеет приоритет над параметром ЗапуститьНеВФоне. // Функция ПараметрыВыполненияПроцедуры() Экспорт @@ -350,11 +353,18 @@ ВызватьИсключение НСтр("ru = 'Параметры ""ВсегдаНеВФоне"" и ""ВсегдаВФоне"" |не могут одновременно принимать значение Истина в ДлительныеОперации.ВыполнитьВФоне.'"); КонецЕсли; + Если ПараметрыВыполнения.БезРасширений И ПараметрыВыполнения.СРасширениямиБазыДанных Тогда + ВызватьИсключение НСтр("ru = 'Параметры ""БезРасширений"" и ""СРасширениямиБазыДанных"" + |не могут одновременно принимать значение Истина в ДлительныеОперации.ВыполнитьВФоне.'"); + КонецЕсли; #Если ВнешнееСоединение Тогда ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); Если ПараметрыВыполнения.БезРасширений И ИнформационнаяБазаФайловая Тогда ВызватьИсключение НСтр("ru = 'Фоновое задание не может быть запущено с параметром ""БезРасширений"" |в файловой информационной базе в ДлительныеОперации.ВыполнитьВФоне.'"); + ИначеЕсли ПараметрыВыполнения.СРасширениямиБазыДанных И ИнформационнаяБазаФайловая Тогда + ВызватьИсключение НСтр("ru = 'Фоновое задание не может быть запущено с параметром ""СРасширениямиБазыДанных"" + |в файловой информационной базе в ДлительныеОперации.ВыполнитьВФоне.'"); КонецЕсли; #КонецЕсли @@ -412,6 +422,7 @@ Или Не ВозможноВыполнитьВФоне(ИмяПроцедуры); #Иначе ВыполнитьБезФоновогоЗадания = Не ПараметрыВыполнения.БезРасширений + И Не ПараметрыВыполнения.СРасширениямиБазыДанных И (ОбщегоНазначения.РежимОтладки() Или ПараметрыВыполнения.ЗапуститьНеВФоне Или (ЕстьФоновыеЗаданияВФайловойИБ() И Не ПараметрыВыполнения.ЗапуститьВФоне) Или Не ВозможноВыполнитьВФоне(ИмяПроцедуры)); @@ -526,6 +537,8 @@ // без использования фонового задания. // * БезРасширений - Булево - если Истина, то фоновое задание будет запущено без подключения // расширений конфигурации. Имеет приоритет над параметром ЗапуститьНеВФоне. +// * СРасширениямиБазыДанных - Булево - если Истина, то фоновое задание будет запущено с последней версией +// расширений конфигурации. Имеет приоритет над параметром ЗапуститьНеВФоне. // Функция ПараметрыВыполненияВФоне(Знач ИдентификаторФормы = Неопределено) Экспорт @@ -1019,7 +1032,9 @@ ВсеПараметры.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); ВсеПараметры.Вставить("БезопасныйРежим", БезопасныйРежим); - Если Не ПараметрыВыполнения.БезРасширений Тогда + Если Не ПараметрыВыполнения.БезРасширений + И Не ПараметрыВыполнения.СРасширениямиБазыДанных Тогда + Справочники.ВерсииРасширений.ВставитьЗарегистрированныйСоставУстановленныхРасширений(ВсеПараметры); КонецЕсли; @@ -1244,6 +1259,9 @@ Если ПараметрыВыполнения.БезРасширений Тогда Возврат РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеБезРасширений(ИмяМетода, Параметры, Ключ, Наименование); + + ИначеЕсли ПараметрыВыполнения.СРасширениямиБазыДанных Тогда + Возврат РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеСРасширениямиБазыДанных(ИмяМетода, Параметры, Ключ, Наименование); Иначе Возврат ФоновыеЗадания.Выполнить(ИмяМетода, Параметры, Ключ, Наименование); КонецЕсли; @@ -1307,6 +1325,7 @@ Результат.Вставить("ЗапуститьНеВФоне", Ложь); Результат.Вставить("ЗапуститьВФоне", Ложь); Результат.Вставить("БезРасширений", Ложь); + Результат.Вставить("СРасширениямиБазыДанных", Ложь); Возврат Результат; diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl index abcf3a9aa..99bdfff32 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl @@ -521,8 +521,7 @@ // Истина - только отчеты и обработки, привязанные к формам объектов. // Ложь - только отчеты и обработки, привязанные к формам списков. // ТипыКоманд - ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок - тип получаемых команд. -// - Массив - типы команд, которые необходимо получить: -// * ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок +// - Массив из ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок // ТолькоВключенные - Булево - // Тип форм, в которых размещены контекстные дополнительные отчеты и обработки. // Истина - только отчеты и обработки, привязанные к формам объектов. @@ -759,7 +758,9 @@ Возврат ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки"); КонецФункции -// Возвращает имя рабочего места команды. +// Возвращаемое значение: +// Строка - имя рабочего места команды. +// Функция ПредставлениеРаздела(Раздел) Экспорт Если Раздел = ДополнительныеОтчетыИОбработкиКлиентСервер.ИмяНачальнойСтраницы() Или Раздел = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда @@ -1317,7 +1318,7 @@ // Получает ссылку дополнительного отчета, если он подключен к хранилищу подсистемы Варианты отчетов. // // Параметры: -// ОтчетИнформация - см. ВариантыОтчетов.СформироватьИнформациюОбОтчетеПоПолномуИмени(). +// ОтчетИнформация - см. ВариантыОтчетов.ИнформацияОбОтчете. // Процедура ПриОпределенииТипаИСсылкиЕслиОтчетДополнительный(ОтчетИнформация) Экспорт Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда @@ -1450,6 +1451,10 @@ // Подключает отчет подсистемы "Дополнительные отчеты и обработки". // Обработка исключений производится управляющим кодом. // +// Места использования: +// ВариантыОтчетов.ПодключитьОтчетОбъект. +// РассылкаОтчетов.ИнициализироватьОтчет. +// // Параметры: // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - отчет, который необходимо инициализировать. // ПараметрыОтчета - см. РассылкаОтчетов.ИнициализироватьОтчет @@ -1457,10 +1462,7 @@ // - Неопределено - результат подключения. // Истина - Удалось подключить дополнительный отчет. // Ложь - Не удалось подключить дополнительный отчет. -// -// Места использования: -// ВариантыОтчетов.ПодключитьОтчетОбъект(). -// РассылкаОтчетов.ИнициализироватьОтчет(). +// ПолучатьМетаданные - Булево // Процедура ПриПодключенииДопОтчета(Ссылка, ПараметрыОтчета, Результат, ПолучатьМетаданные) Экспорт Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда @@ -1689,6 +1691,18 @@ Возврат ОбновлениеИнформационнойБазы.ЕстьЗаблокированныеПредыдущимиОчередямиДанные(Очередь, "Справочник.ДополнительныеОтчетыИОбработки"); КонецФункции +Функция ТекстЗапросаДополнительныхОтчетовПоИмениОбъекта() Экспорт + + Возврат "ВЫБРАТЬ + | Отчеты.Ссылка КАК Ссылка + |ИЗ + | Справочник.ДополнительныеОтчетыИОбработки КАК Отчеты + |ГДЕ + | Отчеты.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыДополнительныхОтчетовИОбработок.Отчет) + | И Отчеты.ИмяОбъекта = &ИмяОбъекта"; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1776,7 +1790,9 @@ КонецФункции -// Преобразует вид дополнительных отчетов или обработок из ссылки перечисления в строковую константу. +// Возвращаемое значение: +// Строка +// Функция ВидВСтроку(СсылкаВида) Экспорт Если СсылкаВида = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда @@ -1806,7 +1822,9 @@ КонецФункции -// Возвращает имя рабочего места команды. +// Возвращаемое значение: +// Строка +// Функция ПредставлениеОбъектаМетаданных(Объект) Экспорт Если ТипЗнч(Объект) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Объект, Ложь); @@ -1821,7 +1839,9 @@ Возврат ОбъектМетаданных.Представление(); КонецФункции -// Проверяет наличие права добавления дополнительных отчетов и обработок. +// Возвращаемое значение: +// Булево +// Функция ПравоДобавления(Знач ДополнительнаяОбработка = Неопределено) Экспорт Результат = Ложь; @@ -1904,6 +1924,10 @@ КонецФункции // Виды публикации, недоступные для использования в текущем режиме работы программы. +// +// Возвращаемое значение: +// Массив из Строка +// Функция НедоступныеВидыПубликации() Экспорт Результат = Новый Массив; @@ -3059,11 +3083,10 @@ КонецПроцедуры // Возвращаемое значение: -// -// Структура: -// * Вид - Строка - вид обработки, который можно получить с помощью функций +// Структура: +// * Вид - Строка - вид обработки, который можно получить с помощью функций // ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<...>. -// * ЭтоОтчет - Булево +// * ЭтоОтчет - Булево // Функция ДополнительныеПараметрыКоманды(Вид, ЭтоОтчет) Экспорт Результат = Новый Структура(); @@ -3082,7 +3105,7 @@ // * Представление - Строка // * ЭтоОтчет - Булево // -Функция ДополнительныеПараметрыКомандыЗаполнения() +Функция ДополнительныеПараметрыКомандыЗаполнения() Экспорт КлючиПараметровОбработчика = "Ссылка, Идентификатор, ВариантЗапуска, Представление, ПоказыватьОповещение, ЭтоОтчет"; Возврат Новый Структура(КлючиПараметровОбработчика); КонецФункции diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl index ec6ec3665..8e7702bf2 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl @@ -35,7 +35,8 @@ // Возвращает пиктограмму, отображающую внешний модуль. // -// ВнешнийМодуль - ЛюбаяСсылка, ссылка на внешний модуль, +// Параметры: +// ВнешнийМодуль - ЛюбаяСсылка - ссылка на внешний модуль // // Возвращаемое значение: // Картинка. diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl index b5dc47aaf..f7566acd8 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl @@ -202,7 +202,7 @@ НаборЗаписей.Записать(); КонецЕсли; - + КонецПроцедуры // Вызывается при получении регистрационных данных для нового дополнительного отчета @@ -471,7 +471,7 @@ // БыстрыйДоступ - ТаблицаЗначений - настройки включения команд дополнительной // обработки в быстрый доступ пользователей приложения, колонки: // * ИдентификаторКоманды - Строка - идентификатор команды. -// * Пользователь - СправочникСсылка.Пользователь - пользователь приложения. +// * Пользователь - СправочникСсылка.Пользователи - пользователь приложения. // Задания - ТаблицаЗначений - настройки выполнения команд дополнительной обработки // в качестве регламентных заданий, колонки: // * Идентификатор - Строка - идентификатор команды. @@ -1147,12 +1147,14 @@ #Область ПоставляемыеДанные +// АПК:299-выкл Обработчики поставляемых данных + // Вызывается при получении уведомления о новых данных. // В теле следует проверить, необходимы ли эти данные приложению, // и если да - установить флажок Загружать. // // Параметры: -// Дескриптор - ОбъектXDTO Descriptor. +// Дескриптор - ОбъектXDTO - Descriptor. // Загружать - Булево - возвращаемое. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -1192,7 +1194,7 @@ // Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. // // Параметры: -// Дескриптор - ОбъектXDTO Дескриптор. +// Дескриптор - ОбъектXDTO - дескриптор. // ПутьКФайлу - Строка, Неопределено - полное имя извлеченного файла. Файл будет автоматически удален // после завершения процедуры. Если в менеджере сервиса не был // указан файл - значение аргумента равно Неопределено. @@ -1211,6 +1213,8 @@ КонецПроцедуры +// АПК:299-вкл + #КонецОбласти #Область ОбработчикиОбновления @@ -1728,7 +1732,7 @@ // ConfigarationName - Строка - имя конфигурации, // VersionNumber - Строка - версия конфигурации. // -Функция ПрочитатьТаблицуСовместимости(Знач ТаблицаСовместимости) Экспорт +Функция ПрочитатьТаблицуСовместимости(Знач ТаблицаСовместимости) Результат = Новый ТаблицаЗначений(); Результат.Колонки.Добавить("ConfigarationName", Новый ОписаниеТипов("Строка")); diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl index 61aaeb548..5ee312e6f 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl @@ -23,7 +23,7 @@ // ** Важный - Булево - Истина, если выводится в группе важных. // ** СмТакже - Булево - Истина, если выводится в группе "См. также". // РасписанияКоманд - Структура - в ключах идентификаторы команд, а в значениях - расписание. -// РазрешенияОбработки - Массив - объекты ОбъектXDTO. +// РазрешенияОбработки - Массив из ОбъектXDTO. // // Возвращаемое значение: // ОбъектXDTO - ОбъектXDTO {http://www.1c.ru/1cFresh/ApplicationExtensions/Manifest/a.b.c.d}ExtensionManifest - @@ -91,7 +91,7 @@ ИмяНачальнойСтраницы = ДополнительныеОтчетыИОбработкиКлиентСервер.ИмяНачальнойСтраницы(); НазначениеXDTO = ФабрикаXDTO.Создать( - ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипНазначениеРазделам(Пакет)); + ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипНазначениеРазделам(Пакет)); // см. ПакетXDTO.ApplicationExtensionsManifest_1_0_0_2 Для Каждого Раздел Из ВозможныеРазделы Цикл @@ -110,7 +110,8 @@ ОбъектНазначенияXDTO.ObjectType = "SubSystem"; ОбъектНазначенияXDTO.Representation = ПредставлениеОбъектаМетаданных; ОбъектНазначенияXDTO.Enabled = ВыбранныеРазделы.Найти(ИдентификаторОбъектаМетаданных, "Раздел") <> Неопределено; - НазначениеXDTO.Objects.Добавить(ОбъектНазначенияXDTO); + Объекты = НазначениеXDTO.Objects; // СписокXDTO + Объекты.Добавить(ОбъектНазначенияXDTO); КонецЦикла; @@ -147,7 +148,8 @@ ОбъектНазначенияXDTO.Representation = ОбъектНазначения.Представление(); ОбъектНазначенияXDTO.Enabled = ВыбранныеОбъектыНазначения.Найти(ИдентификаторОбъектаМетаданных, "ОбъектНазначения") <> Неопределено; - НазначениеXDTO.Objects.Добавить(ОбъектНазначенияXDTO); + Объекты = НазначениеXDTO.Objects; // СписокXDTO + Объекты.Добавить(ОбъектНазначенияXDTO); КонецЦикла; @@ -190,7 +192,8 @@ КомандаXDTO.DefaultSettings.Schedule = СериализаторXDTO.ЗаписатьXDTO(РасписаниеКоманды); КонецЕсли; КонецЕсли; - Манифест.Commands.Добавить(КомандаXDTO); + Команды = Манифест.Commands; // СписокXDTO + Команды.Добавить(КомандаXDTO); КонецЦикла; @@ -225,13 +228,15 @@ НазначениеXDTO.Importance = "Ordinary"; КонецЕсли; - ВариантXDTO.Assignments.Добавить(НазначениеXDTO); + Задания = ВариантXDTO.Assignments; // СписокXDTO + Задания.Добавить(НазначениеXDTO); КонецЦикла; КонецЕсли; - Манифест.ReportVariants.Добавить(ВариантXDTO); + ВариантыОтчета = Манифест.ReportVariants; // СписокXDTO + ВариантыОтчета.Добавить(ВариантXDTO); КонецЦикла; @@ -246,7 +251,8 @@ Для Каждого Разрешение Из РазрешенияОбработки Цикл Если ТипЗнч(Разрешение) = Тип("ОбъектXDTO") Тогда - Манифест.Permissions.Добавить(Разрешение); + Разрешения = Манифест.Permissions; // СписокXDTO + Разрешения.Добавить(Разрешение); Иначе Если РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3 Тогда @@ -267,7 +273,8 @@ РазрешениеXDTO[Параметр.Ключ] = Параметр.Значение; КонецЦикла; КонецЕсли; - Манифест.Permissions.Добавить(РазрешениеXDTO); + Разрешения = Манифест.Permissions; // СписокXDTO + Разрешения.Добавить(РазрешениеXDTO); КонецЕсли; @@ -336,7 +343,7 @@ ОбъектВерсии.Разрешения.Очистить(); Для Каждого Permission Из Манифест.Permissions Цикл - ТипXDTO = Permission.Тип(); + ТипXDTO = Permission.Тип(); // ТипОбъектаXDTO Разрешение = ОбъектВерсии.Разрешения.Добавить(); Разрешение.ВидРазрешения = ТипXDTO.Имя; diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl index 5d297c519..68da0fc9c 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl @@ -287,7 +287,7 @@ Процедура ОбработчикКомандыЗаполнения(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт Форма = ПараметрыВыполнения.Форма; Объект = ПараметрыВыполнения.Источник; - ВыполняемаяКоманда = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры; + ВыполняемаяКоманда = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры; // См. ДополнительныеОтчетыИОбработки.ДополнительныеПараметрыКомандыЗаполнения ПараметрыВызоваСервера = Новый Структура; diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl index 120ad0da6..427fa7288 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl @@ -243,38 +243,38 @@ КонецФункции // Возвращает имя типа команд по открытию формы. При выполнении этих команд -// открывается основная форма внешнего объекта с указанными ниже параметрами. +// открывается основная форма внешнего объекта с указанными ниже параметрами. // // Общие параметры: -// * ИдентификаторКоманды - Строка - имя команды, определенное в функции СведенияОВнешнейОбработке(). -// * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка этого объекта. +// ИдентификаторКоманды - Строка - имя команды, определенное в функции СведенияОВнешнейОбработке(). +// ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка этого объекта. // Может использоваться для чтения и сохранения параметров обработки. // Также может использоваться для фонового выполнения длительных операций. // Подробнее см. в документации к подсистеме, раздел "Фоновое выполнение длительных операций". -// * ИмяФормы - Строка - имя формы-владельца, из которой вызвана эта команда. +// ИмяФормы - Строка - имя формы-владельца, из которой вызвана эта команда. // // Вспомогательные параметры для обработок создания связанных объектов (Вид = "СозданиеСвязанныхОбъектов"), // обработок заполнения (Вид = "ЗаполнениеОбъекта") и контекстных отчетов (Вид = "Отчет"): -// * ОбъектыНазначения - Массив - Ссылки объектов, для которых вызвана команда. +// ОбъектыНазначения - Массив - Ссылки объектов, для которых вызвана команда. // // Пример чтения общих параметров: -// ОбъектСсылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ДополнительнаяОбработкаСсылка"); -// ИдентификаторКоманды = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ИдентификаторКоманды"); +// ОбъектСсылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ДополнительнаяОбработкаСсылка"); +// ИдентификаторКоманды = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ИдентификаторКоманды"); // // Пример чтения значений дополнительных настроек: -// Если ЗначениеЗаполнено(ОбъектСсылка) Тогда -// ХранилищеНастроек = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектСсылка, "ХранилищеНастроек"); -// Настройки = ХранилищеНастроек.Получить(); -// Если ТипЗнч(Настройки) = Тип("Структура") Тогда -// ЗаполнитьЗначенияСвойств(ЭтотОбъект, "<ИменаНастроек>"); -// КонецЕсли; +// Если ЗначениеЗаполнено(ОбъектСсылка) Тогда +// ХранилищеНастроек = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектСсылка, "ХранилищеНастроек"); +// Настройки = ХранилищеНастроек.Получить(); +// Если ТипЗнч(Настройки) = Тип("Структура") Тогда +// ЗаполнитьЗначенияСвойств(ЭтотОбъект, "<ИменаНастроек>"); // КонецЕсли; +// КонецЕсли; // // Пример сохранения значений дополнительных настроек: -// Настройки = Новый Структура("<ИменаНастроек>", <ЗначенияНастроек>); -// ДополнительнаяОбработкаОбъект = ОбъектСсылка.ПолучитьОбъект(); -// ДополнительнаяОбработкаОбъект.ХранилищеНастроек = Новый ХранилищеЗначения(Настройки); -// ДополнительнаяОбработкаОбъект.Записать(); +// Настройки = Новый Структура("<ИменаНастроек>", <ЗначенияНастроек>); +// ДополнительнаяОбработкаОбъект = ОбъектСсылка.ПолучитьОбъект(); +// ДополнительнаяОбработкаОбъект.ХранилищеНастроек = Новый ХранилищеЗначения(Настройки); +// ДополнительнаяОбработкаОбъект.Записать(); // // Возвращаемое значение: // Строка - имя типа команд по открытию формы. diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl index 5eb68fe19..3f68ab9d4 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl @@ -14,9 +14,8 @@ // Для начальной страницы указать ДополнительныеОтчетыИОбработкиКлиентСервер.ИмяНачальнойСтраницы. // // Параметры: -// Разделы - Массив - разделы, в которых размещены команды вызова дополнительных обработок: -// * ОбъектМетаданных: Подсистема - метаданные раздела (подсистемы). -// * Строка - для начальной страницы. +// Разделы - Массив из ОбъектМетаданных - метаданные раздела (подсистемы). +// - Массив из Строка - для начальной страницы. // Процедура ОпределитьРазделыСДополнительнымиОбработками(Разделы) Экспорт @@ -30,9 +29,8 @@ // Для начальной страницы указать ДополнительныеОтчетыИОбработкиКлиентСервер.ИмяНачальнойСтраницы. // // Параметры: -// Разделы - Массив - разделы, в которых размещены команды вызова дополнительных отчетов: -// * ОбъектМетаданных: Подсистема - метаданные раздела (подсистемы). -// * Строка - для начальной страницы. +// Разделы - Массив из ОбъектМетаданных - метаданные раздела (подсистемы). +// - Массив из Строка - для начальной страницы. // Процедура ОпределитьРазделыСДополнительнымиОтчетами(Разделы) Экспорт diff --git a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl index e1be97e20..6678276c7 100644 --- a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl @@ -210,9 +210,10 @@ НСтр("ru = 'Право: %1'"), СобытиеЖурнала.Данные.Право); Иначе + ДанныеЖурнала = СобытиеЖурнала.Данные; // Структура СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Действие: %1%2'"), - СобытиеЖурнала.Данные.Действие, ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ...") ); + ДанныеЖурнала.Действие, ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ...") ); КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl index 94217d3d8..c9571f68a 100644 --- a/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl @@ -129,7 +129,7 @@ // для отображения в ней подробных данных выбранного события. // // Параметры: -// Данные - СтрокаТаблицыЗначений - строка журнала регистрации. +// Данные - ДанныеФормыЭлементКоллекции из см. Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации.Журнал // Процедура ПросмотрТекущегоСобытияВОтдельномОкне(Данные, ХранилищеДанных) Экспорт diff --git a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl index a82c273cb..d9a90f0bb 100644 --- a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl +++ b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайла/Module.bsl @@ -85,10 +85,90 @@ Возврат СписокКолонок; КонецФункции +// Настройки загрузки новых и существующих элементов. +// +// Возвращаемое значение: +// Структура: +// * СоздаватьНовые - Булево +// * ОбновлятьСуществующие - Булево +// +Функция НастройкиЗагрузкиДанных() Экспорт + + ПараметрыЗагрузки = Новый Структура(); + ПараметрыЗагрузки.Вставить("СоздаватьНовые", Ложь); + ПараметрыЗагрузки.Вставить("ОбновлятьСуществующие", Ложь); + Возврат ПараметрыЗагрузки; + +КонецФункции + +// Добавляет в таблицу загружаемых данных служебные колонки. +// Список колонок таблицы динамический и формируется на основе макета загружаемых данных. +// В возвращаемом значении описаны только служебные колонки, которые присутствуют всегда. +// +// Параметры: +// ЗагружаемыеДанные - ТаблицаЗначений +// ОписаниеТипаОбъектаСопоставления - ОписаниеТипов - описание типа объекта сопоставления. +// ЗаголовокКолонкиОбъектаСопоставления - Строка - заголовок колонки объекта сопоставления. +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * СопоставленныйОбъект - СправочникСсылка - ссылка на сопоставленный объект. +// * РезультатСопоставленияСтроки - Строка - статус загрузки, возможны варианты: Создан, Обновлен, Пропущен. +// * ОписаниеОшибки - Строка - расшифровка ошибки загрузки данных. +// * Идентификатор - Число - уникальный номер строки +// * СписокНеоднозначностей - СписокЗначений -список неоднозначностей возникших при загрузке данных. +// +Функция ОписаниеЗагружаемыхДанныхДляСправочников(ЗагружаемыеДанные, ОписаниеТипаОбъектаСопоставления, ЗаголовокКолонкиОбъектаСопоставления) Экспорт + + ЗагружаемыеДанные.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Число"), НСтр("ru = 'п/п'")); + ЗагружаемыеДанные.Колонки.Добавить("ОбъектСопоставления", ОписаниеТипаОбъектаСопоставления, ЗаголовокКолонкиОбъектаСопоставления); + ЗагружаемыеДанные.Колонки.Добавить("РезультатСопоставленияСтроки", Новый ОписаниеТипов("Строка"), НСтр("ru = 'Результат'")); + ЗагружаемыеДанные.Колонки.Добавить("ОписаниеОшибки", Новый ОписаниеТипов("Строка"), НСтр("ru = 'Причина'")); + ЗагружаемыеДанные.Колонки.Добавить("СписокНеоднозначностей", Новый ОписаниеТипов("СписокЗначений"), "СписокНеоднозначностей"); + + Возврат ЗагружаемыеДанные; + +КонецФункции + +// Создать таблицу со списком неоднозначностей для которых в ИБ имеется несколько подходящих вариантов данных. +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Колонка - Строка - имя колонки, в которой была обнаружена неоднозначность; +// * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность. +// +Функция НовыйСписокНеоднозначностей() Экспорт + + СписокНеоднозначностей = Новый ТаблицаЗначений; + СписокНеоднозначностей.Колонки.Добавить("Идентификатор"); + СписокНеоднозначностей.Колонки.Добавить("Колонка"); + + Возврат СписокНеоднозначностей; +КонецФункции + +// Возвращает таблицу, извлеченную из временного хранилища для сопоставления загружаемых данных с данными в программе. +// Список колонок извлекаемой таблицы динамический и формируется на основе макета загружаемых данных. +// В возвращаемом значении описана только служебная колонка, которая присутствуют всегда. +// +// Параметры: +// АдресРезультата - Строка - адрес во временном хранилища +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * СопоставленныйОбъект - СправочникСсылка - ссылка на сопоставленный объект. Заполняется внутри процедуры. +// +Функция ТаблицаСопоставления(АдресРезультата) Экспорт + + ТаблицаСопоставления = ПолучитьИзВременногоХранилища(АдресРезультата); + Возврат ТаблицаСопоставления; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции + Процедура ДобавитьСтатистическуюИнформацию(ИмяОперации, Значение = 1, Комментарий = "") Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда @@ -103,17 +183,19 @@ // // Возвращаемое значение: // Структура: -// * Заголовок - Строка - представление в списке вариантов загрузки. -// * ТипДанныхКолонки - Соответствие -// * ИмяМакетаСШаблоном - Строка - название макета со структурой данных(необязательный -// параметр, значение по -// умолчанию - "ЗагрузкаДанныхИзФайла"). -// * ОбязательныеКолонкиМакета - Массив из Строка - содержит список обязательных полей для заполнения. -// * ЗаголовокКолонкиСопоставления - Строка - представление колонки сопоставления в шапке таблицы +// * Заголовок - Строка - представление в списке вариантов загрузки и в заголовке окна. +// * ТипДанныхКолонки - Соответствие из КлючИЗначение: +// ** Ключ - Строка - имя колонки таблицы. +// ** Значение - ОписаниеТипов - описание типа данных колонки. +// * ИмяМакетаСШаблоном - Строка - название макета со структурой данных(необязательный +// параметр, значение по умолчанию - "ЗагрузкаДанныхИзФайла"). +// * ОбязательныеКолонкиМакета - Массив из Строка - содержит список обязательных полей для заполнения. +// * ЗаголовокКолонкиСопоставления - Строка - представление колонки сопоставления в шапке таблицы // сопоставления данных(необязательный параметр, значение по // умолчанию формируются - "Справочник: <синоним справочника>"). -// * ПолноеИмяОбъекта - Строка - имя Объекта. -// * ТипЗагрузки - Строка +// * ПолноеИмяОбъекта - Строка - полное имя объекта, как в метаданных. Например Справочник.Партнеры. +// * ПредставлениеОбъекта - Строка - представление объекта в таблице сопоставления данных. Например, "Клиент". +// * ТипЗагрузки - Строка - варианты загрузки данных (служебный). // Функция ПараметрыЗагрузкиИзФайла(ИмяОбъектаСопоставления) Экспорт @@ -132,6 +214,7 @@ ПараметрыПоУмолчанию.Вставить("ТипДанныхКолонки", Новый Соответствие); ПараметрыПоУмолчанию.Вставить("ТипЗагрузки", ""); ПараметрыПоУмолчанию.Вставить("ПолноеИмяОбъекта", ИмяОбъектаСопоставления); + ПараметрыПоУмолчанию.Вставить("ПредставлениеОбъекта", МетаданныеОбъекта.Представление()); Возврат ПараметрыПоУмолчанию; diff --git a/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl index eab634927..652b68da6 100644 --- a/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl +++ b/SSL/src/CommonModules/ЗаметкиПользователя/Module.bsl @@ -28,7 +28,7 @@ // Описание см. в синтакс-помощнике. // // Параметры: -// Источник - Объект - источник события подписки. +// Источник - СправочникОбъект - источник события подписки. // Отказ - Булево - признак отказа от записи. Если установить Истина, то запись выполнена не будет // и будет вызвано исключение. // diff --git a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl index 2a60cf498..da96c4445 100644 --- a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl @@ -74,7 +74,9 @@ КонецПроцедуры -// См. ПоискИУдалениеДублей.ТипыИсключаемыеИзВозможныхДублей +// Параметры: +// ИсключаемыеТипы - см. ПоискИУдалениеДублей.ТипыИсключаемыеИзВозможныхДублей +// Процедура ПриДобавленииТиповИсключаемыхИзВозможныхДублей(ИсключаемыеТипы) Экспорт ИсключаемыеТипы.Добавить(Тип("СправочникСсылка.Заметки")); diff --git a/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl index c11e0db1e..b8e23437d 100644 --- a/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl @@ -75,8 +75,8 @@ // * Обработчик - Строка - описание процедуры, обрабатывающей основное действие команды. // Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется, когда процедура размещена в общем модуле. // Формат "<ИмяПроцедуры>" используется в следующих случаях: -// - если ИмяФормы заполнено, то в модуле указанной формы ожидается клиентская процедура; -// - если ИмяФормы не заполнено, то в модуле менеджера этого объекта ожидается серверная процедура. +// если ИмяФормы заполнено, то в модуле указанной формы ожидается клиентская процедура; +// если ИмяФормы не заполнено, то в модуле менеджера этого объекта ожидается серверная процедура. // * ДополнительныеПараметры - ФиксированнаяСтруктура - параметры обработчика, указанного в Обработчик. // // Параметры - Структура - сведения о контексте исполнения: diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl index 7ef22eaf1..ea2709f0a 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl @@ -17,6 +17,7 @@ // * Объект - ДанныеФормыСтруктура // - СправочникОбъект // - ДокументОбъект +// // ОбработкаПродолжения - Неопределено - никаких действий после выполнения процедуры. // - ОписаниеОповещения - оповещение, которое вызывается после выполнения процедуры. // В обработку оповещения передается параметр типа Булево: @@ -24,9 +25,11 @@ // Ложь - видимых заблокированных реквизитов нет или // ссылки обнаружены и пользователь отказался от продолжения. // -Процедура РазрешитьРедактированиеРеквизитовОбъекта(Знач Форма, ОбработкаПродолжения = Неопределено) Экспорт +// ТолькоВидимые - Булево - чтобы получить и разблокировать все реквизиты объекта, нужно указать Ложь. +// +Процедура РазрешитьРедактированиеРеквизитовОбъекта(Знач Форма, ОбработкаПродолжения = Неопределено, ТолькоВидимые = Истина) Экспорт - ЗаблокированныеРеквизиты = Реквизиты(Форма); + ЗаблокированныеРеквизиты = Реквизиты(Форма, , ТолькоВидимые); Если ЗаблокированныеРеквизиты.Количество() = 0 Тогда ПоказатьПредупреждениеВсеВидимыеРеквизитыРазблокированы( diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl index 8ef3f88b1..66b0a4c1d 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl @@ -75,7 +75,7 @@ Возврат; КонецЕсли; - ДеревоОбластей = ДанныеФормыВЗначение(Форма[ИмяРеквизитаДеревоОбластей()], Тип("ДеревоЗначений")); + ДеревоОбластей = ДанныеФормыВЗначение(Форма[ИмяРеквизитаДеревоОбластей()], Тип("ДеревоЗначений")); // ДеревоЗначений ОбластиИспользования = Новый Массив; @@ -214,7 +214,7 @@ // // Параметры: // Субъект - ОпределяемыйТип.СубъектПерсональныхДанных - субъект, наличие согласия которого определяется, -// Организация - СправочникСсылка.Организации - оператор персональных данных, которому предоставлено согласие, +// Организация - ОпределяемыйТип.Организация - оператор персональных данных, которому предоставлено согласие, // Дата - Дата - дата, на которую запрашивается состояние, если не указана, выбирается последняя запись. // ИсключаемыйРегистратор - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных - текущий документ; // передается для того, чтобы при поиске согласия игнорировать выполненные текущим документом движения. @@ -888,15 +888,15 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ПолучениеСубъектовДляСкрытияПерсональныхДанных; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСкрытиеПерсональныхДанныхСубъектов; Зависимость.ДоступноВАвтономномРабочемМесте = Ложь; Зависимость.ДоступноВПодчиненномУзлеРИБ = Ложь; - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СкрытиеПерсональныхДанныхСубъектов; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСкрытиеПерсональныхДанныхСубъектов; Зависимость.ДоступноВАвтономномРабочемМесте = Ложь; @@ -1021,7 +1021,7 @@ // ИмяПланаОбмена - Строка - имя плана обмена, для которого будет выполнен механизм регистрации. // Объект - СправочникОбъект // - ДокументОбъект -// - РегистрСведенийНаборЗаписей и т.п. - проверяемый объект. +// - РегистрСведенийНаборЗаписей - проверяемый объект. // Функция ПропуститьРегистрациюОбъекта(ИмяПланаОбмена, Объект) Экспорт @@ -1420,7 +1420,7 @@ КонецПроцедуры -Функция ОбрабатываемыеМетаданные() Экспорт +Функция ОбрабатываемыеМетаданные() Структура = Новый Структура; Структура.Вставить("Константы", НСтр("ru = 'Константы'")); diff --git a/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl index 8e9e314f7..1d14ee9ac 100644 --- a/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl @@ -13,9 +13,9 @@ // Параметры: // Параметры - Структура: // -// * ТипОрганизации - ОписаниеТипов - (возвращаемое значение) содержит ссылочные типы, из которых +// * ТипОрганизации - ОписаниеТипов - возвращаемое значение. Содержит ссылочные типы, из которых // можно сделать выбор. Начальное значение ОпределяемыйТип.Организация. -// - Неопределено - (возвращаемое значение) выбор организации не поддерживается. +// - Неопределено - возвращаемое значение. Выбор организации не поддерживается. // // * Организация - СправочникСсылка - организация из ТипОрганизации, которую нужно заполнить. // Если организация уже заполнена, требуется перезаполнить ее свойства - например, @@ -23,41 +23,41 @@ // - Неопределено - если ТипОрганизации не настроен. // Пользователю недоступен выбор организации. // -// * ЭтоИндивидуальныйПредприниматель - Булево - (возвращаемое значение): +// * ЭтоИндивидуальныйПредприниматель - Булево - возвращаемое значение: // Ложь - начальное значение - указанная организация является юридическим лицом; // Истина - указанная организация является индивидуальным предпринимателем. // -// * ЭтоИностраннаяОрганизация - Булево - (возвращаемое значение), когда Истина ОГРН не заполняется. +// * ЭтоИностраннаяОрганизация - Булево - возвращаемое значение, когда Истина ОГРН не заполняется. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * НаименованиеСокращенное - Строка - (возвращаемое значение) краткое наименование организации. +// * НаименованиеСокращенное - Строка - возвращаемое значение. Краткое наименование организации. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * НаименованиеПолное - Строка - (возвращаемое значение) краткое наименование организации. +// * НаименованиеПолное - Строка - возвращаемое значение. Краткое наименование организации. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ИНН - Строка - (возвращаемое значение) ИНН организации. +// * ИНН - Строка - возвращаемое значение. ИНН организации. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * КПП - Строка - (возвращаемое значение) КПП организации. +// * КПП - Строка - возвращаемое значение. КПП организации. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ОГРН - Строка - (возвращаемое значение) ОГРН организации (кроме иностранных). +// * ОГРН - Строка - возвращаемое значение. ОГРН организации (кроме иностранных). // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * РасчетныйСчет - Строка - (возвращаемое значение) основной расчетный счет организации для договора. +// * РасчетныйСчет - Строка - возвращаемое значение. Основной расчетный счет организации для договора. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * БИК - Строка - (возвращаемое значение) БИК банка расчетного счета. +// * БИК - Строка - возвращаемое значение. БИК банка расчетного счета. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * КорреспондентскийСчет - Строка - (возвращаемое значение) корреспондентский счет банка расчетного счета. +// * КорреспондентскийСчет - Строка - возвращаемое значение. Корреспондентский счет банка расчетного счета. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Телефон - Строка - (возвращаемое значение) телефон организации в формате JSON, как его +// * Телефон - Строка - возвращаемое значение. Телефон организации в формате JSON, как его // возвращает функция КонтактнаяИнформацияОбъекта общего модуля УправлениеКонтактнойИнформацией. // -// * ЮридическийАдрес - Строка - (возвращаемое значение) юридический адрес организации в формате JSON, как его +// * ЮридическийАдрес - Строка - возвращаемое значение. Юридический адрес организации в формате JSON, как его // возвращает функция КонтактнаяИнформацияОбъекта общего модуля УправлениеКонтактнойИнформацией. // - Неопределено - значение не указано, не изменять имеющееся значение. // @@ -76,90 +76,90 @@ // * Организация - СправочникСсылка - выбранная организация из ТипОрганизации, на которую оформляется сертификат. // - Неопределено - если ТипОрганизации не настроен или составной и тип организации не выбран. // -// * ТипВладельца - ОписаниеТипов - (возвращаемое значение) содержит ссылочные типы, из которых можно сделать выбор. -// - Неопределено - (возвращаемое значение) выбор владельца не поддерживается. +// * ТипВладельца - ОписаниеТипов - возвращаемое значение. Содержит ссылочные типы, из которых можно сделать выбор. +// - Неопределено - возвращаемое значение. Выбор владельца не поддерживается. // -// * Сотрудник - СправочникСсылка - (возвращаемое значение) - это владелец сертификата из ТипВладельца, +// * Сотрудник - СправочникСсылка - возвращаемое значение. Владелец сертификата из ТипВладельца, // которого нужно заполнить. Если уже заполнен (выбран пользователем), его не следует изменять. // - Неопределено - если ТипВладельца не определен, тогда реквизит не доступен пользователю. // -// * Директор - СправочникСсылка - (возвращаемое значение) - это директор из ТипВладельца, который может быть +// * Директор - СправочникСсылка - возвращаемое значение. Директор из ТипВладельца, который может быть // выбран, как владелец сертификата. Не учитывается, если заявление для ИП или физического лица. // - Неопределено - начальное значение - скрыть директора из списка выбора. // -// * ГлавныйБухгалтер - СправочникСсылка - (возвращаемое значение) это главный бухгалтер из ТипВладельца, который может +// * ГлавныйБухгалтер - СправочникСсылка - возвращаемое значение. Главный бухгалтер из ТипВладельца, который может // быть выбран как владелец сертификата. Не учитывается, если заявление для ИП или физического лица. // - Неопределено - начальное значение - скрыть главного бухгалтера из списка выбора. // -// * Пользователь - СправочникСсылка.Пользователи - (возвращаемое значение) пользователь - владелец сертификата. +// * Пользователь - СправочникСсылка.Пользователи - возвращаемое значение. Пользователь - владелец сертификата. // В общем случае может быть не заполнено. Рекомендуется заполнить, если есть возможность. // Записывается в сертификат в поле Пользователь, может быть изменено в дальнейшем. // -// * Фамилия - Строка - (возвращаемое значение) фамилия сотрудника. +// * Фамилия - Строка - возвращаемое значение. Фамилия сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Имя - Строка - (возвращаемое значение) имя сотрудника. +// * Имя - Строка - возвращаемое значение. Имя сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Отчество - Строка - (возвращаемое значение) отчество сотрудника. +// * Отчество - Строка - возвращаемое значение. Отчество сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ДатаРождения - Дата - (возвращаемое значение) дата рождения сотрудника. +// * ДатаРождения - Дата - возвращаемое значение. Дата рождения сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Пол - Строка - (возвращаемое значение) пол сотрудника "Мужской" или "Женский". +// * Пол - Строка - возвращаемое значение. Пол сотрудника "Мужской" или "Женский". // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * МестоРождения - Строка - (возвращаемое значение) описание места рождения сотрудника. +// * МестоРождения - Строка - возвращаемое значение. Описание места рождения сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Гражданство - СправочникСсылка.СтраныМира - (возвращаемое значение) гражданство сотрудника. +// * Гражданство - СправочникСсылка.СтраныМира - возвращаемое значение. Гражданство сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ИНН - Строка - (возвращаемое значение) ИНН физического лица. +// * ИНН - Строка - возвращаемое значение. ИНН физического лица. // Учитывается только в заявлении для физического лица. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * СтраховойНомерПФР - Строка - (возвращаемое значение) СНИЛС сотрудника. +// * СтраховойНомерПФР - Строка - возвращаемое значение. СНИЛС сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Должность - Строка - (возвращаемое значение) должность сотрудника в организации. +// * Должность - Строка - возвращаемое значение. Должность сотрудника в организации. // Не учитывается, если заявление для ИП или физического лица. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Подразделение - Строка - (возвращаемое значение) обособленное подразделение организации, в котором +// * Подразделение - Строка - возвращаемое значение. Обособленное подразделение организации, в котором // работает сотрудник. Не учитывается, если заявление для ИП или физического лица. // - Неопределено - значение не указано, не изменять имеющееся значение. // // -// * ДокументВид - Строка - (возвращаемое значение) строки "21" или "91". 21 - паспорт гражданина РФ, +// * ДокументВид - Строка - возвращаемое значение. Строки "21" или "91". 21 - паспорт гражданина РФ, // 91 - иной документ, предусмотренный законодательством РФ (по СПДУЛ). // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ДокументНомер - Строка - (возвращаемое значение) номер документа сотрудника (серия и +// * ДокументНомер - Строка - возвращаемое значение. Номер документа сотрудника (серия и // номер для паспорта гражданина РФ). // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ДокументКемВыдан - Строка - (возвращаемое значение) кем выдан документ сотрудника. +// * ДокументКемВыдан - Строка - возвращаемое значение. Кем выдан документ сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ДокументКодПодразделения - Строка - (возвращаемое значение) - код подразделения, если вид документа 21. +// * ДокументКодПодразделения - Строка - возвращаемое значение. Код подразделения, если вид документа 21. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ДокументДатаВыдачи - Дата - (возвращаемое значение) дата выдачи документа сотрудника. +// * ДокументДатаВыдачи - Дата - возвращаемое значение. Дата выдачи документа сотрудника. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * АдресРегистрации - Строка - (возвращаемое значение) адрес постоянной или временной регистрации +// * АдресРегистрации - Строка - возвращаемое значение. Адрес постоянной или временной регистрации // физического лица (минимум регион, населенный пункт) в формате JSON, как его возвращает // функция КонтактнаяИнформацияОбъекта общего модуля УправлениеКонтактнойИнформацией. // Учитывается только в заявлении для физического лица. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * ЭлектроннаяПочта - Строка - (возвращаемое значение) адрес электронной почты сотрудника в формате XML, как его -// возвращает функция КонтактнаяИнформацияВXML общего модуля УправлениеКонтактнойИнформацией. +// * ЭлектроннаяПочта - Строка - возвращаемое значение. Адрес электронной почты сотрудника в формате JSON, как его +// возвращает функция КонтактнаяИнформацияОбъекта общего модуля УправлениеКонтактнойИнформацией. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Телефон - Строка - (возвращаемое значение) телефон физического лица в формате JSON, как его +// * Телефон - Строка - возвращаемое значение. Телефон физического лица в формате JSON, как его // возвращает функция КонтактнаяИнформацияОбъекта общего модуля УправлениеКонтактнойИнформацией. // Учитывается только в заявлении для физического лица. // @@ -178,21 +178,21 @@ // * Организация - СправочникСсылка - выбранная организация из ТипОрганизации, на которую оформляется сертификат. // - Неопределено - если ТипОрганизации не настроен. // -// * ТипРуководителя - ОписаниеТипов - (возвращаемое значение) содержит ссылочные типы, из которых можно сделать выбор. -// - Неопределено - (возвращаемое значение) выбор партнера не поддерживается. +// * ТипРуководителя - ОписаниеТипов - возвращаемое значение. Содержит ссылочные типы, из которых можно сделать выбор. +// - Неопределено - возвращаемое значение. Выбор партнера не поддерживается. // // * Руководитель - СправочникСсылка - это значение из ТипРуководителя, выбранное пользователем, // по которому нужно заполнить должность. // - Неопределено - ТипРуководителя не определен. -// - ЛюбаяСсылка - (возвращаемое значение) - руководитель, который будет подписывать документы. +// - ЛюбаяСсылка - возвращаемое значение. Руководитель, который будет подписывать документы. // -// * Представление - Строка - (возвращаемое значение) представление руководителя. +// * Представление - Строка - возвращаемое значение. Представление руководителя. // - Неопределено - получить представление от значения Руководитель. // -// * Должность - Строка - (возвращаемое значение) - должность руководителя, который будет подписывать документы. +// * Должность - Строка - возвращаемое значение. Должность руководителя, который будет подписывать документы. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * Основание - Строка - (возвращаемое значение) - основание на котором действует +// * Основание - Строка - возвращаемое значение. Основание на котором действует // должностное лицо (устав, доверенность, ...). // - Неопределено - значение не указано, не изменять имеющееся значение. // @@ -217,19 +217,19 @@ // * Партнер - СправочникСсылка - это контрагент (обслуживающая организация) из ТипПартнера, // выбранный пользователем, по которому нужно заполнить реквизиты, описанные ниже. // - Неопределено - ТипПартнера не определен. -// - ЛюбаяСсылка - (возвращаемое значение) - значение, сохраняемое в заявке для истории. +// - ЛюбаяСсылка - возвращаемое значение. Значение, сохраняемое в заявке для истории. // -// * Представление - Строка - (возвращаемое значение) представление партнера. +// * Представление - Строка - возвращаемое значение. Представление партнера. // - Неопределено - получить представление от значения Партнер. // -// * ЭтоИндивидуальныйПредприниматель - Булево - (возвращаемое значение): +// * ЭтоИндивидуальныйПредприниматель - Булево - возвращаемое значение: // Ложь - начальное значение - указанный партнер является юридическим лицом, // Истина - указанный партнер является индивидуальным предпринимателем. // -// * ИНН - Строка - (возвращаемое значение) ИНН партнера. +// * ИНН - Строка - возвращаемое значение. ИНН партнера. // - Неопределено - значение не указано, не изменять имеющееся значение. // -// * КПП - Строка - (возвращаемое значение) КПП партнера. +// * КПП - Строка - возвращаемое значение. КПП партнера. // - Неопределено - значение не указано, не изменять имеющееся значение. // Процедура ПриЗаполненииРеквизитовПартнераВЗаявленииНаСертификат(Параметры) Экспорт diff --git a/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl b/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl index 64d363a30..0eff318d5 100644 --- a/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl +++ b/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl @@ -5,7 +5,6 @@ // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Определяет события, на которые могут подписаться другие библиотеки. @@ -15,7 +14,7 @@ // могут быть подписаны библиотеки. // Функция СобытияБСП() Экспорт - + События = Новый Структура; // БазоваяФункциональность @@ -126,6 +125,8 @@ // РегламентныеЗадания События.Вставить("ПриОпределенииНастроекРегламентныхЗаданий", Ложь); + События.Вставить("ПриЗапретеРаботыСВнешнимиРесурсами", Ложь); + События.Вставить("ПриРазрешенииРаботыСВнешнимиРесурсами", Ложь); // Свойства События.Вставить("ПриПолученииПредопределенныхНаборовСвойств", Ложь); @@ -151,9 +152,9 @@ // ЦентрМониторинга События.Вставить("ПриСбореПоказателейСтатистикиКонфигурации", Ложь); - + Возврат События; - + КонецФункции #Область ОбработчикиСобытийБТС @@ -201,19 +202,21 @@ // РаботаВМоделиСервиса_ПоставляемыеДанные Подписки.ПриОпределенииОбработчиковПоставляемыхДанных = Истина; - + КонецПроцедуры #Область БазоваяФункциональность // См. ОбновлениеИнформационнойБазыБТС.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновленияБТС(Обработчики) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -222,128 +225,144 @@ // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке. Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - + СтандартныеПодсистемыСервер.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); МодульРаботаСБанками.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - МодульДатыЗапретаИзмененияСлужебный.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); + МодульДатыЗапретаИзмененияСлужебный.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке( + Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); МодульКалендарныеГрафики.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке. Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - + СтандартныеПодсистемыСервер.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); МодульВнешниеКомпонентыСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда - МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыВМоделиСервисаСлужебный"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда + МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ВнешниеКомпонентыВМоделиСервисаСлужебный"); МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); МодульСоединенияИБ.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчетаСлужебный = ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчетаСлужебный"); МодульКонтрольВеденияУчетаСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); МодульАдресныйКлассификаторСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда - МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда + МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "РаботаСФайламиСлужебныйВМоделиСервиса"); МодульРаботаСФайламиСлужебныйВМоделиСервиса.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы); + КонецЕсли; КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда - МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда + МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "РаботаСФайламиСлужебныйВМоделиСервиса"); МодульРаботаСФайламиСлужебныйВМоделиСервиса.ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков); КонецЕсли; @@ -351,116 +370,128 @@ МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковЗагрузкиДанных. Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда - МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда + МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "РаботаСФайламиСлужебныйВМоделиСервиса"); МодульРаботаСФайламиСлужебныйВМоделиСервиса.ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПередВыгрузкойДанных Процедура ПередВыгрузкойДанных(Контейнер) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПередВыгрузкойДанных(Контейнер); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнтерфейсOData") Тогда МодульИнтерфейсODataСлужебный = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсODataСлужебный"); МодульИнтерфейсODataСлужебный.ПередВыгрузкойДанных(Контейнер); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПередЗагрузкойДанных Процедура ПередЗагрузкойДанных(Контейнер) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПередЗагрузкойДанных(Контейнер); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнтерфейсOData") Тогда МодульИнтерфейсODataСлужебный = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсODataСлужебный"); МодульИнтерфейсODataСлужебный.ПередЗагрузкойДанных(Контейнер); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиДанных. Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт - + ПользователиСлужебный.ПослеЗагрузкиДанных(Контейнер); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); МодульРегламентныеЗаданияСлужебный.ПослеЗагрузкиДанных(Контейнер); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалютСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалютСлужебный"); МодульРаботаСКурсамиВалютСлужебный.ПослеЗагрузкиДанных(Контейнер); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПослеЗагрузкиДанных(Контейнер); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "УправлениеДоступомСлужебныйВМоделиСервиса"); МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПослеЗагрузкиДанных(Контейнер); КонецЕсли; - + ОбновлениеИнформационнойБазыСлужебный.ПослеЗагрузкиДанных(Контейнер); - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗагрузкеПользователяИнформационнойБазы. Процедура ПриЗагрузкеПользователяИнформационнойБазы(Контейнер, Сериализация, ПользовательИБ, Отказ) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ПриЗагрузкеПользователяИнформационнойБазы(Контейнер, Сериализация, ПользовательИБ, Отказ); + МодульПользователиСлужебныйВМоделиСервиса.ПриЗагрузкеПользователяИнформационнойБазы(Контейнер, Сериализация, + ПользовательИБ, Отказ); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиПользователяИнформационнойБазы. Процедура ПослеЗагрузкиПользователяИнформационнойБазы(Контейнер, Сериализация, ПользовательИБ) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ПослеЗагрузкиПользователяИнформационнойБазы(Контейнер, Сериализация, ПользовательИБ); + МодульПользователиСлужебныйВМоделиСервиса.ПослеЗагрузкиПользователяИнформационнойБазы(Контейнер, Сериализация, + ПользовательИБ); КонецЕсли; - + КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиПользователейИнформационнойБазы. Процедура ПослеЗагрузкиПользователейИнформационнойБазы(Контейнер) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПослеЗагрузкиПользователейИнформационнойБазы(Контейнер); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -469,21 +500,26 @@ // См. РаботаВМоделиСервисаПереопределяемый.ПриЗаполненииТаблицыПараметровИБ. Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); МодульРегламентныеЗаданияСлужебный.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); МодульСоединенияИБ.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров); + КонецЕсли; КонецПроцедуры @@ -494,12 +530,13 @@ // Псевдоним - Строка - псевдоним пользователя информационной базы для отображения в интерфейсе. // Процедура ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним); + МодульПользователиСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, + Псевдоним); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -508,32 +545,32 @@ // См. ОбменСообщениямиПереопределяемый.ПолучитьОбработчикиКаналовСообщений. Процедура ПриОпределенииОбработчиковКаналовСообщений(Обработчики) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОпределенииОбработчиковКаналовСообщений(Обработчики); КонецЕсли; - + КонецПроцедуры // См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиОтправляемыхСообщений. Процедура РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.РегистрацияИнтерфейсовОтправляемыхСообщений(МассивОбработчиков); КонецЕсли; - + КонецПроцедуры // См. ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый.ЗаполнитьОбработчикиПринимаемыхСообщений. Процедура РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.РегистрацияИнтерфейсовПринимаемыхСообщений(МассивОбработчиков); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -542,55 +579,61 @@ // См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); МодульУправлениеЭлектроннойПочтой = ОбщегоНазначения.ОбщийМодуль("УправлениеЭлектроннойПочтой"); МодульУправлениеЭлектроннойПочтой.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - + ОбновлениеИнформационнойБазыСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); - + ПользователиСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); - + СтандартныеПодсистемыСервер.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "УправлениеДоступомСлужебныйВМоделиСервиса"); МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеИтогамиИАгрегатамиСлужебный"); МодульУправлениеИтогамиИАгрегатамиСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда - МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда + МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "РаботаСФайламиСлужебныйВМоделиСервиса"); МодульРаботаСФайламиСлужебныйВМоделиСервиса.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчетаСлужебный = ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчетаСлужебный"); МодульКонтрольВеденияУчетаСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); @@ -599,67 +642,79 @@ // См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалютСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалютСлужебный"); МодульРаботаСКурсамиВалютСлужебный.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); - МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииПсевдонимовОбработчиков( + СоответствиеИменПсевдонимам); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда МодульКалендарныеГрафикиСлужебный = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафикиСлужебный"); МодульКалендарныеГрафикиСлужебный.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков( + СоответствиеИменПсевдонимам); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда - МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда + МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "РаботаСФайламиСлужебныйВМоделиСервиса"); МодульРаботаСФайламиСлужебныйВМоделиСервиса.ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам); КонецЕсли; - + КонецПроцедуры // См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииИспользованияРегламентныхЗаданий( + ТаблицаИспользования); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда - МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.РаботаСФайламиВМоделиСервиса") Тогда + МодульРаботаСФайламиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "РаботаСФайламиСлужебныйВМоделиСервиса"); МодульРаботаСФайламиСлужебныйВМоделиСервиса.ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -668,31 +723,38 @@ // См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); МодульАдресныйКлассификаторСлужебный.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалютСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалютСлужебный"); МодульРаботаСКурсамиВалютСлужебный.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); МодульЭлектроннаяПодписьСлужебный.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики); + КонецЕсли; КонецПроцедуры @@ -719,19 +781,19 @@ Подписки.ПриДобавленииКлассификаторов = Истина; Подписки.ПриЗагрузкеКлассификатора = Истина; Подписки.ПриОбработкеОбластиДанных = Истина; - + КонецПроцедуры #Область БазоваяФункциональность // См. ИнтернетПоддержкаПользователейПереопределяемый.ПриИзмененииДанныхАутентификацииИнтернетПоддержки. Процедура ПриИзмененииДанныхАутентификацииИнтернетПоддержки(ДанныеПользователя) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриИзмененииДанныхАутентификацииИнтернетПоддержки(ДанныеПользователя); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -740,63 +802,69 @@ // См. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов. Процедура ПриДобавленииКлассификаторов(Классификаторы) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") И Метаданные.Обработки.Найти( + "ЗагрузкаКлассификатораБанков") <> Неопределено Тогда МодульЗагрузкаКлассификатораБанков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКлассификатораБанков"); МодульЗагрузкаКлассификатораБанков.ПриДобавленииКлассификаторов(Классификаторы); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") И Метаданные.Обработки.Найти( + "ЗагрузкаКурсовВалют") <> Неопределено Тогда МодульЗагрузкаКурсовВалют = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКурсовВалют"); МодульЗагрузкаКурсовВалют.ПриДобавленииКлассификаторов(Классификаторы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); МодульКалендарныеГрафики.ПриДобавленииКлассификаторов(Классификаторы); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") И Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда - МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); - МодульРаботаСАдресами.ПриДобавленииКлассификаторов(Классификаторы); + МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); + МодульРаботаСАдресами.ПриДобавленииКлассификаторов(Классификаторы); КонецЕсли; - + КонецПроцедуры // См. РаботаСКлассификаторамиПереопределяемый.ПриЗагрузкеКлассификатора. Процедура ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда МодульЗагрузкаКлассификатораБанков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКлассификатораБанков"); - МодульЗагрузкаКлассификатораБанков.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры); + МодульЗагрузкаКлассификатораБанков.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, + ДополнительныеПараметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульЗагрузкаКурсовВалют = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКурсовВалют"); - МодульЗагрузкаКурсовВалют.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры); + МодульЗагрузкаКурсовВалют.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, + ДополнительныеПараметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); - МодульКалендарныеГрафики.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры); + МодульКалендарныеГрафики.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, + ДополнительныеПараметры); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") И Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); - МодульРаботаСАдресами.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, ДополнительныеПараметры); + МодульРаботаСАдресами.ПриЗагрузкеКлассификатора(Идентификатор, Версия, Адрес, Обработан, + ДополнительныеПараметры); КонецЕсли; - + КонецПроцедуры // См. РаботаСКлассификаторамиВМоделиСервисаПереопределяемый.ПриОбработкеОбластиДанных. Процедура ПриОбработкеОбластиДанных(Идентификатор, Версия, ДополнительныеПараметры) Экспорт - + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда Возврат; КонецЕсли; - + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); Если Идентификатор <> МодульКалендарныеГрафики.ИдентификаторКлассификатора() Тогда Возврат; @@ -805,11 +873,11 @@ Если Не ДополнительныеПараметры.Свойство(Идентификатор) Тогда Возврат; КонецЕсли; - + ПараметрыОбновления = ДополнительныеПараметры[Идентификатор]; - + МодульКалендарныеГрафики.ЗаполнитьДанныеЗависимыеОтПроизводственныхКалендарей(ПараметрыОбновления.ТаблицаИзменений); - + КонецПроцедуры #КонецОбласти @@ -824,821 +892,877 @@ // См. ПодсистемыКонфигурацииПереопределяемый.ПриДобавленииПодсистем. Процедура ПриДобавленииПодсистем(МодулиПодсистем) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииПодсистем Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриДобавленииПодсистем(МодулиПодсистем); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииПодсистем Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриДобавленииПодсистем(МодулиПодсистем); КонецЕсли; - + КонецПроцедуры // Параметры: // Параметры - см. СтандартныеПодсистемыСервер.УстановкаПараметровСеанса.ИменаПараметровСеанса. // Процедура ПриУстановкеПараметровСеанса(Параметры) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриУстановкеПараметровСеанса Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриУстановкеПараметровСеанса(Параметры); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриУстановкеПараметровСеанса Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриУстановкеПараметровСеанса(Параметры); КонецЕсли; - + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт - + ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); ПользователиСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда МодульБлокировкаРаботыСВнешнимиРесурсами = ОбщегоНазначения.ОбщийМодуль("БлокировкаРаботыСВнешнимиРесурсами"); МодульБлокировкаРаботыСВнешнимиРесурсами.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииОбработчиковУстановкиПараметровСеанса Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииОбработчиковУстановкиПараметровСеанса Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); + КонецЕсли; КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + ПользователиСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); СтандартныеПодсистемыСервер.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииИсключенийПоискаСсылок Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииИсключенийПоискаСсылок Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок); КонецЕсли; - + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов Процедура ПриОпределенииПодчиненныхОбъектов(ПодчиненныеОбъекты) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриОпределенииПодчиненныхОбъектов(ПодчиненныеОбъекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриОпределенииПодчиненныхОбъектов(ПодчиненныеОбъекты); КонецЕсли; - + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПередПоискомМестИспользования. Процедура ПередПоискомМестИспользования(ПарыЗамен, ПараметрыВыполнения) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда МодульПоискИУдалениеДублей = ОбщегоНазначения.ОбщийМодуль("ПоискИУдалениеДублей"); МодульПоискИУдалениеДублей.ДополнитьДублиСвязаннымиПодчиненнымиОбъектами(ПарыЗамен, ПараметрыВыполнения); КонецЕсли; - + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - + СтандартныеПодсистемыСервер.ПриДобавленииПереименованийОбъектовМетаданных(Итог); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда МодульАнализЖурналаРегистрацииСлужебный = ОбщегоНазначения.ОбщийМодуль("АнализЖурналаРегистрацииСлужебный"); МодульАнализЖурналаРегистрацииСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда МодульВызовОнлайнПоддержки = ОбщегоНазначения.ОбщийМодуль("ВызовОнлайнПоддержки"); МодульВызовОнлайнПоддержки.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); МодульЗаметкиПользователяСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); МодульНапоминанияПользователяСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда МодульПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); МодульПанельАдминистрированияБСП.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СтруктураПодчиненности") Тогда МодульСтруктураПодчиненностиСлужебный = ОбщегоНазначения.ОбщийМодуль("СтруктураПодчиненностиСлужебный"); МодульСтруктураПодчиненностиСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный"); МодульТекущиеДелаСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); МодульЭлектроннаяПодписьСлужебный.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииПереименованийОбъектовМетаданных Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииПереименованийОбъектовМетаданных Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; - + КонецПроцедуры // См. РегистрСведений.ПараметрыРаботыВерсийРасширений.ЗаполнитьВсеПараметрыРаботыРасширений. Процедура ПриЗаполненииВсехПараметровРаботыРасширений() Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриЗаполненииВсехПараметровРаботыРасширений(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); МодульПодключаемыеКоманды.ПриЗаполненииВсехПараметровРаботыРасширений(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриЗаполненииВсехПараметровРаботыРасширений(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииВсехПараметровРаботыРасширений Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииВсехПараметровРаботыРасширений(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииВсехПараметровРаботыРасширений Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииВсехПараметровРаботыРасширений(); КонецЕсли; - + КонецПроцедуры // См. РегистрСведений.ПараметрыРаботыВерсийРасширений.ОчиститьВсеПараметрыРаботыРасширений. Процедура ПриОчисткеВсехПараметровРаботыРасширений() Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриОчисткеВсехПараметровРаботыРасширений(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОчисткеВсехПараметровРаботыРасширений Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОчисткеВсехПараметровРаботыРасширений(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОчисткеВсехПараметровРаботыРасширений Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОчисткеВсехПараметровРаботыРасширений(); КонецЕсли; - + КонецПроцедуры // См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному. Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); МодульВнешниеКомпонентыСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда - МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыВМоделиСервисаСлужебный"); - МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда + МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ВнешниеКомпонентыВМоделиСервисаСлужебный"); + МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, + Получатель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - + ОбновлениеИнформационнойБазыСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); ПользователиСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОтправкеДанныхГлавному Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОтправкеДанныхГлавному Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель); КонецЕсли; - + КонецПроцедуры // См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному. Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - МодульВерсионированиеОбъектов.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + МодульВерсионированиеОбъектов.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); - МодульВнешниеКомпонентыСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + МодульВнешниеКомпонентыСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда - МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыВМоделиСервисаСлужебный"); - МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда + МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ВнешниеКомпонентыВМоделиСервисаСлужебный"); + МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - МодульДатыЗапретаИзмененияСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + МодульДатыЗапретаИзмененияСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - - ОбновлениеИнформационнойБазыСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); - ПользователиСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); - + + ОбновлениеИнформационнойБазыСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); + ПользователиСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, + Получатель); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + МодульРаботаСФайламиСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + МодульУправлениеДоступомСлужебный.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОтправкеДанныхПодчиненному Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + МодульИнтеграцияПодсистемБТС.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОтправкеДанныхПодчиненному Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); + МодульИнтеграцияПодсистемБИП.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, + СозданиеНачальногоОбраза, Получатель); КонецЕсли; - + КонецПроцедуры // См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - МодульВерсионированиеОбъектов.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульВерсионированиеОбъектов.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); - МодульВнешниеКомпонентыСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульВнешниеКомпонентыСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда - МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыВМоделиСервисаСлужебный"); - МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда + МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ВнешниеКомпонентыВМоделиСервисаСлужебный"); + МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - МодульДатыЗапретаИзмененияСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульДатыЗапретаИзмененияСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульДополнительныеОтчетыИОбработки.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); - МодульЗащитаПерсональныхДанных.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульЗащитаПерсональныхДанных.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + ПользователиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); - МодульРаботаСПочтовымиСообщениямиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульРаботаСФайламиСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульУправлениеДоступомСлужебный.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииДанныхОтГлавного Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульИнтеграцияПодсистемБТС.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПолученииДанныхОтГлавного Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульИнтеграцияПодсистемБИП.ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + КонецПроцедуры // См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного. Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); - МодульВерсионированиеОбъектов.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульВерсионированиеОбъектов.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); - МодульВнешниеКомпонентыСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульВнешниеКомпонентыСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда - МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыВМоделиСервисаСлужебный"); - МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда + МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ВнешниеКомпонентыВМоделиСервисаСлужебный"); + МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, + ПолучениеЭлемента, ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); - МодульОбменДаннымиВМоделиСервиса.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульОбменДаннымиВМоделиСервиса.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - МодульДатыЗапретаИзмененияСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульДатыЗапретаИзмененияСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульДополнительныеОтчетыИОбработки.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); - МодульЗащитаПерсональныхДанных.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульЗащитаПерсональныхДанных.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + ПользователиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульРаботаСФайламиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); - МодульРаботаСПочтовымиСообщениямиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульУправлениеДоступомСлужебный.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, + ОтправкаНазад, Отправитель); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииДанныхОтПодчиненного Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульИнтеграцияПодсистемБТС.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПолученииДанныхОтПодчиненного Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); + МодульИнтеграцияПодсистемБИП.ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, + Отправитель); КонецЕсли; - + КонецПроцедуры // См. СтандартныеПодсистемыСервер.ПослеПолученияДанных. Процедура ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла) Экспорт - + ПользователиСлужебный.ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПослеПолученияДанных Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПослеПолученияДанных Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПослеПолученияДанных(Отправитель, Отказ, ПолучениеИзГлавногоУзла); КонецЕсли; - + КонецПроцедуры // См. РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных. Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); МодульКалендарныеГрафики.ПриВключенииРазделенияПоОбластямДанных(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриВключенииРазделенияПоОбластямДанных(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриВключенииРазделенияПоОбластямДанных Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриВключенииРазделенияПоОбластямДанных(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриВключенииРазделенияПоОбластямДанных Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриВключенииРазделенияПоОбластямДанных(); КонецЕсли; - + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; - + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиентаПриЗапуске. Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииПараметровРаботыКлиентаПриЗапуске Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); МодульИнформацияПриЗапуске.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчетаСлужебный = ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчетаСлужебный"); МодульКонтрольВеденияУчетаСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); МодульНапоминанияПользователяСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); МодульОбновлениеКонфигурации.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); МодульРаботаСБанками.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); МодульРезервноеКопированиеИБСервер.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); МодульСоединенияИБ.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); МодульЦентрМониторингаСлужебный.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииПараметровРаботыКлиентаПриЗапуске Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЕсли; - + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента. Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииПараметровРаботыКлиента Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); МодульАдресныйКлассификаторСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); МодульНапоминанияПользователяСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); МодульОбновлениеКонфигурации.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS"); МодульОтправкаSMS.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); МодульПолучениеФайловИзИнтернетаСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + ПользователиСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); МодульРезервноеКопированиеИБСервер.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); МодульСоединенияИБ.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + СтандартныеПодсистемыСервер.ПриДобавленииПараметровРаботыКлиента(Параметры); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); МодульЭлектроннаяПодписьСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииПараметровРаботыКлиента Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриДобавленииПараметровРаботыКлиента(Параметры); + КонецЕсли; КонецПроцедуры // См. СтандартныеПодсистемыСервер.ПередЗапускомПрограммы Процедура ПередЗапускомПрограммы() Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПередЗапускомПрограммы(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередЗапускомПрограммы Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПередЗапускомПрограммы(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередЗапускомПрограммы Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПередЗапускомПрограммы(); КонецЕсли; - + КонецПроцедуры // Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек @@ -1647,44 +1771,46 @@ // Объекты - Массив из ОбъектМетаданных // Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + ПользователиСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда МодульУчетОригиналовПервичныхДокументов = ОбщегоНазначения.ОбщийМодуль("УчетОригиналовПервичныхДокументов"); МодульУчетОригиналовПервичныхДокументов.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -1693,236 +1819,248 @@ // См. ВариантыОтчетовПереопределяемый.ПриОпределенииНастроек. Процедура ПриОпределенииНастроекВариантовОтчетов(Настройки) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииНастроекВариантовОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииНастроекВариантовОтчетов(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииНастроекВариантовОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииНастроекВариантовОтчетов(Настройки); КонецЕсли; - + КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов. Процедура ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииРазделовСВариантамиОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииРазделовСВариантамиОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииРазделовСВариантамиОтчетов(СписокРазделов); КонецЕсли; - + КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда МодульАнализЖурналаРегистрацииСлужебный = ОбщегоНазначения.ОбщийМодуль("АнализЖурналаРегистрацииСлужебный"); МодульАнализЖурналаРегистрацииСлужебный.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); МодульАнкетирование.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; ОбновлениеИнформационнойБазыСлужебный.ПриНастройкеВариантовОтчетов(Настройки); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда МодульПоискИУдалениеДублей = ОбщегоНазначения.ОбщийМодуль("ПоискИУдалениеДублей"); МодульПоискИУдалениеДублей.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + ПользователиСлужебный.ПриНастройкеВариантовОтчетов(Настройки); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный"); МодульРаботаВБезопасномРежимеСлужебный.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтчетОДвиженияхДокумента") Тогда МодульДвиженияДокумента = ОбщегоНазначения.ОбщийМодуль("Отчеты.ДвиженияДокумента"); МодульДвиженияДокумента.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульРезультатыПроверкиУчета = ОбщегоНазначения.ОбщийМодуль("Отчеты.РезультатыПроверкиУчета"); МодульРезультатыПроверкиУчета.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриНастройкеВариантовОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриНастройкеВариантовОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриНастройкеВариантовОтчетов(Настройки); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриНастройкеВариантовОтчетов(Настройки); + КонецЕсли; КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов. Процедура ПриИзмененииКлючейВариантовОтчетов(Изменения) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриИзмененииКлючейВариантовОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриИзмененииКлючейВариантовОтчетов(Изменения); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриИзмененииКлючейВариантовОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриИзмененииКлючейВариантовОтчетов(Изменения); КонецЕсли; - + КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов. Процедура ПриОпределенииОбъектовСКомандамиОтчетов(Объекты) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); МодульАнкетирование.ПриОпределенииОбъектовСКомандамиОтчетов(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовСКомандамиОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовСКомандамиОтчетов(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовСКомандамиОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовСКомандамиОтчетов(Объекты); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриОпределенииОбъектовСКомандамиОтчетов(Объекты); + КонецЕсли; КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов. -Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка) Экспорт - +Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтчетОДвиженияхДокумента") Тогда МодульДвиженияДокумента = ОбщегоНазначения.ОбщийМодуль("Отчеты.ДвиженияДокумента"); - МодульДвиженияДокумента.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка); + МодульДвиженияДокумента.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульРезультатыПроверкиУчета = ОбщегоНазначения.ОбщийМодуль("Отчеты.РезультатыПроверкиУчета"); - МодульРезультатыПроверкиУчета.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка); + МодульРезультатыПроверкиУчета.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, + СтандартнаяОбработка); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка); + МодульУправлениеДоступомСлужебный.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, + СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередДобавлениемКомандОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка); + МодульИнтеграцияПодсистемБТС.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередДобавлениемКомандОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка); + МодульИнтеграцияПодсистемБИП.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // См. ОтчетыПереопределяемый.ДополнитьСвязиОбъектовМетаданных. Процедура ПриДополненииСвязиОбъектовМетаданных(Результат) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДополненииСвязиОбъектовМетаданных Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриДополненииСвязиОбъектовМетаданных(Результат); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДополненииСвязиОбъектовМетаданных Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриДополненииСвязиОбъектовМетаданных(Результат); КонецЕсли; - + КонецПроцедуры // См. ОтчетыПереопределяемый.ПриОпределенииПараметровВыбора. Процедура ПриОпределенииПараметровВыбораВариантыОтчетов(Форма, СвойстваНастройки) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииПараметровВыбораВариантыОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииПараметровВыбораВариантыОтчетов(Форма, СвойстваНастройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииПараметровВыбораВариантыОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииПараметровВыбораВариантыОтчетов(Форма, СвойстваНастройки); КонецЕсли; - + КонецПроцедуры // См. ОтчетыПереопределяемый.ПриСозданииНаСервере. Процедура ПриСозданииНаСервереВариантыОтчетов(Форма, Отказ, СтандартнаяОбработка) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриСозданииНаСервереВариантыОтчетов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриСозданииНаСервереВариантыОтчетов(Форма, Отказ, СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриСозданииНаСервереВариантыОтчетов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриСозданииНаСервереВариантыОтчетов(Форма, Отказ, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // См. ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере. Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередЗагрузкойВариантаНаСервере Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередЗагрузкойВариантаНаСервере Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -1931,109 +2069,118 @@ // См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт - + СтандартныеПодсистемыСервер.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); ПользователиСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); МодульАнкетирование.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); МодульРаботаСБанками.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда МодульВнешниеКомпонентыСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСлужебный"); МодульВнешниеКомпонентыСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда - МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыВМоделиСервисаСлужебный"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда + МодульВнешниеКомпонентыВМоделиСервисаСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ВнешниеКомпонентыВМоделиСервисаСлужебный"); МодульВнешниеКомпонентыВМоделиСервисаСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); МодульЗаметкиПользователяСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовСРедактируемымиРеквизитами Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); МодульЭлектроннаяПодписьСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовСРедактируемымиРеквизитами Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты); + КонецЕсли; КонецПроцедуры @@ -2043,42 +2190,42 @@ // См. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения. Процедура ПриЗаполненииРазделовДатЗапретаИзменения(Разделы) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриЗаполненииРазделовДатЗапретаИзменения(Разделы); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииРазделовДатЗапретаИзменения Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииРазделовДатЗапретаИзменения(Разделы); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииРазделовДатЗапретаИзменения Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииРазделовДатЗапретаИзменения(Разделы); КонецЕсли; - + КонецПроцедуры // См. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения. Процедура ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2092,13 +2239,15 @@ // или обработка для которой необходимо установить режим работы. // РежимПодключения - ОпределяемыйТип.БезопасныйРежим - режим работы доп. отчета или обработки. // -Процедура ПриУстановкеРежимаПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных(ПоставляемаяОбработка, РежимПодключения) Экспорт - +Процедура ПриУстановкеРежимаПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных(ПоставляемаяОбработка, + РежимПодключения) Экспорт + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриУстановкеРежимаПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриУстановкеРежимаПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных(ПоставляемаяОбработка, РежимПодключения); + МодульИнтеграцияПодсистемБИП.ПриУстановкеРежимаПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных( + ПоставляемаяОбработка, РежимПодключения); КонецЕсли; - + КонецПроцедуры #Область ДополнительныеОтчетыИОбработки_ДляВнутреннегоИспользования @@ -2114,19 +2263,24 @@ // стандартной обработки проверки права. // Процедура ПриПроверкеПраваДобавления(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); - + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, + Результат, СтандартнаяОбработка); + Если СтандартнаяОбработка Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, + Результат, СтандартнаяОбработка); КонецЕсли; - + КонецЕсли; - + КонецПроцедуры // Вызывается при проверке возможности загрузки дополнительного отчета или обработки из файла. @@ -2139,19 +2293,24 @@ // стандартной обработки проверки возможности загрузки дополнительного отчета или обработки из файла. // Процедура ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); - + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла( + ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + Если СтандартнаяОбработка Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла( + ДополнительнаяОбработка, Результат, СтандартнаяОбработка); КонецЕсли; - + КонецЕсли; - + КонецПроцедуры // Вызывается при проверке возможности выгрузки дополнительного отчета или обработки в файл. @@ -2164,19 +2323,24 @@ // стандартной обработки проверки возможности выгрузки дополнительного отчета или обработки в файл. // Процедура ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); - + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл( + ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + Если СтандартнаяОбработка Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл( + ДополнительнаяОбработка, Результат, СтандартнаяОбработка); КонецЕсли; - + КонецЕсли; - + КонецПроцедуры // Заполняет виды публикации дополнительных отчетов и обработок, недоступные для использования @@ -2186,17 +2350,22 @@ // НедоступныеВидыПубликации - Массив из Строка // Процедура ПриЗаполненииНедоступныхВидовПубликации(Знач НедоступныеВидыПубликации) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриЗаполненииНедоступныхВидовПубликации(НедоступныеВидыПубликации); - - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриЗаполненииНедоступныхВидовПубликации(НедоступныеВидыПубликации); - + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриЗаполненииНедоступныхВидовПубликации( + НедоступныеВидыПубликации); + + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриЗаполненииНедоступныхВидовПубликации( + НедоступныеВидыПубликации); + КонецЕсли; - + КонецПроцедуры // Вызывается из события ПередЗаписью справочника @@ -2209,17 +2378,20 @@ // Отказ - Булево - флаг отказа от выполнения записи элемента справочника. // Процедура ПередЗаписьюДополнительнойОбработки(Источник, Отказ) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПередЗаписьюДополнительнойОбработки(Источник, Отказ); - - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПередЗаписьюДополнительнойОбработки(Источник, Отказ); - + КонецЕсли; - + КонецПроцедуры // Вызывается из события ПередУдалением справочника ДополнительныеОтчетыИОбработки. @@ -2229,24 +2401,29 @@ // Отказ - Булево - флаг отказа от выполнения удаления элемента справочника из информационной базы. // Процедура ПередУдалениемДополнительнойОбработки(Источник, Отказ) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПередУдалениемДополнительнойОбработки(Источник, Отказ); КонецЕсли; - + КонецПроцедуры // Вызывается при получении регистрационных данных для нового дополнительного отчета // или обработки. // Процедура ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, СтандартнаяОбработка) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, СтандартнаяОбработка); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПолученииРегистрационныхДанных(Объект, + РегистрационныеДанные, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // Вызывается при подключении внешней обработки. @@ -2259,12 +2436,15 @@ // для параметра СтандартнаяОбработка было установлено значение Ложь). // Процедура ПриПодключенииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, + Результат); КонецЕсли; - + КонецПроцедуры // Вызывается при создании объекта внешней обработки. @@ -2278,12 +2458,15 @@ // обработки (в том случае, если в обработчике для параметра СтандартнаяОбработка было установлено значение Ложь). // Процедура ПриСозданииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриСозданииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриСозданииВнешнейОбработки(Ссылка, СтандартнаяОбработка, + Результат); КонецЕсли; - + КонецПроцедуры // Вызывается перед записью изменений регламентного задания дополнительных отчетов и обработок в модели сервиса. @@ -2299,12 +2482,14 @@ // Если установить Неопределено, то регламентное задание не будет изменено. // Процедура ПередОбновлениемЗадания(Объект, Команда, Задание, Изменения) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПередОбновлениемЗадания(Объект, Команда, Задание, Изменения); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2315,40 +2500,42 @@ // См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт - + СтандартныеПодсистемыСервер.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); ПользователиСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); - МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных( + ЗагружаемыеСправочники); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); МодульРаботаСБанками.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииСправочниковДляЗагрузкиДанных Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); МодульЭлектроннаяПодписьСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); @@ -2358,21 +2545,26 @@ МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда МодульУчетОригиналовПервичныхДокументов = ОбщегоНазначения.ОбщийМодуль("УчетОригиналовПервичныхДокументов"); МодульУчетОригиналовПервичныхДокументов.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииСправочниковДляЗагрузкиДанных Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники); + КонецЕсли; КонецПроцедуры @@ -2381,33 +2573,34 @@ #Область ЗапретРедактированияРеквизитовОбъектов // См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. -Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт - +Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовСЗаблокированнымиРеквизитами Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовСЗаблокированнымиРеквизитами Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2416,19 +2609,19 @@ // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData(ИсключаемыеТипы) Экспорт - + ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(ИсключаемыеТипы); - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData(ИсключаемыеТипы); КонецЕсли; - - Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП(). ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData Тогда + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData(ИсключаемыеТипы); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2437,27 +2630,28 @@ // См. КонтрольВеденияУчетаПереопределяемый.ПриОпределенииПроверок. Процедура ПриОпределенииПроверок(ГруппыПроверок, Проверки) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииПроверок(ГруппыПроверок, Проверки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииПроверок(ГруппыПроверок, Проверки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииПроверок Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииПроверок(ГруппыПроверок, Проверки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииПроверок Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииПроверок(ГруппыПроверок, Проверки); КонецЕсли; - + КонецПроцедуры // Позволяет определить список объектов, которые нужно игнорировать при выполнении @@ -2467,17 +2661,17 @@ // Объекты - Массив из ОбъектМетаданных - список объектов. // Процедура ПриОпределенииОбъектовИсключаемыхИзПроверки(Объекты) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОпределенииОбъектовИсключаемыхИзПроверки(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриОпределенииОбъектовИсключаемыхИзПроверки(Объекты); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2486,27 +2680,31 @@ // См. НапоминанияПользователяПереопределяемый.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания. Процедура ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); - МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами); + МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, + РеквизитыСДатами); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); - МодульЗаметкиПользователяСлужебный.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами); + МодульЗаметкиПользователяСлужебный.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, + РеквизитыСДатами); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами); + МодульИнтеграцияПодсистемБТС.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, + РеквизитыСДатами); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, РеквизитыСДатами); + МодульИнтеграцияПодсистемБИП.ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания(Источник, + РеквизитыСДатами); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2515,14 +2713,15 @@ // См. ОбменДаннымиПереопределяемый.ПриНастройкеПодчиненногоУзлаРИБ. Процедура ПриНастройкеПодчиненногоУзлаРИБ() Экспорт - + ПользователиСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); @@ -2532,22 +2731,22 @@ МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); МодульРегламентныеЗаданияСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриНастройкеПодчиненногоУзлаРИБ(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриНастройкеПодчиненногоУзлаРИБ Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриНастройкеПодчиненногоУзлаРИБ(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриНастройкеПодчиненногоУзлаРИБ Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриНастройкеПодчиненногоУзлаРИБ(); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2556,219 +2755,226 @@ // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); МодульАдресныйКлассификаторСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); МодульАнкетирование.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВызовОнлайнПоддержки") Тогда МодульВызовОнлайнПоддержки = ОбщегоНазначения.ОбщийМодуль("ВызовОнлайнПоддержки"); МодульВызовОнлайнПоддержки.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); МодульГрафикиРаботы.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); МодульИнформацияПриЗапуске.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); МодульКалендарныеГрафики.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчетаСлужебный = ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчетаСлужебный"); МодульКонтрольВеденияУчетаСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); МодульМультиязычностьСервер.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + ОбновлениеИнформационнойБазыСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); МодульОбсужденияСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); МодульУправлениеПечатью.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); МодульПодключаемыеКоманды.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); МодульПолнотекстовыйПоискСервер.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + ПользователиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); МодульРегламентныеЗаданияСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + СтандартныеПодсистемыСервер.ПриДобавленииОбработчиковОбновления(Обработчики); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеИтогамиИАгрегатамиСлужебный"); МодульУправлениеИтогамиИАгрегатамиСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда МодульУчетОригиналовПервичныхДокументов = ОбщегоНазначения.ОбщийМодуль("УчетОригиналовПервичныхДокументов"); МодульУчетОригиналовПервичныхДокументов.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); МодульЦентрМониторингаСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный"); МодульШаблоныСообщенийСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный"); МодульЭлектроннаяПодписьСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; - + КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. -Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, - Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - +Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, Знач ВыполненныеОбработчики, + ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); МодульИнформацияПриЗапуске.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеИтогамиИАгрегатамиСлужебный"); МодульУправлениеИтогамиИАгрегатамиСлужебный.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); КонецЕсли; - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, - ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, + ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПослеОбновленияИнформационнойБазы Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПослеОбновленияИнформационнойБазы Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); + МодульИнтеграцияПодсистемБИП.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, + ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); КонецЕсли; - + КонецПроцедуры // Позволяет переопределить приоритет обновления, по умолчанию получаемый из константы СведенияОбОбновленииИБ. @@ -2781,22 +2987,24 @@ // Любое другое - использовать приоритет из константы СведенияОбОбновленииИБ (не переопределять). // Процедура ПриПолученииПриоритетаОбновления(Приоритет) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриПолученииПриоритетаОбновления(Приоритет); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииПриоритетаОбновления Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПолученииПриоритетаОбновления(Приоритет); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПолученииПриоритетаОбновления Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПолученииПриоритетаОбновления(Приоритет); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2805,170 +3013,173 @@ // См. УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати. Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовСКомандамиПечати Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовСКомандамиПечати Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПередДобавлениемКомандПечати. Процедура ПередДобавлениемКомандПечати(ИмяФормы, КомандыПечати, СтандартнаяОбработка) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередДобавлениемКомандПечати Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПередДобавлениемКомандПечати(ИмяФормы, КомандыПечати, СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередДобавлениемКомандПечати Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПередДобавлениемКомандПечати(ИмяФормы, КомандыПечати, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПриПолученииНастроекСпискаКомандПечати. Процедура ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииНастроекСпискаКомандПечати Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПолученииНастроекСпискаКомандПечати Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПолученииНастроекСпискаКомандПечати(НастройкиСписка); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПриПечати. Процедура ПриПечати(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПечати Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПечати( МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПечати Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПечати( МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПередОтправкойПоПочте. Процедура ПередОтправкойПоПочте(ПараметрыОтправки, ПараметрыВывода, ОбъектыПечати, ПечатныеФормы) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередОтправкойПоПочте Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПередОтправкойПоПочте(ПараметрыОтправки, ПараметрыВывода, ОбъектыПечати, ПечатныеФормы); + МодульИнтеграцияПодсистемБТС.ПередОтправкойПоПочте(ПараметрыОтправки, ПараметрыВывода, ОбъектыПечати, + ПечатныеФормы); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередОтправкойПоПочте Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПередОтправкойПоПочте(ПараметрыОтправки, ПараметрыВывода, ОбъектыПечати, ПечатныеФормы); + МодульИнтеграцияПодсистемБИП.ПередОтправкойПоПочте(ПараметрыОтправки, ПараметрыВывода, ОбъектыПечати, + ПечатныеФормы); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПриПолученииПодписейИПечатей. Процедура ПриПолученииПодписейИПечатей(Документы, ПодписиИПечати) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииПодписейИПечатей Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПолученииПодписейИПечатей(Документы, ПодписиИПечати); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПолученииПодписейИПечатей Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПолученииПодписейИПечатей(Документы, ПодписиИПечати); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПечатьДокументовПриСозданииНаСервере. Процедура ПечатьДокументовПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПечатьДокументовПриСозданииНаСервере Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПечатьДокументовПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПечатьДокументовПриСозданииНаСервере Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПечатьДокументовПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере. Процедура ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере(Форма, Настройки) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере(Форма, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере(Форма, Настройки); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере. Процедура ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере(Форма, Настройки) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере(Форма, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере(Форма, Настройки); КонецЕсли; - + КонецПроцедуры // См. УправлениеПечатьюПереопределяемый.ПечатьДокументовПриВыполненииКоманды. Процедура ПечатьДокументовПриВыполненииКоманды(Форма, ДополнительныеПараметры) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПечатьДокументовПриВыполненииКоманды Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПечатьДокументовПриВыполненииКоманды(Форма, ДополнительныеПараметры); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПечатьДокументовПриВыполненииКоманды Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПечатьДокументовПриВыполненииКоманды(Форма, ДополнительныеПараметры); КонецЕсли; - + КонецПроцедуры #Область Печать_ДляВнутреннегоИспользования Процедура ПриПодготовкеСпискаМакетовВФорматеОфисныхДокументовФормируемыхНаСервере(СписокМакетов) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); - МодульЗащитаПерсональныхДанных.ПриПодготовкеСпискаМакетовВФорматеОфисныхДокументовФормируемыхНаСервере(СписокМакетов); + МодульЗащитаПерсональныхДанных.ПриПодготовкеСпискаМакетовВФорматеОфисныхДокументовФормируемыхНаСервере( + СписокМакетов); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -2979,229 +3190,246 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); МодульУправлениеПечатью.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкаПорядкаЭлементов") Тогда МодульНастройкаПорядкаЭлементов = ОбщегоНазначения.ОбщийМодуль("НастройкаПорядкаЭлементов"); МодульНастройкаПорядкаЭлементов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда МодульПоискИУдалениеДублей = ОбщегоНазначения.ОбщийМодуль("ПоискИУдалениеДублей"); - МодульПоискИУдалениеДублей.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + МодульПоискИУдалениеДублей.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда МодульГрупповоеИзменениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ГрупповоеИзменениеОбъектов"); - МодульГрупповоеИзменениеОбъектов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + МодульГрупповоеИзменениеОбъектов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииВидовПодключаемыхКоманд Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииВидовПодключаемыхКоманд Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СтруктураПодчиненности") Тогда МодульСтруктураПодчиненностиСлужебный = ОбщегоНазначения.ОбщийМодуль("СтруктураПодчиненностиСлужебный"); МодульСтруктураПодчиненностиСлужебный.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда МодульУчетОригиналовПервичныхДокументов = ОбщегоНазначения.ОбщийМодуль("УчетОригиналовПервичныхДокументов"); МодульУчетОригиналовПервичныхДокументов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; - + КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов Процедура ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); МодульУправлениеПечатью.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииСоставаНастроекПодключаемыхОбъектов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииСоставаНастроекПодключаемыхОбъектов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса); КонецЕсли; - + КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - МодульУправлениеПечатью.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульУправлениеПечатью.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - МодульВариантыОтчетов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульВариантыОтчетов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульДополнительныеОтчетыИОбработки.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкаПорядкаЭлементов") Тогда МодульНастройкаПорядкаЭлементов = ОбщегоНазначения.ОбщийМодуль("НастройкаПорядкаЭлементов"); - МодульНастройкаПорядкаЭлементов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульНастройкаПорядкаЭлементов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда МодульПоискИУдалениеДублей = ОбщегоНазначения.ОбщийМодуль("ПоискИУдалениеДублей"); - МодульПоискИУдалениеДублей.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульПоискИУдалениеДублей.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда МодульГрупповоеИзменениеОбъектов = ОбщегоНазначения.ОбщийМодуль("ГрупповоеИзменениеОбъектов"); - МодульГрупповоеИзменениеОбъектов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульГрупповоеИзменениеОбъектов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииКомандПодключенныхКОбъекту Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульИнтеграцияПодсистемБТС.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииКомандПодключенныхКОбъекту Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульИнтеграцияПодсистемБИП.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); - МодульУдалениеПомеченныхОбъектовСлужебный.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульУдалениеПомеченныхОбъектовСлужебный.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СтруктураПодчиненности") Тогда МодульСтруктураПодчиненностиСлужебный = ОбщегоНазначения.ОбщийМодуль("СтруктураПодчиненностиСлужебный"); - МодульСтруктураПодчиненностиСлужебный.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульСтруктураПодчиненностиСлужебный.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда МодульУчетОригиналовПервичныхДокументов = ОбщегоНазначения.ОбщийМодуль("УчетОригиналовПервичныхДокументов"); - МодульУчетОригиналовПервичныхДокументов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульУчетОригиналовПервичныхДокументов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, + ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; - + КонецПроцедуры // См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. Процедура ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт - + ПользователиСлужебный.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда МодульШаблоныСообщений = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщений"); МодульШаблоныСообщений.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовСКомандамиСозданияНаОсновании Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовСКомандамиСозданияНаОсновании Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты); КонецЕсли; - + КонецПроцедуры // См. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании. Процедура ПередДобавлениемКомандСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередДобавлениемКомандСозданияНаОсновании Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПередДобавлениемКомандСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка); + МодульИнтеграцияПодсистемБТС.ПередДобавлениемКомандСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры, + СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередДобавлениемКомандСозданияНаОсновании Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПередДобавлениемКомандСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка); + МодульИнтеграцияПодсистемБИП.ПередДобавлениемКомандСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры, + СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // См. СозданиеНаОснованииПереопределяемый.ПриДобавленииКомандСозданияНаОсновании. Процедура ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); - МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка); + МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, + Параметры, СтандартнаяОбработка); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда МодульШаблоныСообщений = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщений"); - МодульШаблоныСообщений.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка); + МодульШаблоныСообщений.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, Параметры, + СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриДобавленииКомандСозданияНаОсновании Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка); + МодульИнтеграцияПодсистемБТС.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, + Параметры, СтандартнаяОбработка); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриДобавленииКомандСозданияНаОсновании Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, Параметры, СтандартнаяОбработка); + МодульИнтеграцияПодсистемБИП.ПриДобавленииКомандСозданияНаОсновании(Объект, КомандыСозданияНаОсновании, + Параметры, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -3210,12 +3438,13 @@ // См. ПоискИУдалениеДублейПереопределяемый.ПриОпределенииОбъектовСПоискомДублей. Процедура ПриОпределенииОбъектовСПоискомДублей(Объекты) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); + МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль( + "УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСПоискомДублей(Объекты); КонецЕсли; - + КонецПроцедуры // См. ПоискИУдалениеДублей.ПриОпределенииОбъектовСПоискомДублей @@ -3225,15 +3454,15 @@ МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); МодульЗаметкиПользователяСлужебный.ПриДобавленииТиповИсключаемыхИзВозможныхДублей(ИсключаемыеТипы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриДобавленииТиповИсключаемыхИзВозможныхДублей(ИсключаемыеТипы); + МодульРаботаСФайламиСлужебный.ПриДобавленииТиповИсключаемыхИзВозможныхДублей(ИсключаемыеТипы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); - МодульГрафикиРаботы.ПриДобавленииТиповИсключаемыхИзВозможныхДублей(ИсключаемыеТипы); + МодульГрафикиРаботы.ПриДобавленииТиповИсключаемыхИзВозможныхДублей(ИсключаемыеТипы); КонецЕсли; КонецПроцедуры @@ -3244,119 +3473,119 @@ // См. ПользователиПереопределяемый.ПриОпределенииНастроек. Процедура ПриОпределенииНастроек(Настройки) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОпределенииНастроек(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииНастроек Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииНастроек(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииНастроек Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииНастроек(Настройки); КонецЕсли; - + КонецПроцедуры // См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); МодульАдресныйКлассификаторСлужебный.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); МодульАнкетирование.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + СтандартныеПодсистемыСервер.ПриОпределенииНазначенияРолей(НазначениеРолей); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); МодульРаботаСБанками.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); МодульГрафикиРаботы.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); МодульКалендарныеГрафики.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); МодульУправлениеПечатью.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный"); МодульТекущиеДелаСлужебный.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииНазначенияРолей Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииНазначенияРолей Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииНазначенияРолей(НазначениеРолей); КонецЕсли; - + КонецПроцедуры // См. ПользователиПереопределяемый.ПриОпределенииДействийВФорме. Процедура ПриОпределенииДействийВФорме(Ссылка, ДействияВФорме) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОпределенииДействийВФорме(Ссылка, ДействияВФорме); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииДействийВФорме Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииДействийВФорме(Ссылка, ДействияВФорме); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииДействийВФорме Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииДействийВФорме(Ссылка, ДействияВФорме); КонецЕсли; - + КонецПроцедуры // См. ПользователиПереопределяемый.ПриПолученииПрочихНастроек. @@ -3367,84 +3596,93 @@ МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииПрочихНастроек Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПолученииПрочихНастроек Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПолученииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + КонецПроцедуры // См. ПользователиПереопределяемый.ПриСохраненииПрочихНастроек. Процедура ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриСохраненииПрочихНастроек Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриСохраненииПрочихНастроек Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриСохраненииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + КонецПроцедуры // См. ПользователиПереопределяемый.ПриУдаленииПрочихНастроек. Процедура ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриУдаленииПрочихНастроек Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриУдаленииПрочихНастроек Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриУдаленииПрочихНастроек(СведенияОПользователе, Настройки); КонецЕсли; - + КонецПроцедуры // См. ПользователиСлужебныйВМоделиСервиса.ПриЗавершенииОбработкиПользователяИБ Процедура ПриЗавершенииОбработкиПользователяИБ(Пользователь) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗавершенииОбработкиПользователяИБ Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗавершенииОбработкиПользователяИБ(Пользователь); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗавершенииОбработкиПользователяИБ Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗавершенииОбработкиПользователяИБ(Пользователь); КонецЕсли; - + КонецПроцедуры #Область Пользователи_ДляВнутреннегоИспользования -// См. ПользователиСлужебныйВМоделиСервиса.ПриОтсутствииТекущегоПользователяВСправочнике. +// Вызывается, если не удалось найти пользователя в справочнике, который +// соответствует текущему пользователю ИБ. При этом можно включить автоматическое +// создание элемента справочника Пользователи для текущего пользователя. +// +// Параметры: +// СоздатьПользователя - Булево - возвращаемое значение. Если указать Истина, +// то автоматически будет создан пользователь в справочнике. +// Переопределить свойства создаваемого пользователя можно перед его записью +// в процедуре ПриАвтоматическомСозданииТекущегоПользователяВСправочнике. +// Процедура ПриОтсутствииТекущегоПользователяВСправочнике(СоздатьПользователя) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПриОтсутствииТекущегоПользователяВСправочнике(СоздатьПользователя); КонецЕсли; - + КонецПроцедуры // Вызывается при автоматическом создании элемента справочника Пользователи в момент @@ -3454,12 +3692,13 @@ // НовыйПользователь - СправочникОбъект.Пользователи - новый пользователь перед записью. // Процедура ПриАвтоматическомСозданииТекущегоПользователяВСправочнике(НовыйПользователь) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ПриАвтоматическомСозданииТекущегоПользователяВСправочнике(НовыйПользователь); + МодульПользователиСлужебныйВМоделиСервиса.ПриАвтоматическомСозданииТекущегоПользователяВСправочнике( + НовыйПользователь); КонецЕсли; - + КонецПроцедуры // Вызывается при авторизации нового пользователя информационной базы. @@ -3470,27 +3709,29 @@ // стандартная обработка авторизации нового пользователя ИБ выполняться не будет. // Процедура ПриАвторизацииНовогоПользователяИБ(ПользовательИБ, СтандартнаяОбработка) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ПриАвторизацииНовогоПользователяИБ(ПользовательИБ, СтандартнаяОбработка); + МодульПользователиСлужебныйВМоделиСервиса.ПриАвторизацииНовогоПользователяИБ(ПользовательИБ, + СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // Вызывается при начале обработки пользователя информационной базы. // // Параметры: -// ПараметрыОбработки - Структура - см. комментарий к процедуре НачатьОбработкуПользователяИБ(). -// ОписаниеПользователяИБ - Структура - см. комментарий к процедуре НачатьОбработкуПользователяИБ(). +// ПараметрыОбработки - см. ПользователиСлужебный.НачатьОбработкуПользователяИБ.ПараметрыОбработки. +// ОписаниеПользователяИБ - Структура // Процедура ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); + МодульПользователиСлужебныйВМоделиСервиса.ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, + ОписаниеПользователяИБ); КонецЕсли; - + КонецПроцедуры // Вызывается перед записью пользователя информационной базы. @@ -3499,12 +3740,12 @@ // ПользовательИБ - ПользовательИнформационнойБазы - пользователь, который будет записан. // Процедура ПередЗаписьюПользователяИБ(ПользовательИБ) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПередЗаписьюПользователяИБ(ПользовательИБ); КонецЕсли; - + КонецПроцедуры // Вызывается перед удалением пользователя информационной базы. @@ -3513,12 +3754,12 @@ // ПользовательИБ - ПользовательИнформационнойБазы - пользователь, который будет удален. // Процедура ПередУдалениемПользователяИБ(ПользовательИБ) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ПередЗаписьюПользователяИБ(ПользовательИБ); КонецЕсли; - + КонецПроцедуры // Переопределяет текст комментария при авторизации пользователя ИБ, @@ -3530,12 +3771,12 @@ // Комментарий - Строка - начальное значение задано. // Процедура ПослеЗаписиАдминистратораПриАвторизации(Комментарий) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеЗаписиАдминистратораПриАвторизации(Комментарий); КонецЕсли; - + КонецПроцедуры // Доопределяет действия, необходимые после установки пользователя @@ -3549,12 +3790,12 @@ // - СправочникСсылка.ВнешниеПользователи - пользователь. // Процедура ПослеУстановкиПользователяИБ(Ссылка, ПарольПользователяСервиса) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеУстановкиПользователяИБ(Ссылка, ПарольПользователяСервиса); КонецЕсли; - + КонецПроцедуры // Позволяет переопределить текст вопроса перед записью первого администратора. @@ -3566,12 +3807,12 @@ // ТекстВопроса - Строка - текст вопроса, который можно переопределить. // Процедура ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора(ТекстВопроса) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора(ТекстВопроса); КонецЕсли; - + КонецПроцедуры // Доопределяет действия при создании администратора в подсистеме Пользователи, а также @@ -3582,12 +3823,12 @@ // Уточнение - Строка - поясняет, при каких условиях был создан администратор. // Процедура ПриСозданииАдминистратора(Администратор, Уточнение) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриСозданииАдминистратора(Администратор, Уточнение); КонецЕсли; - + КонецПроцедуры // Доопределяет действия, необходимые после добавления или изменения пользователя, @@ -3602,17 +3843,17 @@ // ЭтоНовый - Булево - если Истина, объект был добавлен, иначе изменен. // Процедура ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый); КонецЕсли; - + КонецПроцедуры // Доопределяет действия, необходимые после завершения обновления @@ -3628,17 +3869,19 @@ // группы, состав которых был изменен. // Процедура ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - МодульУправлениеДоступомСлужебный.ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы); + МодульУправлениеДоступомСлужебный.ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, + ИзмененныеГруппы); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); - МодульДатыЗапретаИзмененияСлужебный.ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы); + МодульДатыЗапретаИзмененияСлужебный.ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, + ИзмененныеГруппы); КонецЕсли; - + КонецПроцедуры // Доопределяет действия, необходимые после изменении объекта авторизации внешнего пользователя. @@ -3649,16 +3892,15 @@ // - ОпределяемыйТип.ВнешнийПользователь - тип объекта авторизации. // НовыйОбъектАвторизации - ОпределяемыйТип.ВнешнийПользователь - тип объекта авторизации. // -Процедура ПослеИзмененияОбъектаАвторизацииВнешнегоПользователя(ВнешнийПользователь, - СтарыйОбъектАвторизации, - НовыйОбъектАвторизации) Экспорт - +Процедура ПослеИзмененияОбъектаАвторизацииВнешнегоПользователя(ВнешнийПользователь, СтарыйОбъектАвторизации, + НовыйОбъектАвторизации) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеИзмененияОбъектаАвторизацииВнешнегоПользователя( ВнешнийПользователь, СтарыйОбъектАвторизации, НовыйОбъектАвторизации); КонецЕсли; - + КонецПроцедуры // Получает варианты переданного отчета и их представления. @@ -3673,35 +3915,37 @@ // * СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. // СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. // -Процедура ПриПолученииПользовательскихВариантовОтчетов(ПолноеИмяОтчета, ПользовательИнформационнойБазы, СведенияОВариантахОтчетов, СтандартнаяОбработка) Экспорт - +Процедура ПриПолученииПользовательскихВариантовОтчетов(ПолноеИмяОтчета, ПользовательИнформационнойБазы, + СведенияОВариантахОтчетов, СтандартнаяОбработка) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПользовательскиеВариантыОтчетов(ПолноеИмяОтчета, ПользовательИнформационнойБазы, СведенияОВариантахОтчетов, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // Удаляет переданный вариант отчета из хранилища вариантов отчетов. // // Параметры: -// СведенияОВариантахОтчетов - ТаблицаЗначений - таблица, в которой сохранена информация о варианте отчета: +// СведенияОВариантеОтчета - ТаблицаЗначений - информация о варианте отчета: // * КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета". // * КлючВарианта - Строка - ключ варианта отчета. // * Представление - Строка - представление варианта отчета. // * СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. -// ПользовательИнформационнойБазы - Строка - имя пользователя информационной базы у которого очищается вариант отчета. -// СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. +// ПользовательИнформационнойБазы - Строка - имя пользователя информационной базы, у которого удаляется вариант отчета. +// СтандартнаяОбработка - Булево - если Истина, то вариант отчета сохранен в стандартном хранилище. // -Процедура ПриУдаленииПользовательскихВариантовОтчета(СведенияОВариантеОтчета, ПользовательИнформационнойБазы, СтандартнаяОбработка) Экспорт - +Процедура ПриУдаленииПользовательскихВариантовОтчета(СведенияОВариантеОтчета, ПользовательИнформационнойБазы, + СтандартнаяОбработка) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.УдалитьПользовательскийВариантОтчета(СведенияОВариантеОтчета, ПользовательИнформационнойБазы, СтандартнаяОбработка); КонецЕсли; - + КонецПроцедуры // Формирует запрос на изменение адреса электронной почты пользователя сервиса. @@ -3713,12 +3957,13 @@ // ПарольПользователяСервиса - Строка - пароль текущего пользователя для доступа к менеджеру сервиса. // Процедура ПриСозданииЗапросаНаСменуПочты(Знач НоваяПочта, Знач Пользователь, Знач ПарольПользователяСервиса) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.СоздатьЗапросНаСменуПочты(НоваяПочта, Пользователь, ПарольПользователяСервиса); + МодульПользователиСлужебныйВМоделиСервиса.СоздатьЗапросНаСменуПочты(НоваяПочта, Пользователь, + ПарольПользователяСервиса); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -3729,175 +3974,184 @@ // См. РаботаВБезопасномРежимеПереопределяемый.ПриПроверкеВозможностиНастройкиПрофилейБезопасности. Процедура ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПроверкеВозможностиНастройкиПрофилейБезопасности Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПроверкеВозможностиНастройкиПрофилейБезопасности Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПроверкеВозможностиНастройкиПрофилейБезопасности(Отказ); КонецЕсли; - + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов. -Процедура ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ПрограммныйМодуль, Знач Владелец, Знач РежимЗамещения, Знач ДобавляемыеРазрешения, Знач УдаляемыеРазрешения, СтандартнаяОбработка, Результат) Экспорт - +Процедура ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ПрограммныйМодуль, Знач Владелец, + Знач РежимЗамещения, Знач ДобавляемыеРазрешения, Знач УдаляемыеРазрешения, СтандартнаяОбработка, Результат) Экспорт + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(ПрограммныйМодуль, - Владелец, РежимЗамещения, ДобавляемыеРазрешения, УдаляемыеРазрешения, СтандартнаяОбработка, Результат); + МодульИнтеграцияПодсистемБТС.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(ПрограммныйМодуль, Владелец, + РежимЗамещения, ДобавляемыеРазрешения, УдаляемыеРазрешения, СтандартнаяОбработка, Результат); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(ПрограммныйМодуль, Владелец, РежимЗамещения, ДобавляемыеРазрешения, УдаляемыеРазрешения, СтандартнаяОбработка, Результат); + МодульИнтеграцияПодсистемБИП.ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов(ПрограммныйМодуль, Владелец, + РежимЗамещения, ДобавляемыеРазрешения, УдаляемыеРазрешения, СтандартнаяОбработка, Результат); КонецЕсли; - + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеСозданияПрофиляБезопасности. Процедура ПриЗапросеСозданияПрофиляБезопасности(Знач ПрограммныйМодуль, СтандартнаяОбработка, Результат) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗапросеСозданияПрофиляБезопасности Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриЗапросеСозданияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, Результат); + МодульИнтеграцияПодсистемБТС.ПриЗапросеСозданияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, + Результат); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗапросеСозданияПрофиляБезопасности Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриЗапросеСозданияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, Результат); + МодульИнтеграцияПодсистемБИП.ПриЗапросеСозданияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, + Результат); КонецЕсли; - + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗапросеУдаленияПрофиляБезопасности. Процедура ПриЗапросеУдаленияПрофиляБезопасности(Знач ПрограммныйМодуль, СтандартнаяОбработка, Результат) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗапросеУдаленияПрофиляБезопасности Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриЗапросеУдаленияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, Результат); + МодульИнтеграцияПодсистемБТС.ПриЗапросеУдаленияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, + Результат); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗапросеУдаленияПрофиляБезопасности Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриЗапросеУдаленияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, Результат); + МодульИнтеграцияПодсистемБИП.ПриЗапросеУдаленияПрофиляБезопасности(ПрограммныйМодуль, СтандартнаяОбработка, + Результат); КонецЕсли; - + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриПодключенииВнешнегоМодуля. Процедура ПриПодключенииВнешнегоМодуля(Знач ВнешнийМодуль, БезопасныйРежим) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПодключенииВнешнегоМодуля Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПодключенииВнешнегоМодуля(ВнешнийМодуль, БезопасныйРежим); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПодключенииВнешнегоМодуля Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПодключенииВнешнегоМодуля(ВнешнийМодуль, БезопасныйРежим); КонецЕсли; - + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриВключенииИспользованияПрофилейБезопасности. Процедура ПриВключенииИспользованияПрофилейБезопасности() Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); МодульПолучениеФайловИзИнтернетаСлужебный.ПриВключенииИспользованияПрофилейБезопасности(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); МодульРезервноеКопированиеИБСервер.ПриВключенииИспользованияПрофилейБезопасности(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриВключенииИспользованияПрофилейБезопасности Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриВключенииИспользованияПрофилейБезопасности(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриВключенииИспользованияПрофилейБезопасности Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриВключенииИспользованияПрофилейБезопасности(); КонецЕсли; - + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); МодульАдресныйКлассификаторСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); - МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам( + ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); МодульОбсужденияСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS"); МодульОтправкаSMS.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + СтандартныеПодсистемыСервер.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); МодульУправлениеПечатью.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений); КонецЕсли; - + КонецПроцедуры #Область ПрофилиБезопасности_ДляВнутреннегоИспользования @@ -3908,17 +4162,18 @@ // Менеджеры - Массив - ссылки на модули. // Процедура ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль( + "ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный"); МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный.ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриРегистрацииМенеджеровВнешнихМодулей(Менеджеры); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -3929,22 +4184,22 @@ // См. РаботаСФайламиСлужебный.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов. Процедура ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(Объекты) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбъектовИсключенияСинхронизацииФайлов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(Объекты); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбъектовИсключенияСинхронизацииФайлов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииОбъектовИсключенияСинхронизацииФайлов(Объекты); КонецЕсли; - + КонецПроцедуры // Позволяет изменить стандартную форму файла @@ -3965,62 +4220,62 @@ // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); МодульПолнотекстовыйПоискСервер.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); @@ -4030,26 +4285,66 @@ МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный"); МодульЦентрМониторингаСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииНастроекРегламентныхЗаданий Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииНастроекРегламентныхЗаданий Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; + +КонецПроцедуры + +// См. БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.ПриЗапретеРаботыСВнешнимиРесурсами. +Процедура ПриЗапретеРаботыСВнешнимиРесурсами() Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); + МодульОбсужденияСлужебный.Заблокировать(); + КонецЕсли; + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗапретеРаботыСВнешнимиРесурсами Тогда + МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); + МодульИнтеграцияПодсистемБТС.ПриЗапретеРаботыСВнешнимиРесурсами(); + КонецЕсли; + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗапретеРаботыСВнешнимиРесурсами Тогда + МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); + МодульИнтеграцияПодсистемБИП.ПриЗапретеРаботыСВнешнимиРесурсами(); + КонецЕсли; + +КонецПроцедуры + +// См. БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.ПриРазрешенииРаботыСВнешнимиРесурсами. +Процедура ПриРазрешенииРаботыСВнешнимиРесурсами() Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); + МодульОбсужденияСлужебный.Разблокировать(); + КонецЕсли; + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриРазрешенииРаботыСВнешнимиРесурсами Тогда + МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); + МодульИнтеграцияПодсистемБТС.ПриРазрешенииРаботыСВнешнимиРесурсами(); + КонецЕсли; + + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриРазрешенииРаботыСВнешнимиРесурсами Тогда + МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); + МодульИнтеграцияПодсистемБИП.ПриРазрешенииРаботыСВнешнимиРесурсами(); + КонецЕсли; КонецПроцедуры @@ -4059,34 +4354,34 @@ // См. УправлениеСвойствамиПереопределяемый.ПриСозданииПредопределенныхНаборовСвойств. Процедура ПриПолученииПредопределенныхНаборовСвойств(ДеревоНаборов) Экспорт - + ПользователиСлужебный.ПриПолученииПредопределенныхНаборовСвойств(ДеревоНаборов); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриПолученииПредопределенныхНаборовСвойств(ДеревоНаборов); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); МодульЗащитаПерсональныхДанных.ПриПолученииПредопределенныхНаборовСвойств(ДеревоНаборов); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриПолученииПредопределенныхНаборовСвойств(ДеревоНаборов); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриПолученииПредопределенныхНаборовСвойств Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриПолученииПредопределенныхНаборовСвойств(ДеревоНаборов); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриПолученииПредопределенныхНаборовСвойств Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриПолученииПредопределенныхНаборовСвойств(ДеревоНаборов); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -4094,220 +4389,222 @@ #Область ТекущиеДела // См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел -Процедура ПриОпределенииОбработчиковТекущихДел(Обработчики) Экспорт - +Процедура ПриОпределенииОбработчиковТекущихДел(ТекущиеДела) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("Взаимодействия")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("Взаимодействия")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер")); КонецЕсли; - - Обработчики.Добавить(ОбновлениеИнформационнойБазыСлужебный); - + + ТекущиеДела.Добавить(ОбновлениеИнформационнойБазыСлужебный); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер")); КонецЕсли; - - Обработчики.Добавить(ПользователиСлужебный); - + + ТекущиеДела.Добавить(ПользователиСлужебный); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("РаботаСБанками")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("РаботаСБанками")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("СоединенияИБ")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("СоединенияИБ")); КонецЕсли; - - Обработчики.Добавить(СтандартныеПодсистемыСервер); - + + ТекущиеДела.Добавить(СтандартныеПодсистемыСервер); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("Справочники.ПрофилиГруппДоступа")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("Справочники.ПрофилиГруппДоступа")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчетаСлужебный")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчетаСлужебный")); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда - Обработчики.Добавить(ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный")); + ТекущиеДела.Добавить(ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный")); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииОбработчиковТекущихДел Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриОпределенииОбработчиковТекущихДел(Обработчики); + МодульИнтеграцияПодсистемБТС.ПриОпределенииОбработчиковТекущихДел(ТекущиеДела); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииОбработчиковТекущихДел Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриОпределенииОбработчиковТекущихДел(Обработчики); + МодульИнтеграцияПодсистемБИП.ПриОпределенииОбработчиковТекущихДел(ТекущиеДела); КонецЕсли; - + КонецПроцедуры // Параметры: // ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииСпискаТекущихДел Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииСпискаТекущихДел Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); КонецЕсли; - + Если (ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов")) Тогда МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); МодульУдалениеПомеченныхОбъектовСлужебный.ПриЗаполненииСпискаТекущихДел(ТекущиеДела); КонецЕсли; - + КонецПроцедуры // См. ТекущиеДелаПереопределяемый.ПриОпределенииПорядкаРазделовКомандногоИнтерфейса. Процедура ПриОпределенииПорядкаРазделовКомандногоИнтерфейса(ПорядокРазделовКомандногоИнтерфейса) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииПорядкаРазделовКомандногоИнтерфейса Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриОпределенииПорядкаРазделовКомандногоИнтерфейса(ПорядокРазделовКомандногоИнтерфейса); + МодульИнтеграцияПодсистемБТС.ПриОпределенииПорядкаРазделовКомандногоИнтерфейса( + ПорядокРазделовКомандногоИнтерфейса); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииПорядкаРазделовКомандногоИнтерфейса Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриОпределенииПорядкаРазделовКомандногоИнтерфейса(ПорядокРазделовКомандногоИнтерфейса); + МодульИнтеграцияПодсистемБИП.ПриОпределенииПорядкаРазделовКомандногоИнтерфейса( + ПорядокРазделовКомандногоИнтерфейса); КонецЕсли; - + КонецПроцедуры // См. ТекущиеДелаПереопределяемый.ПриОтключенииТекущихДел. Процедура ПриОтключенииТекущихДел(ОтключаемыеДела) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОтключенииТекущихДел Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОтключенииТекущихДел(ОтключаемыеДела); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОтключенииТекущихДел Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОтключенииТекущихДел(ОтключаемыеДела); КонецЕсли; - + КонецПроцедуры // См. ТекущиеДелаПереопределяемый.ПриОпределенииНастроек. Процедура ПриОпределенииНастроекТекущихДел(Настройки) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииНастроекТекущихДел Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриОпределенииНастроекТекущихДел(Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииНастроекТекущихДел Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриОпределенииНастроекТекущихДел(Настройки); КонецЕсли; - + КонецПроцедуры // См. ТекущиеДелаПереопределяемый.УстановитьОбщиеПараметрыЗапросов. Процедура ПриУстановкеОбщихПараметровЗапросов(Запрос, ОбщиеПараметрыЗапросов) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриУстановкеОбщихПараметровЗапросов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриУстановкеОбщихПараметровЗапросов(Запрос, ОбщиеПараметрыЗапросов); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриУстановкеОбщихПараметровЗапросов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриУстановкеОбщихПараметровЗапросов(Запрос, ОбщиеПараметрыЗапросов); КонецЕсли; - + КонецПроцедуры // См. ТекущиеДелаПереопределяемый.ПриСозданииНаСервере. Процедура ПриСозданииНаСервереТекущиеДела(Форма, Список) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриСозданииНаСервереТекущиеДела Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриСозданииНаСервереТекущиеДела(Форма, Список); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриСозданииНаСервереТекущиеДела Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриСозданииНаСервереТекущиеДела(Форма, Список); КонецЕсли; - + КонецПроцедуры // См. ТекущиеДелаПереопределяемый.ПередЗагрузкойДанныхИзНастроекНаСервере. Процедура ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела(Форма, Настройки) Экспорт - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела(Форма, Настройки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела(Форма, Настройки); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -4319,263 +4616,278 @@ // Вызов в подсистему Пользователи должен быть первым. ПользователиСлужебный.ПриЗаполненииВидовДоступа(ВидыДоступа); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииВидовДоступа(ВидыДоступа); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриЗаполненииВидовДоступа(ВидыДоступа); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриЗаполненииВидовДоступа(ВидыДоступа); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриЗаполненииВидовДоступа(ВидыДоступа); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииВидовДоступа Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииВидовДоступа(ВидыДоступа); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииВидовДоступа Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииВидовДоступа(ВидыДоступа); КонецЕсли; - + КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); МодульЗаметкиПользователяСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчетаСлужебный = ОбщегоНазначения.ОбщийМодуль("КонтрольВеденияУчетаСлужебный"); МодульКонтрольВеденияУчетаСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); МодульНапоминанияПользователяСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); МодульПользователиСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); МодульРассылкаОтчетов.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный"); МодульШаблоныСообщенийСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииСписковСОграничениемДоступа Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииСписковСОграничениемДоступа Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииСписковСОграничениемДоступа(Списки); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриЗаполненииСписковСОграничениемДоступа(Списки); + КонецЕсли; КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииПоставляемыхПрофилейГруппДоступа Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления); + МодульИнтеграцияПодсистемБТС.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, + ПараметрыОбновления); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииПоставляемыхПрофилейГруппДоступа Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления); + МодульИнтеграцияПодсистемБИП.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, + ПараметрыОбновления); КонецЕсли; - + КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа. Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииЗависимостейПравДоступа Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииЗависимостейПравДоступа Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав); КонецЕсли; - + КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов. Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава); КонецЕсли; - + КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа. Процедура ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииИспользованияВидаДоступа Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииИспользованияВидаДоступа Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Использование); КонецЕсли; - + КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + ПользователиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль( + "РаботаСПочтовымиСообщениямиСлужебный"); МодульРаботаСПочтовымиСообщениямиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный"); МодульШаблоныСообщенийСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииВидовОграниченийПравОбъектовМетаданных Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриЗаполненииВидовОграниченийПравОбъектовМетаданных Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МодульСервисКриптографииDSSСлужебный.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание); + КонецЕсли; КонецПроцедуры @@ -4586,8 +4898,8 @@ // исполнителей задач, которые соответствуют ключам адресации // (РольИсполнителя + ОсновнойОбъектАдресации + ДополнительныйОбъектАдресации). // -// При изменении состава дополнительных групп пользователей, необходимо вызвать -// процедуру ОбновитьПользователейГруппИсполнителей в модуле УправлениеДоступом, +// При изменении состава дополнительных групп пользователей необходимо вызвать +// процедуру УправлениеДоступом.ОбновитьПользователейГруппИсполнителей, // чтобы применить изменения к внутренним данным подсистемы. // // Параметры: @@ -4607,24 +4919,24 @@ // в которые входят указанные исполнители. // // ЗначениеПараметра - Неопределено - когда СодержаниеПараметра = Неопределено, -// - например, СправочникСсылка.ГруппыИсполнителейЗадач, -// когда СодержаниеПараметра = "ГруппыИсполнителей". +// - СправочникСсылка.ГруппыИсполнителейЗадач - +// когда СодержаниеПараметра = "ГруппыИсполнителей". // - СправочникСсылка.Пользователи -// - СправочникСсылка.ВнешниеПользователи -// когда СодержаниеПараметра = "Исполнители". -// Массив указанных выше типов. +// - СправочникСсылка.ВнешниеПользователи - +// когда СодержаниеПараметра = "Исполнители". +// - Массив - массив указанных выше типов. // // НетГруппИсполнителей - Булево - если Ложь, МенеджерВременныхТаблиц содержит временную таблицу, иначе нет. // -Процедура ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра, - ЗначениеПараметра, НетГруппИсполнителей) Экспорт - +Процедура ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра, ЗначениеПараметра, + НетГруппИсполнителей) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); - МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, - СодержаниеПараметра, ЗначениеПараметра, НетГруппИсполнителей); + МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра, + ЗначениеПараметра, НетГруппИсполнителей); КонецЕсли; - + КонецПроцедуры // Вызывается при обновлении ролей пользователя информационной базы. @@ -4635,12 +4947,15 @@ // обновление ролей для этого пользователя информационной базы будет пропущено. // Процедура ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ) Экспорт - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); - МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ); + + Если ОбщегоНазначения.ПодсистемаСуществует( + "СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( + "УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, + Отказ); КонецЕсли; - + КонецПроцедуры #КонецОбласти @@ -4651,40 +4966,40 @@ // См. ЦентрМониторингаПереопределяемый.ПриСбореПоказателейСтатистикиКонфигурации. Процедура ПриСбореПоказателейСтатистикиКонфигурации() Экспорт - + ОбновлениеИнформационнойБазыСлужебный.ПриСбореПоказателейСтатистикиКонфигурации(); ПользователиСлужебный.ПриСбореПоказателейСтатистикиКонфигурации(); - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриСбореПоказателейСтатистикиКонфигурации(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриСбореПоказателейСтатистикиКонфигурации(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS"); МодульОтправкаSMS.ПриСбореПоказателейСтатистикиКонфигурации(); КонецЕсли; - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриСбореПоказателейСтатистикиКонфигурации(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриСбореПоказателейСтатистикиКонфигурации Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); МодульИнтеграцияПодсистемБТС.ПриСбореПоказателейСтатистикиКонфигурации(); КонецЕсли; - + Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриСбореПоказателейСтатистикиКонфигурации Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); МодульИнтеграцияПодсистемБИП.ПриСбореПоказателейСтатистикиКонфигурации(); КонецЕсли; - + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl b/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl index e3ff826b0..5d62cfe77 100644 --- a/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl +++ b/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl @@ -600,7 +600,7 @@ // Проверяет возможность выполнения резервного копирования в пользовательском режиме. // // Параметры: -// Результат - Булево - (возвращаемое значение). +// Результат - Булево - возвращаемое значение. // Процедура ПриПроверкеВозможностиРезервногоКопированияВПользовательскомРежиме(Результат) Экспорт diff --git a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl index de097146d..e2faf6b2c 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl @@ -212,6 +212,22 @@ КонецФункции // Глобальные настройки подсистемы. +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * НомерВРегистре - Число. +// * Идентификатор - Строка. +// * ИмяМакета - Строка. +// * Раздел - Строка. +// * НаименованиеСтартовойСтраницы - Строка. +// * ИмяФайлаСтартовойСтраницы - Строка. +// * ДатаНачалаПоказа - Дата. +// * ДатаОкончанияПоказа - Дата. +// * Приоритет - Число. +// * ПоказыватьВПроф - Булево. +// * ПоказыватьВБазовой - Булево. +// * ПоказыватьВМоделиСервиса - Булево. +// Функция ПакетыСтраниц(НосительМакетов) Экспорт Результат = Новый ТаблицаЗначений; Результат.Колонки.Добавить("НомерВРегистре", Новый ОписаниеТипов("Число")); @@ -297,6 +313,9 @@ КонецФункции // Глобальные настройки подсистемы. +// Параметры: +// ПакетыСтраниц - см. ПакетыСтраниц +// Функция ПодготовитьПакетыСтраницКВыводу(ПакетыСтраниц, ТекущаяДата) Экспорт Результат = Новый Структура; Результат.Вставить("МинимальныйПриоритет", 100); diff --git a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl index 87412a2e7..580625a93 100644 --- a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl @@ -16,7 +16,7 @@ // - СправочникСсылка.ПроизводственныеКалендари - график или // производственный календарь, который необходимо использовать для расчета дат. // ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. -// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. +// МассивДней - Массив из Число - количество дней, на которые нужно увеличить дату начала. // РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей или // все даты рассчитываются от переданной даты. // ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. @@ -949,7 +949,7 @@ Обработчик.ОбщиеДанные = Истина; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.4.277"; + Обработчик.Версия = "3.1.5.80"; Обработчик.Процедура = "КалендарныеГрафики.ИсправитьДанныеЗависимыхКалендарей"; Обработчик.РежимВыполнения = "Оперативно"; Обработчик.ОбщиеДанные = Истина; diff --git a/SSL/src/CommonModules/КонструкторФормул/Module.bsl b/SSL/src/CommonModules/КонструкторФормул/Module.bsl new file mode 100644 index 000000000..5a25d0e63 --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормул/Module.bsl @@ -0,0 +1,244 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +// Создает на форме иерархический список с заданным составом полей и строкой поиска. +// В качестве источника полей используется одна или несколько коллекций доступных полей компоновки данных. +// Для полей ссылочного типа имеется возможность разворачивания на неограниченное количество уровней. +// Для любого поля в списке, в том числе для полей простых типов, имеется возможность дополнения и переопределения +// списка дочерних полей. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма, в которой требуется добавить список. +// Параметры - см. ПараметрыДобавленияСпискаПолей +// +Процедура ДобавитьСписокПолейНаФорму(Форма, Параметры) Экспорт + + КонструкторФормулСлужебный.ДобавитьСписокПолейНаФорму(Форма, Параметры); + +КонецПроцедуры + +// Конструктор параметра Параметры процедуры ДобавитьСписокПолейНаФорму. +// +// Возвращаемое значение: +// Структура: +// * МестоРазмещенияСписка - ГруппаФормы +// - ТаблицаФормы +// - ФормаКлиентскогоПриложения +// * ИмяСписка - Строка +// * КоллекцииПолей - Массив из ДоступныеПоляКомпоновкиДанных +// * МестоРазмещенияСтрокиПоиска - ГруппаФормы +// - ТаблицаФормы +// - ФормаКлиентскогоПриложения +// * ПодсказкаВводаСтрокиПоиска - Строка +// * ОбработчикиСписка - Структура +// * ВключатьГруппыВПутьКДанным - Булево +// * СкобкиИдентификаторов - Булево +// * СкобкиПредставлений - Булево +// * ИсточникиДоступныхПолей - ТаблицаЗначений - используется в случае, когда требуется изменить состав подчиненных +// полей у любого поля: +// ** ИсточникДанных - Строка - описание поля в дереве полей, может быть в виде пути в дереве, либо в виде +// имени объекта метаданных. +// Источник может быть указан в виде шаблона, в котором символ "*" обозначает несколько +// произвольных символов. +// Например, +// "*.Наименование" - добавить коллекцию дочерних полей к полям "Наименование", +// "Справочник.Организации" - добавить коллекцию дочерних полей ко всем полям +// типа Организации. +// ** КоллекцияПолей - ДоступныеПоляКомпоновкиДанных - дочерние поля источника данных. +// ** Замещать - Булево - если Истина, то список подчиненных полей будет замещен, если Ложь - дополнен. +// * ИспользоватьИдентификаторыДляФормул - Булево +// +Функция ПараметрыДобавленияСпискаПолей() Экспорт + + Возврат КонструкторФормулСлужебный.ПараметрыДобавленияСпискаПолей(); + +КонецФункции + +// Конструктор списка полей для процедуры ДобавитьСписокПолейНаФорму. +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Идентификатор - Строка +// * Представление - Строка +// * ТипЗначения - ОписаниеТипов +// * ИмяКартинки - Строка +// * Порядок - Число +// +Функция ТаблицаПолей() Экспорт + + Возврат КонструкторФормулСлужебный.ТаблицаПолей(); + +КонецФункции + +// Конструктор списка полей для процедуры ДобавитьСписокПолейНаФорму. +// +// Возвращаемое значение: +// ДеревоЗначений: +// * Идентификатор - Строка +// * Представление - Строка +// * ТипЗначения - ОписаниеТипов +// * ИмяКартинки - Строка +// * Порядок - Число +// +Функция ДеревоПолей() Экспорт + + Возврат КонструкторФормулСлужебный.ДеревоПолей(); + +КонецФункции + +// Конструктор списка полей для процедуры ДобавитьСписокПолейНаФорму. +// Преобразует исходную коллекцию полей в коллекцию доступных полей компоновки данных. +// +// Параметры: +// ИсточникПолей - см. ТаблицаПолей +// - ДеревоЗначений - см. ДеревоПолей +// - СхемаКомпоновкиДанных - список полей будет взят из коллекции ДоступныеПоляОтбора +// компоновщика настроек. Имя коллекции может быть переопределено +// в параметре ИмяКоллекцииСКД. +// - Строка - адрес во временном хранилище значения вышеперечисленного типа. +// ИмяКоллекцииСКД - Строка - имя коллекции полей в компоновщике настроек. Параметр необходимо использовать, если в +// параметре ИсточникПолей передана схема компоновки данных. +// Значение по умолчанию - ДоступныеПоляОтбора. +// +// Возвращаемое значение: +// ДоступныеПоляКомпоновкиДанных +// +Функция КоллекцияПолей(ИсточникПолей, Знач ИмяКоллекцииСКД = Неопределено) Экспорт + + Возврат КонструкторФормулСлужебный.КоллекцияПолей(ИсточникПолей, , ИмяКоллекцииСКД); + +КонецФункции + +// Используется в случае изменения состава полей, выводимых подключаемом списке. +// Перезаполняет указанный список из переданной коллекции полей. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// КоллекцииПолей - Массив из ДоступныеПоляКомпоновкиДанных +// ИмяСпискаПолей - Строка - имя списка на форме, в котором требуется обновление полей. +// +Процедура ОбновитьКоллекцииПолей(Форма, КоллекцииПолей, ИмяСпискаПолей = "ДоступныеПоля") Экспорт + + КонструкторФормулСлужебный.ОбновитьКоллекцииПолей(Форма, КоллекцииПолей, ИмяСпискаПолей); + +КонецПроцедуры + +// Обработчик события разворачивания подключаемого списка на форме. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ПараметрыЗаполнения - Структура +// +Процедура ЗаполнитьСписокДоступныхПолей(Форма, ПараметрыЗаполнения) Экспорт + + КонструкторФормулСлужебный.ЗаполнитьСписокДоступныхПолей(Форма, ПараметрыЗаполнения); + +КонецПроцедуры + +// Обработчик события изменения текста редактирования поля поиска подключаемого списка. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// +Процедура ВыполнитьПоискВСпискеПолей(Форма) Экспорт + + КонструкторФормулСлужебный.ВыполнитьПоискВСпискеПолей(Форма); + +КонецПроцедуры + +// Конструктор параметра ПараметрыФормулы для функции ПредставлениеФормулы. +// +// Возвращаемое значение: +// Структура: +// * Формула - Строка +// * Операнды - Строка - адрес во временном хранилище коллекции операндов. Коллекция может быть одного из трех типов: +// ТаблицаЗначений - см. ТаблицаПолей +// ДеревоЗначений - см. ДеревоПолей +// СхемаКомпоновкиДанных - список операндов будет взят из коллекции ДоступныеПоляОтбора +// компоновщика настроек. Имя коллекции может быть переопределено +// в параметре ИмяКоллекцииСКД. +// * Операторы - Строка - адрес во временном хранилище коллекции операторов. Коллекция может быть одного из трех типов: +// ТаблицаЗначений - см. ТаблицаПолей +// ДеревоЗначений - см. ДеревоПолей +// СхемаКомпоновкиДанных - список операндов будет взят из коллекции ДоступныеПоляОтбора +// компоновщика настроек. Имя коллекции может быть переопределено +// в параметре ИмяКоллекцииСКД. +// * ИмяКоллекцииСКДОперандов - Строка - имя коллекции полей в компоновщике настроек. Параметр необходимо +// использовать, если в параметре Операнды передана схема компоновки данных. +// Значение по умолчанию - ДоступныеПоляОтбора. +// * ИмяКоллекцииСКДОператоров - Строка - имя коллекции полей в компоновщике настроек. Параметр необходимо +// использовать, если в параметре Операторы передана схема компоновки данных. +// Значение по умолчанию - ДоступныеПоляОтбора. +// * Наименование - Неопределено - наименование не используется для формулы, соответствующее поле не выводится. +// - Строка - наименование формулы. Если заполнено или пустое, соответствующее поле выводится +// на в форме конструктора. +// +Функция ПараметрыРедактированияФормулы() Экспорт + + Возврат КонструкторФормулКлиентСервер.ПараметрыРедактированияФормулы(); + +КонецФункции + +// См. ТаблицаПолей +Функция ТаблицаОперандов() Экспорт + + Возврат ТаблицаПолей(); + +КонецФункции + +// Подготавливает стандартный список операторов требуемых видов. +// +// Параметры: +// ГруппыОператоров - Строка - перечисление требуемых видов операторов. Возможные значения: +// Разделители, Операторы, ЛогическиеОператорыИКонстанты, +// ЧисловыеФункции, СтроковыеФункции, ПрочиеФункции. +// +// Возвращаемое значение: +// ДеревоЗначений +// +Функция СписокОператоров(ГруппыОператоров = Неопределено) Экспорт + + Возврат КонструкторФормулСлужебный.СписокОператоров(ГруппыОператоров); + +КонецФункции + +// Формирует представление формулы на текущем языке пользователя. +// Операнды и операторы в тексте формулы заменяются на их представления. +// +// Параметры: +// ПараметрыФормулы - см. ПараметрыРедактированияФормулы +// +// Возвращаемое значение: +// Строка +// +Функция ПредставлениеФормулы(ПараметрыФормулы) Экспорт + + ОписаниеСписковПолей = КонструкторФормулСлужебный.ОписаниеСписковПолей(); + + ИсточникиДоступныхПолей = КонструкторФормулСлужебный.КоллекцияИсточниковДоступныхПолей(); + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); + ИсточникДоступныхПолей.КоллекцияПолей = КонструкторФормулСлужебный.КоллекцияПолей(ПараметрыФормулы.Операнды); + + ОписаниеСпискаПолей = ОписаниеСписковПолей.Добавить(); + ОписаниеСпискаПолей.ИсточникиДоступныхПолей = ИсточникиДоступныхПолей; + ОписаниеСпискаПолей.СкобкиПредставлений = Истина; + + ИсточникиДоступныхПолей = КонструкторФормулСлужебный.КоллекцияИсточниковДоступныхПолей(); + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); + ИсточникДоступныхПолей.КоллекцияПолей = КонструкторФормулСлужебный.КоллекцияПолей(ПараметрыФормулы.Операторы); + + ОписаниеСпискаПолей = ОписаниеСписковПолей.Добавить(); + ОписаниеСпискаПолей.ИсточникиДоступныхПолей = ИсточникиДоступныхПолей; + + Возврат КонструкторФормулСлужебный.ПредставлениеВыражения(ПараметрыФормулы.Формула, ОписаниеСписковПолей); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/КонструкторФормул/КонструкторФормул.mdo b/SSL/src/CommonModules/КонструкторФормул/КонструкторФормул.mdo new file mode 100644 index 000000000..8acc34e35 --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормул/КонструкторФормул.mdo @@ -0,0 +1,11 @@ + + + КонструкторФормул + + ru + Конструктор формул + + true + true + true + diff --git a/SSL/src/CommonModules/КонструкторФормулКлиент/Module.bsl b/SSL/src/CommonModules/КонструкторФормулКлиент/Module.bsl new file mode 100644 index 000000000..848fc7516 --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулКлиент/Module.bsl @@ -0,0 +1,201 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +// Открывает конструктор формул. +// +// Параметры: +// Параметры - см. ПараметрыРедактированияФормулы +// ОбработчикЗавершения - ОписаниеОповещения +// +Процедура НачатьРедактированиеФормулы(Параметры, ОбработчикЗавершения) Экспорт + + ОткрытьФорму("Обработка.КонструкторФормул.Форма.РедактированиеФормулы", Параметры, , , , , ОбработчикЗавершения); + +КонецПроцедуры + +// Конструктор параметра ПараметрыФормулы для функции ПредставлениеФормулы. +// +// Возвращаемое значение: +// Структура: +// * Формула - Строка +// * Операнды - Строка - адрес во временном хранилище коллекции операндов. Коллекция может быть одного из трех типов: +// ТаблицаЗначений - см. ТаблицаПолей +// ДеревоЗначений - см. ДеревоПолей +// СхемаКомпоновкиДанных - список операндов будет взят из коллекции ДоступныеПоляОтбора +// компоновщика настроек. Имя коллекции может быть переопределено +// в параметре ИмяКоллекцииСКД. +// * Операторы - Строка - адрес во временном хранилище коллекции операторов. Коллекция может быть одного из трех типов: +// ТаблицаЗначений - см. ТаблицаПолей +// ДеревоЗначений - см. ДеревоПолей +// СхемаКомпоновкиДанных - список операндов будет взят из коллекции ДоступныеПоляОтбора +// компоновщика настроек. Имя коллекции может быть переопределено +// в параметре ИмяКоллекцииСКД. +// * ИмяКоллекцииСКДОперандов - Строка - имя коллекции полей в компоновщике настроек. Параметр необходимо +// использовать, если в параметре Операнды передана схема компоновки данных. +// Значение по умолчанию - ДоступныеПоляОтбора. +// * ИмяКоллекцииСКДОператоров - Строка - имя коллекции полей в компоновщике настроек. Параметр необходимо +// использовать, если в параметре Операторы передана схема компоновки данных. +// Значение по умолчанию - ДоступныеПоляОтбора. +// * Наименование - Неопределено - наименование не используется для формулы, соответствующее поле не выводится. +// - Строка - наименование формулы. Если заполнено или пустое, соответствующее поле выводится +// на в форме конструктора. +// +Функция ПараметрыРедактированияФормулы() Экспорт + + Возврат КонструкторФормулКлиентСервер.ПараметрыРедактированияФормулы(); + +КонецФункции + +// Обработчик разворачивания подключаемого списка. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - владелец списка. +// Элемент - ТаблицаФормы - список, в котором выполняется разворачивание строки. +// Строка - Число - идентификатор строки списка. +// Отказ - Булево - признак отказа от разворачивания. +// +Процедура СписокПолейПередРазворачиванием(Форма, Элемент, Строка, Отказ) Экспорт + + Элемент.ТекущаяСтрока = Строка; + КоллекцияЭлементов = Форма[Элемент.Имя].НайтиПоИдентификатору(Строка).ПолучитьЭлементы(); + Если КоллекцияЭлементов.Количество() > 0 И КоллекцияЭлементов[0].Поле = Неопределено Тогда + Отказ = Истина; + Форма.ПодключитьОбработчикОжидания("Подключаемый_РазвернутьТекущийЭлементСпискаПолей", 0.1, Истина); + КонецЕсли; + +КонецПроцедуры + +// Обработчик разворачивания подключаемого списка. +// Разворачивает текущий элемент списка. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// +Процедура РазвернутьТекущийЭлементСпискаПолей(Форма) Экспорт + + СписокПолей = Форма.ТекущийЭлемент; + ИдентификаторСтроки = СписокПолей.ТекущаяСтрока; + + ПараметрыЗаполнения = Новый Структура; + ПараметрыЗаполнения.Вставить("ИдентификаторСтроки", ИдентификаторСтроки); + ПараметрыЗаполнения.Вставить("ИмяСписка", СписокПолей.Имя); + + Форма.Подключаемый_ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения); + СписокПолей.Развернуть(ИдентификаторСтроки); + +КонецПроцедуры + +// Обработчик перетаскивания подключаемого списка +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - владелец списка. +// Элемент - ТаблицаФормы - список, в котором выполняется перетаскивание. +// ПараметрыПеретаскивания - ПараметрыПеретаскивания - содержит перетаскиваемое значение, тип действия +// и возможные действия при перетаскивании. +// Выполнение - Булево - если Ложь, перетаскивание не начнется. +// +Процедура СписокПолейНачалоПеретаскивания(Форма, Элемент, ПараметрыПеретаскивания, Выполнение) Экспорт + + Реквизит = Форма[Элемент.Имя].НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение); + ПараметрыПеретаскивания.Значение = "[" + Реквизит.ПредставлениеПутиКДанным + "]"; + +КонецПроцедуры + +// Возвращает описание текущего выбранного поля подключаемого списка. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - владелец списка. +// ИмяСпискаПолей - Строка - имя списка, установленное при вызове КонструкторФормул.ДобавитьСписокПолейНаФорму. +// +// Возвращаемое значение: +// Структура: +// * Имя - Строка +// * Заголовок - Строка +// * ПутьКДанным - Строка +// * ПредставлениеПутиКДанным - Строка +// * Тип - ОписаниеТипов +// * Родитель - Структура, Неопределено - см. ВыбранноеПолеВСпискеПолей +// +Функция ВыбранноеПолеВСпискеПолей(Форма, ИмяСпискаПолей = Неопределено) Экспорт + + Если Форма.ПодключенныеСпискиПолей.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Если ИмяСпискаПолей = Неопределено Тогда + СписокПолей = Форма.ТекущийЭлемент; // ТаблицаФормы + ИмяСпискаПолей = СписокПолей.Имя; + Если КонструкторФормулКлиентСервер.НастройкиСпискаПолей(Форма, ИмяСпискаПолей)= Неопределено Тогда + ИмяСпискаПолей = Форма.ПодключенныеСпискиПолей[0].ИмяСпискаПолей; + КонецЕсли; + КонецЕсли; + + СписокПолей = Форма.Элементы[ИмяСпискаПолей]; + ТекущиеДанные = СписокПолей.ТекущиеДанные; + + Если ТекущиеДанные = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат ОписаниеВыбранногоПоля(ТекущиеДанные); + +КонецФункции + +// Обработчик события строки поиска подключаемого списка. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - владелец списка. +// Элемент - ПолеФормы - строка поиска. +// Текст - Строка - текст в строке поиска. +// СтандартнаяОбработка - Булево - если Ложь, стандартное действие выполнено не будет. +// +Процедура СтрокаПоискаИзменениеТекстаРедактирования(Форма, Элемент, Текст, СтандартнаяОбработка) Экспорт + + Форма[Элемент.Имя] = Текст; + Форма.ОтключитьОбработчикОжидания("Подключаемый_ВыполнитьПоискВСпискеПолей"); + Форма.ПодключитьОбработчикОжидания("Подключаемый_ВыполнитьПоискВСпискеПолей", 0.5, Истина); + +КонецПроцедуры + +// Обработчик события строки поиска подключаемого списка. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - владелец списка. +// Элемент - ПолеФормы - строка поиска. +// СтандартнаяОбработка - Булево - если Ложь, стандартное действие выполнено не будет. +// +Процедура СтрокаПоискаОчистка(Форма, Элемент, СтандартнаяОбработка) Экспорт + + СтрокаПоискаИзменениеТекстаРедактирования(Форма, Элемент, "", СтандартнаяОбработка); + +КонецПроцедуры + +Функция ОписаниеВыбранногоПоля(Поле) + + Результат = Новый Структура; + Результат.Вставить("Имя"); + Результат.Вставить("Заголовок"); + Результат.Вставить("ПутьКДанным"); + Результат.Вставить("ПредставлениеПутиКДанным"); + Результат.Вставить("Тип"); + Результат.Вставить("Родитель"); + + ЗаполнитьЗначенияСвойств(Результат, Поле); + + Родитель = Поле.ПолучитьРодителя(); + Если Родитель <> Неопределено Тогда + Результат.Родитель = ОписаниеВыбранногоПоля(Родитель); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/КонструкторФормулКлиент/КонструкторФормулКлиент.mdo b/SSL/src/CommonModules/КонструкторФормулКлиент/КонструкторФормулКлиент.mdo new file mode 100644 index 000000000..823f07d2a --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулКлиент/КонструкторФормулКлиент.mdo @@ -0,0 +1,10 @@ + + + КонструкторФормулКлиент + + ru + Конструктор формул клиент + + true + true + diff --git a/SSL/src/CommonModules/КонструкторФормулКлиентСервер/Module.bsl b/SSL/src/CommonModules/КонструкторФормулКлиентСервер/Module.bsl new file mode 100644 index 000000000..e5219ee33 --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулКлиентСервер/Module.bsl @@ -0,0 +1,133 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция ЭлементыФормулы(Знач Формула) Экспорт + + Операнды = ПрочитатьОперандыИзФормулы(Формула); + Для Каждого Операнд Из Операнды Цикл + Формула = СтрЗаменить(Формула, Операнд, " "); + КонецЦикла; + Функции = Новый Массив; + + СтрокиСФункциями = СтрРазделитьСУчетомСтрок(Формула, "(", Ложь); + + Для Индекс = 0 По СтрокиСФункциями.ВГраница() Цикл + СтрокаСФункцией = СтрокиСФункциями[Индекс]; + ОперандыСтроки = ОперандыСтроки(СтрокаСФункцией); + Если ОперандыСтроки.Количество() > 0 И Индекс < СтрокиСФункциями.ВГраница() Тогда + Функции.Добавить(СокрЛП(ОперандыСтроки[ОперандыСтроки.ВГраница()])); + КонецЕсли; + Для Каждого Операнд Из ОперандыСтроки Цикл + Операнды.Добавить(Операнд); + КонецЦикла; + КонецЦикла; + + Результат = Новый Структура; + Результат.Вставить("Операнды", Операнды); + Результат.Вставить("Функции", Функции); + + Возврат Результат; + +КонецФункции + +Функция ПрочитатьОперандыИзФормулы(Формула) + + Операнды = Новый Массив; + Для Каждого Строка Из СтрРазделитьСУчетомСтрок(Формула, "[", Истина) Цикл + ЧастиСтроки = СтрРазделитьСУчетомСтрок(Строка, "]", Истина); + Если ЧастиСтроки.Количество() > 1 Тогда + Операнды.Добавить("[" + ЧастиСтроки[0] + "]"); + КонецЕсли; + КонецЦикла; + + Возврат Операнды; + +КонецФункции + +Функция ОперандыСтроки(Знач Строка) + + Операнды = Новый Массив; + + Строка = СтрСоединить(СтрРазделитьСУчетомСтрок(Строка, "[", Истина), "*["); + + Для Каждого Операнд Из СтрРазделитьСУчетомСтрок(Строка, "/*-+=(),% ", Ложь) Цикл + Операнды.Добавить(СокрЛП(Операнд)); + КонецЦикла; + + Возврат Операнды; + +КонецФункции + +Функция СтрРазделитьСУчетомСтрок(ИсходнаяСтрока, Разделитель, ВключатьПустые = Истина) + + Результат = Новый Массив; + СтрокиМеждуКавычками = СтрРазделить(ИсходнаяСтрока, """", Истина); + + Если СтрокиМеждуКавычками.Количество() = 0 Тогда + Возврат СтрРазделить(ИсходнаяСтрока, Разделитель, ВключатьПустые); + КонецЕсли; + + Для Индекс = 0 По СтрокиМеждуКавычками.ВГраница() Цикл + Если Индекс % 2 = 1 Тогда + Если Результат.Количество() = 0 Тогда + Результат.Добавить(""); + КонецЕсли; + Результат[Результат.ВГраница()] = Результат[Результат.ВГраница()] + """" + СтрокиМеждуКавычками[Индекс] + ?(Индекс = СтрокиМеждуКавычками.ВГраница(), "", """"); + Продолжить; + КонецЕсли; + + Если СтрокиМеждуКавычками[Индекс] = "" Тогда + Продолжить; + КонецЕсли; + + ЧастиСтроки = СтрРазделить(СтрокиМеждуКавычками[Индекс], Разделитель, Истина); + Для Каждого ЧастьСтроки Из ЧастиСтроки Цикл + Результат.Добавить(ЧастьСтроки); + КонецЦикла; + КонецЦикла; + + Если Не ВключатьПустые Тогда + Для Индекс = -Результат.Количество() + 1 По 0 Цикл + Если ПустаяСтрока(Результат[-Индекс]) Тогда + Результат.Удалить(-Индекс); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция НастройкиСпискаПолей(Форма, ИмяСпискаПолей) Экспорт + + Отбор = Новый Структура("ИмяСпискаПолей", ИмяСпискаПолей); + Для Каждого СписокПолей Из Форма.ПодключенныеСпискиПолей.НайтиСтроки(Отбор) Цикл + Возврат СписокПолей; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Функция ПараметрыРедактированияФормулы() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Формула"); + Параметры.Вставить("Операнды"); + Параметры.Вставить("Операторы"); + Параметры.Вставить("ИмяКоллекцииСКДОперандов"); + Параметры.Вставить("ИмяКоллекцииСКДОператоров"); + Параметры.Вставить("Наименование"); + + Возврат Параметры; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/КонструкторФормулКлиентСервер/КонструкторФормулКлиентСервер.mdo b/SSL/src/CommonModules/КонструкторФормулКлиентСервер/КонструкторФормулКлиентСервер.mdo new file mode 100644 index 000000000..3c578f72c --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулКлиентСервер/КонструкторФормулКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + КонструкторФормулКлиентСервер + + ru + Конструктор формул клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/КонструкторФормулСлужебный/Module.bsl b/SSL/src/CommonModules/КонструкторФормулСлужебный/Module.bsl new file mode 100644 index 000000000..8d39818dd --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулСлужебный/Module.bsl @@ -0,0 +1,1668 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Параметры - см. ПараметрыДобавленияСпискаПолей +// +Процедура ДобавитьСписокПолейНаФорму(Форма, Параметры) Экспорт + + ПараметрыДобавления = ПараметрыДобавленияСпискаПолей(); + ЗаполнитьЗначенияСвойств(ПараметрыДобавления, Параметры); + + ДобавляемыеРеквизиты = Новый Массив; + + ЗначенияРеквизитов = Новый Структура("ПодключенныеСпискиПолей"); + ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов, Форма); + ПодключенныеСпискиПолей = ЗначенияРеквизитов.ПодключенныеСпискиПолей; + Если ПодключенныеСпискиПолей = Неопределено Тогда + ИмяРеквизитаПодключенныеСпискиПолей = "ПодключенныеСпискиПолей"; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизитаПодключенныеСпискиПолей, Новый ОписаниеТипов("ТаблицаЗначений"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяСпискаПолей", Новый ОписаниеТипов("Строка"), ИмяРеквизитаПодключенныеСпискиПолей)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяСпискаИсточников", Новый ОписаниеТипов("Строка"), ИмяРеквизитаПодключенныеСпискиПолей)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("СкобкиИдентификаторов", Новый ОписаниеТипов("Булево"), ИмяРеквизитаПодключенныеСпискиПолей)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("СкобкиПредставлений", Новый ОписаниеТипов("Булево"), ИмяРеквизитаПодключенныеСпискиПолей)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИспользоватьИдентификаторыДляФормул", Новый ОписаниеТипов("Булево"), ИмяРеквизитаПодключенныеСпискиПолей)); + КонецЕсли; + + ИмяСпискаПолей = ПараметрыДобавления.ИмяСписка; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяСпискаПолей, Новый ОписаниеТипов("ДеревоЗначений"))); + Для Каждого ОписаниеРеквизита Из РеквизитыПодключаемогоСписка() Цикл + ИмяРеквизита = ОписаниеРеквизита.Ключ; + ТипРеквизита = ОписаниеРеквизита.Значение; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, ИмяСпискаПолей)); + КонецЦикла; + + ИмяСтрокиПоиска = ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяСтрокиПоиска, Новый ОписаниеТипов("Строка"))); + + ИмяСпискаИсточников = ИмяСпискаПолей + "Источники"; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяСпискаИсточников, Новый ОписаниеТипов("ТаблицаЗначений"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИсточникДанных", Новый ОписаниеТипов("Строка"), ИмяСпискаИсточников)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("КоллекцияПолей", Новый ОписаниеТипов(), ИмяСпискаИсточников)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Замещать", Новый ОписаниеТипов("Булево"), ИмяСпискаИсточников)); + + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + МестоРазмещенияСтрокиПоиска = ПараметрыДобавления.МестоРазмещенияСтрокиПоиска; + Если Не ЗначениеЗаполнено(МестоРазмещенияСтрокиПоиска) Тогда + МестоРазмещенияСтрокиПоиска = ПараметрыДобавления.МестоРазмещенияСписка; + КонецЕсли; + + СтрокаПоиска = Форма.Элементы.Добавить(ИмяСтрокиПоиска, Тип("ПолеФормы"), МестоРазмещенияСтрокиПоиска); + СтрокаПоиска.ПутьКДанным = ИмяСтрокиПоиска; + СтрокаПоиска.Вид = ВидПоляФормы.ПолеВвода; + СтрокаПоиска.ПодсказкаВвода = ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска; + СтрокаПоиска.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + СтрокаПоиска.УстановитьДействие("ИзменениеТекстаРедактирования", "Подключаемый_СтрокаПоискаИзменениеТекстаРедактирования"); + СтрокаПоиска.УстановитьДействие("Очистка", "Подключаемый_СтрокаПоискаОчистка"); + СтрокаПоиска.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.НеИспользовать; + СтрокаПоиска.АвтоМаксимальнаяШирина = Ложь; + СтрокаПоиска.КнопкаОчистки = Истина; + + СписокПолей = Форма.Элементы.Добавить(ИмяСпискаПолей, Тип("ТаблицаФормы"), ПараметрыДобавления.МестоРазмещенияСписка); + СписокПолей.ПутьКДанным = ИмяСпискаПолей; + СписокПолей.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать; + СписокПолей.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + СписокПолей.Шапка = Ложь; + СписокПолей.ГоризонтальныеЛинии = Ложь; + СписокПолей.ВертикальныеЛинии = Ложь; + СписокПолей.ИзменятьСоставСтрок = Ложь; + СписокПолей.ИзменятьПорядокСтрок = Ложь; + СписокПолей.РежимВыделения = РежимВыделенияТаблицы.Одиночный; + СписокПолей.КоманднаяПанель.Видимость = Ложь; + СписокПолей.УстановитьДействие("ПередРазворачиванием", "Подключаемый_СписокПолейПередРазворачиванием"); + СписокПолей.УстановитьДействие("НачалоПеретаскивания", "Подключаемый_СписокПолейНачалоПеретаскивания"); + + Для Каждого Обработчик Из ПараметрыДобавления.ОбработчикиСписка Цикл + ИмяСобытия = Обработчик.Ключ; + ИмяПроцедуры = Обработчик.Значение; + СписокПолей.УстановитьДействие(ИмяСобытия, ИмяПроцедуры); + КонецЦикла; + + ГруппаКолонок = Форма.Элементы.Добавить(ИмяСпискаПолей + "КартинкаИПредставление", Тип("ГруппаФормы"), СписокПолей); + ГруппаКолонок.Группировка = ГруппировкаКолонок.ВЯчейке; + + КартинкаПоля = Форма.Элементы.Добавить(ИмяСпискаПолей + "Картинка", Тип("ПолеФормы"), ГруппаКолонок); + КартинкаПоля.ПутьКДанным = ИмяСпискаПолей + ".Картинка"; + КартинкаПоля.Вид = ВидПоляФормы.ПолеКартинки; + КартинкаПоля.ОтображатьВШапке = Ложь; + + ПредставлениеПоля = Форма.Элементы.Добавить(ИмяСпискаПолей + "Представление", Тип("ПолеФормы"), ГруппаКолонок); + ПредставлениеПоля.ПутьКДанным = ИмяСпискаПолей + ".Заголовок"; + ПредставлениеПоля.Вид = ВидПоляФормы.ПолеВвода; + ПредставлениеПоля.ТолькоПросмотр = Истина; + + ПредставлениеПоля = Форма.Элементы.Добавить(ИмяСпискаПолей + "ПредставлениеПутиКДанным", Тип("ПолеФормы"), ГруппаКолонок); + ПредставлениеПоля.ПутьКДанным = ИмяСпискаПолей + ".ПредставлениеПутиКДанным"; + ПредставлениеПоля.Вид = ВидПоляФормы.ПолеНадписи; + ПредставлениеПоля.ТолькоПросмотр = Истина; + ПредставлениеПоля.Видимость = Ложь; + + ПодключенныеСпискиПолей = Форма.ПодключенныеСпискиПолей; // ТаблицаЗначений + ПодключенныйСписок = ПодключенныеСпискиПолей.Добавить(); + ПодключенныйСписок.ИмяСпискаПолей = ИмяСпискаПолей; + ПодключенныйСписок.ИмяСпискаИсточников = ИмяСпискаИсточников; + ПодключенныйСписок.СкобкиИдентификаторов = ПараметрыДобавления.СкобкиИдентификаторов; + ПодключенныйСписок.СкобкиПредставлений = ПараметрыДобавления.СкобкиПредставлений; + ПодключенныйСписок.ИспользоватьИдентификаторыДляФормул = ПараметрыДобавления.ИспользоватьИдентификаторыДляФормул; + + ИсточникиДоступныхПолей = Форма[ИмяСпискаИсточников]; // ТаблицаЗначений + + Для Каждого КоллекцияПолей Из ПараметрыДобавления.КоллекцииПолей Цикл + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); + ИсточникДоступныхПолей.КоллекцияПолей = КоллекцияПолей; + КонецЦикла; + + Для Каждого ИсточникДоступныхПолей Из ПараметрыДобавления.ИсточникиДоступныхПолей Цикл + ЗаполнитьЗначенияСвойств(ИсточникиДоступныхПолей.Добавить(), ИсточникДоступныхПолей); + КонецЦикла; + + ДеревоПолей = Форма.РеквизитФормыВЗначение(ИмяСпискаПолей); + ТаблицаИсточников = Форма.РеквизитФормыВЗначение(ИмяСпискаИсточников); + + ЗаполнитьСписокДоступныхРеквизитов(ДеревоПолей, ТаблицаИсточников); + + Форма.ЗначениеВРеквизитФормы(ДеревоПолей, ИмяСпискаПолей); + Форма.ЗначениеВРеквизитФормы(ТаблицаИсточников, ИмяСпискаИсточников); + + УстановитьУсловноеОформление(Форма, ИмяСпискаПолей); + +КонецПроцедуры + +// Возвращаемое значение: +// Структура: +// * МестоРазмещенияСписка - ГруппаФормы +// - ТаблицаФормы +// - ФормаКлиентскогоПриложения +// * ИмяСписка - Строка +// * КоллекцииПолей - Массив +// * МестоРазмещенияСтрокиПоиска - ГруппаФормы +// - ТаблицаФормы +// - ФормаКлиентскогоПриложения +// * ПодсказкаВводаСтрокиПоиска - Строка +// * ОбработчикиСписка - Структура +// * ВключатьГруппыВПутьКДанным - Булево +// * СкобкиИдентификаторов - Булево +// * СкобкиПредставлений - Булево +// * ИсточникиДоступныхПолей - см. НоваяКоллекцияИсточниковДоступныхПолей +// * ИспользоватьИдентификаторыДляФормул - Булево +// +Функция ПараметрыДобавленияСпискаПолей() Экспорт + + Результат = Новый Структура; + Результат.Вставить("МестоРазмещенияСписка"); + Результат.Вставить("ИмяСписка", "ДоступныеПоля"); + Результат.Вставить("КоллекцииПолей", Новый Массив); + Результат.Вставить("МестоРазмещенияСтрокиПоиска"); + Результат.Вставить("ПодсказкаВводаСтрокиПоиска", НСтр("ru = 'Найти...'")); + Результат.Вставить("ОбработчикиСписка", Новый Структура); + Результат.Вставить("ВключатьГруппыВПутьКДанным", Истина); + Результат.Вставить("СкобкиИдентификаторов", Ложь); + Результат.Вставить("СкобкиПредставлений", Истина); + Результат.Вставить("ИсточникиДоступныхПолей", НоваяКоллекцияИсточниковДоступныхПолей()); + Результат.Вставить("ИспользоватьИдентификаторыДляФормул", Ложь); + + Возврат Результат; + +КонецФункции + + +// Возвращаемое значение: +// ТаблицаЗначений: +// * КоллекцияПолей - ДеревоЗначений +// * ИсточникиДоступныхПолей - ТаблицаЗначений +// * СкобкиИдентификаторов - Булево +// * СкобкиПредставлений - Булево +// * ИспользоватьИдентификаторыДляФормул - Булево +// +Функция ОписаниеСписковПолей() Экспорт + + Результат = Новый ТаблицаЗначений(); + Результат.Колонки.Добавить("КоллекцияПолей"); + Результат.Колонки.Добавить("ИсточникиДоступныхПолей"); + Результат.Колонки.Добавить("СкобкиИдентификаторов", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("СкобкиПредставлений", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("ИспользоватьИдентификаторыДляФормул", Новый ОписаниеТипов("Булево")); + + Возврат Результат; + +КонецФункции + +Функция КоллекцияИсточниковДоступныхПолей() Экспорт + + ИсточникиДоступныхПолей = Новый ТаблицаЗначений(); + + ИсточникиДоступныхПолей.Колонки.Добавить("ИсточникДанных", Новый ОписаниеТипов("Строка")); + ИсточникиДоступныхПолей.Колонки.Добавить("КоллекцияПолей", Новый ОписаниеТипов()); + ИсточникиДоступныхПолей.Колонки.Добавить("Замещать", Новый ОписаниеТипов("Булево")); + + Возврат ИсточникиДоступныхПолей; + +КонецФункции + +Процедура ОбновитьКоллекцииПолей(Форма, КоллекцииПолей, ИмяСпискаПолей = "ДоступныеПоля") Экспорт + + ИсточникиДоступныхПолей = СписокИсточниковДоступныхПолей(Форма, ИмяСпискаПолей); // ДанныеФормыКоллекция + Отбор = Новый Структура("ИсточникДанных", ""); + Для Каждого СтрокаТаблицы Из ИсточникиДоступныхПолей.НайтиСтроки(Отбор) Цикл + ИсточникиДоступныхПолей.Удалить(СтрокаТаблицы); + КонецЦикла; + + Для Индекс = 0 По КоллекцииПолей.ВГраница() Цикл + КоллекцияПолей = КоллекцииПолей[Индекс]; + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Вставить(Индекс); + ИсточникДоступныхПолей.ИсточникДанных = ""; + ИсточникДоступныхПолей.КоллекцияПолей = КоллекцияПолей; + КонецЦикла; + + Форма[ИмяСпискаПолей].ПолучитьЭлементы().Очистить(); + ЗаполнитьСписокДоступныхРеквизитов(Форма[ИмяСпискаПолей], ИсточникиДоступныхПолей); + +КонецПроцедуры + +Функция ТаблицаПолей() Экспорт + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); + Результат.Колонки.Добавить("ИмяКартинки", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); + + Возврат Результат; + +КонецФункции + +Функция ДеревоПолей() Экспорт + + Результат = Новый ДеревоЗначений(); + Результат.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); + Результат.Колонки.Добавить("ИмяКартинки", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); + + Возврат Результат; + +КонецФункции + +Функция КоллекцияПолей(Знач ИсточникПолей, Форма = Неопределено, Знач ИмяКоллекцииСКД = Неопределено) Экспорт + + Если ЭтоАдресВременногоХранилища(ИсточникПолей) Тогда + ИсточникПолей = ПолучитьИзВременногоХранилища(ИсточникПолей); + КонецЕсли; + + СхемаКомпоновкиДанных = ИсточникПолей; + Если ТипЗнч(ИсточникПолей) = Тип("ТаблицаЗначений") Тогда + СхемаКомпоновкиДанных = СхемаКомпоновкиДанныхИзТаблицыЗначений(ИсточникПолей); + ИначеЕсли ТипЗнч(ИсточникПолей) = Тип("ДеревоЗначений") Тогда + СхемаКомпоновкиДанных = СхемаКомпоновкиДанныхИзДереваЗначений(ИсточникПолей); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ИмяКоллекцииСКД) Тогда + ИмяКоллекцииСКД = "ДоступныеПоляОтбора"; + КонецЕсли; + + Если ТипЗнч(СхемаКомпоновкиДанных) <> Тип("СхемаКомпоновкиДанных") Тогда + Возврат Неопределено; + КонецЕсли; + + Если Форма <> Неопределено Тогда + УникальныйИдентификатор = Форма.УникальныйИдентификатор; + КонецЕсли; + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор); + ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы); + + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек); + КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); + + Возврат КомпоновщикНастроек.Настройки[ИмяКоллекцииСКД]; + +КонецФункции + +Процедура ЗаполнитьСписокДоступныхРеквизитов(Знач ТекущийРеквизит, ИсточникиДоступныхПолей, Знач Отбор = "", + ИспользоватьИдентификаторыДляФормул = Ложь) + + ДоступныеРеквизиты = НоваяКоллекцияДоступныхРеквизитов(); + ДоступныеРеквизиты.Колонки.Добавить("ЕстьПодчиненные", Новый ОписаниеТипов("Булево")); + ДоступныеРеквизиты.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число")); + + КоллекцииДоступныхПолей = КоллекцииДоступныхПолей(ТекущийРеквизит, ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул); + Для Каждого КоллекцияДоступныхПолей Из КоллекцииДоступныхПолей Цикл + Для Каждого ОписаниеПоля Из КоллекцияДоступныхПолей.Элементы Цикл + + Если ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("ДополнительныеРеквизиты") Тогда + Продолжить; + КонецЕсли; + Если ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("КонтактнаяИнформация") Тогда + Продолжить; + КонецЕсли; + + Реквизит = ДоступныеРеквизиты.Добавить(); + + Реквизит.Заголовок = ОписаниеПоля.Заголовок; + Если ОписаниеПоля.Родитель <> Неопределено И СтрНачинаетсяС(Реквизит.Заголовок, ОписаниеПоля.Родитель.Заголовок) Тогда + Реквизит.Заголовок = Сред(Реквизит.Заголовок, СтрДлина(ОписаниеПоля.Родитель.Заголовок) + 2); + КонецЕсли; + + Реквизит.Поле = ОписаниеПоля.Поле; + + ЧастиСтроки = СтрРазделить(ОписаниеПоля.Поле, "."); + Реквизит.Имя = ОчиститьКвадратныеСкобки(ЧастиСтроки[ЧастиСтроки.ВГраница()]); + + Реквизит.Тип = ОписаниеПоля.Тип; + Реквизит.Папка = ОписаниеПоля.Папка; + Реквизит.Таблица = ОписаниеПоля.Таблица; + Реквизит.Порядок = 1; + + ДополнительныеПараметры = Новый Соответствие; + Если ТипЗнч(ОписаниеПоля) = Тип("ДоступноеПолеОтбораКомпоновкиДанных") И ЗначениеЗаполнено(ОписаниеПоля.Маска) + И СтрНачинаетсяС(ОписаниеПоля.Маска, "{") И СтрЗаканчиваетсяНа(ОписаниеПоля.Маска, "}") Тогда + ДополнительныеПараметры = JSONВЗначение(ОписаниеПоля.Маска); + КонецЕсли; + + ИмяКартинки = ДополнительныеПараметры["ИмяКартинки"]; + Если ЗначениеЗаполнено(ИмяКартинки) Тогда + Реквизит.Картинка = БиблиотекаКартинок[ИмяКартинки]; + КонецЕсли; + Порядок = ДополнительныеПараметры["Порядок"]; + Если ЗначениеЗаполнено(Порядок) Тогда + Реквизит.Порядок = Порядок; + КонецЕсли; + ЭтоГруппа = ДополнительныеПараметры["ЭтоГруппа"]; + Если ЗначениеЗаполнено(ЭтоГруппа) Тогда + Реквизит.Папка = ЭтоГруппа; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Реквизит.Картинка) Тогда + Реквизит.Картинка = КартинкаТипа(ОписаниеПоля.Тип); + + Если Реквизит.Таблица Тогда + Реквизит.Картинка = БиблиотекаКартинок.ТипСписок; + ИначеЕсли Реквизит.Папка Тогда + Реквизит.Картинка = БиблиотекаКартинок.ТипГруппа; + КонецЕсли; + КонецЕсли; + + Если ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("СистемныеПоля") Тогда + Реквизит.Порядок = 2; + КонецЕсли; + Если ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("ПользовательскиеПоля") Тогда + Реквизит.Заголовок = НСтр("ru = 'Формулы'"); + Реквизит.Картинка = БиблиотекаКартинок.ТипФункция; + Реквизит.Порядок = 3; + КонецЕсли; + Если ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("ДетальныеЗаписи") Тогда + Реквизит.Порядок = 4; + КонецЕсли; + + Реквизит.ПредставлениеПутиКДанным = ""; + Если Не Реквизит.Папка Тогда + Реквизит.ПутьКДанным = Реквизит.Имя; + Реквизит.ПредставлениеПутиКДанным = Реквизит.Заголовок; + КонецЕсли; + + Если ОписаниеПоля.Элементы.Количество() > 0 Тогда + Реквизит.ЕстьПодчиненные = Истина; + КонецЕсли; + + КонецЦикла; + КонецЦикла; + + ДоступныеРеквизиты.Сортировать("Порядок, Заголовок"); + + КоллекцияРеквизитов = ПодчиненныеЭлементы(ТекущийРеквизит); + Для Каждого ДоступныйРеквизит Из ДоступныеРеквизиты Цикл + Реквизит = КоллекцияРеквизитов.Добавить(); + ЗаполнитьЗначенияСвойств(Реквизит, ДоступныйРеквизит); + + Если Родитель(Реквизит) <> Неопределено Тогда + Родитель = Родитель(Реквизит); + Если Реквизит.Папка Тогда + Реквизит.ПутьКДанным = Родитель.ПутьКДанным; + Реквизит.ПредставлениеПутиКДанным = Строка(Родитель.ПредставлениеПутиКДанным);; + Иначе + Если ЗначениеЗаполнено(Родитель.ПутьКДанным) Тогда + Реквизит.ПутьКДанным = Родитель.ПутьКДанным + "." + Реквизит.Имя; + Реквизит.ПредставлениеПутиКДанным = Строка(Родитель.ПредставлениеПутиКДанным) + "." + Реквизит.Заголовок; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ДоступныйРеквизит.ЕстьПодчиненные + Или Реквизит.Тип.Типы().Количество() = 1 И Не ОбщегоНазначения.ЭтоСсылка(Реквизит.Тип.Типы()[0]) Тогда + + КоллекцииПолейРеквизита = КоллекцииДоступныхПолей(Реквизит, ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул); + Если ЗначениеЗаполнено(КоллекцииПолейРеквизита) И ЗначениеЗаполнено(КоллекцииПолейРеквизита[0].Элементы) + И Не СтрНайти(Реквизит.ПутьКДанным, Реквизит.Имя + ".") Тогда + ПодчиненныеЭлементы(Реквизит).Добавить(); + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +// Возвращаемое значение: +// ТаблицаЗначений: +// * Имя - Строка +// * Заголовок - Строка +// * Поле - ОписаниеТипов +// * ПутьКДанным - Строка +// * ПредставлениеПутиКДанным - Строка +// * Тип - ОписаниеТипов +// * Картинка - Картинка +// * Папка - Булево +// * Таблица - Булево +// * СвойНаборПолей - Булево +// * Отступ - Строка +// * СоответствуетОтбору - Булево +// * ПодчиненныйЭлементСоответствуетОтбору - Булево +// +Функция НоваяКоллекцияДоступныхРеквизитов() + + ДоступныеРеквизиты = Новый ТаблицаЗначений; + Для Каждого ОписаниеРеквизита Из РеквизитыПодключаемогоСписка() Цикл + ИмяРеквизита = ОписаниеРеквизита.Ключ; + ТипРеквизита = ОписаниеРеквизита.Значение; + ДоступныеРеквизиты.Колонки.Добавить(ИмяРеквизита, ТипРеквизита); + КонецЦикла; + + Возврат ДоступныеРеквизиты; + +КонецФункции + +// Параметры: +// Коллекция - ДанныеФормыДерево +// - ДанныеФормыКоллекцияЭлементовДерева +// - ДеревоЗначений +// - СтрокаДереваЗначений +// +Функция ПодчиненныеЭлементы(Коллекция) + + Если ТипЗнч(Коллекция) = Тип("ДеревоЗначений") Или ТипЗнч(Коллекция) = Тип("СтрокаДереваЗначений") Тогда + Возврат Коллекция.Строки; + КонецЕсли; + + Возврат Коллекция.ПолучитьЭлементы(); + +КонецФункции + +// Параметры: +// Элемент - ДанныеФормыДерево +// - ДанныеФормыКоллекцияЭлементовДерева +// - ДеревоЗначений +// - СтрокаДереваЗначений +// +Функция Родитель(Элемент) + + Если ТипЗнч(Элемент) = Тип("ДанныеФормыЭлементДерева") Тогда + Возврат Элемент.ПолучитьРодителя(); + ИначеЕсли ТипЗнч(Элемент) = Тип("СтрокаДереваЗначений") Тогда + Возврат Элемент.Родитель; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +// Возвращаемое значение: +// Массив из ДоступныеПоляКомпоновкиДанных +// +Функция КоллекцииДоступныхПолей(Реквизит, ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул) + + Результат = Новый Массив; + + Если ТипЗнч(Реквизит) = Тип("ДанныеФормыДерево") Или ТипЗнч(Реквизит) = Тип("ДеревоЗначений") Тогда + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул) Цикл + Результат.Добавить(ИсточникДоступныхПолей.КоллекцияПолей); + КонецЦикла; + Возврат Результат; + КонецЕсли; + + Замещать = Ложь; + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул, Реквизит) Цикл + Реквизит.СвойНаборПолей = Истина; + Результат.Добавить(ИсточникДоступныхПолей.КоллекцияПолей); + Замещать = Замещать Или ИсточникДоступныхПолей.Замещать; + КонецЦикла; + + Если Замещать И ЗначениеЗаполнено(Результат) Тогда + Возврат Результат; + КонецЕсли; + + Родитель = Родитель(Реквизит); + Пока Родитель <> Неопределено Цикл + Если Родитель.СвойНаборПолей Тогда + Прервать; + Иначе + Родитель = Родитель(Родитель); + Продолжить; + КонецЕсли; + КонецЦикла; + + Если Родитель <> Неопределено Тогда + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул, Родитель) Цикл + Поле = ИсточникДоступныхПолей.КоллекцияПолей.НайтиПоле(Реквизит.Поле); + Если Поле <> Неопределено Тогда + Результат.Добавить(Поле); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если Не Замещать Или Не ЗначениеЗаполнено(Результат) Тогда + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул) Цикл + Поле = ИсточникДоступныхПолей.КоллекцияПолей.НайтиПоле(Реквизит.Поле); + Если Поле <> Неопределено Тогда + Результат.Добавить(Поле); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ИсточникиДоступныхПолей(ИсточникиДоступныхПолей, ИспользоватьИдентификаторыДляФормул, Реквизит = Неопределено) + + Результат = Новый Массив; + + Если Реквизит = Неопределено Тогда + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей.НайтиСтроки(Новый Структура("ИсточникДанных", "")) Цикл + Результат.Добавить(ИсточникДоступныхПолей); + КонецЦикла; + Возврат Результат; + КонецЕсли; + + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей Цикл + Строка = Реквизит.ПутьКДанным; + Если Реквизит.Папка Тогда + Строка = Строка + ?(ЗначениеЗаполнено(Строка), ".", "") + Реквизит.Имя; + КонецЕсли; + Если СтрокаСоответствуетШаблону(Строка, ИсточникДоступныхПолей.ИсточникДанных) Тогда + Результат.Добавить(ИсточникДоступныхПолей); + КонецЕсли; + КонецЦикла; + + Если ЗначениеЗаполнено(Результат) Тогда + Возврат Результат; + КонецЕсли; + + Для Каждого Тип Из Реквизит.Тип.Типы() Цикл + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных = Неопределено Или Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + ИсточникДанных = ОбъектМетаданных.ПолноеИмя(); + + ИсточникНайден = Ложь; + Для Каждого ИсточникДоступныхПолей Из ИсточникиДоступныхПолей Цикл + Если СтрокаСоответствуетШаблону(ИсточникДанных, ИсточникДоступныхПолей.ИсточникДанных) Тогда + Результат.Добавить(ИсточникДоступныхПолей); + ИсточникНайден = Истина; + КонецЕсли; + КонецЦикла; + + Если Не ИсточникНайден И ИспользоватьИдентификаторыДляФормул Тогда + КомпоновщикНастроек = КомпоновщикНастроекОбъекта(ОбъектМетаданных); + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); + ИсточникДоступныхПолей.ИсточникДанных = ИсточникДанных; + ИсточникДоступныхПолей.КоллекцияПолей = КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора; + ИсточникДоступныхПолей.Замещать = Истина; + + Результат.Добавить(ИсточникДоступныхПолей); + + КоллекцияПолей = КоллекцияДопРеквизитов(ОбъектМетаданных.ПолноеИмя()); + Если КоллекцияПолей <> Неопределено Тогда + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); + ИсточникДоступныхПолей.ИсточникДанных = ИсточникДанных; + ИсточникДоступныхПолей.КоллекцияПолей = КоллекцияПолей; + + Результат.Добавить(ИсточникДоступныхПолей); + КонецЕсли; + + КоллекцияПолей = КоллекцияПолейКонтактнойИнформации(ОбъектМетаданных.ПолноеИмя()); + Если КоллекцияПолей <> Неопределено Тогда + ИсточникДоступныхПолей = ИсточникиДоступныхПолей.Добавить(); + ИсточникДоступныхПолей.ИсточникДанных = ИсточникДанных; + ИсточникДоступныхПолей.КоллекцияПолей = КоллекцияПолей; + + Результат.Добавить(ИсточникДоступныхПолей); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция СтрокаСоответствуетШаблону(Знач Строка, Знач Шаблон) + + Если Не ЗначениеЗаполнено(Шаблон) Тогда + Возврат Ложь; + КонецЕсли; + + Строка = СтрСоединить(СтрРазделить(Строка, " " + Символы.ПС + Символы.ВК + Символы.Таб, Ложь), " "); + СтрокаСоответствуетШаблону = Истина; + + Для Каждого ЧастиШаблона Из СтрРазделить(Шаблон, "*", Ложь) Цикл + ФрагментДляПоиска = СтрСоединить(СтрРазделить(ЧастиШаблона, " " + Символы.ПС + Символы.ВК + Символы.Таб, Ложь), " "); + + Позиция = СтрНайти(Строка, ФрагментДляПоиска); + Если Позиция = 0 Тогда + СтрокаСоответствуетШаблону = Ложь; + Прервать; + КонецЕсли; + + Строка = Сред(Строка, Позиция + СтрДлина(ФрагментДляПоиска)); + КонецЦикла; + + Возврат СтрокаСоответствуетШаблону; + +КонецФункции + +Функция КомпоновщикНастроекОбъекта(ОбъектМетаданных) + + СхемаКомпоновкиДанных = Неопределено; + + Если ТипЗнч(ОбъектМетаданных) = Тип("Строка") Тогда + СхемаКомпоновкиДанных = ПолучитьОбщийМакет("ДанныеПечати" + ОбъектМетаданных); + Иначе + ЕстьДанныеПечати = ОбъектМетаданных.Макеты.Найти("ДанныеПечати") <> Неопределено; + Если ЕстьДанныеПечати Тогда + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + СхемаКомпоновкиДанных = МенеджерОбъекта.ПолучитьМакет("ДанныеПечати"); + Иначе + ТекстЗапроса = ТекстЗапроса(ОбъектМетаданных.ПолноеИмя()); + СхемаКомпоновкиДанных = СхемаКомпоновкиДанных(ТекстЗапроса); + КонецЕсли; + КонецЕсли; + + ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных); + + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек); + КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); + + Возврат КомпоновщикНастроек; + +КонецФункции + +Функция СхемаКомпоновкиДанных(ТекстЗапроса) + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; + НаборДанных.Запрос = ТекстЗапроса; + НаборДанных.Имя = "НаборДанных1"; + + Возврат СхемаКомпоновкиДанных; + +КонецФункции + +Функция ТекстЗапроса(ТипыИзменяемыхОбъектов, ОграничитьВыборку = Ложь) + + ОбъектыМетаданных = Новый Массив; + Для Каждого ИмяОбъекта Из СтрРазделить(ТипыИзменяемыхОбъектов, ",", Ложь) Цикл + ОбъектыМетаданных.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъекта)); + КонецЦикла; + + СтруктураОбъектов = ОбщиеРеквизитыОбъектов(ТипыИзменяемыхОбъектов); + + Результат = ""; + ПсевдонимТаблицы = "ПсевдонимЗаданнойТаблицы"; + Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл + + Если Не ПустаяСтрока(Результат) Тогда + Результат = Результат + Символы.ПС + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС + Символы.ПС; + КонецЕсли; + + ТекстЗапроса = ""; + + Для Каждого ИмяРеквизита Из СтруктураОбъектов.Реквизиты Цикл + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + ПсевдонимТаблицы + "." + ИмяРеквизита + " КАК " + ИмяРеквизита; + КонецЦикла; + + Для Каждого ТабличнаяЧасть Из СтруктураОбъектов.ТабличныеЧасти Цикл + ИмяТабличнойЧасти = ТабличнаяЧасть.Ключ; + ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС + ПсевдонимТаблицы + "." + ИмяТабличнойЧасти + ".("; + + СтрокаРеквизитов = "НомерСтроки"; + РеквизитыТабличнойЧасти = ТабличнаяЧасть.Значение; + Для Каждого ИмяРеквизита Из РеквизитыТабличнойЧасти Цикл + Если Не ПустаяСтрока(СтрокаРеквизитов) Тогда + СтрокаРеквизитов = СтрокаРеквизитов + "," + Символы.ПС; + КонецЕсли; + СтрокаРеквизитов = СтрокаРеквизитов + ИмяРеквизита; + КонецЦикла; + ТекстЗапроса = ТекстЗапроса + СтрокаРеквизитов +" + |)"; + КонецЦикла; + + ТекстЗапроса = "ВЫБРАТЬ " + ?(ОграничитьВыборку, "ПЕРВЫЕ 1001 ", "") //@query-part + + ТекстЗапроса + Символы.ПС + " + |ИЗ + | "+ ОбъектМетаданных.ПолноеИмя() + " КАК " + ПсевдонимТаблицы; + + Результат = Результат + ТекстЗапроса; + КонецЦикла; + + + Возврат Результат; + +КонецФункции + +Функция ОбщиеРеквизитыОбъектов(ТипыОбъектов) Экспорт + + ОбъектыМетаданных = Новый Массив; + Для Каждого ИмяОбъекта Из СтрРазделить(ТипыОбъектов, ",", Ложь) Цикл + ОбъектыМетаданных.Добавить(Метаданные.НайтиПоПолномуИмени(ИмяОбъекта)); + КонецЦикла; + + Результат = Новый Структура; + Результат.Вставить("Реквизиты", Новый Массив); + Результат.Вставить("ТабличныеЧасти", Новый Структура); + + Если ОбъектыМетаданных.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + ОбщийСписокРеквизитов = СписокЭлементов(ОбъектыМетаданных[0].Реквизиты, Ложь); + Для Индекс = 1 По ОбъектыМетаданных.Количество() - 1 Цикл + ОбщийСписокРеквизитов = ПересечениеРеквизитов(ОбщийСписокРеквизитов, ОбъектыМетаданных[Индекс].Реквизиты); + КонецЦикла; + + СтандартныеРеквизиты = ОбъектыМетаданных[0].СтандартныеРеквизиты; + Для Индекс = 1 По ОбъектыМетаданных.Количество() - 1 Цикл + СтандартныеРеквизиты = ПересечениеРеквизитов(СтандартныеРеквизиты, ОбъектыМетаданных[Индекс].СтандартныеРеквизиты); + КонецЦикла; + Для Каждого Реквизит Из СтандартныеРеквизиты Цикл + ОбщийСписокРеквизитов.Добавить(Реквизит); + КонецЦикла; + + Результат.Реквизиты = СписокЭлементов(ОбщийСписокРеквизитов); + + ТабличныеЧасти = СписокЭлементов(ОбъектыМетаданных[0].ТабличныеЧасти); + Для Индекс = 1 По ОбъектыМетаданных.Количество() - 1 Цикл + ТабличныеЧасти = ПересечениеМножеств(ТабличныеЧасти, СписокЭлементов(ОбъектыМетаданных[Индекс].ТабличныеЧасти)); + КонецЦикла; + + Для Каждого ИмяТабличнойЧасти Из ТабличныеЧасти Цикл + РеквизитыТабличнойЧасти = СписокЭлементов(ОбъектыМетаданных[0].ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты, Ложь); + Для Индекс = 1 По ОбъектыМетаданных.Количество() - 1 Цикл + РеквизитыТабличнойЧасти = ПересечениеРеквизитов(РеквизитыТабличнойЧасти, ОбъектыМетаданных[Индекс].ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты); + КонецЦикла; + Если РеквизитыТабличнойЧасти.Количество() > 0 Тогда + Результат.ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, СписокЭлементов(РеквизитыТабличнойЧасти)); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПересечениеМножеств(Множество1, Множество2) Экспорт + + Результат = Новый Массив; + + Для Каждого Элемент Из Множество2 Цикл + Индекс = Множество1.Найти(Элемент); + Если Индекс <> Неопределено Тогда + Результат.Добавить(Элемент); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПересечениеРеквизитов(КоллекцияРеквизитов1, КоллекцияРеквизитов2) + + Результат = Новый Массив; + + Для Каждого Реквизит2 Из КоллекцияРеквизитов2 Цикл + Для Каждого Реквизит1 Из КоллекцияРеквизитов1 Цикл + Если Реквизит1.Имя = Реквизит2.Имя + И (Реквизит1.Тип = Реквизит2.Тип Или Реквизит1.Имя = "Ссылка") Тогда + Результат.Добавить(Реквизит1); + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Параметры: +// Коллекция - Массив из ОбъектМетаданныхРеквизит +// - Массив из ОбъектМетаданныхТабличнаяЧасть +// ТолькоИмена - Булево +// Возвращаемое значение: +// Массив +// +Функция СписокЭлементов(Коллекция, ТолькоИмена = Истина) + Результат = Новый Массив; + Для Каждого Элемент Из Коллекция Цикл + Если ТолькоИмена Тогда + Результат.Добавить(Элемент.Имя); + Иначе + Результат.Добавить(Элемент); + КонецЕсли; + КонецЦикла; + Возврат Результат; +КонецФункции + +Процедура ЗаполнитьСписокДоступныхПолей(Форма, ПараметрыЗаполнения) Экспорт + + ИдентификаторСтроки = ПараметрыЗаполнения.ИдентификаторСтроки; + ИмяСписка = ПараметрыЗаполнения.ИмяСписка; + + РазвернутьРеквизит(ИдентификаторСтроки, ИмяСписка, Форма); + +КонецПроцедуры + +Функция СписокИсточниковДоступныхПолей(Форма, ИмяСпискаПолей) + + ИмяСпискаИсточников = КонструкторФормулКлиентСервер.НастройкиСпискаПолей(Форма, ИмяСпискаПолей).ИмяСпискаИсточников; + Возврат Форма[ИмяСпискаИсточников]; + +КонецФункции + +Функция СписокСвойствДляВидаОбъектов(ВидОбъектов) + Результат = Новый Массив; + + ВидыСвойств = Новый Массив; + ВидыСвойств.Добавить("ДополнительныеРеквизиты"); + ВидыСвойств.Добавить("ДополнительныеСведения"); + + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + Если МодульУправлениеСвойствамиСлужебный <> Неопределено Тогда + Для Каждого ВидСвойства Из ВидыСвойств Цикл + СписокСвойств = МодульУправлениеСвойствамиСлужебный.СписокСвойствДляВидаОбъектов(ВидОбъектов, ВидСвойства); + Если СписокСвойств <> Неопределено Тогда + Для Каждого Элемент Из СписокСвойств Цикл + Результат.Добавить(Элемент.Свойство); + КонецЦикла; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция КоллекцияДопРеквизитов(ИмяОбъектаМетаданных) + + СписокСвойств = СписокСвойствДляВидаОбъектов(ИмяОбъектаМетаданных); + Если Не ЗначениеЗаполнено(СписокСвойств) Тогда + Возврат Неопределено; + КонецЕсли; + + ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(СписокСвойств, "Заголовок,ИдентификаторДляФормул,ТипЗначения"); + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.Имя = "НаборДанных1"; + + Для Каждого Элемент Из ЗначенияРеквизитов Цикл + Свойство = Элемент.Значение; + Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); + Поле.Поле = Свойство.ИдентификаторДляФормул; + Поле.ПутьКДанным = Свойство.ИдентификаторДляФормул; + Если ЗначениеЗаполнено(Свойство.Заголовок) Тогда + Поле.Заголовок = Свойство.Заголовок; + КонецЕсли; + Поле.ТипЗначения = Свойство.ТипЗначения; + КонецЦикла; + + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных); + ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы); + + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек); + КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); + + Возврат КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора; + +КонецФункции + +Функция КоллекцияПолейКонтактнойИнформации(ИмяОбъектаМетаданных) + + ВидыКонтактнойИнформации = Неопределено; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + ВидыКонтактнойИнформации = МодульУправлениеКонтактнойИнформацией.ВидыКонтактнойИнформацииОбъекта( + ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъектаМетаданных).ПустаяСсылка()); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ВидыКонтактнойИнформации) Тогда + Возврат Неопределено; + КонецЕсли; + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.Имя = "НаборДанных1"; + + Для Каждого ВидКонтактнойИнформации Из ВидыКонтактнойИнформации Цикл + Если Не ЗначениеЗаполнено(ВидКонтактнойИнформации.ИдентификаторДляФормул) Тогда + Продолжить; + КонецЕсли; + Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); + Поле.Поле = ВидКонтактнойИнформации.ИдентификаторДляФормул; + Поле.ПутьКДанным = ВидКонтактнойИнформации.ИдентификаторДляФормул; + Если ЗначениеЗаполнено(ВидКонтактнойИнформации.Наименование) Тогда + Поле.Заголовок = ВидКонтактнойИнформации.Наименование; + КонецЕсли; + Поле.ТипЗначения = Новый ОписаниеТипов("Строка"); + КонецЦикла; + + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных); + ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы); + + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек); + КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); + + Возврат КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора; + +КонецФункции + +Процедура ВыполнитьПоискВСпискеПолей(Форма) Экспорт + + Для Каждого Элемент Из Форма.ПодключенныеСпискиПолей Цикл + ИмяСпискаПолей = Элемент.ИмяСпискаПолей; + ИмяРеквизитаСтрокиПоиска = ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей); + Отбор = Форма[ИмяРеквизитаСтрокиПоиска]; + ОтборУстановлен = ЗначениеЗаполнено(Отбор); + Если ЗначениеЗаполнено(Отбор) Тогда + УстановитьОтбор(Форма, ИмяСпискаПолей, Отбор, Форма[ИмяСпискаПолей]); + КонецЕсли; + Форма.Элементы[ИмяСпискаПолей + "Представление"].Видимость = НЕ ОтборУстановлен; + Форма.Элементы[ИмяСпискаПолей + "ПредставлениеПутиКДанным"].Видимость = ОтборУстановлен; + Форма.Элементы[ИмяСпискаПолей].Отображение = ?(ОтборУстановлен, ОтображениеТаблицы.Список, ОтображениеТаблицы.Дерево); + КонецЦикла; + +КонецПроцедуры + +Функция УстановитьОтбор(Знач Форма, Знач ИмяСписка, Знач Отбор, + Знач КоллекцияРеквизитов = Неопределено, Знач Уровень = 0) + + Уровень = Уровень + 1; + ЕстьРеквизитыСоответствующиеОтбору = Ложь; + Для Каждого Реквизит Из КоллекцияРеквизитов.ПолучитьЭлементы() Цикл + Если РодительскийРеквизитСоответствуетОтбору(Реквизит) Тогда + Реквизит.СоответствуетОтбору = Ложь; + Иначе + ФорматированнаяСтрока = НайтиТекстВСтроке(Реквизит.ПредставлениеПутиКДанным, Отбор); + Реквизит.СоответствуетОтбору = ФорматированнаяСтрока <> Неопределено; + Если Реквизит.СоответствуетОтбору Тогда + Реквизит.ПредставлениеПутиКДанным = ФорматированнаяСтрока; + КонецЕсли; + КонецЕсли; + Если Не Реквизит.СоответствуетОтбору И Уровень < 3 Тогда + РазвернутьРеквизит(Реквизит.ПолучитьИдентификатор(), ИмяСписка, Форма); + КонецЕсли; + Реквизит.ПодчиненныйЭлементСоответствуетОтбору = УстановитьОтбор(Форма, ИмяСписка, Отбор, Реквизит, Уровень); + ЕстьРеквизитыСоответствующиеОтбору = ЕстьРеквизитыСоответствующиеОтбору Или Реквизит.СоответствуетОтбору + Или Реквизит.ПодчиненныйЭлементСоответствуетОтбору; + КонецЦикла; + + Возврат ЕстьРеквизитыСоответствующиеОтбору; + +КонецФункции + +Функция РодительскийРеквизитСоответствуетОтбору(Реквизит) + + Родитель = Реквизит.ПолучитьРодителя(); + Если Родитель <> Неопределено Тогда + Возврат Родитель.СоответствуетОтбору Или РодительскийРеквизитСоответствуетОтбору(Родитель); + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Процедура РазвернутьРеквизит(ИдентификаторСтроки, ИмяСписка, Форма) + + Отбор = Форма[ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСписка)]; + ТекущиеДанные = Форма[ИмяСписка].НайтиПоИдентификатору(ИдентификаторСтроки); + КоллекцияРеквизитов = ТекущиеДанные.ПолучитьЭлементы(); + + НастройкиСписка = КонструкторФормулКлиентСервер.НастройкиСпискаПолей(Форма, ИмяСписка); + ИспользоватьИдентификаторыДляФормул = НастройкиСписка.ИспользоватьИдентификаторыДляФормул; + + Если КоллекцияРеквизитов.Количество() = 0 Или КоллекцияРеквизитов[0].Поле <> Неопределено Тогда + Возврат; + КонецЕсли; + + КоллекцияРеквизитов.Очистить(); + ИсточникиДоступныхПолей = СписокИсточниковДоступныхПолей(Форма, ИмяСписка); + ЗаполнитьСписокДоступныхРеквизитов(ТекущиеДанные, ИсточникиДоступныхПолей, Отбор, ИспользоватьИдентификаторыДляФормул); + +КонецПроцедуры + +Процедура РазвернутьПоле(ТекущиеДанные, ИсточникиДоступныхПолей, НастройкиСписка) + + КоллекцияРеквизитов = ПодчиненныеЭлементы(ТекущиеДанные); + ИспользоватьИдентификаторыДляФормул = НастройкиСписка.ИспользоватьИдентификаторыДляФормул; + + Если КоллекцияРеквизитов.Количество() = 0 Или КоллекцияРеквизитов[0].Поле <> Неопределено Тогда + Возврат; + КонецЕсли; + КоллекцияРеквизитов.Очистить(); + + ЗаполнитьСписокДоступныхРеквизитов(ТекущиеДанные, ИсточникиДоступныхПолей, "", ИспользоватьИдентификаторыДляФормул); + +КонецПроцедуры + +Процедура УстановитьУсловноеОформление(Форма, ИмяСпискаПолей) + + УсловноеОформление = Форма.УсловноеОформление; + + // + + ЭлементОформления = УсловноеОформление.Элементы.Добавить(); + + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей + "Картинка"); + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей + "Представление"); + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей + "ПредставлениеПутиКДанным"); + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей + ".СоответствуетОтбору"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Ложь; + + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь); + + // + + + ЭлементОформления = УсловноеОформление.Элементы.Добавить(); + + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей + "Картинка"); + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей + "Представление"); + ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей + "ПредставлениеПутиКДанным"); + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей)); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; + + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Истина); + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Отображать", Истина); + + +КонецПроцедуры + +Функция НайтиТекстВСтроке(Знач Строка, Знач Текст) + + СтрокаПоиска = Строка; + + ФорматированныеСтроки = Новый Массив; + Для Каждого Подстрока Из СтрРазделить(Текст, " ", Ложь) Цикл + Позиция = СтрНайти(НРег(СтрокаПоиска), НРег(Подстрока)); + Если Позиция = 0 Тогда + ФорматированныеСтроки = Неопределено; + Прервать; + КонецЕсли; + + ПодстрокаДоВхождения = Лев(СтрокаПоиска, Позиция - 1); + ПодстрокаВхождения = Сред(СтрокаПоиска, Позиция, СтрДлина(Подстрока)); + СтрокаПоиска = Сред(СтрокаПоиска, Позиция + СтрДлина(Подстрока)); + + ФорматированныеСтроки.Добавить(ПодстрокаДоВхождения); + ФорматированныеСтроки.Добавить(Новый ФорматированнаяСтрока(ПодстрокаВхождения, + Новый Шрифт( , , Истина), Новый Цвет(0,128,0))); + КонецЦикла; + + Если Не ЗначениеЗаполнено(ФорматированныеСтроки) Тогда + Возврат Неопределено; + КонецЕсли; + + ФорматированныеСтроки.Добавить(СтрокаПоиска); + СтрокаСПодсветкой = Новый ФорматированнаяСтрока(ФорматированныеСтроки); // АПК:1356 - можно использовать составную форматированную строку, так как массив строк формируется из переданного в функцию текста. + + Возврат СтрокаСПодсветкой; + +КонецФункции + +Функция СхемаКомпоновкиДанныхИзТаблицыЗначений(ТаблицаЗначений) + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.Имя = "НаборДанных1"; + + Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл + Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); + Поле.Поле = СтрокаТаблицы.Идентификатор; + Поле.ПутьКДанным = СтрокаТаблицы.Идентификатор; + Если ЗначениеЗаполнено(СтрокаТаблицы.Представление) Тогда + Поле.Заголовок = СтрокаТаблицы.Представление; + КонецЕсли; + Поле.ТипЗначения = СтрокаТаблицы.ТипЗначения; + + ДополнительныеПараметры = Новый Структура("ИмяКартинки,Порядок"); + ЗаполнитьЗначенияСвойств(ДополнительныеПараметры, СтрокаТаблицы); + Поле.ПараметрыРедактирования.УстановитьЗначениеПараметра("Маска", ЗначениеВJSON(ДополнительныеПараметры)); + КонецЦикла; + + Возврат СхемаКомпоновкиДанных; + +КонецФункции + +Функция СхемаКомпоновкиДанныхИзДереваЗначений(ДеревоЗначений) + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.Имя = "НаборДанных1"; + + ДобавитьГруппуЭлементовВНаборДанных(ДеревоЗначений, НаборДанных); + + Возврат СхемаКомпоновкиДанных; + +КонецФункции + +Процедура ДобавитьГруппуЭлементовВНаборДанных(КоллекцияЭлементов, НаборДанных, Родитель = Неопределено) + + Для Каждого Элемент Из КоллекцияЭлементов.Строки Цикл + ЭтоГруппа = Элемент.Строки.Количество() > 0 И Не ЗначениеЗаполнено(Элемент.ТипЗначения); + + Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); + Поле.Поле = Элемент.Идентификатор; + Поле.ТипЗначения = Элемент.ТипЗначения; + + ДополнительныеПараметры = Новый Структура("ИмяКартинки,Порядок,ЭтоГруппа"); + ЗаполнитьЗначенияСвойств(ДополнительныеПараметры, Элемент); + ДополнительныеПараметры.ЭтоГруппа = ЭтоГруппа; + Поле.ПараметрыРедактирования.УстановитьЗначениеПараметра("Маска", ЗначениеВJSON(ДополнительныеПараметры)); + + Поле.ПутьКДанным = Элемент.Идентификатор; + Если Родитель <> Неопределено Тогда + Поле.ПутьКДанным = Родитель.ПутьКДанным + "." + Поле.ПутьКДанным; + КонецЕсли; + + Если ЗначениеЗаполнено(Элемент.Представление) Тогда + Поле.Заголовок = Элемент.Представление; + КонецЕсли; + + ДобавитьГруппуЭлементовВНаборДанных(Элемент, НаборДанных, Поле); + КонецЦикла; + +КонецПроцедуры + +#Область ЧтениеФормулы + +Функция ФормулаИзПредставления(Форма, ПредставлениеФормулы) Экспорт + + ЭлементыФормулы = КонструкторФормулКлиентСервер.ЭлементыФормулы(ПредставлениеФормулы); + Выражение = ПредставлениеФормулы; + + Для Каждого Элемент Из Форма.ПодключенныеСпискиПолей Цикл + ИмяСпискаПолей = Элемент.ИмяСпискаПолей; + КоллекцияПолей = Форма[ИмяСпискаПолей]; + СкобкиИдентификаторов = Элемент.СкобкиИдентификаторов; + + Для Каждого ПредставлениеОперанда Из ЭлементыФормулы.Операнды Цикл + ПутьКДанным = ОчиститьКвадратныеСкобки(ПредставлениеОперанда); + Реквизит = НайтиРеквизит(Форма, ИмяСпискаПолей, ПутьКДанным, КоллекцияПолей.ПолучитьЭлементы(), Истина); + Если Реквизит <> Неопределено Тогда + Операнд = ОчиститьКвадратныеСкобки(Реквизит.ПутьКДанным); + Если СкобкиИдентификаторов Тогда + Операнд = ОбернутьВКвадратныеСкобки(Операнд); + КонецЕсли; + Выражение = СтрЗаменить(Выражение, ПредставлениеОперанда, Операнд); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Выражение; + +КонецФункции + +Функция ПредставлениеФормулы(Форма, Формула) Экспорт + + ЭлементыФормулы = КонструкторФормулКлиентСервер.ЭлементыФормулы(Формула); + Выражение = Формула; + + Для Каждого Элемент Из Форма.ПодключенныеСпискиПолей Цикл + ИмяСпискаПолей = Элемент.ИмяСпискаПолей; + КоллекцияПолей = Форма[ИмяСпискаПолей]; + СкобкиПредставлений = Элемент.СкобкиПредставлений; + + Для Каждого Операнд Из ЭлементыФормулы.Операнды Цикл + ПутьКДанным = ОчиститьКвадратныеСкобки(Операнд); + Реквизит = НайтиРеквизит(Форма, ИмяСпискаПолей, ПутьКДанным, КоллекцияПолей.ПолучитьЭлементы(), Ложь); + Если Реквизит <> Неопределено Тогда + ПредставлениеОперанда = Реквизит.ПредставлениеПутиКДанным; + Если СкобкиПредставлений Тогда + ПредставлениеОперанда = ОбернутьВКвадратныеСкобки(Реквизит.ПредставлениеПутиКДанным); + КонецЕсли; + Выражение = СтрЗаменить(Выражение, Операнд, ПредставлениеОперанда); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Выражение; + +КонецФункции + +Функция ПредставлениеВыражения(Знач Выражение, СпискиПолей) Экспорт + + ЭлементыФормулы = КонструкторФормулКлиентСервер.ЭлементыФормулы(Выражение); + Результат = Выражение; + + Для Каждого НастройкиСписка Из СпискиПолей Цикл + КоллекцияПолей = НастройкиСписка.КоллекцияПолей; + ИсточникиДоступныхПолей = НастройкиСписка.ИсточникиДоступныхПолей; + ИспользоватьИдентификаторыДляФормул = НастройкиСписка.ИспользоватьИдентификаторыДляФормул; + Если КоллекцияПолей = Неопределено Тогда + КоллекцияПолей = НоваяКоллекцияПолей(); + ЗаполнитьСписокДоступныхРеквизитов(КоллекцияПолей, ИсточникиДоступныхПолей, , ИспользоватьИдентификаторыДляФормул); + КонецЕсли; + + Для Каждого Операнд Из ЭлементыФормулы.Операнды Цикл + ПутьКДанным = ОчиститьКвадратныеСкобки(Операнд); + Реквизит = НайтиПоле(ПутьКДанным, ПодчиненныеЭлементы(КоллекцияПолей), Ложь, ИсточникиДоступныхПолей, НастройкиСписка); + Если Реквизит <> Неопределено Тогда + ПредставлениеОперанда = Реквизит.ПредставлениеПутиКДанным; + Если НастройкиСписка.СкобкиПредставлений Тогда + ПредставлениеОперанда = ОбернутьВКвадратныеСкобки(Реквизит.ПредставлениеПутиКДанным); + КонецЕсли; + Результат = СтрЗаменить(Результат, Операнд, ПредставлениеОперанда); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ВыражениеДляПроверки(Форма, ПредставлениеФормулы, ИмяСпискаОперандов) Экспорт + + ЭлементыФормулы = КонструкторФормулКлиентСервер.ЭлементыФормулы(ПредставлениеФормулы); + Выражение = ПредставлениеФормулы; + + Для Каждого Элемент Из Форма.ПодключенныеСпискиПолей Цикл + ИмяСпискаПолей = Элемент.ИмяСпискаПолей; + КоллекцияПолей = Форма[ИмяСпискаПолей]; + СкобкиИдентификаторов = Элемент.СкобкиИдентификаторов; + + Для Каждого ПредставлениеОперанда Из ЭлементыФормулы.Операнды Цикл + ПутьКДанным = ОчиститьКвадратныеСкобки(ПредставлениеОперанда); + Реквизит = НайтиРеквизит(Форма, ИмяСпискаПолей, ПутьКДанным, КоллекцияПолей.ПолучитьЭлементы(), Истина); + Если Реквизит <> Неопределено Тогда + Если ИмяСпискаОперандов = ИмяСпискаПолей Тогда + Операнд = Реквизит.Тип.ПривестиЗначение(1); + Если ТипЗнч(Операнд) = Тип("Строка") Тогда + Операнд = """" + Операнд + """"; + КонецЕсли; + Если ТипЗнч(Операнд) = Тип("Булево") Тогда + Операнд = Формат(Операнд, "БЛ=Ложь; БИ=Истина"); // Должно быть на языке конфигурации. + КонецЕсли; + Если ТипЗнч(Операнд) = Тип("Дата") Тогда + Операнд = "'" + Формат(ТекущаяДатаСеанса(), "ДФ=ггггММддЧЧмм") + "'"; // Для использования в выражении Вычислить(). + КонецЕсли; + Иначе + Операнд = ОчиститьКвадратныеСкобки(Реквизит.ПутьКДанным); + Если СкобкиИдентификаторов Тогда + Операнд = ОбернутьВКвадратныеСкобки(Операнд); + КонецЕсли; + КонецЕсли; + Выражение = СтрЗаменить(Выражение, ПредставлениеОперанда, Операнд); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Выражение; + +КонецФункции + +Функция ОчиститьКвадратныеСкобки(Строка) + + Возврат СокрЛП(СтрСоединить(СтрРазделить(Строка, "[]", Ложь), "")); + +КонецФункции + +Функция ОбернутьВКвадратныеСкобки(Строка) + + Возврат "[" + Строка + "]"; + +КонецФункции + +Функция НайтиРеквизит(Форма, ИмяСписка, ПутьКДанным, КоллекцияРеквизитов, ИскатьПоПредставлению) + + ИмяПоляПоиска = "ПутьКДанным"; + Если ИскатьПоПредставлению Тогда + ИмяПоляПоиска = "ПредставлениеПутиКДанным"; + КонецЕсли; + + Владелец = Неопределено; + Папки = Новый Массив; + + Для Каждого Реквизит Из КоллекцияРеквизитов Цикл + Если НРег(Реквизит[ИмяПоляПоиска]) = НРег(ПутьКДанным) Тогда + Возврат Реквизит; + КонецЕсли; + Если Реквизит.Папка Тогда + Папки.Добавить(Реквизит); + Иначе + Если СтрНачинаетсяС(НРег(ПутьКДанным), НРег(Реквизит[ИмяПоляПоиска]) + ".") Тогда + Владелец = Реквизит; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если Владелец <> Неопределено Тогда + РазвернутьРеквизит(Владелец.ПолучитьИдентификатор(), ИмяСписка, Форма); + Возврат НайтиРеквизит(Форма, ИмяСписка, ПутьКДанным, Владелец.ПолучитьЭлементы(), ИскатьПоПредставлению); + КонецЕсли; + + Для Каждого Папка Из Папки Цикл + РазвернутьРеквизит(Папка.ПолучитьИдентификатор(), ИмяСписка, Форма); + Реквизит = НайтиРеквизит(Форма, ИмяСписка, ПутьКДанным, Папка.ПолучитьЭлементы(), ИскатьПоПредставлению); + + Если Реквизит <> Неопределено Тогда + Возврат Реквизит; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Функция НайтиПоле(ПутьКДанным, КоллекцияРеквизитов, ИскатьПоПредставлению, ИсточникиДоступныхПолей, НастройкиСписка) + + ИмяПоляПоиска = "ПутьКДанным"; + Если ИскатьПоПредставлению Тогда + ИмяПоляПоиска = "ПредставлениеПутиКДанным"; + КонецЕсли; + + Владелец = Неопределено; + Папки = Новый Массив; + + Для Каждого Реквизит Из КоллекцияРеквизитов Цикл + Если НРег(Реквизит[ИмяПоляПоиска]) = НРег(ПутьКДанным) Тогда + Возврат Реквизит; + КонецЕсли; + Если Реквизит.Папка Тогда + Папки.Добавить(Реквизит); + Иначе + Если СтрНачинаетсяС(НРег(ПутьКДанным), НРег(Реквизит[ИмяПоляПоиска]) + ".") Тогда + Владелец = Реквизит; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если Владелец <> Неопределено Тогда + РазвернутьПоле(Владелец, ИсточникиДоступныхПолей, НастройкиСписка); + Возврат НайтиПоле(ПутьКДанным, ПодчиненныеЭлементы(Владелец), ИскатьПоПредставлению, ИсточникиДоступныхПолей, НастройкиСписка); + КонецЕсли; + + Для Каждого Папка Из Папки Цикл + РазвернутьПоле(Папка, ИсточникиДоступныхПолей, НастройкиСписка); + Реквизит = НайтиПоле(ПутьКДанным, ПодчиненныеЭлементы(Папка), ИскатьПоПредставлению, ИсточникиДоступныхПолей, НастройкиСписка); + + Если Реквизит <> Неопределено Тогда + Возврат Реквизит; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +#КонецОбласти + +Функция РеквизитыПодключаемогоСписка() + + Результат = Новый Структура; + + Результат.Вставить("Имя", Новый ОписаниеТипов("Строка")); + Результат.Вставить("Заголовок", Новый ОписаниеТипов("Строка")); + Результат.Вставить("Поле", Новый ОписаниеТипов()); + Результат.Вставить("ПутьКДанным", Новый ОписаниеТипов("Строка")); + Результат.Вставить("ПредставлениеПутиКДанным", Новый ОписаниеТипов); + Результат.Вставить("Тип", Новый ОписаниеТипов("ОписаниеТипов")); + Результат.Вставить("Картинка", Новый ОписаниеТипов("Картинка")); + Результат.Вставить("Папка", Новый ОписаниеТипов("Булево")); + Результат.Вставить("Таблица", Новый ОписаниеТипов("Булево")); + Результат.Вставить("СвойНаборПолей", Новый ОписаниеТипов("Булево")); + Результат.Вставить("Отступ", Новый ОписаниеТипов("Строка")); + Результат.Вставить("СоответствуетОтбору", Новый ОписаниеТипов("Булево")); + Результат.Вставить("ПодчиненныйЭлементСоответствуетОтбору", Новый ОписаниеТипов("Булево")); + + Возврат Результат; + +КонецФункции + +Функция НоваяКоллекцияПолей() + + Результат = Новый ДеревоЗначений(); + Для Каждого ОписаниеРеквизита Из РеквизитыПодключаемогоСписка() Цикл + ИмяРеквизита = ОписаниеРеквизита.Ключ; + ТипРеквизита = ОписаниеРеквизита.Значение; + Результат.Колонки.Добавить(ИмяРеквизита, ТипРеквизита); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция НоваяКоллекцияИсточниковДоступныхПолей() + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("ИсточникДанных", Новый ОписаниеТипов("Строка")); + Результат.Колонки.Добавить("КоллекцияПолей"); + Результат.Колонки.Добавить("Замещать", Новый ОписаниеТипов("Булево")); + + Возврат Результат; + +КонецФункции + +Функция ЗначениеВJSON(Значение) + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(); + ЗаписатьJSON(ЗаписьJSON, Значение); + + Возврат ЗаписьJSON.Закрыть(); + +КонецФункции + +Функция JSONВЗначение(Строка, ИменаСвойствСоЗначениямиДата = Неопределено) + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Строка); + Возврат ПрочитатьJSON(ЧтениеJSON, Истина, ИменаСвойствСоЗначениямиДата); +КонецФункции + +Функция КартинкаТипа(ОписаниеТипов) + + Картинка = БиблиотекаКартинок.ТипНеопределено; + Если ОписаниеТипов.Типы().Количество() = 1 Тогда + Тип = ОписаниеТипов.Типы()[0]; + Если Тип = Тип("Число") Тогда + Картинка = БиблиотекаКартинок.ТипЧисло; + ИначеЕсли Тип = Тип("Дата") Тогда + Картинка = БиблиотекаКартинок.ТипДата; + ИначеЕсли Тип = Тип("Булево") Тогда + Картинка = БиблиотекаКартинок.ТипБулево; + ИначеЕсли Тип = Тип("Строка") Тогда + Картинка = БиблиотекаКартинок.ТипСтрока; + ИначеЕсли ОбщегоНазначения.ЭтоСсылка(Тип) Тогда + Картинка = БиблиотекаКартинок.ТипСсылка; + ИначеЕсли Тип = Тип("УникальныйИдентификатор") Тогда + Картинка = БиблиотекаКартинок.ТипИдентификатор; + КонецЕсли; + ИначеЕсли ОписаниеТипов.Типы().Количество() > 1 Тогда + Картинка = БиблиотекаКартинок.ТипСоставнойОсновной; + КонецЕсли; + + Возврат Картинка; + +КонецФункции + +Функция СписокОператоров(ГруппыОператоров = Неопределено) Экспорт + + СписокОператоров = ДеревоПолей(); + + Если ГруппыОператоров = Неопределено Тогда + ГруппыОператоров = "Разделители, Операторы, ЛогическиеОператорыИКонстанты, + |ЧисловыеФункции, СтроковыеФункции, ПрочиеФункции"; + КонецЕсли; + + Для Каждого Элемент Из Новый Структура(ГруппыОператоров) Цикл + ИмяГруппы = Элемент.Ключ; + Если ИмяГруппы = "Разделители" Тогда + ДобавитьГруппуОператоровРазделители(СписокОператоров); + ИначеЕсли ИмяГруппы = "Операторы" Тогда + ДобавитьГруппуОператоровОператоры(СписокОператоров); + ИначеЕсли ИмяГруппы = "ЛогическиеОператорыИКонстанты" Тогда + ДобавитьГруппуОператоровЛогическиеОператорыИКонстанты(СписокОператоров); + ИначеЕсли ИмяГруппы = "ЧисловыеФункции" Тогда + ДобавитьГруппуОператоровЧисловыеФункции(СписокОператоров); + ИначеЕсли ИмяГруппы = "СтроковыеФункции" Тогда + ДобавитьГруппуОператоровСтроковыеФункции(СписокОператоров); + ИначеЕсли ИмяГруппы = "ПрочиеФункции" Тогда + ДобавитьГруппуОператоровПрочиеФункции(СписокОператоров); + КонецЕсли; + КонецЦикла; + + Возврат СписокОператоров; + +КонецФункции + +Процедура ДобавитьГруппуОператоровРазделители(СписокОператоров) + + Группа = СписокОператоров.Строки.Добавить(); + Группа.Идентификатор = "Разделители"; + Группа.Представление = НСтр("ru = 'Разделители'"); + Группа.Порядок = 1; + + Для Каждого Идентификатор Из СтрРазделить("/ | \ _ , . ( ) """, " ", Ложь) Цикл + ДобавитьОператорВГруппу(Группа, Идентификатор, , Новый ОписаниеТипов("Строка")); + КонецЦикла; + + ДобавитьОператорВГруппу(Группа, " ", НСтр("ru = 'Пробел'"), Новый ОписаниеТипов("Строка")); + +КонецПроцедуры + +Процедура ДобавитьГруппуОператоровОператоры(СписокОператоров) + + Группа = СписокОператоров.Строки.Добавить(); + Группа.Идентификатор = "Операторы"; + Группа.Представление = НСтр("ru = 'Операторы'"); + Группа.Порядок = 2; + + Для Каждого Идентификатор Из СтрРазделить("+ - * /", " ", Ложь) Цикл + ДобавитьОператорВГруппу(Группа, Идентификатор, , Новый ОписаниеТипов("Число")); + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьГруппуОператоровЛогическиеОператорыИКонстанты(СписокОператоров) + + Группа = СписокОператоров.Строки.Добавить(); + Группа.Идентификатор = "ЛогическиеОператорыИКонстанты"; + Группа.Представление = НСтр("ru = 'Логические операторы и константы'"); + Группа.Порядок = 3; + + Тип = Новый ОписаниеТипов("Булево"); + + Для Каждого Идентификатор Из СтрРазделить("<,>,<=,>=,=,<>", ",", Ложь) Цикл + ДобавитьОператорВГруппу(Группа, Идентификатор, , Тип); + КонецЦикла; + + ДобавитьОператорВГруппу(Группа, "И", НСтр("ru = 'И'"), Тип); + ДобавитьОператорВГруппу(Группа, "Или", НСтр("ru = 'Или'"), Тип); + ДобавитьОператорВГруппу(Группа, "Не", НСтр("ru = 'Не'"), Тип); + ДобавитьОператорВГруппу(Группа, "Истина", НСтр("ru = 'Истина'"), Тип); + ДобавитьОператорВГруппу(Группа, "Ложь", НСтр("ru = 'Ложь'"), Тип); + +КонецПроцедуры + +Процедура ДобавитьГруппуОператоровЧисловыеФункции(СписокОператоров) + + Группа = СписокОператоров.Строки.Добавить(); + Группа.Идентификатор = "ЧисловыеФункции"; + Группа.Представление = НСтр("ru = 'Числовые функции'"); + Группа.Порядок = 4; + Группа.ИмяКартинки = Метаданные.ОбщиеКартинки.ТипФункция.Имя; + + Тип = Новый ОписаниеТипов("Число"); + + ДобавитьОператорВГруппу(Группа, "Макс", НСтр("ru = 'Максимум'"), Тип); + ДобавитьОператорВГруппу(Группа, "Мин", НСтр("ru = 'Минимум'"), Тип); + ДобавитьОператорВГруппу(Группа, "Окр", НСтр("ru = 'Округлить'"), Тип); + ДобавитьОператорВГруппу(Группа, "Цел", НСтр("ru = 'ЦелаяЧасть'"), Тип); + +КонецПроцедуры + +Процедура ДобавитьГруппуОператоровСтроковыеФункции(СписокОператоров) + + Группа = СписокОператоров.Строки.Добавить(); + Группа.Идентификатор = "СтроковыеФункции"; + Группа.Представление = НСтр("ru = 'Строковые функции'"); + Группа.Порядок = 5; + Группа.ИмяКартинки = Метаданные.ОбщиеКартинки.ТипФункция.Имя; + + Тип = Новый ОписаниеТипов("Строка"); + + ДобавитьОператорВГруппу(Группа, "Строка", НСтр("ru = 'ПреобразоватьВСтроку'"), Тип); + ДобавитьОператорВГруппу(Группа, "ВРег", НСтр("ru = 'ВсеПрописные'"), Тип); + ДобавитьОператорВГруппу(Группа, "НРег", НСтр("ru = 'ВсеСтрочные'"), Тип); + ДобавитьОператорВГруппу(Группа, "ТРег", НСтр("ru = 'КаждоеСловоСПрописной'"), Тип); + ДобавитьОператорВГруппу(Группа, "Лев", НСтр("ru = 'СимволыСлева'"), Тип); + ДобавитьОператорВГруппу(Группа, "Прав", НСтр("ru = 'СимволыСправа'"), Тип); + ДобавитьОператорВГруппу(Группа, "СокрЛ", НСтр("ru = 'УбратьПробелыСлева'"), Тип); + ДобавитьОператорВГруппу(Группа, "СокрЛП", НСтр("ru = 'УбратьПробелыСлеваИСправа'"), Тип); + ДобавитьОператорВГруппу(Группа, "СокрП", НСтр("ru = 'УбратьПробелыСправа'"), Тип); + ДобавитьОператорВГруппу(Группа, "СтрЗаменить", НСтр("ru = 'ЗаменитьСимволыВСтроке'"), Тип); + ДобавитьОператорВГруппу(Группа, "СтрДлина", НСтр("ru = 'ДлинаСтроки'"), Новый ОписаниеТипов("Число")); + +КонецПроцедуры + +Процедура ДобавитьГруппуОператоровПрочиеФункции(СписокОператоров) + + Группа = СписокОператоров.Строки.Добавить(); + Группа.Идентификатор = "ПрочиеФункции"; + Группа.Представление = НСтр("ru = 'Прочие функции'"); + Группа.Порядок = 6; + Группа.ИмяКартинки = Метаданные.ОбщиеКартинки.ТипФункция.Имя; + + ДобавитьОператорВГруппу(Группа, "?", НСтр("ru = 'Условие'"), Новый ОписаниеТипов("Булево")); + ДобавитьОператорВГруппу(Группа, "ПредопределенноеЗначение", НСтр("ru = 'ПредопределенноеЗначение'"), Новый ОписаниеТипов); + ДобавитьОператорВГруппу(Группа, "ЗначениеЗаполнено", НСтр("ru = 'ЗначениеЗаполнено'"), Новый ОписаниеТипов("Булево")); + ДобавитьОператорВГруппу(Группа, "Формат", НСтр("ru = 'Формат'"), Новый ОписаниеТипов("Строка")); + +КонецПроцедуры + +Процедура ДобавитьОператорВГруппу(Группа, Идентификатор, Знач Представление = Неопределено, Тип = Неопределено) + + Если Представление = Неопределено Тогда + Представление = Идентификатор; + КонецЕсли; + + Оператор = Группа.Строки.Добавить(); + Оператор.Идентификатор = Идентификатор; + Оператор.Представление = Представление; + Оператор.ТипЗначения = Тип; + Оператор.ИмяКартинки = Метаданные.ОбщиеКартинки.Пустая.Имя; + +КонецПроцедуры + +Функция ИмяРеквизитаСтрокиПоискаСпискаПолей(ИмяСпискаПолей) + + Возврат "СтрокаПоиска" + ИмяСпискаПолей; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/КонструкторФормулСлужебный/КонструкторФормулСлужебный.mdo b/SSL/src/CommonModules/КонструкторФормулСлужебный/КонструкторФормулСлужебный.mdo new file mode 100644 index 000000000..5ff1c000d --- /dev/null +++ b/SSL/src/CommonModules/КонструкторФормулСлужебный/КонструкторФормулСлужебный.mdo @@ -0,0 +1,11 @@ + + + КонструкторФормулСлужебный + + ru + Конструктор формул служебный + + true + true + true + diff --git a/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl index 310efe5ee..60f80129b 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl @@ -165,7 +165,7 @@ // * Ответственный - СправочникСсылка.Пользователи - заполнен, если по выявленной проблеме // алгоритм проверки определил конкретного ответственного. // * Выявлено - Дата - дата и время выявления проблемы. -// * ДополнительнаяИнформация - ХранилищеЗначений - произвольные дополнительные сведения, связанные +// * ДополнительнаяИнформация - ХранилищеЗначения - произвольные дополнительные сведения, связанные // с выявленной проблемой. // // Пример: @@ -402,7 +402,7 @@ // * УточнениеПроблемы - Строка - строка уточнения проблемы. По умолчанию не заполнена. // * КлючУникальности - УникальныйИдентификатор - ключ уникальности проблемы. // * Выявлено - Дата - момент обнаружения проблемы. -// * ДополнительнаяИнформация - ХранилищеЗначений +// * ДополнительнаяИнформация - ХранилищеЗначения // - Неопределено - произвольные дополнительные сведения, связанные // с выявленной проблемой. По умолчанию Неопределено. // * Ответственный - СправочникСсылка.Пользователи @@ -508,10 +508,10 @@ ГлобальныеНастройки = КонтрольВеденияУчетаСлужебный.ГлобальныеНастройки(); СписокИмен = СтрРазделить(ИменаСписков, ","); - Элементы = Форма.Элементы; + КартинкаЗначений = БиблиотекаКартинок.КоллекцияВажностьПроблемВеденияУчета; Для Каждого ИмяСписка Из СписокИмен Цикл - ТаблицаФормы = Элементы.Найти(СокрЛП(ИмяСписка)); + ТаблицаФормы = Форма.Элементы.Найти(СокрЛП(ИмяСписка)); Если ТаблицаФормы = Неопределено Тогда Продолжить; КонецЕсли; @@ -534,7 +534,7 @@ КонецЕсли; КонецЕсли; - Если Не ЗначениеЗаполнено(ТекстЗапроса) Или Не СтрНачинаетсяС(ТекстЗапроса, "ВЫБРАТЬ") Тогда + Если Не ЗначениеЗаполнено(ТекстЗапроса) Или Не СтрНачинаетсяС(ТекстЗапроса, "ВЫБРАТЬ") Тогда // @query-part-1 Продолжить; КонецЕсли; @@ -557,10 +557,10 @@ ДобавляемоеПоле = " 0 КАК " + ИмяКолонки + ","; ЗапросМассивом = СтрРазделить(ТекстЗапроса, Символы.ПС); ПозицияДляВставки = Неопределено; - Если СтрЧислоВхождений(ТекстЗапроса, "ВЫБРАТЬ") > 1 Тогда + Если СтрЧислоВхождений(ТекстЗапроса, "ВЫБРАТЬ") > 1 Тогда // @query-part-1 Индекс = 0; Для Каждого СтрокаЗапроса Из ЗапросМассивом Цикл - Если СтрНачинаетсяС(СокрЛП(СтрокаЗапроса), "ВЫБРАТЬ") Тогда + Если СтрНачинаетсяС(СокрЛП(СтрокаЗапроса), "ВЫБРАТЬ") Тогда // @query-part-1 Если ПозицияДляВставки = Неопределено Тогда ПозицияДляВставки = Индекс + 1; Иначе @@ -584,20 +584,20 @@ КонтрольВеденияУчетаСлужебный.ПриОпределенииПараметровКолонкиИндикации(ПараметрыКолонкиИндикации, ОсновнаяТаблица); КонтрольВеденияУчетаПереопределяемый.ПриОпределенииПараметровКолонкиИндикации(ПараметрыКолонкиИндикации, ОсновнаяТаблица); - КолонкаИндикаторОшибки = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы); + КолонкаИндикаторОшибки = Форма.Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы); КолонкаИндикаторОшибки.Вид = ВидПоляФормы.ПолеКартинки; КолонкаИндикаторОшибки.ПутьКДанным = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.%2", ИмяСписка, ИмяКолонки); КолонкаИндикаторОшибки.ПоложениеЗаголовка = ПараметрыКолонкиИндикации.ПоложениеЗаголовка; КолонкаИндикаторОшибки.КартинкаШапки = ГлобальныеНастройки.КартинкаИндикатораПроблем; - КолонкаИндикаторОшибки.КартинкаЗначений = БиблиотекаКартинок.КоллекцияВажностьПроблемВеденияУчета; + КолонкаИндикаторОшибки.КартинкаЗначений = КартинкаЗначений; КолонкаИндикаторОшибки.Заголовок = НСтр("ru = 'Индикатор ошибки'"); КолонкиСписка = ТаблицаФормы.ПодчиненныеЭлементы; Если КолонкиСписка.Количество() > 0 Тогда Если ПараметрыКолонкиИндикации.ВыводитьПоследней Тогда - Элементы.Переместить(КолонкаИндикаторОшибки, ТаблицаФормы); + Форма.Элементы.Переместить(КолонкаИндикаторОшибки, ТаблицаФормы); Иначе - Элементы.Переместить(КолонкаИндикаторОшибки, ТаблицаФормы, КолонкиСписка.Получить(0)); + Форма.Элементы.Переместить(КолонкаИндикаторОшибки, ТаблицаФормы, КолонкиСписка.Получить(0)); КонецЕсли; КонецЕсли; @@ -826,10 +826,8 @@ // для регистрации или отбора результатов ведения учета. // // Параметры: -// ПараметрыВыполненияПроверки - Строка -// - Структура - сведения, идентифицирующие вид проверки: -// - Строка - строковый идентификатор вида проверки (Свойство1). -// - см. КонтрольВеденияУчета.ПараметрыВыполненияПроверки. +// ПараметрыВыполненияПроверки - Строка - строковый идентификатор вида проверки (Свойство1) +// - Структура - сведения, идентифицирующие вид проверки. // ТолькоПоиск - Булево - если Истина и вид проверки с заданными параметрами не существует, // возвращается пустая ссылка; если Ложь, то создается элемент и возвращается ссылка на него. // @@ -891,8 +889,8 @@ // "Информация", "Предупреждение", "Ошибка" и "ПолезныйСовет". // * Ответственный - СправочникСсылка.Пользователи - заполнен если есть возможность // идентифицировать ответственного в проблемном объекте. -// * ДополнительнаяИнформация - ХранилищеЗначений - служебное свойство с дополнительными -// сведениями, связанными с выявленной проблемой +// * ДополнительнаяИнформация - ХранилищеЗначения - служебное свойство с дополнительными +// сведениями, связанными с выявленной проблемой. // * Выявлено - Дата - серверное время идентификации проблемы. // // Пример: diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl index 52daea069..a1c650c0f 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl @@ -31,7 +31,7 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма проблемного объекта. -// ПроблемныйОбъект - СсылкаНаОбъект - ссылка на проблемный объект. +// ПроблемныйОбъект - ЛюбаяСсылка - ссылка на проблемный объект. // СтандартнаяОбработка - Булево - в данный параметр передается признак выполнения // стандартной (системной) обработки события. // diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl index 46460f77f..439718c72 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl @@ -898,8 +898,8 @@ // Возвращает параметры проверки по переданному идентификатору регламентного задания. // -// Параметры -// ИдентификаторРегламентногоЗадания - Строка - Поле для связки с текущим фоновым заданием. +// Параметры: +// ИдентификаторРегламентногоЗадания - Строка - поле для связки с текущим фоновым заданием. // // Возвращаемое значение: // Структура - со свойствами, Неопределено: @@ -1594,13 +1594,13 @@ // Формирует общую строку-индикатор наличия ошибок. Состоит из поясняющего текста и // гиперссылки открывающей отчет по проблемам объекта. // -// Параметры -// ФормаКлиентскогоПриложения - ФормаКлиентскогоПриложения - Форма объекта на которой расположена группа индикатора. -// СсылкаНаОбъект - ЛюбаяСсылка - Ссылка на объект по которому найдены ошибки. -// КоличествоПроблемПоОбъекту - Число - Найденное количество проблем по объекту. -// ПояснениеИндикатораПроблем - Строка, Неопределено - Строка идентифицирующая наличие проблем у текущего объекта. +// Параметры: +// ФормаКлиентскогоПриложения - ФормаКлиентскогоПриложения - форма объекта на которой расположена группа индикатора. +// СсылкаНаОбъект - ЛюбаяСсылка - ссылка на объект по которому найдены ошибки. +// КоличествоПроблемПоОбъекту - Число - найденное количество проблем по объекту. +// ПояснениеИндикатораПроблем - Строка, Неопределено - строка идентифицирующая наличие проблем у текущего объекта. // Может быть переопределена конечным разработчиком - достаточно добавить параметр при вызове. -// ГиперссылкаИндикатораПроблем - Строка, Неопределено - Строка представляющая гиперссылку, при нажатии +// ГиперссылкаИндикатораПроблем - Строка, Неопределено - строка представляющая гиперссылку, при нажатии // на которую будет открыт и сформирован отчет по проблемам текущего объекта. // Функция СформироватьОбщуюСтрокуИндикатор(Форма, СсылкаНаОбъект, Настройки) Экспорт diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl index cb0b537f4..3dad515a6 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl @@ -305,6 +305,10 @@ Процедура ОповеститьОНаличииПроблемВеденияУчета() Экспорт ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("КонтрольВеденияУчета") Тогда + Возврат; + КонецЕсли; + КоличествоПроблем = ПараметрыКлиента.КонтрольВеденияУчета.КоличествоПроблемВеденияУчета; Если КоличествоПроблем = 0 Тогда Возврат; diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl index 829e31cff..05a1e3c14 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйПовтИсп/Module.bsl @@ -270,7 +270,7 @@ // * УточнениеКонтекстаПроверокВеденияУчета - ОпределяемыйТип.УточнениеКонтекстаПроверокВеденияУчета - второе значение, // дополнительно уточняющее принадлежность проверки ведения учета // к определенной группе или категории. -// * ДополнительныеПараметры - ХранилищеЗначений - дополнительная информация о проверке для программного +// * ДополнительныеПараметры - ХранилищеЗначения - дополнительная информация о проверке для программного // использования. // * Комментарий - Строка - комментарий к проверке. // * Отключена - Булево - если Истина, то проверка не будет выполняться в фоне по расписанию. diff --git a/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl b/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl index a03edfae1..ac3a70949 100644 --- a/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl @@ -28,9 +28,9 @@ Если МультиязычностьПовтИсп.ОбъектНеСодержитТЧПредставления(Данные.Ссылка) Тогда СуффиксЯзыка = МультиязычностьСервер.СуффиксТекущегоЯзыка(); - Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда + Если ЗначениеЗаполнено(СуффиксЯзыка) И Данные.Свойство(ИмяРеквизита + СуффиксЯзыка) Тогда СтандартнаяОбработка = Ложь; - Представление = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Данные.Ссылка, ИмяРеквизита,, ТекущийЯзык().КодЯзыка); + Представление = Данные[ИмяРеквизита + СуффиксЯзыка] КонецЕсли; ИначеЕсли Данные.Свойство("Ссылка") Или Данные.Ссылка <> Неопределено Тогда diff --git a/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl b/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl index 24090a8d0..53225faff 100644 --- a/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl @@ -575,7 +575,7 @@ Для Каждого ОператорЗапроса Из ПакетЗапроса.Операторы Цикл Для Каждого ИсточникЗапроса Из ОператорЗапроса.Источники Цикл Если ТипЗнч(ИсточникЗапроса.Источник) <> Тип("ВложенныйЗапросСхемыЗапроса") - И СтрНачинаетсяС(ОбъектМетаданных.ПолноеИмя(), ИсточникЗапроса.Источник.ИмяТаблицы) Тогда + И СтрНачинаетсяС(ОбъектМетаданных.ПолноеИмя(), ИсточникЗапроса.Источник.ИмяТаблицы) Тогда Для каждого ОписаниеРеквизита Из ЛокализуемыеРеквизиты Цикл @@ -1479,7 +1479,7 @@ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, ОбъектМетаданных,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Процедура МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию обработала очередную объектов: %1'"), + НСтр("ru = 'Процедура МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию обработала очередную порцию объектов: %1'"), ОбъектовОбработано)); КонецЕсли; diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl index 379618e2a..ac2cd5e38 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl @@ -189,6 +189,13 @@ КонецПроцедуры // Возвращает запись из кэша результата выполнения функции ПолучитьНапоминанияТекущегоПользователя(). +// +// Параметры: +// КэшОповещений - см. НапоминанияПользователяСлужебный.СписокТекущихНапоминанийПользователя +// ПараметрыОповещения - Структура: +// * Источник - ОпределяемыйТип.ПредметНапоминания +// * ВремяСобытия - Дата +// Функция НайтиЗаписьВКэшеОповещений(КэшОповещений, ПараметрыОповещения) Для Каждого Запись Из КэшОповещений Цикл Если Запись.Источник = ПараметрыОповещения.Источник @@ -220,8 +227,8 @@ // // ПолноеПредставление - Булево - кратное или полное представление времени. // Например, интервал 1 000 000 секунд: -// - полное представление: 11 дней 13 часов 46 минут 40 секунд; -// - краткое представление: 11 дней 13 часов. +// 1) полное представление: 11 дней 13 часов 46 минут 40 секунд; +// 2) краткое представление: 11 дней 13 часов. // // ВыводитьСекунды - Булево - Ложь, если секунды не требуются. // diff --git a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl index f979e87a0..45dfd3d87 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl @@ -735,6 +735,20 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * Пользователь - СправочникСсылка.Пользователи +// * ВремяСобытия - Дата +// * Источник - ОпределяемыйТип.ПредметНапоминания +// * СрокНапоминания - Дата +// * Описание - Строка +// * СпособУстановкиВремениНапоминания - ПеречислениеСсылка.СпособыУстановкиВремениНапоминания +// * ИнтервалВремениНапоминания - Число +// * ИмяРеквизитаИсточника - Строка +// * Расписание - ХранилищеЗначения - значение типа РасписаниеРегламентногоЗадания +// * ПредставлениеИсточника - Строка +// * Идентификатор - Строка +// Функция ПодключитьПроизвольноеНапоминание(Текст, ВремяСобытия, ИнтервалДоСобытия = 0, Предмет = Неопределено, Идентификатор = Неопределено) Экспорт ПараметрыНапоминания = Новый Структура; ПараметрыНапоминания.Вставить("Описание", Текст); diff --git a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl index 445b337bb..1c6b3edd6 100644 --- a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl +++ b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовКлиент/Module.bsl @@ -39,24 +39,24 @@ // Выполняет запуск мастера настройки разрешений на использование служебных ресурсов. // +// Результатом операции является открытие формы +// Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ИнициализацияЗапросаРазрешений, для которой в +// качестве описания оповещения о закрытии установлена процедура +// ПослеИнициализацииЗапросаРазрешенийНаИспользованиеВнешнихРесурсов. +// // Параметры: -// Идентификаторы - Массив - идентификаторы (УникальныйИдентификатор) запросов на использование внешних ресурсов, -// для применения которых вызывается мастер. +// Идентификаторы - Массив из УникальныйИдентификатор - идентификаторы запросов на использование внешних ресурсов, +// для применения которых вызывается мастер. // ФормаВладелец - ФормаКлиентскогоПриложения // - Неопределено - форма, по отношению которой открывался мастер. -// ОповещениеОЗакрытии - ОписаниеОповещения или Неопределено - описание оповещения, обработка которого должна быть -// выполнена после завершения работы мастера, +// ОповещениеОЗакрытии - ОписаниеОповещения, Неопределено - описание оповещения, обработка которого должна быть +// выполнена после завершения работы мастера. // РежимВключения - Булево - флаг того, что мастер вызывается при выполнении включения использования для информационной -// базы профилей безопасности, +// базы профилей безопасности. // РежимОтключения - Булево - флаг того, что мастер вызывается при выполнении отключения использования для -// информационной базы профилей безопасности, +// информационной базы профилей безопасности. // РежимВосстановления - Булево - флаг того, что мастер вызывается для восстановления настроек профилей безопасности в -// кластере серверов (по текущим данным информационной базы). -// -// Результатом операции является открытие формы -// "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ИнициализацияЗапросаРазрешений", для которой в -// качестве описания оповещения о закрытии установлена процедура -// ПослеИнициализацииЗапросаРазрешенийНаИспользованиеВнешнихРесурсов(). +// кластере серверов (по текущим данным информационной базы). // Процедура НачатьИнициализациюЗапросаРазрешенийНаИспользованиеВнешнихРесурсов( Знач Идентификаторы, @@ -107,7 +107,7 @@ // Выполняет переход к диалогу настройки разрешений в профилях безопасности. // Результатом операции является открытии формы: -// "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов", +// Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов, // для которой в качестве описания оповещения о закрытии установлена процедура // ПослеНастройкиРазрешенийНаИспользованиеВнешнихРесурсов или аварийное прерывание работы мастера. // @@ -167,7 +167,7 @@ // Выполняет переход к диалогу ожидания применения настроек профилей безопасности кластером серверов. // Результатом операции является открытии формы: -// "Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ЗавершениеЗапросаРазрешений", для которой +// Обработка.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов.Форма.ЗавершениеЗапросаРазрешений, для которой // в качестве описания оповещения о закрытии установлена процедура // ПослеЗавершенияЗапросаРазрешенийНаИспользованиеВнешнихРесурсов или аварийное прерывание работы мастера. // @@ -312,18 +312,18 @@ // Запускает мастер в режиме проверки завершения операции, в рамках которой ранее применялись запросы // разрешений на использование внешних ресурсов. // -// Параметры: -// Результат - Произвольный - результат закрытия формы, для которой открывался мастер настройки разрешений -// на использование внешних ресурсов. В теле процедуры не используется, параметр требуется -// для назначения процедуры в качестве описания оповещения о закрытия формы. -// Состояние - см. СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца. -// // Результатом выполнения данной процедуры является запуск мастера настройки разрешений на использование // внешних ресурсов в режиме проверки завершения операции, в рамках которой ранее применялись разрешения // на использование внешних ресурсов (с штатным прохождением всех операций), после завершения работы которого // будет вызвана обработка описания оповещения, в качестве которого установлена процедура. // ПослеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца. // +// Параметры: +// Результат - Произвольный - результат закрытия формы, для которой открывался мастер настройки разрешений +// на использование внешних ресурсов. В теле процедуры не используется, параметр требуется +// для назначения процедуры в качестве описания оповещения о закрытия формы. +// Состояние - см. СостояниеПроверкиПримененияРазрешенийПослеЗакрытияФормыВладельца. +// Процедура ПроверкаПримененияРазрешенийПослеЗакрытияФормыВладельца(Результат, Состояние) Экспорт ОригинальноеОписаниеОповещенияОЗакрытии = Состояние.ОписаниеОповещения; @@ -432,8 +432,7 @@ Результат = Новый Структура(); - // Идентификаторы запросов на использование внешних ресурсов, которые должны быть - // предоставлены - Массив(УникальныйИдентификатор). + // Идентификаторы запросов на использование внешних ресурсов, которые должны быть предоставлены. Результат.Вставить("ИдентификаторыЗапросов", Новый Массив()); // Оригинальное описание оповещения, которое должно быть вызвано после того, как запрос @@ -508,11 +507,10 @@ // открывался мастер настройки разрешений на использование внешних ресурсов. // // Параметры: -// ФормаВладелец - ФормаКлиентскогоПриложения -// - Неопределено - форма, после закрытия которой требуется выполнить +// ФормаВладелец - ФормаКлиентскогоПриложения, Неопределено - форма, после закрытия которой требуется выполнить // проверку завершения операций, в рамках которых ранее применялись запросы разрешений на использование // внешних ресурсов. -// ИдентификаторыЗапросов - Массив - идентификаторы (УникальныйИдентификатор) запросов разрешений на +// ИдентификаторыЗапросов - Массив из УникальныйИдентификатор - идентификаторы запросов разрешений на // использование внешних ресурсов, которые были применены в рамках операции, завершение которой проверяется. // Процедура ЗапланироватьПроверкуПримененияРазрешенийПослеЗакрытияФормыВладельца(ВладелецФормы, ИдентификаторыЗапросов) diff --git a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl index 454cc59bf..26076a8db 100644 --- a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl @@ -517,13 +517,20 @@ Попытка КомпонентыОбмена.МенеджерОбмена.ПередКонвертацией(КомпонентыОбмена); Исключение - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Направление: %1. - |Обработчик: ПередКонвертацией. + + ШаблонОписанияОшибки = НСтр("ru = 'Направление: %1. + |Обработчик: %2. | |Ошибка выполнения обработчика. - |%2.'"), + |%3.'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ПередКонвертацией", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение ТекстОшибки; + КонецПопытки; НомерОтправленного = 0; @@ -554,14 +561,20 @@ Попытка КомпонентыОбмена.МенеджерОбмена.ПослеКонвертации(КомпонентыОбмена); Исключение - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Событие: %1. - |Обработчик: ПослеКонвертации. + + ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. + |Обработчик: %2. | |Ошибка выполнения обработчика. - |%2.'"), + |%3.'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ПослеКонвертации", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда @@ -1440,7 +1453,13 @@ ПКПД = КомпонентыОбмена.ПравилаКонвертацииПредопределенныхДанных.Найти(ПравилоКонвертацииСвойства, "ИмяПКПД"); Если ПКПД <> Неопределено Тогда + + Если ТипЗнч(ЗначениеСвойства) = Тип("Строка") Тогда + Возврат; + КонецЕсли; + ЗначениеСвойства = ПКПД.КонвертацииЗначенийПриОтправке.Получить(ЗначениеСвойства); + Иначе ПравилоКонвертации = ПКОПоИмени(КомпонентыОбмена, ПравилоКонвертацииСвойства); @@ -1999,14 +2018,20 @@ Попытка КомпонентыОбмена.МенеджерОбмена.ПослеКонвертации(КомпонентыОбмена); Исключение - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Направление: %1. - |Обработчик: ПослеКонвертации. + + ШаблонОписанияОшибки = НСтр("ru = 'Направление: %1. + |Обработчик: %2. | |Ошибка выполнения обработчика. - |%2.'"), + |%3.'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + "ПослеКонвертации", + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение ТекстОшибки; + КонецПопытки; ОбменДаннымиСлужебный.ОтключитьОбновлениеКлючейДоступа(Истина); @@ -5602,14 +5627,20 @@ Попытка КомпонентыОбмена.МенеджерОбмена.ПередОтложеннымЗаполнением(КомпонентыОбмена); Исключение - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Направление: %1. - |Обработчик: ПередОтложеннымЗаполнением. + + ШаблонОписанияОшибки = НСтр("ru = 'Направление: %1. + |Обработчик: %2. | |Ошибка выполнения обработчика. - |%2.'"), + |%3.'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ПередОтложеннымЗаполнением", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение ТекстОшибки; + КонецПопытки; Для Каждого СтрокаТаблицы Из ЗагруженныеОбъекты Цикл @@ -5651,16 +5682,20 @@ Исключение ОтменитьТранзакцию(); - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Событие: %1. - |Обработчик: ОтложенноеЗаполнениеОбъектов. - |Объект: %2. + ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. + |Обработчик: %2. + |Объект: %3. | |Ошибка выполнения обработчика. - |%3.'"), + |%4.'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ОтложенноеЗаполнениеОбъектов", СтроковоеПредставлениеОбъекта, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение ТекстОшибки; КонецПопытки; КонецЦикла; @@ -5805,14 +5840,20 @@ Попытка КомпонентыОбмена.МенеджерОбмена.ПередКонвертацией(КомпонентыОбмена); Исключение - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Направление: %1. - |Обработчик: ПередКонвертацией. + + ШаблонОписанияОшибки = НСтр("ru = 'Направление: %1. + |Обработчик: %2. | |Ошибка выполнения обработчика. - |%2.'"), + |%3.'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ПередКонвертацией", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ВызватьИсключение ТекстОшибки; + КонецПопытки; МассивОбъектовКУдалению = Новый Массив; @@ -6856,16 +6897,22 @@ Попытка ВыборкаДанных = МенеджерОбмена.ВыполнитьФункциюМодуляМенеджера(ПравилоОбработки.ВыборкаДанных, СтруктураПараметров); Исключение - ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Событие: %1. - |Обработчик: ВыборкаДанных. - |ПОД: %2. + + ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. + |Обработчик: %2. + |ПОД: %3. | |Ошибка выполнения обработчика. - |%3.'"), + |%4.'"); + + ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ВыборкаДанных", ПравилоОбработки.Имя, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; Иначе @@ -6912,16 +6959,22 @@ Попытка МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров); Исключение - ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Событие: %1. - |Обработчик: ПриОтправкеДанных. - |Объект: %2. + + ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. + |Обработчик: %2. + |Объект: %3. | |Ошибка выполнения обработчика. - |%3.'"), + |%4.'"); + + ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ПриОтправкеДанных", ПредставлениеОбъектаДляПротокола(ДанныеИБ), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; ДанныеXDTO = СтруктураПараметров.ДанныеXDTO; @@ -6949,16 +7002,22 @@ Попытка МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров); Исключение - ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Событие: %1. - |Обработчик: ПриКонвертацииДанныхXDTO. - |Объект: %2. + + ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. + |Обработчик: %2. + |Объект: %3. | |Ошибка выполнения обработчика. - |%3.'"), + |%4.'"); + + ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ПриКонвертацииДанныхXDTO", ПредставлениеОбъектаДляПротокола(ПолученныеДанные), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; ДанныеXDTO = СтруктураПараметров.ДанныеXDTO; @@ -6991,16 +7050,22 @@ Попытка МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров); Исключение - ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Событие: %1. - |Обработчик: ПередЗаписьюПолученныхДанных. - |Объект: %2. + + ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. + |Обработчик: %2. + |Объект: %3. | |Ошибка выполнения обработчика. - |%3.'"), + |%4.'"); + + ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "ПередЗаписьюПолученныхДанных", ПредставлениеОбъектаДляПротокола(?(ДанныеИБ <> Неопределено, ДанныеИБ, ПолученныеДанные)), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; ДанныеИБ = СтруктураПараметров.ДанныеИБ; @@ -7021,16 +7086,22 @@ Попытка МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров); Исключение - ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Событие: %1. - |Обработчик: АлгоритмПоиска. - |Объект: %2. + + ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. + |Обработчик: %2. + |Объект: %3. | |Ошибка выполнения обработчика. - |%3.'"), + |%4.'"); + + ТекстОшибки = Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, КомпонентыОбмена.НаправлениеОбмена, + "АлгоритмПоиска", ПредставлениеОбъектаДляПротокола(?(ДанныеИБ <> Неопределено, ДанныеИБ, ПолученныеДанные)), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; ДанныеИБ = СтруктураПараметров.ДанныеИБ; @@ -7239,22 +7310,25 @@ Результат = Новый Структура("КраткоеПредставление, ПодробноеПредставление"); ШаблонОписанияОшибки = НСтр("ru = 'Событие: %1. - |Обработчик: ПриОбработкеПОД. - |ПОД: %2. - |Объект: %3. - | - |Ошибка выполнения обработчика. - |%4.'"); + |Обработчик: %2. + |ПОД: %3. + |Объект: %4. + | + |Ошибка выполнения обработчика. + |%5.'"); Результат.КраткоеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонОписанияОшибки, НаправлениеОбмена, + "ПриОбработкеПОД", ИмяПОД, ПредставлениеОбъекта, КраткоеПредставлениеОшибки(Информация)); + Результат.ПодробноеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонОписанияОшибки, НаправлениеОбмена, + "ПриОбработкеПОД", ИмяПОД, ПредставлениеОбъекта, ПодробноеПредставлениеОшибки(Информация)); @@ -7268,11 +7342,11 @@ Результат = Новый Структура("КраткоеПредставление, ПодробноеПредставление"); ШаблонОписанияОшибки = НСтр("ru = 'Направление: %1. - |ПОД: %2. - |ПКО: %3. - |Объект: %4. - | - |%5'"); + |ПОД: %2. + |ПКО: %3. + |Объект: %4. + | + |%5'"); Результат.КраткоеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонОписанияОшибки, @@ -7281,6 +7355,7 @@ ИмяПКО, ПредставлениеОбъекта, КраткоеПредставлениеОшибки(Информация)); + Результат.ПодробноеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонОписанияОшибки, НаправлениеОбмена, @@ -7388,14 +7463,27 @@ Если ВерсииФорматаОбмена.Количество() = 0 Тогда Если ЗначениеЗаполнено(УзелИнформационнойБазы) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не заданы версии формата обмена. + + ШаблонОписанияОшибки = НСтр("ru = 'Не заданы версии формата обмена. |Имя плана обмена: %1 - |Процедура: ПолучитьВерсииФорматаОбмена(<ВерсииФорматаОбмена>)'"), - ИмяПланаОбмена); + |Процедура: %2'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + ИмяПланаОбмена, + "ПолучитьВерсииФорматаОбмена(<ВерсииФорматаОбмена>)"); + + ВызватьИсключение ТекстОшибки; + Иначе - ВызватьИсключение НСтр("ru = 'Не заданы версии формата обмена. - |Процедура: ОбменДаннымиПереопределяемый.ПриПолученииДоступныхВерсийФормата(<ВерсииФорматаОбмена>)'"); + + ШаблонОписанияОшибки = НСтр("ru = 'Не заданы версии формата обмена. + |Процедура: %1'"); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + "ОбменДаннымиПереопределяемый.ПриПолученииДоступныхВерсийФормата(<ВерсииФорматаОбмена>)"); + + ВызватьИсключение ТекстОшибки; + КонецЕсли; КонецЕсли; @@ -7483,12 +7571,15 @@ Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0", СтрокаВерсии1); Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0", СтрокаВерсии2); Версия1 = СтрРазделить(Строка1, "."); + + ШаблонОписанияОшибки = НСтр("ru = 'Неправильный формат параметра %1: %2'"); + Если Версия1.Количество() < 2 ИЛИ Версия1.Количество() > 3 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки,"СтрокаВерсии1", СтрокаВерсии1); КонецЕсли; Версия2 = СтрРазделить(Строка2, "."); Если Версия2.Количество() < 2 ИЛИ Версия2.Количество() > 3 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки,"СтрокаВерсии2", СтрокаВерсии2); КонецЕсли; Результат = 0; diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl index 570ddf0eb..f55346530 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl @@ -44,6 +44,18 @@ УстановитьПризнакИзмененияДанных(); Иначе + ОтборЗаданий = Новый Структура; + ОтборЗаданий.Вставить("ИмяМетода", "ОбменДаннымиВМоделиСервиса.УстановитьПризнакИзмененияДанных"); + ОтборЗаданий.Вставить("Ключ", "1"); + + УстановитьПривилегированныйРежим(Истина); + ЗаданиеУжеЗапущено = ФоновыеЗадания.ПолучитьФоновыеЗадания(ОтборЗаданий).Количество() > 0; + Если ЗаданиеУжеЗапущено Тогда + + Возврат; + + КонецЕсли; + Попытка ФоновыеЗадания.Выполнить("ОбменДаннымиВМоделиСервиса.УстановитьПризнакИзмененияДанных",, "1"); Исключение @@ -1310,6 +1322,7 @@ Объект = Ссылка.ПолучитьОбъект(); Если Объект <> Неопределено Тогда + Объект.ДополнительныеСвойства.Вставить("УдалениеНастройкиСинхронизации"); Объект.Удалить(); КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl index 2c008b985..d07474979 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl @@ -245,8 +245,122 @@ Процедура ВыполнитьЗагрузкуРасширений() Экспорт - // Для перехода на 3.1.5 + Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь) Тогда + Возврат; + КонецЕсли; + + УзелИнформационнойБазы = ПланыОбмена.ГлавныйУзел(); + + Если УзелИнформационнойБазы <> Неопределено Тогда + + ОбменДаннымиСервер.ОтключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); + + УстановитьПривилегированныйРежим(Истина); + ОбменДаннымиСервер.УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена", Истина); + ОбменДаннымиСервер.УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРасширений", Истина); + УстановитьПривилегированныйРежим(Ложь); + + // Обновление правил регистрации объектов выполняем до загрузки данных. + ОбменДаннымиСервер.ВыполнитьОбновлениеПравилДляОбменаДанными(); + + ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); + + ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена(); + ПараметрыОбмена.ВидТранспортаСообщенийОбмена = ВидТранспорта; + ПараметрыОбмена.ВыполнятьЗагрузку = Истина; + ПараметрыОбмена.ВыполнятьВыгрузку = Ложь; + ПараметрыОбмена.ДлительнаяОперацияРазрешена = Ложь; + ПараметрыОбмена.ТолькоПараметры = Истина; + + Отказ = Ложь; + Попытка + + ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, ПараметрыОбмена, Отказ); + + Исключение + + СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СобытиеЖурналаРегистрации = НСтр("ru = 'Обмен данными.Загрузка расширения'", ОбщегоНазначения.КодОсновногоЯзыка()); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + + КонецПопытки; + + ОбменДаннымиСлужебный.ОтключитьЗагрузкуРасширенийИзменяющихСтруктуруДанных(); + + КонецЕсли; КонецПроцедуры +Функция ПроверитьНеобходимостьОтложеннойЗаписиУзла(Знач УзелОбъект) Экспорт + + ИсключаемыеСвойства = Новый Массив; + ИсключаемыеСвойства.Добавить("НомерОтправленного"); + ИсключаемыеСвойства.Добавить("НомерПринятого"); + ИсключаемыеСвойства.Добавить("ПометкаУдаления"); + ИсключаемыеСвойства.Добавить("Код"); + ИсключаемыеСвойства.Добавить("Наименование"); + + Если ОбщегоНазначения.РазделениеВключено() Тогда + ПолноеИмяМетаданных = УзелОбъект.Ссылка.Метаданные().ПолноеИмя(); + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + + РазделительОсновныхДанных = МодульРаботаВМоделиСервиса.РазделительОсновныхДанных(); + РазделительВспомогательныхДанных = МодульРаботаВМоделиСервиса.РазделительВспомогательныхДанных(); + + Если МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяМетаданных, РазделительОсновныхДанных) Тогда + ИсключаемыеСвойства.Добавить(РазделительОсновныхДанных); + КонецЕсли; + + Если МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяМетаданных, РазделительВспомогательныхДанных) Тогда + ИсключаемыеСвойства.Добавить(РазделительВспомогательныхДанных); + КонецЕсли; + + КонецЕсли; + + ТипУзла = Тип("ПланОбменаОбъект." + УзелОбъект.Ссылка.Метаданные().Имя); + УзелПередЗаписью = ДанныеФормыВЗначение(УзелОбъект, ТипУзла); + + Результат = Новый Структура; + Результат.Вставить("НеобходимаДлительнаяОперация" , Ложь); + Результат.Вставить("ЕстьАктивноеФоновоеЗадание" , Ложь); + Результат.Вставить("АдресСтруктурыУзла" , Неопределено); + + Если Не УзелОбъект.Ссылка.Пустая() + И Не УзелОбъект.ЭтотУзел + И ОбменДаннымиСобытия.ДанныеРазличаются(УзелПередЗаписью, УзелОбъект.Ссылка.ПолучитьОбъект(), , СтрСоединить(ИсключаемыеСвойства, ",")) + И ОбменДаннымиСлужебный.ИзмененияЗарегистрированы(УзелОбъект.Ссылка) Тогда + + Результат.НеобходимаДлительнаяОперация = Истина; + + // + Отбор = Новый Структура; + Отбор.Вставить("Ключ", "ОтложеннаяЗаписьУзла"); + Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); + + АктивныеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + Результат.ЕстьАктивноеФоновоеЗадание = АктивныеФоновыеЗадания.Количество() > 0; + + // + УзелСтруктура = Новый Структура; + + МетаданныеУзла = УзелПередЗаписью.Ссылка.Метаданные(); + + Для Каждого Реквизит Из МетаданныеУзла.Реквизиты Цикл + УзелСтруктура.Вставить(Реквизит.Имя, УзелПередЗаписью[Реквизит.Имя]); + КонецЦикла; + + Для Каждого Таблица Из МетаданныеУзла.ТабличныеЧасти Цикл + Таб = УзелПередЗаписью[Таблица.Имя].Выгрузить(); + УзелСтруктура.Вставить(Таблица.Имя, Таб); + КонецЦикла; + + Результат.АдресСтруктурыУзла = ПоместитьВоВременноеХранилище(УзелСтруктура, Новый УникальныйИдентификатор); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl index 3365155bf..fed703ef0 100644 --- a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl @@ -284,6 +284,47 @@ КонецПроцедуры +// Процедура-обработчик записи узла плана обмена. При необходимости выполняет запись узла при помощи длительной операции +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - узел плана обмена. +// Отказ - Булево - признак отказа от записи узла плана обмена. +// ПараметрыЗаписи - Структура - произвольные параметры записи. См. описание события ПослеЗаписи в синтакс-помощнике. +// +Процедура ПередЗаписью(Форма, Отказ, ПараметрыЗаписи) Экспорт + + Если Отказ Тогда + Возврат; + КонецЕсли; + + РезультатПроверки = ОбменДаннымиВызовСервера.ПроверитьНеобходимостьОтложеннойЗаписиУзла(Форма.Объект); + + Если РезультатПроверки.ЕстьАктивноеФоновоеЗадание Тогда + + ТекстПредупреждения = НСтр("ru = 'Уже выполняется отложенная операция записи узла. + |Повторите попытку позже'"); + + ПоказатьПредупреждение(, ТекстПредупреждения); + + Отказ = Истина; + + ИначеЕсли РезультатПроверки.НеобходимаДлительнаяОперация Тогда + + ПараметрыОбработки = Новый Структура; + ПараметрыОбработки.Вставить("Узел", Форма.Объект.Ссылка); + ПараметрыОбработки.Вставить("АдресСтруктурыУзла", РезультатПроверки.АдресСтруктурыУзла); + + Форма.Модифицированность = Ложь; + Форма.Закрыть(); + + ОткрытьФорму("Обработка.ОтложеннаяЗаписьУзла.Форма.Форма", ПараметрыОбработки,,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс @@ -562,7 +603,7 @@ Процедура ОткрытьНастройкиСинхронизацииДанных() Экспорт - ОткрытьФорму("ОбщаяФорма.СинхронизацияДанных"); + ОткрытьФорму("ОбщаяФорма.НастройкиСинхронизацииДанных"); КонецПроцедуры @@ -976,6 +1017,12 @@ КонецПроцедуры +Функция СобытиеЖурналаРегистрацииОбменДанными() Экспорт + + Возврат НСтр("ru = 'Обмен данными'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + +КонецФункции + // Открывает форму интерактивного выполнения обмена данными для заданного узла плана обмена. // // Параметры: @@ -1012,39 +1059,6 @@ КонецПроцедуры -// Открывает форму результатов выполнения обмена данными для заданного списка узлов планов обмена. -// -// Параметры: -// СписокУзлов - Массив - перечень значений типа ПланОбменаСсылка - узлов планов обмена, -// для которых необходимо открыть форму. -// ПараметрыОткрытия - Структура - дополнительные параметры, передаваемые в процедуру ОткрытьФорму: -// * Владелец - см. описание параметра Владелец процедуры ОткрытьФорму. -// * Уникальность - см. описание параметра Уникальность процедуры ОткрытьФорму. -// * Окно - см. описание параметра Окно процедуры ОткрытьФорму. -// -Процедура ОткрытьРезультатыОбменаДанными(СписокУзлов = Неопределено, ПараметрыОткрытия = Неопределено) Экспорт - - ПараметрыФормы = Неопределено; - Владелец = Неопределено; - Уникальность = Неопределено; - Окно = Неопределено; - - Если Не СписокУзлов = Неопределено Тогда - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("УзлыОбмена", СписокУзлов); - КонецЕсли; - - Если Не ПараметрыОткрытия = Неопределено Тогда - ПараметрыОткрытия.Свойство("Владелец", Владелец); - ПараметрыОткрытия.Свойство("Уникальность", Уникальность); - ПараметрыОткрытия.Свойство("Окно", Окно); - КонецЕсли; - - ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.Форма", ПараметрыФормы, - Владелец, Уникальность, Окно); - -КонецПроцедуры - // Открывает форму настройки новой синхронизации данных. // Процедура ОткрытьФормуНастройкиНовойСинхронизацииДанных(ФормаНовойСинхронизацииДанных = "", ДополнительныеПараметры = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl index 486b58525..2f143899b 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl @@ -394,57 +394,6 @@ КонецПроцедуры -// Возвращает количество нерассмотренных проблем обмена данными. Используется для отображения -// количества проблем обмена в пользовательском интерфейсе. Например, для использования в заголовке -// гиперссылки для перехода к монитору проблем обмена. -// -// Параметры: -// Узлы - Массив из ПланОбменаСсылка - узлы обмена. -// -// Возвращаемое значение: -// Число - количество нерассмотренных проблем обмена данными. -// -Функция КоличествоНерассмотренныхПроблем(Узлы = Неопределено) Экспорт - - Возврат КоличествоПроблемОбменаДанными(Узлы) + КоличествоПроблемВерсионирования(Узлы); - -КонецФункции - -// Возвращает структуру заголовка гиперссылки для перехода к монитору проблем обмена данными. -// -// Параметры: -// Узлы - Массив из ПланОбменаСсылка - узлы обмена. -// -// Возвращаемое значение: -// Структура: -// * Заголовок - Строка - заголовок гиперссылки. -// * Картинка - Картинка - картинка для гиперссылки. -// -Функция СтруктураЗаголовкаГиперссылкиМонитораПроблем(Узлы = Неопределено) Экспорт - - Количество = КоличествоНерассмотренныхПроблем(Узлы); - - Если Количество > 0 Тогда - - Заголовок = НСтр("ru = 'Предупреждения (%1)'"); - Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Заголовок, Количество); - Картинка = БиблиотекаКартинок.Предупреждение; - - Иначе - - Заголовок = НСтр("ru = 'Предупреждений нет'"); - Картинка = Новый Картинка; - - КонецЕсли; - - СтруктураЗаголовка = Новый Структура; - СтруктураЗаголовка.Вставить("Заголовок", Заголовок); - СтруктураЗаголовка.Вставить("Картинка", Картинка); - - Возврат СтруктураЗаголовка; - -КонецФункции - // Определяет, существует ли каталог на FTP-сервере. // // Параметры: @@ -883,9 +832,14 @@ ДействиеЗагрузка = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; ДействиеВыгрузка = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; - ПроверитьВозможностьВыполненияОбменов(); - - ПроверитьИспользованиеОбменаДанными(); + Отказ = Ложь; + + ПередВыполнениемОбменов(Корреспондент, Отказ); + Если Отказ = Истина Тогда + + Возврат; + + КонецЕсли; ТолькоПараметры = Ложь; ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема; @@ -893,15 +847,21 @@ ФлагОшибка = Ложь; Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(ФлагОшибка, Корреспондент, ДействиеЗагрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); + КонецЕсли; Если ПараметрыОбмена.ВыполнятьОтправкуНастроек Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(ФлагОшибка, Корреспондент, ДействиеВыгрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); + КонецЕсли; + ПослеВыполненияОбменов(Корреспондент, Отказ); + КонецПроцедуры #Область НастройкиПодключенияКВнешнейСистеме @@ -1643,6 +1603,57 @@ КонецФункции +// Устарела. Возвращает количество нерассмотренных проблем обмена данными. Используется для отображения +// количества проблем обмена в пользовательском интерфейсе. Например, для использования в заголовке +// гиперссылки для перехода к монитору проблем обмена. +// +// Параметры: +// Узлы - Массив из ПланОбменаСсылка - узлы обмена. +// +// Возвращаемое значение: +// Число - количество нерассмотренных проблем обмена данными. +// +Функция КоличествоНерассмотренныхПроблем(Узлы = Неопределено) Экспорт + + Возврат КоличествоПроблемОбменаДанными(Узлы) + КоличествоПроблемВерсионирования(Узлы); + +КонецФункции + +// Устарела. Возвращает структуру заголовка гиперссылки для перехода к монитору проблем обмена данными. +// +// Параметры: +// Узлы - Массив из ПланОбменаСсылка - узлы обмена. +// +// Возвращаемое значение: +// Структура: +// * Заголовок - Строка - заголовок гиперссылки. +// * Картинка - Картинка - картинка для гиперссылки. +// +Функция СтруктураЗаголовкаГиперссылкиМонитораПроблем(Узлы = Неопределено) Экспорт + + Количество = КоличествоНерассмотренныхПроблем(Узлы); + + Если Количество > 0 Тогда + + Заголовок = НСтр("ru = 'Предупреждения (%1)'"); + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Заголовок, Количество); + Картинка = БиблиотекаКартинок.Предупреждение; + + Иначе + + Заголовок = НСтр("ru = 'Предупреждений нет'"); + Картинка = Новый Картинка; + + КонецЕсли; + + СтруктураЗаголовка = Новый Структура; + СтруктураЗаголовка.Вставить("Заголовок", Заголовок); + СтруктураЗаголовка.Вставить("Картинка", Картинка); + + Возврат СтруктураЗаголовка; + +КонецФункции + #КонецОбласти #КонецОбласти @@ -2736,7 +2747,8 @@ // Функция ТребуетсяУстановкаОбновления() Экспорт - Возврат ЭтоПодчиненныйУзелРИБ() И КонфигурацияИзменена(); + Возврат ЭтоПодчиненныйУзелРИБ() + И (КонфигурацияИзменена() ИЛИ ОбменДаннымиСлужебный.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных()); КонецФункции @@ -3001,11 +3013,13 @@ // // Параметры: // ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. +// WSПассивныйРежимФайловаяИБ - Булево - признак того, что получение файла происходит в файловой ИБ при настройке WS +// соединения в пассивном режиме // // Возвращаемое значение: // ИмяФайла - Строка - имя файла. // -Функция ПолучитьФайлИзХранилища(Знач ИдентификаторФайла) Экспорт +Функция ПолучитьФайлИзХранилища(Знач ИдентификаторФайла, WSПассивныйРежимФайловаяИБ = Ложь) Экспорт ИмяФайла = ""; @@ -3021,7 +3035,13 @@ КонецЕсли; - Возврат ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременногоХранилищаФайлов(), ИмяФайла); + Если WSПассивныйРежимФайловаяИБ Тогда + ПолноеИмяФайла = ПолноеИмяФайлаДляСопоставленияФайловаяИБ(ИмяФайла); + Иначе + ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременногоХранилищаФайлов(), ИмяФайла); + КонецЕсли; + + Возврат ПолноеИмяФайла; КонецФункции @@ -3086,8 +3106,13 @@ Процедура ПроверитьВозможностьЗапускаОбмена(УзелОбмена, Отказ) Экспорт Попытка + + // Проверка не должна устанавливать/снимать блокировок ЗаблокироватьДанныеДляРедактирования(УзелОбмена); + РазблокироватьДанныеДляРедактирования(УзелОбмена); + Исключение + Отказ = Истина; СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -3095,15 +3120,11 @@ |Обмен данными уже выполняется. Повторите попытку позже.'"), УзелОбмена); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Предупреждение, - , - , - СообщениеОбОшибке); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Предупреждение, + УзелОбмена.Метаданные(), УзелОбмена, СообщениеОбОшибке); + КонецПопытки; - РазблокироватьДанныеДляРедактирования(УзелОбмена); - КонецПроцедуры #КонецОбласти @@ -3819,18 +3840,26 @@ Если Не ПравоДоступа("Просмотр", Метаданные.ОбщиеКоманды.Синхронизировать) Тогда Если ПриложениеВИнтернете Тогда + ВызватьИсключение НСтр("ru = 'Недостаточно прав для синхронизации данных с приложением в Интернете.'"); + Иначе + ВызватьИсключение НСтр("ru = 'Недостаточно прав для синхронизации данных.'"); + КонецЕсли; ИначеЕсли ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() - И Не ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена") Тогда - - Если ПриложениеВИнтернете Тогда + И Не ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена") Тогда + + Если ПриложениеВИнтернете Тогда + ВызватьИсключение НСтр("ru = 'Приложение в Интернете находится в состоянии обновления.'"); + Иначе + ВызватьИсключение НСтр("ru = 'Информационная база находится в состоянии обновления.'"); + КонецЕсли; КонецЕсли; @@ -3887,94 +3916,6 @@ КонецФункции -// Точка входа для выполнения итерации обмена данными - загрузки и выгрузки данных для узла плана обмена. -// -// Параметры: -// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется итерация обмена данными. -// ПараметрыОбменаДляУзла - Структура: -// * ВыполнятьЗагрузку - Булево - флаг необходимости выполнять загрузку данных. -// Необязательный, значение по умолчанию Истина. -// * ВыполнятьВыгрузку - Булево - флаг необходимости выполнять выгрузку данных. -// Необязательный, значение по умолчанию Истина. -// * ВидТранспортаСообщенийОбмена - ПеречислениеСсылка.ВидыТранспортаСообщенийОбмена - вид транспорта, -// который будет использоваться в процессе обмена данными. -// Если в РС значение не задано, то значение по умолчанию - Перечисления.ВидыТранспортаСообщенийОбмена.FILE. -// Необязательный, значение по умолчанию Неопределено. -// * ДлительнаяОперация - Булево - содержит сведения о том, является ли операция длительной. -// Необязательный, значение по умолчанию Ложь. -// * ИдентификаторОперации - Строка - содержит идентификатор длительной операции в виде строки. -// Необязательный, значение по умолчанию пустая строка. -// * ИдентификаторФайла - Строка - идентификатор файла сообщения в сервисе. -// Необязательный, значение по умолчанию пустая строка. -// * ДлительнаяОперацияРазрешена - Булево - содержит признак того, что длительная операция разрешена. -// Необязательный, значение по умолчанию Ложь. -// * ПараметрыАутентификации - Структура - содержит параметры аутентификации для обмена через Web-сервис. -// Необязательный, значение по умолчанию Неопределено. -// * ТолькоПараметры - Булево - содержит признак выборочной загрузки данных при обмене РИБ. -// Необязательный, значение по умолчанию Ложь. -// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки при выполнении обмена. -// ДополнительныеПараметры - Структура - зарезервировано для служебного использования. -// -Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, - ПараметрыОбмена, Отказ, ДополнительныеПараметры = Неопределено) Экспорт - - Если ДополнительныеПараметры = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - КонецЕсли; - - ДействиеЗагрузка = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; - ДействиеВыгрузка = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; - - ПроверитьВозможностьВыполненияОбменов(); - - ПроверитьИспользованиеОбменаДанными(); - - // Обмен через внешнее соединение. - Если ПараметрыОбмена.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.COM Тогда - - ПроверитьВозможностьВнешнегоСоединения(); - - Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, - УзелИнформационнойБазы, ДействиеЗагрузка, Неопределено); - КонецЕсли; - - Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, - УзелИнформационнойБазы, ДействиеВыгрузка, Неопределено, ПараметрыОбмена.СообщениеДляСопоставленияДанных); - КонецЕсли; - - ИначеЕсли ПараметрыОбмена.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда // Обмен через Web-сервис - - Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, - УзелИнформационнойБазы, ДействиеЗагрузка, ПараметрыОбмена); - КонецЕсли; - - Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, - УзелИнформационнойБазы, ДействиеВыгрузка, ПараметрыОбмена); - КонецЕсли; - - Иначе // Обмен через обычные каналы связи. - - ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; - ВидТранспортаСообщенийОбмена = ПараметрыОбмена.ВидТранспортаСообщенийОбмена; - - Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, - ДействиеЗагрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); - КонецЕсли; - - Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, - ДействиеВыгрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - Функция ПолучитьWSПроксиПоПараметрамПодключения( СтруктураНастроек, СтрокаСообщенияОбОшибке = "", @@ -4050,6 +3991,7 @@ ЗаблокироватьДанныеДляРедактирования(УзелИнформационнойБазы); ОбъектУзла = УзелИнформационнойБазы.ПолучитьОбъект(); + ОбъектУзла.ДополнительныеСвойства.Вставить("УдалениеНастройкиСинхронизации"); ОбъектУзла.Удалить(); ЗафиксироватьТранзакцию(); @@ -4415,6 +4357,7 @@ // Профиль "Синхронизация данных с другими программами". ОписаниеПрофиля = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом").НовоеОписаниеПрофиляГруппДоступа(); + ОписаниеПрофиля.Родитель = "ДополнительныеПрофили"; ОписаниеПрофиля.Идентификатор = ПрофильДоступаСинхронизацияДанныхСДругимиПрограммами(); ОписаниеПрофиля.Наименование = НСтр("ru = 'Синхронизация данных с другими программами'", ОбщегоНазначения.КодОсновногоЯзыка()); @@ -4447,13 +4390,13 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.УдалениеНеактуальнойИнформацииСинхронизации; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСинхронизациюДанных; Зависимость.РаботаетСВнешнимиРесурсами = Истина; - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СинхронизацияДанных; Зависимость.РаботаетСВнешнимиРесурсами = Истина; Зависимость.Параметризуется = Истина; @@ -4636,6 +4579,8 @@ #Область СлужебныеПроцедурыИФункции +#Область ОбщиеМетодыМеханизмовКонвертацииДанных + Функция МодульПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете() Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда @@ -4680,15 +4625,6 @@ КонецФункции -Процедура ОтключитьПроверкуДатЗапрета(Отключить = Истина) - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); - МодульДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Отключить); - КонецЕсли; - -КонецПроцедуры - Функция ПроверкаДатЗапретаОтключена() Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда @@ -4700,6 +4636,94 @@ КонецФункции +Функция СтрокаСодержитСимвол(Знач Строка, Знач СтрокаСимволов) + + Для Индекс = 1 По СтрДлина(СтрокаСимволов) Цикл + Символ = Сред(СтрокаСимволов, Индекс, 1); + + Если СтрНайти(Строка, Символ) <> 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ДопустимыеПрефиксыWSПрокси() + + Результат = Новый Массив(); + + Результат.Добавить("http"); + Результат.Добавить("https"); + + Возврат Результат; + +КонецФункции + +Функция НовыйУзелОбменаДаннымиXDTO( + ИмяПланаОбмена, + ИдентификаторНастройки, + ИдентификаторКорреспондента, + НаименованиеКорреспондента, + ВерсияФорматаОбмена) + + МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + + НовыйУзел = МенеджерПланаОбмена.СоздатьУзел(); + НовыйУзел.Код = ИдентификаторКорреспондента; + НовыйУзел.Наименование = НаименованиеКорреспондента; + + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВариантНастройки", Метаданные.ПланыОбмена[ИмяПланаОбмена]) Тогда + НовыйУзел.ВариантНастройки = ИдентификаторНастройки; + КонецЕсли; + + НовыйУзел.ВерсияФорматаОбмена = ВерсияФорматаОбмена; + + НовыйУзел.Заполнить(Неопределено); + + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() + И ЭтоРазделенныйПланОбменаБСП(ИмяПланаОбмена) Тогда + + НовыйУзел.РегистрироватьИзменения = Истина; + + КонецЕсли; + + НовыйУзел.ОбменДанными.Загрузка = Истина; + НовыйУзел.Записать(); + + Возврат НовыйУзел.Ссылка; + +КонецФункции + +Функция НедопустимыеСимволыВИмениПользователяWSПрокси() + + Возврат ":"; + +КонецФункции + +Функция КоличествоЭлементовВТранзакцииВыполняемогоДействия(Действие) + + Если Действие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда + КоличествоЭлементов = КоличествоЭлементовВТранзакцииВыгрузкиДанных(); + Иначе + КоличествоЭлементов = КоличествоЭлементовВТранзакцииЗагрузкиДанных(); + КонецЕсли; + + Возврат КоличествоЭлементов; + +КонецФункции + +Процедура ОтключитьПроверкуДатЗапрета(Отключить = Истина) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); + МодульДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Отключить); + КонецЕсли; + +КонецПроцедуры + Процедура ПроверитьНедопустимыеСимволыВИмениПользователяWSПрокси(Знач ИмяПользователя) НедопустимыеСимволы = НедопустимыеСимволыВИмениПользователяWSПрокси(); @@ -4744,31 +4768,6 @@ КонецПроцедуры -Функция СтрокаСодержитСимвол(Знач Строка, Знач СтрокаСимволов) - - Для Индекс = 1 По СтрДлина(СтрокаСимволов) Цикл - Символ = Сред(СтрокаСимволов, Индекс, 1); - - Если СтрНайти(Строка, Символ) <> 0 Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - -Функция ДопустимыеПрефиксыWSПрокси() - - Результат = Новый Массив(); - - Результат.Добавить("http"); - Результат.Добавить("https"); - - Возврат Результат; - -КонецФункции - Процедура ВыполнитьОбновлениеНастроекОбмена(УзелИнформационнойБазы) Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаСообщениями(УзелИнформационнойБазы) Тогда @@ -4809,7 +4808,23 @@ КонецПроцедуры -#Область ОбщиеПроцедурыМеханизмовКонвертацииДанных +Функция ЭтоТехническийОбъект(Знач ПолноеИмяОбъекта) Экспорт + + Если СтрНайти(ПолноеИмяОбъекта, ВРег("ПланОбмена")) > 0 Тогда + + Для Каждого ИмяПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл + + Если СтрНайти(ПолноеИмяОбъекта, ВРег(ИмяПланаОбмена)) Тогда + Возврат Истина; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Возврат Ложь; + +КонецФункции Процедура ВыполнитьОтложенноеПроведениеДокументов( ДокументыДляОтложенногоПроведения, @@ -5024,6 +5039,68 @@ КонецПроцедуры +Процедура ЗаблокироватьУзелОбмена(УзелОбмена, Отказ) Экспорт + + Попытка + + ЗаблокироватьДанныеДляРедактирования(УзелОбмена); + + Исключение + + Отказ = Истина; + + ШаблонСообщения = НСтр("ru = 'Не удалось заблокировать узел плана обмена [%1]. + |Вероятно, обмен данными уже выполняется. Повторите попытку позже.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, УзелОбмена); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка, + УзелОбмена.Метаданные(), УзелОбмена, СообщениеОбОшибке); + + ВызватьИсключение СообщениеОбОшибке; + + КонецПопытки; + +КонецПроцедуры + +Процедура ПередВыполнениемОбменов(УзелИнформационнойБазы, Отказ) Экспорт + + ПроверитьВозможностьВыполненияОбменов(); + + ПроверитьИспользованиеОбменаДанными(); + +КонецПроцедуры + +Процедура ПослеВыполненияОбменов(УзелИнформационнойБазы, Отказ) Экспорт + + РазблокироватьУзелОбмена(УзелИнформационнойБазы, Отказ); + +КонецПроцедуры + +Процедура РазблокироватьУзелОбмена(УзелОбмена, Отказ) Экспорт + + Попытка + + РазблокироватьДанныеДляРедактирования(УзелОбмена); + + Исключение + + Отказ = Истина; + + ШаблонСообщения = НСтр("ru = 'Не удалось разблокировать узел плана обмена [%1]. + |Вероятно, обмен данными уже выполняется. Повторите попытку позже.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, УзелОбмена); + + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка, + УзелОбмена.Метаданные(), УзелОбмена, СообщениеОбОшибке); + + ВызватьИсключение СообщениеОбОшибке; + + КонецПопытки; + +КонецПроцедуры + #КонецОбласти #Область ОбновлениеИнформационнойБазы @@ -5166,202 +5243,7 @@ #КонецОбласти -#Область ВыполнениеОбменаДанными - -// Выполняет процесс обмена данными отдельно для каждой строки настройки обмена. -// Процесс обмена данными состоит из двух стадий: -// - инициализация обмена - подготовка подсистемы обмена данными к процессу обмена -// - обмен данными - процесс зачитывания файла сообщения с последующей загрузкой этих данных в ИБ -// или выгрузки изменений в файл сообщения. -// Стадия инициализации выполняется один раз за сеанс и сохраняется в кэше сеанса на сервере -// до перезапуска сеанса или сброса повторно-используемых значений подсистемы обмена данными. -// Сброс повторно-используемых значений происходит при изменении данных, влияющих на процесс обмена данными -// (настройки транспорта, настройка выполнения обмена, настройка отборов на узлах планов обмена). -// -// Обмен может быть выполнен полностью для всех строк сценария, -// а может быть выполнен для отдельной строки ТЧ сценария обмена. -// -// Параметры: -// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки при выполнении сценария. -// НастройкаВыполненияОбмена - СправочникСсылка.СценарииОбменовДанными - элемент справочника, -// по значениям реквизитов которого будет выполнен обмен данными. -// НомерСтроки - Число - номер строки по которой будет выполнен обмен данными. -// Если не указан, то обмен данными будет выполнен для всех строк. -// -Процедура ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Отказ, НастройкаВыполненияОбмена, НомерСтроки = Неопределено) Экспорт - - ПроверитьВозможностьВыполненияОбменов(); - - ПроверитьИспользованиеОбменаДанными(); - - УстановитьПривилегированныйРежим(Истина); - - ТекстЗапроса = " - |ВЫБРАТЬ - | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка КАК НастройкаВыполненияОбмена, - | НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки КАК НомерСтроки, - | НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие КАК ВыполняемоеДействие, - | НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена КАК ВидТранспортаОбмена, - | НастройкиВыполненияОбменаНастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, - | - | ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.COM) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ОбменЧерезВнешнееСоединение, - | - | ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.WS) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ОбменЧерезВебСервис, - | - | ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.ВнешняяСистема) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ОбменСВнешнейСистемой - |ИЗ - | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиВыполненияОбменаНастройкиОбмена - |ГДЕ - | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка = &НастройкаВыполненияОбмена - | И &УсловиеПоНомеруСтроки - |УПОРЯДОЧИТЬ ПО - | НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки - |"; - - УсловиеПоНомеруСтроки = ?(НомерСтроки = Неопределено, "", "И НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки = &НомерСтроки"); - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПоНомеруСтроки", УсловиеПоНомеруСтроки); - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("НастройкаВыполненияОбмена", НастройкаВыполненияОбмена); - Запрос.УстановитьПараметр("НомерСтроки", НомерСтроки); - - Выборка = Запрос.Выполнить().Выбрать(); - - ЭтоПодчиненныйУзелРИБТребующийУстановкиОбновления = - ЭтоПодчиненныйУзелРИБ() И ТребуетсяУстановкаОбновления(); - - Пока Выборка.Следующий() Цикл - ОтказПоСтрокеСценария = Ложь; - Если ЭтоПодчиненныйУзелРИБТребующийУстановкиОбновления - И ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Выборка.УзелИнформационнойБазы) Тогда - // Обмен по расписанию не выполняется. - Продолжить; - ИначеЕсли Не НастройкаСинхронизацииЗавершена(Выборка.УзелИнформационнойБазы) - И Не Выборка.ОбменСВнешнейСистемой Тогда - Продолжить; - КонецЕсли; - - ОтказБлокировки = Ложь; - ПроверитьВозможностьЗапускаОбмена(Выборка.УзелИнформационнойБазы, ОтказБлокировки); - Если ОтказБлокировки Тогда - Продолжить; - КонецЕсли; - - Если Выборка.ОбменЧерезВнешнееСоединение Тогда - - ПроверитьВозможностьВнешнегоСоединения(); - - КоличествоЭлементовВТранзакции = КоличествоЭлементовВТранзакцииВыполняемогоДействия(Выборка.ВыполняемоеДействие); - - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(ОтказПоСтрокеСценария, - Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, КоличествоЭлементовВТранзакции); - - ИначеЕсли Выборка.ОбменЧерезВебСервис Тогда - - ПараметрыОбмена = ПараметрыОбмена(); - ПараметрыОбмена.ДлительнаяОперацияРазрешена = Истина; - ПараметрыОбмена.ИнтервалОжиданияНаСервере = 30; - - ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(ОтказПоСтрокеСценария, - Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, ПараметрыОбмена); - - Иначе - - // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ - СтруктураНастроекОбмена = НастройкиОбменаДанными(Выборка.НастройкаВыполненияОбмена, Выборка.НомерСтроки); - - // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". - Если СтруктураНастроекОбмена.Отказ Тогда - - ОтказПоСтрокеСценария = Истина; - - // Фиксируем в ЖР лог по обмену данными. - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Продолжить; - КонецЕсли; - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; - - // Добавляем в ЖР информацию о процессе обмена данными. - СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными по настройке %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.НастройкаВыполненияОбменаНаименование); - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); - - // ОБМЕН ДАННЫМИ - ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена); - - // Фиксируем в ЖР лог по обмену данными. - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - - Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - - ОтказПоСтрокеСценария = Истина; - - КонецЕсли; - - КонецЕсли; - Если ОтказПоСтрокеСценария Тогда - Отказ = Истина; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Точка входа для выполнения обмена данными по сценарию обмена регламентным заданием. -// -// Параметры: -// КодСценарияОбмена - Строка - код элемента справочника "Сценарии обменов данными", для которого будет выполнен обмен -// данными. -// -Процедура ВыполнитьОбменДаннымиПоРегламентномуЗаданию(КодСценарияОбмена) Экспорт - - ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СинхронизацияДанных); - - ПроверитьВозможностьВыполненияОбменов(); - - ПроверитьИспользованиеОбменаДанными(); - - Если Не ЗначениеЗаполнено(КодСценарияОбмена) Тогда - ВызватьИсключение НСтр("ru = 'Не задан сценарий обмена данными.'"); - КонецЕсли; - - ТекстЗапроса = " - |ВЫБРАТЬ - | СценарииОбменовДанными.Ссылка КАК Ссылка - |ИЗ - | Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными - |ГДЕ - | СценарииОбменовДанными.Код = &Код - | И НЕ СценарииОбменовДанными.ПометкаУдаления - |"; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Код", КодСценарияОбмена); - Запрос.Текст = ТекстЗапроса; - - Выборка = Запрос.Выполнить().Выбрать(); - - Если Выборка.Следующий() Тогда - // Выполняем обмен по сценарию. - ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Ложь, Выборка.Ссылка); - Иначе - СтрокаСообщения = НСтр("ru = 'Сценарий обмена данными с кодом %1 не найден.'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, КодСценарияОбмена); - ВызватьИсключение СтрокаСообщения; - КонецЕсли; - -КонецПроцедуры +#Область СообщенияОбменов // Получает сообщение обмена во временный каталог пользователя ОС. // @@ -5768,76 +5650,6 @@ Возврат Результат; КонецФункции -// Выполняет получение файла сообщения обмена из базы-корреспондента через веб-сервис. -// Выполняет загрузку полученного файла сообщения обмена в эту базу. -// -// Параметры: -// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки. -// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется получение сообщения обмена. -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла. -// ДатаНачалаОперации - Дата - дата начала загрузки. -// ПараметрыАутентификации - Структура - содержит параметры аутентификации на веб-сервисе (Пользователь, Пароль). -// -Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЗавершениеДлительнойОперации( - Отказ, - Знач УзелИнформационнойБазы, - Знач ИдентификаторФайла, - Знач ДатаНачалаОперации, - Знач ПараметрыАутентификации = Неопределено, - ВыдаватьОшибку = Ложь) Экспорт - - ПроверитьВозможностьВыполненияОбменов(); - - ПроверитьИспользованиеОбменаДанными(); - - УстановитьПривилегированныйРежим(Истина); - - Попытка - ФайлСообщенияОбмена = ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), УзелИнформационнойБазы,, ПараметрыАутентификации); - Исключение - ЗафиксироватьЗавершениеОбменаСОшибкой(УзелИнформационнойБазы, - Перечисления.ДействияПриОбмене.ЗагрузкаДанных, - ДатаНачалаОперации, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Если ВыдаватьОшибку Тогда - ВызватьИсключение; - Иначе - Отказ = Истина; - КонецЕсли; - Возврат; - КонецПопытки; - - // Загрузка файла сообщения обмена в эту базу. - ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); - - ПараметрыОбменаДанными.УзелИнформационнойБазы = УзелИнформационнойБазы; - ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ФайлСообщенияОбмена; - ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; - ПараметрыОбменаДанными.ДатаНачалаОперации = ДатаНачалаОперации; - - Попытка - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); - Исключение - ЗафиксироватьЗавершениеОбменаСОшибкой(УзелИнформационнойБазы, - Перечисления.ДействияПриОбмене.ЗагрузкаДанных, - ДатаНачалаОперации, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - Если ВыдаватьОшибку Тогда - ВызватьИсключение; - Иначе - Отказ = Истина; - КонецЕсли; - КонецПопытки; - - Попытка - УдалитьФайлы(ФайлСообщенияОбмена); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - -КонецПроцедуры - // Выполняет удаление файлов сообщений обмена, которые не были удалены из-за сбоев в работе системы. // Удалению подлежат файлы обмена с датой размещения более суток от текущей универсальной даты, // и файлы для сопоставления с датой размещения более 7 суток от текущей универсальной даты. @@ -5942,18 +5754,6 @@ КонецПроцедуры -Функция КоличествоЭлементовВТранзакцииВыполняемогоДействия(Действие) - - Если Действие = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда - КоличествоЭлементов = КоличествоЭлементовВТранзакцииВыгрузкиДанных(); - Иначе - КоличествоЭлементов = КоличествоЭлементовВТранзакцииЗагрузкиДанных(); - КонецЕсли; - - Возврат КоличествоЭлементов; - -КонецФункции - // Выполняет выгрузку сообщения обмена, которое содержало // изменения конфигурации, до обновления информационной базы. // @@ -6359,784 +6159,6 @@ КонецФункции -Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, - УзелИнформационнойБазы, ДействиеПриОбмене, ПараметрыОбмена) - - ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; - - УстановитьПривилегированныйРежим(Истина); - - // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ - СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы( - УзелИнформационнойБазы, ДействиеПриОбмене, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); - ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.Отказ Тогда - // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - КонецЕсли; - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; - - СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда - - Если СтруктураНастроекОбмена.ИспользоватьПередачуБольшогоОбъемаДанных Тогда - - // {Обработчик: ПередЧтениемСообщенияОбмена} Начало - ФайлСообщенияОбмена = ""; - СтандартнаяОбработка = Истина; - - ПередЧтениемСообщенияОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы, ФайлСообщенияОбмена, СтандартнаяОбработка); - // {Обработчик: ПередЧтениемСообщенияОбмена} Окончание - - Если СтандартнаяОбработка Тогда - - Прокси = Неопределено; - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); - - СостояниеНастройки = Неопределено; - СообщениеОбОшибке = ""; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); - - Если Отказ Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - ФайлСообщенияОбмена = ""; - - Попытка - Прокси.UploadData(СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - ПараметрыОбмена.ИдентификаторФайла, - ПараметрыОбмена.ДлительнаяОперация, - ПараметрыОбмена.ИдентификаторОперации, - ПараметрыОбмена.ДлительнаяОперацияРазрешена); - - Если ПараметрыОбмена.ДлительнаяОперация Тогда - Если ПараметрыОбмена.ИнтервалОжиданияНаСервере > 0 Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда - МодульОбщегоНазначенияБТС = ОбщегоНазначения.ОбщийМодуль("ОбщегоНазначенияБТС"); - - Пока ПараметрыОбмена.ДлительнаяОперация Цикл - МодульОбщегоНазначенияБТС.Пауза(ПараметрыОбмена.ИнтервалОжиданияНаСервере); - - СтрокаСообщенияОбОшибке = ""; - СостояниеОперации = Прокси.GetContinuousOperationStatus(ПараметрыОбмена.ИдентификаторОперации, СтрокаСообщенияОбОшибке); - - Если СостояниеОперации = "Active" Тогда - - ПараметрыОбмена.ИнтервалОжиданияНаСервере = Мин(ПараметрыОбмена.ИнтервалОжиданияНаСервере + 30, 180); - Продолжить; - - ИначеЕсли СостояниеОперации <> "Completed" Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка в базе-корреспонденте: %1'"), - СтрокаСообщенияОбОшибке); - Иначе - ПараметрыОбмена.ДлительнаяОперация = Ложь; - КонецЕсли; - КонецЦикла; - Иначе - ВызватьИсключение НСтр("ru = 'Запуск асинхронной операции на сервере без подсистемы ""ТехнологияСервиса.БазоваяФункциональность"" не поддерживается.'"); - КонецЕсли; - Иначе - ЗаписьЖурналаРегистрацииОбменаДанными(НСтр("ru = 'Ожидание получения данных от базы-корреспондента...'", - ОбщегоНазначения.КодОсновногоЯзыка()), СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - КонецЕсли; - - ФайлСообщенияОбмена = ПолучитьФайлИзХранилищаВСервисе( - Новый УникальныйИдентификатор(ПараметрыОбмена.ИдентификаторФайла), - УзелИнформационнойБазы,, - ПараметрыОбмена.ПараметрыАутентификации); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - Отказ = Истина; - КонецПопытки; - - КонецЕсли; - - Если Не Отказ Тогда - - ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена,, ТолькоПараметры); - - КонецЕсли; - - // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало - СтандартнаяОбработка = Истина; - - ПослеЧтенияСообщенияОбмена( - СтруктураНастроекОбмена.УзелИнформационнойБазы, - ФайлСообщенияОбмена, - РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), - СтандартнаяОбработка, - Не ТолькоПараметры); - // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание - - Если СтандартнаяОбработка Тогда - - Попытка - Если Не ПустаяСтрока(ФайлСообщенияОбмена) И ТипЗнч(СообщениеОбменаДаннымиИзГлавногоУзла()) <> Тип("Структура") Тогда - УдалитьФайлы(ФайлСообщенияОбмена); - КонецЕсли; - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - КонецЕсли; - - Иначе - - Прокси = Неопределено; - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); - - СостояниеНастройки = Неопределено; - СообщениеОбОшибке = ""; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); - - Если Отказ Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - ХранилищеСообщенияОбмена = Неопределено; - Попытка - Прокси.Upload(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, ХранилищеСообщенияОбмена); - ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена,, ХранилищеСообщенияОбмена.Получить()); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - КонецПопытки; - - КонецЕсли; - - ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда - - Прокси = Неопределено; - - ПараметрыПрокси = Новый Структура; - ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); - Если ПараметрыОбмена.СообщениеДляСопоставленияДанных Тогда - ПараметрыПрокси.Вставить("МинимальнаяВерсия", "3.0.1.1"); - КонецЕсли; - - СостояниеНастройки = Неопределено; - СообщениеОбОшибке = ""; - ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); - - Если Отказ Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - Если СтруктураНастроекОбмена.ИспользоватьПередачуБольшогоОбъемаДанных Тогда - - ВременныйКаталог = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ВременныйКаталог); - - ФайлСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - ВременныйКаталог, УникальноеИмяФайлаСообщенияОбмена()); - - Попытка - ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - Отказ = Истина; - КонецПопытки; - - // Отправка сообщения обмена только в случае успешной выгрузки данных. - Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) И Не Отказ Тогда - - Попытка - - ИдентификаторФайлаСтрокой = Строка(ПоместитьФайлВХранилищеВСервисе( - ФайлСообщенияОбмена, УзелИнформационнойБазы,, ПараметрыОбмена.ПараметрыАутентификации)); - - Попытка - УдалитьФайлы(ВременныйКаталог); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Если ПараметрыОбмена.СообщениеДляСопоставленияДанных - И (СостояниеНастройки.ПоддерживаетсяСопоставлениеДанных - Или Не СостояниеНастройки.НастройкаСинхронизацииДанныхЗавершена) Тогда - Прокси.PutMessageForDataMatching(СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - ИдентификаторФайлаСтрокой); - Иначе - Прокси.DownloadData(СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - ИдентификаторФайлаСтрокой, - ПараметрыОбмена.ДлительнаяОперация, - ПараметрыОбмена.ИдентификаторОперации, - ПараметрыОбмена.ДлительнаяОперацияРазрешена); - - Если ПараметрыОбмена.ДлительнаяОперация Тогда - Если ПараметрыОбмена.ИнтервалОжиданияНаСервере > 0 Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда - МодульОбщегоНазначенияБТС = ОбщегоНазначения.ОбщийМодуль("ОбщегоНазначенияБТС"); - - Пока ПараметрыОбмена.ДлительнаяОперация Цикл - МодульОбщегоНазначенияБТС.Пауза(ПараметрыОбмена.ИнтервалОжиданияНаСервере); - - СтрокаСообщенияОбОшибке = ""; - СостояниеОперации = Прокси.GetContinuousOperationStatus(ПараметрыОбмена.ИдентификаторОперации, СтрокаСообщенияОбОшибке); - - Если СостояниеОперации = "Active" Тогда - Продолжить; - ИначеЕсли СостояниеОперации <> "Completed" Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка в базе-корреспонденте: %1'"), - СтрокаСообщенияОбОшибке); - Иначе - ПараметрыОбмена.ДлительнаяОперация = Ложь; - КонецЕсли; - КонецЦикла; - Иначе - ВызватьИсключение НСтр("ru = 'Запуск асинхронной операции на сервере без подсистемы ""ТехнологияСервиса.БазоваяФункциональность"" не поддерживается.'"); - КонецЕсли; - Иначе - ЗаписьЖурналаРегистрацииОбменаДанными(НСтр("ru = 'Ожидание загрузки данных в базе-корреспонденте...'", - ОбщегоНазначения.КодОсновногоЯзыка()), СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - Отказ = Истина; - КонецПопытки; - - КонецЕсли; - - Попытка - УдалитьФайлы(ВременныйКаталог); - Исключение - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), - УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Иначе - - СообщениеОбмена = ""; - - Попытка - - ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена,, СообщениеОбмена); - - // Отправка сообщения обмена только в случае успешной выгрузки данных. - Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - - Прокси.Download(СтруктураНастроекОбмена.ИмяПланаОбмена, - СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, - Новый ХранилищеЗначения(СообщениеОбмена, Новый СжатиеДанных(9))); - - КонецЕсли; - - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; - КонецПопытки; - - КонецЕсли; - - КонецЕсли; - - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - - Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - Отказ = Истина; - КонецЕсли; - -КонецПроцедуры - -Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, УзелИнформационнойБазы, - ДействиеПриОбмене, - КоличествоЭлементовВТранзакции, - СообщениеДляСопоставленияДанных = Ложь) - - УстановитьПривилегированныйРежим(Истина); - - // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ - СтруктураНастроекОбмена = НастройкиОбменаДляВнешнегоСоединения( - УзелИнформационнойБазы, - ДействиеПриОбмене, - КоличествоЭлементовВТранзакции); - - ЗаписьЖурналаРегистрацииНачалаОбменаДанными(СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.Отказ Тогда - // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - КонецЕсли; - - СтрокаСообщенияОбОшибке = ""; - - // Получаем внешнее соединение для узла информационной базы. - ВнешнееСоединение = ОбменДаннымиПовтИсп.ПолучитьВнешнееСоединениеДляУзлаИнформационнойБазы( - УзелИнформационнойБазы, - СтрокаСообщенияОбОшибке); - - Если ВнешнееСоединение = Неопределено Тогда - - // добавляем запись в ЖР - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); - - // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - КонецЕсли; - - // Получаем версию удаленной базы. - ВерсияБСППоВнешнемуСоединению = ВнешнееСоединение.СтандартныеПодсистемыСервер.ВерсияБиблиотеки(); - ОбменСБСП20 = ОбщегоНазначенияКлиентСервер.СравнитьВерсии("2.1.1.10", ВерсияБСППоВнешнемуСоединению) > 0; - - // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ (ВНЕШНЕЕ СОЕДИНЕНИЕ) - Структура = Новый Структура("ИмяПланаОбмена, ТекущийУзелПланаОбменаКод, КоличествоЭлементовВТранзакции"); - ЗаполнитьЗначенияСвойств(Структура, СтруктураНастроекОбмена); - - // Выполняем реверс значений перечисления. - ДействиеПриОбменеСтрокой = ?(ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных, - ОбщегоНазначения.ИмяЗначенияПеречисления(Перечисления.ДействияПриОбмене.ЗагрузкаДанных), - ОбщегоНазначения.ИмяЗначенияПеречисления(Перечисления.ДействияПриОбмене.ВыгрузкаДанных)); - // - - Структура.Вставить("ДействиеПриОбменеСтрокой", ДействиеПриОбменеСтрокой); - Структура.Вставить("РежимОтладки", Ложь); - Структура.Вставить("ИмяФайлаПротоколаОбмена", ""); - - ЭтоПланОбменаXDTO = ЭтоПланОбменаXDTO(УзелИнформационнойБазы); - Если ЭтоПланОбменаXDTO Тогда - // Проверка псевдонима предопределенного узла - ПсевдонимПредопределенногоУзла = ПсевдонимПредопределенногоУзла(УзелИнформационнойБазы); - ПланОбменаМенеджер = ВнешнееСоединение.ПланыОбмена[Структура.ИмяПланаОбмена]; - ПроверятьНаличиеУзлаВКорреспонденте = Истина; - Если ЗначениеЗаполнено(ПсевдонимПредопределенногоУзла) Тогда - // Надо проверить код узла в корреспонденте - он может быть уже перекодирован. - // Тогда псевдоним больше не нужен. - Если ПланОбменаМенеджер.НайтиПоКоду(ПсевдонимПредопределенногоУзла) <> ПланОбменаМенеджер.ПустаяСсылка() Тогда - Структура.ТекущийУзелПланаОбменаКод = ПсевдонимПредопределенногоУзла; - ПроверятьНаличиеУзлаВКорреспонденте = Ложь; - КонецЕсли; - КонецЕсли; - Если ПроверятьНаличиеУзлаВКорреспонденте Тогда - ПланОбменаСсылка = ПланОбменаМенеджер.НайтиПоКоду(Структура.ТекущийУзелПланаОбменаКод); - Если НЕ ЗначениеЗаполнено(ПланОбменаСсылка.Code) Тогда - // При необходимости запуск перехода на синхронизацию данных через универсальный формат. - ТекстСообщения = НСтр("ru = 'Необходим переход на синхронизацию данных через универсальный формат в базе-корреспонденте.'"); - ЗаписьЖурналаРегистрацииОбменаДанными(ТекстСообщения, СтруктураНастроекОбмена, Ложь); - - СтруктураПараметров = Новый Структура(); - СтруктураПараметров.Вставить("Код", Структура.ТекущийУзелПланаОбменаКод); - СтруктураПараметров.Вставить("ВариантНастройки", - ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелИнформационнойБазы, "ВариантНастройки")); - СтруктураПараметров.Вставить("Ошибка", Ложь); - СтруктураПараметров.Вставить("СообщениеОбОшибке", ""); - - ЕстьОшибки = Ложь; - СтрокаСообщенияОбОшибке = ""; - РезультатПерехода = - ПланОбменаМенеджер.ПереходНаСинхронизациюЧерезУниверсальныйФорматВнешнееСоединение(СтруктураПараметров); - Если СтруктураПараметров.Ошибка Тогда - ЕстьОшибки = Истина; - НСтрока = НСтр("ru = 'Ошибка при переходе на синхронизацию данных через универсальный формат: %1. Обмен отменен.'", - ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, - СтруктураПараметров.СообщениеОбОшибке); - ИначеЕсли РезультатПерехода = Неопределено Тогда - ЕстьОшибки = Истина; - СтрокаСообщенияОбОшибке = НСтр("ru = 'Переход на синхронизацию данных через универсальный формат не выполнен'"); - КонецЕсли; - Если ЕстьОшибки Тогда - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - Иначе - Сообщение = НСтр("ru = 'Переход на синхронизацию данных через универсальный формат завершен успешно.'"); - ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Ложь); - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Попытка - СтруктураНастроекОбменаВнешнееСоединение = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.СтруктураНастроекОбмена(Структура); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - КонецПопытки; - - Если СтруктураНастроекОбменаВнешнееСоединение.Свойство("НастройкаСинхронизацииДанныхЗавершена") Тогда - Если Не СообщениеДляСопоставленияДанных - И СтруктураНастроекОбменаВнешнееСоединение.НастройкаСинхронизацииДанныхЗавершена = Ложь Тогда - - СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для продолжения необходимо перейти в программу ""%1"" и завершить в ней настройку синхронизации. - |Выполнение обмена данными отменено.'"), - СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазыНаименование); - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - - КонецЕсли; - КонецЕсли; - - Если СтруктураНастроекОбменаВнешнееСоединение.Свойство("ПолученоСообщениеДляСопоставленияДанных") Тогда - Если Не СообщениеДляСопоставленияДанных - И СтруктураНастроекОбменаВнешнееСоединение.ПолученоСообщениеДляСопоставленияДанных = Истина Тогда - - СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для продолжения необходимо перейти в программу ""%1"" и выполнить загрузку сообщения для сопоставления данных. - |Выполнение обмена данными отменено.'"), - СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазыНаименование); - ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - - КонецЕсли; - КонецЕсли; - - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; - СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДатаНачала", ВнешнееСоединение.ТекущаяДатаСеанса()); - - ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ЗаписьЖурналаРегистрацииНачалаОбменаДанными(СтруктураНастроекОбменаВнешнееСоединение); - // ОБМЕН ДАННЫМИ - Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда - Если НЕ ЭтоПланОбменаXDTO Тогда - // Получаем правила обмена из второй ИБ. - ПравилаКонвертацииОбъектов = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПравилаКонвертацииОбъектов(СтруктураНастроекОбменаВнешнееСоединение.ИмяПланаОбмена); - - Если ПравилаКонвертацииОбъектов = Неопределено Тогда - - // Правила обмена должны быть указаны. - НСтрока = НСтр("ru = 'Не заданы правила конвертации во второй информационной базе для плана обмена %1. Обмен отменен.'", - ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, СтруктураНастроекОбменаВнешнееСоединение.ИмяПланаОбмена); - ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); - ЗафиксироватьЗавершениеИнициализацииОбмена(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - КонецЕсли; - - // Обработка для загрузки данных. - ОбработкаДляЗагрузкиДанных = СтруктураНастроекОбмена.ОбработкаОбменаДанными; - ОбработкаДляЗагрузкиДанных.ИмяФайлаОбмена = ""; - ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию = СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции; - ОбработкаДляЗагрузкиДанных.ИспользоватьТранзакции = (ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию <> 1); - ОбработкаДляЗагрузкиДанных.ЗагрузкаДанныхВыполняетсяЧерезВнешнееСоединение = Истина; - - // Получаем инициализированную обработку для выгрузки данных. - Если ЭтоПланОбменаXDTO Тогда - ОбработкаОбменаДаннымиВнешнееСоединение = ВнешнееСоединение.Обработки.КонвертацияОбъектовXDTO.Создать(); - ОбработкаОбменаДаннымиВнешнееСоединение.РежимОбмена = "Выгрузка"; - Иначе - ОбработкаОбменаДаннымиВнешнееСоединение = ВнешнееСоединение.Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); - ОбработкаОбменаДаннымиВнешнееСоединение.СохраненныеНастройки = ПравилаКонвертацииОбъектов; - ОбработкаОбменаДаннымиВнешнееСоединение.ЗагрузкаДанныхВыполняетсяВоВнешнемСоединении = Ложь; - ОбработкаОбменаДаннымиВнешнееСоединение.РежимОбмена = "Выгрузка"; - Попытка - ОбработкаОбменаДаннымиВнешнееСоединение.ВосстановитьПравилаИзВнутреннегоФормата(); - Исключение - ЗаписьЖурналаРегистрацииОбменаДанными( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Возникла ошибка во второй информационной базе: %1'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())), СтруктураНастроекОбмена, Истина); - - // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". - СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Отказ = Истина; - Возврат; - КонецПопытки; - // Задаем узлы обмена. - ОбработкаОбменаДаннымиВнешнееСоединение.УзелДляФоновогоОбмена = Неопределено; - ОбработкаОбменаДаннымиВнешнееСоединение.НеВыгружатьОбъектыПоСсылкам = Истина; - ОбработкаОбменаДаннымиВнешнееСоединение.ИмяФайлаПравилОбмена = "1"; - ОбработкаОбменаДаннымиВнешнееСоединение.ВнешнееСоединение = Неопределено; - КонецЕсли; - - // Задаем узлы обмена (общие для любого вида обмена). - ОбработкаОбменаДаннымиВнешнееСоединение.УзелДляОбмена = СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазы; - - УстановитьОбщиеПараметрыДляОбработкиОбменаДанными(ОбработкаОбменаДаннымиВнешнееСоединение, СтруктураНастроекОбменаВнешнееСоединение, ОбменСБСП20); - - Если НЕ ЭтоПланОбменаXDTO Тогда - ВерсияКонфигурацииПриемника = ""; - ВерсияИсточникаИзПравил = ""; - ТекстСообщения = ""; - ПараметрыВнешнегоСоединения = Новый Структура; - ПараметрыВнешнегоСоединения.Вставить("ВнешнееСоединение", ВнешнееСоединение); - ПараметрыВнешнегоСоединения.Вставить("ВерсияБСППоВнешнемуСоединению", ВерсияБСППоВнешнемуСоединению); - ПараметрыВнешнегоСоединения.Вставить("КлючСообщенияЖурналаРегистрации", СтруктураНастроекОбменаВнешнееСоединение.КлючСообщенияЖурналаРегистрации); - ПараметрыВнешнегоСоединения.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазы); - - ПравилаКонвертацииОбъектов.Получить().Конвертация.Свойство("ВерсияКонфигурацииИсточника", ВерсияКонфигурацииПриемника); - ОбработкаДляЗагрузкиДанных.СохраненныеНастройки.Получить().Конвертация.Свойство("ВерсияКонфигурацииИсточника", ВерсияИсточникаИзПравил); - - Если РазличаютсяВерсииКорреспондента(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, - ВерсияИсточникаИзПравил, ВерсияКонфигурацииПриемника, ТекстСообщения, ПараметрыВнешнегоСоединения) Тогда - - ОбработкаОбменаДаннымиВнешнееСоединение = Неопределено; - Возврат; - - КонецЕсли; - КонецЕсли; - // ВЫГРУЗКА (КОРРЕСПОНДЕНТ) - ЗАГРУЗКА (ЭТА БАЗА) - ОбработкаОбменаДаннымиВнешнееСоединение.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных); - - // Фиксируем состояние выполнения обмена данными. - СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаДляЗагрузкиДанных.РезультатВыполненияОбмена(); - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаДляЗагрузкиДанных.СчетчикЗагруженныхОбъектов(); - СтруктураНастроекОбменаВнешнееСоединение.РезультатВыполненияОбменаСтрокой = ОбработкаОбменаДаннымиВнешнееСоединение.РезультатВыполненияОбменаСтрокой(); - СтруктураНастроекОбменаВнешнееСоединение.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиВнешнееСоединение.СчетчикВыгруженныхОбъектов(); - СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаДляЗагрузкиДанных.КомментарийПриЗагрузкеДанных; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаДляЗагрузкиДанных.СтрокаСообщенияОбОшибке(); - СтруктураНастроекОбменаВнешнееСоединение.СообщениеПриОбмене = ОбработкаОбменаДаннымиВнешнееСоединение.КомментарийПриВыгрузкеДанных; - СтруктураНастроекОбменаВнешнееСоединение.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиВнешнееСоединение.СтрокаСообщенияОбОшибке(); - - ОбработкаОбменаДаннымиВнешнееСоединение = Неопределено; - - ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда - - // Обработка для загрузки данных. - Если ЭтоПланОбменаXDTO Тогда - ОбработкаДляЗагрузкиДанных = ВнешнееСоединение.Обработки.КонвертацияОбъектовXDTO.Создать(); - Иначе - ОбработкаДляЗагрузкиДанных = ВнешнееСоединение.Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); - ОбработкаДляЗагрузкиДанных.ЗагрузкаДанныхВыполняетсяЧерезВнешнееСоединение = Истина; - КонецЕсли; - ОбработкаДляЗагрузкиДанных.РежимОбмена = "Загрузка"; - ОбработкаДляЗагрузкиДанных.УзелОбменаЗагрузкаДанных = СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазы; - - УстановитьОбщиеПараметрыДляОбработкиОбменаДанными(ОбработкаДляЗагрузкиДанных, СтруктураНастроекОбменаВнешнееСоединение, ОбменСБСП20); - - ЕстьПоддержкаСопоставления = Истина; - НастройкаСинхронизацииДанныхЗавершена = Истина; - ВерсииИнтерфейса = ВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение); - Если ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда - СообщениеОбОшибке = ""; - ПараметрыИнформационнойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПараметрыИнформационнойБазы_2_0_1_6( - СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, СообщениеОбОшибке); - ПараметрыКорреспондента = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПараметрыИнформационнойБазы); - Если ПараметрыКорреспондента.Свойство("ПоддерживаетсяСопоставлениеДанных") Тогда - ЕстьПоддержкаСопоставления = ПараметрыКорреспондента.ПоддерживаетсяСопоставлениеДанных; - КонецЕсли; - Если ПараметрыКорреспондента.Свойство("НастройкаСинхронизацииДанныхЗавершена") Тогда - НастройкаСинхронизацииДанныхЗавершена = ПараметрыКорреспондента.НастройкаСинхронизацииДанныхЗавершена; - КонецЕсли; - КонецЕсли; - - Если СообщениеДляСопоставленияДанных - И (ЕстьПоддержкаСопоставления Или Не НастройкаСинхронизацииДанныхЗавершена) Тогда - ОбработкаДляЗагрузкиДанных.РежимЗагрузкиДанных = "ЗагрузкаСообщенияДляСопоставленияДанных"; - КонецЕсли; - - ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию = СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции; - ОбработкаДляЗагрузкиДанных.ИспользоватьТранзакции = (ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию <> 1); - - // Получаем инициализированную обработку для выгрузки данных. - ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; - ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = ""; - - Если Не ЭтоПланОбменаXDTO Тогда - - ОбработкаОбменаДаннымиXML.ВнешнееСоединение = ВнешнееСоединение; - ОбработкаОбменаДаннымиXML.ЗагрузкаДанныхВыполняетсяВоВнешнемСоединении = Истина; - - КонецЕсли; - - // ВЫГРУЗКА (ЭТА БАЗА) - ЗАГРУЗКА (КОРРЕСПОНДЕНТ) - ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных); - - // Фиксируем состояние выполнения обмена данными. - СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); - СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикВыгруженныхОбъектов(); - СтруктураНастроекОбменаВнешнееСоединение.РезультатВыполненияОбменаСтрокой = ОбработкаДляЗагрузкиДанных.РезультатВыполненияОбменаСтрокой(); - СтруктураНастроекОбменаВнешнееСоединение.КоличествоОбъектовОбработано = ОбработкаДляЗагрузкиДанных.СчетчикЗагруженныхОбъектов(); - СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриВыгрузкеДанных; - СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); - СтруктураНастроекОбменаВнешнееСоединение.СообщениеПриОбмене = ОбработкаДляЗагрузкиДанных.КомментарийПриЗагрузкеДанных; - СтруктураНастроекОбменаВнешнееСоединение.СтрокаСообщенияОбОшибке = ОбработкаДляЗагрузкиДанных.СтрокаСообщенияОбОшибке(); - ОбработкаДляЗагрузкиДанных = Неопределено; - - КонецЕсли; - - ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - - ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбменаВнешнееСоединение); - - Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - - Отказ = Истина; - - КонецЕсли; - -КонецПроцедуры - -Процедура ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена, Знач ТолькоПараметры = Ложь) - - Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда - - Если СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема Тогда - ВыполнитьОбменДаннымиСВнешнейСистемойЗагрузкаДанных(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - // {Обработчик: ПередЧтениемСообщенияОбмена} Начало - СообщениеОбмена = ""; - СтандартнаяОбработка = Истина; - - ПередЧтениемСообщенияОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы, СообщениеОбмена, СтандартнаяОбработка); - // {Обработчик: ПередЧтениемСообщенияОбмена} Окончание - - Если СтандартнаяОбработка Тогда - - ВыполнитьТранспортСообщенияОбменаПередОбработкой(СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда - - ВыполнитьТранспортСообщенияОбменаПолучение(СтруктураНастроекОбмена); - - Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда - - СообщениеОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена(); - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - // Загрузка данных только при успешном получении сообщения обмена. - Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда - - ЕстьПоддержкаСопоставления = ЗначениеНастройкиПланаОбмена( - ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы), - "ПоддерживаетсяСопоставлениеДанных", - СохраненныйВариантНастройкиУзлаПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы)); - - Если СтруктураНастроекОбмена.ДополнительныеПараметры.Свойство("СообщениеДляСопоставленияДанных") - И (ЕстьПоддержкаСопоставления - Или Не НастройкаСинхронизацииЗавершена(СтруктураНастроекОбмена.УзелИнформационнойБазы)) Тогда - - ИмяФайлаДляПомещенияВХранилище = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - КаталогВременногоХранилищаФайлов(), - УникальноеИмяФайлаСообщенияОбмена()); - - // Сохраняется новое сообщение для сопоставления данных. - ИдентификаторФайла = ПоместитьФайлВХранилище(ИмяФайлаДляПомещенияВХранилище); - ПереместитьФайл(СообщениеОбмена, ИмяФайлаДляПомещенияВХранилище); - - ОбменДаннымиСлужебный.ПоместитьСообщениеДляСопоставленияДанных( - СтруктураНастроекОбмена.УзелИнформационнойБазы, ИдентификаторФайла); - - СтандартнаяОбработка = Истина; - Иначе - - ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СообщениеОбмена, , ТолькоПараметры); - - // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало - СтандартнаяОбработка = Истина; - - ПослеЧтенияСообщенияОбмена( - СтруктураНастроекОбмена.УзелИнформационнойБазы, - СообщениеОбмена, - РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), - СтандартнаяОбработка, - Не ТолькоПараметры); - // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание - - КонецЕсли; - - КонецЕсли; - - // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало - СтандартнаяОбработка = Истина; - - ПослеЧтенияСообщенияОбмена( - СтруктураНастроекОбмена.УзелИнформационнойБазы, - СообщениеОбмена, - РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), - СтандартнаяОбработка, - Не ТолькоПараметры); - // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание - - Если СтандартнаяОбработка Тогда - - ВыполнитьТранспортСообщенияОбменаПослеОбработки(СтруктураНастроекОбмена); - - КонецЕсли; - - ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда - - Если СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема Тогда - ВыполнитьОбменДаннымиСВнешнейСистемойВыгрузкаНастроекXDTO(СтруктураНастроекОбмена); - Возврат; - КонецЕсли; - - ВыполнитьТранспортСообщенияОбменаПередОбработкой(СтруктураНастроекОбмена); - - // выгрузка данных - Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда - - ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена()); - - КонецЕсли; - - // Отправка сообщения обмена только в случае успешной выгрузки данных. - Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда - - ВыполнитьТранспортСообщенияОбменаОтправка(СтруктураНастроекОбмена); - - КонецЕсли; - - ВыполнитьТранспортСообщенияОбменаПослеОбработки(СтруктураНастроекОбмена); - - КонецЕсли; - -КонецПроцедуры - Процедура ПередЧтениемСообщенияОбмена(Знач Получатель, СообщениеОбмена, СтандартнаяОбработка) Если ЭтоПодчиненныйУзелРИБ() @@ -7175,6 +6197,10 @@ Процедура ПослеЧтенияСообщенияОбмена(Знач Получатель, Знач СообщениеОбмена, Знач СообщениеПрочитано, СтандартнаяОбработка, Знач УдалитьСообщение = Истина) + Если ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРасширений") Тогда + Возврат; + КонецЕсли; + Если ЭтоПодчиненныйУзелРИБ() И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда @@ -7187,7 +6213,7 @@ ОбновитьСообщениеВКэше = Ложь; - Если КонфигурацияИзменена() Тогда + Если КонфигурацияИзменена() ИЛИ ОбменДаннымиСлужебный.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных() Тогда // Т.к. конфигурация может быть изменена повторно, требуется // обновить кэш, если он содержит устаревшее сообщение, @@ -12755,8 +11781,6 @@ ПараметрыПрокси.ТекущаяВерсия = ДополнительныеПараметры.ТекущаяВерсия; - УзелСуществует = Ложь; - Если ЭтоПланОбменаXDTO(СтруктураНастроек.ИмяПланаОбмена) Тогда ПсевдонимУзла = ПсевдонимПредопределенногоУзла(СтруктураНастроек.УзелИнформационнойБазы); @@ -13440,20 +12464,6 @@ КонецФункции -// Параметры: -// ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке. -// -Функция КраткоеПредставлениеПервойОшибки(ИнформацияОбОшибке) - - Если ИнформацияОбОшибке.Причина <> Неопределено Тогда - - Возврат КраткоеПредставлениеПервойОшибки(ИнформацияОбОшибке.Причина); - - КонецЕсли; - - Возврат КраткоеПредставлениеОшибки(ИнформацияОбОшибке); -КонецФункции - // Создает временный каталог сообщений обмена. // Фиксирует имя каталога в регистре для последующего его удаления. // @@ -13885,27 +12895,28 @@ ПланыОбменаБСП = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); Если ПланыОбменаБСП.Количество() > 0 Тогда - ТаблицаМонитора = ТаблицаМонитораОбменаДанными(ПланыОбменаБСП); - КоличествоНерассмотренныхПроблем = КоличествоНерассмотренныхПроблем( - ТаблицаМонитора.ВыгрузитьКолонку("УзелИнформационнойБазы")); + ТаблицаМонитора = ТаблицаМонитораОбменаДанными(ПланыОбменаБСП); + СтруктураРезультат = РегистрыСведений.РезультатыОбменаДанными.КоличествоПредупрежденийДляЭлементаФормы(ТаблицаМонитора.ВыгрузитьКолонку("УзелИнформационнойБазы")); + Иначе - КоличествоНерассмотренныхПроблем = 0; + + СтруктураРезультат = Новый Структура("Количество, Заголовок", 0, ""); + КонецЕсли; // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.ОбщиеФормы.СинхронизацияДанных.ПолноеИмя()); + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.ОбщиеФормы.НастройкиСинхронизацииДанных.ПолноеИмя()); Для Каждого Раздел Из Разделы Цикл ИдентификаторПредупрежденияПриСинхронизации = "ПредупрежденияПриСинхронизации" + СтрЗаменить(Раздел.ПолноеИмя(), ".", ""); Дело = ТекущиеДела.Добавить(); Дело.Идентификатор = ИдентификаторПредупрежденияПриСинхронизации; - Дело.ЕстьДела = КоличествоНерассмотренныхПроблем > 0; - Дело.Представление = НСтр("ru = 'Предупреждения при синхронизации'"); - Дело.Количество = КоличествоНерассмотренныхПроблем; - Дело.Форма = "РегистрСведений.РезультатыОбменаДанными.Форма.Форма"; + Дело.ЕстьДела = СтруктураРезультат.Количество > 0; + Дело.Представление = СтруктураРезультат.Заголовок; + Дело.Форма = "РегистрСведений.РезультатыОбменаДанными.Форма.ПредупрежденияСинхронизаций"; Дело.Владелец = Раздел; КонецЦикла; @@ -13925,7 +12936,7 @@ // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь // не делается проверка существования подсистемы. - Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.ОбщиеФормы.СинхронизацияДанных.ПолноеИмя()); + Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.ОбщиеФормы.НастройкиСинхронизацииДанных.ПолноеИмя()); Для Каждого Раздел Из Разделы Цикл @@ -14296,6 +13307,19 @@ КонецФункции +Функция ИмяКаталогаДляСопоставленияФайловаяИБ() Экспорт + + Возврат СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединенияИнформационнойБазы()).File + + ПолучитьРазделительПути() + "TempMessageForDataMatching"; + +КонецФункции + +Функция ПолноеИмяФайлаДляСопоставленияФайловаяИБ(ИмяФайла) Экспорт + + Возврат ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ИмяКаталогаДляСопоставленияФайловаяИБ(), ИмяФайла); + +КонецФункции + #КонецОбласти #Область РаботаСКонстантойСообщениеОбменаИзГлавногоУзла @@ -15099,46 +14123,1152 @@ #КонецОбласти -Функция НовыйУзелОбменаДаннымиXDTO( - ИмяПланаОбмена, - ИдентификаторНастройки, - ИдентификаторКорреспондента, - НаименованиеКорреспондента, - ВерсияФорматаОбмена) +#Область ВыполнениеДействий + +Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, + УзелИнформационнойБазы, ДействиеПриОбмене, ПараметрыОбмена) - МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена]; + ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; - НовыйУзел = МенеджерПланаОбмена.СоздатьУзел(); - НовыйУзел.Код = ИдентификаторКорреспондента; - НовыйУзел.Наименование = НаименованиеКорреспондента; + УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВариантНастройки", Метаданные.ПланыОбмена[ИмяПланаОбмена]) Тогда - НовыйУзел.ВариантНастройки = ИдентификаторНастройки; + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы( + УзелИнформационнойБазы, ДействиеПриОбмене, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь); + ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.Отказ Тогда + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; КонецЕсли; - НовыйУзел.ВерсияФорматаОбмена = ВерсияФорматаОбмена; + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; - НовыйУзел.Заполнить(Неопределено); + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); - Если ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() - И ЭтоРазделенныйПланОбменаБСП(ИмяПланаОбмена) Тогда + Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда - НовыйУзел.РегистрироватьИзменения = Истина; + Если СтруктураНастроекОбмена.ИспользоватьПередачуБольшогоОбъемаДанных Тогда + + // {Обработчик: ПередЧтениемСообщенияОбмена} Начало + ФайлСообщенияОбмена = ""; + СтандартнаяОбработка = Истина; + + ПередЧтениемСообщенияОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы, ФайлСообщенияОбмена, СтандартнаяОбработка); + // {Обработчик: ПередЧтениемСообщенияОбмена} Окончание + + Если СтандартнаяОбработка Тогда + + Прокси = Неопределено; + + ПараметрыПрокси = Новый Структура; + ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); + + СостояниеНастройки = Неопределено; + СообщениеОбОшибке = ""; + ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); + + Если Отказ Тогда + ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + + ФайлСообщенияОбмена = ""; + + Попытка + Прокси.UploadData(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ПараметрыОбмена.ИдентификаторФайла, + ПараметрыОбмена.ДлительнаяОперация, + ПараметрыОбмена.ИдентификаторОперации, + ПараметрыОбмена.ДлительнаяОперацияРазрешена); + + Если ПараметрыОбмена.ДлительнаяОперация Тогда + Если ПараметрыОбмена.ИнтервалОжиданияНаСервере > 0 Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульОбщегоНазначенияБТС = ОбщегоНазначения.ОбщийМодуль("ОбщегоНазначенияБТС"); + + Пока ПараметрыОбмена.ДлительнаяОперация Цикл + МодульОбщегоНазначенияБТС.Пауза(ПараметрыОбмена.ИнтервалОжиданияНаСервере); + + СтрокаСообщенияОбОшибке = ""; + СостояниеОперации = Прокси.GetContinuousOperationStatus(ПараметрыОбмена.ИдентификаторОперации, СтрокаСообщенияОбОшибке); + + Если СостояниеОперации = "Active" Тогда + + ПараметрыОбмена.ИнтервалОжиданияНаСервере = Мин(ПараметрыОбмена.ИнтервалОжиданияНаСервере + 30, 180); + Продолжить; + + ИначеЕсли СостояниеОперации <> "Completed" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в базе-корреспонденте: %1'"), + СтрокаСообщенияОбОшибке); + Иначе + ПараметрыОбмена.ДлительнаяОперация = Ложь; + КонецЕсли; + КонецЦикла; + Иначе + ВызватьИсключение НСтр("ru = 'Запуск асинхронной операции на сервере без подсистемы ""ТехнологияСервиса.БазоваяФункциональность"" не поддерживается.'"); + КонецЕсли; + Иначе + ЗаписьЖурналаРегистрацииОбменаДанными(НСтр("ru = 'Ожидание получения данных от базы-корреспондента...'", + ОбщегоНазначения.КодОсновногоЯзыка()), СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + КонецЕсли; + + ФайлСообщенияОбмена = ПолучитьФайлИзХранилищаВСервисе( + Новый УникальныйИдентификатор(ПараметрыОбмена.ИдентификаторФайла), + УзелИнформационнойБазы,, + ПараметрыОбмена.ПараметрыАутентификации); + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + Отказ = Истина; + КонецПопытки; + + КонецЕсли; + + Если Не Отказ Тогда + + ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена,, ТолькоПараметры); + + КонецЕсли; + + // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало + СтандартнаяОбработка = Истина; + + ПослеЧтенияСообщенияОбмена( + СтруктураНастроекОбмена.УзелИнформационнойБазы, + ФайлСообщенияОбмена, + РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), + СтандартнаяОбработка, + Не ТолькоПараметры); + // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание + + Если СтандартнаяОбработка Тогда + + Попытка + Если Не ПустаяСтрока(ФайлСообщенияОбмена) И ТипЗнч(СообщениеОбменаДаннымиИзГлавногоУзла()) <> Тип("Структура") Тогда + УдалитьФайлы(ФайлСообщенияОбмена); + КонецЕсли; + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + КонецЕсли; + + Иначе + + Прокси = Неопределено; + + ПараметрыПрокси = Новый Структура; + ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); + + СостояниеНастройки = Неопределено; + СообщениеОбОшибке = ""; + ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); + + Если Отказ Тогда + ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + + ХранилищеСообщенияОбмена = Неопределено; + Попытка + Прокси.Upload(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, ХранилищеСообщенияОбмена); + ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена,, ХранилищеСообщенияОбмена.Получить()); + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + КонецПопытки; + + КонецЕсли; + + ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда + + Прокси = Неопределено; + + ПараметрыПрокси = Новый Структура; + ПараметрыПрокси.Вставить("ПараметрыАутентификации", ПараметрыОбмена.ПараметрыАутентификации); + Если ПараметрыОбмена.СообщениеДляСопоставленияДанных Тогда + ПараметрыПрокси.Вставить("МинимальнаяВерсия", "3.0.1.1"); + КонецЕсли; + + СостояниеНастройки = Неопределено; + СообщениеОбОшибке = ""; + ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена, ПараметрыПрокси, Отказ, СостояниеНастройки, СообщениеОбОшибке); + + Если Отказ Тогда + ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + + Если СтруктураНастроекОбмена.ИспользоватьПередачуБольшогоОбъемаДанных Тогда + + ВременныйКаталог = ПолучитьИмяВременногоФайла(); + СоздатьКаталог(ВременныйКаталог); + + ФайлСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ВременныйКаталог, УникальноеИмяФайлаСообщенияОбмена()); + + Попытка + ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена); + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + Отказ = Истина; + КонецПопытки; + + // Отправка сообщения обмена только в случае успешной выгрузки данных. + Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) И Не Отказ Тогда + + Попытка + + ИдентификаторФайлаСтрокой = Строка(ПоместитьФайлВХранилищеВСервисе( + ФайлСообщенияОбмена, УзелИнформационнойБазы,, ПараметрыОбмена.ПараметрыАутентификации)); + + Попытка + УдалитьФайлы(ВременныйКаталог); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Если ПараметрыОбмена.СообщениеДляСопоставленияДанных + И (СостояниеНастройки.ПоддерживаетсяСопоставлениеДанных + Или Не СостояниеНастройки.НастройкаСинхронизацииДанныхЗавершена) Тогда + Прокси.PutMessageForDataMatching(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ИдентификаторФайлаСтрокой); + Иначе + Прокси.DownloadData(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + ИдентификаторФайлаСтрокой, + ПараметрыОбмена.ДлительнаяОперация, + ПараметрыОбмена.ИдентификаторОперации, + ПараметрыОбмена.ДлительнаяОперацияРазрешена); + + Если ПараметрыОбмена.ДлительнаяОперация Тогда + Если ПараметрыОбмена.ИнтервалОжиданияНаСервере > 0 Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульОбщегоНазначенияБТС = ОбщегоНазначения.ОбщийМодуль("ОбщегоНазначенияБТС"); + + Пока ПараметрыОбмена.ДлительнаяОперация Цикл + МодульОбщегоНазначенияБТС.Пауза(ПараметрыОбмена.ИнтервалОжиданияНаСервере); + + СтрокаСообщенияОбОшибке = ""; + СостояниеОперации = Прокси.GetContinuousOperationStatus(ПараметрыОбмена.ИдентификаторОперации, СтрокаСообщенияОбОшибке); + + Если СостояниеОперации = "Active" Тогда + Продолжить; + ИначеЕсли СостояниеОперации <> "Completed" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в базе-корреспонденте: %1'"), + СтрокаСообщенияОбОшибке); + Иначе + ПараметрыОбмена.ДлительнаяОперация = Ложь; + КонецЕсли; + КонецЦикла; + Иначе + ВызватьИсключение НСтр("ru = 'Запуск асинхронной операции на сервере без подсистемы ""ТехнологияСервиса.БазоваяФункциональность"" не поддерживается.'"); + КонецЕсли; + Иначе + ЗаписьЖурналаРегистрацииОбменаДанными(НСтр("ru = 'Ожидание загрузки данных в базе-корреспонденте...'", + ОбщегоНазначения.КодОсновногоЯзыка()), СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + Отказ = Истина; + КонецПопытки; + + КонецЕсли; + + Попытка + УдалитьФайлы(ВременныйКаталог); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Иначе + + СообщениеОбмена = ""; + + Попытка + + ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена,, СообщениеОбмена); + + // Отправка сообщения обмена только в случае успешной выгрузки данных. + Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда + + Прокси.Download(СтруктураНастроекОбмена.ИмяПланаОбмена, + СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, + Новый ХранилищеЗначения(СообщениеОбмена, Новый СжатиеДанных(9))); + + КонецЕсли; + + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; + КонецПопытки; + + КонецЕсли; КонецЕсли; - НовыйУзел.ОбменДанными.Загрузка = Истина; - НовыйУзел.Записать(); + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - Возврат НовыйУзел.Ссылка; + Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда + Отказ = Истина; + КонецЕсли; -КонецФункции +КонецПроцедуры -Функция НедопустимыеСимволыВИмениПользователяWSПрокси() +Процедура ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, УзелИнформационнойБазы, + ДействиеПриОбмене, + КоличествоЭлементовВТранзакции, + СообщениеДляСопоставленияДанных = Ложь) - Возврат ":"; + УстановитьПривилегированныйРежим(Истина); -КонецФункции + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = НастройкиОбменаДляВнешнегоСоединения( + УзелИнформационнойБазы, + ДействиеПриОбмене, + КоличествоЭлементовВТранзакции); + + ЗаписьЖурналаРегистрацииНачалаОбменаДанными(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.Отказ Тогда + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + КонецЕсли; + + СтрокаСообщенияОбОшибке = ""; + + // Получаем внешнее соединение для узла информационной базы. + ВнешнееСоединение = ОбменДаннымиПовтИсп.ПолучитьВнешнееСоединениеДляУзлаИнформационнойБазы( + УзелИнформационнойБазы, + СтрокаСообщенияОбОшибке); + + Если ВнешнееСоединение = Неопределено Тогда + + // добавляем запись в ЖР + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + КонецЕсли; + + // Получаем версию удаленной базы. + ВерсияБСППоВнешнемуСоединению = ВнешнееСоединение.СтандартныеПодсистемыСервер.ВерсияБиблиотеки(); + ОбменСБСП20 = ОбщегоНазначенияКлиентСервер.СравнитьВерсии("2.1.1.10", ВерсияБСППоВнешнемуСоединению) > 0; + + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ (ВНЕШНЕЕ СОЕДИНЕНИЕ) + Структура = Новый Структура("ИмяПланаОбмена, ТекущийУзелПланаОбменаКод, КоличествоЭлементовВТранзакции"); + ЗаполнитьЗначенияСвойств(Структура, СтруктураНастроекОбмена); + + // Выполняем реверс значений перечисления. + ДействиеПриОбменеСтрокой = ?(ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных, + ОбщегоНазначения.ИмяЗначенияПеречисления(Перечисления.ДействияПриОбмене.ЗагрузкаДанных), + ОбщегоНазначения.ИмяЗначенияПеречисления(Перечисления.ДействияПриОбмене.ВыгрузкаДанных)); + // + + Структура.Вставить("ДействиеПриОбменеСтрокой", ДействиеПриОбменеСтрокой); + Структура.Вставить("РежимОтладки", Ложь); + Структура.Вставить("ИмяФайлаПротоколаОбмена", ""); + + ЭтоПланОбменаXDTO = ЭтоПланОбменаXDTO(УзелИнформационнойБазы); + Если ЭтоПланОбменаXDTO Тогда + // Проверка псевдонима предопределенного узла + ПсевдонимПредопределенногоУзла = ПсевдонимПредопределенногоУзла(УзелИнформационнойБазы); + ПланОбменаМенеджер = ВнешнееСоединение.ПланыОбмена[Структура.ИмяПланаОбмена]; + ПроверятьНаличиеУзлаВКорреспонденте = Истина; + Если ЗначениеЗаполнено(ПсевдонимПредопределенногоУзла) Тогда + // Надо проверить код узла в корреспонденте - он может быть уже перекодирован. + // Тогда псевдоним больше не нужен. + Если ПланОбменаМенеджер.НайтиПоКоду(ПсевдонимПредопределенногоУзла) <> ПланОбменаМенеджер.ПустаяСсылка() Тогда + Структура.ТекущийУзелПланаОбменаКод = ПсевдонимПредопределенногоУзла; + ПроверятьНаличиеУзлаВКорреспонденте = Ложь; + КонецЕсли; + КонецЕсли; + Если ПроверятьНаличиеУзлаВКорреспонденте Тогда + ПланОбменаСсылка = ПланОбменаМенеджер.НайтиПоКоду(Структура.ТекущийУзелПланаОбменаКод); + Если НЕ ЗначениеЗаполнено(ПланОбменаСсылка.Code) Тогда + // При необходимости запуск перехода на синхронизацию данных через универсальный формат. + ТекстСообщения = НСтр("ru = 'Необходим переход на синхронизацию данных через универсальный формат в базе-корреспонденте.'"); + ЗаписьЖурналаРегистрацииОбменаДанными(ТекстСообщения, СтруктураНастроекОбмена, Ложь); + + СтруктураПараметров = Новый Структура(); + СтруктураПараметров.Вставить("Код", Структура.ТекущийУзелПланаОбменаКод); + СтруктураПараметров.Вставить("ВариантНастройки", + ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелИнформационнойБазы, "ВариантНастройки")); + СтруктураПараметров.Вставить("Ошибка", Ложь); + СтруктураПараметров.Вставить("СообщениеОбОшибке", ""); + + ЕстьОшибки = Ложь; + СтрокаСообщенияОбОшибке = ""; + РезультатПерехода = + ПланОбменаМенеджер.ПереходНаСинхронизациюЧерезУниверсальныйФорматВнешнееСоединение(СтруктураПараметров); + Если СтруктураПараметров.Ошибка Тогда + ЕстьОшибки = Истина; + НСтрока = НСтр("ru = 'Ошибка при переходе на синхронизацию данных через универсальный формат: %1. Обмен отменен.'", + ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, + СтруктураПараметров.СообщениеОбОшибке); + ИначеЕсли РезультатПерехода = Неопределено Тогда + ЕстьОшибки = Истина; + СтрокаСообщенияОбОшибке = НСтр("ru = 'Переход на синхронизацию данных через универсальный формат не выполнен'"); + КонецЕсли; + Если ЕстьОшибки Тогда + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + Иначе + Сообщение = НСтр("ru = 'Переход на синхронизацию данных через универсальный формат завершен успешно.'"); + ЗаписьЖурналаРегистрацииОбменаДанными(Сообщение, СтруктураНастроекОбмена, Ложь); + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Попытка + СтруктураНастроекОбменаВнешнееСоединение = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.СтруктураНастроекОбмена(Структура); + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), СтруктураНастроекОбмена, Истина); + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + КонецПопытки; + + Если СтруктураНастроекОбменаВнешнееСоединение.Свойство("НастройкаСинхронизацииДанныхЗавершена") Тогда + Если Не СообщениеДляСопоставленияДанных + И СтруктураНастроекОбменаВнешнееСоединение.НастройкаСинхронизацииДанныхЗавершена = Ложь Тогда + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для продолжения необходимо перейти в программу ""%1"" и завершить в ней настройку синхронизации. + |Выполнение обмена данными отменено.'"), + СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазыНаименование); + ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + + КонецЕсли; + КонецЕсли; + + Если СтруктураНастроекОбменаВнешнееСоединение.Свойство("ПолученоСообщениеДляСопоставленияДанных") Тогда + Если Не СообщениеДляСопоставленияДанных + И СтруктураНастроекОбменаВнешнееСоединение.ПолученоСообщениеДляСопоставленияДанных = Истина Тогда + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для продолжения необходимо перейти в программу ""%1"" и выполнить загрузку сообщения для сопоставления данных. + |Выполнение обмена данными отменено.'"), + СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазыНаименование); + ЗаписьЖурналаРегистрацииОбменаДанными(СообщениеОбОшибке, СтруктураНастроекОбмена, Истина); + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + + КонецЕсли; + КонецЕсли; + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + СтруктураНастроекОбменаВнешнееСоединение.Вставить("ДатаНачала", ВнешнееСоединение.ТекущаяДатаСеанса()); + + ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ЗаписьЖурналаРегистрацииНачалаОбменаДанными(СтруктураНастроекОбменаВнешнееСоединение); + // ОБМЕН ДАННЫМИ + Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда + Если НЕ ЭтоПланОбменаXDTO Тогда + // Получаем правила обмена из второй ИБ. + ПравилаКонвертацииОбъектов = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПравилаКонвертацииОбъектов(СтруктураНастроекОбменаВнешнееСоединение.ИмяПланаОбмена); + + Если ПравилаКонвертацииОбъектов = Неопределено Тогда + + // Правила обмена должны быть указаны. + НСтрока = НСтр("ru = 'Не заданы правила конвертации во второй информационной базе для плана обмена %1. Обмен отменен.'", + ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, СтруктураНастроекОбменаВнешнееСоединение.ИмяПланаОбмена); + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщенияОбОшибке, СтруктураНастроекОбмена, Истина); + ЗафиксироватьЗавершениеИнициализацииОбмена(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + КонецЕсли; + + // Обработка для загрузки данных. + ОбработкаДляЗагрузкиДанных = СтруктураНастроекОбмена.ОбработкаОбменаДанными; + ОбработкаДляЗагрузкиДанных.ИмяФайлаОбмена = ""; + ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию = СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции; + ОбработкаДляЗагрузкиДанных.ИспользоватьТранзакции = (ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию <> 1); + ОбработкаДляЗагрузкиДанных.ЗагрузкаДанныхВыполняетсяЧерезВнешнееСоединение = Истина; + + // Получаем инициализированную обработку для выгрузки данных. + Если ЭтоПланОбменаXDTO Тогда + ОбработкаОбменаДаннымиВнешнееСоединение = ВнешнееСоединение.Обработки.КонвертацияОбъектовXDTO.Создать(); + ОбработкаОбменаДаннымиВнешнееСоединение.РежимОбмена = "Выгрузка"; + Иначе + ОбработкаОбменаДаннымиВнешнееСоединение = ВнешнееСоединение.Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + ОбработкаОбменаДаннымиВнешнееСоединение.СохраненныеНастройки = ПравилаКонвертацииОбъектов; + ОбработкаОбменаДаннымиВнешнееСоединение.ЗагрузкаДанныхВыполняетсяВоВнешнемСоединении = Ложь; + ОбработкаОбменаДаннымиВнешнееСоединение.РежимОбмена = "Выгрузка"; + Попытка + ОбработкаОбменаДаннымиВнешнееСоединение.ВосстановитьПравилаИзВнутреннегоФормата(); + Исключение + ЗаписьЖурналаРегистрацииОбменаДанными( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Возникла ошибка во второй информационной базе: %1'"), + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())), СтруктураНастроекОбмена, Истина); + + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено; + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + Отказ = Истина; + Возврат; + КонецПопытки; + // Задаем узлы обмена. + ОбработкаОбменаДаннымиВнешнееСоединение.УзелДляФоновогоОбмена = Неопределено; + ОбработкаОбменаДаннымиВнешнееСоединение.НеВыгружатьОбъектыПоСсылкам = Истина; + ОбработкаОбменаДаннымиВнешнееСоединение.ИмяФайлаПравилОбмена = "1"; + ОбработкаОбменаДаннымиВнешнееСоединение.ВнешнееСоединение = Неопределено; + КонецЕсли; + + ОбработкаОбменаДаннымиВнешнееСоединение.УзелДляОбмена = СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазы; + ОбработкаОбменаДаннымиВнешнееСоединение.УстановитьБлокировкуУзлаПланаОбмена = Истина; + + УстановитьОбщиеПараметрыДляОбработкиОбменаДанными(ОбработкаОбменаДаннымиВнешнееСоединение, СтруктураНастроекОбменаВнешнееСоединение, ОбменСБСП20); + + Если НЕ ЭтоПланОбменаXDTO Тогда + ВерсияКонфигурацииПриемника = ""; + ВерсияИсточникаИзПравил = ""; + ТекстСообщения = ""; + ПараметрыВнешнегоСоединения = Новый Структура; + ПараметрыВнешнегоСоединения.Вставить("ВнешнееСоединение", ВнешнееСоединение); + ПараметрыВнешнегоСоединения.Вставить("ВерсияБСППоВнешнемуСоединению", ВерсияБСППоВнешнемуСоединению); + ПараметрыВнешнегоСоединения.Вставить("КлючСообщенияЖурналаРегистрации", СтруктураНастроекОбменаВнешнееСоединение.КлючСообщенияЖурналаРегистрации); + ПараметрыВнешнегоСоединения.Вставить("УзелИнформационнойБазы", СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазы); + + ПравилаКонвертацииОбъектов.Получить().Конвертация.Свойство("ВерсияКонфигурацииИсточника", ВерсияКонфигурацииПриемника); + ОбработкаДляЗагрузкиДанных.СохраненныеНастройки.Получить().Конвертация.Свойство("ВерсияКонфигурацииИсточника", ВерсияИсточникаИзПравил); + + Если РазличаютсяВерсииКорреспондента(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, + ВерсияИсточникаИзПравил, ВерсияКонфигурацииПриемника, ТекстСообщения, ПараметрыВнешнегоСоединения) Тогда + + ОбработкаОбменаДаннымиВнешнееСоединение = Неопределено; + Возврат; + + КонецЕсли; + КонецЕсли; + // ВЫГРУЗКА (КОРРЕСПОНДЕНТ) - ЗАГРУЗКА (ЭТА БАЗА) + ОбработкаОбменаДаннымиВнешнееСоединение.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных); + + // Фиксируем состояние выполнения обмена данными. + СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаДляЗагрузкиДанных.РезультатВыполненияОбмена(); + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаДляЗагрузкиДанных.СчетчикЗагруженныхОбъектов(); + СтруктураНастроекОбменаВнешнееСоединение.РезультатВыполненияОбменаСтрокой = ОбработкаОбменаДаннымиВнешнееСоединение.РезультатВыполненияОбменаСтрокой(); + СтруктураНастроекОбменаВнешнееСоединение.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиВнешнееСоединение.СчетчикВыгруженныхОбъектов(); + СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаДляЗагрузкиДанных.КомментарийПриЗагрузкеДанных; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаДляЗагрузкиДанных.СтрокаСообщенияОбОшибке(); + СтруктураНастроекОбменаВнешнееСоединение.СообщениеПриОбмене = ОбработкаОбменаДаннымиВнешнееСоединение.КомментарийПриВыгрузкеДанных; + СтруктураНастроекОбменаВнешнееСоединение.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиВнешнееСоединение.СтрокаСообщенияОбОшибке(); + + ОбработкаОбменаДаннымиВнешнееСоединение = Неопределено; + + ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда + + // Обработка для загрузки данных. + Если ЭтоПланОбменаXDTO Тогда + ОбработкаДляЗагрузкиДанных = ВнешнееСоединение.Обработки.КонвертацияОбъектовXDTO.Создать(); + Иначе + ОбработкаДляЗагрузкиДанных = ВнешнееСоединение.Обработки.КонвертацияОбъектовИнформационныхБаз.Создать(); + ОбработкаДляЗагрузкиДанных.ЗагрузкаДанныхВыполняетсяЧерезВнешнееСоединение = Истина; + КонецЕсли; + ОбработкаДляЗагрузкиДанных.РежимОбмена = "Загрузка"; + ОбработкаДляЗагрузкиДанных.УзелОбменаЗагрузкаДанных = СтруктураНастроекОбменаВнешнееСоединение.УзелИнформационнойБазы; + + УстановитьОбщиеПараметрыДляОбработкиОбменаДанными(ОбработкаДляЗагрузкиДанных, СтруктураНастроекОбменаВнешнееСоединение, ОбменСБСП20); + + ЕстьПоддержкаСопоставления = Истина; + НастройкаСинхронизацииДанныхЗавершена = Истина; + ВерсииИнтерфейса = ВерсииИнтерфейсаЧерезВнешнееСоединение(ВнешнееСоединение); + Если ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда + СообщениеОбОшибке = ""; + ПараметрыИнформационнойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПараметрыИнформационнойБазы_2_0_1_6( + СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод, СообщениеОбОшибке); + ПараметрыКорреспондента = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПараметрыИнформационнойБазы); + Если ПараметрыКорреспондента.Свойство("ПоддерживаетсяСопоставлениеДанных") Тогда + ЕстьПоддержкаСопоставления = ПараметрыКорреспондента.ПоддерживаетсяСопоставлениеДанных; + КонецЕсли; + Если ПараметрыКорреспондента.Свойство("НастройкаСинхронизацииДанныхЗавершена") Тогда + НастройкаСинхронизацииДанныхЗавершена = ПараметрыКорреспондента.НастройкаСинхронизацииДанныхЗавершена; + КонецЕсли; + КонецЕсли; + + Если СообщениеДляСопоставленияДанных + И (ЕстьПоддержкаСопоставления Или Не НастройкаСинхронизацииДанныхЗавершена) Тогда + ОбработкаДляЗагрузкиДанных.РежимЗагрузкиДанных = "ЗагрузкаСообщенияДляСопоставленияДанных"; + КонецЕсли; + + ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию = СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции; + ОбработкаДляЗагрузкиДанных.ИспользоватьТранзакции = (ОбработкаДляЗагрузкиДанных.КоличествоОбъектовНаТранзакцию <> 1); + + // Получаем инициализированную обработку для выгрузки данных. + ОбработкаОбменаДаннымиXML = СтруктураНастроекОбмена.ОбработкаОбменаДанными; + ОбработкаОбменаДаннымиXML.ИмяФайлаОбмена = ""; + + Если Не ЭтоПланОбменаXDTO Тогда + + ОбработкаОбменаДаннымиXML.ВнешнееСоединение = ВнешнееСоединение; + ОбработкаОбменаДаннымиXML.ЗагрузкаДанныхВыполняетсяВоВнешнемСоединении = Истина; + + КонецЕсли; + + // ВЫГРУЗКА (ЭТА БАЗА) - ЗАГРУЗКА (КОРРЕСПОНДЕНТ) + ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных); + + // Фиксируем состояние выполнения обмена данными. + СтруктураНастроекОбмена.РезультатВыполненияОбмена = ОбработкаОбменаДаннымиXML.РезультатВыполненияОбмена(); + СтруктураНастроекОбмена.КоличествоОбъектовОбработано = ОбработкаОбменаДаннымиXML.СчетчикВыгруженныхОбъектов(); + СтруктураНастроекОбменаВнешнееСоединение.РезультатВыполненияОбменаСтрокой = ОбработкаДляЗагрузкиДанных.РезультатВыполненияОбменаСтрокой(); + СтруктураНастроекОбменаВнешнееСоединение.КоличествоОбъектовОбработано = ОбработкаДляЗагрузкиДанных.СчетчикЗагруженныхОбъектов(); + СтруктураНастроекОбмена.СообщениеПриОбмене = ОбработкаОбменаДаннымиXML.КомментарийПриВыгрузкеДанных; + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = ОбработкаОбменаДаннымиXML.СтрокаСообщенияОбОшибке(); + СтруктураНастроекОбменаВнешнееСоединение.СообщениеПриОбмене = ОбработкаДляЗагрузкиДанных.КомментарийПриЗагрузкеДанных; + СтруктураНастроекОбменаВнешнееСоединение.СтрокаСообщенияОбОшибке = ОбработкаДляЗагрузкиДанных.СтрокаСообщенияОбОшибке(); + ОбработкаДляЗагрузкиДанных = Неопределено; + + КонецЕсли; + + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбменаВнешнееСоединение); + + Если Не РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена, Знач ТолькоПараметры = Ложь) + + Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда + + Если СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема Тогда + ВыполнитьОбменДаннымиСВнешнейСистемойЗагрузкаДанных(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + + // {Обработчик: ПередЧтениемСообщенияОбмена} Начало + СообщениеОбмена = ""; + СтандартнаяОбработка = Истина; + + ПередЧтениемСообщенияОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы, СообщениеОбмена, СтандартнаяОбработка); + // {Обработчик: ПередЧтениемСообщенияОбмена} Окончание + + Если СтандартнаяОбработка Тогда + + ВыполнитьТранспортСообщенияОбменаПередОбработкой(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ВыполнитьТранспортСообщенияОбменаПолучение(СтруктураНастроекОбмена); + + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + СообщениеОбмена = СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена(); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + // Загрузка данных только при успешном получении сообщения обмена. + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ЕстьПоддержкаСопоставления = ЗначениеНастройкиПланаОбмена( + ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы), + "ПоддерживаетсяСопоставлениеДанных", + СохраненныйВариантНастройкиУзлаПланаОбмена(СтруктураНастроекОбмена.УзелИнформационнойБазы)); + + Если СтруктураНастроекОбмена.ДополнительныеПараметры.Свойство("СообщениеДляСопоставленияДанных") + И (ЕстьПоддержкаСопоставления + Или Не НастройкаСинхронизацииЗавершена(СтруктураНастроекОбмена.УзелИнформационнойБазы)) Тогда + + ИмяФайлаДляПомещенияВХранилище = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + КаталогВременногоХранилищаФайлов(), + УникальноеИмяФайлаСообщенияОбмена()); + + // Сохраняется новое сообщение для сопоставления данных. + ИдентификаторФайла = ПоместитьФайлВХранилище(ИмяФайлаДляПомещенияВХранилище); + ПереместитьФайл(СообщениеОбмена, ИмяФайлаДляПомещенияВХранилище); + + ОбменДаннымиСлужебный.ПоместитьСообщениеДляСопоставленияДанных( + СтруктураНастроекОбмена.УзелИнформационнойБазы, ИдентификаторФайла); + + СтандартнаяОбработка = Истина; + Иначе + + ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СообщениеОбмена, , ТолькоПараметры); + + // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало + СтандартнаяОбработка = Истина; + + ПослеЧтенияСообщенияОбмена( + СтруктураНастроекОбмена.УзелИнформационнойБазы, + СообщениеОбмена, + РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), + СтандартнаяОбработка, + Не ТолькоПараметры); + // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание + + КонецЕсли; + + КонецЕсли; + + // {Обработчик: ПослеЧтенияСообщенияОбмена} Начало + СтандартнаяОбработка = Истина; + + ПослеЧтенияСообщенияОбмена( + СтруктураНастроекОбмена.УзелИнформационнойБазы, + СообщениеОбмена, + РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена), + СтандартнаяОбработка, + Не ТолькоПараметры); + // {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание + + Если СтандартнаяОбработка Тогда + + ВыполнитьТранспортСообщенияОбменаПослеОбработки(СтруктураНастроекОбмена); + + КонецЕсли; + + ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда + + Если СтруктураНастроекОбмена.ВидТранспортаОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.ВнешняяСистема Тогда + ВыполнитьОбменДаннымиСВнешнейСистемойВыгрузкаНастроекXDTO(СтруктураНастроекОбмена); + Возврат; + КонецЕсли; + + ВыполнитьТранспортСообщенияОбменаПередОбработкой(СтруктураНастроекОбмена); + + // выгрузка данных + Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено Тогда + + ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена()); + + КонецЕсли; + + // Отправка сообщения обмена только в случае успешной выгрузки данных. + Если РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) Тогда + + ВыполнитьТранспортСообщенияОбменаОтправка(СтруктураНастроекОбмена); + + КонецЕсли; + + ВыполнитьТранспортСообщенияОбменаПослеОбработки(СтруктураНастроекОбмена); + + КонецЕсли; + +КонецПроцедуры + +// Выполняет процесс обмена данными отдельно для каждой строки сценария (настройки) обмена. +// Процесс обмена данными состоит из двух стадий: +// - инициализация обмена - подготовка подсистемы обмена данными к процессу обмена +// - обмен данными - процесс зачитывания файла сообщения с последующей загрузкой этих данных в ИБ +// или выгрузки изменений в файл сообщения. +// Стадия инициализации выполняется один раз за сеанс и сохраняется в кэше сеанса на сервере +// до перезапуска сеанса или сброса повторно-используемых значений подсистемы обмена данными. +// Сброс повторно-используемых значений происходит при изменении данных, влияющих на процесс обмена данными +// (настройки транспорта, настройка выполнения обмена, настройка отборов на узлах планов обмена). +// +// Обмен может быть выполнен полностью для всех строк сценария, +// а может быть выполнен для отдельной строки ТЧ сценария обмена. +// +// Параметры: +// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки при выполнении сценария. +// НастройкаВыполненияОбмена - СправочникСсылка.СценарииОбменовДанными - элемент справочника, +// по значениям реквизитов которого будет выполнен обмен данными. +// НомерСтроки - Число - номер строки по которой будет выполнен обмен данными. +// Если не указан, то обмен данными будет выполнен для всех строк. +// +Процедура ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Отказ, НастройкаВыполненияОбмена, НомерСтроки = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ЭтоПодчиненныйУзелРИБТребующийУстановкиОбновления = (ЭтоПодчиненныйУзелРИБ() И ТребуетсяУстановкаОбновления()); + + ТекстЗапроса = + "ВЫБРАТЬ + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка КАК НастройкаВыполненияОбмена, + | НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки КАК НомерСтроки, + | НастройкиВыполненияОбменаНастройкиОбмена.ВыполняемоеДействие КАК ВыполняемоеДействие, + | НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена КАК ВидТранспортаОбмена, + | НастройкиВыполненияОбменаНастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | + | ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.COM) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ОбменЧерезВнешнееСоединение, + | + | ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.WS) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ОбменЧерезВебСервис, + | + | ВЫБОР КОГДА НастройкиВыполненияОбменаНастройкиОбмена.ВидТранспортаОбмена = ЗНАЧЕНИЕ(Перечисление.ВидыТранспортаСообщенийОбмена.ВнешняяСистема) + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ОбменСВнешнейСистемой + |ИЗ + | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиВыполненияОбменаНастройкиОбмена + |ГДЕ + | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка = &НастройкаВыполненияОбмена + | И &УсловиеПоНомеруСтроки + | + |УПОРЯДОЧИТЬ ПО + | НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки"; + + УсловиеПоНомеруСтроки = ?(НомерСтроки = Неопределено, "", "И НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки = &НомерСтроки"); + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПоНомеруСтроки", УсловиеПоНомеруСтроки); + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("НастройкаВыполненияОбмена", НастройкаВыполненияОбмена); + Запрос.УстановитьПараметр("НомерСтроки", НомерСтроки); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если ЭтоПодчиненныйУзелРИБТребующийУстановкиОбновления + И ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Выборка.УзелИнформационнойБазы) Тогда + + Продолжить; + + КонецЕсли; + + Если Не НастройкаСинхронизацииЗавершена(Выборка.УзелИнформационнойБазы) + И Не Выборка.ОбменСВнешнейСистемой Тогда + + Продолжить; + + КонецЕсли; + + ОтказПоСтрокеСценария = Ложь; + + ПередВыполнениемОбменов(Выборка.УзелИнформационнойБазы, ОтказПоСтрокеСценария); + Если ОтказПоСтрокеСценария Тогда + + Отказ = Истина; + Продолжить; + + КонецЕсли; + + Если Выборка.ОбменЧерезВнешнееСоединение Тогда + + ПроверитьВозможностьВнешнегоСоединения(); + + КоличествоЭлементовВТранзакции = КоличествоЭлементовВТранзакцииВыполняемогоДействия(Выборка.ВыполняемоеДействие); + + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(ОтказПоСтрокеСценария, + Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, КоличествоЭлементовВТранзакции); + + ИначеЕсли Выборка.ОбменЧерезВебСервис Тогда + + ПараметрыОбмена = ПараметрыОбмена(); + ПараметрыОбмена.ДлительнаяОперацияРазрешена = Истина; + ПараметрыОбмена.ИнтервалОжиданияНаСервере = 30; + + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(ОтказПоСтрокеСценария, + Выборка.УзелИнформационнойБазы, Выборка.ВыполняемоеДействие, ПараметрыОбмена); + + Иначе + + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ + СтруктураНастроекОбмена = НастройкиОбменаДанными(Выборка.НастройкаВыполненияОбмена, Выборка.НомерСтроки); + + // Если настройка содержит ошибки, то обмен не производим; статус "Отменено". + Если СтруктураНастроекОбмена.Отказ Тогда + + ОтказПоСтрокеСценария = Истина; + + Иначе + + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; + + // Добавляем в ЖР информацию о процессе обмена данными. + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными по настройке %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.НастройкаВыполненияОбменаНаименование); + ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена); + + // ОБМЕН ДАННЫМИ + ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена); + + ОтказПоСтрокеСценария = (РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) <> Истина); + + КонецЕсли; + + // Фиксируем в ЖР лог по обмену данными. + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); + + КонецЕсли; + + ПослеВыполненияОбменов(Выборка.УзелИнформационнойБазы, ОтказПоСтрокеСценария); + + Если ОтказПоСтрокеСценария Тогда + + Отказ = Истина; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Точка входа для выполнения обмена данными по сценарию обмена регламентным заданием. +// +// Параметры: +// КодСценарияОбмена - Строка - код элемента справочника "Сценарии обменов данными", для которого будет выполнен обмен +// данными. +// +Процедура ВыполнитьОбменДаннымиПоРегламентномуЗаданию(КодСценарияОбмена) Экспорт + + Если Не ЗначениеЗаполнено(КодСценарияОбмена) Тогда + + ВызватьИсключение НСтр("ru = 'Не задан сценарий обмена данными.'"); + + КонецЕсли; + + ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СинхронизацияДанных); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Код", КодСценарияОбмена); + + Запрос.Текст = + "ВЫБРАТЬ + | СценарииОбменовДанными.Ссылка КАК Ссылка + |ИЗ + | Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными + |ГДЕ + | СценарииОбменовДанными.Код = &Код + | И НЕ СценарииОбменовДанными.ПометкаУдаления + |"; + + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + + СтрокаСообщения = НСтр("ru = 'Сценарий обмена данными с кодом %1 не найден.'"); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, КодСценарияОбмена); + ВызватьИсключение СтрокаСообщения; + + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + Если Выборка.Следующий() Тогда + + ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Ложь, Выборка.Ссылка); + + КонецЕсли; + +КонецПроцедуры + +// Выполняет получение файла сообщения обмена из базы-корреспондента через веб-сервис. +// Выполняет загрузку полученного файла сообщения обмена в эту базу. +// +// Параметры: +// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки. +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется получение сообщения обмена. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор файла. +// ДатаНачалаОперации - Дата - дата начала загрузки. +// ПараметрыАутентификации - Структура - содержит параметры аутентификации на веб-сервисе (Пользователь, Пароль). +// +Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЗавершениеДлительнойОперации( + Отказ, + Знач УзелИнформационнойБазы, + Знач ИдентификаторФайла, + Знач ДатаНачалаОперации, + Знач ПараметрыАутентификации = Неопределено, + ВыдаватьОшибку = Ложь) Экспорт + + ПроверитьВозможностьВыполненияОбменов(); + + ПроверитьИспользованиеОбменаДанными(); + + УстановитьПривилегированныйРежим(Истина); + + Попытка + ФайлСообщенияОбмена = ПолучитьФайлИзХранилищаВСервисе(Новый УникальныйИдентификатор(ИдентификаторФайла), УзелИнформационнойБазы,, ПараметрыАутентификации); + Исключение + ЗафиксироватьЗавершениеОбменаСОшибкой(УзелИнформационнойБазы, + Перечисления.ДействияПриОбмене.ЗагрузкаДанных, + ДатаНачалаОперации, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Если ВыдаватьОшибку Тогда + ВызватьИсключение; + Иначе + Отказ = Истина; + КонецЕсли; + Возврат; + КонецПопытки; + + // Загрузка файла сообщения обмена в эту базу. + ПараметрыОбменаДанными = ПараметрыОбменаДаннымиЧерезФайлИлиСтроку(); + + ПараметрыОбменаДанными.УзелИнформационнойБазы = УзелИнформационнойБазы; + ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ФайлСообщенияОбмена; + ПараметрыОбменаДанными.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + ПараметрыОбменаДанными.ДатаНачалаОперации = ДатаНачалаОперации; + + Попытка + ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными); + Исключение + ЗафиксироватьЗавершениеОбменаСОшибкой(УзелИнформационнойБазы, + Перечисления.ДействияПриОбмене.ЗагрузкаДанных, + ДатаНачалаОперации, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Если ВыдаватьОшибку Тогда + ВызватьИсключение; + Иначе + Отказ = Истина; + КонецЕсли; + КонецПопытки; + + Попытка + УдалитьФайлы(ФайлСообщенияОбмена); + Исключение + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), + УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + +КонецПроцедуры + +// Точка входа для выполнения итерации обмена данными - загрузки и выгрузки данных для узла плана обмена. +// +// Параметры: +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого выполняется итерация обмена данными. +// ПараметрыОбменаДляУзла - Структура: +// * ВыполнятьЗагрузку - Булево - флаг необходимости выполнять загрузку данных. +// Необязательный, значение по умолчанию Истина. +// * ВыполнятьВыгрузку - Булево - флаг необходимости выполнять выгрузку данных. +// Необязательный, значение по умолчанию Истина. +// * ВидТранспортаСообщенийОбмена - ПеречислениеСсылка.ВидыТранспортаСообщенийОбмена - вид транспорта, +// который будет использоваться в процессе обмена данными. +// Если в РС значение не задано, то значение по умолчанию - Перечисления.ВидыТранспортаСообщенийОбмена.FILE. +// Необязательный, значение по умолчанию Неопределено. +// * ДлительнаяОперация - Булево - содержит сведения о том, является ли операция длительной. +// Необязательный, значение по умолчанию Ложь. +// * ИдентификаторОперации - Строка - содержит идентификатор длительной операции в виде строки. +// Необязательный, значение по умолчанию пустая строка. +// * ИдентификаторФайла - Строка - идентификатор файла сообщения в сервисе. +// Необязательный, значение по умолчанию пустая строка. +// * ДлительнаяОперацияРазрешена - Булево - содержит признак того, что длительная операция разрешена. +// Необязательный, значение по умолчанию Ложь. +// * ПараметрыАутентификации - Структура - содержит параметры аутентификации для обмена через Web-сервис. +// Необязательный, значение по умолчанию Неопределено. +// * ТолькоПараметры - Булево - содержит признак выборочной загрузки данных при обмене РИБ. +// Необязательный, значение по умолчанию Ложь. +// Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибки при выполнении обмена. +// ДополнительныеПараметры - Структура - зарезервировано для служебного использования. +// +Процедура ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(УзелИнформационнойБазы, ПараметрыОбмена, Отказ, ДополнительныеПараметры = Неопределено) Экспорт + + ПередВыполнениемОбменов(УзелИнформационнойБазы, Отказ); + + Если Отказ = Истина Тогда + + Возврат; + + КонецЕсли; + + ДействиеЗагрузка = Перечисления.ДействияПриОбмене.ЗагрузкаДанных; + ДействиеВыгрузка = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; + + Если ДополнительныеПараметры = Неопределено Тогда + + ДополнительныеПараметры = Новый Структура; + + КонецЕсли; + + // Обмен через внешнее соединение. + Если ПараметрыОбмена.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.COM Тогда + + ПроверитьВозможностьВнешнегоСоединения(); + + Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, + УзелИнформационнойБазы, ДействиеЗагрузка, Неопределено); + КонецЕсли; + + Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ, + УзелИнформационнойБазы, ДействиеВыгрузка, Неопределено, ПараметрыОбмена.СообщениеДляСопоставленияДанных); + КонецЕсли; + + ИначеЕсли ПараметрыОбмена.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда // Обмен через Web-сервис + + Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, + УзелИнформационнойБазы, ДействиеЗагрузка, ПараметрыОбмена); + КонецЕсли; + + Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыЧерезWebСервис(Отказ, + УзелИнформационнойБазы, ДействиеВыгрузка, ПараметрыОбмена); + КонецЕсли; + + Иначе // Обмен через обычные каналы связи. + + ТолькоПараметры = ПараметрыОбмена.ТолькоПараметры; + ВидТранспортаСообщенийОбмена = ПараметрыОбмена.ВидТранспортаСообщенийОбмена; + + Если ПараметрыОбмена.ВыполнятьЗагрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, + ДействиеЗагрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); + КонецЕсли; + + Если ПараметрыОбмена.ВыполнятьВыгрузку Тогда + ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, + ДействиеВыгрузка, ВидТранспортаСообщенийОбмена, ТолькоПараметры, ДополнительныеПараметры); + КонецЕсли; + + КонецЕсли; + + ПослеВыполненияОбменов(УзелИнформационнойБазы, Отказ); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + -#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl index 53c29bf48..ef79e8c93 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl @@ -5,7 +5,6 @@ // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Возвращает признак ошибки при запуске: @@ -17,11 +16,11 @@ // 2) Ошибка обновления ИБ после успешной загрузки сообщения обмена. // Функция ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() Экспорт - + УстановитьПривилегированныйРежим(Истина); - + Возврат Константы.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском.Получить(); - + КонецФункции // Параметры: @@ -31,13 +30,13 @@ Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт // Инициализация параметров сеанса должна выполняться без обращения к параметрам работы программы. - + Если ИмяПараметра = "РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском" Тогда ПараметрыСеанса.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском = Новый ФиксированнаяСтруктура(Новый Структура); УстановленныеПараметры.Добавить("РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском"); Возврат; КонецЕсли; - + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда // Процедура обновления повторно-используемых значений и параметров сеанса. @@ -48,33 +47,33 @@ УстановленныеПараметры.Добавить("ПравилаВыборочнойРегистрацииОбъектов"); УстановленныеПараметры.Добавить("ПравилаРегистрацииОбъектов"); УстановленныеПараметры.Добавить("ДатаОбновленияПовторноИспользуемыхЗначенийМРО"); - + ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(Новый Соответствие); УстановленныеПараметры.Добавить("ПаролиСинхронизацииДанных"); - + ПараметрыСеанса.ПриоритетныеДанныеОбмена = Новый ФиксированныйМассив(Новый Массив); УстановленныеПараметры.Добавить("ПриоритетныеДанныеОбмена"); - + ПараметрыСеанса.ПараметрыСеансаСинхронизацииДанных = Новый ХранилищеЗначения(Новый Соответствие); УстановленныеПараметры.Добавить("ПараметрыСеансаСинхронизацииДанных"); - + СтруктураПроверки =Новый Структура; СтруктураПроверки.Вставить("ПроверятьРасхождениеВерсий", Ложь); СтруктураПроверки.Вставить("ЕстьОшибка", Ложь); СтруктураПроверки.Вставить("ТекстОшибки", ""); - + ПараметрыСеанса.ОшибкаРасхожденияВерсийПриПолученииДанных = Новый ФиксированнаяСтруктура(СтруктураПроверки); УстановленныеПараметры.Добавить("ОшибкаРасхожденияВерсийПриПолученииДанных"); - + Иначе - + ПараметрыСеанса.ПаролиСинхронизацииДанных = Новый ФиксированноеСоответствие(Новый Соответствие); УстановленныеПараметры.Добавить("ПаролиСинхронизацииДанных"); - + ПараметрыСеанса.ПараметрыСеансаСинхронизацииДанных = Новый ХранилищеЗначения(Новый Соответствие); УстановленныеПараметры.Добавить("ПараметрыСеансаСинхронизацииДанных"); КонецЕсли; - + КонецПроцедуры // Выполняет проверку актуальности КЭШа механизма регистрации объектов. @@ -84,21 +83,21 @@ // Нет. // Процедура ПроверитьКэшМеханизмаРегистрацииОбъектов() Экспорт - + УстановитьПривилегированныйРежим(Истина); - + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - + АктуальнаяДата = ПолучитьФункциональнуюОпцию("АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); - + Если ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО <> АктуальнаяДата Тогда - + ОбновитьКэшМеханизмаРегистрацииОбъектов(); - + КонецЕсли; - + КонецЕсли; - + КонецПроцедуры // Обновляет/устанавливает повторно-используемые значения и параметры сеанса для подсистемы обмена данными. @@ -114,44 +113,45 @@ // Нет. // Процедура ОбновитьКэшМеханизмаРегистрацииОбъектов() Экспорт - + УстановитьПривилегированныйРежим(Истина); - + ОбновитьПовторноИспользуемыеЗначения(); - + Если ОбменДаннымиПовтИсп.ИспользуемыеПланыОбмена().Количество() > 0 Тогда - + ПараметрыСеанса.ПравилаРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ПолучитьПравилаРегистрацииОбъектов()); - + ПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ПолучитьПравилаВыборочнойРегистрацииОбъектов()); - + Иначе - + ПараметрыСеанса.ПравилаРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ИнициализацияТаблицыПравилРегистрацииОбъектов()); - + ПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектов = Новый ХранилищеЗначения(ОбменДаннымиСервер.ИнициализацияТаблицыПравилВыборочнойРегистрацииОбъектов()); - + КонецЕсли; // Ключ для проверки актуальности кэша. - ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО = ПолучитьФункциональнуюОпцию("АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); - + ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО = ПолучитьФункциональнуюОпцию( + "АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО"); + КонецПроцедуры // См. ОбменДаннымиВызовСервера.СброситьКэшМеханизмаРегистрацииОбъектов. Процедура СброситьКэшМеханизмаРегистрацииОбъектов() Экспорт - + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - + УстановитьПривилегированныйРежим(Истина); // Записываем универсальную дату и время компьютера сервера - ТекущаяУниверсальнаяДата(), // метод ТекущаяДатаСеанса() использовать нельзя. // Текущая универсальная дата сервера в данном случае используется в качестве // ключа уникальности кэша механизма регистрации объектов. Константы.ДатаОбновленияПовторноИспользуемыхЗначенийМРО.Установить(ТекущаяУниверсальнаяДата()); - + КонецЕсли; - + КонецПроцедуры // Возвращает список приоритетных данных обмена. @@ -160,53 +160,53 @@ // Массив - коллекция ссылок на выгруженные приоритетные данные обмена. // Функция ПриоритетныеДанныеОбмена() Экспорт - + УстановитьПривилегированныйРежим(Истина); - + Результат = Новый Массив; - + Для Каждого Элемент Из ПараметрыСеанса.ПриоритетныеДанныеОбмена Цикл - + Результат.Добавить(Элемент); - + КонецЦикла; - + Возврат Результат; КонецФункции // Очищает список приоритетных данных обмена. // Процедура ОчиститьПриоритетныеДанныеОбмена() Экспорт - + УстановитьПривилегированныйРежим(Истина); - + ПараметрыСеанса.ПриоритетныеДанныеОбмена = Новый ФиксированныйМассив(Новый Массив); - + КонецПроцедуры // Дополняет список приоритетных данных обмена переданным значением. // Процедура ДополнитьПриоритетныеДанныеОбмена(Знач Данные) Экспорт - + Результат = ПриоритетныеДанныеОбмена(); - + Результат.Добавить(Данные); - + УстановитьПривилегированныйРежим(Истина); - + ПараметрыСеанса.ПриоритетныеДанныеОбмена = Новый ФиксированныйМассив(Результат); - + КонецПроцедуры // Возвращает признак режима загрузки параметров работы программы из сообщения обмена в информационную базу. // Актуально для обмена в РИБ при загрузке данных в подчиненном узле РИБ. // Функция РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском(Свойство) Экспорт - + УстановитьПривилегированныйРежим(Истина); - + Возврат ПараметрыСеанса.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском.Свойство(Свойство); - + КонецФункции // Возвращает признак использования плана обмена в обмене данными. @@ -220,9 +220,9 @@ // Булево - Истина, если план обмена используется, Ложь - нет. // Функция ОбменДаннымиВключен(Знач ИмяПланаОбмена, Знач Отправитель) Экспорт - + УстановитьПривилегированныйРежим(Истина); - + Возврат ОбменДаннымиПовтИсп.ОбменДаннымиВключен(ИмяПланаОбмена, Отправитель); КонецФункции @@ -232,11 +232,11 @@ // ХранилищеЗначения - значение параметра сеанса ПравилаРегистрацииОбъектов. // Функция ПараметрыСеансаПравилаРегистрацииОбъектов() Экспорт - + УстановитьПривилегированныйРежим(Истина); - + Возврат ПараметрыСеанса.ПравилаРегистрацииОбъектов; - + КонецФункции // Возвращает признак того, что для получателя зарегистрированы изменения данных. @@ -245,35 +245,35 @@ // Булево - Истина, если есть зарегистрированные данные, Ложь - нет. // Функция ИзмененияЗарегистрированы(Знач Получатель) Экспорт - + ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 1 |ИЗ | &ИмяТаблицыИзменения КАК ТаблицаИзменений |ГДЕ | ТаблицаИзменений.Узел = &Узел"; - + Запрос = Новый Запрос; Запрос.УстановитьПараметр("Узел", Получатель); - + УстановитьПривилегированныйРежим(Истина); - + СтрокаШаблона = "%1.Изменения"; - + СоставПланаОбмена = Метаданные.ПланыОбмена[ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Получатель)].Состав; Для Каждого ЭлементСостава Из СоставПланаОбмена Цикл - + ИмяТаблицыИзменения = СтрШаблон(СтрокаШаблона, ЭлементСостава.Метаданные.ПолноеИмя()); - + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыИзменения", ИмяТаблицыИзменения); РезультатЗапроса = Запрос.Выполнить(); - + Если Не РезультатЗапроса.Пустой() Тогда Возврат Истина; КонецЕсли; - + КонецЦикла; - + Возврат Ложь; КонецФункции @@ -286,147 +286,152 @@ // СообщениеОбОшибке - Строка - описание ошибки при выполнении операции. // Функция ЗагрузитьЧастьФайла(ИдентификаторФайла, НомерЗагружаемойЧастиФайла, ЗагружаемаяЧастьФайла, СообщениеОбОшибке) Экспорт - + СообщениеОбОшибке = ""; - + Если Не ЗначениеЗаполнено(ИдентификаторФайла) Тогда СообщениеОбОшибке = НСтр("ru = 'Не указан идентификатор загружаемого файла. Дальнейшее выполнение метода невозможно. - |Необходимо для загружаемого файла назначить уникальный идентификатор.'"); - ВызватьИсключение(СообщениеОбОшибке); + |Необходимо для загружаемого файла назначить уникальный идентификатор.'"); + ВызватьИсключение (СообщениеОбОшибке); КонецЕсли; - - Если Не ЗначениеЗаполнено(ЗагружаемаяЧастьФайла) - И ТипЗнч(ЗагружаемаяЧастьФайла) <> Тип("ДвоичныеДанные") Тогда - СообщениеОбОшибке = НСтр("ru = 'Метод не может быть выполнен, т.к. переданные данные не соответствуют типу для получения данных.'"); - ВызватьИсключение(СообщениеОбОшибке); + + Если Не ЗначениеЗаполнено(ЗагружаемаяЧастьФайла) И ТипЗнч(ЗагружаемаяЧастьФайла) <> Тип("ДвоичныеДанные") Тогда + СообщениеОбОшибке = НСтр( + "ru = 'Метод не может быть выполнен, т.к. переданные данные не соответствуют типу для получения данных.'"); + ВызватьИсключение (СообщениеОбОшибке); КонецЕсли; - - Если Не ЗначениеЗаполнено(НомерЗагружаемойЧастиФайла) - Или НомерЗагружаемойЧастиФайла = 0 Тогда + + Если Не ЗначениеЗаполнено(НомерЗагружаемойЧастиФайла) Или НомерЗагружаемойЧастиФайла = 0 Тогда НомерЗагружаемойЧастиФайла = 1; КонецЕсли; - + КаталогВременныхФайлов = ВременныйКаталогВыгрузки(ИдентификаторФайла); - + Каталог = Новый Файл(КаталогВременныхФайлов); Если Не Каталог.Существует() Тогда СоздатьКаталог(КаталогВременныхФайлов); КонецЕсли; - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, ПолучитьИмяЧастиФайла(НомерЗагружаемойЧастиФайла)); + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, ПолучитьИмяЧастиФайла( + НомерЗагружаемойЧастиФайла)); ЗагружаемаяЧастьФайла.Записать(ИмяФайла); - + Возврат ""; - + КонецФункции Функция ВыгрузитьЧастьФайла(ИдентификаторФайла, НомерВыгружаемойЧастиФайла, СообщениеОбОшибке) Экспорт - + СообщениеОбОшибке = ""; ИмяЧастиФайла = ""; КаталогВременныхФайлов = ВременныйКаталогВыгрузки(ИдентификаторФайла); - + Для КоличествоРазрядов = СтрДлина(Формат(НомерВыгружаемойЧастиФайла, "ЧДЦ=0; ЧГ=0")) По 5 Цикл - - ФорматнаяСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ЧЦ=%1; ЧВН=; ЧГ=0", Строка(КоличествоРазрядов)); - - ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.zip.%2", ИдентификаторФайла, Формат(НомерВыгружаемойЧастиФайла, ФорматнаяСтрока)); - + + ФорматнаяСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ЧЦ=%1; ЧВН=; ЧГ=0", Строка( + КоличествоРазрядов)); + + ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.zip.%2", ИдентификаторФайла, Формат( + НомерВыгружаемойЧастиФайла, ФорматнаяСтрока)); + ИменаФайлов = НайтиФайлы(КаталогВременныхФайлов, ИмяФайла); - + Если ИменаФайлов.Количество() > 0 Тогда - + ИмяЧастиФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, ИмяФайла); Прервать; - + КонецЕсли; - + КонецЦикла; - + ЧастьФайла = Новый Файл(ИмяЧастиФайла); - + Если ЧастьФайла.Существует() Тогда Возврат Новый ДвоичныеДанные(ИмяЧастиФайла); Иначе СообщениеОбОшибке = НСтр("ru = 'Часть файла с указанным номером не найдена.'"); КонецЕсли; - + КонецФункции Функция ПодготовитьФайлДляЗагрузки(ИдентификаторФайла, СообщениеОбОшибке) Экспорт - + УстановитьПривилегированныйРежим(Истина); - + ИдентификаторФайлаВоВременномХранилище = ""; - + КаталогВременныхФайлов = ВременныйКаталогВыгрузки(ИдентификаторФайла); ИмяАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, "datafile.zip"); - - МассивПолученныхФайлов = НайтиФайлы(КаталогВременныхФайлов,"data.zip.*"); - + + МассивПолученныхФайлов = НайтиФайлы(КаталогВременныхФайлов, "data.zip.*"); + Если МассивПолученныхФайлов.Количество() > 0 Тогда - - ФайлыДляОбъединения = Новый Массив(); + + ФайлыДляОбъединения = Новый Массив; ИмяЧастиФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, "data.zip.%1"); - + Для НомерЧасти = 1 По МассивПолученныхФайлов.Количество() Цикл - ФайлыДляОбъединения.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяЧастиФайла, НомерЧасти)); + ФайлыДляОбъединения.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяЧастиФайла, + НомерЧасти)); КонецЦикла; - + Иначе ШаблонСообщения = НСтр("ru = 'Не найден ни один фрагмент сессии передачи с идентификатором %1. - |Необходимо убедиться, что в настройках программы заданы параметры - |""Каталог временных файлов для Linux"" и ""Каталог временных файлов для Windows"".'"); - СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Строка(ИдентификаторФайла)); - ВызватьИсключение(СообщениеОбОшибке); + |Необходимо убедиться, что в настройках программы заданы параметры + |""Каталог временных файлов для Linux"" и ""Каталог временных файлов для Windows"".'"); + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Строка( + ИдентификаторФайла)); + ВызватьИсключение (СообщениеОбОшибке); КонецЕсли; - - Попытка + + Попытка ОбъединитьФайлы(ФайлыДляОбъединения, ИмяАрхива); Исключение СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - ВызватьИсключение(СообщениеОбОшибке); + ВызватьИсключение (СообщениеОбОшибке); КонецПопытки; // Распаковать. Разархиватор = Новый ЧтениеZipФайла(ИмяАрхива); - + Если Разархиватор.Элементы.Количество() = 0 Тогда - + Попытка УдалитьФайлы(КаталогВременныхФайлов); Исключение СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), - УровеньЖурналаРегистрации.Ошибка,,, СообщениеОбОшибке); - ВызватьИсключение(СообщениеОбОшибке); + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + ВызватьИсключение (СообщениеОбОшибке); КонецПопытки; - + СообщениеОбОшибке = НСтр("ru = 'Файл архива не содержит данных.'"); - ВызватьИсключение(СообщениеОбОшибке); - + ВызватьИсключение (СообщениеОбОшибке); + КонецЕсли; - + ЭлементАрхива = Разархиватор.Элементы.Получить(0); ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВременныхФайлов, ЭлементАрхива.Имя); - + Разархиватор.Извлечь(ЭлементАрхива, КаталогВременныхФайлов); Разархиватор.Закрыть(); // Помещаем файл в каталог временного хранилища файлов. КаталогЗагрузки = ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(); - ИмяФайлаСДанными = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ИдентификаторФайла, ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайла)); + ИмяФайлаСДанными = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ИдентификаторФайла, + ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайла)); ИмяФайлаВКаталогеЗагрузки = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогЗагрузки, ИмяФайлаСДанными); - + Попытка ПереместитьФайл(ИмяФайла, ИмяФайлаВКаталогеЗагрузки); Исключение СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), - УровеньЖурналаРегистрации.Ошибка,,, СообщениеОбОшибке); - ВызватьИсключение(СообщениеОбОшибке); + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + ВызватьИсключение (СообщениеОбОшибке); КонецПопытки; - + ИдентификаторФайлаВоВременномХранилище = ОбменДаннымиСервер.ПоместитьФайлВХранилище(ИмяФайлаВКаталогеЗагрузки); // Удаляем временные файлы. @@ -435,71 +440,71 @@ Исключение СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеВременногоФайла(), - УровеньЖурналаРегистрации.Ошибка,,, СообщениеОбОшибке); - ВызватьИсключение(СообщениеОбОшибке); + УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); + ВызватьИсключение (СообщениеОбОшибке); КонецПопытки; - + Возврат ИдентификаторФайлаВоВременномХранилище; - + КонецФункции Процедура ПодготовитьДанныеДляВыгрузкиИзИнформационнойБазы(ПараметрыПроцедуры, АдресХранилища) Экспорт - + ПараметрыWEBСервиса = ПараметрыПроцедуры["ПараметрыWEBСервиса"]; СообщениеОбОшибке = ПараметрыПроцедуры["СообщениеОбОшибке"]; - + УстановитьПривилегированныйРежим(Истина); - + КомпонентыОбмена = КомпонентыОбмена("Отправка", ПараметрыWEBСервиса); - ИмяФайла = Строка(Новый УникальныйИдентификатор()) + ".xml"; - + ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".xml"; + КаталогВременныхФайлов = ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(); ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( КаталогВременныхФайлов, ИмяФайла); // Открываем файл обмена. ОбменДаннымиXDTOСервер.ОткрытьФайлВыгрузки(КомпонентыОбмена, ПолноеИмяФайла); - + Если КомпонентыОбмена.ФлагОшибки Тогда КомпонентыОбмена.ФайлОбмена = Неопределено; - + ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена); - + ВызватьИсключение КомпонентыОбмена.СтрокаСообщенияОбОшибке; КонецЕсли; - + СтруктураНастроекОбмена = СтруктураНастроекОбмена(КомпонентыОбмена, Перечисления.ДействияПриОбмене.ВыгрузкаДанных); // Выгрузка данных. Попытка ОбменДаннымиXDTOСервер.ПроизвестиВыгрузкуДанных(КомпонентыОбмена); Исключение - + Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда РазблокироватьДанныеДляРедактирования(КомпонентыОбмена.УзелКорреспондента); КонецЕсли; - + Инфо = ИнформацияОбОшибке(); КодОшибки = Новый Структура("КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки", КраткоеПредставлениеОшибки(Инфо), ПодробноеПредставлениеОшибки(Инфо)); - + ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, КодОшибки); ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена); - + КомпонентыОбмена.ФайлОбмена = Неопределено; - + ВызватьИсключение КодОшибки.КраткоеПредставлениеОшибки; КонецПопытки; - + КомпонентыОбмена.ФайлОбмена.Закрыть(); - + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена, КомпонентыОбмена); - + Если КомпонентыОбмена.ФлагОшибки Тогда - + СообщениеОбОшибке = КомпонентыОбмена.СтрокаСообщенияОбОшибке; ВызватьИсключение СообщениеОбОшибке; - + Иначе // Поместить файл во временное хранилище. @@ -509,10 +514,11 @@ ВременныйКаталог = ВременныйКаталогВыгрузки( ИдентификаторФайлаВоВременномХранилище); ИмяНеразделенногоФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( - ВременныйКаталог, ИдентификаторФайлаВоВременномХранилище + ?(ПараметрыWEBСервиса.РазмерЧастиФайла > 0, ".zip", ".zip.1")); + ВременныйКаталог, ИдентификаторФайлаВоВременномХранилище + ?(ПараметрыWEBСервиса.РазмерЧастиФайла > 0, + ".zip", ".zip.1")); ИмяИсходногоФайлаВоВременномКаталоге = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( ВременныйКаталог, "data.xml"); - + СоздатьКаталог(ВременныйКаталог); КопироватьФайл(ПолноеИмяФайла, ИмяИсходногоФайлаВоВременномКаталоге); @@ -520,43 +526,44 @@ Архиватор = Новый ЗаписьZipФайла(ИмяНеразделенногоФайла); Архиватор.Добавить(ИмяИсходногоФайлаВоВременномКаталоге); Архиватор.Записать(); - + Если ПараметрыWEBСервиса.РазмерЧастиФайла > 0 Тогда // Разделение файла на части. ИменаФайлов = РазделитьФайл(ИмяНеразделенногоФайла, ПараметрыWEBСервиса.РазмерЧастиФайла * 1024); Иначе - ИменаФайлов = Новый Массив(); + ИменаФайлов = Новый Массив; ИменаФайлов.Добавить(ИмяНеразделенногоФайла); КонецЕсли; - + ВозвращаемоеЗначение = "{WEBService}$%1$%2"; - ВозвращаемоеЗначение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ВозвращаемоеЗначение, ИменаФайлов.Количество(), ИдентификаторФайлаВоВременномХранилище); - - Сообщение = Новый СообщениеПользователю(); + ВозвращаемоеЗначение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ВозвращаемоеЗначение, + ИменаФайлов.Количество(), ИдентификаторФайлаВоВременномХранилище); + + Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ВозвращаемоеЗначение; Сообщение.Сообщить(); - + КонецЕсли; - + КонецПроцедуры Процедура ЗагрузитьДанныеXDTOВИнформационнуюБазу(ПараметрыПроцедуры, АдресХранилища) Экспорт - + ПараметрыWEBСервиса = ПараметрыПроцедуры["ПараметрыWEBСервиса"]; СообщениеОбОшибке = ПараметрыПроцедуры["СообщениеОбОшибке"]; - + УстановитьПривилегированныйРежим(Истина); - + Отказ = Ложь; КомпонентыОбмена = КомпонентыОбмена("Получение", ПараметрыWEBСервиса, Отказ); - + Если КомпонентыОбмена.ФлагОшибки Тогда СообщениеОбОшибке = КомпонентыОбмена.СтрокаСообщенияОбОшибке; ВызватьИсключение СообщениеОбОшибке; КонецЕсли; - + СтруктураНастроекОбмена = СтруктураНастроекОбмена(КомпонентыОбмена, Перечисления.ДействияПриОбмене.ЗагрузкаДанных); - + Если Не Отказ Тогда ОтключитьОбновлениеКлючейДоступа(Истина); Попытка @@ -567,12 +574,11 @@ Информация = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при загрузке данных: %1'"); СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СообщениеОбОшибке, - ПодробноеПредставлениеОшибки(Информация)); + СообщениеОбОшибке, ПодробноеПредставлениеОшибки(Информация)); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СообщениеОбОшибке, , , , , Истина); КомпонентыОбмена.ФлагОшибки = Истина; КонецПопытки; - + ОтключитьОбновлениеКлючейДоступа(Истина); Попытка ОбменДаннымиXDTOСервер.УдалитьВременныеОбъектыСозданныеПоСсылкам(КомпонентыОбмена); @@ -582,134 +588,121 @@ Информация = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при удалении временных объектов, созданных по ссылкам: %1'"); СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - СообщениеОбОшибке, - ПодробноеПредставлениеОшибки(Информация)); + СообщениеОбОшибке, ПодробноеПредставлениеОшибки(Информация)); ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СообщениеОбОшибке, , , , , Истина); КомпонентыОбмена.ФлагОшибки = Истина; КонецПопытки; - + КомпонентыОбмена.ФайлОбмена.Закрыть(); Иначе КомпонентыОбмена.ФлагОшибки = Истина; КонецЕсли; - + ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена, КомпонентыОбмена); - + Если КомпонентыОбмена.ФлагОшибки Тогда ВызватьИсключение КомпонентыОбмена.СтрокаСообщенияОбОшибке; КонецЕсли; - - Если Не КомпонентыОбмена.ФлагОшибки - И КомпонентыОбмена.ЭтоОбменЧерезПланОбмена + + Если Не КомпонентыОбмена.ФлагОшибки И КомпонентыОбмена.ЭтоОбменЧерезПланОбмена И КомпонентыОбмена.ИспользоватьКвитирование Тогда // Запишем информацию о номере входящего сообщения. НачатьТранзакцию(); Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(КомпонентыОбмена.УзелКорреспондента)); - ЭлементБлокировки.УстановитьЗначение("Ссылка", КомпонентыОбмена.УзелКорреспондента); - Блокировка.Заблокировать(); - + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке( + КомпонентыОбмена.УзелКорреспондента)); + ЭлементБлокировки.УстановитьЗначение("Ссылка", КомпонентыОбмена.УзелКорреспондента); + Блокировка.Заблокировать(); + ЗаблокироватьДанныеДляРедактирования(КомпонентыОбмена.УзелКорреспондента); ОбъектУзла = КомпонентыОбмена.УзелКорреспондента.ПолучитьОбъект(); - + ОбъектУзла.НомерПринятого = КомпонентыОбмена.НомерВходящегоСообщения; ОбъектУзла.ДополнительныеСвойства.Вставить("ПолучениеСообщенияОбмена"); - ОбъектУзла.Записать(); + ОбъектУзла.Записать(); - ЗафиксироватьТранзакцию(); + ЗафиксироватьТранзакцию(); Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; + ОтменитьТранзакцию(); + ВызватьИсключение; КонецПопытки; - + КонецЕсли; - + КонецПроцедуры Функция ВременныйКаталогВыгрузки(Знач ИдентификаторСессии) Экспорт - + УстановитьПривилегированныйРежим(Истина); - + ВременныйКаталог = "{ИдентификаторСессии}"; ВременныйКаталог = СтрЗаменить(ВременныйКаталог, "ИдентификаторСессии", Строка(ИдентификаторСессии)); - - Результат = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(), ВременныйКаталог); - + + Результат = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( + ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(), ВременныйКаталог); + Возврат Результат; - + КонецФункции -Процедура ПроверитьВозможностьВыполненияОбменов() Экспорт - - Если Не ПравоДоступа("Просмотр", Метаданные.ОбщиеКоманды.Синхронизировать) Тогда - - ВызватьИсключение НСтр("ru = 'Недостаточно прав для синхронизации данных.'"); - - ИначеЕсли ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() - И Не РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена") Тогда - - ВызватьИсключение НСтр("ru = 'Информационная база находится в состоянии обновления.'"); - - КонецЕсли; - -КонецПроцедуры - Процедура ПроверитьБлокировкуИнформационнойБазыДляОбновления() Экспорт - + Если ЗначениеЗаполнено(ОбновлениеИнформационнойБазыСлужебный.ИнформационнаяБазаЗаблокированаДляОбновления()) Тогда - + ВызватьИсключение НСтр("ru = 'Синхронизация данных временно недоступна в связи с обновлением приложения.'"); - + КонецЕсли; - + КонецПроцедуры Функция ПолучитьСтатусВыполненияПолученияДанных(ИдентификаторДлительнойОперации, СообщениеОбОшибке) Экспорт - + СообщениеОбОшибке = ""; - + УстановитьПривилегированныйРежим(Истина); - ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ИдентификаторДлительнойОперации)); - + ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(ИдентификаторДлительнойОперации)); + СостоянияФоновогоЗадания = СостоянияФоновыхЗаданий(); Если ФоновоеЗадание = Неопределено Тогда СостояниеТекущегоФоновогоЗадания = СостоянияФоновогоЗадания.Получить(СостояниеФоновогоЗадания.Отменено); Иначе - + Если ФоновоеЗадание.ИнформацияОбОшибке <> Неопределено Тогда СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); КонецЕсли; - СостояниеТекущегоФоновогоЗадания = СостоянияФоновогоЗадания.Получить(ФоновоеЗадание.Состояние) - + СостояниеТекущегоФоновогоЗадания = СостоянияФоновогоЗадания.Получить(ФоновоеЗадание.Состояние); + КонецЕсли; - + Возврат СостояниеТекущегоФоновогоЗадания; - + КонецФункции Функция ПолучитьСтатусВыполненияПодготовкиДанныхКОтправке(ИдентификаторФоновогоЗадания, СообщениеОбОшибке) Экспорт - + СообщениеОбОшибке = ""; - + УстановитьПривилегированныйРежим(Истина); - + ВозвращаемаяСтруктура = ФабрикаXDTO.Создать( ФабрикаXDTO.Тип("http://v8.1c.ru/SSL/Exchange/EnterpriseDataExchange", "PrepareDataOperationResult")); - - ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ИдентификаторФоновогоЗадания)); - + + ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(ИдентификаторФоновогоЗадания)); + Если ФоновоеЗадание = Неопределено Тогда СостояниеТекущегоФоновогоЗадания = СостоянияФоновыхЗаданий().Получить(СостояниеФоновогоЗадания.Отменено); Иначе - + СообщениеОбОшибке = ""; КоличествоЧастейФайла = 0; ИдентификаторФайла = ""; СостояниеТекущегоФоновогоЗадания = СостоянияФоновыхЗаданий().Получить(ФоновоеЗадание.Состояние); - + Если ФоновоеЗадание.ИнформацияОбОшибке <> Неопределено Тогда СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); Иначе @@ -728,18 +721,18 @@ КонецЕсли; КонецЕсли; КонецЕсли; - + ВозвращаемаяСтруктура.ErrorMessage = СообщениеОбОшибке; ВозвращаемаяСтруктура.FileID = ИдентификаторФайла; ВозвращаемаяСтруктура.PartCount = КоличествоЧастейФайла; ВозвращаемаяСтруктура.Status = СостояниеТекущегоФоновогоЗадания; - + Возврат ВозвращаемаяСтруктура; - + КонецФункции Функция ИнициализироватьПараметрыWebСервиса() Экспорт - + СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("ИмяПланаОбмена"); СтруктураПараметров.Вставить("КодУзлаПланаОбмена"); @@ -748,16 +741,16 @@ СтруктураПараметров.Вставить("ИмяWEBСервиса"); Возврат СтруктураПараметров; - + КонецФункции Процедура ОтключитьОбновлениеКлючейДоступа(Отключить, ПланироватьОбновление = Истина) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); МодульУправлениеДоступом.ОтключитьОбновлениеКлючейДоступа(Отключить, ПланироватьОбновление); КонецЕсли; - + КонецПроцедуры Процедура ПоместитьСообщениеДляСопоставленияДанных(УзелОбмена, ИдентификаторСообщения) Экспорт @@ -765,16 +758,17 @@ // Удаляется предыдущее сообщение для сопоставления данных. Отбор = Новый Структура("УзелИнформационнойБазы", УзелОбмена); ОбщиеНастройки = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.Получить(Отбор); - + Если ЗначениеЗаполнено(ОбщиеНастройки.СообщениеДляСопоставленияДанных) Тогда ИмяВременногоФайла = ""; Попытка - ИмяВременногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ОбщиеНастройки.СообщениеДляСопоставленияДанных); + ИмяВременногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища( + ОбщиеНастройки.СообщениеДляСопоставленияДанных); Исключение РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.ПоместитьСообщениеДляСопоставленияДанных( УзелОбмена, ""); КонецПопытки; - + Если Не ПустаяСтрока(ИмяВременногоФайла) Тогда Файл = Новый Файл(ИмяВременногоФайла); Если Файл.Существует() И Файл.ЭтоФайл() Тогда @@ -783,64 +777,93 @@ Исключение // Возвращаем информацию о файле во временное хранилище, // для последующего удаления через регл. задание. - ОбменДаннымиСервер.ПоместитьФайлВХранилище(ИмяВременногоФайла, ОбщиеНастройки.СообщениеДляСопоставленияДанных); + ОбменДаннымиСервер.ПоместитьФайлВХранилище(ИмяВременногоФайла, + ОбщиеНастройки.СообщениеДляСопоставленияДанных); КонецПопытки; КонецЕсли; КонецЕсли; КонецЕсли; - + РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.ПоместитьСообщениеДляСопоставленияДанных( УзелОбмена, ИдентификаторСообщения); - + КонецПроцедуры // Получает состояние длительной операции (фонового задания), выполняемой в базе-корреспонденте для узла информационной // базы. // -Функция СостояниеДлительнойОперацииДляУзлаИнформационнойБазы(Знач ИдентификаторОперации, - Знач УзелИнформационнойБазы, - Знач ПараметрыАутентификации = Неопределено, - СтрокаСообщенияОбОшибке = "") Экспорт - +Функция СостояниеДлительнойОперацииДляУзлаИнформационнойБазы(Знач ИдентификаторОперации, Знач УзелИнформационнойБазы, + Знач ПараметрыАутентификации = Неопределено, СтрокаСообщенияОбОшибке = "") Экспорт + УстановитьПривилегированныйРежим(Истина); - + ПараметрыПодключения = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS( УзелИнформационнойБазы, ПараметрыАутентификации); - + ВерсииИнтерфейса = ОбменДаннымиПовтИсп.ВерсииКорреспондента(ПараметрыПодключения); - + WSПрокси = Неопределено; Если ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда - + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_3_0_1_1(ПараметрыПодключения, СтрокаСообщенияОбОшибке); - + ИначеЕсли ВерсииИнтерфейса.Найти("2.1.1.7") <> Неопределено Тогда - + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_1_1_7(ПараметрыПодключения, СтрокаСообщенияОбОшибке); - + ИначеЕсли ВерсииИнтерфейса.Найти("2.0.1.6") <> Неопределено Тогда - + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси_2_0_1_6(ПараметрыПодключения, СтрокаСообщенияОбОшибке); - + Иначе - + WSПрокси = ОбменДаннымиСервер.ПолучитьWSПрокси(ПараметрыПодключения, СтрокаСообщенияОбОшибке); - + КонецЕсли; - + Если WSПрокси = Неопределено Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; КонецЕсли; - + Результат = WSПрокси.GetContinuousOperationStatus(ИдентификаторОперации, СтрокаСообщенияОбОшибке); - + Если Результат = "Failed" Тогда СтрокаСообщения = НСтр("ru = 'Ошибка в базе-корреспонденте: %1'"); - СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтрокаСообщенияОбОшибке); + СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, + СтрокаСообщенияОбОшибке); КонецЕсли; - + Возврат Результат; - + +КонецФункции + +// Устанавливает признак необходимости загрузки расширений +Процедура ВключитьЗагрузкуРасширенийИзменяющиеСтруктуруДанных() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Константы.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных.Установить(Истина); + +КонецПроцедуры + +// Сбрасывает признак необходимости загрузки расширения +Процедура ОтключитьЗагрузкуРасширенийИзменяющихСтруктуруДанных() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если Константы.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных.Получить() Тогда + Константы.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных.Установить(Ложь); + КонецЕсли; + +КонецПроцедуры + +// Возвращает признак необходимости загрузки расширений +Функция ЗагрузитьРасширенияИзменяющиеСтруктуруДанных() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Возврат Константы.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных.Получить() + КонецФункции #Область ВыполнениеОбменаМетодамиСериализации @@ -855,63 +878,62 @@ // * ИмяПредопределенныхДанных - Строка - имя предопределенного элемента. // Функция ТаблицаПредопределенныхДанных() Экспорт - + ТаблицаПредопределенных = Новый ТаблицаЗначений; ТаблицаПредопределенных.Колонки.Добавить("ИмяТаблицы"); ТаблицаПредопределенных.Колонки.Добавить("ИмяТипаXML"); ТаблицаПредопределенных.Колонки.Добавить("Ссылка"); ТаблицаПредопределенных.Колонки.Добавить("ИмяПредопределенныхДанных"); - + ВидыМетаданных = Новый Массив; ВидыМетаданных.Добавить(Метаданные.Справочники); ВидыМетаданных.Добавить(Метаданные.ПланыВидовРасчета); ВидыМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик); ВидыМетаданных.Добавить(Метаданные.ПланыСчетов); - + ПакетЗапросов = Новый Массив; // Массив из Запрос СчетчикТаблиц = 0; ТекстЗапроса = ""; - + Для Каждого ВидМетаданных Из ВидыМетаданных Цикл - + Для Каждого ТекущиеМетаданные Из ВидМетаданных Цикл - + Если СчетчикТаблиц = 256 Тогда ПакетЗапросов.Добавить(Новый Запрос(ТекстЗапроса)); - + СчетчикТаблиц = 0; ТекстЗапроса = ""; КонецЕсли; - + СчетчикТаблиц = СчетчикТаблиц + 1; - + Если СчетчикТаблиц > 1 Тогда ТекстЗапроса = ТекстЗапроса + " - |ОБЪЕДИНИТЬ ВСЕ"; + |ОБЪЕДИНИТЬ ВСЕ"; КонецЕсли; - + ТекстЗапроса = ТекстЗапроса + СтрЗаменить(" - |ВЫБРАТЬ - | ""#ИмяТаблицы"" КАК ИмяТаблицы, - | Т.Ссылка КАК Ссылка, - | Т.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных - |ИЗ - | #ИмяТаблицы КАК Т - |ГДЕ - | Т.ИмяПредопределенныхДанных <> """"", - "#ИмяТаблицы", + |ВЫБРАТЬ + | ""#ИмяТаблицы"" КАК ИмяТаблицы, + | Т.Ссылка КАК Ссылка, + | Т.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных + |ИЗ + | #ИмяТаблицы КАК Т + |ГДЕ + | Т.ИмяПредопределенныхДанных <> """"", "#ИмяТаблицы", ТекущиеМетаданные.ПолноеИмя()); - + КонецЦикла; - + КонецЦикла; - + Если СчетчикТаблиц > 1 Тогда ПакетЗапросов.Добавить(Новый Запрос(ТекстЗапроса)); КонецЕсли; - + Для Каждого ТекущийЗапрос Из ПакетЗапросов Цикл - + Выборка = ТекущийЗапрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл СтрокаПредопределенных = ТаблицаПредопределенных.Добавить(); @@ -919,11 +941,11 @@ СтрокаПредопределенных.ИмяТипаXML = XMLТипЗнч(СтрокаПредопределенных.Ссылка).ИмяТипа; КонецЦикла; Выборка = Неопределено; - + КонецЦикла; - + Возврат ТаблицаПредопределенных; - + КонецФункции // Параметры: @@ -936,48 +958,50 @@ // ТаблицаПредопределенных - см. ОбменДаннымиСлужебный.ТаблицаПредопределенныхДанных // Процедура ОтметитьСсылкиНаПредопределенныеДанные(Данные, ТаблицаПредопределенных) Экспорт - - Если Данные = Неопределено - Или ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда + + Если Данные = Неопределено Или ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда Возврат; Иначе МетаданныеОбъекта = Данные.Метаданные(); - + Если ОбщегоНазначения.ЭтоКонстанта(МетаданныеОбъекта) Тогда - + ПроверитьОтметитьСсылкуПредопределенных(Данные.Значение, ТаблицаПредопределенных); - + ИначеЕсли ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда - + МассивКоллекций = Новый Массив; МассивКоллекций.Добавить(МетаданныеОбъекта.Реквизиты); МассивКоллекций.Добавить(МетаданныеОбъекта.СтандартныеРеквизиты); - + Если ОбщегоНазначения.ЭтоЗадача(МетаданныеОбъекта) Тогда МассивКоллекций.Добавить(МетаданныеОбъекта.РеквизитыАдресации); КонецЕсли; - - ПроверитьОтметитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, ТаблицаПредопределенных); - + + ПроверитьОтметитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, + ТаблицаПредопределенных); + Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл - ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧасть.Имя].Выгрузить(), ТаблицаПредопределенных); + ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧасть.Имя].Выгрузить(), + ТаблицаПредопределенных); КонецЦикла; - - Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) - Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта) Тогда + + Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) Или ОбщегоНазначения.ЭтоПланВидовРасчета( + МетаданныеОбъекта) Тогда Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.СтандартныеТабличныеЧасти Цикл ТабличнаяЧастьПланаСчетов = ТабличнаяЧасть; // ОбъектМетаданныхПланСчетов - ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧастьПланаСчетов.Имя].Выгрузить(), ТаблицаПредопределенных); + ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных( + Данные[ТабличнаяЧастьПланаСчетов.Имя].Выгрузить(), ТаблицаПредопределенных); КонецЦикла; КонецЕсли; - + ИначеЕсли ОбщегоНазначения.ЭтоРегистр(МетаданныеОбъекта) Тогда - + ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных(Данные.Выгрузить(), ТаблицаПредопределенных); - + КонецЕсли; КонецЕсли; - + КонецПроцедуры // Параметры: @@ -988,70 +1012,73 @@ // ТаблицаПредопределенных - см. ОбменДаннымиСлужебный.ТаблицаПредопределенныхДанных // Процедура ЗаменитьСсылкиНаПредопределенныеЭлементы(Данные, ТаблицаПредопределенных) Экспорт - - Если Данные = Неопределено - Или ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда + + Если Данные = Неопределено Или ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда Возврат; Иначе МетаданныеОбъекта = Данные.Метаданные(); - + Если ОбщегоНазначения.ЭтоКонстанта(МетаданныеОбъекта) Тогда - + ПроверитьЗаменитьСсылкуПредопределенногоВРеквизитеОбъекта(Данные, "Значение", ТаблицаПредопределенных); - + ИначеЕсли ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда - + ОбработатьЗагрузкуПредопределенногоЭлемента(Данные, ТаблицаПредопределенных); - + МассивКоллекций = Новый Массив; МассивКоллекций.Добавить(МетаданныеОбъекта.Реквизиты); МассивКоллекций.Добавить(МетаданныеОбъекта.СтандартныеРеквизиты); - + Если ОбщегоНазначения.ЭтоЗадача(МетаданныеОбъекта) Тогда МассивКоллекций.Добавить(МетаданныеОбъекта.РеквизитыАдресации); КонецЕсли; - - ПроверитьЗаменитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, ТаблицаПредопределенных); - + + ПроверитьЗаменитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, + ТаблицаПредопределенных); + Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл - ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧасть.Имя], ТаблицаПредопределенных); + ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧасть.Имя], + ТаблицаПредопределенных); КонецЦикла; - - Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) - Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта) Тогда + + Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) Или ОбщегоНазначения.ЭтоПланВидовРасчета( + МетаданныеОбъекта) Тогда Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.СтандартныеТабличныеЧасти Цикл ТабличнаяЧастьПланаСчетов = ТабличнаяЧасть; // ОбъектМетаданныхПланСчетов - ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧастьПланаСчетов.Имя], ТаблицаПредопределенных); + ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧастьПланаСчетов.Имя], + ТаблицаПредопределенных); КонецЦикла; КонецЕсли; - + ИначеЕсли ОбщегоНазначения.ЭтоРегистр(МетаданныеОбъекта) Тогда - + Для Каждого ЭлементОтбора Из Данные.Отбор Цикл СтруктураОтбора = Новый Структура("Значение, Использование"); ЗаполнитьЗначенияСвойств(СтруктураОтбора, ЭлементОтбора); - + Если СтруктураОтбора.Использование = Ложь Тогда Продолжить; КонецЕсли; - - ПроверитьЗаменитьСсылкуПредопределенногоВРеквизитеОбъекта(СтруктураОтбора, "Значение", ТаблицаПредопределенных); + + ПроверитьЗаменитьСсылкуПредопределенногоВРеквизитеОбъекта(СтруктураОтбора, "Значение", + ТаблицаПредопределенных); ЭлементОтбора.Установить(СтруктураОтбора.Значение); КонецЦикла; - + ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(Данные, ТаблицаПредопределенных); - + КонецЕсли; КонецЕсли; - + КонецПроцедуры #КонецОбласти Функция СоставПланаОбмена(ИмяПланаОбмена, Периодические = Истина, Справочные = Истина) Экспорт - + Возврат ОбменДаннымиПовтИсп.СоставПланаОбмена(ИмяПланаОбмена, Периодические, Справочные); - + КонецФункции // Выполняет добавление информации об установленном в константе количестве элементов в транзакции @@ -1061,12 +1088,12 @@ // Результат - Структура - содержит параметры транспорта сообщений обмена. // Процедура ДополнитьНастройкиТранспортаКоличествомЭлементовВТранзакции(Результат) Экспорт - + Результат.Вставить("КоличествоЭлементовВТранзакцииВыгрузкиДанных", ОбменДаннымиСервер.КоличествоЭлементовВТранзакцииВыгрузкиДанных()); Результат.Вставить("КоличествоЭлементовВТранзакцииЗагрузкиДанных", ОбменДаннымиСервер.КоличествоЭлементовВТранзакцииЗагрузкиДанных()); - + КонецПроцедуры // Возвращает номер области по коду узла плана обмена (обмен сообщениями). @@ -1078,13 +1105,13 @@ // Число - номер области. // Функция НомерОбластиИзКодаУзлаПланаОбмена(Знач КодУзла) Экспорт - + Если ТипЗнч(КодУзла) <> Тип("Строка") Тогда ВызватьИсключение НСтр("ru = 'Неправильный тип параметра номер [1].'"); КонецЕсли; - + Результат = СтрЗаменить(КодУзла, "S0", ""); - + Возврат Число(Результат); КонецФункции @@ -1097,21 +1124,21 @@ // Структура - структура с результатом. // Функция РезультатЗапросаВСтруктуру(Знач РезультатЗапроса) Экспорт - + Результат = Новый Структура; Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл Результат.Вставить(Колонка.Имя); КонецЦикла; - + Если РезультатЗапроса.Пустой() Тогда Возврат Результат; КонецЕсли; - + Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); - + ЗаполнитьЗначенияСвойств(Результат, Выборка); - + Возврат Результат; КонецФункции @@ -1121,12 +1148,12 @@ // ЗначениеЭлемента - Произвольный - значение элемента отбора. // Процедура УстановитьЗначениеЭлементаОтбора(Отбор, КлючЭлемента, ЗначениеЭлемента) Экспорт - + ЭлементОтбора = Отбор.Найти(КлючЭлемента); Если ЭлементОтбора <> Неопределено Тогда ЭлементОтбора.Установить(ЗначениеЭлемента); КонецЕсли; - + КонецПроцедуры #Область РаботаСРегистрамиСведений @@ -1139,7 +1166,7 @@ // ИмяРегистра - Строка - имя регистра сведений, в который необходимо добавить запись. // Процедура ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, Знач ИмяРегистра, Загрузка = Ложь) Экспорт - + НаборЗаписей = СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, ИмяРегистра); // Добавляем только одну запись в новый набор записей. @@ -1147,12 +1174,12 @@ // Заполняем значения свойств записи из переданной структуры. ЗаполнитьЗначенияСвойств(НоваяЗапись, СтруктураЗаписи); - + НаборЗаписей.ОбменДанными.Загрузка = Загрузка; // записываем набор записей НаборЗаписей.Записать(); - + КонецПроцедуры // Обновляет запись в регистр сведений по переданным значениям структуры. @@ -1162,7 +1189,7 @@ // ИмяРегистра - Строка - имя регистра сведений, в котором необходимо обновить запись. // Процедура ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, Знач ИмяРегистра) Экспорт - + МетаданныеРегистра = Метаданные.РегистрыСведений[ИмяРегистра]; // ОбъектМетаданныхРегистрСведений // Создаем менеджер записи регистра. @@ -1170,16 +1197,16 @@ // Устанавливаем отбор по измерениям регистра. Для Каждого Измерение Из МетаданныеРегистра.Измерения Цикл - + ИмяИзмерения = Измерение.Имя; // Если задано значение в структуре, то отбор устанавливаем. Если СтруктураЗаписи.Свойство(ИмяИзмерения) Тогда - + МенеджерЗаписи[ИмяИзмерения] = СтруктураЗаписи[ИмяИзмерения]; - + КонецЕсли; - + КонецЦикла; // Считываем запись из базы данных. @@ -1190,7 +1217,7 @@ // записываем менеджер записи МенеджерЗаписи.Записать(); - + КонецПроцедуры // Удаляет набор записей в регистре по переданным значениям структуры. @@ -1200,14 +1227,14 @@ // ИмяРегистра - Строка - имя регистра сведений, в котором необходимо удалить набор записей. // Процедура УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, ИмяРегистра, Загрузка = Ложь) Экспорт - + НаборЗаписей = СоздатьНаборЗаписейРегистраСведений(СтруктураЗаписи, ИмяРегистра); - + НаборЗаписей.ОбменДанными.Загрузка = Загрузка; // записываем набор записей НаборЗаписей.Записать(); - + КонецПроцедуры // Создает набор записей регистра сведений по переданным значениям структуры. Добавляет одну запись в набор. @@ -1225,12 +1252,12 @@ НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); // РегистрСведенийНаборЗаписей // Устанавливаем отбор по измерениям регистра. - Для Каждого КлючЗначение Из СтруктураЗаписи Цикл + Для Каждого КлючЗначение Из СтруктураЗаписи Цикл УстановитьЗначениеЭлементаОтбора(НаборЗаписей.Отбор, КлючЗначение.Ключ, КлючЗначение.Значение); КонецЦикла; - + Возврат НаборЗаписей; - + КонецФункции #КонецОбласти @@ -1240,34 +1267,39 @@ #Область СлужебныеПроцедурыИФункции Функция КомпонентыОбмена(НаправлениеОбмена, ПараметрыWEBСервиса, Отказ = Ложь) - + КомпонентыОбмена = ОбменДаннымиXDTOСервер.ИнициализироватьКомпонентыОбмена(НаправлениеОбмена); - - Если ЗначениеЗаполнено(ПараметрыWEBСервиса.ИмяПланаОбмена) И ЗначениеЗаполнено(ПараметрыWEBСервиса.КодУзлаПланаОбмена) Тогда - КомпонентыОбмена.УзелКорреспондента = ПланыОбмена[ПараметрыWEBСервиса.ИмяПланаОбмена].НайтиПоКоду(ПараметрыWEBСервиса.КодУзлаПланаОбмена); + + Если ЗначениеЗаполнено(ПараметрыWEBСервиса.ИмяПланаОбмена) И ЗначениеЗаполнено( + ПараметрыWEBСервиса.КодУзлаПланаОбмена) Тогда + КомпонентыОбмена.УзелКорреспондента = ПланыОбмена[ПараметрыWEBСервиса.ИмяПланаОбмена].НайтиПоКоду( + ПараметрыWEBСервиса.КодУзлаПланаОбмена); Иначе КомпонентыОбмена.ЭтоОбменЧерезПланОбмена = Ложь; КонецЕсли; - + КомпонентыОбмена.ВедениеПротоколаДанных.ВыводВПротоколИнформационныхСообщений = Ложь; КомпонентыОбмена.СостояниеОбменаДанными.ДатаНачала = ТекущаяДатаСеанса(); КомпонентыОбмена.ИспользоватьТранзакции = Ложь; Если НаправлениеОбмена = "Получение" Тогда - - КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = СформироватьКлючСообщенияЖР(НаправлениеОбмена, ПараметрыWEBСервиса); - - ИмяФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ПараметрыWEBСервиса.ИдентификаторФайлаВоВременномХранилище); + + КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = СформироватьКлючСообщенияЖР(НаправлениеОбмена, + ПараметрыWEBСервиса); + + ИмяФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища( + ПараметрыWEBСервиса.ИдентификаторФайлаВоВременномХранилище); ОбменДаннымиXDTOСервер.ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайла); ОбменДаннымиXDTOСервер.ПослеОткрытияФайлаЗагрузки(КомпонентыОбмена, Отказ); - + Если Отказ Тогда Возврат КомпонентыОбмена; КонецЕсли; - + Иначе - - КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = СформироватьКлючСообщенияЖР(НаправлениеОбмена, ПараметрыWEBСервиса); + + КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = СформироватьКлючСообщенияЖР(НаправлениеОбмена, + ПараметрыWEBСервиса); КомпонентыОбмена.ВерсияФорматаОбмена = ОбменДаннымиXDTOСервер.ВерсияФорматаОбменаПриВыгрузке( КомпонентыОбмена.УзелКорреспондента); КомпонентыОбмена.XMLСхема = ОбменДаннымиXDTOСервер.ФорматОбмена( @@ -1278,101 +1310,102 @@ КомпонентыОбмена.УзелКорреспондента); КомпонентыОбмена.СвойстваУзлаПланаОбмена = ОбменДаннымиXDTOСервер.СвойстваУзлаПланаОбмена( КомпонентыОбмена.УзелКорреспондента); - + КонецЕсли; - + Если КомпонентыОбмена.ФлагОшибки Тогда Возврат КомпонентыОбмена; КонецЕсли; - + ОбменДаннымиXDTOСервер.ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена); - + Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда ОбменДаннымиXDTOСервер.ЗаполнитьСтруктуруНастроекXDTO(КомпонентыОбмена); ОбменДаннымиXDTOСервер.ЗаполнитьПоддерживаемыеОбъектыXDTO(КомпонентыОбмена); КонецЕсли; - + ОбменДаннымиXDTOСервер.ПослеИнициализацииКомпонентыОбмена(КомпонентыОбмена); - + Возврат КомпонентыОбмена; - + КонецФункции Функция ПолучитьИмяЧастиФайла(НомерЧастиФайла, ИмяАрхива = "") - + Если Не ЗначениеЗаполнено(ИмяАрхива) Тогда ИмяАрхива = "data"; КонецЕсли; - - Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.zip.%2", ИмяАрхива, Формат(НомерЧастиФайла, "ЧГ=0")); - + + Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.zip.%2", ИмяАрхива, Формат(НомерЧастиФайла, + "ЧГ=0")); + Возврат Результат; - + КонецФункции Функция СостоянияФоновыхЗаданий() - + СостоянияФоновогоЗадания = Новый Соответствие; - СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Активно, "Active"); - СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Завершено, "Completed"); + СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Активно, "Active"); + СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Завершено, "Completed"); СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.ЗавершеноАварийно, "Failed"); - СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Отменено, "Canceled"); - + СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Отменено, "Canceled"); + Возврат СостоянияФоновогоЗадания; - + КонецФункции Функция СформироватьКлючСообщенияЖР(НаправлениеОбмена, ПараметрыWEBСервиса) - + Если НаправлениеОбмена = "Получение" Тогда ШаблонКлючаСообщения = НСтр("ru = 'Загрузка данных через Web-сервис %1'", ОбщегоНазначения.КодОсновногоЯзыка()); Иначе ШаблонКлючаСообщения = НСтр("ru = 'Выгрузка данных через Web-сервис %1'", ОбщегоНазначения.КодОсновногоЯзыка()); КонецЕсли; - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКлючаСообщения, ПараметрыWEBСервиса.ИмяWEBСервиса); - + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКлючаСообщения, + ПараметрыWEBСервиса.ИмяWEBСервиса); + КонецФункции Функция СтруктураНастроекОбмена(КомпонентыОбмена, ДействиеОбменаДанными) - + Если Не КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда Возврат Неопределено; КонецЕсли; - + СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы( КомпонентыОбмена.УзелКорреспондента, ДействиеОбменаДанными, Неопределено, Ложь); - + Если СтруктураНастроекОбмена.Отказ Тогда СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при инициализации процесса обмена данными.'"); ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); ВызватьИсключение СтрокаСообщенияОбОшибке; КонецЕсли; - + СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; СтруктураНастроекОбмена.ДатаНачала = ТекущаяДатаСеанса(); - + СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); - - ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, - УровеньЖурналаРегистрации.Информация, - СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), - СтруктураНастроекОбмена.УзелИнформационнойБазы, - СтрокаСообщения); - + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, + СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование); + + ЗаписьЖурналаРегистрации(СтруктураНастроекОбмена.КлючСообщенияЖурналаРегистрации, + УровеньЖурналаРегистрации.Информация, СтруктураНастроекОбмена.УзелИнформационнойБазы.Метаданные(), + СтруктураНастроекОбмена.УзелИнформационнойБазы, СтрокаСообщения); + Возврат СтруктураНастроекОбмена; - + КонецФункции Процедура ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена, КомпонентыОбмена) - + Если Не КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда Возврат; КонецЕсли; - + СтруктураНастроекОбмена.РезультатВыполненияОбмена = КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена; - + Если СтруктураНастроекОбмена.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных Тогда СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КомпонентыОбмена.СчетчикВыгруженныхОбъектов; СтруктураНастроекОбмена.СообщениеПриОбмене = СтруктураНастроекОбмена.ОбработкаОбменаДанными.КомментарийПриВыгрузкеДанных; @@ -1380,31 +1413,31 @@ СтруктураНастроекОбмена.КоличествоОбъектовОбработано = КомпонентыОбмена.СчетчикЗагруженныхОбъектов; СтруктураНастроекОбмена.СообщениеПриОбмене = СтруктураНастроекОбмена.ОбработкаОбменаДанными.КомментарийПриЗагрузкеДанных; КонецЕсли; - + СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке = КомпонентыОбмена.СтрокаСообщенияОбОшибке; - + ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена); - + КонецПроцедуры #Область ВыполнениеОбменаМетодамиСериализации Процедура ПроверитьОтметитьСсылкуПредопределенных(Значение, ТаблицаПредопределенных) - + Если Не ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Значение)) Тогда Возврат; КонецЕсли; - + СтрокаПредопределенных = ТаблицаПредопределенных.Найти(Значение, "Ссылка"); Если СтрокаПредопределенных = Неопределено Тогда // Значение не является предопределенным элементом. Возврат; КонецЕсли; - + Если Не СтрокаПредопределенных.Выгружать Тогда СтрокаПредопределенных.Выгружать = Истина; КонецЕсли; - + КонецПроцедуры // Параметры: @@ -1412,14 +1445,15 @@ // МассивКоллекций - Массив из КоллекцияОбъектовМетаданных - набор коллекций реквизитов. // ТаблицаПредопределенных - ТаблицаЗначений - таблица предопределенных элементов. // -Процедура ПроверитьОтметитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, ТаблицаПредопределенных) - +Процедура ПроверитьОтметитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, + ТаблицаПредопределенных) + Для Каждого КоллекцияРеквизитов Из МассивКоллекций Цикл Для Каждого Реквизит Из КоллекцияРеквизитов Цикл ПроверитьОтметитьСсылкуПредопределенных(Данные[Реквизит.Имя], ТаблицаПредопределенных); КонецЦикла; КонецЦикла; - + КонецПроцедуры // Параметры: @@ -1427,13 +1461,13 @@ // ТаблицаПредопределенных - ТаблицаЗначений - таблица предопределенных элементов. // Процедура ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных(ДанныеТаблицы, ТаблицаПредопределенных) - + Для Каждого СтрокаТаблицы Из ДанныеТаблицы Цикл Для Каждого Колонка Из ДанныеТаблицы.Колонки Цикл ПроверитьОтметитьСсылкуПредопределенных(СтрокаТаблицы[Колонка.Имя], ТаблицаПредопределенных); КонецЦикла; КонецЦикла; - + КонецПроцедуры // Параметры: @@ -1444,49 +1478,46 @@ // ТаблицаПредопределенных - см. ОбменДаннымиСлужебный.ТаблицаПредопределенныхДанных // Процедура ОбработатьЗагрузкуПредопределенногоЭлемента(Данные, ТаблицаПредопределенных) - + ИсходнаяСсылкаДанных = Данные.Ссылка; Если Данные.ЭтоНовый() Тогда ИсходнаяСсылкаДанных = Данные.ПолучитьСсылкуНового(); КонецЕсли; - + СтрокаПредопределенные = ТаблицаПредопределенных.Найти(ИсходнаяСсылкаДанных, "ИсходнаяСсылка"); Если СтрокаПредопределенные = Неопределено Тогда Возврат; КонецЕсли; - + ДанныеДляЗагрузки = СтрокаПредопределенные.Ссылка.ПолучитьОбъект(); МетаданныеОбъекта = ДанныеДляЗагрузки.Метаданные(); - + МассивКоллекций = Новый Массив; МассивКоллекций.Добавить(МетаданныеОбъекта.Реквизиты); МассивКоллекций.Добавить(МетаданныеОбъекта.СтандартныеРеквизиты); - + Если ОбщегоНазначения.ЭтоЗадача(МетаданныеОбъекта) Тогда МассивКоллекций.Добавить(МетаданныеОбъекта.РеквизитыАдресации); КонецЕсли; - + ПеренестиЗначенияКоллекцииРеквизитовМеждуОбъектами(Данные, ДанныеДляЗагрузки, МассивКоллекций); - + Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл - Если Данные[ТабличнаяЧасть.Имя].Количество() > 0 - Или ДанныеДляЗагрузки[ТабличнаяЧасть.Имя].Количество() > 0 Тогда + Если Данные[ТабличнаяЧасть.Имя].Количество() > 0 Или ДанныеДляЗагрузки[ТабличнаяЧасть.Имя].Количество() > 0 Тогда ДанныеДляЗагрузки[ТабличнаяЧасть.Имя].Загрузить(Данные[ТабличнаяЧасть.Имя].Выгрузить()); КонецЕсли; КонецЦикла; - - Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) - Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта) Тогда + + Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта) Тогда Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.СтандартныеТабличныеЧасти Цикл - Если Данные[ТабличнаяЧасть.Имя].Количество() > 0 - Или ДанныеДляЗагрузки[ТабличнаяЧасть.Имя].Количество() > 0 Тогда + Если Данные[ТабличнаяЧасть.Имя].Количество() > 0 Или ДанныеДляЗагрузки[ТабличнаяЧасть.Имя].Количество() > 0 Тогда ДанныеДляЗагрузки[ТабличнаяЧасть.Имя].Загрузить(Данные[ТабличнаяЧасть.Имя].Выгрузить()); КонецЕсли; КонецЦикла; КонецЕсли; - + Данные = ДанныеДляЗагрузки; - + КонецПроцедуры // Параметры: @@ -1495,7 +1526,7 @@ // МассивКоллекций - Массив из КоллекцияОбъектовМетаданных - набор коллекций реквизитов. // Процедура ПеренестиЗначенияКоллекцииРеквизитовМеждуОбъектами(Источник, Приемник, МассивКоллекций) - + Для Каждого КоллекцияРеквизитов Из МассивКоллекций Цикл Для Каждого Реквизит Из КоллекцияРеквизитов Цикл ИмяРеквизита = Реквизит.Имя; @@ -1508,7 +1539,7 @@ Приемник[ИмяРеквизита] = Источник[ИмяРеквизита]; КонецЦикла; КонецЦикла; - + КонецПроцедуры // Параметры: @@ -1517,18 +1548,18 @@ // ТаблицаПредопределенных - см. ОбменДаннымиСлужебный.ТаблицаПредопределенныхДанных // Процедура ПроверитьЗаменитьСсылкуПредопределенногоВРеквизитеОбъекта(Данные, ИмяРеквизита, ТаблицаПредопределенных) - + Значение = Данные[ИмяРеквизита]; - + Если Не ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Значение)) Тогда Возврат; КонецЕсли; - + СтрокаПредопределенные = ТаблицаПредопределенных.Найти(Значение, "ИсходнаяСсылка"); Если Не СтрокаПредопределенные = Неопределено Тогда Данные[ИмяРеквизита] = СтрокаПредопределенные.Ссылка; КонецЕсли; - + КонецПроцедуры // Параметры: @@ -1536,14 +1567,15 @@ // МассивКоллекций - Массив из КоллекцияОбъектовМетаданных - набор коллекций реквизитов. // ТаблицаПредопределенных - см. ОбменДаннымиСлужебный.ТаблицаПредопределенныхДанных // -Процедура ПроверитьЗаменитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, ТаблицаПредопределенных) - +Процедура ПроверитьЗаменитьСсылкуПредопределенныхВКоллекцииРеквизитовОбъекта(Данные, МассивКоллекций, + ТаблицаПредопределенных) + Для Каждого КоллекцияРеквизитов Из МассивКоллекций Цикл Для Каждого Реквизит Из КоллекцияРеквизитов Цикл ПроверитьЗаменитьСсылкуПредопределенногоВРеквизитеОбъекта(Данные, Реквизит.Имя, ТаблицаПредопределенных); КонецЦикла; КонецЦикла; - + КонецПроцедуры // Параметры: @@ -1551,24 +1583,46 @@ // ТаблицаПредопределенных - см. ОбменДаннымиСлужебный.ТаблицаПредопределенныхДанных // Процедура ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(ДанныеТаблицы, ТаблицаПредопределенных) - + Если ДанныеТаблицы.Количество() = 0 Тогда Возврат; КонецЕсли; - + ТаблицаТЧ = ДанныеТаблицы.Выгрузить(); - + Для Каждого СтрокаТЧДанных Из ДанныеТаблицы Цикл Для Каждого Колонка Из ТаблицаТЧ.Колонки Цикл Если Не ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СтрокаТЧДанных, Колонка.Имя) Тогда Продолжить; КонецЕсли; - ПроверитьЗаменитьСсылкуПредопределенногоВРеквизитеОбъекта(СтрокаТЧДанных, Колонка.Имя, ТаблицаПредопределенных); + ПроверитьЗаменитьСсылкуПредопределенногоВРеквизитеОбъекта(СтрокаТЧДанных, Колонка.Имя, + ТаблицаПредопределенных); КонецЦикла; КонецЦикла; - + +КонецПроцедуры + +#Область УстаревшиеПроцедурыИФункции + +// Устарела. Следует использовать ОбменДаннымиСервер.ПроверитьВозможностьВыполненияОбменов(Ложь). +// +Процедура ПроверитьВозможностьВыполненияОбменов() Экспорт + + Если Не ПравоДоступа("Просмотр", Метаданные.ОбщиеКоманды.Синхронизировать) Тогда + + ВызватьИсключение НСтр("ru = 'Недостаточно прав для синхронизации данных.'"); + + ИначеЕсли ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() + И Не РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена") Тогда + + ВызватьИсключение НСтр("ru = 'Информационная база находится в состоянии обновления.'"); + + КонецЕсли; + КонецПроцедуры #КонецОбласти +#КонецОбласти + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl index 16d3d60d3..822eb0adc 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl @@ -537,7 +537,7 @@ // Необязательный, значение по умолчанию Неопределено. // * ТипВерсииОбъекта - Строка - тип создаваемой версии. // Необязательный, значение по умолчанию "ИзмененоПользователем". -// * Комментарий - Строка - комментарий к создаваемой версии. +// * ПредупреждениеСинхронизации - Строка - предупреждение синхронизации к создаваемой версии. // Необязательный, значение по умолчанию "". // Процедура ПриСозданииВерсииОбъекта(Объект, СведенияОВерсииОбъекта, СсылкаСуществует, Отправитель) Экспорт @@ -548,6 +548,7 @@ СведенияОНовойВерсииОбъекта.Вставить("АвторВерсии", Неопределено); СведенияОНовойВерсииОбъекта.Вставить("ТипВерсииОбъекта", "ИзмененоПользователем"); СведенияОНовойВерсииОбъекта.Вставить("Комментарий", ""); + СведенияОНовойВерсииОбъекта.Вставить("ПредупреждениеСинхронизации", ""); ЗаполнитьЗначенияСвойств(СведенияОНовойВерсииОбъекта, СведенияОВерсииОбъекта); МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); @@ -751,11 +752,12 @@ КонецЕсли; - Если Не Источник.ДополнительныеСвойства.Свойство("ПолучениеСообщенияОбмена") + Если Источник.ДополнительныеСвойства.Свойство("ОтложеннаяЗаписьУзла") + Или (Не Источник.ДополнительныеСвойства.Свойство("ПолучениеСообщенияОбмена") И Не Источник.ЭтоНовый() И Не Источник.ЭтотУзел И ДанныеРазличаются(Источник, Источник.Ссылка.ПолучитьОбъект(), , СтрСоединить(ИсключаемыеСвойства, ",")) - И ОбменДаннымиСлужебный.ИзмененияЗарегистрированы(Источник.Ссылка) Тогда + И ОбменДаннымиСлужебный.ИзмененияЗарегистрированы(Источник.Ссылка)) Тогда СохранитьРазрешенныеКВыгрузкеОбъекты(Источник); @@ -1046,6 +1048,21 @@ КонецПроцедуры +Процедура ПередУдалениемПланаОбмена(Источник, Отказ) Экспорт + + Если Источник.ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + Если ОбменДаннымиПовтИсп.ЭтоУзелОбменаДаннымиБСП(Источник.Ссылка) + И НЕ Источник.ДополнительныеСвойства.Свойство("УдалениеНастройкиСинхронизации") Тогда + + Отказ = Истина; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область МеханизмРегистрацииОбъектов @@ -1968,10 +1985,10 @@ КонецЕсли; + ПРО_СтрокиНабора = СкопироватьСтруктуру(ПРО); + Для Каждого СтрокаНабора Из НаборЗаписей Цикл - ПРО_СтрокиНабора = СкопироватьСтруктуру(ПРО); - Если ЕстьРегистратор И СтрокаНабора["Регистратор"] = Неопределено Тогда Если Регистратор <> Неопределено Тогда @@ -3576,12 +3593,12 @@ Если СсылкаСуществует Тогда Если ЗаписатьОбъект Тогда - Комментарий = НСтр("ru = 'Предыдущая версия (автоматическое разрешение конфликта).'"); + ПредупреждениеСинхронизации = НСтр("ru = 'Предыдущая версия (автоматическое разрешение конфликта).'"); Иначе - Комментарий = НСтр("ru = 'Текущая версия (автоматическое разрешение конфликта).'"); + ПредупреждениеСинхронизации = НСтр("ru = 'Текущая версия (автоматическое разрешение конфликта).'"); КонецЕсли; - СведенияОВерсииОбъекта = Новый Структура("Комментарий, ТипВерсииОбъекта", Комментарий, "НепринятыеДанныеПоКоллизии"); + СведенияОВерсииОбъекта = Новый Структура("ПредупреждениеСинхронизации, ТипВерсииОбъекта", ПредупреждениеСинхронизации, "НепринятыеДанныеПоКоллизии"); ПриСозданииВерсииОбъекта(ОбъектВБазе, СведенияОВерсииОбъекта, СсылкаСуществует, Отправитель); КонецЕсли; @@ -3590,11 +3607,11 @@ Если ЗаписатьОбъект Тогда СведенияОВерсииОбъекта.Вставить("АвторВерсии", Отправитель); СведенияОВерсииОбъекта.Вставить("ТипВерсииОбъекта", "ПринятыеДанныеПоКоллизии"); - СведенияОВерсииОбъекта.Вставить("Комментарий", НСтр("ru = 'Текущая версия (автоматическое разрешение конфликта).'")); + СведенияОВерсииОбъекта.Вставить("ПредупреждениеСинхронизации", НСтр("ru = 'Текущая версия (автоматическое разрешение конфликта).'")); Иначе СведенияОВерсииОбъекта.Вставить("АвторВерсии", Отправитель); СведенияОВерсииОбъекта.Вставить("ТипВерсииОбъекта", "НепринятыеДанныеПоКоллизии"); - СведенияОВерсииОбъекта.Вставить("Комментарий", НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'")); + СведенияОВерсииОбъекта.Вставить("ПредупреждениеСинхронизации", НСтр("ru = 'Отклоненная версия (автоматическое разрешение конфликта).'")); КонецЕсли; Если ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Отправитель) Тогда ПриСозданииВерсииОбъекта(ЭлементДанных, СведенияОВерсииОбъекта, СсылкаСуществует, Отправитель); @@ -3680,8 +3697,8 @@ ОбъектВБазе = СсылкаНаОбъект.ПолучитьОбъект(); - Комментарий = НСтр("ru = 'Версия создана при синхронизации данных.'"); - СведенияОВерсииОбъекта = Новый Структура("Комментарий", Комментарий); + ПредупреждениеСинхронизации = НСтр("ru = 'Версия создана при синхронизации данных.'"); + СведенияОВерсииОбъекта = Новый Структура("ПредупреждениеСинхронизации", ПредупреждениеСинхронизации); ПриСозданииВерсииОбъекта(ОбъектВБазе, СведенияОВерсииОбъекта, СсылкаСуществует, Отправитель); @@ -3707,7 +3724,8 @@ СведенияОВерсииОбъекта = Новый Структура; СведенияОВерсииОбъекта.Вставить("АвторВерсии", ОбщегоНазначения.МенеджерОбъектаПоСсылке(Отправитель.Ссылка).НайтиПоКоду(Отправитель.Код)); СведенияОВерсииОбъекта.Вставить("ТипВерсииОбъекта", ТипВерсииОбъекта); - СведенияОВерсииОбъекта.Вставить("Комментарий", СтрокаСообщенияОбОшибке); + СведенияОВерсииОбъекта.Вставить("Комментарий", ""); + СведенияОВерсииОбъекта.Вставить("ПредупреждениеСинхронизации", СтрокаСообщенияОбОшибке); Если ОбщегоНазначения.ЭтоДокумент(ЭлементДанных.Метаданные()) И ТипВерсииОбъекта = "НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе" Тогда diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl index f30be7907..df12a0bdf 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl @@ -354,14 +354,15 @@ // Параметры: // Данные - ЛюбаяСсылка // - Массив -// - НаборДанных - данные, по которым нужно зарегистрировать изменения. +// - РегистрСведенийНаборЗаписей, РегистрНакопленияНаборЗаписей, РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей - данные, по которым нужно зарегистрировать изменения. // - ТаблицаЗначений - значения измерений независимого регистра сведений. Требования: -// - все измерения регистра должны входить в основной отбор; -// - в таблице должны быть только колонки, соответствующие по именам измерениям регистра, +// а) все измерения регистра должны входить в основной отбор; +// б) в таблице должны быть только колонки, соответствующие по именам измерениям регистра, // по которым ранее регистрировалась необходимость обработки; -// - запись наборов в процессе обновления должна проходить с тем же отбором, +// в) запись наборов в процессе обновления должна проходить с тем же отбором, // что и регистрация необходимости обработки; -// - в ДополнительныеПараметры нужно передать соответствующий признак и полное имя регистра. +// г) в ДополнительныеПараметры нужно передать соответствующий признак и полное имя регистра. // ДополнительныеПараметры - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки. // Очередь - Число // - Неопределено - очередь обработки, в которой выполняется текущий обработчик. По умолчанию очередь передавать @@ -681,15 +682,16 @@ // ОсновныеПараметры - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке. // Данные - ЛюбаяСсылка // - Массив -// - НаборЗаписей - данные, по которым нужно зарегистрировать изменения. +// - РегистрСведенийНаборЗаписей, РегистрНакопленияНаборЗаписей, РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей - данные, по которым нужно зарегистрировать изменения. // - ТаблицаЗначений - значения измерений независимого регистра сведений. Требования: -// - нет измерений с именем "Узел"; -// - все измерения регистра должны входить в основной отбор; -// - в таблице должны быть только колонки, соответствующие по именам измерениям регистра, +// а) нет измерений с именем "Узел"; +// б) все измерения регистра должны входить в основной отбор; +// в) в таблице должны быть только колонки, соответствующие по именам измерениям регистра, // по которым нужно регистрировать необходимость обработки; -// - запись наборов в процессе обновления должна проходить с тем же отбором, +// г) запись наборов в процессе обновления должна проходить с тем же отбором, // что и регистрация необходимости обработки; -// - в ДополнительныеПараметры нужно передать соответствующий признак и полное имя регистра. +// д) в ДополнительныеПараметры нужно передать соответствующий признак и полное имя регистра. // ДополнительныеПараметры - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки. // Процедура ОтметитьКОбработке(ОсновныеПараметры, Данные, ДополнительныеПараметры = Неопределено) Экспорт @@ -860,8 +862,8 @@ // по дате документа. Если выбираются регистраторы регистра, то порция определяется с // учетом упорядочивания по убыванию по дате регистратора, если передано полное имя документа. // Если полное имя документа не передано - упорядочивание происходит по периоду регистра: -// - берется максимальная дата по каждому регистратору; -// - если по регистратору нет записей - он в топе. +// а) берется максимальная дата по каждому регистратору; +// б) если по регистратору нет записей, он в топе. // * ИмяВременнойТаблицы - Строка - параметр актуален для методов, создающих временные таблицы. Если имя не задано // (поведение по умолчанию), то временная таблица будет создана с именем, указанным // в описании каждого метода. @@ -1013,26 +1015,28 @@ КонецФункции // Создает временную таблицу ссылок, которые не обработаны в текущей очереди -// и не заблокированы меньшими очередями. -// Имя таблицы: ВТДляОбработки<ИмяРегистра>, например ВТДляОбработкиТоварыНаСкладах. -// Колонки таблицы: -// * Регистратор - ДокументСсылка. +// и не заблокированы меньшими очередями. +// Имя таблицы: ВТДляОбработки<ИмяРегистра>, например ВТДляОбработкиТоварыНаСкладах. +// Колонки таблицы: +// Регистратор - ДокументСсылка. // // Параметры: -// Очередь - Число - очередь обработки, в которой выполняется текущий обработчик. -// ПолноеИмяДокумента - Строка - имя документа, движения по которому нужно переформировать. Если движения формируются не по данным -// документа, то нужно передать Неопределено - тогда не будет проверяться блокировка таблицы документа. -// Например, Документ.ПриходныйОрдерНаТовары. +// Очередь - Число - очередь обработки, в которой выполняется текущий обработчик. +// ПолноеИмяДокумента - Строка - имя документа, движения по которому нужно переформировать. +// Если движения формируются не по данным документа, то нужно передать Неопределено - +// тогда не будет проверяться блокировка таблицы документа. +// Например, "Документ.ПриходныйОрдерНаТовары". // ПолноеИмяРегистра - Строка - имя регистра, движения по которому нужно переформировать. -// Например, РегистрНакопления.ТоварыНаСкладах. -// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. +// Например, "РегистрНакопления.ТоварыНаСкладах". +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. // ДополнительныеПараметры - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. // // Возвращаемое значение: // Структура - результат формирования временной таблицы: -// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. Записей может не быть по -// двум причинам -// все обработано или все, что нужно обработать, еще заблокировано обработчиками с меньшей очередью. +// * ЕстьЗаписиВоВременнойТаблице - Булево - в создаваемой таблице есть хотя бы одна запись. +// Записей может не быть по двум причинам: +// все обработано или все, что нужно обработать, еще заблокировано +// обработчиками с меньшей очередью. // * ЕстьДанныеДляОбработки - Булево - в очереди есть ссылки для обработки, т.е. еще не все обработано. // * ИмяВременнойТаблицы - Строка - имя созданной временной таблицы. // @@ -1071,15 +1075,16 @@ |СГРУППИРОВАТЬ ПО | ТаблицаРегистраИзменения.Регистратор | + |ИНДЕКСИРОВАТЬ ПО + | Регистратор + | |УПОРЯДОЧИТЬ ПО | МАКСИМУМ(ЕСТЬNULL(ТаблицаРегистра.Период, ДАТАВРЕМЯ(3000, 1, 1))) | - |ИНДЕКСИРОВАТЬ ПО - | Регистратор |; | |//////////////////////////////////////////////////////////////////////////////// - |УНИЧТОЖИТЬ ВТЗаблокированоРегистратор"; // @query-part + |УНИЧТОЖИТЬ ВТЗаблокированоРегистратор"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"#ТаблицаДвиженийРегистра", ПолноеИмяРегистра); Иначе @@ -1220,12 +1225,12 @@ // // Возвращаемое значение: // ВыборкаИзРезультатаЗапроса - выборка регистраторов, которые нужно обработать, поля выборки: -// ** Регистратор - ДокументСсылка. -// ** Период - Дата - дата документа, если передано полное имя документа, максимальный период по регистратору, +// * Регистратор - ДокументСсылка. +// * Период - Дата - дата документа, если передано полное имя документа, максимальный период по регистратору, // если полное имя документа не передано. -// ** Проведен - Булево +// * Проведен - Булево // - Неопределено - значение реквизита Проведен документа, если передано полное имя документа, -// Неопределено - если имя документа не передано. +// или Неопределено, если имя документа не передано. // ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. // Функция ВыбратьРегистраторыРегистраДляОбработки(Очередь, ПолноеИмяДокумента, ПолноеИмяРегистра, ДополнительныеПараметры = Неопределено) Экспорт @@ -1352,7 +1357,7 @@ // // Возвращаемое значение: // ВыборкаИзРезультатаЗапроса - выборка ссылок, которые нужно обработать, поля выборки: -// ** Ссылка - ЛюбаяСсылка. +// * Ссылка - ЛюбаяСсылка. // ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. // Функция ВыбратьСсылкиДляОбработки(Очередь, ПолноеИмяОбъекта, ДополнительныеПараметры = Неопределено) Экспорт @@ -1425,7 +1430,7 @@ // и не заблокированы меньшими очередями. // Имя таблицы: ВТДляОбработки<ИмяОбъекта>, например ВТДляОбработкиНоменклатура. // Колонки таблицы: -// * Ссылка - ЛюбаяСсылка. +// Ссылка - ЛюбаяСсылка. // // Параметры: // Очередь - Число - очередь обработки, в которой выполняется текущий обработчик. @@ -1473,7 +1478,7 @@ | И &УсловиеПоДопИсточникамРегистрам"; Если Не ДополнительныеПараметры.ВыбиратьПорциями Тогда - ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 10000", "ВЫБРАТЬ"); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 10000", "ВЫБРАТЬ"); // @query-part-1 @query-part-2 КонецЕсли; ФрагментыЗапроса.Добавить(ФрагментЗапроса); @@ -1676,7 +1681,7 @@ |УНИЧТОЖИТЬ #ВТЗаблокированоИзмерения"; Если Не ДополнительныеПараметры.ВыбиратьПорциями Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 10000", "ВЫБРАТЬ"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 10000", "ВЫБРАТЬ"); // @query-part-1 @query-part-2 КонецЕсли; ИзмеренияСОсновнымОтбором = Новый Массив; @@ -1809,6 +1814,7 @@ ИмяОбъекта = СтрРазделить(ПолноеИмяОбъекта,".",Ложь)[1]; УсловиеОтбораДанных = "ИСТИНА"; + УсловиеПроверкиРегистратора = "ИСТИНА"; Если ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда ТекстЗапроса = @@ -1886,6 +1892,29 @@ ИначеЕсли ОбщегоНазначения.ЭтоРегистр(МетаданныеОбъекта) Тогда + ШаблонЗапросаПроверки = + "ИСТИНА В (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + |ИЗ + | #ИмяТаблицы КАК ПроверяемаяТаблица + |ГДЕ + | ТаблицаИзменений.Регистратор = ПроверяемаяТаблица.Ссылка)"; + + КоллекцияЗапросов = Новый Массив; + ТипыРегистратора = МетаданныеОбъекта.СтандартныеРеквизиты.Регистратор.Тип; + ТипыРегистратора = ТипыРегистратора.Типы(); + Для Каждого ТипРегистратора Из ТипыРегистратора Цикл + МетаданныеРегистратора = Метаданные.НайтиПоТипу(ТипРегистратора); + Если МетаданныеРегистратора = Неопределено Тогда + Продолжить; + КонецЕсли; + ПолноеИмяРегистратора = МетаданныеРегистратора.ПолноеИмя(); + ТекстЗапросаПроверки = СтрЗаменить(ШаблонЗапросаПроверки, "#ИмяТаблицы", ПолноеИмяРегистратора); + КоллекцияЗапросов.Добавить(ТекстЗапросаПроверки); + КонецЦикла; + + УсловиеПроверкиРегистратора = СтрСоединить(КоллекцияЗапросов, Символы.ПС + "ИЛИ "); + ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 | ТаблицаИзменений.Регистратор КАК Ссылка @@ -1894,13 +1923,7 @@ |ГДЕ | &УсловиеОтбораУзла | И &УсловиеОтбораДанных - | И ИСТИНА В ( - | ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | #ТаблицаОбъекта КАК #ИмяОбъекта - | ГДЕ - | ТаблицаИзменений.Регистратор = #ИмяОбъекта.Регистратор)"; + | И (&УсловиеПоРегистраторам)"; Если Отбор <> Неопределено Тогда УсловиеОтбораДанных = "ТаблицаИзменений.Регистратор В (&Отбор)"; @@ -1916,6 +1939,7 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаОбъекта", ПолноеИмяОбъекта); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяОбъекта", ИмяОбъекта); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораДанных", УсловиеОтбораДанных); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеПоРегистраторам", УсловиеПроверкиРегистратора); ТекстыЗапроса.Добавить(ТекстЗапроса); @@ -2014,8 +2038,9 @@ // - Неопределено - проверяется, завершена ли обработка в целом; // - Массив - проверяется, есть ли данные для обработки в списке очередей. // Данные - ЛюбаяСсылка -// - НаборЗаписей -// - Объект +// - РегистрСведенийНаборЗаписей, РегистрНакопленияНаборЗаписей +// - РегистрБухгалтерииНаборЗаписей, РегистрРасчетаНаборЗаписей +// - СправочникОбъект, ДокументОбъект, ПланВидовХарактеристикОбъект, БизнесПроцессОбъект, ЗадачаОбъект // - ДанныеФормыСтруктура - ссылка на объект, сам объект // или набор записей, который необходимо проверить. // Если ДополнительныеПараметры.ЭтоДвижения = Истина, то Данные - это регистратор @@ -2308,7 +2333,7 @@ ТекстЗапроса = "ВЫБРАТЬ | ТаблицаИзменений.Ссылка КАК Ссылка - |//ПервыйЗапрос + |ПОМЕСТИТЬ #ИмяВременнойТаблицыПервогоЗапроса |ИЗ | #ТаблицаИзменений КАК ТаблицаИзменений |ГДЕ @@ -2327,7 +2352,7 @@ ТекстЗапроса = "ВЫБРАТЬ | ТаблицаИзменений.Регистратор КАК Ссылка - |//ПервыйЗапрос + |ПОМЕСТИТЬ #ИмяВременнойТаблицыПервогоЗапроса |ИЗ | #ТаблицаИзменений КАК ТаблицаИзменений |ГДЕ @@ -2339,7 +2364,7 @@ |ИЗ | #ТаблицаИзменений КАК ТаблицаИзменений |ГДЕ - | &УсловиеОтбораУзла"; + | &УсловиеОтбораУзла"; КонецЕсли; ЕстьРегистры = Истина; @@ -2373,13 +2398,13 @@ |ИНДЕКСИРОВАТЬ ПО | Ссылка"; ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#ТекстЗапроса", "(" + ТекстЗапроса + ")"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ПервыйЗапрос", ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПОМЕСТИТЬ #ИмяВременнойТаблицыПервогоЗапроса", ""); Иначе ТекстЗапроса = ТекстЗапроса + " | |ИНДЕКСИРОВАТЬ ПО | Ссылка"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ПервыйЗапрос", "ПОМЕСТИТЬ #ИмяВременнойТаблицы"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяВременнойТаблицыПервогоЗапроса", "#ИмяВременнойТаблицы"); КонецЕсли; Если Очередь = Неопределено Тогда @@ -2401,10 +2426,10 @@ Запрос.Текст = ТекстЗапроса; РезультатЗапроса = Запрос.Выполнить(); - Результат = Новый Структура("ЕстьЗаписиВоВременнойТаблице,ИмяВременнойТаблицы", Ложь, ""); + Результат = Новый Структура("ЕстьЗаписиВоВременнойТаблице, ИмяВременнойТаблицы", Ложь, ""); Результат.ИмяВременнойТаблицы = ИмяВременнойТаблицы; Результат.ЕстьЗаписиВоВременнойТаблице = РезультатЗапроса.Выгрузить()[0].Количество <> 0; - + Возврат Результат; КонецФункции @@ -2850,10 +2875,10 @@ // ИдентификаторБиблиотеки - Строка - имя конфигурации или идентификатор библиотеки. // ВерсияМетаданныхИБ - Строка - версия метаданных, до которой необходимо выполнить обновление. // ОбработчикиОбновления - Соответствие - список обработчиков обновления. -// ОперативноеОбновление - Булево - Истина, если обновление оперативное. // ХодВыполненияОбработчиков - Структура: // * ВсегоОбработчиков - Строка - общее количество выполняемых обработчиков. // * ВыполненоОбработчиков - Булево - количество выполненных обработчиков. +// ОперативноеОбновление - Булево - Истина, если обновление оперативное. // // Возвращаемое значение: // ДеревоЗначений - выполненные обработчики обновления. @@ -3369,9 +3394,9 @@ // // Параметры: // Отбор - Структура: -// * РежимыВыполнения - Массив из Строка - Доступные значения соответствуют именам значений +// * РежимыВыполнения - Массив из Строка - доступные значения соответствуют именам значений // перечисления РежимыВыполненияОбработчиков. -// * Статусы - Массив из Строка - Доступные значения соответствуют именам значений +// * Статусы - Массив из Строка - доступные значения соответствуют именам значений // перечисления СтатусыОбработчиковОбновления. // * ОбластиДанных - Массив из Число - номера областей, по которым нужно получить обработчики. // @@ -3526,7 +3551,8 @@ Если ОбновляемыеОбъекты[ИзменяемыйОбъект] = Неопределено Тогда ОбновляемыеОбъекты[ИзменяемыйОбъект] = Новый Массив; КонецЕсли; - ОбновляемыеОбъекты[ИзменяемыйОбъект].Добавить(Обработчик.ИмяОбработчика); + Обработчики = ОбновляемыеОбъекты[ИзменяемыйОбъект]; // Массив + Обработчики.Добавить(Обработчик.ИмяОбработчика); КонецЦикла; КонецЦикла; @@ -4513,8 +4539,8 @@ // Возвращает результат сравнения двух записей. // // Параметры: -// ПерваяЗапись - см. ОбновлениеИнформационнойБазыСлужебный.НовыйКлючЗаписи -// ПоследняяЗапись - см. ОбновлениеИнформационнойБазыСлужебный.НовыйКлючЗаписи +// ПерваяЗапись - СписокЗначений из Строка +// ПоследняяЗапись - СписокЗначений из Строка // КоличествоПолей - Число - количество прикладных полей в ключе записи. // // Возвращаемое значение: @@ -4634,8 +4660,8 @@ // Проверка корректности заполнения параметров выборки данных. // -// Параметры - см. -// ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. +// Параметры: +// Параметры - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. // Процедура ПроверитьПараметрыВыборки(Параметры) diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl index 3ef7f37f8..4c3f38705 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl @@ -41,7 +41,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "СтандартныеПодсистемы"; - Описание.Версия = "3.1.4.295"; + Описание.Версия = "3.1.5.110"; Описание.ИдентификаторИнтернетПоддержки = "SSL"; Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно"; Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "2.3.3.0"; @@ -85,9 +85,9 @@ // Такие процедуры следует оформлять штатными обработчиками обновления, выполняемыми на каждую версию "*". // // Параметры: -// ПредыдущаяВерсияИБ - Строка - версия до обновления. "0.0.0.0" для "пустой" ИБ. -// ТекущаяВерсияИБ - Строка - версия после обновления. Как правило, соответствует Метаданные.Версия. -// ВыполненныеОбработчики - ДеревоЗначений - выполненные обработчики обновления с группировкой по версии. +// ПредыдущаяВерсия - Строка - версия до обновления. "0.0.0.0" для "пустой" ИБ. +// ТекущаяВерсия - Строка - версия после обновления. Как правило, соответствует Метаданные.Версия. +// ВыполненныеОбработчики - ДеревоЗначений: // * НачальноеЗаполнение - Булево - если Истина, то обработчик должен срабатывать при запуске на "пустой" базе. // * Версия - Строка - например, "2.1.3.39". Номер версии конфигурации, при переходе // на которую должна быть выполнена процедура-обработчик обновления. diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl index 280f27697..9f62a5767 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl @@ -21,7 +21,7 @@ // * ТекстСообщения - Строка - текст сообщения, выводимый пользователю. По умолчанию // текст сообщения построен с учетом того, что обновление можно // продолжить, т.е. параметр ЗапрещатьПродолжение = Ложь. -// * КартинкаСообщения - БиблиотекаКартинок: Картинка - картинка, выводимая слева от сообщения. +// * КартинкаСообщения - Картинка - картинка, выводимая слева от сообщения. // * ЗапрещатьПродолжение - Булево - если Истина, продолжить обновление будет невозможно. По умолчанию Ложь. // * РасположениеОписанияИзмененийПрограммы - Строка - описывает расположение команды, по которой можно // открыть форму с описанием изменений в новой версии программы. diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl index 584f0ab7a..55104250c 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl @@ -60,7 +60,7 @@ // обновление параметров работы программы дважды. // При внешнем вызове, например, в сеансе внешнего соединения, параметры работы // программы должны быть обновлены до продолжения обновления ИБ. -// * Перезапустить - Булево - (возвращаемое значение) требование перезапуска, +// * Перезапустить - Булево - возвращаемое значение. Требование перезапуска, // в некоторых случаях ПриЗапускеКлиентскогоПриложения, например, // при возврате к конфигурации базы данных подчиненного узла РИБ, // см. общий модуль ОбменДаннымиСервер процедуру. @@ -1075,6 +1075,8 @@ КонецФункции +// АПК:581-выкл Для механизма обновления ИБ в копии. + // Обновляет список выполняемых обработчиков обновления в регистрах сведений // ОбработчикиОбновления и ОбработчикиОбновленияОбщихДанных. // @@ -1193,6 +1195,8 @@ КонецПроцедуры +// АПК:581-вкл + // Вызывается для включения и отключении отложенного обновления. // // Параметры: @@ -3007,7 +3011,6 @@ Поток = ДобавитьПотокОбработчикаОтложенногоОбновления(СведенияОбОбновлении); Если ТипЗнч(Поток) = Тип("СтрокаТаблицыЗначений") Тогда ВыполнитьПоток(Группы, Поток); - СохранитьПотокОбновления(Поток); ОжидатьСвободныйПоток(Группы); ИначеЕсли Поток = Истина Тогда ОжидатьЗавершениеЛюбогоПотока(Группы); @@ -3567,6 +3570,16 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * ОбработчикДляВыполнения - Неопределено +// - СтрокаТаблицыЗначений: +// ** ИмяОбработчика - Строка. +// ** Идентификатор - УникальныйИдентификатор. +// * ЗавершеноУспешно - Булево. +// * ЕстьВыполняющиеся - Булево. +// * ЕстьНевыполненные - Булево. +// Функция ОбработчикДляВыполнения(Обработчики, ГруппыОбработчиковИЗависимость, СведенияОбОбновлении) ЗависимостьГруппОбработчиков = СведенияОбОбновлении.ЗависимостьГруппОбработчиков; @@ -3653,6 +3666,10 @@ ОбработчикДляВыполнения = ВыполняющийсяМногопоточныйОбработчик; КонецЕсли; + Если ЕстьОшибки Тогда + ЗавершеноУспешно = Ложь; + КонецЕсли; + Результат = Новый Структура; Результат.Вставить("ОбработчикДляВыполнения", ОбработчикДляВыполнения); Результат.Вставить("ЗавершеноУспешно", ЗавершеноУспешно); @@ -3783,6 +3800,8 @@ Поток.Наименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонНаименования, ОписаниеОбрабатываемыхДанных.ИмяОбработчика); + СохранитьПотокОбновления(Поток); + Возврат Поток; КонецФункции @@ -3852,7 +3871,10 @@ Функция НовыйПоток() Потоки = НовоеОписаниеПотоков(); - Возврат Потоки.Добавить(); + Поток = Потоки.Добавить(); + Поток.ИдентификаторПотока = Новый УникальныйИдентификатор; + + Возврат Поток; КонецФункции @@ -3954,9 +3976,18 @@ Поток.ПараметрыПроцедуры = ПараметрыПоиска; Поток.ПараметрыПроцедурыЗавершения = ПараметрыПоиска; Описание.ВыполняетсяПоискПорции = Истина; - УстановитьСвойствоОбработчика(ИмяОбработчика, - "ОбрабатываемыеДанные", - Новый ХранилищеЗначения(Описание)); + + НачатьТранзакцию(); + Попытка + УстановитьСвойствоОбработчика(ИмяОбработчика, + "ОбрабатываемыеДанные", + Новый ХранилищеЗначения(Описание)); + СохранитьПотокОбновления(Поток); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; Возврат Истина; Иначе @@ -3980,6 +4011,8 @@ Поток.ПараметрыПроцедуры = КонтекстОбработчика; Поток.ПараметрыПроцедурыЗавершения = КонтекстОбработчика; + СохранитьПотокОбновления(Поток); + КонецПроцедуры // Выполнить отложенный обработчик в фоновом задании. @@ -4073,7 +4106,7 @@ // // Параметры: // КонтекстОбработчика - см. НовыйКонтекстОбработчика -// ОбработчикОбновления - СтрокаДереваЗначений - обработчик обновления в виде строки дерева обработчиков. +// ИмяОбработчика - Строка // Процедура РассчитатьВремяВыполненияПроцедурыОбработчика(КонтекстОбработчика, ИмяОбработчика) @@ -4130,11 +4163,11 @@ // Параметры: // Поток - см. НовоеОписаниеПотоков // ИнформацияОбОшибке - ИнформацияОбОшибке - описание возникшей ошибки. -// СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы // Процедура ПриАварийномЗавершенииПотокаОтложенногоОбработчика(Поток, ИнформацияОбОшибке) Экспорт ОбработчикОбновления = ОбработчикОбновления(Поток.ПараметрыПроцедуры.ИмяОбработчика); + УстановитьСвойствоОбработчика(ОбработчикОбновления.ИмяОбработчика, "ОбработкаПорцииЗавершена", Истина); ОбработатьИсключениеОбработчика(Поток.ПараметрыПроцедуры, ОбработчикОбновления, ИнформацияОбОшибке); Если ОбработчикОбновления.Многопоточный Тогда @@ -4150,11 +4183,11 @@ // // Параметры: // Поток - см. НовоеОписаниеПотоков -// СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы // Процедура ПриОтменеПотокаОтложенногоОбработчика(Поток) Экспорт ОбработчикОбновления = ОбработчикОбновления(Поток.ПараметрыПроцедуры.ИмяОбработчика); + УстановитьСвойствоОбработчика(ОбработчикОбновления.ИмяОбработчика, "ОбработкаПорцииЗавершена", Истина); Если ОбработчикОбновления.Статус = Перечисления.СтатусыОбработчиковОбновления.Выполняется Тогда УстановитьСтатусОбработчика(ОбработчикОбновления.ИмяОбработчика, "НеВыполнялся"); @@ -4196,12 +4229,6 @@ КонецПроцедуры -// Сохранить состояние выполнения потоков обновления в сведения об обновлении. -// -// Параметры: -// ОписаниеПотоков - см. НовоеОписаниеПотоков -// СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы. -// Процедура УдалитьВсеПотокиОбновления() НаборЗаписей = РегистрыСведений.ПотокиОбновления.СоздатьНаборЗаписей(); @@ -4282,7 +4309,7 @@ // Структура: // * ЕстьНеЗакрытыеТранзакции - Булево - признак наличия не закрытых транзакций в самом обработчике. // * ЗавершениеПроцедурыОбработчика - Число - время завершения выполнения процедуры обработчика обновления. -// * ИнформацияОбОшибке - ИнформацияОбОшибке - описание ошибки (если была). +// * ИнформацияОбОшибке - Строка - описание ошибки (если была). // * НачалоПроцедурыОбработчика - Число - время начала выполнения процедуры обработчика обновления. // * ПереданоДанныхДляОбработки - Число - количество объектов, переданных для обработки. // * Параметры - Структура - параметры, переданные в обработчик обновления. @@ -4360,8 +4387,14 @@ Идентификатор = Новый УникальныйИдентификатор; КонецЕсли; НаборЗаписей.Отбор.ИдентификаторПотока.Установить(Идентификатор); + НаборЗаписей.Прочитать(); + + Если НаборЗаписей.Количество() = 0 Тогда + Запись = НаборЗаписей.Добавить(); + Иначе + Запись = НаборЗаписей[0]; + КонецЕсли; - Запись = НаборЗаписей.Добавить(); ЗаполнитьЗначенияСвойств(Запись, Поток, , "ИдентификаторПотока,ПараметрыПроцедуры,ПараметрыПроцедурыЗавершения"); Запись.ИдентификаторПотока = Идентификатор; Запись.ПараметрыПроцедуры = Новый ХранилищеЗначения(Поток.ПараметрыПроцедуры); @@ -4413,7 +4446,7 @@ // Выполнить указанный поток. // // Параметры: -// ОписаниеПотоков - см. НовоеОписаниеПотоков +// Группы - Соответствие // Поток - СтрокаТаблицыЗначений - описание потока (см. Потоки в НовоеОписаниеПотоков()). // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, если есть. // @@ -4444,16 +4477,18 @@ КонецЕсли; КонецЕсли; + СохранитьПотокОбновления(Поток); + КонецПроцедуры // Завершает выполнение потоков, которые завершили выполнение своих фоновых заданий. // // Параметры: -// ОписаниеПотоков - см. НовоеОписаниеПотоков -// Параметры - Произвольный - параметры вызывающего потока, передаваемые в процедуру завершения. +// Потоки - см. НовоеОписаниеПотоков +// Группы - Соответствие // // Возвращаемое значение: -// Булево - Истина - завершился один или более потоков, иначе - Ложь. +// Булево - Истина, если завершился один или более потоков, иначе - Ложь. // Функция ЗавершитьПотокиВыполнившиеФЗ(Потоки, Группы) @@ -4514,8 +4549,7 @@ // Ожидать завершение всех потоков. // // Параметры: -// ОписаниеПотоков - см. НовоеОписаниеПотоков -// Параметры - Произвольный - параметры вызывающего потока, передаваемые в процедуру завершения. +// Группы - Соответствие // Процедура ОжидатьЗавершениеВсехПотоков(Группы) @@ -4532,8 +4566,7 @@ // Ожидать завершение любого потока. // // Параметры: -// ОписаниеПотоков - см. НовоеОписаниеПотоков -// Параметры - Произвольный - параметры вызывающего потока, передаваемые в процедуру завершения. +// Группы - Соответствие // Процедура ОжидатьЗавершениеЛюбогоПотока(Группы) @@ -4551,8 +4584,7 @@ // Ожидать, пока количество выполняющихся потоков не станет меньше максимального. // // Параметры: -// ОписаниеПотоков - см. НовоеОписаниеПотоков -// Параметры - Произвольный - параметры вызывающего потока, передаваемые в процедуру завершения. +// Группы - Соответствие // Процедура ОжидатьСвободныйПоток(Группы) @@ -4574,8 +4606,7 @@ // Отменить выполнение потоков, если они активны. // // Параметры: -// ОписаниеПотоков - см. НовоеОписаниеПотоков -// ПараметрыОтмены - Произвольный - параметры процедуры ПриОтменеПотока. +// Группы - Соответствие // Процедура ОтменитьВыполнениеВсехПотоков(Группы) Экспорт @@ -4604,22 +4635,22 @@ // Структура - общее описание потоков со следующими полями: // * Процедура - Строка - имя процедуры, выполняемой в фоновом задании. Объявление: // ИмяПроцедуры(ОписаниеПроцедуры, АдресРезультата), где: -// ** ОписаниеПроцедуры - Структура - описание процедуры заполнения. -// ** АдресРезультата - Строка - адрес временного хранилища для сохранения результата выполнения. +// ОписаниеПроцедуры - Структура - описание процедуры заполнения. +// АдресРезультата - Строка - адрес временного хранилища для сохранения результата выполнения. // * ПроцедураЗавершения - Строка - имя процедуры, выполняемой, после завершения работы фонового задания. Объявление: // ПроцедураЗавершения(ОписаниеПроцедуры, АдресРезультата, ДополнительныеПараметры), где: -// ** ОписаниеПроцедуры - Структура - описание процедуры заполнения. -// ** АдресРезультата - Строка - адрес временного хранилища с результатом выполнения. -// ** ДополнительныеПараметры - Произвольный - дополнительный параметр. +// ОписаниеПроцедуры - Структура - описание процедуры заполнения. +// АдресРезультата - Строка - адрес временного хранилища с результатом выполнения. +// ДополнительныеПараметры - Произвольный - дополнительный параметр. // * ПриАварийномЗавершении - Строка - обработчик аварийного завершения потока. Объявление: // ПриАварийномЗавершении(Поток, ИнформацияОбОшибке, ДополнительныеПараметры), где: -// ** Поток - см. НовоеОписаниеПотоков -// ** ИнформацияОбОшибке - ИнформацияОбОшибке - описание возникшей ошибки. -// ** ДополнительныеПараметры - Произвольный - дополнительный параметр. +// Поток - см. НовоеОписаниеПотоков +// ИнформацияОбОшибке - ИнформацияОбОшибке - описание возникшей ошибки. +// ДополнительныеПараметры - Произвольный - дополнительный параметр. // * ПриОтменеПотока - Строка - обработчик отмены потока. Объявление: // ПриОтменеПотока(Поток, ДополнительныеПараметры), где: -// ** Поток - см. НовоеОписаниеПотоков -// ** ДополнительныеПараметры - Произвольный - дополнительный параметр. +// Поток - см. НовоеОписаниеПотоков +// ДополнительныеПараметры - Произвольный - дополнительный параметр. // Функция НовоеОписаниеГруппыПотоков() @@ -4928,8 +4959,8 @@ // // Возвращаемое значение: // Структура - параметры обхода текущей итерации в виде структуры со следующими полями: -// ** СсылочныйОбъект - Строка - имя ссылочного объекта. -// ** ТабличныйОбъект - Строка - имя табличного объекта. +// * СсылочныйОбъект - Строка - имя ссылочного объекта. +// * ТабличныйОбъект - Строка - имя табличного объекта. // Неопределено - если обход закончен. // Функция ТекущиеПараметрыОбхода(ПараметрыОбхода) @@ -5240,6 +5271,10 @@ ОписаниеПроцедурыЗаполнения.ПоискЗавершен = РезультатПоиска.ПоискЗавершен; + УстановитьСвойствоОбработчика(ОписаниеПроцедурыЗаполнения.ИмяОбработчика, + "ОбрабатываемыеДанные", + Новый ХранилищеЗначения(ОписаниеПроцедурыЗаполнения)); + КонецПроцедуры // Сохранить результат поиска данных для многопоточного обработчика. @@ -5528,7 +5563,7 @@ // ТабличныйОбъект - Строка - полное имя объекта метаданных табличного типа. // // Возвращаемое значение: -// СписокЗначений - ключ записи. +// СписокЗначений из Строка // Функция НовыйКлючЗаписи(СсылочныйОбъект, ТабличныйОбъект) @@ -7275,7 +7310,6 @@ // // Параметры: // КонтекстОбработчика - см. НовыйКонтекстОбработчика -// СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы // Процедура ЗавершитьВыполнениеОтложенногоОбработчикаОбновления(КонтекстОбработчика) @@ -7403,8 +7437,7 @@ КонецФункции -// Получает сведения об обновлении информационной базы -// из константы "СведенияОбОбновленииИБ". +// Получает сведения об обновлении информационной базы из константы "СведенияОбОбновленииИБ". // Функция СведенияОБлокируемыхОбъектах() Экспорт @@ -7428,6 +7461,7 @@ // Подготовка запуска обработчика обновления в основном потоке. // +// Параметры: // КонтекстОбработчика - см. НовыйКонтекстОбработчика // ОбработчикОбновления - СтрокаДереваЗначений - обработчик обновления в виде строки дерева обработчиков. // ПараметрыОбновления - см. ВыполнитьОбновлениеИнформационнойБазы @@ -7558,8 +7592,7 @@ // // Параметры: // КонтекстОбработчика - см. НовыйКонтекстОбработчика -// ОбработчикОбновления - СтрокаДереваЗначений - обработчик обновления в виде строки дерева обработчиков. -// СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы +// ИмяОбработчика - Строка // Процедура ПослеЗапускаПроцедурыОбработкиДанных(КонтекстОбработчика, ИмяОбработчика) @@ -7659,8 +7692,7 @@ // // Параметры: // КонтекстОбработчика - см. НовыйКонтекстОбработчика -// ОбработчикОбновления - СтрокаДереваЗначений - обработчик обновления в виде строки дерева обработчиков. -// СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы +// ИмяОбработчика - Строка // Процедура ЗавершитьПроцедуруОбработкиДанных(КонтекстОбработчика, ИмяОбработчика) @@ -7906,7 +7938,6 @@ Поток = ДобавитьПотокРегистрацииДанныхОтложенногоОбновления(ОписаниеОбрабатываемыхДанных); ВыполнитьПоток(Группы, Поток, ИдентификаторФормы); - СохранитьПотокОбновления(Поток); ОжидатьСвободныйПоток(Группы); КонецЦикла; @@ -8095,7 +8126,6 @@ Поток = НовыйПоток(); ДобавитьПотокОбработчикаОбновления(Поток, КонтекстОбработчикаДляПотока); ВыполнитьПоток(Группы, Поток); - СохранитьПотокОбновления(Поток); КонтекстОбработчикаДляПотока.Параметры.ОбновляемыеДанные.НаборДанных = Неопределено; КонецПроцедуры @@ -8112,8 +8142,8 @@ | ОбработчикиОбновления.ИмяОбработчика КАК ИмяОбработчика, | ОбработчикиОбновления.Статус КАК Статус, | ОбработчикиОбновления.ЧислоПопыток КАК ЧислоПопыток, - | ОбработчикиОбновления.Многопоточный КАК Многопоточный, - | ОбработчикиОбновления.ОбрабатываемыеДанные КАК ОбрабатываемыеДанные + | ОбработчикиОбновления.Многопоточный, + | ОбработчикиОбновления.ОбрабатываемыеДанные |ИЗ | РегистрСведений.ОбработчикиОбновления КАК ОбработчикиОбновления |ГДЕ diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl index 40897d763..bfb0a070c 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl @@ -226,7 +226,7 @@ // и возвращает ключ этой записи. // // Возвращаемое значение: -// РегистрСведенийКлючЗаписи +// РегистрСведенийКлючЗаписи.ВерсииПодсистемОбластейДанных // Функция ЗаблокироватьВерсииОбластиДанных() Экспорт @@ -259,7 +259,7 @@ // Разблокирует запись в регистре сведений ВерсииПодсистемОбластейДанных. // // Параметры: -// КлючЗаписи - РегистрСведенийКлючЗаписи. +// КлючЗаписи - РегистрСведенийКлючЗаписи.ВерсииПодсистемОбластейДанных. // Процедура РазблокироватьВерсииОбластиДанных(КлючЗаписи) Экспорт @@ -707,7 +707,7 @@ // Возвращает ключ записи для регистра сведений ВерсииПодсистемОбластейДанных. // // Возвращаемое значение: -// РегистрСведенийКлючЗаписи.ВерсииПодсистемОбластейДанных - ключ записи регистра сведений. +// РегистрСведенийКлючЗаписиИмяРегистраСведений - ключ записи регистра сведений ВерсииПодсистемОбластейДанных. // Функция КлючЗаписиВерсийПодсистем() diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl index 56e2220d0..b225ad235 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl @@ -337,6 +337,8 @@ // * Удалить - Массив - уникальные идентификаторы (Строка) исправлений, которые требуется удалить. // ВФоне - Булево - необходимо устанавливать в значение Истина, если вызов функции выполняется // фоновом задании. +// ОбновитьПараметрыРаботыРасширений - Булево - по умолчанию Истина, при вызове из скрипта обновления конфигурации +// необходимо устанавливать в значение Ложь. // // Возвращаемое значение: // Структура: @@ -348,7 +350,7 @@ // * Событие - Строка - событие, при котором возникла ошибка. Установка или Удаление. // * Причина - Строка - подробное описание ошибки. // -Функция УстановкаИУдалениеИсправлений(Исправления, ВФоне = Ложь) Экспорт +Функция УстановкаИУдалениеИсправлений(Исправления, ВФоне = Ложь, ОбновитьПараметрыРаботыРасширений = Истина) Экспорт Устанавливаемые = Неопределено; НеУстановлено = 0; @@ -500,9 +502,9 @@ |удаления патчей завершилось с ошибкой.'") КонецЕсли; -#Если Не ВнешнееСоединение Тогда - РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений(Неопределено, "", ТекстДляАсинхронногоВызова); -#КонецЕсли + Если ОбновитьПараметрыРаботыРасширений Тогда + РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений(Неопределено, "", ТекстДляАсинхронногоВызова); + КонецЕсли; РезультатВыполнения.НеУстановлено = РезультатВыполнения.НеУстановлено + НеУстановлено; РезультатВыполнения.НеУдалено = НеУдалено; @@ -722,7 +724,7 @@ КонецЕсли; Исправления = Новый Структура("Установить, Удалить", УстанавливаемыеИсправления, УдаляемыеИсправленияМассив); - Результат = УстановкаИУдалениеИсправлений(Исправления); + Результат = УстановкаИУдалениеИсправлений(Исправления, , Ложь); Результат.Вставить("ВсегоПатчей", УстанавливаемыеИсправления.Количество()); Статус = СтатусОбновленияКонфигурации(); diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl index 21b1790e2..e7bb3cdc2 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииВызовСервера/Module.bsl @@ -81,6 +81,11 @@ ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); ВыполнитьОтложенныеОбработчики = ОбновлениеКонфигурации.ВыполнитьОтложенныеОбработчики(); + СообщенияСкриптов = СообщенияСкриптов(); + Для Каждого СвойстваМакета Из ТекстыМакетов Цикл + ТекстыМакетов[СвойстваМакета.Ключ] = ПодставитьПараметрыВТекст(ТекстыМакетов[СвойстваМакета.Ключ], СообщенияСкриптов); + КонецЦикла; + Возврат ТекстыМакетов; КонецФункции @@ -90,7 +95,8 @@ ПараметрыТекста = Новый Соответствие; ПараметрыТекста["[ЗаголовокЗаставки]"] = НСтр("ru = 'Обновление конфигурации ""1С:Предприятие""...'"); ПараметрыТекста["[ТекстЗаставки]"] = НСтр("ru = 'Пожалуйста, подождите. - |
      Выполняется обновление конфигурации.'"); + |
      Выполняется обновление конфигурации.'"); + ПараметрыТекста["[Шаг1Инициализация]"] = НСтр("ru = 'Инициализация'"); ПараметрыТекста["[Шаг2ЗавершениеРаботы]"] = НСтр("ru = 'Завершение работы пользователей'"); ПараметрыТекста["[Шаг3СозданиеРезервнойКопии]"] = НСтр("ru = 'Создание резервной копии информационной базы'"); @@ -111,6 +117,10 @@ ПараметрыТекста["[ПроцессПрерван]"] = НСтр("ru = 'Внимание: процесс обновления был прерван, и информационная база осталась заблокированной.'"); ПараметрыТекста["[ПроцессПрерванПодсказка]"] = НСтр("ru = 'Для разблокирования информационной базы воспользуйтесь консолью кластера серверов или запустите ""1С:Предприятие"".'"); + ПараметрыТекста["[НаименованиеПродукта]"] = НСтр("ru = '1С:ПРЕДПРИЯТИЕ 8.3'"); + ПараметрыТекста["[Копирайт]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '© ООО «1С-Софт», 1996-%1'"), Формат(Год(ТекущаяДатаСеанса()), "ЧГ=0")); + Возврат ПодставитьПараметрыВТекст(ШаблонТекста, ПараметрыТекста);; КонецФункции @@ -181,4 +191,85 @@ // АПК:299-вкл // АПК:557-вкл +Функция СообщенияСкриптов() + + Сообщения = Новый Соответствие; + + Сообщения.Вставить("[СообщениеНачалоЗапуска]", НСтр("ru = 'Запускается: {0}; параметры: {1}; окно: {2}; ожидание: {3}'")); + Сообщения.Вставить("[СообщениеДеталиИсключения]", НСтр("ru = 'Исключение в runApp: {0}, {1}'")); + Сообщения.Вставить("[СообщениеРезультатЗапуска]", НСтр("ru = 'Код возврата: {0}'")); + Сообщения.Вставить("[СообщениеПутьКФайлуСкрипта]", НСтр("ru = 'Файл скрипта: {0}'")); + Сообщения.Вставить("[СообщениеСчетчикФайловОбновления]", НСтр("ru = 'Количество файлов обновления: {0}'")); + Сообщения.Вставить("[СообщениеВосстановлениеБазы]", НСтр("ru = 'Восстановление ИБ из временного архива'")); + Сообщения.Вставить("[СообщениеНачалоСеансаСоединенияСБазой]", НСтр("ru = 'Начат сеанс внешнего соединения с ИБ'")); + Сообщения.Вставить("[СообщениеУдалениеЗадачиПланировщика]", НСтр("ru = 'Удаление задачи планировщика задач: {0}'")); + Сообщения.Вставить("[СообщениеОтказУдаленияЗадачиПланировщика]", НСтр("ru = 'Ошибка при удалении задачи из планировщика задач: {0}'")); + Сообщения.Вставить("[СообщениеОтказСоединенияСБазой]", НСтр("ru = 'Исключение в createConnection: {0}, {1}'")); + Сообщения.Вставить("[СообщениеВызовЗавершитьОбновление]", НСтр("ru = 'ОбновлениеКонфигурации.ЗавершитьОбновление({0}, {1}, {2})'")); + Сообщения.Вставить("[СообщениеОтказПриВызовеЗавершитьОбновление]", НСтр("ru = 'Исключение при вызове ОбновлениеКонфигурации.ЗавершитьОбновление: {0}, {1}'")); + Сообщения.Вставить("[СообщениеРезультатОбновленияБазы]", НСтр("ru = 'Обновление информационной базы завершилась успешно'")); + Сообщения.Вставить("[СообщениеОтказОбновленияБазы]", НСтр("ru = 'Ошибка при обновлении информационной базы'")); + Сообщения.Вставить("[СообщениеПараметрыБазы]", НСтр("ru = 'Параметры информационной базы: {0}.'")); + Сообщения.Вставить("[СообщениеОтказЛогирования]", НСтр("ru = 'Исключение в writeEventLog: {0}, {1}'")); + Сообщения.Вставить("[СообщениеОбновлениеЛогирование1С]", НСтр("ru = 'Протокол обновления сохранен в журнал регистрации.'")); + Сообщения.Вставить("[СообщениеКопированиеБазы]", НСтр("ru = '\r\n\Выполняется копирование из:\r\n\{0}\r\n\в:\r\n\{1}'")); + Сообщения.Вставить("[СообщениеФайлБазыНеСуществует]", НСтр("ru = 'Файл базы данных 1Cv8.1CD не существует по пути: {0}'")); + Сообщения.Вставить("[СообщениеКаталогРезервнойКопииБазыНеСуществует]", НСтр("ru = 'Папки для сохранения резервной копии не существует: {0}'")); + Сообщения.Вставить("[СообщениеПараметрыФайлаРезервнойКопии]", НСтр("ru = '\r\n\Файл резервной копии уже существует: {0}\r\n\Создан: {1}\r\n\Последнее обращение: {2}\r\n\Последнее изменение: {3}\r\n\Размер: {4}\r\n\Тип: {5}\r\n\Атрибуты:\r\n\{6}'")); + Сообщения.Вставить("[СообщениеДискНеСуществует]", НСтр("ru = '\r\n\Диск не найден по пути {0}\r\n\Исключение: {1}, {2}'")); + Сообщения.Вставить("[СообщениеДискНедоступен]", НСтр("ru = 'Диск не доступен по пути {0}'")); + Сообщения.Вставить("[СообщениеДисковогоПространстваНедостаточно]", НСтр("ru = '\r\n\Недостаточно свободного места для создания резервной копии.\r\n\Освободите место или укажите папку на другом диске.\r\n\Требуется: {0} Mb\r\n\Доступно на диске {1}: {2} Mb\r\n\Размер файла 1Cv8.1CD: {3} Mb\r\n\Тип диска: {4}'")); + Сообщения.Вставить("[СообщениеРезультатСозданияРезервнойКопииБазы]", НСтр("ru = 'Резервная копия базы создана'")); + Сообщения.Вставить("[СообщениеОтказСозданияРезервнойКопииБазыПодробно]", НСтр("ru = 'Исключение при создании резервной копии базы: {0}, {1}'")); + Сообщения.Вставить("[СообщениеРезультатВосстановленияБазы]", НСтр("ru = 'База данных восстановлена из резервной копии'")); + Сообщения.Вставить("[СообщениеОтказВосстановленияБазыПодробно]", НСтр("ru = 'Исключение при восстановлении базы из резервной копии: {0}, {1}.'")); + Сообщения.Вставить("[СообщениеВызовРазрешитьРаботуПользователей]", НСтр("ru = 'СоединенияИБ.РазрешитьРаботуПользователей()'")); + Сообщения.Вставить("[СообщениеОтказВызоваРазрешитьРаботуПользователей]", НСтр("ru = 'Исключение при вызове СоединенияИБ.РазрешитьРаботуПользователей: {0}, {1}'")); + Сообщения.Вставить("[СообщениеОтказОбновленияИсправлений]", НСтр("ru = 'Не удалось обновить исправления конфигурации. Подробности см. в предыдущей записи.'")); + Сообщения.Вставить("[СообщениеОтказВызоваОбновитьИсправленияИзСкрипта]", НСтр("ru = 'Исключение при вызове ОбновлениеКонфигурацииВызовСервера.ОбновитьИсправленияИзСкрипта: {0}, {1}'")); + Сообщения.Вставить("[СообщениеВызовВыполнитьОбновлениеИнформационнойБазы]", НСтр("ru = 'ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы({0})'")); + Сообщения.Вставить("[СообщениеОтказВызоваВыполнитьОбновлениеИнформационнойБазы]", НСтр("ru = 'Исключение при вызове ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы: {0}, {1}.'")); + Сообщения.Вставить("[СообщениеОтказОбновленияБазыОбщее]", НСтр("ru = 'При выполнении обновления информационной базы произошла ошибка:'")); + Сообщения.Вставить("[СообщениеБлокировкаБазы]", НСтр("ru = 'в связи с необходимостью обновления конфигурации'")); + Сообщения.Вставить("[СообщениеОтказЗавершенияРаботыПользователей]", НСтр("ru = 'Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.'")); + Сообщения.Вставить("[СообщениеОтменаБлокировкиРаботыПользователей]", НСтр("ru = 'Исключение при вызове doDisconnectAndBlockUsers: {0}, {1}'")); + Сообщения.Вставить("[СообщениеКонецСеансаСоединенияСБазой]", НСтр("ru = 'Завершен сеанс внешнего соединения с ИБ'")); + Сообщения.Вставить("[СообщениеБлокировкаРаботыПользователейЛогирование]", НСтр("ru = 'Установка блокировки сеансов в связи с необходимостью обновления конфигурации'")); + Сообщения.Вставить("[СообщениеБлокировкаРаботыПользователей]", НСтр("ru = 'в связи с необходимостью обновления конфигурации'")); + Сообщения.Вставить("[СообщениеСчетчикСеансовБазы]", НСтр("ru = 'Количество сеансов информационной базы: {0}'")); + Сообщения.Вставить("[СообщениеРезультатБлокировкиСеансов]", НСтр("ru = 'Блокировка начала сеансов установлена: {0}'")); + Сообщения.Вставить("[СообщениеСчетчикЗависшихСеансовБазы]", НСтр("ru = 'Количество зависших сеансов информационной базы: {0}, попытка № {1}'")); + Сообщения.Вставить("[СообщениеВызовВыполнитьОтложенноеОбновлениеСейчас]", НСтр("ru = 'ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас()'")); + Сообщения.Вставить("[СообщениеОтказВызоваВыполнитьОтложенноеОбновлениеСейчас]", НСтр("ru = 'Исключение при вызове ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас: {0}, {1}.'")); + Сообщения.Вставить("[СообщениеОтказВызоваУдалитьИсправленияИзСкрипта]", НСтр("ru = 'Исключение при вызове ОбновлениеКонфигурацииВызовСервера.УдалитьИсправленияИзСкрипта: {0}, {1}.'")); + Сообщения.Вставить("[СообщениеОтказУдаленияИсправлений]", НСтр("ru = 'Не удалось удалить исправления конфигурации. Подробности см. в предыдущей записи.'")); + Сообщения.Вставить("[СообщениеПараметрыCOMСоединителя]", НСтр("ru = 'Используется COM соединение: {0}'")); + Сообщения.Вставить("[СообщениеОтказОбновленияБазыИзФайла]", НСтр("ru = 'Не удалось обновить по файлу, возможно конфигурация не находится на поддержке, попытка загрузки конфигурации'")); + Сообщения.Вставить("[СообщениеЗаставкиОшибкаШага]", НСтр("ru = 'Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.'")); + Сообщения.Вставить("[СообщениеИнициализация]", НСтр("ru = 'Инициализация'")); + Сообщения.Вставить("[СообщениеЗавершениеРаботыПользователей]", НСтр("ru = 'Завершение работы пользователей'")); + Сообщения.Вставить("[СообщениеСозданиеРезервнойКопииБазы]", НСтр("ru = 'Создание резервной копии информационной базы'")); + Сообщения.Вставить("[СообщениеВыполнениеОтложенныхОбработчиковОбновления]", НСтр("ru = 'Выполнение отложенных обработчиков обновления'")); + Сообщения.Вставить("[СообщениеОбновлениеКонфигурации]", НСтр("ru = 'Обновление конфигурации информационной базы'")); + Сообщения.Вставить("[СообщениеЗагрузкаРасширений]", НСтр("ru = 'Обновление расширений информационной базы'")); + Сообщения.Вставить("[СообщениеЗагрузкаФайлаОбновлений]", НСтр("ru = 'Загрузка файла обновления в основную базу ({0}/{1})'")); + Сообщения.Вставить("[СообщениеПараметрыОбновленияКонфигурации]", НСтр("ru = 'Обновление конфигурации информационной базы ({0}/{1})'")); + Сообщения.Вставить("[СообщениеВыполнениеОбработчиковОбновления]", НСтр("ru = 'Выполнение обработчиков обновления ({0}/{1})'")); + Сообщения.Вставить("[СообщениеРазрешениеПодключений]", НСтр("ru = 'Разрешение подключений новых соединений'")); + Сообщения.Вставить("[СообщениеЗавершениеОбновления]", НСтр("ru = 'Завершение'")); + Сообщения.Вставить("[СообщениеОтказИнициализации]", НСтр("ru = ': Ошибка инициализации переменных:'") + Символы.НПП); + Сообщения.Вставить("[СообщениеСозданиеОбъектаCOMСоединителя]", НСтр("ru = ': Создание объекта COM-соединителя...'")); + Сообщения.Вставить("[СообщениеОтказСозданияОбъектаCOMСоединителя]", НСтр("ru = ': Ошибка создания объекта COM-соединителя:'") + Символы.НПП); + Сообщения.Вставить("[СообщениеУстановкаСоединенияСБазой]", НСтр("ru = ': Установка соединения с'") + Символы.НПП); + Сообщения.Вставить("[СообщениеОтказСоединенияСБазойОбщее]", НСтр("ru = ': Ошибка установки соединения с'") + Символы.НПП); + Сообщения.Вставить("[СообщениеОсновноеСобытие]", НСтр("ru = 'Удаление исправлений (патчей)'")); + Сообщения.Вставить("[СообщениеВызовУдалитьИсправленияИзСкрипта]", НСтр("ru = ': Вызов ОбновлениеКонфигурацииВызовСервера.УдалитьИсправленияИзСкрипта()...'")); + Сообщения.Вставить("[СообщениеВызовОбновитьИсправленияИзСкрипта]", НСтр("ru = ': Вызов ОбновлениеКонфигурацииВызовСервера.ОбновитьИсправленияИзСкрипта()...'")); + Сообщения.Вставить("[СообщениеОшибкаБСП]", НСтр("ru = ': Ошибка БСП:'") + Символы.НПП); + Сообщения.Вставить("[СообщениеВажность]", НСтр("ru = 'Обязательная'")); + + Возврат Сообщения; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl index 9bb213d48..050e95a10 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl @@ -5,7 +5,7 @@ // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// - + #Область ПрограммныйИнтерфейс // Возвращает, поддерживается ли установка обновлений конфигурации на данном компьютере. @@ -784,6 +784,9 @@ ПараметрыЗапускаПредприятия = ОбщегоНазначенияСлужебныйКлиент.ПараметрыЗапускаПредприятияИзСкрипта(); + ВыполнитьОбновлениеКонфигурации = Параметры.Свойство("КонфигурацияИзменена") И Параметры.КонфигурацияИзменена; + ВыполнитьЗагрузкуРасширений = Параметры.Свойство("ЗагрузитьРасширения") И Параметры.ЗагрузитьРасширения; + ОбластьПараметров = ТекстыМакетов.ОбластьПараметров; ВставитьПараметрСкрипта("ИмяИсполняемогоФайлаКонфигуратора" , ИмяИсполняемогоФайлаКонфигуратора , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("ИмяИсполняемогоФайлаКлиента" , ИмяИсполняемогоФайлаКлиента , Истина, ОбластьПараметров); @@ -806,6 +809,8 @@ ВставитьПараметрСкрипта("ИмяЗадачиПланировщикаЗадач" , ИмяЗадачи , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("ПараметрыЗапускаПредприятия" , ПараметрыЗапускаПредприятия , Истина, ОбластьПараметров); ВставитьПараметрСкрипта("КодРазблокировки" , "ПакетноеОбновлениеКонфигурацииИБ" , Ложь, ОбластьПараметров); + ВставитьПараметрСкрипта("ВыполнитьОбновлениеКонфигурации" , ВыполнитьОбновлениеКонфигурации , Ложь, ОбластьПараметров); + ВставитьПараметрСкрипта("ВыполнитьЗагрузкуРасширений" , ВыполнитьЗагрузкуРасширений , Ложь, ОбластьПараметров); СоздатьКаталог(КаталогВременныхФайловОбновления); ИнформацияОбИсправлениях = ИнформацияОбИсправлениях(Параметры, КаталогВременныхФайловОбновления); diff --git a/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl index 98e192636..5c8003834 100644 --- a/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбсужденияСлужебныйКлиент/Module.bsl @@ -73,7 +73,7 @@ Параметры.Вставить("МножественныйВыбор", Истина); Параметры.Вставить("РасширенныйПодбор", Истина); Параметры.Вставить("ВыбранныеПользователи", Новый Массив); - Параметры.Вставить("ЗаголовокФормыПодбора", "Участники обсуждения"); + Параметры.Вставить("ЗаголовокФормыПодбора", НСтр("ru='Участники обсуждения'")); СтандартнаяОбработка = Ложь; @@ -96,7 +96,7 @@ ПараметрыФормы.Вставить("МножественныйВыбор", Истина); ПараметрыФормы.Вставить("РасширенныйПодбор", Истина); ПараметрыФормы.Вставить("ВыбранныеПользователи", Новый Массив); - ПараметрыФормы.Вставить("ЗаголовокФормыПодбора", "Участники обсуждения"); + ПараметрыФормы.Вставить("ЗаголовокФормыПодбора", НСтр("ru='Участники обсуждения'")); ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы,Элемент,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl index 31f7e5d86..30f973633 100644 --- a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl @@ -120,10 +120,10 @@ // // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных реквизитов. -// - если в параметр Реквизиты передана пустая строка, то возвращается пустая структура. -// - если в параметр Ссылка передана пустая ссылка, то возвращается структура, +// Если в параметр Реквизиты передана пустая строка, то возвращается пустая структура. +// Если в параметр Ссылка передана пустая ссылка, то возвращается структура, // соответствующая именам реквизитов со значениями Неопределено. -// - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), +// Если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), // то все реквизиты вернутся со значением Неопределено. // Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт @@ -307,9 +307,9 @@ "ВЫБРАТЬ РАЗРЕШЕННЫЕ |&ТекстЗапросаПолей |ИЗ - | &ПолноеИмяОбъектаМетаданных КАК Таблица + | &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы |ГДЕ - | Таблица.Ссылка = &Ссылка"; + | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка"; Если Не ВыбратьРазрешенные Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @Query-part-1 @@ -384,9 +384,8 @@ // КодЯзыка - Строка - код языка для мультиязычного реквизита. // // Возвращаемое значение: -// Произвольный - зависит от типа значения прочитанного реквизита. -// - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено; -// - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), +// Произвольный - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено. +// Если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), // то возвращается Неопределено. // Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт @@ -512,16 +511,16 @@ | Ссылка, | &Реквизиты |ИЗ - | &ПолноеИмяОбъектаМетаданных КАК Таблица + | &ПолноеИмяОбъектаМетаданных КАК ПсевдонимЗаданнойТаблицы |ГДЕ - | Таблица.Ссылка В (&Ссылки)"; + | ПсевдонимЗаданнойТаблицы.Ссылка В (&Ссылки)"; Если Не ВыбратьРазрешенные Или ТекстыЗапросов.Количество() > 0 Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @Query-part-1 КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты", РеквизитыТекстЗапроса); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных); ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", ""); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра); // @Query-part-1 ПараметрыЗапроса.Вставить(ИмяПараметра, СсылкиПоТипу.Значение); Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда @@ -531,7 +530,7 @@ МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(ОбъектМетаданных); ПоляТаблиц = Новый Массив; - ПоляТаблиц.Добавить("Таблица.Ссылка"); + ПоляТаблиц.Добавить("ПсевдонимЗаданнойТаблицы.Ссылка"); Для Каждого Реквизит Из СтрРазделить(Реквизиты, ",") Цикл Если МультиязычныеРеквизиты[Реквизит] = Истина Тогда ПоляТаблиц.Добавить("ТаблицаПредставления." + Реквизит + " КАК " + Реквизит); @@ -542,12 +541,12 @@ ПоляТаблиц = СтрСоединить(ПоляТаблиц, ","); - Таблицы = ПолноеИмяОбъектаМетаданных + " " + "КАК Таблица" + Символы.ПС + Таблицы = ПолноеИмяОбъектаМетаданных + " " + "КАК ПсевдонимЗаданнойТаблицы" + Символы.ПС + "ЛЕВОЕ СОЕДИНЕНИЕ" + " " + ПолноеИмяОбъектаМетаданных + ".Представления КАК ТаблицаПредставления" + Символы.ПС - + "ПО ТаблицаПредставления.Ссылка = Таблица.Ссылка И ТаблицаПредставления.КодЯзыка = &КодЯзыка"; + + "ПО ТаблицаПредставления.Ссылка = ПсевдонимЗаданнойТаблицы.Ссылка И ТаблицаПредставления.КодЯзыка = &КодЯзыка"; ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", ""); - Условия = "Таблица.Ссылка В (&" + ИмяПараметра + ")"; + Условия = "ПсевдонимЗаданнойТаблицы.Ссылка В (&" + ИмяПараметра + ")"; СтрокиЗапроса = Новый Массив; СтрокиЗапроса.Добавить("ВЫБРАТЬ" + ?(ВыбратьРазрешенные И Не ЗначениеЗаполнено(ТекстыЗапросов), " " + "РАЗРЕШЕННЫЕ", "")); // @Query-part-1, @Query-part-3 @@ -630,9 +629,9 @@ // КодЯзыка - Строка - код языка для мультиязычного реквизита. // // Возвращаемое значение: -// Соответствие из КлючИЗначение - Ключ - ссылка на объект, Значение - значение прочитанного реквизита: -// * Ключ - ссылка на объект, -// * Значение - значение прочитанного реквизита. +// Соответствие из КлючИЗначение: +// * Ключ - ЛюбаяСсылка - ссылка на объект, +// * Значение - Произвольный - значение прочитанного реквизита. // Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт @@ -964,10 +963,7 @@ ОшибкиЗамены.Индексы.Добавить("Ссылка"); ОшибкиЗамены.Индексы.Добавить("Ссылка, ОбъектОшибки, ТипОшибки"); - Результат = Новый Структура; - Результат.Вставить("ЕстьОшибки", Ложь); - Результат.Вставить("ОчередьКНепосредственномуУдалению", Новый Массив); - Результат.Вставить("Ошибки", ОшибкиЗамены); + Результат = РезультатЗаменыСсылок(ОшибкиЗамены); ПараметрыВыполнения = НовыйПараметрыВыполненияЗаменыСсылок(ПараметрыЗамены); @@ -1056,7 +1052,7 @@ МодульУдалениеПомеченныхОбъектов = ОбщийМодуль("УдалениеПомеченныхОбъектов"); - ДлительныеОперации.СообщитьПрогресс(0, НСтр("ru='Удаление дублей...'")); + ДлительныеОперации.СообщитьПрогресс(0, НСтр("ru = 'Удаление дублей...'")); РезультатУдаления = МодульУдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты(Результат.ОчередьКНепосредственномуУдалению); ЗарегистрироватьОшибкиУдаления(Результат, РезультатУдаления.ПрепятствующиеУдалению); @@ -1257,6 +1253,8 @@ Возврат МестаИспользования; КонецФункции +// Возвращает структуру для параметра ДополнительныеПараметры функции ОбщегоНазначения.МестаИспользования. +// // Возвращаемое значение: // Структура: // * ДополнительныеИсключенияПоискаСсылок - Соответствие - позволяет расширить исключения поиска ссылок @@ -1348,8 +1346,7 @@ КонецФункции -// Возвращает связи подчиненных объектов и перечень реквизитов, -// по которым осуществляется связь. +// Возвращает связи подчиненных объектов и перечень реквизитов, по которым осуществляется связь. // // Есть возможность переопределить процедуру поиска подчиненных объектов. // Для этого в общем модуле или модуле менеджера необходимо реализовать процедуру @@ -1446,7 +1443,8 @@ // Имя - Строка - имя общего модуля. // // Возвращаемое значение: -// ОбщийМодуль, МодульМенеджераОбъекта - общий модуль. +// ОбщийМодуль +// МодульМенеджераОбъекта // // Пример: // Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда @@ -1745,7 +1743,7 @@ // // Возвращаемое значение: // Булево - Истина, если разделение включено, -// - Ложь, если разделение выключено или не поддерживается. +// Ложь, если разделение выключено или не поддерживается. // Функция РазделениеВключено() Экспорт @@ -1762,8 +1760,8 @@ // // Возвращаемое значение: // Булево - Истина, если разделение не поддерживается, либо разделение выключено, -// либо разделение включено и разделители установлены. -// - Ложь, если разделение включено и разделители не установлены. +// либо разделение включено и разделители установлены. +// Ложь, если разделение включено и разделители не установлены. // Функция ДоступноИспользованиеРазделенныхДанных() Экспорт @@ -2741,12 +2739,12 @@ // - Массив // - ФиксированныйМассив // - СписокЗначений - объект, который необходимо скопировать. -// ФиксироватьДанные - Булево -// - Неопределено - если Истина - фиксировать, -// если Ложь - снять фиксацию, если Неопределено - не изменять. +// ФиксироватьДанные - Булево - если Истина - фиксировать, если Ложь - снять фиксацию. +// - Неопределено - не изменять. // // Возвращаемое значение: -// Структура, ФиксированнаяСтруктура, +// Структура, +// ФиксированнаяСтруктура, // Соответствие // ФиксированноеСоответствие // Массив @@ -3927,7 +3925,7 @@ // процедуру ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. // // Параметры: -// Итог - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных. +// Итог - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных.Итог // ВерсияИБ - Строка - версия конечной конфигурации, при переходе на которую нужно // выполнить переименование, например, "2.1.2.14". // СтароеПолноеИмя - Строка - старое полное имя объекта метаданных, которое нужно переименовать, @@ -5726,8 +5724,7 @@ #Область УстаревшиеПроцедурыИФункции // Устарела. Следует использовать -// ОбщегоНазначения.РазделениеВключено() -// И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(). +// ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(). // Функция ИспользованиеРазделителяСеанса() Экспорт @@ -5794,7 +5791,8 @@ // ПолноеИмя - Строка - полное имя объекта метаданных. Пример: "Отчет.БизнесПроцессы". // // Возвращаемое значение: -// ОтчетОбъект, ОбработкаОбъект - экземпляр отчета или обработки. +// ОтчетОбъект +// ОбработкаОбъект - экземпляр отчета или обработки. // Функция ОбъектПоПолномуИмени(ПолноеИмя) Экспорт МассивСтрок = СтрРазделить(ПолноеИмя, "."); @@ -5921,7 +5919,7 @@ // * Ссылка - ЛюбаяСсылка - проверяемая ссылка. // * Данные - ЛюбаяСсылка - место использования. // * Метаданные - ОбъектМетаданных - метаданные места использования. -// ИсключенияПоискаСсылок - см. ОбщегоНазначения.ИсключениеПоискаСсылок. +// ИсключенияПоискаСсылок - Соответствие // // Возвращаемое значение: // Булево @@ -6008,6 +6006,37 @@ КонецФункции +// Устанавливает условное оформление списка выбора +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма, для которой устанавливается оформление. +// ИмяЭлемента - Строка - имя элемента, для которого устанавливается оформление. +// ИмяПоляКомпоновкиДанных - Строка - имя поля компоновки данных. +// +Процедура УстановитьУсловноеОформлениеСпискаВыбора(Форма, ИмяЭлемента, ИмяПоляКомпоновкиДанных) Экспорт + + Элементы = Форма.Элементы; + УсловноеОформление = Форма.УсловноеОформление; + + Для каждого ЭлементВыбора Из Элементы[ИмяЭлемента].СписокВыбора Цикл + + Элемент = УсловноеОформление.Элементы.Добавить(); + + ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); + ЭлементФормы = Элементы[ИмяЭлемента]; // ПолеФормы + ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ЭлементФормы.Имя); + + ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоляКомпоновкиДанных); + ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборЭлемента.ПравоеЗначение = ЭлементВыбора.Значение; + + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", ЭлементВыбора.Представление); + + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -7530,6 +7559,11 @@ КонецФункции +// Параметры: +// Результат - см. РезультатЗаменыСсылок +// Ссылка - ЛюбаяСсылка +// ОписаниеОшибки - см. ОписаниеОшибкиЗамены +// Процедура ЗарегистрироватьОшибкуЗамены(Результат, Знач Ссылка, Знач ОписаниеОшибки) Результат.ЕстьОшибки = Истина; @@ -7543,6 +7577,13 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * ТипОшибки - Строка +// * ОбъектОшибки - ЛюбаяСсылка +// * ПредставлениеОбъектаОшибки - Строка +// * ТекстОшибки - Строка +// Функция ОписаниеОшибкиЗамены(Знач ТипОшибки, Знач ОбъектОшибки, Знач ПредставлениеОбъектаОшибки, Знач ТекстОшибки) Результат = Новый Структура; @@ -7554,6 +7595,22 @@ Возврат Результат; КонецФункции +// Возвращаемое значение: +// Структура: +// * ЕстьОшибки - Булево +// * ОчередьКНепосредственномуУдалению - Массив +// * Ошибки - см. ОбщегоНазначения.ЗаменитьСсылки +// +Функция РезультатЗаменыСсылок(Знач ОшибкиЗамены) + + Результат = Новый Структура; + Результат.Вставить("ЕстьОшибки", Ложь); + Результат.Вставить("ОчередьКНепосредственномуУдалению", Новый Массив); + Результат.Вставить("Ошибки", ОшибкиЗамены); + Возврат Результат + +КонецФункции + Процедура ЗарегистрироватьОшибкуВТаблицу(Результат, Дубль, Оригинал, Данные, Информация, ТипОшибки, ИнформацияОбОшибке) Результат.ЕстьОшибки = Истина; @@ -8890,7 +8947,8 @@ // Проверка имени метода на корректность. Попытка - Тест = Новый Структура(ИмяМетода, ИмяМетода); + Тест = Новый Структура; + Тест.Вставить(ИмяМетода, ИмяМетода); Исключение ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Некорректное значение параметра ИмяМетода (%1) в ОбщегоНазначения.ВыполнитьМетодОбъекта'"), ИмяМетода); diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl index 3e5bc5913..ed29483d2 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl @@ -182,7 +182,11 @@ // Имя - Строка - имя общего модуля. // // Возвращаемое значение: -// ОбщийМодуль, МодульМенеджераОбъекта - общий модуль. +// ОбщийМодуль +// СправочникМенеджер, +// ДокументМенеджер, +// ОбработкаМенеджер, +// РегистрСведенийМенеджер. // // Пример: // Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда @@ -672,11 +676,11 @@ // // Параметры: // Источник - ЛюбаяСсылка -// - РегистрСведенийКлючЗаписи -// - РегистрНакопленияКлючЗаписи -// - РегистрБухгалтерииКлючЗаписи -// - РегистрРасчетаКлючЗаписи - ссылка измененного объекта или ключ измененной записи регистра, об изменении -// которой(го) необходимо уведомить динамические списки и формы. +// - РегистрСведенийКлючЗаписиИмяРегистраСведений +// - РегистрНакопленияКлючЗаписиИмяРегистраНакопления +// - РегистрБухгалтерииКлючЗаписиИмяРегистраБухгалтерии +// - РегистрРасчетаКлючЗаписиИмяРегистраРасчета - ссылка измененного объекта или ключ измененной записи +// регистра, об изменении которых необходимо уведомить динамические списки и формы. // ДополнительныеПараметры - Произвольный - любые параметры, которые необходимо передать в методе Оповестить. // Процедура ОповеститьОбИзмененииОбъекта(Источник, Знач ДополнительныеПараметры = Неопределено) Экспорт @@ -1087,9 +1091,9 @@ // Параметры: // ВыполнитьПерезагрузкуСеанса - Булево - если Истина, то после регистрации COM соединителя // будет вызван диалог перезапуска сеанса. -// Оповещение - ОписаниеОповещения - оповещение о результате регистрации. -// - Зарегистрировано - Булево - Истина, если COM соединитель зарегистрирован без ошибок. -// - ДополнительныеПараметры - Произвольный - значение, которое было указано +// Оповещение - ОписаниеОповещения - оповещение о результате регистрации: +// * Зарегистрировано - Булево - Истина, если COM соединитель зарегистрирован без ошибок. +// * ДополнительныеПараметры - Произвольный - значение, которое было указано // при создании объекта ОписаниеОповещения. // // Пример: @@ -1302,9 +1306,9 @@ // Параметры: // ПутьКФайлу - Строка - полный путь к файлу на диске, который требуется открыть. // Оповещение - ОписаниеОповещения - оповещение о результате открытия. -// если оповещение не задано, в случае ошибки будет показано предупреждение. -// - ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии. -// - ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. +// если оповещение не задано, в случае ошибки будет показано предупреждение: +// * ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии. +// * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. // // Пример: // ОбщегоНазначенияКлиент.ОткрытьФайлВПрограммеПросмотра(КаталогДокументов() + "test.pdf"); @@ -1355,9 +1359,9 @@ // Параметры: // НавигационнаяСсылка - Строка - ссылка, которую требуется открыть. // Оповещение - ОписаниеОповещения - оповещение о результате открытия. -// если оповещение не задано, в случае ошибки будет показано предупреждение. -// - ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии. -// - ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. +// если оповещение не задано, в случае ошибки будет показано предупреждение: +// * ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии. +// * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. // // Пример: // ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("e1cib/navigationpoint/startpage"); // начальная страница. diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl index 313178f20..0b2623bf9 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -1244,9 +1244,9 @@ // Необязательный. Значение по умолчанию: Неопределено. // РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - способ отображения этого отбора // пользователю: -// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ - в группе быстрых настроек над списком. -// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный - в настройка списка (в подменю Еще). -// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный - запретить пользователю менять этот отбор. +// РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ - в группе быстрых настроек над списком. +// РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный - в настройка списка (в подменю Еще). +// РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный - запретить пользователю менять этот отбор. // ИдентификаторПользовательскойНастройки - Строка - уникальный идентификатор этого отбора. // Используется для связи с пользовательскими настройками. // @@ -2433,6 +2433,142 @@ #КонецОбласти +#Область ПроверкаТипаЗначения + +// Возвращает признак того, что переданное значение является, либо не является, числом. +// +// Параметры: +// ПроверяемоеЗначение - Строка - значение, которое проверяется на соответствие числу. +// +// Возвращаемое значение: +// Булево - признак того, что переданное значение является, либо не является, числом. +// +Функция ЭтоЧисло(Знач ПроверяемоеЗначение) Экспорт + + Если ПроверяемоеЗначение = "0" Тогда + Возврат Истина; + КонецЕсли; + + ОписаниеЧисла = Новый ОписаниеТипов("Число"); + + Возврат ОписаниеЧисла.ПривестиЗначение(ПроверяемоеЗначение) <> 0; + +КонецФункции + +#КонецОбласти + +#Область ПриведениеЗначения + +// Приводит строковое значение к дате. +// +// Параметры: +// Значение - Строка - строковое значение, которое приводится к дате. +// +// Возвращаемое значение: +// Дата - приведенное значение. +// +Функция СтрокаВДату(Знач Значение) Экспорт + + ПустаяДата = Дата(1, 1, 1); + + Если Не ЗначениеЗаполнено(Значение) Тогда + Возврат ПустаяДата; + КонецЕсли; + + ОписаниеДаты = Новый ОписаниеТипов("Дата"); + Дата = ОписаниеДаты.ПривестиЗначение(Значение); + + Если ТипЗнч(Дата) = Тип("Дата") + И ЗначениеЗаполнено(Дата) Тогда + + Возврат Дата; + КонецЕсли; + + #Область ПодготовкаЧастейДаты + + КоличествоСимволов = СтрДлина(Значение); + + Если КоличествоСимволов > 25 Тогда + Возврат ПустаяДата; + КонецЕсли; + + ЧастиЗначения = Новый Массив; + ЧастьЗначения = ""; + + Для НомерСимвола = 1 По КоличествоСимволов Цикл + + Символ = Сред(Значение, НомерСимвола, 1); + + Если ЭтоЧисло(Символ) Тогда + + ЧастьЗначения = ЧастьЗначения + Символ; + + Иначе + + Если Не ПустаяСтрока(ЧастьЗначения) Тогда + ЧастиЗначения.Добавить(ЧастьЗначения); + КонецЕсли; + + ЧастьЗначения = ""; + + КонецЕсли; + + Если НомерСимвола = КоличествоСимволов + И Не ПустаяСтрока(ЧастьЗначения) Тогда + + ЧастиЗначения.Добавить(ЧастьЗначения); + КонецЕсли; + + КонецЦикла; + + Если ЧастиЗначения.Количество() < 3 Тогда + Возврат ПустаяДата; + КонецЕсли; + + Если ЧастиЗначения.Количество() < 4 Тогда + ЧастиЗначения.Добавить("00"); + КонецЕсли; + + Если ЧастиЗначения.Количество() < 5 Тогда + ЧастиЗначения.Добавить("00"); + КонецЕсли; + + Если ЧастиЗначения.Количество() < 6 Тогда + ЧастиЗначения.Добавить("00"); + КонецЕсли; + + #КонецОбласти + + // Если формат ггггММддЧЧммсс: + НормализованноеЗначение = ЧастиЗначения[2] + ЧастиЗначения[1] + ЧастиЗначения[0] + + ЧастиЗначения[3] + ЧастиЗначения[4] + ЧастиЗначения[5]; + + Дата = ОписаниеДаты.ПривестиЗначение(НормализованноеЗначение); + + Если ТипЗнч(Дата) = Тип("Дата") + И ЗначениеЗаполнено(Дата) Тогда + + Возврат Дата; + КонецЕсли; + + // Если формат ггггддММЧЧммсс + НормализованноеЗначение = ЧастиЗначения[2] + ЧастиЗначения[0] + ЧастиЗначения[1] + + ЧастиЗначения[3] + ЧастиЗначения[4] + ЧастиЗначения[5]; + + Дата = ОписаниеДаты.ПривестиЗначение(НормализованноеЗначение); + + Если ТипЗнч(Дата) = Тип("Дата") + И ЗначениеЗаполнено(Дата) Тогда + + Возврат Дата; + КонецЕсли; + + Возврат ПустаяДата; + +КонецФункции + +#КонецОбласти + #Область Прочее // Снимает один элемент условного оформления, если это список значений. @@ -3321,11 +3457,10 @@ // если не указан ДождатьсяЗавершения - игнорируется. // * ПолучитьПотокОшибок - Булево - ошибки, направленные в поток stderr, // если не указан ДождатьсяЗавершения - игнорируется. -// * ВыполнитьСНаивысшимиПравами - Булево - требуется запустить программу на исполнение -// с повышением привилегий системы: -// - подтверждение UAC для Windows; -// - интерактивным запросом c GUI sudo и перенаправлением -// $DISPLAY и $XAUTHORITY текущего пользователя для Linux; +// * ВыполнитьСНаивысшимиПравами - Булево - требуется запустить программу с повышением привилегий системы: +// подтверждение UAC для Windows; +// или интерактивный запрос c GUI sudo и перенаправление +// $DISPLAY и $XAUTHORITY текущего пользователя для Linux; // Не совместим с параметром ДождатьсяЗавершения. В MacOS игнорируется. // * Кодировка - Строка - код кодировки, устанавливаемый до выполнения пакетной операции. // В Linux и macOS игнорируется. diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебный/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебный/Module.bsl new file mode 100644 index 000000000..70264c0a5 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебный/Module.bsl @@ -0,0 +1,31 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +#Область ЗапускВнешнихПриложений + +Функция БезопаснаяСтрокаКоманды(КомандаЗапуска) Экспорт + + СредаИсполнения = ""; + + Если ОбщегоНазначения.ЭтоWindowsСервер() Тогда + СредаИсполнения = "Windows"; + ИначеЕсли ОбщегоНазначения.ЭтоLinuxСервер() Тогда + СредаИсполнения = "Linux"; + КонецЕсли; + + Результат = ОбщегоНазначенияСлужебныйКлиентСервер.БезопаснаяСтрокаКоманды(КомандаЗапуска, СредаИсполнения); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебный/ОбщегоНазначенияСлужебный.mdo b/SSL/src/CommonModules/ОбщегоНазначенияСлужебный/ОбщегоНазначенияСлужебный.mdo new file mode 100644 index 000000000..b5817571a --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебный/ОбщегоНазначенияСлужебный.mdo @@ -0,0 +1,11 @@ + + + ОбщегоНазначенияСлужебный + + ru + Общего назначения служебный + + true + true + true + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl index 037cb57aa..9bec76676 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl @@ -27,7 +27,7 @@ // Конвертирует параметры запуска текущего сеанса в передаваемые параметры в скрипт // Например, на вход программа может быть запущена с ключом: // /C "ПараметрыЗапускаИзВнешнейОперации=/TestClient -TPort 48050 /C РежимОтладки;РежимОтладки" -// Пробросит в скрипт следует "/TestClient -TPort 48050 /C РежимОтладки" +// то в скрипт будет передана строка: "/TestClient -TPort 48050 /C РежимОтладки". // // Возвращаемое значение: // Строка - значение параметра. @@ -55,7 +55,7 @@ // * Кэшировать - Булево // * ПредложитьУстановить - Булево // * ТекстПояснения - Строка -// * ИдентификаторыСозданияОбъектов +// * ИдентификаторыСозданияОбъектов - Массив из Строка // Процедура ПодключитьКомпоненту(Контекст) Экспорт @@ -218,9 +218,10 @@ // Форма - ФормаКлиентскогоПриложения - форма, в которой выводятся значения расчетных показателей. // ИмяТабличногоДокумента - Строка - имя реквизита формы типа ТабличныйДокумент, показатели которого рассчитываются. // ТекущаяКоманда - Строка - имя команды расчета показателя, например, "РассчитатьСумму". -// Определяет, какой показатель является основным. +// Определяет, какой показатель является основным. +// МинимальноеКоличество - Число // -Процедура РассчитатьПоказатели(Форма, ИмяТабличногоДокумента, ТекущаяКоманда = "") Экспорт +Процедура РассчитатьПоказатели(Форма, ИмяТабличногоДокумента, ТекущаяКоманда = "", МинимальноеКоличество = 0) Экспорт Элементы = Форма.Элементы; ТабличныйДокумент = Форма[ИмяТабличногоДокумента]; @@ -252,12 +253,17 @@ // Вывод основного показателя. ТекущийПоказатель = КомандыПоказателей[ТекущаяКоманда]; - Форма.Показатель = Форма[ТекущийПоказатель]; - Элементы.Показатель.ФорматРедактирования = Элементы[ТекущийПоказатель].ФорматРедактирования; + Если РасчетныеПоказатели.Количество >= МинимальноеКоличество Тогда + Форма.Показатель = Форма[ТекущийПоказатель]; + Элементы.Показатель.ФорматРедактирования = Элементы[ТекущийПоказатель].ФорматРедактирования; + КонецЕсли; ИзменитьСвойствоЭлементаРасчетаПоказателей( Элементы, "КомандыВидовПоказателей", "Картинка", БиблиотекаКартинок[ТекущийПоказатель]); + ИзменитьСвойствоЭлементаРасчетаПоказателей( + Элементы, "ВыбратьПоказатель", "Картинка", БиблиотекаКартинок[ТекущийПоказатель]); + // Кэширование состояния выбора показателей. Форма.ОсновнойПоказатель = ТекущаяКоманда; Форма.РазвернутьОбластьПоказателей = Элементы.РассчитатьВсеПоказатели.Пометка; @@ -267,6 +273,7 @@ // Управляет признаком видимости панели расчетных показателей. // // Параметры: +// ЭлементыФормы - ЭлементыФормы // Видимость - Булево - признак включения / выключения видимости панели показателей. // См. также Синтакс-помощник: ГруппаФормы.Видимость. // @@ -403,7 +410,7 @@ КонецЕсли; ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , - КодВозвратаДиалога.Нет); + КодВозвратаДиалога.Да); КонецПроцедуры @@ -490,8 +497,6 @@ #Область ВнешниеКомпоненты -#Область ПодключениеВнешнейКомпоненты - // Продолжение процедуры ПодключитьКомпоненту. Процедура ПодключитьКомпонентуПослеПопыткиПодключения(Подключено, Контекст) Экспорт @@ -693,10 +698,6 @@ КонецФункции -#КонецОбласти - -#Область УстановкаВнешнейКомпоненты - // Продолжение процедуры УстановитьКомпоненту. Процедура УстановитьКомпонентуПослеОтветаНаВопросОбУстановке(Ответ, Контекст) Экспорт @@ -772,8 +773,6 @@ КонецФункции -#КонецОбласти - Функция МестоположениеКомпонентыКорректно(Местоположение) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда @@ -920,8 +919,16 @@ |Код ошибки regsvr32: %1'"), КодВозврата); - Если КодВозврата = 5 Тогда - ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Недостаточно прав доступа.'"); + Если КодВозврата = 1 Тогда + ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Ошибка разбора командной строки.'"); + ИначеЕсли КодВозврата = 2 Тогда + ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Ошибка инициализации COM библиотеки.'"); + ИначеЕсли КодВозврата = 3 Тогда + ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Ошибка загрузки модуля из COM библиотеки.'"); + ИначеЕсли КодВозврата = 4 Тогда + ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Ошибка получения адреса функции или переменной из СOM-библиотеки.'"); + ИначеЕсли КодВозврата = 5 Тогда + ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Ошибка исполнения функции регистрации.'"); Иначе ТекстСообщения = ТекстСообщения + Символы.ПС + ОписаниеОшибки; КонецЕсли; @@ -966,6 +973,10 @@ КонецПроцедуры // Продолжение процедуры ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель. +// +// Возвращаемое значение: +// Булево +// Функция ЗарегистрироватьCOMСоединительДоступнаРегистрация() Экспорт #Если ВебКлиент Или МобильныйКлиент Тогда @@ -1071,9 +1082,29 @@ #КонецОбласти -#Область УстаревшиеПроцедурыИФункции +#Область ЗапускВнешнихПриложений -#Область РасширениеДляРаботыСФайлами +Функция БезопаснаяСтрокаКоманды(КомандаЗапуска) Экспорт + + СредаИсполнения = ""; + + Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда + СредаИсполнения = "Windows"; + ИначеЕсли ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда + СредаИсполнения = "Linux"; + ИначеЕсли ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() Тогда + СредаИсполнения = "MacOS"; + КонецЕсли; + + Результат = ОбщегоНазначенияСлужебныйКлиентСервер.БезопаснаяСтрокаКоманды(КомандаЗапуска, СредаИсполнения); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область УстаревшиеПроцедурыИФункции // Устарела. Используется в ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено. Процедура ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение(РасширениеПодключено, ДополнительныеПараметры) Экспорт @@ -1093,6 +1124,4 @@ #КонецОбласти -#КонецОбласти - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl index f513870f8..f6d5a3a47 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl @@ -10,13 +10,23 @@ #Область ЗапускВнешнихПриложений -Функция БезопаснаяСтрокаКоманды(КомандаЗапуска) Экспорт +// Для вызова с клиента следует использовать ОбщегоНазначенияСлужебныйКлиент.БезопаснаяСтрокаКоманды, +// для вызова с сервера - ОбщегоНазначенияСлужебный.БезопаснаяСтрокаКоманды. +// +// Параметры: +// КомандаЗапуска - Строка +// СредаИсполнения - Строка +// +// Возвращаемое значение: +// Строка +// +Функция БезопаснаяСтрокаКоманды(КомандаЗапуска, СредаИсполнения = "Windows") Экспорт Результат = ""; Если ТипЗнч(КомандаЗапуска) = Тип("Строка") Тогда - Если СодержитНебезопасныеДействия(КомандаЗапуска) Тогда + Если СредаИсполнения = "Windows" И СодержитНебезопасныеДействия(КомандаЗапуска) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось запустить программу |по причине: @@ -31,9 +41,9 @@ ИначеЕсли ТипЗнч(КомандаЗапуска) = Тип("Массив") Тогда - Если КомандаЗапуска.Количество() > 0 Тогда + Если КомандаЗапуска.Количество() > 0 Тогда - Если СодержитНебезопасныеДействия(КомандаЗапуска[0]) Тогда + Если СредаИсполнения = "Windows" И СодержитНебезопасныеДействия(КомандаЗапуска[0]) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось запустить программу |по причине: @@ -51,8 +61,8 @@ НСтр("ru = 'Ожидалось, что первый элемент массива КомандаЗапуска будет командой или путем к исполняемому файлу.'"); КонецЕсли; - Иначе - ВызватьИсключение + Иначе + ВызватьИсключение НСтр("ru = 'Ожидалось, что значение КомандаЗапуска будет <Строка> или <Массив>'"); КонецЕсли; @@ -62,16 +72,13 @@ #КонецОбласти -#Область ТабличныйДокумент - -//////////////////////////////////////////////////////////////////////////////// -// Функции для работы с табличными документами. +#Область Прочее // Рассчитывает показатели числовых ячеек в табличном документе. // // Параметры: // ТабличныйДокумент - ТабличныйДокумент - ТабличныйДокумент, показатели которого рассчитываются. -// ВыделенныеОбласти - см. также ОбщегоНазначенияСлужебныйКлиент.ПараметрыРасчетаПоказателейЯчеек. +// ВыделенныеОбласти - Массив из см. ОбщегоНазначенияСлужебныйКлиентСервер.ПараметрыРасчетаПоказателейЯчеек. // // Возвращаемое значение: // Структура - результаты расчета выделенных ячеек: @@ -620,6 +627,76 @@ КонецФункции +// Возвращает представление периода в нижнем регистре или с заглавной буквы, +// если с него начинается фраза (предложение). +// Например, если требуется вывести представление периода в заголовке отчета +// в формате "Продажи за [ДатаНачала] - [ДатаОкончания]", то ожидается, что +// результат будет выглядеть так: "Продажи за февраль 2020 г. - март 2020 г.". +// Т.е. - строчно, т.к. "февраль 2020 г. - март 2020 г." не является началом предложения. +// +// Параметры: +// ДатаНачала - Дата - начало периода. +// ДатаОкончания - Дата - конец периода. +// ФорматнаяСтрока - Строка - определяет способ форматирования периода. +// СЗаглавнойБуквы - Булево - Истина, если с представления периода начинается предложение. +// По умолчанию - Ложь. +// +// Возвращаемое значение: +// Строка - представление периода в требуемом формате и регистре. +// +Функция ПредставлениеПериодаВТексте(ДатаНачала, ДатаОкончания, ФорматнаяСтрока, СЗаглавнойБуквы) Экспорт + + Если ДатаНачала > ДатаОкончания Тогда + Возврат ""; + КонецЕсли; + + ПредставлениеПериода = НРег(ПредставлениеПериода(ДатаНачала, ДатаОкончания, ФорматнаяСтрока)); + + ОтформатироватьПредставлениеПериода(ПредставлениеПериода, ДатаНачала, ДатаОкончания, ФорматнаяСтрока); + + Если СЗаглавнойБуквы Тогда + ПредставлениеПериода = ВРег(Сред(ПредставлениеПериода, 1, 1)) + Сред(ПредставлениеПериода, 2); + КонецЕсли; + + Возврат ПредставлениеПериода; + +КонецФункции + +Процедура ОтформатироватьПредставлениеПериода(ПредставлениеПериода, ДатаНачала, ДатаОкончания, ФорматнаяСтрока) + + Если ЗначениеЗаполнено(ФорматнаяСтрока) Тогда + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ПредставлениеПериода) Тогда + + ПредставлениеПериода = НСтр("ru = 'за все время'"); + Возврат; + + КонецЕсли; + + Если Месяц(ДатаНачала) > 1 + Или Год(ДатаНачала) <> Год(ДатаОкончания) + Или ДатаНачала <> НачалоМесяца(ДатаНачала) + Или ДатаОкончания <> КонецМесяца(ДатаОкончания) Тогда + + Возврат; + КонецЕсли; + + Если Месяц(ДатаОкончания) = 6 Тогда + + ПредставлениеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '1 полугодие %1 г.'"), Формат(Год(ДатаНачала), "ЧГ=0")); + + ИначеЕсли Месяц(ДатаОкончания) = 9 Тогда + + ПредставлениеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '9 месяцев %1 г.'"), Формат(Год(ДатаНачала), "ЧГ=0")); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ТабличныйДокумент diff --git a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl index cc0722042..9c642361a 100644 --- a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl @@ -11,14 +11,14 @@ // Отправляет SMS через настроенного поставщика услуги, возвращает идентификатор сообщения. // // Параметры: -// НомераПолучателей - Массив - массив строк номеров получателей в формате +7ХХХХХХХХХХ; +// НомераПолучателей - Массив из Строка - номера получателей в формате +7ХХХХХХХХХХ; // Текст - Строка - текст сообщения, максимальная длина у операторов может быть разной; // ИмяОтправителя - Строка - имя отправителя, которое будет отображаться вместо номера у получателей; // ПеревестиВТранслит - Булево - Истина, если требуется переводить текст сообщения в транслит перед отправкой. // // Возвращаемое значение: // Структура: -// * ОтправленныеСообщения - Массив - массив структур: +// * ОтправленныеСообщения - Массив из Структура: // ** НомерПолучателя - Строка - номер получателя SMS. // ** ИдентификаторСообщения - Строка - идентификатор SMS, присвоенный провайдером для отслеживания доставки. // * ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, то ошибки нет. @@ -351,6 +351,16 @@ КонецФункции +// Настройки отправки SMS. +// +// Возвращаемое значение: +// Структура: +// * Логин - Строка +// * Пароль - Строка +// * Провайдер - Строка +// * ИмяОтправителя - Строка +// * СпособАвторизации - Строка - например, "ПоЛогинуИПаролю". +// Функция НастройкиОтправкиSMS() Экспорт Результат = Новый Структура("Логин,Пароль,Провайдер,ИмяОтправителя,СпособАвторизации"); diff --git a/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl index a0a345e3a..600dd8776 100644 --- a/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/Module.bsl @@ -19,7 +19,7 @@ // * Логин - Строка - логин для доступа к услуге отправки SMS; // * Пароль - Строка - пароль для доступа к услуге отправки SMS. // -// Результат - Структура - (возвращаемое значение) результат отправки: +// Результат - Структура - возвращаемое значение. Результат отправки: // * ОтправленныеСообщения - Массив из Структура: // ** НомерПолучателя - Строка - номер получателя из массива НомераПолучателей; // ** ИдентификаторСообщения - Строка - идентификатор SMS, по которому можно запросить статус отправки. diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl index a4eff8b75..2cc67b77c 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMS4B/Module.bsl @@ -18,10 +18,7 @@ // Пароль - Строка - пароль пользователя услуги отправки sms. // // Возвращаемое значение: -// Структура: ОтправленныеСообщения - Массив структур: НомерОтправителя. -// ИдентификаторСообщения. -// ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, -// то ошибки нет. +// см. ОтправкаSMS.ОтправитьSMS. // Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Пароль) Экспорт @@ -59,8 +56,8 @@ // Возвращает текстовое представление статуса доставки сообщения. // // Параметры: -// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке; -// НастройкиОтправкиSMS - см. ОтправкаSMSПовтИсп.НастройкиОтправкиSMS; +// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке. +// НастройкиОтправкиSMS - см. ОтправкаSMS.НастройкиОтправкиSMS. // // Возвращаемое значение: // см. ОтправкаSMS.СтатусДоставки. diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl index 354730f66..540354efa 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSRU/Module.bsl @@ -18,10 +18,7 @@ // Пароль - Строка - пароль пользователя услуги отправки sms. // // Возвращаемое значение: -// Структура: ОтправленныеСообщения - Массив структур: НомерОтправителя. -// ИдентификаторСообщения. -// ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, -// то ошибки нет. +// см. ОтправкаSMS.ОтправитьSMS. // Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Пароль) Экспорт @@ -85,8 +82,8 @@ // Возвращает текстовое представление статуса доставки сообщения. // // Параметры: -// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке; -// НастройкиОтправкиSMS - см. ОтправкаSMSПовтИсп.НастройкиОтправкиSMS; +// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке. +// НастройкиОтправкиSMS - см. ОтправкаSMS.НастройкиОтправкиSMS. // // Возвращаемое значение: // см. ОтправкаSMS.СтатусДоставки. diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl index 15c48af44..9a4a82230 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезSMSЦЕНТР/Module.bsl @@ -18,10 +18,7 @@ // Пароль - Строка - пароль пользователя услуги отправки sms. // // Возвращаемое значение: -// Структура: ОтправленныеСообщения - Массив структур: НомерОтправителя. -// ИдентификаторСообщения. -// ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, -// то ошибки нет. +// см. ОтправкаSMS.ОтправитьSMS. // Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Пароль) Экспорт @@ -87,8 +84,8 @@ // Возвращает текстовое представление статуса доставки сообщения. // // Параметры: -// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке; -// НастройкиОтправкиSMS - см. ОтправкаSMSПовтИсп.НастройкиОтправкиSMS; +// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке. +// НастройкиОтправкиSMS - см. ОтправкаSMS.НастройкиОтправкиSMS. // // Возвращаемое значение: // см. ОтправкаSMS.СтатусДоставки. diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl index 951daaa9b..2f4cca6b0 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl @@ -18,10 +18,7 @@ // Пароль - Строка - пароль пользователя услуги отправки sms. // // Возвращаемое значение: -// Структура: ОтправленныеСообщения - Массив структур: НомерОтправителя. -// ИдентификаторСообщения. -// ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, -// то ошибки нет. +// см. ОтправкаSMS.ОтправитьSMS. // Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Пароль) Экспорт @@ -114,8 +111,8 @@ // Возвращает текстовое представление статуса доставки сообщения. // // Параметры: -// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке; -// НастройкиОтправкиSMS - см. ОтправкаSMSПовтИсп.НастройкиОтправкиSMS; +// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке. +// НастройкиОтправкиSMS - см. ОтправкаSMS.НастройкиОтправкиSMS. // // Возвращаемое значение: // см. ОтправкаSMS.СтатусДоставки. diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl index 0ac592660..3fc7e9576 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl @@ -18,10 +18,7 @@ // Пароль - Строка - пароль пользователя услуги отправки sms. // // Возвращаемое значение: -// Структура: ОтправленныеСообщения - Массив структур: НомерОтправителя. -// ИдентификаторСообщения. -// ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, -// то ошибки нет. +// см. ОтправкаSMS.ОтправитьSMS. // Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Знач Пароль) Экспорт @@ -75,8 +72,8 @@ // Возвращает текстовое представление статуса доставки сообщения. // // Параметры: -// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке; -// НастройкиОтправкиSMS - см. ОтправкаSMSПовтИсп.НастройкиОтправкиSMS; +// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке. +// НастройкиОтправкиSMS - см. ОтправкаSMS.НастройкиОтправкиSMS. // // Возвращаемое значение: // см. ОтправкаSMS.СтатусДоставки. diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl index c0c8b26b3..791d2a95e 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезСМСУслуги/Module.bsl @@ -18,10 +18,7 @@ // Пароль - Строка - пароль пользователя услуги отправки sms. // // Возвращаемое значение: -// Структура: ОтправленныеСообщения - Массив структур: НомерОтправителя. -// ИдентификаторСообщения. -// ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, -// то ошибки нет. +// см. ОтправкаSMS.ОтправитьSMS. // Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Пароль) Экспорт @@ -87,8 +84,8 @@ // Возвращает текстовое представление статуса доставки сообщения. // // Параметры: -// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке; -// НастройкиОтправкиSMS - см. ОтправкаSMSПовтИсп.НастройкиОтправкиSMS; +// ИдентификаторСообщения - Строка - идентификатор, присвоенный sms при отправке. +// НастройкиОтправкиSMS - см. ОтправкаSMS.НастройкиОтправкиSMS. // // Возвращаемое значение: // см. ОтправкаSMS.СтатусДоставки. diff --git a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl index f7e5f811f..081e1a581 100644 --- a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl @@ -13,7 +13,7 @@ // // Параметры: // ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. -// ОбработчикЗавершения - ОбработчикОповещения - обработчик, который будет вызван после формирования отчета. +// ОбработчикЗавершения - ОписаниеОповещения - обработчик, который будет вызван после формирования отчета. // В 1-й параметр процедуры, указанной в ОбработчикЗавершения, // передается параметр: ОтчетСформирован (Булево) - признак того, что отчет был успешно сформирован. // @@ -266,40 +266,143 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения - форма отчета или форма настроек отчета. // ИмяКоманды - Строка - имя команды выбора периода, содержащее путь к значению периода. +// ВариантПериода - Неопределено +// - ПеречислениеСсылка.ВариантыПериода // -Процедура ВыбратьПериод(Форма, ИмяКоманды) Экспорт +Процедура ВыбратьПериод(Форма, ИмяКоманды, ВариантПериода = Неопределено) Экспорт Путь = СтрЗаменить(ИмяКоманды, "ВыбратьПериод", "Период"); - Значение = Форма[Путь]; + Период = Форма[Путь]; + + Контекст = Новый Структура(); + Контекст.Вставить("Форма", Форма); + Контекст.Вставить("ИмяКоманды", ИмяКоманды); + Контекст.Вставить("Путь", Путь); + Контекст.Вставить("Период", Период); - Контекст = Новый Структура("Форма, Путь", Форма, Путь); Обработчик = Новый ОписаниеОповещения("ВыбратьПериодЗавершение", ЭтотОбъект, Контекст); СтандартнаяОбработка = Истина; - ОтчетыКлиентПереопределяемый.ПриНажатииКнопкиВыбораПериода(Форма, Значение, СтандартнаяОбработка, Обработчик); + ОтчетыКлиентПереопределяемый.ПриНажатииКнопкиВыбораПериода(Форма, Период, СтандартнаяОбработка, Обработчик); + Если Не СтандартнаяОбработка Тогда Возврат; КонецЕсли; - Диалог = Новый ДиалогРедактированияСтандартногоПериода; - Диалог.Период = Значение; - Диалог.Показать(Обработчик); + Если ВариантПериода = Неопределено Тогда + ВариантПериода = Форма.НастройкиОтчета.ВариантПериода; + КонецЕсли; + + Если ВариантПериода = ПредопределенноеЗначение("Перечисление.ВариантыПериода.Финансовый") Тогда + + Контекст.Удалить("Форма"); + + ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ВыборФинансовогоПериода", + Контекст, + Форма,,,, + Обработчик); + + Иначе + + Диалог = Новый ДиалогРедактированияСтандартногоПериода; + Диалог.Период = Период; + Диалог.Показать(Обработчик); + + КонецЕсли; +КонецПроцедуры + +// Выполняет сдвиг периода назад или вперед. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма отчета или форма настроек отчета. +// ИмяКоманды - Строка - имя команды выбора периода, содержащее путь к значению периода. +// +Процедура СдвинутьПериод(Форма, ИмяКоманды) Экспорт + Если СтрНайти(НРег(ИмяКоманды), "назад") > 0 Тогда + + НаправлениеСдвига = -1; + Путь = СтрЗаменить(ИмяКоманды, "СдвинутьПериодНазад", "Период"); + Иначе + НаправлениеСдвига = 1; + Путь = СтрЗаменить(ИмяКоманды, "СдвинутьПериодВперед", "Период"); + КонецЕсли; + + Период = Форма[Путь]; // СтандартныйПериод + + Если Не ЗначениеЗаполнено(Период.ДатаНачала) + Или Не ЗначениеЗаполнено(Период.ДатаОкончания) Тогда + + Возврат; + КонецЕсли; + + Если Период.ДатаНачала = НачалоДня(Период.ДатаОкончания) Тогда + + Период.ДатаНачала = Период.ДатаНачала + 86400 * НаправлениеСдвига; + Период.ДатаОкончания = КонецДня(Период.ДатаНачала); + + ИначеЕсли Период.ДатаНачала = НачалоМесяца(Период.ДатаОкончания) Тогда + + Период.ДатаНачала = ДобавитьМесяц(Период.ДатаНачала, НаправлениеСдвига); + Период.ДатаОкончания = КонецМесяца(Период.ДатаНачала); + + ИначеЕсли Период.ДатаНачала = НачалоКвартала(Период.ДатаОкончания) Тогда + + Период.ДатаНачала = ДобавитьМесяц(Период.ДатаНачала, 3 * НаправлениеСдвига); + Период.ДатаОкончания = КонецКвартала(Период.ДатаНачала); + + ИначеЕсли Период.ДатаНачала = НачалоГода(Период.ДатаОкончания) + И КонецГода(Период.ДатаНачала) = Период.ДатаОкончания Тогда + + Период.ДатаНачала = ДобавитьМесяц(Период.ДатаНачала, 12 * НаправлениеСдвига); + Период.ДатаОкончания = КонецГода(Период.ДатаНачала); + + ИначеЕсли Период.ДатаНачала = НачалоГода(Период.ДатаОкончания) + И (Месяц(Период.ДатаОкончания) = 6 Или Месяц(Период.ДатаОкончания) = 9) Тогда + + Период.ДатаНачала = ДобавитьМесяц(Период.ДатаНачала, 12 * НаправлениеСдвига); + Период.ДатаОкончания = ДобавитьМесяц(Период.ДатаОкончания, 12 * НаправлениеСдвига); + + КонецЕсли; + + Форма[Путь] = Период; + УстановитьПериод(Форма, Путь); + + ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(Форма); КонецПроцедуры // Обработчик редактирования стандартного периода. // // Параметры: -// ВыбранныйПериод - СтандартныйПериод - значение, возвращенное диалогом. +// РезультатВыбора - Структура: +// - СтандартныйПериод - значение, возвращенное диалогом. // Контекст - Структура - содержит форму отчета (настроек) и путь к значению периода. // -Процедура ВыбратьПериодЗавершение(ВыбранныйПериод, Контекст) Экспорт - Если ВыбранныйПериод = Неопределено Тогда +Процедура ВыбратьПериодЗавершение(РезультатВыбора, Контекст) Экспорт + Если РезультатВыбора = Неопределено Тогда Возврат; КонецЕсли; - Контекст.Форма[Контекст.Путь] = ВыбранныйПериод; - УстановитьПериод(Контекст.Форма, Контекст.Путь); + Если ТипЗнч(РезультатВыбора) = Тип("Структура") + И РезультатВыбора.Свойство("Событие") Тогда + + ВыбратьПериод(РезультатВыбора.ВладелецФормы, РезультатВыбора.ИмяКоманды, РезультатВыбора.ВариантПериода); + Возврат; + + ИначеЕсли ТипЗнч(РезультатВыбора) = Тип("Структура") Тогда + + Форма = РезультатВыбора.ВладелецФормы; + Период = РезультатВыбора.Период; + + Иначе + + Форма = Контекст.Форма; + Период = РезультатВыбора; + + КонецЕсли; - ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(Контекст.Форма); + Форма[Контекст.Путь] = Период; + УстановитьПериод(Форма, Контекст.Путь); + + ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(Форма); КонецПроцедуры // Инициализирует значение элемента настройки периода. @@ -324,15 +427,22 @@ Индекс = Форма.ПутьКДаннымЭлементов.ПоИмени[Путь]; КонецЕсли; + Период = Форма[Путь]; // СтандартныйПериод + ЭлементПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[Индекс]; ЭлементПользовательскойНастройки.Использование = Истина; Если ТипЗнч(ЭлементПользовательскойНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда - ЭлементПользовательскойНастройки.Значение = Форма[Путь]; + ЭлементПользовательскойНастройки.Значение = Период; Иначе // Элемент отбора. - ЭлементПользовательскойНастройки.ПравоеЗначение = Форма[Путь]; + ЭлементПользовательскойНастройки.ПравоеЗначение = Период; КонецЕсли; + ИмяКнопкиВыбораПериода = СтрЗаменить(Путь, "Период", "ВыбратьПериод"); + КнопкаВыбораПериода = Форма.Элементы.Найти(ИмяКнопкиВыбораПериода); + КнопкаВыбораПериода.Заголовок = СтроковыеФункцииКлиент.ПредставлениеПериодаВТексте( + Период.ДатаНачала, Период.ДатаОкончания); + ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(Форма); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl index 61ea97f66..71f7501ad 100644 --- a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl @@ -92,6 +92,13 @@ // // // Вызов метода переформирования Схемы компоновки данных... // // КонецЕсли; // +// * ПоляПоиска - Массив из Строка - коллекция имен полей компоновки данных, которые участвуют в универсальном поиске. +// +// * ВариантПредставленияПериода - ПеречислениеСсылка.ВариантыПредставленияПериода - определяет вариант +// представления периода на форме отчета. +// +// * ВариантПериода - ПеречислениеСсылка.ВариантыПериода - определяет вариант формы выбора периода. +// // * СкрытьКомандыРассылки - Булево - флаг, позволяющий скрыть команды рассылок, у тех отчетов, // для которых рассылка не имеет смысла. // Истина - команды рассылок будут скрыты, @@ -354,6 +361,9 @@ Настройки.Вставить("РазрешеноРедактироватьСхему", Ложь); Настройки.Вставить("РазрешеноВосстанавливатьСтандартнуюСхему", Ложь); Настройки.Вставить("ЗагрузитьНастройкиПриИзмененииПараметров", Новый Массив); + Настройки.Вставить("ПоляПоиска", Новый Массив); + Настройки.Вставить("ВариантПредставленияПериода", ПредопределенноеЗначение("Перечисление.ВариантыПредставленияПериода.Стандартный")); + Настройки.Вставить("ВариантПериода", ПредопределенноеЗначение("Перечисление.ВариантыПериода.Стандартный")); Печать = Новый Структура; Печать.Вставить("ПолеСверху", 10); @@ -602,7 +612,7 @@ // элементы которых необходимо отобрать по определенным критериям. // Отбор - Структура: // * Использование - Булево - использование настройки. -// * Значение - * - значение настройки. +// * Значение - Неопределено - значение настройки. // ЭлементыНастроек - Неопределено // - КоллекцияЭлементовПользовательскихНастроекКомпоновкиДанных // - КоллекцияЭлементовОтбораКомпоновкиДанных - элементы настроек, diff --git a/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl index fbcffdb9a..4fa255ca8 100644 --- a/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl @@ -8,16 +8,42 @@ #Область ПрограммныйИнтерфейс -// В данной процедуре следует описать дополнительные зависимости объектов метаданных -// конфигурации, которые будут использоваться для связи настроек отчетов. +// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы. +// См. "ФормаКлиентскогоПриложения.ПриСозданииНаСервере" в синтакс-помощнике и ОтчетыКлиентПереопределяемый.ОбработчикКоманды. // // Параметры: -// СвязиОбъектовМетаданных - ТаблицаЗначений: -// * ПодчиненныйРеквизит - Строка - имя реквизита подчиненного объекта метаданных. -// * ПодчиненныйТип - Тип - тип подчиненного объекта метаданных. -// * ВедущийТип - Тип - тип ведущего объекта метаданных. +// Форма - ФормаКлиентскогоПриложения - форма отчета. +// - РасширениеУправляемойФормыДляОтчета +// - Структура: +// * НастройкиОтчета - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию +// Отказ - Булево - признак отказа от создания формы. +// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. // -Процедура ДополнитьСвязиОбъектовМетаданных(СвязиОбъектовМетаданных) Экспорт +// Пример: +// //Добавление команды с обработчиком в ОтчетыКлиентПереопределяемый.ОбработчикКоманды: +// Команда = ФормаОтчета.Команды.Добавить("МояОсобеннаяКоманда"); +// Команда.Действие = "Подключаемый_Команда"; +// Команда.Заголовок = НСтр("ru = 'Моя команда...'"); +// +// Кнопка = ФормаОтчета.Элементы.Добавить(Команда.Имя, Тип("КнопкаФормы"), ФормаОтчета.Элементы.<ИмяПодменю>); +// Кнопка.ИмяКоманды = Команда.Имя; +// +// ФормаОтчета.ПостоянныеКоманды.Добавить(КомандаСоздать.Имя); +// +Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт + + + +КонецПроцедуры + +// Вызывается в обработчике одноименного события формы отчета и формы настройки отчета. +// См. "Расширение управляемой формы для отчета.ПередЗагрузкойВариантаНаСервере" в синтакс-помощнике. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма отчета или настроек отчета. +// НовыеНастройкиКД - НастройкиКомпоновкиДанных - настройки для загрузки в компоновщик настроек. +// +Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт @@ -67,52 +93,8 @@ КонецПроцедуры -// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы. -// См. "ФормаКлиентскогоПриложения.ПриСозданииНаСервере" в синтакс-помощнике и ОтчетыКлиентПереопределяемый.ОбработчикКоманды. -// -// Параметры: -// Форма - ФормаКлиентскогоПриложения - форма отчета. -// - РасширениеУправляемойФормыДляОтчета -// - Структура: -// * НастройкиОтчета - см. ВариантыОтчетов.НастройкиФормыОтчета -// Отказ - Булево - признак отказа от создания формы. -// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. -// -// Пример: -// //Добавление команды с обработчиком в ОтчетыКлиентПереопределяемый.ОбработчикКоманды: -// Команда = ФормаОтчета.Команды.Добавить("МояОсобеннаяКоманда"); -// Команда.Действие = "Подключаемый_Команда"; -// Команда.Заголовок = НСтр("ru = 'Моя команда...'"); -// -// Кнопка = ФормаОтчета.Элементы.Добавить(Команда.Имя, Тип("КнопкаФормы"), ФормаОтчета.Элементы.<ИмяПодменю>); -// Кнопка.ИмяКоманды = Команда.Имя; -// -// ФормаОтчета.ПостоянныеКоманды.Добавить(КомандаСоздать.Имя); -// -Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт - - - -КонецПроцедуры - -// Вызывается в обработчике одноименного события формы отчета и формы настройки отчета. -// См. "Расширение управляемой формы для отчета.ПередЗагрузкойВариантаНаСервере" в синтакс-помощнике. -// -// Параметры: -// Форма - ФормаКлиентскогоПриложения - форма отчета или настроек отчета. -// НовыеНастройкиКД - НастройкиКомпоновкиДанных - настройки для загрузки в компоновщик настроек. -// -Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт - - - -КонецПроцедуры - -// Вызывается при инициализации свойств результата отчета. -// Если основные поля определены, то при вызове команд контекстной настройки -// (Вставить поле слева, Вставить поле справа, Вставить группировку ниже, -// Вставить группировку выше), они будут выводиться в подменю -// для выбора полей вставки. +// Позволяет задать список часто используемых полей, которые будут выводиться в подменю для команд контекстного меню +// "Вставить поле слева", "Вставить группировку ниже" и т.п. // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма отчета. @@ -122,6 +104,21 @@ +КонецПроцедуры + +// В данной процедуре следует описать дополнительные зависимости объектов метаданных +// конфигурации, которые будут использоваться для связи настроек отчетов. +// +// Параметры: +// СвязиОбъектовМетаданных - ТаблицаЗначений: +// * ПодчиненныйРеквизит - Строка - имя реквизита подчиненного объекта метаданных. +// * ПодчиненныйТип - Тип - тип подчиненного объекта метаданных. +// * ВедущийТип - Тип - тип ведущего объекта метаданных. +// +Процедура ДополнитьСвязиОбъектовМетаданных(СвязиОбъектовМетаданных) Экспорт + + + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl index bb33fe498..69f72566f 100644 --- a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl @@ -19,7 +19,20 @@ // - ВнешнийОтчет - СКД-отчет, которому необходимо установить схему. // Контекст - ФормаКлиентскогоПриложения - форма отчета или форма настройки отчета. // Передается "как есть" из одноименного параметра события ПередЗагрузкойНастроекВКомпоновщик. -// - ВариантыОтчетов.ПодключитьОтчетИЗагрузитьНастройки. +// - Структура: +// * СсылкаОтчета - Произвольный - ссылка отчета. +// * ПолноеИмя - Строка - полное имя отчета. +// * Метаданные - ОбъектМетаданных - метаданные отчета. +// * Объект - ОтчетОбъект +// - ВнешнийОтчет - объект отчета: +// ** КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных - настройки отчета. +// ** СхемаКомпоновкиДанных - СхемаКомпоновкиДанных - схема отчета. +// * КлючВарианта - Строка - имя предопределенного или идентификатор пользовательского варианта отчета. +// * АдресСхемы - Строка - адрес временного хранилища, по которому размещена схема отчета. +// * Успех - Булево - Истина, если удалось подключить отчет. +// * ТекстОшибки - Строка - текст ошибки. +// +// // Схема - СхемаКомпоновкиДанных - схема, которую необходимо установить отчету. // КлючСхемы - Строка - идентификатор новой схемы, который будет записан в дополнительные свойства // пользовательских настроек. @@ -72,10 +85,10 @@ // Параметры: // КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных - компоновщик настроек, который необходимо инициализировать. // Схема - СхемаКомпоновкиДанных -// - URL - см. синтакс-помощник: ИсточникДоступныхНастроекКомпоновкиДанных. +// - Строка. // Отчет - ОтчетОбъект // - Неопределено - отчет, чей компоновщик инициализируется. -// ВариантОтчета - СправочникСсылка.ВариантыОтчета +// ВариантОтчета - СправочникСсылка.ВариантыОтчетов // - Неопределено - хранилище варианта отчета. // Процедура ИнициализироватьКомпоновщикНастроек(КомпоновщикНастроек, Схема, Отчет = Неопределено, ВариантОтчета = Неопределено) Экспорт @@ -321,12 +334,29 @@ // Параметры: // ТипФормы - ТипФормыОтчета // КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных -// ДополнительныеПараметры - см. ВариантыОтчетов.НастройкиФормыОтчета +// ДополнительныеПараметры - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию // // Возвращаемое значение: // Структура: // * Группы - см. СвойстваГруппыЭлементовФормы -// * Поля - см. ПоляЭлементовФормыНастроек +// * Поля - ТаблицаЗначений: +// ** ИндексНастройки - Число +// ** ИдентификаторНастройки - Строка +// ** Настройки - НастройкиКомпоновкиДанных +// ** ЭлементНастройки - ЭлементОтбораКомпоновкиДанных +// - ЗначениеПараметраНастроекКомпоновкиДанных +// - ВыбранноеПолеКомпоновкиДанных +// - ЭлементПорядкаКомпоновкиДанных +// - ЭлементУсловногоОформления +// ** ОписаниеНастройки - ДоступноеПолеОтбораКомпоновкиДанных +// - ДоступныеПараметрыКомпоновкиДанных +// - ДоступноеПолеКомпоновкиДанных +// ** Представление - Строка +// ** ИдентификаторГруппы - Строка +// ** ПоложениеЗаголовка - ПоложениеЗаголовкаЭлементаФормы +// ** РастягиватьПоГоризонтали - Булево +// - Неопределено +// ** Ширина - Число // Функция СвойстваЭлементовФормыНастроек(ТипФормы, КомпоновщикНастроек, ДополнительныеПараметры) Экспорт #Область ПодготовкаСтруктуры @@ -453,6 +483,8 @@ // - Неопределено // Процедура ОбновитьЭлементыФормыНастроек(Форма, УзелИерархииЭлементов, ПараметрыОбновления = Неопределено) Экспорт + ПередОбновлениемЭлементовФормыНастроек(Форма, ПараметрыОбновления); + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда Форма.СоздатьЭлементыФормыПользовательскихНастроек(УзелИерархииЭлементов); Возврат; @@ -798,21 +830,26 @@ Или СтруктураОтборов.Количество() = 0 Тогда Возврат; КонецЕсли; + ПараметрыКД = НастройкиКД.ПараметрыДанных; ОтборыКД = НастройкиКД.Отбор; Недоступный = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; Для Каждого КлючИЗначение Из СтруктураОтборов Цикл Имя = КлючИЗначение.Ключ; Значение = КлючИЗначение.Значение; + Если ТипЗнч(Значение) = Тип("ФиксированныйМассив") Тогда Значение = Новый Массив(Значение); КонецЕсли; + Если ТипЗнч(Значение) = Тип("Массив") Тогда Список = Новый СписокЗначений; Список.ЗагрузитьЗначения(Значение); Значение = Список; КонецЕсли; + ПараметрКД = ПараметрыКД.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Имя)); + Если ТипЗнч(ПараметрКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда ПараметрКД.ИдентификаторПользовательскойНастройки = ""; ПараметрКД.Использование = Истина; @@ -820,6 +857,7 @@ ПараметрКД.Значение = Значение; Продолжить; КонецЕсли; + Если ТипЗнч(Значение) = Тип("Структура") Тогда ВидСравненияКД = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( Значение, "ВидСравнения", ВидСравненияКомпоновкиДанных.Равно); @@ -830,6 +868,7 @@ ВидСравненияКД = ВидСравненияКомпоновкиДанных.Равно; КонецЕсли; ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ОтборыКД, Имя, Значение, ВидСравненияКД, , Истина, Недоступный, ""); + КонецЦикла; КонецПроцедуры @@ -1001,6 +1040,22 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление элементов формы пользовательских настроек +Процедура ПередОбновлениемЭлементовФормыНастроек(Форма, ПараметрыОбновления) + + Если ТипЗнч(ПараметрыОбновления) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + КомпоновщикНастроек = Форма.Отчет.КомпоновщикНастроек; + + ИмяСобытия = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыОбновления, "ИмяСобытия"); + + Если ИмяСобытия = "НастройкиПоУмолчанию" Тогда + КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ПорядокЭлементовНастроек", Новый Соответствие); + КонецЕсли; + +КонецПроцедуры + // Возвращаемое значение: // ТаблицаЗначений: // * ИндексНастройки - Число @@ -1053,7 +1108,7 @@ // Возвращаемое значение: // см. ВидыСведений // -Функция СведенияОПользовательскихНастройках(Настройки) +Функция СведенияОПользовательскихНастройках(Настройки) Экспорт Сведения = Новый Соответствие; ПолучитьСведенияОГруппировке(Настройки, Сведения, Настройки.ДополнительныеСвойства); @@ -1276,10 +1331,6 @@ "ИдентификаторыСвойствНастроек", ИдентификаторыСвойствПоУмолчанию); - Если ИдентификаторыСвойств.Количество() = 0 Тогда - Возврат ОбщегоНазначения.СкопироватьРекурсивно(ИдентификаторыСвойствПоУмолчанию); - КонецЕсли; - Возврат ОбщегоНазначения.СкопироватьРекурсивно(ИдентификаторыСвойств); КонецФункции @@ -1397,11 +1448,13 @@ КонецПроцедуры Процедура ПерегруппироватьЭлементыФормыНастроек(Форма, Знач УзелИерархииЭлементов, СвойстваЭлементов, ИменаРеквизитов, ВидыСтилизованныхЭлементов) + ЭтоОсновнаяФорма = (Форма.ТипФормыОтчета = ТипФормыОтчета.Основная); + ОписаниеНастроек = СвойстваЭлементов.Поля.Скопировать(, "ИндексНастройки, ИдентификаторНастройки, Настройки, ЭлементНастройки, ОписаниеНастройки"); ЭлементыНастроек = ЭлементыФормыНастроек(Форма, ОписаниеНастроек, ИменаРеквизитов); - УстановитьСвойстваЭлементовФормыНастроек(Форма, ЭлементыНастроек, СвойстваЭлементов); + УстановитьСвойстваЭлементовФормыНастроек(Форма, ЭлементыНастроек, СвойстваЭлементов, ЭтоОсновнаяФорма); Если Форма.ТипФормыОтчета <> ТипФормыОтчета.Настройка Тогда ЭлементыНастроек.ЗаполнитьЗначения(Ложь, "ЭтоСписок"); @@ -1441,7 +1494,7 @@ Группа = ?(ИдентификаторыГрупп.Количество() = 1, УзелИерархииЭлементов, Элементы.Найти(ИмяГруппы)); Если Группа = Неопределено Тогда - Группа = ГруппаЭлементовФормыНастроек(Элементы, УзелИерархииЭлементов, ИмяГруппы); + Группа = ГруппаЭлементовФормыНастроек(Элементы, УзелИерархииЭлементов, ИмяГруппы, ЭтоОсновнаяФорма); Группа.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Строка %1'"), НомерГруппы); @@ -1453,11 +1506,59 @@ СвойстваПолейГруппы = СвойстваЭлементов.Поля.НайтиСтроки(ПоискПолейГруппы); ЭлементыНастроекГруппы = ЭлементыНастроекГруппы(ЭлементыНастроек, СвойстваПолейГруппы); - ПодготовитьЭлементыФормыНастроекКРаспределению(ЭлементыНастроекГруппы, СвойстваГруппы.Группировка); - РаспределитьЭлементыФормыНастроек(Форма.Элементы, Группа, ЭлементыНастроекГруппы); + ДополнительныеСвойства = Форма.Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства; + ПодготовитьЭлементыФормыНастроекКРаспределению( + ЭлементыНастроекГруппы, СвойстваГруппы.Группировка, ЭтоОсновнаяФорма, ДополнительныеСвойства); + + РаспределитьЭлементыФормыНастроек(Форма.Элементы, Группа, ЭлементыНастроекГруппы, ЭтоОсновнаяФорма); КонецЦикла; ВывестиСтилизованныеЭлементыФормыНастроек(Форма, ЭлементыНастроек, ОписаниеНастроек, ИменаРеквизитов, ВидыСтилизованныхЭлементов); + ДобавитьОтступКолонок(Элементы, ЭлементыНастроек, УзелИерархииЭлементов, ЭтоОсновнаяФорма); +КонецПроцедуры + +Процедура ДобавитьОтступКолонок(Элементы, ЭлементыНастроек, УзелИерархииЭлементов, ЭтоОсновнаяФорма) + + Если Не ЭтоОсновнаяФорма Тогда + Возврат; + КонецЕсли; + + Статистика = ЭлементыНастроек.Скопировать(); + Статистика.Свернуть("ИндексНастройки"); + + Если Статистика.Количество() < 2 Тогда + Возврат; + КонецЕсли; + + ПодчиненныеЭлементы = УзелИерархииЭлементов.ПодчиненныеЭлементы; + КоличествоКолонок = ПодчиненныеЭлементы.Количество(); + + Для НомерКолонки = 2 По КоличествоКолонок Цикл + + Колонка = ПодчиненныеЭлементы[НомерКолонки - 1]; + + ИмяГруппы = УзелИерархииЭлементов.Имя + "ПоляКолонки" + НомерКолонки; + ГруппаПолейКолонки = ГруппаЭлементовФормыНастроек(Элементы, УзелИерархииЭлементов, ИмяГруппы, ЭтоОсновнаяФорма); + ГруппаПолейКолонки.Группировка = Колонка.Группировка; + ГруппаПолейКолонки.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поля колонки %1'"), НомерКолонки); + + ПоляКолонки = Колонка.ПодчиненныеЭлементы; + КоличествоПолейКолонки = ПоляКолонки.Количество(); + + Для НомерПоля = 1 По КоличествоПолейКолонки Цикл + Элементы.Переместить(ПоляКолонки[0], ГруппаПолейКолонки); + КонецЦикла; + + Колонка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + + ИмяОтступа = УзелИерархииЭлементов.Имя + "ОтступПолейКолонки" + НомерКолонки; + Отступ = Элементы.Добавить(ИмяОтступа, Тип("ДекорацияФормы"), Колонка); + Отступ.Заголовок = " "; + + Элементы.Переместить(ГруппаПолейКолонки, Колонка); + + КонецЦикла; + КонецПроцедуры // Поиск созданных системой элементов формы настроек и их подготовка к распределению @@ -1473,7 +1574,7 @@ НеполныеЭлементы = СводныеСведения.НайтиСтроки(Новый Структура("КонтрольнаяСумма", 1)); Поиск = Новый Структура("ИндексНастройки, СвойствоНастройки"); - ОбщиеСвойства = "ЭтоПериод, ЭтоФлажок, ЭтоСписок, ТипЗначения, ФормаВыбора, ДоступныеЗначения"; + ОбщиеСвойства = "ЭтоПериод, ЭтоФлажок, ЭтоСписок, ТипЗначения, ФормаВыбора, ДоступныеЗначения, ИдентификаторНастройки"; Для Каждого Запись Из НеполныеЭлементы Цикл Элемент = ЭлементыНастроек.Найти(Запись.ИндексНастройки, "ИндексНастройки"); @@ -1523,10 +1624,11 @@ ОписаниеПризнака = Новый ОписаниеТипов("Булево"); ЭлементыНастроек = Новый ТаблицаЗначений; - ЭлементыНастроек.Колонки.Добавить("Приоритет", ОписаниеЧисла); + ЭлементыНастроек.Колонки.Добавить("Порядок", ОписаниеЧисла); ЭлементыНастроек.Колонки.Добавить("ИндексНастройки", ОписаниеЧисла); ЭлементыНастроек.Колонки.Добавить("СвойствоНастройки", ОписаниеСтроки); ЭлементыНастроек.Колонки.Добавить("Поле"); + ЭлементыНастроек.Колонки.Добавить("ИдентификаторНастройки", ОписаниеСтроки); ЭлементыНастроек.Колонки.Добавить("ЭтоПериод", ОписаниеПризнака); ЭлементыНастроек.Колонки.Добавить("ЭтоСписок", ОписаниеПризнака); ЭлементыНастроек.Колонки.Добавить("ЭтоФлажок", ОписаниеПризнака); @@ -1573,6 +1675,7 @@ Запись.ИндексНастройки = ИндексНастройки; Запись.СвойствоНастройки = СвойствоНастройки; Запись.Поле = Элемент; + Запись.ИдентификаторНастройки = ОписаниеНастройкиЭлемента.ИдентификаторНастройки; ЭлементНастройки = ОписаниеНастройкиЭлемента.ЭлементНастройки; ОписаниеНастройки = ОписаниеНастройкиЭлемента.ОписаниеНастройки; @@ -1662,7 +1765,7 @@ // * Группы - Структура // * Поля - ТаблицаЗначений // -Процедура УстановитьСвойстваЭлементовФормыНастроек(Форма, ЭлементыНастроек, СвойстваЭлементов) +Процедура УстановитьСвойстваЭлементовФормыНастроек(Форма, ЭлементыНастроек, СвойстваЭлементов, ЭтоОсновнаяФорма) КомпоновщикНастроек = Форма.Отчет.КомпоновщикНастроек; #Область УстановкаСвойствЭлементовИспользование @@ -1688,7 +1791,7 @@ Поле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; Поле.УстановитьДействие("ПриИзменении", "Подключаемый_ЭлементНастройки_ПриИзменении"); ИначеЕсли ТипЗнч(Поле) = Тип("ДекорацияФормы") Тогда - Поле.Видимость = (СвойстваПоля.ПоложениеЗаголовка <> ПоложениеЗаголовкаЭлементаФормы.Нет); + Поле.Видимость = Истина; КонецЕсли; Если СтрДлина(Поле.Заголовок) > 40 Тогда @@ -1733,6 +1836,8 @@ #Область УстановкаСвойствЭлементовЗначение + СвязанныеЭлементы = ЭлементыНастроек.Скопировать(Новый Структура("СвойствоНастройки", "Использование")); + ПараметрыПодбора = Новый Соответствие; РасширенноеОписаниеТипов = Новый Соответствие; @@ -1740,22 +1845,48 @@ Для Каждого Элемент Из НайденныеЭлементы Цикл Поле = Элемент.Поле; // ПолеФормы + СвязанныйЭлемент = СвязанныеЭлементы.Найти(Элемент.ИндексНастройки, "ИндексНастройки"); + СвязанноеПоле = СвязанныйЭлемент.Поле; // ПолеФормы + Если ТипЗнч(Поле) = Тип("ДекорацияФормы") Тогда - Поле.Заголовок = " "; - - Поиск = Новый Структура("ИндексНастройки, СвойствоНастройки", Элемент.ИндексНастройки, "Использование"); - НайденныеСвязанныеЭлементы = ЭлементыНастроек.НайтиСтроки(Поиск); - - СвязанноеПоле = НайденныеСвязанныеЭлементы.Получить(0).Поле; // ПолеФормы Если СтрЗаканчиваетсяНа(СвязанноеПоле.Заголовок, ":") Тогда СвязанноеПоле.Заголовок = Лев(СвязанноеПоле.Заголовок, СтрДлина(СвязанноеПоле.Заголовок) - 1); КонецЕсли; + + Если ЭтоОсновнаяФорма Тогда + Поле.Заголовок = СвязанноеПоле.Заголовок; + СвязанноеПоле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КонецЕсли; + + Если Не ЭтоОсновнаяФорма + Или Элемент.ЭтоЗначениеКакФлажок Тогда + + Поле.Заголовок = " "; + КонецЕсли; Иначе // Поле ввода. СвойстваПоля = СвойстваЭлементов.Поля.Найти(Элемент.ИндексНастройки, "ИндексНастройки"); ЗаполнитьЗначенияСвойств(Поле, СвойстваПоля,, "ПоложениеЗаголовка"); + Если ЭтоОсновнаяФорма Тогда + Если СтрЗаканчиваетсяНа(СвязанноеПоле.Заголовок, ":") Тогда + Заголовок = Лев(СвязанноеПоле.Заголовок, СтрДлина(СвязанноеПоле.Заголовок) - 1); + Иначе + Заголовок = СвязанноеПоле.Заголовок; + КонецЕсли; + + Если ТипЗнч(СвязанноеПоле) = Тип("ДекорацияФормы") Тогда + СвязанноеПоле.Заголовок = " "; + Иначе + СвязанноеПоле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + СвязанноеПоле.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Право; + КонецЕсли; + + Поле.ПодсказкаВвода = Заголовок; + Поле.Подсказка = Поле.ПодсказкаВвода; + КонецЕсли; + Если Элемент.ЭтоФлажок Тогда - Элемент.Поле.Видимость = Ложь; + Поле.Видимость = Ложь; Продолжить; КонецЕсли; @@ -1773,6 +1904,12 @@ Поле.СписокВыбора, Элемент.ДоступныеЗначения, Ложь, Истина); Поле.РежимВыбораИзСписка = Не Элемент.ЭтоСписок И Результат <> Неопределено И Результат.Всего > 0; + Если Поле.РастягиватьПоГоризонтали = Неопределено Тогда + Поле.РастягиватьПоГоризонтали = Истина; + Поле.АвтоМаксимальнаяШирина = Ложь; + Поле.МаксимальнаяШирина = 40; + КонецЕсли; + Если Элемент.ТипЗначения = Неопределено Тогда Продолжить; КонецЕсли; @@ -1787,12 +1924,6 @@ Поле.ВысотаЗаголовка = 2; КонецЕсли; - Если Поле.РастягиватьПоГоризонтали = Неопределено Тогда - Поле.РастягиватьПоГоризонтали = Истина; - Поле.АвтоМаксимальнаяШирина = Ложь; - Поле.МаксимальнаяШирина = 40; - КонецЕсли; - Если РасширенноеОписаниеТипа.КоличествоТипов = 1 Тогда Если РасширенноеОписаниеТипа.СодержитТипЧисло Тогда Поле.КнопкаВыбора = (Поле.СписокВыбора.Количество() = 0); @@ -1861,37 +1992,28 @@ // Распределение элементов формы настроек в иерархии -Процедура ПодготовитьЭлементыФормыНастроекКРаспределению(ЭлементыНастроек, Группировка) +Процедура ПодготовитьЭлементыФормыНастроекКРаспределению(ЭлементыНастроек, Группировка, ЭтоОсновнаяФорма, ДополнительныеСвойства) #Область ПередПодготовкой Статистика = ЭлементыНастроек.Скопировать(); Статистика.Свернуть("ИндексНастройки"); - КоличествоКолонок = 1; + КоличествоКолонок = 1; Если Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно Тогда - КоличествоКолонок = Мин(2, Статистика.Количество()); + КоличествоКолонок = Мин(?(ЭтоОсновнаяФорма, 3, 2), Статистика.Количество()); ИначеЕсли Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда Тогда КоличествоКолонок = Статистика.Количество(); КонецЕсли; КоличествоКолонок = Макс(1, КоличествоКолонок); - #КонецОбласти - - #Область УстановкаПриоритета - - НайденныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ЭтоПериод", Истина)); - Для Каждого Элемент Из НайденныеЭлементы Цикл - Элемент.Приоритет = -1; - КонецЦикла; - - ЭлементыНастроек.Сортировать("Приоритет, ИндексНастройки"); + УпорядочитьЭлементыФормыНастроек(ЭлементыНастроек, ДополнительныеСвойства); #КонецОбласти #Область УстановкаНомеровКолонок Статистика = ЭлементыНастроек.Скопировать(); - Статистика.Свернуть("Приоритет, ИндексНастройки"); + Статистика.Свернуть("Порядок, ИндексНастройки"); КоличествоЭлементов = Статистика.Количество(); Индекс = 0; @@ -1899,7 +2021,7 @@ Шаг = КоличествоЭлементов / КоличествоКолонок; ГраницаРазрыва = ?(КоличествоЭлементов % КоличествоКолонок = 0, Шаг - 1, Цел(Шаг)); - Шаг = ?(ГраницаРазрыва = 0, 1, Цел(Шаг)); + Шаг = ?(ГраницаРазрыва = 0, 1, Окр(Шаг)); Поиск = Новый Структура("ИндексНастройки"); Для НомерКолонки = 1 По КоличествоКолонок Цикл @@ -1960,6 +2082,75 @@ #КонецОбласти КонецПроцедуры +Процедура УпорядочитьЭлементыФормыНастроек(ЭлементыНастроек, ДополнительныеСвойства) + + ПорядокЭлементовНастроек = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + ДополнительныеСвойства, "ПорядокЭлементовНастроек", Новый Соответствие); + + Поиск = Новый Структура("ИдентификаторНастройки"); + + Если ПорядокЭлементовНастроек.Количество() = 0 Тогда + + НайденныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ЭтоПериод", Истина)); + + Для Каждого Элемент Из НайденныеЭлементы Цикл + Элемент.Порядок = -1; + КонецЦикла; + + Порядок = 0; + + Иначе + + Для Каждого ПорядокЭлемента Из ПорядокЭлементовНастроек Цикл + + Поиск.ИдентификаторНастройки = ПорядокЭлемента.Ключ; + НайденныеЭлементы = ЭлементыНастроек.НайтиСтроки(Поиск); + + Для Каждого Элемент Из НайденныеЭлементы Цикл + Элемент.Порядок = ПорядокЭлемента.Значение; + КонецЦикла; + + КонецЦикла; + + ИндексЭлементовНастроек = ЭлементыНастроек.Скопировать(); + ИндексЭлементовНастроек.Свернуть("Порядок, ИдентификаторНастройки"); + ИндексЭлементовНастроек.Сортировать("Порядок"); + + Граница = ИндексЭлементовНастроек.Количество() - 1; + Порядок = ?(Граница >= 0, ИндексЭлементовНастроек[Граница].Порядок, 0); + + КонецЕсли; + + Для Каждого Элемент Из ЭлементыНастроек Цикл + + Если Элемент.Порядок <> 0 Тогда + Продолжить; + КонецЕсли; + + Порядок = Порядок + 1; + + Поиск.ИдентификаторНастройки = Элемент.ИдентификаторНастройки; + СвязанныеЭлементы = ЭлементыНастроек.НайтиСтроки(Поиск); + + Для Каждого СвязанныйЭлемент Из СвязанныеЭлементы Цикл + СвязанныйЭлемент.Порядок = Порядок; + КонецЦикла; + + КонецЦикла; + + ЭлементыНастроек.Сортировать("Порядок, ИндексНастройки"); + + АктуальныйПорядокЭлементовНастроек = ЭлементыНастроек.Скопировать(); + АктуальныйПорядокЭлементовНастроек.Свернуть("Порядок, ИдентификаторНастройки"); + + Для Каждого ПорядокЭлемента Из АктуальныйПорядокЭлементовНастроек Цикл + ПорядокЭлементовНастроек.Вставить(ПорядокЭлемента.ИдентификаторНастройки, ПорядокЭлемента.Порядок); + КонецЦикла; + + ДополнительныеСвойства.Вставить("ПорядокЭлементовНастроек", ПорядокЭлементовНастроек); + +КонецПроцедуры + Процедура РаспределитьСпискиПоКолонкамПропорционально(ЭлементыНастроек, КоличествоКолонок) Если КоличествоКолонок <> 2 Или ЭлементыНастроек.Найти(Истина, "ЭтоСписок") = Неопределено Тогда @@ -2017,7 +2208,7 @@ КонецЦикла; КонецПроцедуры -Процедура РаспределитьЭлементыФормыНастроек(Элементы, Знач Группа, ЭлементыНастроек) +Процедура РаспределитьЭлементыФормыНастроек(Элементы, Знач Группа, ЭлементыНастроек, ЭтоОсновнаяФорма) КоличествоКолонок = 0; Если ЭлементыНастроек.Количество() > 0 Тогда КоличествоКолонок = ЭлементыНастроек[ЭлементыНастроек.Количество() - 1].НомерКолонки; @@ -2033,7 +2224,7 @@ ИмяКолонки = Группа.Имя + "Колонка" + НомерКолонки; Колонка = ?(КоличествоКолонок = 1, Группа, Элементы.Найти(ИмяКолонки)); Если Колонка = Неопределено Тогда - Колонка = ГруппаЭлементовФормыНастроек(Элементы, Группа, ИмяКолонки); + Колонка = ГруппаЭлементовФормыНастроек(Элементы, Группа, ИмяКолонки, ЭтоОсновнаяФорма); Колонка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Колонка %1'"), НомерКолонки); @@ -2042,26 +2233,30 @@ КонецЕсли; КонецЕсли; + Если НомерКолонки > 1 Тогда + Колонка.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; + КонецЕсли; + Если ТолькоПоляВвода Тогда - РаспределитьЭлементыФормыНастроекПоСвойствам(Элементы, Колонка, ЭлементыНастроек, НомерКолонки); + РаспределитьЭлементыФормыНастроекПоСвойствам(Элементы, Колонка, ЭлементыНастроек, НомерКолонки, ЭтоОсновнаяФорма); Продолжить; КонецЕсли; НомерСтроки = 0; Для Каждого Признаки Из ПризнакиЭлементов Цикл НомерСтроки = НомерСтроки + 1; - Родитель = ИерархияЭлементовФормыНастроек(Элементы, Колонка, Признаки, НомерСтроки, НомерКолонки); + Родитель = ИерархияЭлементовФормыНастроек(Элементы, Колонка, Признаки, НомерСтроки, НомерКолонки, ЭтоОсновнаяФорма); - РаспределитьЭлементыФормыНастроекПоСвойствам(Элементы, Родитель, ЭлементыНастроек, НомерКолонки, Признаки.НомерГруппы); + РаспределитьЭлементыФормыНастроекПоСвойствам(Элементы, Родитель, ЭлементыНастроек, НомерКолонки, ЭтоОсновнаяФорма, Признаки.НомерГруппы); КонецЦикла; КонецЦикла; КонецПроцедуры -Процедура РаспределитьЭлементыФормыНастроекПоСвойствам(Элементы, Родитель, ЭлементыНастроек, НомерКолонки, НомерГруппы = Неопределено) +Процедура РаспределитьЭлементыФормыНастроекПоСвойствам(Элементы, Родитель, ЭлементыНастроек, НомерКолонки, ЭтоОсновнаяФорма, НомерГруппы = Неопределено) СвойстваНастроек = СтрРазделить("Использование, ВидСравнения, Значение", ", ", Ложь); Для Каждого СвойствоНастройки Из СвойстваНастроек Цикл ИмяГруппы = Родитель.Имя + СвойствоНастройки; - Группа = ГруппаЭлементовФормыНастроек(Элементы, Родитель, ИмяГруппы); + Группа = ГруппаЭлементовФормыНастроек(Элементы, Родитель, ИмяГруппы, ЭтоОсновнаяФорма); Группа.Заголовок = СвойствоНастройки; Группа.Видимость = (СвойствоНастройки <> "ВидСравнения"); @@ -2078,9 +2273,9 @@ КонецЦикла; КонецПроцедуры -Функция ИерархияЭлементовФормыНастроек(Элементы, Родитель, Признаки, НомерСтроки, НомерКолонки) +Функция ИерархияЭлементовФормыНастроек(Элементы, Родитель, Признаки, НомерСтроки, НомерКолонки, ЭтоОсновнаяФорма) ИмяСтроки = Родитель.Имя + "Строка" + НомерСтроки; - Строка = ГруппаЭлементовФормыНастроек(Элементы, Родитель, ИмяСтроки); + Строка = ГруппаЭлементовФормыНастроек(Элементы, Родитель, ИмяСтроки, ЭтоОсновнаяФорма); Строка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Строка %1.%2'"), НомерКолонки, НомерСтроки); @@ -2093,7 +2288,7 @@ КонецЕсли; ИмяКолонки = Строка.Имя + "Колонка1"; - Колонка = ГруппаЭлементовФормыНастроек(Элементы, Строка, ИмяКолонки); + Колонка = ГруппаЭлементовФормыНастроек(Элементы, Строка, ИмяКолонки, ЭтоОсновнаяФорма); Колонка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Колонка %1.%2.1'"), НомерКолонки, НомерСтроки); @@ -2102,7 +2297,7 @@ Возврат Колонка; КонецФункции -Функция ГруппаЭлементовФормыНастроек(Элементы, Родитель, ИмяГруппы) +Функция ГруппаЭлементовФормыНастроек(Элементы, Родитель, ИмяГруппы, ЭтоОсновнаяФорма = Ложь) Группа = Элементы.Найти(ИмяГруппы); Если Группа <> Неопределено Тогда Возврат Группа; @@ -2114,6 +2309,10 @@ Группа.Отображение = ОтображениеОбычнойГруппы.Нет; Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + Если ЭтоОсновнаяФорма Тогда + Группа.Объединенная = Ложь; + КонецЕсли; + Возврат Группа; КонецФункции @@ -2229,13 +2428,16 @@ Элементы = Форма.Элементы; ИменаРеквизитовПредопределенных = ИменаРеквизитов.Предопределенных.Период; + ВариантПредставления = Форма.НастройкиОтчета.ВариантПредставленияПериода; + ЭтоСтандартноеПредставление = (ВариантПредставления = Перечисления.ВариантыПредставленияПериода.Стандартный); + Для Каждого Элемент Из НайденныеЭлементы Цикл СвязанныеЭлементы = ЭлементыНастроек.НайтиСтроки(Новый Структура("ИндексНастройки", Элемент.ИндексНастройки)); Для Каждого СвязанныйЭлемент Из СвязанныеЭлементы Цикл СвязанныйЭлемент.Поле.Видимость = (СвязанныйЭлемент.СвойствоНастройки = "Использование"); КонецЦикла; - ИнициализироватьПериод(Форма, Элемент.ИндексНастройки); + Период = ИнициализироватьПериод(Форма, Элемент.ИндексНастройки); Поле = Элемент.Поле; Родитель = Поле.Родитель; // ГруппаФормы @@ -2251,13 +2453,38 @@ НайденныйЭлемент = Элементы.Найти(ИмяРеквизита); Элементы.Переместить(НайденныйЭлемент, Родитель, СледующийЭлемент); НайденныйЭлемент.Видимость = Истина; + + Для Каждого ЭлементПериода Из НайденныйЭлемент.ПодчиненныеЭлементы Цикл + ТипЭлементаПериода = ТипЗнч(ЭлементПериода); + + Если ТипЭлементаПериода = Тип("ПолеФормы") Тогда + ЭлементПериода.Заголовок = ЗаголовокЭлементаПериода(ЭлементПериода.Имя, Поле.Заголовок); + ЭлементПериода.Подсказка = ЭлементПериода.Заголовок; + ЭлементПериода.ПодсказкаВвода = ЭлементПериода.Заголовок; + КонецЕсли; + + Если ЭтоСтандартноеПредставление Тогда + ЭлементПериода.Видимость = ТипЭлементаПериода <> Тип("КнопкаФормы") + Или (ТипЭлементаПериода = Тип("КнопкаФормы") + И СтрНачинаетсяС(ЭлементПериода.ИмяКоманды, "ВыбратьПериод")); + Иначе + ЭлементПериода.Видимость = (ТипЭлементаПериода = Тип("КнопкаФормы") + Или ТипЭлементаПериода = Тип("ГруппаФормы")); + КонецЕсли; + + УстановитьСвойстваКнопкиВыбораПериода(ЭлементПериода, Период, ЭтоСтандартноеПредставление); + + КонецЦикла; + Продолжить; КонецЕсли; ШаблонИмениЭлемента = СтрЗаменить(Поле.Имя, "Значение", "%1%2"); Группа = ГруппаЭлементовПериода(Элементы, Родитель, СледующийЭлемент, ШаблонИмениЭлемента, Поле.Заголовок); - ДобавитьЭлементПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаНачала", Поле.Заголовок); + + ДобавитьКомандуСдвигаПериода(Форма, Группа, ШаблонИмениЭлемента, ЭтоСтандартноеПредставление, -1); + ДобавитьПолеПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаНачала", Поле.Заголовок, ЭтоСтандартноеПредставление); ИмяЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениЭлемента, "Разделитель"); Разделитель = Элементы.Найти(ИмяЭлемента); @@ -2266,9 +2493,11 @@ КонецЕсли; Разделитель.Вид = ВидДекорацииФормы.Надпись; Разделитель.Заголовок = Символ(8211); // Среднее тире (en dash). + Разделитель.Видимость = ЭтоСтандартноеПредставление; - ДобавитьЭлементПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаОкончания", Поле.Заголовок); - ДобавитьКомандуВыбораПериода(Форма, Группа, ШаблонИмениЭлемента); + ДобавитьПолеПериода(Элементы, Группа, ШаблонИмениЭлемента, "ДатаОкончания", Поле.Заголовок, ЭтоСтандартноеПредставление); + ДобавитьКомандуВыбораПериода(Форма, Группа, ШаблонИмениЭлемента, Период, ЭтоСтандартноеПредставление); + ДобавитьКомандуСдвигаПериода(Форма, Группа, ШаблонИмениЭлемента, ЭтоСтандартноеПредставление); КонецЦикла; КонецПроцедуры @@ -2293,15 +2522,9 @@ Возврат Группа; КонецФункции -Процедура ДобавитьЭлементПериода(Элементы, Группа, ШаблонИмени, Свойство, ЗаголовокЭлементаНастройки) +Процедура ДобавитьПолеПериода(Элементы, Группа, ШаблонИмени, Свойство, ЗаголовокЭлементаНастройки, ЭтоСтандартноеПредставление) ИмяЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмени, "", Свойство); - ШаблонЗаголовка = НСтр("ru = '%1 (дата %2)'"); - Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонЗаголовка, - ЗаголовокЭлементаНастройки, - ?(СтрЗаканчиваетсяНа(Свойство, "Начала"), НСтр("ru = 'начала'"), НСтр("ru = 'окончания'"))); - Элемент = Элементы.Найти(ИмяЭлемента); Если Элемент = Неопределено Тогда Элемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Группа); @@ -2315,12 +2538,53 @@ Элемент.КнопкаОчистки = Ложь; Элемент.КнопкаРегулирования = Ложь; Элемент.РедактированиеТекста = Истина; - Элемент.Заголовок = Заголовок; + Элемент.Заголовок = ЗаголовокЭлементаПериода(Свойство, ЗаголовокЭлементаНастройки); + Элемент.Подсказка = Элемент.Заголовок; + Элемент.ПодсказкаВвода = Элемент.Заголовок; Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_Период_ПриИзменении"); + Элемент.Видимость = ЭтоСтандартноеПредставление; КонецПроцедуры -Процедура ДобавитьКомандуВыбораПериода(Форма, Группа, ШаблонИмени) +Функция ЗаголовокЭлементаПериода(Свойство, ЗаголовокЭлементаНастройки) + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (дата %2)'"), + ЗаголовокЭлементаНастройки, + ?(СтрЗаканчиваетсяНа(НРег(Свойство), "начала"), НСтр("ru = 'начала'"), НСтр("ru = 'окончания'"))); + +КонецФункции + +Процедура ДобавитьКомандуСдвигаПериода(Форма, Группа, ШаблонИмени, ЭтоСтандартноеПредставление, НаправлениеСдвига = 1) + ИмяЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонИмени, "", ?(НаправлениеСдвига > 0, "СдвинутьПериодВперед", "СдвинутьПериодНазад")); + + Команда = Форма.Команды.Найти(ИмяЭлемента); + Если Команда = Неопределено Тогда + Команда = Форма.Команды.Добавить(ИмяЭлемента); + КонецЕсли; + + Если НаправлениеСдвига > 0 Тогда + Команда.Действие = "Подключаемый_СдвинутьПериодВперед"; + Команда.Заголовок = ">"; + Команда.Подсказка = НСтр("ru = 'Сдвинуть вперед'"); + Иначе + Команда.Действие = "Подключаемый_СдвинутьПериодНазад"; + Команда.Заголовок = "<"; + Команда.Подсказка = НСтр("ru = 'Сдвинуть назад'"); + КонецЕсли; + + Кнопка = Форма.Элементы.Найти(ИмяЭлемента); + Если Кнопка = Неопределено Тогда + Кнопка = Форма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), Группа); + КонецЕсли; + Кнопка.ИмяКоманды = ИмяЭлемента; + Кнопка.ОтображениеФигуры = ОтображениеФигурыКнопки.ПриАктивности; + Кнопка.Шрифт = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт.Значение; + Кнопка.Видимость = Не ЭтоСтандартноеПредставление; +КонецПроцедуры + +Процедура ДобавитьКомандуВыбораПериода(Форма, Группа, ШаблонИмени, Период, ЭтоСтандартноеПредставление) ИмяЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмени, "", "ВыбратьПериод"); Команда = Форма.Команды.Найти(ИмяЭлемента); @@ -2333,11 +2597,42 @@ Команда.Отображение = ОтображениеКнопки.Картинка; Команда.Картинка = БиблиотекаКартинок.Выбрать; + ИмяГруппыКнопки = СтрЗаменить(ИмяЭлемента, "ВыбратьПериод", "ГруппаВыбратьПериод"); + ГруппаКнопки = ГруппаЭлементовФормыНастроек(Форма.Элементы, Группа, ИмяГруппыКнопки); + ГруппаКнопки.ГоризонтальноеПоложениеПодчиненных = ГоризонтальноеПоложениеЭлемента.Центр; + Кнопка = Форма.Элементы.Найти(ИмяЭлемента); Если Кнопка = Неопределено Тогда - Кнопка = Форма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), Группа); + Кнопка = Форма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), ГруппаКнопки); КонецЕсли; Кнопка.ИмяКоманды = ИмяЭлемента; + + УстановитьСвойстваКнопкиВыбораПериода(ГруппаКнопки, Период, ЭтоСтандартноеПредставление); +КонецПроцедуры + +Процедура УстановитьСвойстваКнопкиВыбораПериода(ЭлементПериода, Период, ЭтоСтандартноеПредставление) + Если ТипЗнч(ЭлементПериода) <> Тип("ГруппаФормы") + Или ЭлементПериода.ПодчиненныеЭлементы.Количество() = 0 + Или СтрНайти(ЭлементПериода.Имя, "ВыбратьПериод") = 0 Тогда + + Возврат; + КонецЕсли; + + Кнопка = ЭлементПериода.ПодчиненныеЭлементы[0]; + Кнопка.Заголовок = СтроковыеФункции.ПредставлениеПериодаВТексте(Период.ДатаНачала, Период.ДатаОкончания); + Кнопка.Шрифт = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт.Значение; + + Если ЭтоСтандартноеПредставление Тогда + ЭлементПериода.Ширина = 3; + + Кнопка.Отображение = ОтображениеКнопки.Картинка; + Кнопка.ОтображениеФигуры = ОтображениеФигурыКнопки.Авто; + Иначе + ЭлементПериода.Ширина = 15; + + Кнопка.Отображение = ОтображениеКнопки.Текст; + Кнопка.ОтображениеФигуры = ОтображениеФигурыКнопки.Нет; + КонецЕсли; КонецПроцедуры // Устанавливает значения свойствам стандартного периода: ДатаНачала, ДатаОкончания @@ -2349,17 +2644,24 @@ // * Отчет - ОтчетОбъект // Индекс - Число // -Процедура ИнициализироватьПериод(Форма, Индекс) +// Возвращаемое значение: +// СтандартныйПериод +// +Функция ИнициализироватьПериод(Форма, Индекс) ПользовательскиеНастройки = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки; ЭлементНастройки = ПользовательскиеНастройки.Элементы[Индекс]; Путь = Форма.ПутьКДаннымЭлементов.ПоИндексу[Индекс]; Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда - Форма[Путь] = ЭлементНастройки.Значение; + Период = ЭлементНастройки.Значение; Иначе // Элемент отбора. - Форма[Путь] = ЭлементНастройки.ПравоеЗначение; + Период = ЭлементНастройки.ПравоеЗначение; КонецЕсли; -КонецПроцедуры + + Форма[Путь] = Период; + + Возврат Период; +КонецФункции // Вывод списков элементов формы настроек diff --git a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl index 8ccc0ea6e..3a32495ea 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl @@ -232,14 +232,14 @@ // КлючеваяОперация - Строка - ключевая операция. // // Возвращаемое значение: -// ОписаниеЗамера - Соответствие: -// КлючеваяОперация - имя ключевой операции. -// ВремяНачала - время начала ключевой операции в миллисекундах. -// ВремяПоследнегоЗамера - время последнего замера ключевой операции в миллисекундах. -// ВесЗамера - количество данных, обработанных в ходе выполнения действий. -// ВложенныеЗамеры - коллекция замеров вложенных шагов. +// Соответствие: +// * КлючеваяОперация - имя ключевой операции. +// * ВремяНачала - время начала ключевой операции в миллисекундах. +// * ВремяПоследнегоЗамера - время последнего замера ключевой операции в миллисекундах. +// * ВесЗамера - количество данных, обработанных в ходе выполнения действий. +// * ВложенныеЗамеры - коллекция замеров вложенных шагов. // -Функция НачатьЗамерДлительнойОперации(КлючеваяОперация) Экспорт +Функция НачатьЗамерДлительнойОперации(КлючеваяОперация) Экспорт ОписаниеЗамера = Новый Соответствие; Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl index d16497e85..4a7de6c5c 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl @@ -259,12 +259,12 @@ // срабатыванием обработчика ожидания будет записано под именем "Последний шаг". // // Возвращаемое значение: -// ОписаниеЗамера - Соответствие: -// КлючеваяОперация - имя ключевой операции. -// ВремяНачала - время начала ключевой операции в миллисекундах. -// ВремяПоследнегоЗамера - время последнего замера ключевой операции в миллисекундах. -// ВесЗамера - количество данных, обработанных в ходе выполнения действий. -// ВложенныеЗамеры - коллекция замеров вложенных шагов. +// Соответствие: +// * КлючеваяОперация - Строка - имя ключевой операции. +// * ВремяНачала - Число - время начала ключевой операции в миллисекундах. +// * ВремяПоследнегоЗамера - Число - время последнего замера ключевой операции в миллисекундах. +// * ВесЗамера - Число - количество данных, обработанных в ходе выполнения действий. +// * ВложенныеЗамеры - Соответствие - коллекция замеров вложенных шагов. // Функция НачатьЗамерДлительнойОперации(КлючеваяОперация, ФиксироватьСОшибкой = Ложь, АвтоЗавершение = Ложь, ИмяПоследнегоШага = "ПоследнийШаг") Экспорт diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl index ffba30f27..37b2d6cf5 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl @@ -295,11 +295,10 @@ // Для очистки (чтобы значение снова выводилось) следует передать пустую строку. // Использование - Булево - флажок использования этого отбора. // Необязательный. Значение по умолчанию: Неопределено. -// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - способ отображения этого отбора -// пользователю: -// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ - в группе быстрых настроек над списком. -// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный - в настройка списка (в подменю Еще). -// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный - запретить пользователю менять этот отбор. +// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - способ отображения этого отбора: +// БыстрыйДоступ - в группе быстрых настроек над списком; +// Обычный - в настройка списка (в подменю Еще); +// Недоступный - запретить пользователю менять этот отбор. // ИдентификаторПользовательскойНастройки - Строка - уникальный идентификатор этого отбора. // Используется для связи с пользовательскими настройками. // @@ -456,11 +455,11 @@ // // Параметры: // УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением. -// ДопустимыеСимволы - строка для проверки. +// ДопустимыеСимволы - Строка - для проверки. // // Возвращаемое значение: // Булево - Истина, если строка содержит только латинские (или допустимые) символы; -// - Ложь, если строка содержит иные символы. +// Ложь, если строка содержит иные символы. // Функция ТолькоЛатиницаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl index 4c3d42639..dcce00515 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl @@ -9,9 +9,10 @@ #Область СлужебныйПрограммныйИнтерфейс // Получает N худших замеров производительности за период. +// // Параметры: -// ДатаНачала - ДатаВремя - начало периода выборки. -// ДатаОкончания - ДатаВремя - окончание периода выборка. +// ДатаНачала - Дата - начало периода выборки. +// ДатаОкончания - Дата - окончание периода выборка. // ТопApdexКоличество - Число - количество худших замеров, если но, то возвращаются все замеры. // Функция ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт @@ -19,9 +20,10 @@ КонецФункции // Получает N худших замеров производительности технологической за период. +// // Параметры: -// ДатаНачала - ДатаВремя - начало периода выборки. -// ДатаОкончания - ДатаВремя - окончание периода выборка. +// ДатаНачала - Дата - начало периода выборки. +// ДатаОкончания - Дата - окончание периода выборка. // ТопApdexКоличество - Число - количество худших замеров, если но, то возвращаются все замеры. // Функция ПолучитьТопAPDEXТехнологический(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт @@ -63,8 +65,8 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЭкспортОценкиПроизводительности; Зависимость.РаботаетСВнешнимиРесурсами = Истина; КонецПроцедуры @@ -193,7 +195,8 @@ // Только для внутреннего использования. Функция ЗапросНаИспользованиеВнешнихРесурсов(Каталоги) Экспорт - Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") + И ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме"); МодульОбщегоНазначения = ОбщийМодуль("ОбщегоНазначения"); Возврат МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов( @@ -320,7 +323,7 @@ | Приоритет"; Если ЕстьПредопределенныйЭлемент Тогда - ТекстЗапроса = + ТекстЗапросаПредопределенныйЭлемент = "ВЫБРАТЬ ПЕРВЫЕ 1 | КлючевыеОперации.Ссылка, | 1 КАК Приоритет @@ -328,14 +331,12 @@ | Справочник.КлючевыеОперации КАК КлючевыеОперации |ГДЕ | КлючевыеОперации.ИмяПредопределенныхДанных = ""ОбщаяПроизводительностьСистемы"" - | И НЕ КлючевыеОперации.ПометкаУдаления - | - |ОБЪЕДИНИТЬ ВСЕ - |" + ТекстЗапроса; + | И НЕ КлючевыеОперации.ПометкаУдаления"; + ТекстЗапроса = СтрШаблон("%1 ОБЪЕДИНИТЬ ВСЕ %2", ТекстЗапросаПредопределенныйЭлемент, ТекстЗапроса); КонецЕсли; Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; + Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("КлючевыеОперации", ПредопределенныеКО); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); diff --git a/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl index 0e4f953e7..3df5321cc 100644 --- a/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl +++ b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl @@ -181,12 +181,6 @@ #Область СлужебныйПрограммныйИнтерфейс -Процедура УстановитьИспользованиеСервисаПереводаТекста(Использовать) Экспорт - - Константы.ИспользоватьСервисПереводаТекста.Установить(Использовать); - -КонецПроцедуры - Функция ДоступенПереводТекста() Экспорт Возврат ПолучитьФункциональнуюОпцию("ИспользоватьСервисПереводаТекста"); diff --git a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl index 774d67c3d..92147c1f3 100644 --- a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl @@ -715,6 +715,8 @@ Процедура ВывестиКоманды(Форма, Команды, ПараметрыРазмещения) ПодключенныеКоманды = ПодключенныеКоманды(Форма); + ПодключенныеКоманды.ВводНаОснованииЧерезПодключаемыеКоманды = ПараметрыРазмещения.ВводНаОснованииЧерезПодключаемыеКоманды; + КлючПараметровРазмещения = КлючПараметровРазмещения(ПараметрыРазмещения); РанееДобавленныеКоманды = Неопределено; @@ -753,15 +755,7 @@ КоманднаяПанель = КоманднаяПанельФормы(Форма, ПрефиксГрупп, ПараметрыРазмещения.ЭтоФормаОбъекта); КонецЕсли; - СведенияОВсехПодменю = Новый ТаблицаЗначений; - СведенияОВсехПодменю.Колонки.Добавить("Подменю"); - СведенияОВсехПодменю.Колонки.Добавить("ВыведеноКоманд", Новый ОписаниеТипов("Число")); - СведенияОВсехПодменю.Колонки.Добавить("ЕстьКомандыСУсловиямиВидимости", Новый ОписаниеТипов("Булево")); - СведенияОВсехПодменю.Колонки.Добавить("ЕстьКомандыБезУсловийВидимости", Новый ОписаниеТипов("Булево")); - СведенияОВсехПодменю.Колонки.Добавить("Группы", Новый ОписаниеТипов("Структура")); - СведенияОВсехПодменю.Колонки.Добавить("ГруппаПоУмолчанию"); - СведенияОВсехПодменю.Колонки.Добавить("ПоследняяКоманда"); - СведенияОВсехПодменю.Колонки.Добавить("КомандыСУсловиямиВидимости", Новый ОписаниеТипов("Массив")); + СведенияОВсехПодменю = СведенияОВсехПодменю(); БыстрыйПоискСведенийОПодменю = Новый Соответствие; КорневыеПодменюИКоманды = ПодключенныеКоманды.КорневыеПодменюИКоманды; @@ -772,7 +766,7 @@ ВидыКоманд = ВидыКоманд(); Для Каждого ВидКоманд Из ВидыКоманд Цикл ПроверитьИмяВидаКоманд(ВидКоманд.Имя); - КомандыВида = Команды.НайтиСтроки(Новый Структура("Вид", ВидКоманд.Имя)); + КомандыВида = Команды.НайтиСтроки(Новый Структура("Вид", ВидКоманд.Имя)); // Массив из СтрокаТаблицыЗначений: см. ТаблицаКоманд Если КомандыВида.Количество() = 0 И ВидКоманд.Имя <> "СозданиеНаОсновании" Тогда Продолжить; @@ -789,7 +783,7 @@ БыстрыйПоискСведенийОПодменю.Вставить(НРег(ИмяПодменюПоУмолчанию), СведенияОПодменюПоУмолчанию); КонецЕсли; - Для Каждого Команда Из КомандыВида Цикл // Массив из СтрокаТаблицыЗначений: см. ТаблицаКоманд + Для Каждого Команда Из КомандыВида Цикл Если ПустаяСтрока(Команда.Подменю) Тогда СведенияОПодменюКоманды = СведенияОПодменюПоУмолчанию; Иначе @@ -906,9 +900,8 @@ КонецЕсли; Если СведенияОПодменю.ЕстьКомандыСУсловиямиВидимости Тогда - КраткиеСведенияОПодменю = Новый Структура("Имя, КомандыСУсловиямиВидимости, ЕстьКомандыБезУсловийВидимости"); - ЗаполнитьЗначенияСвойств(КраткиеСведенияОПодменю, СведенияОПодменю); - КраткиеСведенияОПодменю.Имя = СведенияОПодменю.Подменю.Имя; + КраткиеСведенияОПодменю = КраткиеСведенияОПодменю(СведенияОПодменю); + КраткиеСведенияОПодменю.Имя = Подменю.Имя; ПодключенныеКоманды.ПодменюСУсловиямиВидимости.Добавить(КраткиеСведенияОПодменю); КонецЕсли; КонецЦикла; @@ -930,6 +923,48 @@ КонецПроцедуры +// Возвращаемое значение: +// ТаблицаЗначений: +// * Подменю - ГруппаФормы +// * ВыведеноКоманд - Число +// * ЕстьКомандыСУсловиямиВидимости - Булево +// * ЕстьКомандыБезУсловийВидимости - Булево +// * Группы - Структура: +// ** Обычное - ГруппаФормы +// ** Важное - ГруппаФормы +// ** СмТакже - ГруппаФормы +// * ГруппаПоУмолчанию - ГруппаФормы +// * ПоследняяКоманда - КомандаФормы +// * КомандыСУсловиямиВидимости - Массив +// +Функция СведенияОВсехПодменю() + + СведенияОВсехПодменю = Новый ТаблицаЗначений; + СведенияОВсехПодменю.Колонки.Добавить("Подменю"); + СведенияОВсехПодменю.Колонки.Добавить("ВыведеноКоманд", Новый ОписаниеТипов("Число")); + СведенияОВсехПодменю.Колонки.Добавить("ЕстьКомандыСУсловиямиВидимости", Новый ОписаниеТипов("Булево")); + СведенияОВсехПодменю.Колонки.Добавить("ЕстьКомандыБезУсловийВидимости", Новый ОписаниеТипов("Булево")); + СведенияОВсехПодменю.Колонки.Добавить("Группы", Новый ОписаниеТипов("Структура")); + СведенияОВсехПодменю.Колонки.Добавить("ГруппаПоУмолчанию"); + СведенияОВсехПодменю.Колонки.Добавить("ПоследняяКоманда"); + СведенияОВсехПодменю.Колонки.Добавить("КомандыСУсловиямиВидимости", Новый ОписаниеТипов("Массив")); + + Возврат СведенияОВсехПодменю; + +КонецФункции + +// Возвращаемое значение: +// Структура: +// * Имя - Строка +// * КомандыСУсловиямиВидимости - Массив +// * ЕстьКомандыБезУсловийВидимости - Булево +// +Функция КраткиеСведенияОПодменю(СведенияОПодменю) + КраткиеСведенияОПодменю = Новый Структура("Имя, КомандыСУсловиямиВидимости, ЕстьКомандыБезУсловийВидимости"); + ЗаполнитьЗначенияСвойств(КраткиеСведенияОПодменю, СведенияОПодменю); + Возврат КраткиеСведенияОПодменю; +КонецФункции + Функция КлючПараметровРазмещения(Знач ПараметрыРазмещения) ПараметрыРазмещения = ОбщегоНазначения.СкопироватьРекурсивно(ПараметрыРазмещения); @@ -1018,6 +1053,7 @@ Результат.Вставить("КорневыеПодменюИКоманды", Новый Массив); Результат.Вставить("ДоступностьКоманд", Истина); Результат.Вставить("АдресТаблицыКоманд", Неопределено); + Результат.Вставить("ВводНаОснованииЧерезПодключаемыеКоманды"); Форма.ПараметрыПодключаемыхКоманд = Результат; КонецЕсли; @@ -1027,20 +1063,16 @@ КонецФункции Функция ЭтоПутьДоРеквизита(Знач ПутьДоРеквизита) - Результат = Истина; ПутьДоРеквизита = ВРег(ПутьДоРеквизита); ПутьДоРеквизита = СтрЗаменить(ПутьДоРеквизита, "НЕ ", ""); Идентификаторы = СтрРазделить(СтрЗаменить(ПутьДоРеквизита, "%ИСТОЧНИК%",""), "."); Для Каждого Элемент Из Идентификаторы Цикл - Попытка - Пустышка = Новый Структура(Элемент); - Исключение - Результат = Ложь; - Прервать; - КонецПопытки; + Если Не ИмяСоответствуетТребованиямИменованияСвойств(Элемент) Тогда + Возврат Ложь; + КонецЕсли; КонецЦикла; - Возврат Результат; + Возврат Истина; КонецФункции Функция ОписаниеКомандыНаКлиенте(Команда, КнопкаФормы) @@ -1173,11 +1205,10 @@ // Обновляет кэш объектов метаданных указанного типа. // // Параметры: -// ФильтрПоТипуИдентификаторов - * - тип объектов метаданных. -// - СправочникСсылка.ИдентификаторыОбъектовМетаданных - обновлять кэш конфигурации. -// Структура с ключом "ПодключенныеОбъекты" записывается в константу ПараметрыПодключаемыхКоманд. -// - СправочникСсылка.ИдентификаторыОбъектовРасширений - обновлять кэш расширений. -// Структура с ключом "ПодключенныеОбъекты" записывается в регистр ПараметрыРаботыВерсийРасширений. +// Отбор - СправочникСсылка.ИдентификаторыОбъектовМетаданных - обновлять кэш конфигурации. +// Структура с ключом "ПодключенныеОбъекты" записывается в константу ПараметрыПодключаемыхКоманд. +// - СправочникСсылка.ИдентификаторыОбъектовРасширений - обновлять кэш расширений. +// Структура с ключом "ПодключенныеОбъекты" записывается в регистр ПараметрыРаботыВерсийРасширений. // // Возвращаемое значение: // Структура: @@ -1186,11 +1217,11 @@ // подключенных к объектам конфигурации. // Ключами и значениям являются ссылки объектов метаданных конфигурации и расширений. // -Функция ОперативноеОбновлениеОбщихДанных(ФильтрПоТипуИдентификаторов) +Функция ОперативноеОбновлениеОбщихДанных(Отбор) Результат = Новый Структура; Результат.Вставить("ЕстьИзменения", Ложь); - Если ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") + Если Отбор = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") И Не ЗначениеЗаполнено(ПараметрыСеанса.ВерсияРасширений) Тогда Возврат Результат; КонецЕсли; @@ -1205,7 +1236,7 @@ КонецЕсли; СсылкаПодключенногоОМ = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданныхПоставщика); - Если ТипЗнч(СсылкаПодключенногоОМ) <> ФильтрПоТипуИдентификаторов Тогда + Если ТипЗнч(СсылкаПодключенногоОМ) <> Отбор Тогда Продолжить; КонецЕсли; ПолноеИмя = ОбъектМетаданныхПоставщика.ПолноеИмя(); @@ -1226,9 +1257,9 @@ КонецЦикла; КонецЦикла; - Если ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Если Отбор = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыПрограммы(ПолноеИмяПодсистемы()); - ИначеЕсли ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда + ИначеЕсли Отбор = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ПолноеИмяПодсистемы()); Иначе Возврат Результат; @@ -1237,9 +1268,9 @@ НовоеЗначение = Новый Структура("ПодключенныеОбъекты", ПодключенныеОбъекты); Если Не ОбщегоНазначения.ДанныеСовпадают(СтароеЗначение, НовоеЗначение) Тогда Результат.ЕстьИзменения = Истина; - Если ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Если Отбор = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы(ПолноеИмяПодсистемы(), НовоеЗначение); - ИначеЕсли ФильтрПоТипуИдентификаторов = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда + ИначеЕсли Отбор = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ПолноеИмяПодсистемы(), НовоеЗначение); КонецЕсли; КонецЕсли; @@ -1372,7 +1403,7 @@ // * Порядок - Число // * Картинка - Картинка // * СочетаниеКлавиш - СочетаниеКлавиш -// * ОтображениеКнопки +// * ОтображениеКнопки - Неопределено // * ТолькоВоВсехДействиях - Булево // * ЗначениеПометки - Строка // * ТипПараметра - ОписаниеТипов @@ -1380,7 +1411,7 @@ // * Назначение - Строка // * ФункциональныеОпции - Строка // * УсловияВидимости - Массив -// * ИзменяетВыбранныеОбъекты +// * ИзменяетВыбранныеОбъекты - Булево // * МножественныйВыбор - Булево, Неопределено // * РежимЗаписи - Строка // * ТребуетсяРаботаСФайлами - Булево diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl index 3753aeab3..bf0efb7a9 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl @@ -107,9 +107,11 @@ // ** ДополнительныеПараметры - Структура - дополнительные свойства, состав которых определяется видом // конкретной команды. // * Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана команда. +// - РасширениеУправляемойФормыДляДокумента // * ЭтоФормаОбъекта - Булево - Истина, если команда вызвана из формы объекта. // * Источник - ТаблицаФормы -// - ДанныеФормыСтруктура - объект или список формы с полем "Ссылка". +// - ДанныеФормыСтруктура - объект или список формы с полем "Ссылка": +// ** Ссылка - ЛюбаяСсылка // Функция ПараметрыВыполненияКоманды() Экспорт Результат = ПодключаемыеКомандыКлиентСервер.ПараметрыВыполненияКоманды(); @@ -128,6 +130,10 @@ #Область СлужебныеПроцедурыИФункции // Выполняет команду, подключенную к форме. +// +// Параметры: +// ПараметрыВыполнения - см. ПараметрыВыполненияКоманды +// Процедура ПродолжитьВыполнениеКоманды(ПараметрыВыполнения) Источник = ПараметрыВыполнения.Источник; ОписаниеКоманды = ПараметрыВыполнения.ОписаниеКоманды; @@ -251,6 +257,11 @@ КонецПроцедуры // Ветка процедуры, возникающая после диалога подтверждения записи. +// +// Параметры: +// Ответ - КодВозвратаДиалога +// Контекст - см. ПараметрыВыполненияКоманды +// Процедура ПродолжитьВыполнениеКомандыПослеПодтвержденияЗаписи(Ответ, Контекст) Экспорт Если Ответ = КодВозвратаДиалога.ОК Тогда ОчиститьСообщения(); @@ -260,7 +271,7 @@ РежимЗаписи = РежимЗаписиДокумента.Проведение; КонецЕсли; - ПараметрыВыполненияПодключаемойКоманды = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(Контекст); + ПараметрыВыполненияПодключаемойКоманды = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(Контекст); // Структура ПараметрыВыполненияПодключаемойКоманды.Удалить("Форма"); Контекст.Форма.ПараметрыПодключаемыхКоманд.Вставить("КомандаВыполняется"); Контекст.Форма.Записать(Новый Структура("РежимЗаписи,ПараметрыВыполненияПодключаемойКоманды", РежимЗаписи, ПараметрыВыполненияПодключаемойКоманды)); diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl index 1f7f4ef56..33ba40875 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыКлиентСервер/Module.bsl @@ -16,13 +16,19 @@ // - ТаблицаФормы - контекст для проверки условий (Форма.Объект или Форма.Элементы.Список). // Процедура ОбновитьКоманды(Форма, Источник) Экспорт - Структура = Новый Структура("ПараметрыПодключаемыхКоманд", Null); - ЗаполнитьЗначенияСвойств(Структура, Форма); - ПараметрыКлиента = Структура.ПараметрыПодключаемыхКоманд; + + ПараметрыКлиента = ПараметрыПодключаемыхКоманд(Форма); Если ТипЗнч(ПараметрыКлиента) <> Тип("Структура") Тогда Возврат; КонецЕсли; + Если ПараметрыКлиента.ВводНаОснованииЧерезПодключаемыеКоманды Тогда + ПодменюСоздатьНаОсновании = Форма.Элементы.Найти("ФормаСоздатьНаОсновании"); + Если ПодменюСоздатьНаОсновании <> Неопределено И ПодменюСоздатьНаОсновании.Видимость Тогда + ПодменюСоздатьНаОсновании.Видимость = Ложь; + КонецЕсли; + КонецЕсли; + Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда ДоступностьКоманд = (Источник.ТекущаяСтрока <> Неопределено); Иначе @@ -59,24 +65,8 @@ Возврат; КонецЕсли; - ВыбранныеОбъекты = Новый Массив; - ПроверятьОписаниеТипов = Ложь; - - Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда - ВыделенныеСтроки = Источник.ВыделенныеСтроки; - Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл - Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Продолжить; - КонецЕсли; - ТекущаяСтрока = Источник.ДанныеСтроки(ВыделеннаяСтрока); - Если ТекущаяСтрока <> Неопределено Тогда - ВыбранныеОбъекты.Добавить(ТекущаяСтрока); - КонецЕсли; - КонецЦикла; - ПроверятьОписаниеТипов = Истина; - Иначе - ВыбранныеОбъекты.Добавить(Источник); - КонецЕсли; + ПроверятьОписаниеТипов = ТипЗнч(Источник) = Тип("ТаблицаФормы"); + ВыбранныеОбъекты = ВыбранныеОбъекты(Источник); Для Каждого КраткиеСведенияОПодменю Из ПараметрыКлиента.ПодменюСУсловиямиВидимости Цикл ЕстьВидимыеКоманды = Ложь; @@ -205,4 +195,52 @@ КонецЦикла; КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * ЕстьУсловияВидимости - Булево +// * ПодменюСУсловиямиВидимости - Массив из Структура: +// ** Имя - Строка +// ** КомандыСУсловиямиВидимости - Массив +// ** ЕстьКомандыБезУсловийВидимости - Булево +// * КомандыСПометкой - Массив +// * КорневыеПодменюИКоманды - Массив +// * ДоступностьКоманд - Булево +// * АдресТаблицыКоманд - Строка +// * ВводНаОснованииЧерезПодключаемыеКоманды - Булево +// +Функция ПараметрыПодключаемыхКоманд(Форма) + + Структура = Новый Структура("ПараметрыПодключаемыхКоманд", Null); + ЗаполнитьЗначенияСвойств(Структура, Форма); + Возврат Структура.ПараметрыПодключаемыхКоманд; + +КонецФункции + +// Возвращаемое значение: +// Массив из ДанныеФормыСтруктура, ДанныеФормыЭлементКоллекции: +// * Ссылка - ЛюбаяСсылка +// +Функция ВыбранныеОбъекты(Источник) + + ВыбранныеОбъекты = Новый Массив; // Массив из ДанныеФормыСтруктура, ДанныеФормыЭлементКоллекции + + Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда + ВыделенныеСтроки = Источник.ВыделенныеСтроки; + Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл + Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Продолжить; + КонецЕсли; + ТекущаяСтрока = Источник.ДанныеСтроки(ВыделеннаяСтрока); + Если ТекущаяСтрока <> Неопределено Тогда + ВыбранныеОбъекты.Добавить(ТекущаяСтрока); + КонецЕсли; + КонецЦикла; + Иначе + ВыбранныеОбъекты.Добавить(Источник); + КонецЕсли; + + Возврат ВыбранныеОбъекты; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl index bb2044c95..d87ca07c4 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl @@ -104,7 +104,7 @@ // Подробнее см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. // * Идентификатор - Строка - идентификатор команды. // -// Настройки внешнего вида: +// 1) Настройки внешнего вида. // * Представление - Строка - представление команды в форме. // * Важность - Строка - суффикс подгруппы в меню, в которой следует вывести эту команду. // Допустимо использовать: "Важное", "Обычное" и "СмТакже". @@ -115,11 +115,12 @@ // * ТолькоВоВсехДействиях - Булево - отображать команду только в меню Еще. // * ЗначениеПометки - Строка - путь к реквизиту, где содержится значение пометки команды. Если источником команд является // Таблица формы, то возможно использовать параметр %Источник%. -// Пример: -// - ЗначениеПометок.%Источник%, где ЗначениеПометок - реквизит формы произвольного типа, в котором содержится структура. -// - Объект.ПометкаУдаления, где Объект - реквизит формы с типом СправочникОбъект. +// Например: +// "ЗначениеПометок.%Источник%", где ЗначениеПометок - реквизит формы произвольного типа, +// в котором содержится структура. +// "Объект.ПометкаУдаления", где Объект - реквизит формы с типом СправочникОбъект. // -// Настройки видимости и доступности: +// 2) Настройки видимости и доступности. // * ТипПараметра - ОписаниеТипов - типы объектов, для которых предназначена эта команда. // * ВидимостьВФормах - Строка - имена форм через запятую, в которых должна отображаться команда. // Используется, когда состав команд отличается для различных форм. @@ -138,7 +139,7 @@ // Если Истина, то в описанной выше ситуации кнопка будет недоступна. // Необязательный. Значение по умолчанию - Ложь. // -// Настройки процесса выполнения: +// 3) Настройки процесса выполнения. // * МножественныйВыбор - Булево - если Истина, то команда поддерживает множественный выбор. // В этом случае в параметре выполнения будет передан список ссылок. // Необязательный. Значение по умолчанию - Истина. @@ -154,7 +155,7 @@ // * ТребуетсяРаботаСФайлами - Булево - если Истина, то в веб-клиенте предлагается // установить расширение для работы с 1С:Предприятием. Необязательный. Значение по умолчанию - Ложь. // -// Настройки обработчика: +// 4) Настройки обработчика. // * Менеджер - Строка - объект, отвечающий за выполнение команды. // * ИмяФормы - Строка - имя формы, которую требуется получить для выполнения команды. // Если Обработчик не указан, то у формы вызывается метод "Открыть". @@ -164,8 +165,8 @@ // * Обработчик - Строка - описание процедуры, обрабатывающей основное действие команды, в виде: // "<ИмяОбщегоМодуля>.<ИмяПроцедуры>", если процедура размещена в общем модуле; // либо "<ИмяПроцедуры>" - в следующих случаях: -// - если ИмяФормы заполнено, то в модуле указанной формы ожидается клиентская процедура; -// - если ИмяФормы не заполнено, то в модуле менеджера этого объекта ожидается серверная процедура. +// если ИмяФормы заполнено, то в модуле указанной формы ожидается клиентская процедура; +// если ИмяФормы не заполнено, то в модуле менеджера этого объекта ожидается серверная процедура. // * ДополнительныеПараметры - Структура - параметры обработчика, указанного в Обработчик. Необязательный. // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl index 5b5591bd5..1c5c18d62 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl @@ -71,13 +71,13 @@ // Не выбрасывает исключений. // // Возвращаемое значение: -// Строка - варианты -// - "ПоискРазрешен" -// - "ПоискЗапрещен" -// - "ВыполняетсяОбновлениеИндекса" -// - "ВыполняетсяСлияниеИндекса" -// - "ТребуетсяОбновлениеИндекса" -// - "ОшибкаНастройкиПоиска" +// Строка - варианты: +// "ПоискРазрешен" +// "ПоискЗапрещен" +// "ВыполняетсяОбновлениеИндекса" +// "ВыполняетсяСлияниеИндекса" +// "ТребуетсяОбновлениеИндекса" +// "ОшибкаНастройкиПоиска" // Функция СостояниеПолнотекстовогоПоиска() Экспорт @@ -229,16 +229,14 @@ КонецПроцедуры -// Параметры: -// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки -// -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеИндексаППД; Зависимость.ФункциональнаяОпция = ФункциональнаяОпцияИспользоватьПолнотекстовыйПоиск(); - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СлияниеИндексаППД; Зависимость.ФункциональнаяОпция = ФункциональнаяОпцияИспользоватьПолнотекстовыйПоиск(); diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl index d2607e605..5216ce51f 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСерверПереопределяемый/Module.bsl @@ -13,10 +13,10 @@ // // Параметры: // РазделыПоиска - ДеревоЗначений - области поиска. Содержит колонки: -// ** Раздел - Строка - представление раздела, например, название подсистемы или объекта метаданных. -// ** Картинка - Картинка - картинка раздела, рекомендуется только для корневых разделов. -// ** ОбъектМД - СправочникСсылка.ИдентификаторыОбъектовМетаданных - задается только для объектов метаданных, -// для разделов остается пустым. +// * Раздел - Строка - представление раздела, например, название подсистемы или объекта метаданных. +// * Картинка - Картинка - картинка раздела, рекомендуется только для корневых разделов. +// * ОбъектМД - СправочникСсылка.ИдентификаторыОбъектовМетаданных - задается только для объектов метаданных, +// для разделов остается пустым. // Пример: // // РазделГлавное = РазделыПоиска.Строки.Добавить(); diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl index 847855e3f..36d2b4759 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl @@ -19,8 +19,7 @@ // * Порт - Число - порт сервера, с которым установлено соединение. // * Таймаут - Число - таймаут на получение файла в секундах. // * ЗащищенноеСоединение - Булево - признак использования защищенного соединения ftps или https. -// - ЗащищенноеСоединение - см. в синтакс-помощнике описание свойства ЗащищенноеСоединение -// объектов FTPСоединение и HTTPСоединение. +// - ЗащищенноеСоединениеOpenSSL // - Неопределено - в случае, если защищенное соединение не используется. // // Параметры только для http (https) соединения: diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl index 3847222e3..2c79d75f6 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl @@ -58,8 +58,8 @@ // Функция для получения файла из сети Интернет. // // Параметры: -// URL - Строка - url файла в формате: -// НастройкиПолучения - Структура: +// URL - Строка - url файла. +// ПараметрыПолучения - Структура: // * ПутьДляСохранения - Строка - путь на сервере (включая имя файла), для сохранения скачанного файла. // * Пользователь - Строка - пользователь от имени которого установлено соединение. // * Пароль - Строка - пароль пользователя от которого установлено соединение. @@ -72,21 +72,22 @@ // * Заголовки - Соответствие - см. описание параметра Заголовки объекта HTTPЗапрос. // * ИспользоватьАутентификациюОС - Булево - см. описание параметра ИспользоватьАутентификациюОС объекта HTTPСоединение. // -// НастройкаСохранения - соответствие - содержит параметры для сохранения скачанного файла -// ключи: -// МестоХранения - строка - может содержать +// НастройкаСохранения - Соответствие - содержит параметры для сохранения скачанного файла. Ключи: +// МестоХранения - Строка - может содержать // "Сервер" - сервер, // "ВременноеХранилище" - временное хранилище. // Путь - строка (необязательный параметр) - // путь к каталогу на клиенте либо на сервере либо адрес во временном хранилище // если не задано будет сгенерировано автоматически. +// ЗаписыватьОшибку - Булево // // Возвращаемое значение: // Структура: -// успех - Булево - успех или неудача операции -// Строка - строка - в случае успеха либо строка-путь сохранения файла -// либо адрес во временном хранилище -// в случае неуспеха сообщение об ошибке. +// * Статус - Булево +// * Путь - Строка +// * СообщениеОбОшибке - Строка +// * Заголовки - Соответствие +// * КодСостояния - Число // Функция СкачатьФайл(Знач URL, Знач ПараметрыПолучения, Знач НастройкаСохранения, Знач ЗаписыватьОшибку = Истина) Экспорт @@ -140,10 +141,11 @@ // // Возвращаемое значение: // Структура: -// успех - Булево - успех или неудача операции -// Строка - строка - в случае успеха либо строка-путь сохранения файла -// либо адрес во временном хранилище -// в случае неуспеха сообщение об ошибке. +// * Статус - Булево +// * Путь - Строка +// * СообщениеОбОшибке - Строка +// * Заголовки - Соответствие +// * КодСостояния - Число // Функция ПолучитьФайлИзИнтернет(Знач URL, Знач НастройкаСохранения, Знач НастройкаСоединения, Знач НастройкиПрокси, Знач ЗаписыватьОшибку, Перенаправления = Неопределено) @@ -350,7 +352,7 @@ НСтр("ru = 'Превышено количество перенаправлений.'"); Иначе - НовыйURL = ЗаголовкиВНижнийРегистр(ОтветHTTP.Заголовки)["location"]; + НовыйURL = СтандартныеПодсистемыСервер.HTTPЗаголовкиВНижнийРегистр(ОтветHTTP.Заголовки)["location"]; Если НовыйURL = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Некорректное перенаправление, отсутствует HTTP-заголовок ответа ""Location"".'"); @@ -387,7 +389,7 @@ Если ОтветHTTP.КодСостояния = 304 Тогда - HTTPЗаголовки = ЗаголовкиВНижнийРегистр(ЗапросHTTP.Заголовки); + HTTPЗаголовки = СтандартныеПодсистемыСервер.HTTPЗаголовкиВНижнийРегистр(ЗапросHTTP.Заголовки); Если (HTTPЗаголовки["if-modified-since"] <> Неопределено Или HTTPЗаголовки["if-none-match"] <> Неопределено) Тогда ЗаписыватьОшибку = Ложь; КонецЕсли; @@ -488,26 +490,18 @@ КонецФункции -Функция ЗаголовкиВНижнийРегистр(Заголовки) - - Результат = Новый Соответствие; - Для каждого Заголовок из Заголовки Цикл - Результат.Вставить(НРег(Заголовок.Ключ), Заголовок.Значение); - КонецЦикла; - Возврат Результат; - -КонецФункции - -// Функция, заполняющая структуру по параметрам. -// // Параметры: -// УспехОперации - Булево - успех или неуспех операции. +// Статус - Булево - успех или неуспех операции. // СообщениеПуть - Строка +// HTTPОтвет - HTTPОтвет // // Возвращаемое значение: // Структура: -// поле успех - булево -// поле путь - строка. +// * Статус - Булево +// * Путь - Строка +// * СообщениеОбОшибке - Строка +// * Заголовки - Соответствие +// * КодСостояния - Число // Функция РезультатПолученияФайла(Знач Статус, Знач СообщениеПуть, HTTPОтвет = Неопределено) @@ -542,7 +536,7 @@ Исключение Возврат 0; КонецПопытки; - РазмерСтрокой = ЗаголовкиВНижнийРегистр(ПолученныеЗаголовки.Заголовки)["content-length"]; + РазмерСтрокой = СтандартныеПодсистемыСервер.HTTPЗаголовкиВНижнийРегистр(ПолученныеЗаголовки.Заголовки)["content-length"]; ТипЧисло = Новый ОписаниеТипов("Число"); РазмерФайла = ТипЧисло.ПривестиЗначение(РазмерСтрокой); @@ -878,10 +872,10 @@ КонецФункции -// Записывает событие-ошибку в журнал регистрации. Имя события -// "Получение файлов из Интернета". +// Записывает событие-ошибку в журнал регистрации с именем "Получение файлов из Интернета". +// // Параметры: -// СообщениеОбОшибке - строка сообщение об ошибке. +// СообщениеОбОшибке - Строка - сообщение об ошибке. // Процедура ЗаписатьОшибкуВЖурналРегистрации(Знач СообщениеОбОшибке) diff --git a/SSL/src/CommonModules/Пользователи/Module.bsl b/SSL/src/CommonModules/Пользователи/Module.bsl index 45f566a21..73a1edb33 100644 --- a/SSL/src/CommonModules/Пользователи/Module.bsl +++ b/SSL/src/CommonModules/Пользователи/Module.bsl @@ -786,7 +786,7 @@ // - УникальныйИдентификатор - уникальный идентификатор пользователя ИБ. // - ПользовательИнформационнойБазы // -// УчетнаяЗапись - ПользовательИнформационнойБазы - (возвращаемое значение). +// УчетнаяЗапись - ПользовательИнформационнойБазы - возвращаемое значение. // // Возвращаемое значение: // Булево - Истина, если пользователь ИБ существует и его идентификатор @@ -1783,7 +1783,7 @@ // проверка выполняется, если разделение включено. // // СписокОшибок - Неопределено - если ошибки найдены, формируется текст ошибок и вызывается исключение. -// - СписокЗначений - (возвращаемое значение) найденные ошибки добавляются в список без вызова исключения: +// - СписокЗначений - возвращаемое значение. Найденные ошибки добавляются в список без вызова исключения: // * Значение - Строка - имя роли. // - Неопределено - роль, указанная в процедуре, не существует в метаданных. // * Представление - Строка - текст ошибки. diff --git a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl index d13509f4a..c726c3804 100644 --- a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl @@ -576,12 +576,11 @@ // указанную ссылку из поиска. // Неопределено - искать среди всех элементов справочников. // -// НайденныйПользователь (Возвращаемое значение): -// Неопределено - пользователь не существует. -// СправочникСсылка.Пользователи, -// СправочникСсылка.ВнешниеПользователи, если найден. +// НайденныйПользователь - Неопределено - пользователь не существует. +// - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи - возвращаемое значение, если найден. // -// ИдентификаторПользователяСервиса - Булево. +// ИдентификаторПользователяСервиса - Булево // Ложь - проверять ИдентификаторПользователяИБ. // Истина - проверять ИдентификаторПользователяСервиса. // @@ -963,7 +962,7 @@ // Параметры: // Объект - СправочникОбъект.Пользователи // - СправочникОбъект.ВнешниеПользователи -// ЭтоНовый - Булево - (Возвращаемое значение). +// ЭтоНовый - Булево - возвращаемое значение. // Функция СсылкаОбъекта(Знач Объект, ЭтоНовый = Неопределено) Экспорт @@ -1057,7 +1056,6 @@ Списки.Вставить(Метаданные.Справочники.ВнешниеПользователи, Истина); Списки.Вставить(Метаданные.Справочники.ГруппыВнешнихПользователей, Истина); Списки.Вставить(Метаданные.Справочники.Пользователи, Истина); - Списки.Вставить(Метаданные.РегистрыСведений.СоставыГруппПользователей, Истина); КонецПроцедуры @@ -1230,8 +1228,7 @@ Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.16"; - Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Версия = "2.1.3.16"; Обработчик.Процедура = "ПользователиСлужебный.ОбновитьПредопределенныеВидыКонтактнойИнформацииПользователей"; Если ОбщегоНазначения.РазделениеВключено() Тогда @@ -1435,8 +1432,6 @@ |Справочник.ГруппыПользователей.Чтение.Пользователи |Справочник.Пользователи.Чтение.Пользователи |Справочник.Пользователи.Изменение.Пользователи - |РегистрСведений.СоставыГруппПользователей.Чтение.ВнешниеПользователи - |РегистрСведений.СоставыГруппПользователей.Чтение.Пользователи |"; Описание = Описание + ДополнениеОписания; @@ -1871,7 +1866,7 @@ // Пользователь - СправочникСсылка.Пользователи // - СправочникСсылка.ВнешниеПользователи - пользователь для смены пароля. // -// ДополнительныеПараметры - Структура - (возвращаемое значение) со свойствами: +// ДополнительныеПараметры - Структура - возвращаемое значение со свойствами: // * ТекстОшибки - Строка - описание ошибки, если нет возможности изменить пароль. // * ИдентификаторПользователяИБ - УникальныйИдентификатор - идентификатор пользователя ИБ. // * ЭтоТекущийПользовательИБ - Булево - Истина, если пользователь является текущим. @@ -2139,7 +2134,7 @@ // // * ПриВходеВПрограмму - Булево - может быть Истина при вызове из формы СменаПароля. // * ТолькоПроверить - Булево - может быть Истина при вызове из формы СменаПароля. -// * СтарыйПарольСовпадает - Булево - (возвращаемое значение) - если Ложь, значит не совпадает. +// * СтарыйПарольСовпадает - Булево - возвращаемое значение. Если Ложь, значит не совпадает. // // * ПарольПользователяСервиса - Строка - пароль текущего пользователя при вызове // из формы СменаПароля, сбрасывается при ошибке. @@ -2518,14 +2513,14 @@ // * АдминистраторСистемы - Булево - любые действия с любым пользователем и его пользователем ИБ. // * ПолныеПрава - Булево - то же, АдминистраторСистемы, исключая администраторов системы. // * УправлениеСписком - Булево - добавление новых пользователей и изменение существующих: -// - для пользователей, которым еще не разрешался вход в программу (новых), +// а) для пользователей, которым еще не разрешался вход в программу (новых), // можно настроить любые свойства, кроме включения входа в программу, -// - для пользователей, которым уже разрешался вход в программу, +// б) для пользователей, которым уже разрешался вход в программу, // можно настроить любые свойства, кроме включения входа в программу // и настройки аутентификации (см. ниже). // * ИзменениеРазрешенияНаВход - Булево - изменение флажка "Вход в программу разрешен". // * ОтключениеРазрешенияНаВход - Булево - снятие флажка "Вход в программу разрешен". -// * НастройкиДляВхода - Булево - изменение свойств пользователя ИБ: Имя, ПользовательОС и +// * НастройкиДляВхода - Булево - изменение свойств пользователя ИБ Имя, ПользовательОС и // свойств элемента справочника АутентификацияOpenID, АутентификацияСтандартная, // АутентификацияОС и Роли (если нет запрета редактирования при внедрении). // * ИзменениеТекущего - Булево - изменение свойств текущего пользователя Пароль и Язык. @@ -2634,7 +2629,7 @@ КонецФункции -// Вызывается ПередЗаписью Пользователя или Внешнего пользователя. +// Вызывается ПередЗаписью пользователя или внешнего пользователя. // // Параметры: // ПользовательОбъект - СправочникОбъект.Пользователи @@ -4022,7 +4017,7 @@ // пользователи. // Перемещение - Булево - если Истина, то пользователь удаляется из старой группы. // -// ВозвращаемоеЗначение: +// Возвращаемое значение: // Строка - сообщение о результате переноса. // Функция ПеремещениеПользователяВНовуюГруппу(МассивПользователей, ГруппаИсточник, @@ -4209,7 +4204,7 @@ // ГруппаИсточник - СправочникСсылка.ГруппыПользователей - группа, из которой происходит // перенос пользователей. // -// ВозвращаемоеЗначение: +// Возвращаемое значение: // Строка - сообщение пользователю. // Функция ФормированиеСообщенияПользователю(МассивПользователей, ГруппаПриемник, @@ -4439,7 +4434,7 @@ КонецФункции -Функция ПользователиДляВключенияВосстановленияПароляСУчетомВнешнихПользователей() Экспорт +Функция ПользователиДляВключенияВосстановленияПароляСУчетомВнешнихПользователей() ТипыВнешнихПользователей = Метаданные.ОпределяемыеТипы.ВнешнийПользователь.Тип.Типы(); @@ -4983,13 +4978,32 @@ // Вызывается при переходе на версию конфигурации 3.0.2.124 и при начальном заполнении. Процедура ЗаполнитьНаименованиеПредопределенныхГруппПользователей() Экспорт - ГруппаПользователейОбъект = Справочники.ГруппыПользователей.ВсеПользователи.ПолучитьОбъект(); - ГруппаПользователейОбъект.Наименование = НСтр("ru = 'Все пользователи'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаПользователейОбъект); + УстановитьНаименование(Справочники.ГруппыПользователей.ВсеПользователи, + НСтр("ru = 'Все пользователи'")); - ГруппыВнешнихПользователейОбъект = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи.ПолучитьОбъект(); - ГруппыВнешнихПользователейОбъект.Наименование = НСтр("ru = 'Все внешние пользователи'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппыВнешнихПользователейОбъект); + УстановитьНаименование(Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи, + НСтр("ru = 'Все внешние пользователи'")); + +КонецПроцедуры + +// Для процедуры ЗаполнитьНаименованиеПредопределенныхГруппПользователей. +Процедура УстановитьНаименование(Ссылка, Наименование) + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(Ссылка.Метаданные().ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Объект = Ссылка.ПолучитьОбъект(); + Объект.Наименование = НСтр("ru = 'Все пользователи'"); + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Объект); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -5103,9 +5117,21 @@ Продолжить; КонецЕсли; - ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ТекущийОбъект.ИдентификаторПользователяИБ = ПустойУникальныйИдентификатор; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ТекущийОбъект); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(Выборка.Ссылка.Метаданные().ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ТекущийОбъект.ИдентификаторПользователяИБ = ПустойУникальныйИдентификатор; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ТекущийОбъект); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; КонецПроцедуры diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl index 2ebb7aa1d..6d6357cf8 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl @@ -96,9 +96,13 @@ // Создает / обновляет запись пользователя сервиса. // // Параметры: -// Пользователь - СправочникСсылка.Пользователи/СправочникОбъект.Пользователи -// СоздатьПользователяСервиса - Булево - Истина - создать нового пользователя -// сервиса, Ложь - обновить существующего. +// Пользователь - СправочникСсылка.Пользователи +// - СправочникОбъект.Пользователи +// +// СоздатьПользователяСервиса - Булево +// Истина - создать нового пользователя сервиса, +// Ложь - обновить существующего. +// // ПарольПользователяСервиса - Строка - пароль текущего пользователя // для доступа к менеджеру сервиса. // @@ -155,7 +159,8 @@ ЗаписьКИ.Value = СтрокаКИ.Представление; ЗаписьКИ.Parts = СтрокаКИ.ЗначенияПолей; - КонтактнаяИнформация.Item.Добавить(ЗаписьКИ); + ЗаписиКИ = КонтактнаяИнформация.Item; // СписокXDTO + ЗаписиКИ.Добавить(ЗаписьКИ); КонецЦикла; ПользовательСервиса.Contacts = КонтактнаяИнформация; @@ -174,7 +179,6 @@ #Область РаботаСНеразделеннымиПользователямиИнформационнойБазы // Вызывается перед запуском программы до вызова всех остальных обработчиков. -// Процедура ПередЗапускомПрограммы() Экспорт Если ЭтоНеразделенныйПользовательИБ() Тогда @@ -188,8 +192,8 @@ // // Параметры: // ИдентификаторПользователяИБ - УникальныйИдентификатор - идентификатор -// пользователя ИБ принадлежность которого к неразделенным пользователям -// требуется проверить. +// пользователя ИБ, для которого нужно проверить +// принадлежность к неразделенным пользователям. // Функция ПользовательЗарегистрированКакНеразделенный(Знач ИдентификаторПользователяИБ) Экспорт @@ -232,16 +236,7 @@ #Область ОбработчикиСобытийПодсистемКонфигурации -// Вызывается, если не удалось найти пользователя в справочнике, который -// соответствует текущему пользователю ИБ. При этом можно включить автоматическое -// создание элемента справочника Пользователи для текущего пользователя. -// -// Параметры: -// СоздатьПользователя - Булево - (возвращаемое значение) - если указать Истина, -// то автоматически будет создан пользователь в справочнике. -// Переопределить свойства создаваемого пользователя можно перед его записью -// в процедуре ПриАвтоматическомСозданииТекущегоПользователяВСправочнике. -// +// См. ИнтеграцияПодсистемБСП.ПриОтсутствииТекущегоПользователяВСправочнике Процедура ПриОтсутствииТекущегоПользователяВСправочнике(СоздатьПользователя) Экспорт Если ЭтоНеразделенныйПользовательИБ() Тогда @@ -252,12 +247,7 @@ КонецПроцедуры -// Вызывается при автоматическом создании элемента справочника Пользователи в момент -// интерактивного входа пользователя или при первом обращении из кода. -// -// Параметры: -// НовыйПользователь - СправочникОбъект.Пользователи - новый пользователь перед записью. -// +// См. ИнтеграцияПодсистемБСП.ПриАвтоматическомСозданииТекущегоПользователяВСправочнике Процедура ПриАвтоматическомСозданииТекущегоПользователяВСправочнике(НовыйПользователь) Экспорт Если ЭтоНеразделенныйПользовательИБ() Тогда @@ -268,13 +258,7 @@ КонецПроцедуры -// Вызывается при авторизации нового пользователя информационной базы. -// -// Параметры: -// ПользовательИБ - ПользовательИнформационнойБазы - текущий пользователь информационной базы, -// СтандартнаяОбработка - Булево - значение может быть установлено внутри обработчика, в этом случае -// стандартная обработка авторизации нового пользователя ИБ выполняться не будет. -// +// См. ИнтеграцияПодсистемБСП.ПриАвторизацииНовогоПользователяИБ Процедура ПриАвторизацииНовогоПользователяИБ(Знач ТекущийПользовательИБ, СтандартнаяОбработка) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() @@ -317,13 +301,7 @@ КонецПроцедуры -// Вызывается при начале обработки пользователя информационной базы. -// -// Параметры: -// ПараметрыОбработки - Структура - см. комментарий к процедуре НачатьОбработкуПользователяИБ() -// ОписаниеПользователяИБ - Структура - см. комментарий к процедуре НачатьОбработкуПользователяИБ(), где: -// * Действие - Строка -// +// См. ИнтеграцияПодсистемБСП.ПриНачалеОбработкиПользователяИБ Процедура ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ) Экспорт Если ЗначениеЗаполнено(ПараметрыОбработки.СтарыйПользователь.ИдентификаторПользователяИБ) @@ -352,7 +330,7 @@ КонецПроцедуры -// См. ИнтеграцияПодсистемБСП.ПередЗаписьюПользователяИБ. +// См. ИнтеграцияПодсистемБСП.ПередЗаписьюПользователяИБ Процедура ПередЗаписьюПользователяИБ(ПользовательИБ) Экспорт Если ОбщегоНазначения.РазделениеВключено() Тогда @@ -364,9 +342,14 @@ КонецПроцедуры // Обработка пользователя ИБ в ходе записи элемента справочника Пользователи и ВнешниеПользователи. - // Вызывается из процедуры НачатьОбработкуПользователяИБ для поддержки модели сервиса. -Процедура ПередНачаломОбработкиПользователяИБ(ПользовательОбъект, ПараметрыОбработки) Экспорт +// +// Параметры: +// ПользовательОбъект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// ПараметрыОбработки - Структура +// +Процедура ПередНачаломОбработкиПользователяИБ(Знач ПользовательОбъект, ПараметрыОбработки) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Тогда Возврат; @@ -376,8 +359,7 @@ СтарыйПользователь = ПараметрыОбработки.СтарыйПользователь; АвтоРеквизиты = ПараметрыОбработки.АвтоРеквизиты; - Если ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.ВнешниеПользователи") - И ОбщегоНазначения.РазделениеВключено() Тогда + Если ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.ВнешниеПользователи") Тогда ВызватьИсключение НСтр("ru = 'Внешние пользователи не поддерживаются в модели сервиса.'"); КонецЕсли; @@ -430,6 +412,12 @@ КонецПроцедуры // Вызывается из процедуры НачатьОбработкуПользователяИБ для поддержки модели сервиса. +// +// Параметры: +// ПользовательОбъект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// ПараметрыОбработки - Структура +// Процедура ПослеНачалаОбработкиПользователяИБ(ПользовательОбъект, ПараметрыОбработки) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Тогда @@ -481,6 +469,13 @@ КонецПроцедуры // Вызывается из процедуры ЗавершитьОбработкуПользователяИБ для поддержки модели сервиса. +// +// Параметры: +// ПользовательОбъект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// ПараметрыОбработки - Структура +// ОбновлятьРоли - Булево - возвращаемое значение. +// Процедура ПриЗавершенииОбработкиПользователяИБ(ПользовательОбъект, ПараметрыОбработки, ОбновлятьРоли) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Тогда @@ -520,12 +515,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистемы БСП "РаботаВМоделиСервиса" -// Вызывается при определении псевдонима пользователя для отображения в интерфейсе. -// -// Параметры: -// ИдентификаторПользователя - УникальныйИдентификатор, -// Псевдоним - Строка - псевдоним пользователя. -// +// См. ИнтеграцияПодсистемБСП.ПриОпределенииПсевдонимаПользователя Процедура ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним) Экспорт Если ПользовательЗарегистрированКакНеразделенный(ИдентификаторПользователя) Тогда @@ -538,12 +528,7 @@ // Обработчики событий подсистемы БТС "ВыгрузкаЗагрузкаДанных" - выгрузка // и загрузка пользователей информационной базы. -// Заполняет массив типов, для которых при выгрузке необходимо использовать аннотацию -// ссылок в файлах выгрузки. -// -// Параметры: -// Типы - Массив из ОбъектМетаданных -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке. Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт Обработки.ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных.ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке( @@ -551,104 +536,7 @@ КонецПроцедуры -// Вызывается при регистрации произвольных обработчиков выгрузки данных. -// -// Параметры: -// ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется -// дополнить эту таблицу значений информацией о регистрируемых произвольных -// обработчиках выгрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных - при выгрузке данных которого должен -// вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль - общий модуль, в котором реализован произвольный -// обработчик выгрузки данных. Набор экспортных процедур, которые должны -// быть реализованы в обработчике, зависит от установки значений следующих -// колонок таблицы значений, -// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных, -// поддерживаемого обработчиком, -// ПередВыгрузкойТипа - Булево - флаг необходимости вызова обработчика перед -// выгрузкой всех объектов информационной базы, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередВыгрузкойТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПередВыгрузкойТипа() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных - перед выгрузкой данных которого -// был вызван обработчик, -// Отказ - Булево - если в процедуре ПередВыгрузкойТипа() установить значение -// данного параметра равным Истина - выгрузка объектов, соответствующих -// текущему объекту метаданных, выполняться не будет. -// ПередВыгрузкойОбъекта - Булево - флаг необходимости вызова обработчика перед -// выгрузкой конкретного объекта информационной базы. Если присвоено значение -// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура -// ПередВыгрузкойОбъекта(), поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы - -// менеджер выгрузки текущего объекта. Подробнее см. комментарий к программному интерфейсу обработки -// ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы. Параметр передается только при вызове -// процедур обработчиков, для которых при регистрации указана версия не ниже 1.0.0.1, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПередВыгрузкойОбъекта() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// Объект - КонстантаМенеджерЗначения.* -// - СправочникОбъект.* -// - ДокументОбъект.* -// - БизнесПроцессОбъект.* -// - ЗадачаОбъект.* -// - ПланСчетовОбъект.* -// - ПланОбменаОбъект.* -// - ПланВидовХарактеристикОбъект.* -// - ПланВидовРасчетаОбъект.* -// - РегистрСведенийНаборЗаписей.* -// - РегистрНакопленияНаборЗаписей.* -// - РегистрБухгалтерииНаборЗаписей.* -// - РегистрРасчетаНаборЗаписей.* -// - ПоследовательностьНаборЗаписей.* -// - ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, перед выгрузкой которого был вызван обработчик. -// Значение, переданное в процедуру ПередВыгрузкойОбъекта() в качестве значения параметра -// Объект может быть модифицировано внутри обработчика ПередВыгрузкойОбъекта(), при -// этом внесенные изменения будут отражены в сериализации объекта в файлах выгрузки, но -// не будут зафиксированы в информационной базе -// Артефакты - Массив из ОбъектXDTO - набор дополнительной информации, логически неразрывно -// связанной с объектом, но не являющейся его частью (артефакты объекта). Артефакты должны -// сформированы внутри обработчика ПередВыгрузкойОбъекта() и добавлены в массив, переданный -// в качестве значения параметра Артефакты. Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. В дальнейшем -// артефакты, сформированные в процедуре ПередВыгрузкойОбъекта(), будут доступны в процедурах -// обработчиков загрузки данных (см. комментарий к процедуре ПриРегистрацииОбработчиковЗагрузкиДанных(). -// Отказ - Булево - если в процедуре ПередВыгрузкойОбъекта() установить значение -// данного параметра равным Истина - выгрузка объекта, для которого был вызван обработчик, -// выполняться не будет. -// ПослеВыгрузкиТипа() - Булево - флаг необходимости вызова обработчика после выгрузки всех -// объектов информационной базы, относящихся к данному объекту метаданных. Если присвоено значение -// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура -// ПослеВыгрузкиТипа(), поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПослеВыгрузкиТипа() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных - после выгрузки данных которого -// был вызван обработчик. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт Обработки.ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных.ПриРегистрацииОбработчиковВыгрузкиДанных( @@ -656,144 +544,7 @@ КонецПроцедуры -// Вызывается при регистрации произвольных обработчиков загрузки данных. -// -// Параметры: -// ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется -// дополнить эту таблицу значений информацией о регистрируемых произвольных -// обработчиках загрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных - при загрузке данных которого должен -// вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль - общий модуль, в котором реализован произвольный -// обработчик загрузки данных. Набор экспортных процедур, которые должны -// быть реализованы в обработчике, зависит от установки значений следующих -// колонок таблицы значений, -// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных, -// поддерживаемого обработчиком, -// ПередСопоставлениемСсылок - Булево - флаг необходимости вызова обработчика перед -// сопоставлением ссылок (в исходной ИБ и в текущей), относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередСопоставлениемСсылок(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных - перед сопоставлением ссылок которого -// был вызван обработчик, -// СтандартнаяОбработка - Булево - если процедуре ПередСопоставлениемСсылок() -// установить значение данного параметра равным Ложь, вместо стандартного -// сопоставления ссылок (поиск объектов в текущей ИБ с теми же значениями -// естественного ключа, которые были выгружены из ИБ-источника) будет -// вызвана функция СопоставитьСсылки() общего модуля, в процедуре -// ПередСопоставлениемСсылок() которого значение параметра СтандартнаяОбработка -// было установлено равным Ложь. -// Параметры функции СопоставитьСсылки(): -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// ТаблицаИсходныхСсылок - ТаблицаЗначений - содержащая информацию о ссылках, -// выгруженных из исходной ИБ. Колонки: -// ИсходнаяСсылка - ЛюбаяСсылка - ссылка объекта исходной ИБ, которую требуется -// сопоставить c ссылкой в текущей ИБ, -// Остальные колонки равным полям естественного ключа объекта, которые в -// процессе выгрузки данных были переданы в функцию -// Обработка.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы.ТребуетсяСопоставитьСсылкуПриЗагрузке() -// Возвращаемое значение функции СопоставитьСсылки() - ТаблицаЗначений, колонки: -// ИсходнаяСсылка - ЛюбаяСсылка - ссылка объекта, выгруженная из исходной ИБ, -// Ссылка - ЛюбаяСсылка - сопоставленная исходной ссылка в текущей ИБ. -// Отказ - Булево - если в процедуре ПередСопоставлениемСсылок() установить значение -// данного параметра равным Истина - сопоставление ссылок, соответствующих -// текущему объекту метаданных, выполняться не будет. -// ПередЗагрузкойТипа - Булево - флаг необходимости вызова обработчика перед -// загрузкой всех объектов данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередЗагрузкойТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных - перед загрузкой всех данных которого -// был вызван обработчик, -// Отказ - Булево - если в процедуре ПередЗагрузкойТипа() установить значение данного -// параметра равным Истина - загрузка всех объектов данных соответствующих текущему -// объекту метаданных выполняться не будет. -// ПередЗагрузкойОбъекта - Булево - флаг необходимости вызова обработчика перед -// загрузкой объекта данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередЗагрузкойОбъекта(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.* -// - СправочникОбъект.* -// - ДокументОбъект.* -// - БизнесПроцессОбъект.* -// - ЗадачаОбъект.* -// - ПланСчетовОбъект.* -// - ПланОбменаОбъект.* -// - ПланВидовХарактеристикОбъект.* -// - ПланВидовРасчетаОбъект.* -// - РегистрСведенийНаборЗаписей.* -// - РегистрНакопленияНаборЗаписей.* -// - РегистрБухгалтерииНаборЗаписей.* -// - РегистрРасчетаНаборЗаписей.* -// - ПоследовательностьНаборЗаписей.* -// - ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, перед загрузкой которого был вызван обработчик. -// Значение, переданное в процедуру ПередЗагрузкойОбъекта() в качестве значения параметра -// Объект может быть модифицировано внутри процедуры обработчика ПередЗагрузкойОбъекта(). -// Артефакты - Массив из ОбъектXDTO - дополнительные данные, логически неразрывно связанные -// с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах -// ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре -// ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. -// Отказ - Булево - если в процедуре ПередЗагрузкойОбъекта() установить значение данного -// параметра равным Истина - загрузка объекта данных выполняться не будет. -// ПослеЗагрузкиОбъекта - Булево - флаг необходимости вызова обработчика после -// загрузки объекта данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПослеЗагрузкиОбъекта(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.* -// - СправочникОбъект.* -// - ДокументОбъект.* -// - БизнесПроцессОбъект.* -// - ЗадачаОбъект.* -// - ПланСчетовОбъект.* -// - ПланОбменаОбъект.* -// - ПланВидовХарактеристикОбъект.* -// - ПланВидовРасчетаОбъект.* -// - РегистрСведенийНаборЗаписей.* -// - РегистрНакопленияНаборЗаписей.* -// - РегистрБухгалтерииНаборЗаписей.* -// - РегистрРасчетаНаборЗаписей.* -// - ПоследовательностьНаборЗаписей.* -// - ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, после загрузки которого был вызван обработчик. -// Артефакты - Массив из ОбъектXDTO - дополнительные данные, логически неразрывно связанные -// с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах -// ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре -// ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. -// ПослеЗагрузкиТипа - Булево - флаг необходимости вызова обработчика после -// загрузки всех объектов данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПослеЗагрузкиТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных - после загрузки всех объектов которого -// был вызван обработчик. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковЗагрузкиДанных. Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт Обработки.ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных.ПриРегистрацииОбработчиковЗагрузкиДанных( @@ -801,18 +552,7 @@ КонецПроцедуры -// Вызывается перед загрузкой пользователя информационной базы. -// -// Параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализация - ОбъектXDTO - ОбъектXDTO {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}InfoBaseUser, -// сериализация пользователя информационной базы, -// ПользовательИБ - ПользовательИнформационнойБазы - десериализованный из выгрузки, -// Отказ - Булево - при установке значения данного параметры внутри этой процедуры в -// значение Ложь загрузка пользователя информационной базы будет пропущена. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗагрузкеПользователяИнформационнойБазы. Процедура ПриЗагрузкеПользователяИнформационнойБазы(Контейнер, Сериализация, ПользовательИБ, Отказ) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Тогда @@ -829,16 +569,7 @@ КонецПроцедуры -// Вызывается после загрузки пользователя информационной базы. -// -// Параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализация - ОбъектXDTO - ОбъектXDTO {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}InfoBaseUser, -// сериализация пользователя информационной базы, -// ПользовательИБ - ПользовательИнформационнойБазы - десериализованный из выгрузки. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиПользователяИнформационнойБазы. Процедура ПослеЗагрузкиПользователяИнформационнойБазы(Контейнер, Сериализация, ПользовательИБ) Экспорт Если НЕ Контейнер.ДополнительныеСвойства.Свойство("СоответствиеПользователей") Тогда @@ -849,13 +580,7 @@ КонецПроцедуры -// Вызывается после загрузки всех пользователей информационной базы. -// -// Параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеЗагрузкиПользователейИнформационнойБазы. Процедура ПослеЗагрузкиПользователейИнформационнойБазы(Контейнер) Экспорт Если Контейнер.ДополнительныеСвойства.Свойство("СоответствиеПользователей") Тогда @@ -912,7 +637,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// см. НовыеДействияСПользователемСервиса. +// см. НовыеДействияСПользователемСервиса // Функция ДействияСПользователемСервисаПриНедоступностиНастройкиПользователей() @@ -943,7 +668,7 @@ // Пользователь - СправочникСсылка.Пользователи - пользователь. // // Возвращаемое значение: -// см. НовыеДействияСПользователемСервиса. +// см. НовыеДействияСПользователемСервиса // Функция ДействияССуществующимПользователемСервиса(Знач Пользователь) @@ -971,7 +696,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// см. НовыеДействияСПользователемСервиса. +// см. НовыеДействияСПользователемСервиса // Функция ДействияСНовымПользователемСервиса() @@ -1164,7 +889,7 @@ // базы в текущей области данных. // // Параметры: -// Пользователь - СправочникСсылка.Пользователи; +// Пользователь - СправочникСсылка.Пользователи // // Возвращаемое значение: // Булево @@ -1234,7 +959,8 @@ СписокОбъектов = Фабрика.Создать( Фабрика.Тип("http://www.1c.ru/SaaS/ApplicationAccess", "ObjectsList")); - СписокОбъектов.Item.Добавить(ИнформацияПользователя); + ВидыКИ = СписокОбъектов.Item; // СписокXDTO + ВидыКИ.Добавить(ИнформацияПользователя); ТипКИПользователя = Фабрика.Тип("http://www.1c.ru/SaaS/ApplicationAccess", "UserContact"); @@ -1242,7 +968,7 @@ ВидКИ = Фабрика.Создать(ТипКИПользователя); ВидКИ.UserServiceID = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ИдентификаторПользователяСервиса"); ВидКИ.ContactType = КлючИЗначение.Значение; - СписокОбъектов.Item.Добавить(ВидКИ); + ВидыКИ.Добавить(ВидКИ); КонецЦикла; Возврат СписокОбъектов; @@ -1339,7 +1065,8 @@ // Возвращает полное имя служебного пользователя для отображения в интерфейсах. // // Параметры: -// Идентификатор - уникальный идентификатор пользователя ИБ или СправочникСсылка.Пользователи. +// Идентификатор - УникальныйИдентификатор +// - СправочникСсылка.Пользователи // // Возвращаемое значение: // Строка diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl index e1bde69de..a4c91c311 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl @@ -35,7 +35,7 @@ // ТаблицаЗначений: // * Коллекция - Строка - имя коллекции метаданных, // * Объект - Строка - имя объекта метаданных, -// * Измерения - Массив(Строка) - имена измерений. +// * Измерения - Массив из Строка - имена измерений. // Функция НаборыЗаписейСоСсылкамиНаПользователей() diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl index e30207248..580c9e489 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl @@ -13,21 +13,20 @@ // // Возвращает внутреннее описание разрешения на использование каталога файловой системы. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: // Адрес - Строка - адрес ресурса файловой системы, -// ЧтениеДанных - Булево - флаг, указывающий необходимость предоставления разрешения -// на чтение данных из данного каталога файловой системы, -// ЗаписьДанных - Булево - флаг, указывающий необходимость предоставления разрешения -// на запись данных в указанный каталог файловой системы, +// ЧтениеДанных - Булево - указывает необходимость предоставления разрешения +// на чтение данных из данного каталога файловой системы. +// ЗаписьДанных - Булево - указывает необходимость предоставления разрешения +// на запись данных в указанный каталог файловой системы. // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаИспользованиеКаталогаФайловойСистемы(Знач Адрес, Знач ЧтениеДанных = Ложь, Знач ЗаписьДанных = Ложь, Знач Описание = "") Экспорт @@ -48,20 +47,19 @@ КонецФункции // Возвращает внутреннее описание разрешения на использование каталога временных файлов. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: -// ЧтениеДанных - Булево - флаг, указывающий необходимость предоставления разрешения -// на чтение данных из каталога временных файлов, -// ЗаписьДанных - Булево - флаг, указывающий необходимость предоставления разрешения -// на запись данных в каталог временных файлов, +// ЧтениеДанных - Булево - указывает необходимость предоставления разрешения +// на чтение данных из каталога временных файлов. +// ЗаписьДанных - Булево - указывает необходимость предоставления разрешения +// на запись данных в каталог временных файлов. // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаИспользованиеКаталогаВременныхФайлов(Знач ЧтениеДанных = Ложь, Знач ЗаписьДанных = Ложь, Знач Описание = "") Экспорт @@ -70,20 +68,19 @@ КонецФункции // Возвращает внутреннее описание разрешения на использование каталога программы. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: -// ЧтениеДанных - Булево - флаг, указывающий необходимость предоставления разрешения -// на чтение данных из каталога программы, -// ЗаписьДанных - Булево - флаг, указывающий необходимость предоставления разрешения -// на запись данных в каталог программы, +// ЧтениеДанных - Булево - указывает необходимость предоставления разрешения +// на чтение данных из каталога программы. +// ЗаписьДанных - Булево - указывает необходимость предоставления разрешения +// на запись данных в каталог программы. // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаИспользованиеКаталогаПрограммы(Знач ЧтениеДанных = Ложь, Знач ЗаписьДанных = Ложь, Знач Описание = "") Экспорт @@ -92,22 +89,21 @@ КонецФункции // Возвращает внутреннее описание разрешения на использование COM-класса. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: // ProgID - Строка - ProgID класса COM, с которым он зарегистрирован в системе. -// Например, "Excel.Application", +// Например, "Excel.Application". // CLSID - Строка - CLSID класса COM, с которым он зарегистрирован в системе. // ИмяКомпьютера - Строка - имя компьютера, на котором надо создать указанный объект. -// Если параметр опущен - объект будет создан на компьютере, на котором выполняется -// текущий рабочий процесс, +// Если не указано, то объект будет создан на компьютере, на котором выполняется +// текущий рабочий процесс. // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаСозданиеCOMКласса(Знач ProgID, Знач CLSID, Знач ИмяКомпьютера = "", Знач Описание = "") Экспорт @@ -124,19 +120,17 @@ КонецФункции // Возвращает внутреннее описание разрешения на использование внешней компоненты, поставляемой -// в общем макете конфигурации. +// в общем макете конфигурации. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: -// ИмяМакета - Строка - имя общего макета в конфигурации, в котором поставляется внешняя -// компонента, +// ИмяМакета - Строка - имя общего макета в конфигурации, в котором поставляется внешняя компонента. // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаИспользованиеВнешнейКомпоненты(Знач ИмяМакета, Знач Описание = "") Экспорт @@ -151,18 +145,17 @@ КонецФункции // Возвращает внутреннее описание разрешения на использование расширения конфигурации. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: -// Имя - Строка - имя расширения конфигурации, -// КонтрольнаяСумма - Строка - контрольная сумма расширения конфигурации, +// Имя - Строка - имя расширения конфигурации. +// КонтрольнаяСумма - Строка - контрольная сумма расширения конфигурации. // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаИспользованиеВнешнегоМодуля(Знач Имя, Знач КонтрольнаяСумма, Знач Описание = "") Экспорт @@ -178,6 +171,9 @@ КонецФункции // Возвращает внутреннее описание разрешения на использование приложения операционной системы. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: // ШаблонСтрокиЗапуска - Строка - шаблон строки запуска приложения. @@ -185,11 +181,7 @@ // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаИспользованиеПриложенияОперационнойСистемы(Знач ШаблонСтрокиЗапуска, Знач Описание = "") Экспорт @@ -204,6 +196,9 @@ КонецФункции // Возвращает внутреннее описание разрешения на использование интернет-ресурса. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: // Протокол - Строка - протокол, по которому выполняется взаимодействие с ресурсом. Допустимые значения: @@ -213,11 +208,7 @@ // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения, которое -// предназначено только для передачи в качестве параметра в функции: -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов, -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов. +// ОбъектXDTO // Функция РазрешениеНаИспользованиеИнтернетРесурса(Знач Протокол, Знач Адрес, Знач Порт = Неопределено, Знач Описание = "") Экспорт @@ -242,16 +233,15 @@ // Возвращает внутреннее описание разрешения на расширенную работу с данными (включая установку // привилегированного режима) для внешних модулей. +// Для передачи в качестве параметра в функции: +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов и +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов. // // Параметры: // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: -// ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// ОбъектXDTO // Функция РазрешениеНаИспользованиеПривилегированногоРежима(Знач Описание = "") Экспорт @@ -270,24 +260,30 @@ // Создает запрос на использование внешних ресурсов. // // Параметры: -// НовыеРазрешения - Массив - массив ОбъектовXDTO, соответствующих внутренним описаниям -// запрашиваемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые -// в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). +// НовыеРазрешения - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПриложенияОперационнойСистемы - +// запрашиваемые разрешения на доступ к внешним ресурсам. // Владелец - ЛюбаяСсылка - ссылка на объект информационной базы, с которой логически связаны запрашиваемые // разрешения. Например, все разрешения на доступ к каталогам томов хранения файлов логически связаны // с соответствующими элементами справочника ТомаХраненияФайлов, все разрешения на доступ к каталогам // обмена данными (или к другим ресурсам в зависимости от используемого транспорта обмена) логически // связаны с соответствующими узлами планов обмена и т.д. В том случае, если разрешение является логически // обособленным (например, предоставление разрешения регулируется значением константы с типом Булево) - -// рекомендуется использовать ссылку на элемент справочника ИдентификаторыОбъектовМетаданных, +// рекомендуется использовать ссылку на элемент справочника ИдентификаторыОбъектовМетаданных. // РежимЗамещения - Булево - определяет режим замещения ранее выданных разрешений для данного владельца. При // значении параметра равным Истина, помимо предоставления запрошенных разрешений в запрос будет добавлена // очистка всех разрешений, ранее запрошенных для этого же владельца. // // Возвращаемое значение: // УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания -// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. -// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). +// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова +// процедуры РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов. // Функция ЗапросНаИспользованиеВнешнихРесурсов(Знач НовыеРазрешения, Знач Владелец = Неопределено, Знач РежимЗамещения = Истина) Экспорт @@ -307,15 +303,21 @@ // обмена данными (или к другим ресурсам в зависимости от используемого транспорта обмена) логически // связаны с соответствующими узлами планов обмена и т.д. В том случае, если разрешение является логически // обособленным (например, отменяемые разрешения регулируется значением константы с типом Булево) - -// рекомендуется использовать ссылку на элемент справочника ИдентификаторыОбъектовМетаданных, -// ОтменяемыеРазрешения - Массив - массив ОбъектовXDTO, соответствующих внутренним описаниям -// отменяемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые -// в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). +// рекомендуется использовать ссылку на элемент справочника ИдентификаторыОбъектовМетаданных. +// ОтменяемыеРазрешения - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима +// - Массив из см. РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПриложенияОперационнойСистемы - +// отменяемые разрешения на доступ к внешним ресурсам. // // Возвращаемое значение: // УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания -// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. -// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). +// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова +// процедуры РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов. // Функция ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов(Знач Владелец, Знач ОтменяемыеРазрешения) Экспорт @@ -340,8 +342,8 @@ // // Возвращаемое значение: // УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания -// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. -// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). +// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова +// процедуры РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов. // Функция ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(Знач Владелец) Экспорт @@ -415,8 +417,8 @@ // // Возвращаемое значение: // ФиксированноеСоответствие из КлючИЗначение - контрольные суммы файлов: -// * Ключ - Строка - имя файла, -// * Значение - Строка - контрольная сумма. +// * Ключ - Строка - имя файла, +// * Значение - Строка - контрольная сумма. // Функция КонтрольныеСуммыФайловКомплектаВнешнейКомпоненты(Знач ИмяМакета) Экспорт @@ -435,7 +437,7 @@ // Возвращает имя профиля безопасности, предоставляющего привилегии кода конфигурации. // // Возвращаемое значение: -// Строка - имя профиля безопасности. +// Строка // Функция ПрофильБезопасностиИнформационнойБазы(ПроверкаИспользования = Ложь) Экспорт @@ -491,13 +493,20 @@ КонецФункции // Возвращает стандартные сетевые порты для Интернет-протоколов, инструменты для использования которых -// есть во встроенном языке 1С:Предприятия. Используется для определения сетевого порта в тех -// случаях, когда из прикладного кода запрашивается разрешение без указания сетевого порта. +// есть во встроенном языке 1С:Предприятия. Используется для определения сетевого порта в тех +// случаях, когда из прикладного кода запрашивается разрешение без указания сетевого порта. // // Возвращаемое значение: // ФиксированнаяСтруктура: -// * Ключ - Строка - имя Интернет-протокола, -// * Значение - Число - номер сетевого порта. +// * IMAP - Число - 143. +// * POP3 - Число - 110. +// * SMTP - Число - 25. +// * HTTP - Число - 80. +// * HTTPS - Число - 443. +// * FTP - Число - 21. +// * FTPS - Число - 21. +// * WS - Число - 80. +// * WSS - Число - 443. // Функция СтандартныеПортыИнтернетПротоколов() diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl index 31d195445..9db3c1ab3 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl @@ -77,10 +77,10 @@ // Создает запросы на использование внешних ресурсов для внешнего модуля. // // Параметры: -// ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются разрешения, -// НовыеРазрешения - Массив из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям -// запрашиваемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые -// в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). +// ПрограммныйМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются разрешения. +// НовыеРазрешения - Массив из ОбъектXDTO - внутренние описания запрашиваемых разрешений на доступ к внешним ресурсам. +// Предполагается, что все ОбъектыXDTO, передаваемые в качестве параметра, +// сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). // При запросе разрешений для внешних модулей добавление разрешений всегда выполняется в режиме замещения. // // Возвращаемое значение: @@ -166,16 +166,8 @@ // Применение запросов разрешений на использование внешних ресурсов. // -// Формирует представление разрешений на использование внешних ресурсов по таблицам разрешений. -// -// Параметры: -// Таблицы - Структура - таблицы разрешений, для которых формируется представление -// (см. ТаблицыРазрешений()). -// -// Возвращаемое значение: -// ТабличныйДокумент - представление разрешений на использование внешних ресурсов. -// -Функция ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ТипПрограммногоМодуля, Знач ИдентификаторПрограммногоМодуля, Знач ТипВладельца, Знач ИдентификаторВладельца, Знач Разрешения) Экспорт +Функция ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ТипПрограммногоМодуля, + Знач ИдентификаторПрограммногоМодуля, Знач ТипВладельца, Знач ИдентификаторВладельца, Знач Разрешения) Экспорт // АПК:326-выкл Транзакция используется для того, чтобы использовать регистр сведений ЗапросыРазрешений // как промежуточный кэш для расчета применения запросов на разрешение использование внешних ресурсов. @@ -450,21 +442,22 @@ // // Параметры: // Владелец - ЛюбаяСсылка - владелец разрешений на использование внешних ресурсов. -// (Неопределено при запросе разрешений для конфигурации, а не для объектов конфигурации), -// РежимЗамещения - Булево - режим замещения ранее предоставленных для владельца разрешений, +// (Неопределено при запросе разрешений для конфигурации, а не для объектов конфигурации). +// РежимЗамещения - Булево - режим замещения ранее предоставленных для владельца разрешений. // ДобавляемыеРазрешения - Массив из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям // запрашиваемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые -// в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(), +// в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). // УдаляемыеРазрешения - Массив из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям // отменяемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые -// в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(), -// ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются +// в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). +// ПрограммныйМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются // разрешения. (Неопределено при запросе разрешений для конфигурации, а не для внешних модулей). // // Возвращаемое значение: // УникальныйИдентификатор - идентификатор созданного запроса. // -Функция ЗапросИзмененияРазрешений(Знач Владелец, Знач РежимЗамещения, Знач ДобавляемыеРазрешения = Неопределено, Знач УдаляемыеРазрешения = Неопределено, Знач ПрограммныйМодуль = Неопределено) Экспорт +Функция ЗапросИзмененияРазрешений(Знач Владелец, Знач РежимЗамещения, Знач ДобавляемыеРазрешения = Неопределено, + Знач УдаляемыеРазрешения = Неопределено, Знач ПрограммныйМодуль = Неопределено) Экспорт СтандартнаяОбработка = Истина; Результат = Неопределено; @@ -494,7 +487,7 @@ // Только для внутреннего использования. // // Параметры: -// ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются +// ПрограммныйМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются // разрешения. (Неопределено при запросе разрешений для конфигурации, а не для внешних модулей). // // Возвращаемое значение: @@ -575,8 +568,8 @@ // Возвращает программный модуль, выполняющий функции менеджера внешнего модуля. // -// ВнешнийМодуль - ЛюбаяСсылка, ссылка, соответствующая внешнему модулю, для которого запрашиваются -// менеджер. +// Параметры: +// ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются менеджер. // // Возвращаемое значение: // ОбщийМодуль diff --git a/SSL/src/CommonModules/РаботаСАдресами/Module.bsl b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl index 2d17295cd..294510b9b 100644 --- a/SSL/src/CommonModules/РаботаСАдресами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl @@ -2620,17 +2620,19 @@ Возврат КодМуниципальногоРайона; КонецЕсли; - Если СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'м.р-н'")) = 0 Тогда + // АПК: 1297-выкл Данные ФИАС, не локализуются + Если СтрСравнить(ТипМуниципальногоРайона, "м.р-н") = 0 Тогда КодМуниципальногоРайона = "1"; - ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'г.о.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "г.о.") = 0 Тогда КодМуниципальногоРайона = "2"; - ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'вн.тер.'")) = 0 - Или СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'вн.тер. г.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "вн.тер.") = 0 + Или СтрСравнить(ТипМуниципальногоРайона, "вн.тер. г.") = 0 Тогда КодМуниципальногоРайона = "3"; - ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'мун. окр.'")) = 0 - Или СтрСравнить(ТипМуниципальногоРайона, НСтр("ru = 'м.о.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "мун. окр.") = 0 + Или СтрСравнить(ТипМуниципальногоРайона, "м.о.") = 0 Тогда КодМуниципальногоРайона = "4"; КонецЕсли; + // АПК: 1297-вкл Возврат КодМуниципальногоРайона; @@ -2651,18 +2653,17 @@ КодПоселения = ""; - Если СтрСравнить(ТипПоселения, НСтр("ru = 'г.п.'")) = 0 Тогда + // АПК: 1297-выкл Данные ФИАС, не локализуются + Если СтрСравнить(ТипПоселения, "г.п.") = 0 Или СтрСравнить(ТипПоселения, "г. п.") = 0 Тогда КодПоселения = "1"; - ИначеЕсли СтрСравнить(ТипПоселения, НСтр("ru = 'с.п.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипПоселения, "с.п.") = 0 Тогда КодПоселения = "2"; - ИначеЕсли СтрСравнить(ТипПоселения, НСтр("ru = 'меж.тер.'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипПоселения, "меж.тер.'") = 0 Тогда КодПоселения = "3"; - ИначеЕсли СтрСравнить(ТипПоселения, НСтр("ru = 'вн.р-н'")) = 0 Тогда + ИначеЕсли СтрСравнить(ТипПоселения, "вн.р-н'") = 0 Тогда КодПоселения = "4"; - ИначеЕсли СтрСравнить(ТипПоселения, НСтр("ru = 'г. п.'")) = 0 Тогда - // Обратная совместимость - КодПоселения = "1"; КонецЕсли; + // АПК: 1297-вкл Возврат КодПоселения; diff --git a/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl index 0b5d4ce0b..380a923eb 100644 --- a/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресамиКлиент/Module.bsl @@ -48,6 +48,21 @@ КонецПроцедуры +Функция ПредставлениеУровняБезСокращения(ИмяУровня) Экспорт + + Если СтрСравнить(ИмяУровня, "MunDistrict") = 0 + Или СтрСравнить(ИмяУровня, "Settlement") = 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция ЭтоАдминистративноТерриториальныйАдрес(ТипАдреса) Экспорт + Возврат СтрСравнить(ТипАдреса, РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес()) = 0; +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl index b46287d80..ca652ee15 100644 --- a/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl @@ -145,9 +145,6 @@ Возврат "Административно-территориальный"; КонецФункции -Функция ЭтоАдминистративноТерриториальныйАдрес(ТипАдреса) Экспорт - Возврат СтрСравнить(ТипАдреса, АдминистративноТерриториальныйАдрес()) = 0; -КонецФункции Функция МуниципальныйАдрес() Экспорт Возврат "Муниципальный"; @@ -670,6 +667,7 @@ Сокращения = Новый Соответствие; + // АПК:1036-выкл Данные из ФИАС (сокращения) Сокращения.Вставить("ВЛАДЕНИЕ", "влд."); Сокращения.Вставить("ГАРАЖ", "г-ж"); Сокращения.Вставить("ДОМ", "д."); @@ -694,6 +692,7 @@ Сокращения.Вставить("СТРОЕНИЕ", "стр."); Сокращения.Вставить("ТОРГОВЫЙ ЗАЛ", "торг.зал"); Сокращения.Вставить("ЦЕХ", "цех"); + // АПК:1036-вкл Возврат Сокращения; @@ -701,8 +700,12 @@ // Обратная совместимость // +// Возвращаемое значение: +// Строка +// Функция КраткоеНаписаниеМуниципальныхРайонов(Наименование, Сокращение) Экспорт + // АПК: 1297-выкл Данные ФИАС, не локализуются Если СтрСравнить(Сокращение, "г.о.") = 0 Тогда Наименование = СокрЛП(СтрЗаменить(Наименование, "Городской округ", "")); // @Non-NLS-1 КонецЕсли; @@ -719,15 +722,24 @@ Если СтрСравнить(Сокращение, "м.о.") = 0 Или СтрСравнить(Сокращение, "мун. окр.") = 0 Тогда // @Non-NLS-2 Наименование = СокрЛП(СтрЗаменить(Наименование, "Муниципальный округ", "")); // @Non-NLS-1 КонецЕсли; + // АПК: 1297-вкл Возврат Наименование; КонецФункции // Обратная совместимость +// +// Параметры: +// Наименование - Строка +// Сокращение - Строка +// +// Возвращаемое значение: +// Строка // Функция КраткоеНаписаниеПоселений(Наименование, Сокращение) Экспорт + // АПК: 1297-выкл Данные ФИАС, не локализуются Если СтрСравнить(Сокращение, "г.п.") Или СтрСравнить(Сокращение, "г. п.") = 0 Тогда // @Non-NLS-2 Наименование = СокрЛП(СтрЗаменить(Наименование, "Городское поселение", "")); // @Non-NLS-1 КонецЕсли; @@ -740,6 +752,7 @@ Если СтрСравнить(Сокращение, "меж.тер.") = 0 Тогда Наименование = СокрЛП(СтрЗаменить(Наименование, "Межселенная территория", "")); // @Non-NLS-1 КонецЕсли; + // АПК: 1297-вкл Возврат Наименование; @@ -747,17 +760,6 @@ #Область ПрочиеСлужебныеПроцедурыИФункции -Функция ПредставлениеУровняБезСокращения(ИмяУровня) Экспорт - - Если СтрСравнить(ИмяУровня, "MunDistrict") = 0 - Или СтрСравнить(ИмяУровня, "Settlement") = 0 Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - Функция ПредставлениеАдресаВСвободнойФорме(Знач Адрес, Знач ВключатьСтрануВПредставление) Если ВключатьСтрануВПредставление И Адрес.Свойство("Country") И НЕ ПустаяСтрока(Адрес.Country) Тогда diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl index d122071b7..352b261f8 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl @@ -197,9 +197,9 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда - Обработки["ЗагрузкаКурсовВалют"].ПриОпределенииНастроекРегламентныхЗаданий(Зависимости); + Обработки["ЗагрузкаКурсовВалют"].ПриОпределенииНастроекРегламентныхЗаданий(Настройки); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl index ecb3062f5..57e49a90b 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl @@ -35,7 +35,8 @@ // Вызывается при изменении способа установки курса валюты. // -// Валюта - СправочникСсылка.Валюты +// Параметры: +// Валюта - СправочникСсылка.Валюты // Процедура ЗапланироватьКопированиеКурсовВалюты(Знач Валюта) Экспорт diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl index 9b2d87fe0..ff203f11d 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl @@ -101,7 +101,7 @@ // параметров отправки. // // Параметры: -// ОбработчикРезультата - ОписаниеОповещение - процедура, в которую необходимо передать выполнение кода после проверки. +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать выполнение кода после проверки. // В качестве результата возвращается Истина, если есть доступная учетная // запись для отправки почты. Иначе возвращается Ложь. // diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl index d026a107f..3ba6f3bbe 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl @@ -48,7 +48,7 @@ // * Вложения - Соответствие из КлючИЗначение: // * ключ - Строка - наименование вложения // * значение - ДвоичныеДанные -// - АдресВоВременномХранилище - данные вложения; +// - Строка - адрес во временном хранилище двоичных данных вложения; // - Структура: // * ДвоичныеДанные - ДвоичныеДанные - двоичные данные вложения. // * Идентификатор - Строка - идентификатор вложения, используется для хранения картинок, @@ -61,7 +61,7 @@ // * УведомитьОДоставке - Булево - необходимость запроса уведомления о доставке. // * УведомитьОПрочтении - Булево - необходимость запроса уведомления о прочтении. // * ТипТекста - Строка -// - Перечисление.ТипыТекстовЭлектронныхПисем +// - ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем // - ТипТекстаПочтовогоСообщения - определяет тип // переданного теста допустимые значения: // HTML/ТипыТекстовЭлектронныхПисем.HTML - текст почтового сообщения в формате HTML; diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl index af85822d1..63cd3f22c 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl @@ -567,6 +567,13 @@ КонецФункции +// Параметры: +// УчетнаяЗапись - см. РаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения.УчетнаяЗапись +// ПараметрыЗагрузки - см. РаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения.ПараметрыЗагрузки +// +// Возвращаемое значение: +// см. РаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения +// Функция ЗагрузитьСообщения(Знач УчетнаяЗапись, Знач ПараметрыЗагрузки = Неопределено) Экспорт // Используется для проверки возможности входа на почтовый ящик. diff --git a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl index 2597f422a..b8a6e19c4 100644 --- a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl @@ -141,7 +141,7 @@ // * Служебный - Булево - признак того, что файл является служебным. // // Пример: -// Открытие нескольких файлов. +// // Открытие нескольких файлов. // ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла(); // ПараметрыДанныхФайла.ИдентификаторФормы = УникальныйИдентификатор; // Пока Выборка.Следующий() Цикл @@ -321,20 +321,18 @@ // // Параметры: // ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. -// ИнформацияОФайле - Структура - со свойствами: -// <обязательные> +// ИнформацияОФайле - Структура: // * АдресФайлаВоВременномХранилище - Строка - адрес новых двоичных данных файла. // * АдресВременногоХранилищаТекста - Строка - адрес новых двоичных данных текста, // извлеченного из файла. -// <необязательные> -// * ИмяБезРасширения - Строка - если свойство не указано или не заполнено, +// * ИмяБезРасширения - Строка - необязательное, если свойство не указано или не заполнено, // тогда не будет изменено. -// * ДатаМодификацииУниверсальная - Дата - дата последнего изменения файла, если +// * ДатаМодификацииУниверсальная - Дата - необязательное, дата последнего изменения файла, если // свойство не указано или не заполнено, тогда будет // установлена текущая дата сеанса. -// * Расширение - Строка - новое расширение файла. -// * Редактирует - ЛюбаяСсылка - новый пользователь, редактирующий файл. -// * Кодировка - Строка - кодировка, в которой сохранен файл. +// * Расширение - Строка - необязательное, новое расширение файла. +// * Редактирует - ЛюбаяСсылка - необязательное, новый пользователь, редактирующий файл. +// * Кодировка - Строка - необязательное, кодировка, в которой сохранен файл. // Список поддерживаемых кодировок см. в справке к методу // глобального контекста "ПолучитьДвоичныеДанныеИзСтроки". // @@ -493,7 +491,7 @@ // Инициализирует структуру параметров для добавления файла. // Для использования в РаботаСФайлами.ДобавитьВФайл. -// +// // Параметры: // ДополнительныеРеквизиты - Строка // - Массив - имена реквизитов присоединенного файла, перечисленные через @@ -524,9 +522,6 @@ // Значение по умолчанию - Неопределено. // * Служебный - Булево - если Истина, тогда файл будет скрыт от пользователей. // Значение по умолчанию - Ложь. -// * <Имя реквизита> - Произвольный - значение произвольного реквизита присоединенного файла, указанного -// в параметре ДополнительныеРеквизиты. -// Значение по умолчанию - Неопределено. // Функция ПараметрыДобавленияФайла(ДополнительныеРеквизиты = Неопределено) Экспорт @@ -2055,8 +2050,7 @@ Возврат; КонецЕсли; - РаботаСФайламиСлужебный.ПриЗаписиПрисоединенногоФайлаСервер( - Источник.ВладелецФайла, Источник.Ссылка); + РаботаСФайламиСлужебный.ПриЗаписиПрисоединенногоФайлаСервер(Источник.ВладелецФайла, Источник); РаботаСФайламиСлужебный.ОбновитьСостояниеОчередиИзвлеченияТекста( Источник.Ссылка, Источник.СтатусИзвлеченияТекста); diff --git a/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl index 7370f9a11..adb4fc46c 100644 --- a/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl @@ -667,7 +667,7 @@ // Том - СправочникСсылка.ТомаХраненияФайлов - том, путь к корневому каталогу которого необходимо получить. // // Возвращаемое значение: -// КорневойКаталог - Строка - полный путь к корневому каталогу тома. +// Строка - полный путь к корневому каталогу тома. // Функция ПолныйПутьТома(Том) Экспорт @@ -694,7 +694,7 @@ // Том - СправочникСсылка.ТомаХраненияФайлов - том, размер которого необходимо посчитать. // // Возвращаемое значение: -// РазмерФайловВТоме - Число - суммарный размер файлов в томе. +// Число - суммарный размер файлов в томе. // Функция ОбъемТома(Том) Экспорт @@ -963,7 +963,7 @@ // // Параметры: // СоответствиеПутейФайлов - Соответствие - соответствие УникальногоИдентификатора файла и пути на диске к файлу. -// ТипХраненияФайла - Перечисления.ТипыХраненияФайлов - тип хранения файлов. +// ТипХраненияФайла - ПеречислениеСсылка.ТипыХраненияФайлов - тип хранения файлов. // Процедура ДобавитьФайлыВТомаПриРазмещении(СоответствиеПутейФайлов, ТипХраненияФайла) @@ -992,7 +992,6 @@ Объект = СсылкаНаФайл.ПолучитьОбъект(); - ХранилищеФайла = Неопределено; Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда // В базе-приемнике файлы должны храниться в информационной базе - значит там их и разместим (даже если в исходной @@ -1515,7 +1514,7 @@ // Размер - Число - размер добавляемого файла в байтах. // // Возвращаемое значение: -// ТипХранения - ПеречислениеСсылка.ТипыХраненияФайлов - если способ хранения файлов в настройках +// ПеречислениеСсылка.ТипыХраненияФайлов - если способ хранения файлов в настройках // указан "ВТомахНаДиске", всегда возвращает значение "ВТомахНаДиске". Если способ хранения // файлов указан "ВИнформационнойБазеИТомахНаДиске", возвращает "ВИнформационнойБазе", если // файл соответствует параметрам хранения в информационной базе и "ВТомахНаДиске", если нет. diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl index 57006de24..88f2aa8b2 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl @@ -58,16 +58,18 @@ // Фильтр - Строка - фильтр выбираемого файла, например, картинки для номенклатуры. // ГруппаФайлов - ОпределяемыйТип.ПрисоединенныйФайл - группа справочника с файлами, в которую будет // добавлен новый файл. -// ОбработчикРезультата - ОписаниеОповещения - содержит описание процедуры, вызов которой будет произведен -// после добавления файлов со следующими параметрами: -// * Результат - Массив - ссылки на добавленные файлы. Если файлы не были добавлены, пустой массив. -// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ОбработчикРезультата - ОписаниеОповещения - описание процедуры, вызов которой будет произведен +// после добавления файлов со следующими параметрами: +// Результат - Массив - ссылки на добавленные файлы. Если файлы не были добавлены, пустой массив. +// ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. // Процедура ДобавитьФайлы(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач Фильтр = "", ГруппаФайлов = Неопределено, ОбработчикРезультата = Неопределено) Экспорт Если Не ЗначениеЗаполнено(ВладелецФайла) Тогда - ВызватьИсключение НСтр("ru = 'Не задано значение параметра ВладелецФайла в РаботаСФайламиКлиент.ДобавитьФайлы.'"); + Шаблон = НСтр("ru = 'Не задано значение параметра %1 в %2.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, "ВладелецФайла", + "РаботаСФайламиКлиент.ДобавитьФайлы"); КонецЕсли; Параметры = Новый Структура; @@ -92,7 +94,7 @@ // если он был добавлен, иначе Неопределено. // ** ФайлДобавлен - Булево - Истина, если файл добавлен. // ** ТекстОшибки - Строка - текст ошибки, если файл не был добавлен. -// * ДополнительныеПараметры - значение, которое было указано при создании объекта оповещения. +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании объекта оповещения. // // ВладелецФайла - ОпределяемыйТип.ВладелецПрисоединенныхФайлов - папка файлов или объект, к которому // требуется прикрепить добавляемый файл. @@ -101,9 +103,9 @@ // - Число - режим создания файла: // - Неопределено - показать диалог выбора режима создания файла. // - Число - создать файл указанным способом: -// * 1 - из шаблона (копированием другого файла); -// * 2 - с диска (из файловой системы клиента); -// * 3 - со сканера. +// 1 - из шаблона (копированием другого файла); +// 2 - с диска (из файловой системы клиента); +// 3 - со сканера. // // ПараметрыДобавления - Структура - дополнительные параметры добавления файлов: // * МаксимальныйРазмер - Число - ограничение на размер файла (в мегабайтах), загружаемого из файловой системы. @@ -118,7 +120,9 @@ ПараметрыДобавления = Неопределено) Экспорт Если Не ЗначениеЗаполнено(ВладелецФайла) Тогда - ВызватьИсключение НСтр("ru = 'Не задано значение параметра ВладелецФайла в РаботаСФайламиКлиент.ДобавитьФайл.'"); + Шаблон = НСтр("ru = 'Не задано значение параметра %1 в %2.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, "ВладелецФайла", + "РаботаСФайламиКлиент.ДобавитьФайл"); КонецЕсли; ПараметрыВыполнения = Новый Структура; @@ -169,9 +173,9 @@ // Отказ - Булево - параметр события ПередЗакрытием. // ЗавершениеРаботы - Булево - признак того, что форма закрывается в процессе завершения работы приложения. // ВладелецФайлов - ОпределяемыйТип.ВладелецПрисоединенныхФайлов - папка файлов или объект, к которому присоединены -// файлы. +// файлы. // ИмяРеквизита - Строка - имя реквизита типа Булево, в котором хранится признак того, -// что вопрос уже выводился. +// что вопрос уже выводился. // // Пример: // @@ -229,7 +233,9 @@ ОписаниеОповещенияОЗакрытии = Неопределено) Экспорт Если Не ЗначениеЗаполнено(ВладелецФайла) Тогда - ВызватьИсключение НСтр("ru = 'Не задано значение параметра ВладелецФайла в РаботаСФайламиКлиент.СкопироватьФайл.'"); + Шаблон = НСтр("ru = 'Не задано значение параметра %1 в %2.'"); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, "ВладелецФайла", + "РаботаСФайламиКлиент.СкопироватьФайл"); КонецЕсли; ЭтоФайлы = ТипЗнч(ФайлОснование) = Тип("СправочникСсылка.Файлы"); @@ -295,10 +301,10 @@ // Параметры: // ДанныеФайла - см. РаботаСФайлами.ДанныеФайла. // ОбработчикЗавершения - ОписаниеОповещения -// - Неопределено - содержит описание процедуры, которая -// будет вызвана после завершения со следующими параметрами: -// * ПутьКФайлу - Строка - полный путь к сохраненному файлу. -// * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. +// - Неопределено - описание процедуры, которая +// будет вызвана после завершения со следующими параметрами: +// ПутьКФайлу - Строка - полный путь к сохраненному файлу. +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. // Процедура СохранитьФайлКак(Знач ДанныеФайла, ОбработчикЗавершения = Неопределено) Экспорт @@ -318,13 +324,13 @@ // ЭлементФормы - ТаблицаФормы // - ПолеФормы - элемент формы, которому будет отправлено // оповещение о выборе. -// СтандартнаяОбработка - Булево - (возвращаемое значение), всегда устанавливается в Ложь. +// СтандартнаяОбработка - Булево - возвращаемое значение. Всегда устанавливается в Ложь. // ОписаниеОповещенияОВыборе - ОписаниеОповещения - описание процедуры, которая будет вызвана при закрытии формы -// со следующими параметрами: -// * ЗначениеВыбора - ОпределяемыйТип.ПрисоединенныйФайл -// - Неопределено - если произошел выбор, тогда будет -// возвращено значение выбора. Иначе - Неопределено. -// * ДополнительныеПараметры - Произвольный - значение, указанное при создании ОписаниеОповещенияОЗакрытии. +// со следующими параметрами: +// ЗначениеВыбора - ОпределяемыйТип.ПрисоединенныйФайл +// - Неопределено - если произошел выбор, тогда будет +// возвращено значение выбора. Иначе - Неопределено. +// ДополнительныеПараметры - Произвольный - значение, указанное при создании ОписаниеОповещенияОЗакрытии. // Процедура ОткрытьФормуВыбораФайлов(Знач ВладелецФайлов, Знач ЭлементФормы, СтандартнаяОбработка = Ложь, ОписаниеОповещенияОВыборе = Неопределено) Экспорт @@ -352,7 +358,7 @@ // // Параметры: // ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. -// СтандартнаяОбработка - Булево - (возвращаемое значение) всегда устанавливается в Ложь. +// СтандартнаяОбработка - Булево - возвращаемое значение. Всегда устанавливается в Ложь. // ДополнительныеПараметры - Структура - параметры открытия формы. // ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, которая будет вызвана при закрытии формы, // со следующими параметрами: @@ -388,7 +394,7 @@ // // Параметры: // Файлы - ОпределяемыйТип.ПрисоединенныйФайл -// - Массив - ссылка или массив ссылок на объекты с файлами. +// - Массив из ОпределяемыйТип.ПрисоединенныйФайл // ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, во временное хранилище // которой будет помещен файл. // @@ -497,8 +503,8 @@ // Параметры: // Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения файла в // рабочий каталог пользователя. В качестве результата возвращается структура со свойствами: -// * ПолноеИмяФайла - Строка - полное имя файла (с путем). -// * ОписаниеОшибки - Строка - текст ошибки, если получить файл не удалось. +// ПолноеИмяФайла - Строка - полное имя файла (с путем). +// ОписаниеОшибки - Строка - текст ошибки, если получить файл не удалось. // // ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. // ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, во временное хранилище @@ -522,8 +528,8 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение, которое выполняется после помещения файла в -// хранилище файлов. В качестве результата возвращается структура со свойствами: -// * ОписаниеОшибки - Строка - текст ошибки, если поместить файл не удалось. +// хранилище файлов. В качестве результата возвращается структура со свойством: +// ОписаниеОшибки - Строка - текст ошибки, если поместить файл не удалось. // // ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. // ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, @@ -764,9 +770,9 @@ Форма.Закрыть(); - Для Каждого ОкноКП Из ПолучитьОкна() Цикл + Для Каждого ОкноПриложения Из ПолучитьОкна() Цикл - Содержимое = ОкноКП.ПолучитьСодержимое(); + Содержимое = ОкноПриложения.ПолучитьСодержимое(); Если Содержимое = Неопределено Тогда Продолжить; @@ -775,7 +781,7 @@ Если Содержимое.ИмяФормы = "Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл" Тогда Если Содержимое.Параметры.Свойство("ПрисоединенныйФайл") И Содержимое.Параметры.ПрисоединенныйФайл = ПрисоединенныйФайл Тогда - ОкноКП.Активизировать(); + ОкноПриложения.Активизировать(); Возврат; КонецЕсли; КонецЕсли; @@ -794,54 +800,49 @@ // Процедура предназначена для печати файла соответствующим приложением // -// Параметры -// ДанныеФайла - Структура - данные файла. Описание см. РаботаСФайлами.ДанныеФайла. -// ИмяОткрываемогоФайла - Строка - полное имя файла. +// Параметры: +// ДанныеФайла - см. РаботаСФайлами.ДанныеФайла. +// ИмяОткрываемогоФайла - Строка. // Процедура НапечататьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла) #Если МобильныйКлиент Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа не поддерживается в мобильном клиенте.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа возможна только из приложения для Windows или Linux.'")); Возврат; #Иначе - РасширенияИсключения = - " m3u, m4a, mid, midi, mp2, mp3, mpa, rmi, wav, wma, - | 3g2, 3gp, 3gp2, 3gpp, asf, asx, avi, m1v, m2t, m2ts, m2v, m4v, mkv, mov, mp2v, mp4, mp4v, mpe, mpeg, mts, vob, wm, wmv, wmx, wvx, - | 7z, zip, rar, arc, arh, arj, ark, p7m, pak, package, - | app, com, exe, jar, dll, res, iso, isz, mdf, mds, - | cf, dt, epf, erf"; + " m3u, m4a, mid, midi, mp2, mp3, mpa, rmi, wav, wma, + | 3g2, 3gp, 3gp2, 3gpp, asf, asx, avi, m1v, m2t, m2ts, m2v, m4v, mkv, mov, mp2v, mp4, mp4v, mpe, mpeg, mts, vob, wm, wmv, wmx, wvx, + | 7z, zip, rar, arc, arh, arj, ark, p7m, pak, package, + | app, com, exe, jar, dll, res, iso, isz, mdf, mds, + | cf, dt, epf, erf"; Расширение = НРег(ДанныеФайла.Расширение); Если СтрНайти(РасширенияИсключения, " " + Расширение + ",") > 0 Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа не поддерживается.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа недоступна.'")); Возврат; ИначеЕсли Расширение = "grs" Тогда Схема = Новый ГрафическаяСхема; Схема.Прочитать(ИмяОткрываемогоФайла); Схема.Напечатать(); - Иначе - - Попытка - - Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ИмяОткрываемогоФайла = СтрЗаменить(ИмяОткрываемогоФайла, "/", "\"); - КонецЕсли; - - НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла); - - Исключение - - Инфо = ИнформацияОбОшибке(); - ПоказатьПредупреждение(,СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Описание=""%1""'"), - КраткоеПредставлениеОшибки(Инфо))); - - КонецПопытки; - + Возврат; КонецЕсли; + Попытка + + Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда + ИмяОткрываемогоФайла = СтрЗаменить(ИмяОткрываемогоФайла, "/", "\"); + КонецЕсли; + + НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла); + + Исключение + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось распечатать файл по причине: + |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()))); + + КонецПопытки; #КонецЕсли КонецПроцедуры @@ -849,9 +850,9 @@ // Процедура печати Файла // // Параметры: -// ОбработчикРезультата - ОписаниеОповещения для дальнейшего вызова. +// ОбработчикРезультата - ОписаниеОповещения // ПараметрыВыполнения - Структура: -// * НомерФайла - Число - номер текущего файла, +// * НомерФайла - Число - номер текущего файла. // * ДанныеФайла - Структура // * УникальныйИдентификатор - УникальныйИдентификатор. // @@ -868,9 +869,7 @@ #Если ВебКлиент Тогда Если ПараметрыВыполнения.ДанныеФайла.Расширение <> "mxl" Тогда - Текст = НСтр("ru = 'Необходимо сохранить файл на компьютер, после чего выполнить - |печать при помощи приложения, предназначенного - |для работы с данным файлом.'"); + Текст = НСтр("ru = 'Необходимо сохранить файл на компьютер, после чего распечатать его при помощи приложения, предназначенного для работы с данным файлом.'"); ПоказатьПредупреждение(, Текст); Возврат; КонецЕсли; @@ -901,10 +900,13 @@ // Процедура печати Файла после получения на диск // // Параметры: +// Результат - Структура: +// * ФайлПолучен - Булево +// * ПолноеИмяФайла - Строка // ПараметрыВыполнения - Структура: -// * НомерФайла - Число - номер текущего файла, -// * ДанныеФайла - Структура -// * УникальныйИдентификатор - УникальныйИдентификатор. +// * НомерФайла - Число - номер текущего файла. +// * ДанныеФайла - Структура +// * УникальныйИдентификатор - УникальныйИдентификатор. // Процедура НапечататьФайлПослеПолученияВерсииВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт @@ -927,24 +929,95 @@ // Выполняет печать файла внешним приложением. // -// Параметры -// ИмяОткрываемогоФайла - Строка - полное имя файла. +// Параметры: +// ИмяОткрываемогоФайла - Строка // Процедура НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла) -#Если Не МобильныйКлиент Тогда Если Не ЗначениеЗаполнено(ИмяОткрываемогоФайла) Тогда Возврат; КонецЕсли; +#Если Не МобильныйКлиент Тогда Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда Shell = Новый COMОбъект("Shell.Application"); Shell.ShellExecute(ИмяОткрываемогоФайла, "", "", "print", 1); + ИначеЕсли ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ИмяОткрываемогоФайла", ИмяОткрываемогоФайла); + НачалоПечатиLinux = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаНачалоПечатиLinux", + ЭтотОбъект, ДополнительныеПараметры); + ПроверитьПрограммаLinuxУстановлена("Unoconv", НачалоПечатиLinux); + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа возможна только из приложения для Windows или Linux.'")); + Возврат; КонецЕсли; #КонецЕсли КонецПроцедуры +Процедура ПроверитьПрограммаLinuxУстановлена(ИмяПрограммы, Оповещение) + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Оповещение", Оповещение); + ПрограммаLinuxУстановленаЗавершение = Новый ОписаниеОповещения("ПроверитьПрограммаLinuxУстановленаЗавершение", + ЭтотОбъект, ДополнительныеПараметры); + + ПараметрыЗапускаПрограммы = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); + ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокВывода", Истина); + ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); + ПараметрыЗапускаПрограммы.Вставить("Оповещение", ПрограммаLinuxУстановленаЗавершение); + + ФайловаяСистемаКлиент.ЗапуститьПрограмму("dpkg -s '" + Строка(ИмяПрограммы) + "'", ПараметрыЗапускаПрограммы); + +КонецПроцедуры + +Процедура ПроверитьПрограммаLinuxУстановленаЗавершение(Результат, Параметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + РезультатПроцедуры = СтрНайти(Результат.ПотокВывода, "Status: install ok installed") <> Ложь; + ВыполнитьОбработкуОповещения(Параметры.Оповещение, РезультатПроцедуры); + +КонецПроцедуры + +Процедура НапечататьИзПриложенияПоИмениФайлаНачалоПечатиLinux(Результат, Параметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Результат = Ложь Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Требуется установка программы ""Unoconv"" в системе'")); + Возврат; + КонецЕсли; + + ЗавершениеПечатиLinux = Новый ОписаниеОповещения("НапечататьИзПриложенияПоИмениФайлаЗавершениеПечатиLinux", ЭтотОбъект); + + ПараметрыЗапускаПрограммы = ФайловаяСистемаКлиент.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаПрограммы.Вставить("ДождатьсяЗавершения", Истина); + ПараметрыЗапускаПрограммы.Вставить("ПолучитьПотокОшибок", Истина); + ПараметрыЗапускаПрограммы.Вставить("Оповещение", ЗавершениеПечатиLinux); + + ФайловаяСистемаКлиент.ЗапуститьПрограмму("unoconv --stdout '" + Параметры.ИмяОткрываемогоФайла + "' |lpr", ПараметрыЗапускаПрограммы); + +КонецПроцедуры + +Процедура НапечататьИзПриложенияПоИмениФайлаЗавершениеПечатиLinux(Результат, Параметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не Результат.ПриложениеЗапущено Тогда + ПоказатьПредупреждение(, Результат.ОписаниеОшибки); + КонецЕсли; + +КонецПроцедуры + Процедура ПоказатьВопросУстановкиКомпонентыСканирования(Результат, КомпонентаУстановлена) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl index 847183786..3d496240e 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl @@ -137,7 +137,7 @@ // // Параметры: // ДанныеФайла - Структура - структура с данными файла. -// СтрокаОшибки - Строка - (возвращаемое значение) - если файл занять нельзя, +// СтрокаОшибки - Строка - возвращаемое значение. Если файл занять нельзя, // тогда содержит описание ошибки. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl index c186a22a3..f61dc7e65 100644 --- a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl @@ -12,12 +12,12 @@ // // Параметры: // Настройки - Структура: -// * НеОчищатьФайлы - Массив - объекты, файлы которых не должны выводиться в настройках очистки файлов -// (например, служебные документы). -// * НеСинхронизироватьФайлы - Массив - объекты, файлы которых не должны выводиться в настройках синхронизации -// с облачными сервисами (например, служебные документы). -// * НеСоздаватьФайлыПоШаблону - Массив - объекты, для файлов которых отключена возможность создавать файлы -// по шаблонам. +// * НеОчищатьФайлы - Массив из ОбъектМетаданных - объекты, файлы которых не должны выводиться в настройках очистки +// файлов (например, служебные документы). +// * НеСинхронизироватьФайлы - Массив из ОбъектМетаданных - объекты, файлы которых не должны выводиться в настройках +// синхронизации с облачными сервисами (например, служебные документы). +// * НеСоздаватьФайлыПоШаблону - Массив из ОбъектМетаданных - объекты, для файлов которых отключена возможность +// создавать файлы по шаблонам. // // Пример: // Настройки.НеОчищатьФайлы.Добавить(Метаданные.Справочники._ДемоНоменклатура); diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl index 3b2744a57..25197756e 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl @@ -719,7 +719,7 @@ #Область ОчисткаНенужныхФайлов -Функция ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение, ДанныеДляОтчета = Ложь) Экспорт +Функция ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение) Экспорт ПолноеИмяСправочникаФайлов = Настройка.ТипВладельцаФайла.ПолноеИмя; МетаданныеОбъектаФайлов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяСправочникаФайлов); @@ -729,100 +729,76 @@ ПолноеИмяСправочникаВерсийФайлов = СправочникВерсийФайлов.ПолноеИмя; Если Настройка.ПериодОчистки <> Перечисления.ПериодОчисткиФайлов.ПоПравилу Тогда - Если ДанныеДляОтчета Тогда - ТекстЗапроса = + ТекстЗапроса = "ВЫБРАТЬ | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, - | ВерсииФайлов.Размер /1024 /1024 КАК ОбъемНенужныхФайлов"; - Иначе - ТекстЗапроса = - "ВЫБРАТЬ + | ВерсииФайлов.Размер /1024 /1024 КАК ОбъемНенужныхФайлов, | Файлы.Ссылка КАК ФайлСсылка, - | ВерсииФайлов.Ссылка КАК ВерсияСсылка"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - |ИЗ - | " + ПолноеИмяСправочникаФайлов + " КАК Файлы - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ " + ПолноеИмяСправочникаВерсийФайлов + " КАК ВерсииФайлов - | ПО Файлы.Ссылка = ВерсииФайлов.Владелец - |ГДЕ - | ВерсииФайлов.ДатаСоздания <= &ПериодОчистки - | И НЕ Файлы.ПометкаУдаления - | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца - | И ВЫБОР - | КОГДА ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | ТОГДА ВерсииФайлов.Том <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) - | ИЛИ (ВЫРАЗИТЬ(ВерсииФайлов.ПутьКФайлу КАК СТРОКА(100))) <> """" - | ИНАЧЕ ИСТИНА - | КОНЕЦ - | "; + | ВерсииФайлов.Ссылка КАК ВерсияСсылка + |ИЗ + | #ПолноеИмяСправочникаФайлов КАК Файлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ #ПолноеИмяСправочникаВерсийФайлов КАК ВерсииФайлов + | ПО Файлы.Ссылка = ВерсииФайлов.Владелец + |ГДЕ + | ВерсииФайлов.ДатаСоздания <= &ПериодОчистки + | И НЕ Файлы.ПометкаУдаления + | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца + | И ВЫБОР + | КОГДА ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | ТОГДА ВерсииФайлов.Том <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) + | ИЛИ (ВЫРАЗИТЬ(ВерсииФайлов.ПутьКФайлу КАК СТРОКА(100))) <> """" + | ИНАЧЕ ИСТИНА + | КОНЕЦ + | "; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПолноеИмяСправочникаФайлов", ПолноеИмяСправочникаФайлов); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПолноеИмяСправочникаВерсийФайлов", ПолноеИмяСправочникаВерсийФайлов); Иначе - ТипОбъекта = ВладелецФайла; - ВсеСправочники = Справочники.ТипВсеСсылки(); - ВсеДокументы = Документы.ТипВсеСсылки(); - - ТекстЗапроса = СтрЗаменить("ВЫБРАТЬ &ИмяТипаОбъекта", "&ИмяТипаОбъекта", ТипОбъекта.Имя + ".Ссылка,"); - - Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Справочник.Реквизиты Цикл - ТекстЗапроса = ТекстЗапроса + Символы.ПС + ТипОбъекта.Имя + "." + Реквизит.Имя + ","; - КонецЦикла; - ИначеЕсли - ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Документ = Метаданные.Документы[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Документ.Реквизиты Цикл - Если Реквизит.Тип = Новый ОписаниеТипов("Дата") Тогда - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + Символы.ПС + ТипОбъекта.Имя + "." + Реквизит.Имя + ","; - КонецЦикла; - КонецЕсли; - Если ДанныеДляОтчета Тогда - ТекстЗапроса = ТекстЗапроса + " + ТекстЗапроса = + "ВЫБРАТЬ + | СправочникВладелецФайла.Ссылка, + | &Реквизиты, | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, - | ВерсииФайлов.Размер /1024 /1024 КАК ОбъемНенужныхФайлов"; - Иначе - ТекстЗапроса = ТекстЗапроса + " + | ВерсииФайлов.Размер /1024 /1024 КАК ОбъемНенужныхФайлов, | Файлы.Ссылка КАК ФайлСсылка, - | ВерсииФайлов.Ссылка КАК ВерсияСсылка"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - |ИЗ - | " + ТипОбъекта.ПолноеИмя+ " КАК " + ТипОбъекта.Имя + " - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ "+ ПолноеИмяСправочникаФайлов + " КАК Файлы - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ " + ПолноеИмяСправочникаВерсийФайлов + " КАК ВерсииФайлов - | ПО Файлы.Ссылка = ВерсииФайлов.Владелец - | ПО " + ТипОбъекта.Имя + ".Ссылка = Файлы.ВладелецФайла - |ГДЕ - | НЕ Файлы.ПометкаУдаления - | И НЕ ЕстьNull(ВерсииФайлов.ПометкаУдаления, Ложь) - | И ВЫБОР - | КОГДА ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) - | ТОГДА ВерсииФайлов.Том <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) - | ИЛИ (ВЫРАЗИТЬ(ВерсииФайлов.ПутьКФайлу КАК СТРОКА(100))) <> """" - | ИНАЧЕ ИСТИНА - | КОНЕЦ - | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца"; + | ВерсииФайлов.Ссылка КАК ВерсияСсылка + |ИЗ + | #СправочникВладелецФайла КАК СправочникВладелецФайла + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ #ПолноеИмяСправочникаФайлов КАК Файлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ #ПолноеИмяСправочникаВерсийФайлов КАК ВерсииФайлов + | ПО Файлы.Ссылка = ВерсииФайлов.Владелец + | ПО СправочникВладелецФайла.Ссылка = Файлы.ВладелецФайла + |ГДЕ + | НЕ Файлы.ПометкаУдаления + | И НЕ ЕСТЬNULL(ВерсииФайлов.ПометкаУдаления, ЛОЖЬ) + | И ВЫБОР + | КОГДА ВерсииФайлов.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | ТОГДА ВерсииФайлов.Том <> ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка) + | ИЛИ (ВЫРАЗИТЬ(ВерсииФайлов.ПутьКФайлу КАК СТРОКА(100))) <> """" + | ИНАЧЕ ИСТИНА + | КОНЕЦ + | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты" + ",", РеквизитыВладельцаФайлов(ВладелецФайла)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПолноеИмяСправочникаВерсийФайлов", ПолноеИмяСправочникаВерсийФайлов); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПолноеИмяСправочникаФайлов", ПолноеИмяСправочникаФайлов); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#СправочникВладелецФайла", ВладелецФайла.ПолноеИмя); КонецЕсли; - Иначе + + Иначе // Не ЕстьВозможностьХранитьВерсии + Если Настройка.ПериодОчистки <> Перечисления.ПериодОчисткиФайлов.ПоПравилу Тогда - Если ДанныеДляОтчета Тогда - ТекстЗапроса = - "ВЫБРАТЬ - | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, - | Файлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов"; - Иначе - ТекстЗапроса = - "ВЫБРАТЬ - | Файлы.Ссылка КАК ФайлСсылка"; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " + ТекстЗапроса = + "ВЫБРАТЬ + | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, + | Файлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов, + | Файлы.Ссылка КАК ФайлСсылка |ИЗ - | Справочник." + Настройка.ТипВладельцаФайла.Имя + " КАК Файлы - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ " + ВладелецФайла.ПолноеИмя + " КАК СправочникФайлы - | ПО Файлы.ВладелецФайла = СправочникФайлы.Ссылка + | #ТипВладельцаФайла КАК Файлы + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ #СправочникВладелецФайла КАК СправочникВладелецФайла + | ПО Файлы.ВладелецФайла = СправочникВладелецФайла.Ссылка |ГДЕ | Файлы.ДатаСоздания <= &ПериодОчистки | И НЕ Файлы.ПометкаУдаления @@ -834,37 +810,22 @@ | КОНЕЦ | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца | "; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТипВладельцаФайла", "Справочник." + Настройка.ТипВладельцаФайла.Имя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#СправочникВладелецФайла", ВладелецФайла.ПолноеИмя); Иначе - ТипОбъекта = ВладелецФайла; - ВсеСправочники = Справочники.ТипВсеСсылки(); - ВсеДокументы = Документы.ТипВсеСсылки(); - ТекстЗапроса = "ВЫБРАТЬ - | СправочникФайлы.Ссылка, + | СправочникВладелецФайла.Ссылка, | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, - | Файлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов,"; - Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Справочник.Реквизиты Цикл - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникФайлы." + Реквизит.Имя + ","; - КонецЦикла; - ИначеЕсли ВсеДокументы.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда - Документ = Метаданные.Документы[ТипОбъекта.Имя]; - Для Каждого Реквизит Из Документ.Реквизиты Цикл - Если Реквизит.Тип = Новый ОписаниеТипов("Дата") Тогда - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "РАЗНОСТЬДАТ(" + Реквизит.Имя + ", &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОт" + Реквизит.Имя + ","; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "СправочникФайлы." + Реквизит.Имя + ","; - КонецЦикла; - КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " + | Файлы.Размер /1024 /1024 КАК ОбъемНенужныхФайлов, + | &Реквизиты, | Файлы.Ссылка КАК ФайлСсылка |ИЗ - | Справочник." + Настройка.ТипВладельцаФайла.Имя + " КАК Файлы - | ЛЕВОЕ СОЕДИНЕНИЕ " + ВладелецФайла.ПолноеИмя + " КАК СправочникФайлы - | ПО Файлы.ВладелецФайла = СправочникФайлы.Ссылка + | #ПолноеИмяСправочникаФайлов КАК Файлы + | ЛЕВОЕ СОЕДИНЕНИЕ #СправочникВладелецФайла КАК СправочникВладелецФайла + | ПО Файлы.ВладелецФайла = СправочникВладелецФайла.Ссылка |ГДЕ | НЕ Файлы.ПометкаУдаления | И ВЫБОР @@ -874,21 +835,25 @@ | ИНАЧЕ ИСТИНА | КОНЕЦ | И ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) = &ТипВладельца"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты" + ",", РеквизитыВладельцаФайлов(ВладелецФайла)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПолноеИмяСправочникаФайлов", ПолноеИмяСправочникаФайлов); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#СправочникВладелецФайла", ВладелецФайла.ПолноеИмя); + КонецЕсли; КонецЕсли; Если МассивИсключений.Количество() > 0 Тогда ТекстЗапроса = ТекстЗапроса + " - | И НЕ Файлы.ВладелецФайла В ИЕРАРХИИ (&МассивИсключений)"; + | И НЕ Файлы.ВладелецФайла В ИЕРАРХИИ (&МассивИсключений)"; // @query-part КонецЕсли; Если ЭлементИсключение <> Неопределено Тогда ТекстЗапроса = ТекстЗапроса + " - | И Файлы.ВладелецФайла В ИЕРАРХИИ (&ЭлементИсключение)"; + | И Файлы.ВладелецФайла В ИЕРАРХИИ (&ЭлементИсключение)"; // @query-part КонецЕсли; Если ЕстьВозможностьХранитьВерсии И Настройка.Действие = Перечисления.ВариантыОчисткиФайлов.ОчиститьВерсии Тогда ТекстЗапроса = ТекстЗапроса + " | И ВерсииФайлов.Ссылка <> Файлы.ТекущаяВерсия - | И ВерсииФайлов.РодительскаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка)"; + | И ВерсииФайлов.РодительскаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка)"; // @query-part КонецЕсли; Возврат ТекстЗапроса; @@ -1724,12 +1689,14 @@ КонецЕсли; // Создать временный каталог. + // АПК:441-выкл Очистка временных файлов выполняется в процедуре СоздатьФайловыйНачальныйОбразНаСервере ИмяКаталога = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ИмяКаталога); // Создать временный каталог для файлов. ИмяКаталогаФайлов = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ИмяКаталогаФайлов); + // АПК:441-вкл // Для передачи пути каталога файлов в обработчик ПриОтправкеДанныхФайла. СохранитьНастройку("ОбменФайлами", "ВременныйКаталог", ИмяКаталогаФайлов); @@ -1855,7 +1822,8 @@ Результат.ТребуетсяПодтверждение = Истина; КонецЕсли; КонецЕсли; - + + // АПК:441-выкл Очистка временных файлов выполняется в процедуре СоздатьФайловыйНачальныйОбразНаСервере // Создать временный каталог. ИмяКаталога = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ИмяКаталога); @@ -1863,6 +1831,7 @@ // Создать временный каталог для файлов. ИмяКаталогаФайлов = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ИмяКаталогаФайлов); + // АПК:441-вкл // Для передачи пути каталога файлов в обработчик ПриОтправкеДанныхФайла. СохранитьНастройку("ОбменФайлами", "ВременныйКаталог", ИмяКаталогаФайлов); @@ -2193,8 +2162,8 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ИзвлечениеТекста; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); @@ -2202,11 +2171,11 @@ КонецЕсли; Зависимость.ДоступноВМоделиСервиса = Ложь; - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОчисткаНенужныхФайлов; Зависимость.РаботаетСВнешнимиРесурсами = Истина; - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СинхронизацияФайлов; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьСинхронизациюФайлов; Зависимость.РаботаетСВнешнимиРесурсами = Истина; @@ -2780,8 +2749,9 @@ ЗаписьИзменилась = Истина; КонецЕсли; - Если НЕ МенеджерЗаписи.ЕстьФайлы Тогда - МенеджерЗаписи.ЕстьФайлы = Истина; + ЕстьФайлы = НЕ Источник.ПометкаУдаления ИЛИ ЕстьФайлыУВладельца(ВладелецФайлов); + Если МенеджерЗаписи.ЕстьФайлы <> ЕстьФайлы Тогда + МенеджерЗаписи.ЕстьФайлы = ЕстьФайлы; ЗаписьИзменилась = Истина; КонецЕсли; @@ -2797,7 +2767,7 @@ Если Не Источник.ЭтоГруппа Тогда МенеджерЗаписи = РегистрыСведений.СведенияОФайлах.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Источник); - МенеджерЗаписи.Файл = Источник; + МенеджерЗаписи.Файл = Источник.Ссылка; Если Источник.ПодписанЭП И Источник.Зашифрован Тогда МенеджерЗаписи.НомерКартинкиПодписанЗашифрован = 2; ИначеЕсли Источник.Зашифрован Тогда @@ -3059,7 +3029,6 @@ КонецЕсли; КонецПроцедуры - // Только для внутреннего использования. // // Параметры: @@ -5474,11 +5443,8 @@ ЭлементИсключение = Неопределено; КонецЕсли; - СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаДляОчисткиФайлов( - ВладелецФайла, - НастройкаОчистки, - МассивИсключений, - ЭлементИсключение); + СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, + НастройкаОчистки, МассивИсключений, ЭлементИсключение); Структура = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); @@ -5545,6 +5511,34 @@ КонецФункции +Функция РеквизитыВладельцаФайлов(ВладелецФайла) + + РеквизитыЗапроса = ""; + ВсеСправочники = Справочники.ТипВсеСсылки(); + ВсеДокументы = Документы.ТипВсеСсылки(); + + Если ВсеСправочники.СодержитТип(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки)) Тогда + Справочник = Метаданные.Справочники[ВладелецФайла.Имя]; + Для Каждого Реквизит Из Справочник.Реквизиты Цикл + РеквизитыЗапроса = РеквизитыЗапроса + Символы.ПС + "СправочникВладелецФайла." + Реквизит.Имя + ","; + КонецЦикла; + ИначеЕсли + ВсеДокументы.СодержитТип(ТипЗнч(ВладелецФайла.ЗначениеПустойСсылки)) Тогда + Документ = Метаданные.Документы[ВладелецФайла.Имя]; + ШаблонЗапроса = "РАЗНОСТЬДАТ(&ИмяРеквизитаДата, &ТекущаяДата, ДЕНЬ) Как ДнейДоУдаленияОтДаты"; // @query-part + Для Каждого Реквизит Из Документ.Реквизиты Цикл + Если Реквизит.Тип = Новый ОписаниеТипов("Дата") Тогда + ФрагментЗапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяРеквизитаДата", "СправочникВладелецФайла." + Реквизит.Имя); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ДнейДоУдаленияОтДаты", "ДнейДоУдаленияОт" + Реквизит.Имя); + РеквизитыЗапроса = РеквизитыЗапроса + Символы.ПС + ФрагментЗапроса + ","; + КонецЕсли; + РеквизитыЗапроса = РеквизитыЗапроса + Символы.ПС + "СправочникВладелецФайла." + Реквизит.Имя + ","; + КонецЦикла; + КонецЕсли; + Возврат РеквизитыЗапроса; + +КонецФункции + #КонецОбласти #Область СинхронизацияФайлов @@ -5665,7 +5659,7 @@ КонецЕсли; ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ - | СправочникПапок.Ссылка,"; + | СправочникПапок.Ссылка,";// @query-part ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); @@ -5739,7 +5733,7 @@ |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ - | СправочникПапок.Ссылка,"; + | СправочникПапок.Ссылка,";// @query-part ДобавитьДоступныеПоляОтбора(ТекстЗапроса, ТипОбъекта); @@ -6076,11 +6070,13 @@ ФайлСДвоичнымиДанными = ПараметрыСинхронизации.Ответ.ПолучитьТелоКакДвоичныеДанные(); // ДвоичныеДанные - HTTPЗаголовки = ЗаголовкиВНижнийРегистр(ПараметрыСинхронизации.Ответ.Заголовки); + // АПК:216-выкл АПИ внешнего сервиса + HTTPЗаголовки = СтандартныеПодсистемыСервер.HTTPЗаголовкиВНижнийРегистр(ПараметрыСинхронизации.Ответ.Заголовки); ИдентификаторEtag = ?(HTTPЗаголовки["идентификаторetag"] = Неопределено, "", HTTPЗаголовки["идентификаторetag"]); ДатаМодификацииФайла = ?(HTTPЗаголовки["last-modified"] = Неопределено, ТекущаяУниверсальнаяДата(), ДатаRFC1123(HTTPЗаголовки["last-modified"])); ДлинаФайла = ФайлСДвоичнымиДанными.Размер(); + // АПК:216-вкл АдресВременныхДанных = ПоместитьВоВременноеХранилище(ФайлСДвоичнымиДанными); Результат.Вставить("АдресЗагруженногоФайла", АдресВременныхДанных); @@ -6088,15 +6084,6 @@ КонецФункции -Функция ЗаголовкиВНижнийРегистр(Заголовки) - - Результат = Новый Соответствие; - Для каждого Заголовок из Заголовки Цикл - Результат.Вставить(НРег(Заголовок.Ключ), Заголовок.Значение); - КонецЦикла; - Возврат Результат; - -КонецФункции // Помещает файл на сервер webdav с помощью метода PUT и возвращает присвоенный etag в переменную. Функция ВызватьМетодPUT(АдресФайлаHRef, ФайлСсылка, ПараметрыСинхронизации, ЭтоФайл) @@ -6647,22 +6634,6 @@ КонецПроцедуры -// При изменении серверного пути к папке необходимо заменить пути к подчиненным файлам, что и делает эта процедура. -Процедура РекурсивноОбновитьСсылкиПодчиненных(СтрокаФайлов,знач ToHref,знач ToHref2,ТаблицаФайлов) - - // Меняем корневую ссылку, всегда должна быть закодирована. - СтрокаФайлов.ToHref = СтрЗаменить( - РаскодироватьСтроку(ЗакончитьБезСлеша(СтрокаФайлов.ToHref), СпособКодированияСтроки.URLВКодировкеURL), - РаскодироватьСтроку(ЗакончитьБезСлеша(ToHref), СпособКодированияСтроки.URLВКодировкеURL), - РаскодироватьСтроку(ЗакончитьБезСлеша(ToHref2), СпособКодированияСтроки.URLВКодировкеURL)); - - НайденныеПодчиненныеСтроки = ТаблицаФайлов.НайтиСтроки(Новый Структура("РодительСервер", СтрокаФайлов.Ссылка)); - Для каждого ПодчиненнаяСтрока Из НайденныеПодчиненныеСтроки Цикл - РекурсивноОбновитьСсылкиПодчиненных(ПодчиненнаяСтрока,ToHref,ToHref2,ТаблицаФайлов); - КонецЦикла; - -КонецПроцедуры - // Рекурсивно загружает перечень файлов с сервера в таблицу файлов. Процедура СкачатьДеревоФайловРекурсивно(ТекущиеСтрокиДереваФайлов, HttpАдрес, ПараметрыСинхронизации, Отказ=Ложь) @@ -8169,12 +8140,11 @@ КонецЕсли; КонецЕсли; - СтрокаЗамены = ?(ПолучитьВсеФайлы, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + Формат(ЧислоФайловВВыборке, "ЧГ=; ЧН=")); // @query-part-1 - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 1", СтрокаЗамены); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 1", СтрокаЗамены);// @query-part ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + ИмяСправочника); @@ -8629,35 +8599,35 @@ Функция ЕстьФайлыУВладельца(Знач ВладелецФайлов, Знач ФайлИсключение = Неопределено) - УстановитьПривилегированныйРежим(Истина); - Запрос = Новый Запрос; - Запрос.Параметры.Вставить("ВладелецФайлов", ВладелецФайлов); - ТекстЗапроса = "ВЫБРАТЬ | ПрисоединенныеФайлы.Ссылка |ИЗ | &ИмяСправочника КАК ПрисоединенныеФайлы |ГДЕ - | ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайлов"; + | НЕ ПрисоединенныеФайлы.ПометкаУдаления + | И ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайлов + | И &ФайлИсключение"; + Запрос.Параметры.Вставить("ВладелецФайлов", ВладелецФайлов); Если ФайлИсключение <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + " - | И ПрисоединенныеФайлы.Ссылка <> &Ссылка"; - - Запрос.Параметры.Вставить("Ссылка", ФайлИсключение); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ФайлИсключение", "ПрисоединенныеФайлы.Ссылка <> &ФайлИсключение"); // @Query-part-2 + Запрос.Параметры.Вставить("ФайлИсключение", ФайлИсключение); + Иначе + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ФайлИсключение", "ИСТИНА"); // @Query-part-2 КонецЕсли; ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов); Для каждого КлючИЗначение Из ИменаСправочников Цикл - Запрос.Текст = СтрЗаменить( - ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ); + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + КлючИЗначение.Ключ); + УстановитьПривилегированныйРежим(Истина); Если НЕ Запрос.Выполнить().Пустой() Тогда Возврат Истина; КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); КонецЦикла; Возврат Ложь; diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl index efd490309..eafe39a25 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl @@ -15,8 +15,7 @@ // // Параметры: // ИсточникТекста - ОпределяемыйТип.ПрисоединенныйФайл - файл, у которого изменилось состояние извлечения текста. -// СостояниеИзвлеченияТекста - ПеречислениеСсылка.СтатусыИзвлеченияТекстаФайлов - новый -// статус извлечения текста у файла. +// СостояниеИзвлеченияТекста - ПеречислениеСсылка.СтатусыИзвлеченияТекстаФайлов - новый статус. // Процедура ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) Экспорт @@ -37,7 +36,7 @@ Запись = НаборЗаписей.Добавить(); Запись.ОбластьДанныхВспомогательныеДанные = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - Запись.ИсточникТекста = ИсточникТекста.Ссылка; + Запись.ИсточникТекста = ИсточникТекста; КонецЕсли; diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl index acce79d9a..c06387048 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl @@ -1954,11 +1954,13 @@ КонецПроцедуры // Записать в регистр сведений ФайлыВРабочемКаталоге информацию о пути файла. +// +// Параметры: // Версия - СправочникСсылка.ВерсииФайлов - версия. // ПолныйПуть - Строка - полный путь файла. -// ИмяКаталога - путь рабочего каталога. +// ИмяКаталога - Строка - путь рабочего каталога. // НаЧтение - Булево - файл помещен на чтение. -// РазмерФайла - размер файла в байтах. +// РазмерФайла - Число - размер файла в байтах. // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге). // Процедура ЗанестиИнформациюФайлаВРегистр(Версия, diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl index 44348ad4d..d74a93bcd 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl @@ -40,16 +40,17 @@ // На основе переданного пути к файлу на диске создает Файл его и открывает карточку. // -// ПараметрыДобавления - Структура: -// * ОбработчикРезультата - ОписаниеОповещения, Неопределено. -// - Описание процедуры, принимающей результат работы метода. -// * ПолноеИмяФайла - Строка - Необязательный. Полный путь и имя файла на клиенте. +// Параметры: +// ПараметрыВыполнения - Структура: +// * ОбработчикРезультата - ОписаниеОповещения +// - Неопределено - описание процедуры, принимающей результат работы метода. +// * ПолноеИмяФайла - Строка - необязательный. Полный путь и имя файла на клиенте. // Если не указан, то будет открыт диалог для выбора файла. // * ВладелецФайла - ЛюбаяСсылка - владелец файла. -// * ФормаВладелец - ФормаКлиентскогоПриложения из которой вызвано создание файла. +// * ФормаВладелец - ФормаКлиентскогоПриложения - форма из которой вызвано создание файла. // * НеОткрыватьКарточкуПослеСозданияИзФайла - Булево. // - Истина когда карточка файла не открывается после создания. -// * ИмяСоздаваемогоФайла - Строка - Необязательный. Новое имя файла. +// * ИмяСоздаваемогоФайла - Строка - необязательный. Новое имя файла. // Процедура ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения) Экспорт @@ -75,12 +76,13 @@ // На основе переданного пути к файлу на диске создает Файл его и открывает карточку. // -// ПараметрыДобавления - Структура: -// * ПолноеИмяФайла - Строка - Необязательный. Полный путь и имя файла на клиенте. -// Если не указан, то будет открыт синхронный диалог для выбора файла. +// Параметры: +// ПараметрыВыполнения - Структура: +// * ПолноеИмяФайла - Строка - необязательный. Полный путь и имя файла на клиенте. +// Если не указан, то будет открыт синхронный диалог для выбора файла. // * ВладелецФайла - ЛюбаяСсылка - владелец файла. -// * УникальныйИдентификатор - УникальныйИдентификатор - Идентификатор формы для хранения файла. -// * ИмяСоздаваемогоФайла - Строка - Необязательный. Новое имя файла. +// * УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы для хранения файла. +// * ИмяСоздаваемогоФайла - Строка - необязательный. Новое имя файла. // // Возвращаемое значение: // Структура: @@ -644,8 +646,8 @@ // Например, СправочникОбъект.Файл, СправочникОбъект.ДокументПрисоединенныеФайлы. // // * ЭлектронныеПодписи - ДанныеФормыКоллекция: -// * ДатаПроверкиПодписи - Дата - (возвращаемое значение) - дата проверки. -// * Статус - Строка - (возвращаемое значение) - результат проверки. +// * ДатаПроверкиПодписи - Дата - возвращаемое значение. Дата проверки. +// * Статус - Строка - возвращаемое значение. Результат проверки. // * АдресПодписи - Строка - адрес данных подписи во временном хранилище. // // СсылкаНаДвоичныеДанные - ДвоичныеДанные - двоичные данные файла. @@ -925,7 +927,12 @@ АдресВременногоХранилищаТекста = РезультатЗагрузки; КонецЕсли; - УдалитьФайлы(ИмяВременногоФайла); + Попытка + УдалитьФайлы(ИмяВременногоФайла); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЕсли; Иначе // Когда Текст извлечь "некому" - это нормальный случай, @@ -935,7 +942,12 @@ КонецЕсли; - УдалитьФайлы(ИмяФайлаСПутем); + Попытка + УдалитьФайлы(ИмяФайлаСПутем); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; РаботаСФайламиСлужебныйВызовСервера.ЗаписатьРезультатИзвлеченияТекста( ФайлИлиВерсияФайла, РезультатИзвлечения, АдресВременногоХранилищаТекста); @@ -1297,6 +1309,8 @@ // Нет прав на создание каталога, или такой путь отсутствует, // тогда установка настроек по умолчанию. Контекст.Каталог = Неопределено; + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; @@ -1382,9 +1396,16 @@ ИспользоватьЭлектроннуюПодписьВМоделиСервиса = Ложь; КонецЕсли; + ИспользоватьОблачнуюПодпись = Ложь; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + ИспользоватьОблачнуюПодпись = МодульСервисКриптографииDSSКлиент.ИспользоватьСервисОблачнойПодписи(); + КонецЕсли; + МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса + Или ИспользоватьОблачнуюПодпись Или Не МодульЭлектроннаяПодписьКлиент.ПроверятьЭлектронныеПодписиНаСервере() Тогда ДополнительныеПараметры.Вставить("Данные", Данные); @@ -1438,11 +1459,11 @@ // // Параметры: // ВыбранныеФайлы - Массив - пути к файлам на диске. -// ВладелецФайла - ссылка на владельца файла. +// ВладелецФайла - ОпределяемыйТип.ВладелецФайлов - ссылка на владельца файла. // НастройкиРаботыСФайлами - Структура. -// ПрисоединенныеФайлыМассив - Массив Из возвращаемое значение - заполняется ссылками +// ПрисоединенныеФайлыМассив - Массив из ОпределяемыйТип.ПрисоединенныйФайл - возвращаемое значение. заполняется ссылками // на добавленные файлы. -// ИдентификаторФормы - УникальныйИдентификатор формы. +// ИдентификаторФормы - УникальныйИдентификатор - УникальныйИдентификатор формы. // Процедура ПоместитьВыбранныеФайлыВХранилище(Знач ВыбранныеФайлы, Знач ВладелецФайла, @@ -1691,7 +1712,7 @@ Процедура ОсвободитьФайлы(СписокФайлов) Экспорт МассивФайлов = Новый Массив; Для Каждого ЭлементСписка Из СписокФайлов.ВыделенныеСтроки Цикл - ДанныеСтроки = СписокФайлов.ДанныеСтроки(ЭлементСписка); + ДанныеСтроки = СписокФайлов.ДанныеСтроки(ЭлементСписка); // ОпределяемыйТип.ПрисоединенныйФайл Если Не ВозможностьОсвободитьФайл( ДанныеСтроки.Ссылка, ДанныеСтроки.ФайлРедактируетТекущийПользователь, @@ -1789,8 +1810,13 @@ Если РезультатЗагрузки <> Неопределено Тогда АдресВременногоХранилища = РезультатЗагрузки; КонецЕсли; - - УдалитьФайлы(ИмяВременногоФайла); + + Попытка + УдалитьФайлы(ИмяВременногоФайла); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; #КонецЕсли @@ -4318,17 +4344,20 @@ //////////////////////////////////////////////////////////////////////////////// // Удаление файла. Перед удалением снимается атрибут "Только для чтения". -// Удаление файла со снятием атрибута readonly без диалогов. -// // Параметры: -// ПолноеИмяФайла - Строка - полное имя файла. +// ПолноеИмяФайла - Строка // Процедура УдалитьФайлБезПодтверждения(ПолноеИмяФайла) Файл = Новый Файл(ПолноеИмяФайла); Если Файл.Существует() Тогда - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ПолноеИмяФайла); + Попытка + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолноеИмяФайла); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЕсли; КонецПроцедуры @@ -5012,7 +5041,12 @@ МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*"); Если МассивФайловВКаталоге.Количество() = 0 Тогда Если ПутьСПодкаталогом <> ПараметрыВыполнения.ИмяКаталога Тогда - УдалитьФайлы(ПутьСПодкаталогом); + Попытка + УдалитьФайлы(ПутьСПодкаталогом); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЕсли; КонецЕсли; @@ -5175,7 +5209,12 @@ МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*"); Если МассивФайловВКаталоге.Количество() = 0 Тогда Если ПутьСПодкаталогом <> ПараметрыВыполнения.ИмяКаталога Тогда - УдалитьФайлы(ПутьСПодкаталогом); + Попытка + УдалитьФайлы(ПутьСПодкаталогом); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЕсли; КонецЕсли; @@ -5580,9 +5619,9 @@ // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - Структура -// ПолноеИмяФайла - строка (возвращаемое значение). +// ПолноеИмяФайла - Строка - возвращаемое значение. // НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. -// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. +// ИдентификаторФормы - УникальныйИдентификатор // Процедура ПолучитьФайлВерсииВРабочийКаталогПапки(ОбработчикРезультата, ДанныеФайла, @@ -6299,6 +6338,8 @@ ФайлУдален = Истина; Исключение ФайлУдален = Ложь; + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; Если Не ФайлУдален Тогда @@ -6549,8 +6590,13 @@ Для Каждого Элемент Из МассивСтруктурВсехФайлов Цикл ВыбранныйФайл = Новый Файл(Элемент.ИмяФайла); - ВыбранныйФайл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ВыбранныйФайл.ПолноеИмя); + Попытка + ВыбранныйФайл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ВыбранныйФайл.ПолноеИмя); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЦикла; КонецПроцедуры @@ -6783,8 +6829,13 @@ Если Файл.Существует() Тогда Если ПараметрыВыполнения.ПутьКФайлуВКэше <> ПолноеИмяФайла Тогда - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ВыборФайла.ПолноеИмяФайла); + Попытка + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ВыборФайла.ПолноеИмяФайла); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЕсли; КонецЕсли; @@ -7908,8 +7959,12 @@ ДвоичныеДанныеРасшифрованные.Записать(ПолныйПутьКФайлу); АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище(ПолныйПутьКФайлу, ПараметрыВыполнения.УникальныйИдентификатор); - - УдалитьФайлы(ПолныйПутьКФайлу); + Попытка + УдалитьФайлы(ПолныйПутьКФайлу); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЕсли; #КонецЕсли @@ -7918,7 +7973,6 @@ ДанныеДляЗаписиНаСервере.Вставить("ВерсияСсылка", ТекущиеПараметрыВыполнения.ВерсияСсылка); ДанныеДляЗаписиНаСервере.Вставить("АдресФайла", ТекущиеПараметрыВыполнения.АдресФайла); ДанныеДляЗаписиНаСервере.Вставить("АдресВременногоХранилищаТекста", АдресВременногоХранилищаТекста); - ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура); @@ -8012,9 +8066,9 @@ // // Параметры: // РежимСоздания - Число - режим создания файла. -// И 1 - из шаблона (копированием другого файла), -// * 2 - с диска (из файловой системы клиента), -// * 3 - со сканера. +// 1 - из шаблона (копированием другого файла), +// 2 - с диска (из файловой системы клиента), +// 3 - со сканера. // ПараметрыВыполнения - Структура - типы значений и описания см. в РаботаСФайламиКлиент.ДобавитьФайл(). // * ОбработчикРезультата. // * ВладелецФайла. @@ -9245,8 +9299,10 @@ СоздатьКаталог(ИмяКаталогаТестовое); УдалитьФайлы(ИмяКаталогаТестовое); Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + // Нет прав на создание каталога, или такой путь отсутствует. - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог |""%1"".'"), @@ -10317,7 +10373,8 @@ ИмяПараметра = "СтандартныеПодсистемы.КомпонентаTwain"; Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - // АПК:472,150-выкл Вызов метода ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета не требуется, + // АПК:472-выкл + // АПК:150-выкл Вызов метода ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета не требуется, // т.к. внешняя компонента подключается из макета и сканирование не доступно в веб-клиенте. КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain"); Если Не КодВозврата Тогда @@ -10330,7 +10387,8 @@ Возврат ПроинициализироватьКомпоненту(Ложь); // Рекурсивно. КонецЕсли; - // АПК:472,150-вкл + // АПК:150-вкл + // АПК:472-вкл ПараметрыПриложения.Вставить(ИмяПараметра, Новый("AddIn.twain.AddInNativeExtension")); КонецЕсли; @@ -10689,8 +10747,13 @@ Файл = Новый Файл(КаталогСохранения + ИмяФайла); Если Файл.Существует() Тогда - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(КаталогСохранения + ИмяФайла); + Попытка + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(КаталогСохранения + ИмяФайла); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + КонецПопытки; КонецЕсли; ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(КаталогСохранения + ИмяФайла, АдресДвоичныхДанныхФайла); @@ -10738,8 +10801,14 @@ Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда Файл = Новый Файл(ИмяФайлаСПутем); - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ИмяФайлаСПутем); + Попытка + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ИмяФайлаСПутем); + Исключение + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + "Предупреждение", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); + Результат = Неопределено; + КонецПопытки; Результат = Истина; ИначеЕсли Действие = "ОткрытьСуществующий" Тогда Результат = Ложь; diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl index 5441ad05b..1c176a9d3 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl @@ -63,7 +63,7 @@ // Нет прав на создание каталога, или такой путь отсутствует, // тогда установка настроек по умолчанию. СообщениеЖурналаРегистрации = НСтр("ru='Не найден рабочий каталог %1 или нет права на запись. Восстановлены настройки по умолчанию.'"); - СообщениеЖурналаРегистрации = СтрШаблон(СообщениеЖурналаРегистрации, ИмяКаталога); + СообщениеЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеЖурналаРегистрации, ИмяКаталога); ИмяКаталога = РаботаСФайламиСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя(); РаботаСФайламиСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ИмяКаталога); diff --git a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl index d9af95dea..36a63173d 100644 --- a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl @@ -1031,8 +1031,8 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.РассылкаОтчетов; Зависимость.РаботаетСВнешнимиРесурсами = Истина; Зависимость.Параметризуется = Истина; @@ -2981,17 +2981,35 @@ | Справочник.РассылкиОтчетов КАК РассылкиОтчетов |ГДЕ | РассылкиОтчетов.ТипПолучателейРассылки = &ТипПолучателейРассылки"; + Запрос.УстановитьПараметр("ТипПолучателейРассылки", Источник.Ссылка); Записи = Запрос.Выполнить().Выбрать(); - Пока Записи.Следующий() Цикл - РассылкаОбъект = Записи.Ссылка.ПолучитьОбъект(); - Если РассылкаОбъект = Неопределено Тогда - Продолжить; - КонецЕсли; - РассылкаОбъект.ТипПолучателейРассылки = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); - РассылкаОбъект.Подготовлена = Ложь; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(РассылкаОбъект); - КонецЦикла; + + НачатьТранзакцию(); + + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.РассылкиОтчетов.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("ТипПолучателейРассылки", Источник.Ссылка); + Блокировка.Заблокировать(); + + Пока Записи.Следующий() Цикл + РассылкаОбъект = Записи.Ссылка.ПолучитьОбъект(); + + Если РассылкаОбъект = Неопределено Тогда + Продолжить; + КонецЕсли; + + РассылкаОбъект.ТипПолучателейРассылки = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); + РассылкаОбъект.Подготовлена = Ложь; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(РассылкаОбъект); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры diff --git a/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl index 3a0b0b57a..1a94ee8c3 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl @@ -11,7 +11,7 @@ // Таблица типов получателей в разрезах хранения и пользовательского представления этих типов. // // Возвращаемое значение: -// ТаблицаТипов - ТаблицаЗначений - таблица типов получателей: +// ТаблицаЗначений - таблица типов получателей: // * ИдентификаторОбъектаМетаданных - СправочникСсылка.ИдентификаторыОбъектовМетаданных - ссылка, которая хранится // в базе данных. // * ТипПолучателей - ОписаниеТипов - тип, которым ограничиваются значения списков получателей и исключенных. diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl index f7d6bca5a..043bf5464 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl @@ -20,6 +20,7 @@ // - СправочникСсылка.ОчередьЗаданий // - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания // очереди в модели сервиса. +// - Строка. // * Метаданные - ОбъектМетаданныхРегламентноеЗадание - метаданные регламентного задания. // - Строка - имя регламентного задания. // * Использование - Булево - если Истина, задание включено. @@ -40,7 +41,7 @@ // * Использование - Булево - если Истина, задание включено. // * Ключ - Строка - прикладной идентификатор задания. // * Параметры - Массив - параметры, передаваемые в обработчик задания. -// * Расписание - Расписание - расписание задания. +// * Расписание - РасписаниеРегламентногоЗадания - расписание задания. // * УникальныйИдентификатор - СправочникСсылка.ОчередьЗаданий // - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания // очереди в модели сервиса. @@ -63,7 +64,7 @@ ВызватьИсключениеЕслиНетПраваАдминистрирования(); - КопияОтбора = ОбщегоНазначения.СкопироватьРекурсивно(Отбор); + КопияОтбора = ОбщегоНазначения.СкопироватьРекурсивно(Отбор); // см. НайтиЗадания.Отбор Если ОбщегоНазначения.РазделениеВключено() Тогда @@ -106,7 +107,7 @@ КонецЕсли; КонецЕсли; КонецЕсли; - ИначеЕсли КопияОтбора.Свойство("Идентификатор") + ИначеЕсли КопияОтбора.Свойство("Идентификатор") И (ТипЗнч(КопияОтбора.Идентификатор) = Тип("УникальныйИдентификатор") ИЛИ ТипЗнч(КопияОтбора.Идентификатор) = Тип("Строка")) Тогда @@ -891,7 +892,7 @@ // требуется изменить. // ИзменяемыеПараметры - Структура - свойства регламентного задания, которые требуется изменить. // Ключ структуры - имя параметра, а значение - значение параметра формы. -// Отбор - см. описание параметра Отбор функции НайтиЗадания. +// Отбор - см. НайтиЗадания.Отбор. // Процедура УстановитьПараметрыРегламентногоЗадания(РегламентноеЗадание, ИзменяемыеПараметры, Отбор = Неопределено) Экспорт @@ -1049,11 +1050,16 @@ ПараметрыЗадания = Новый Структура; - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда - ИмяМетода = Идентификатор.ИмяМетода; - ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода); + ПараметрыЗадания.Вставить("Метаданные", Идентификатор); + СписокЗаданий = НайтиЗадания(ПараметрыЗадания); + Если СписокЗаданий = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Для Каждого Задание Из СписокЗаданий Цикл + Возврат Задание.Идентификатор.УникальныйИдентификатор(); + КонецЦикла; ИначеЕсли ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда Возврат Идентификатор.Идентификатор.УникальныйИдентификатор(); ИначеЕсли ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Идентификатор)) Тогда @@ -1061,18 +1067,6 @@ Иначе Возврат Неопределено; КонецЕсли; - - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания); - Для Каждого Задание Из СписокЗаданий Цикл - Возврат Задание.Идентификатор.УникальныйИдентификатор(); - КонецЦикла; - КонецЕсли; Иначе Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") И Идентификатор.Предопределенное Тогда Возврат РегламентныеЗадания.НайтиПредопределенное(Идентификатор).УникальныйИдентификатор; diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl index 299d6dd4f..cc49a324a 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl @@ -17,7 +17,7 @@ // Если не указано, получается автоматически. // // Возвращаемое значение: -// Использование - Булево - Истина, если регламентное задание используется. +// Булево - Истина, если регламентное задание используется. // Функция РегламентноеЗаданиеДоступноПоФункциональнымОпциям(Задание, ЗависимостиЗаданий = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl index 67edfd9c4..2838d909a 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl @@ -517,10 +517,13 @@ Функция ПодставитьПараметрыВТекст(Знач Текст, Знач ПараметрыТекста) Экспорт - Результат = Текст; + Результат = Текст; + ОбщегоНазначенияКлиентСервер.ДополнитьСоответствие(ПараметрыТекста, СообщенияСкриптов()); + Для каждого ПараметрТекста Из ПараметрыТекста Цикл Результат = СтрЗаменить(Результат, ПараметрТекста.Ключ, ПараметрТекста.Значение); КонецЦикла; + Возврат Результат; КонецФункции @@ -534,4 +537,60 @@ КонецФункции +Функция СообщенияСкриптов() + + Сообщения = Новый Соответствие; + + // Переменные макетов Макет файла резервного копирования, Макет файла загрузка ИБ. + Сообщения.Вставить("[СообщениеНачалоЗапуска]", НСтр("ru = 'Запускается: {0}; параметры: {1}; окно: {2}; ожидание: {3}'")); + Сообщения.Вставить("[СообщениеДеталиИсключения]", НСтр("ru = 'Исключение в runApp: {0}, {1}'")); + Сообщения.Вставить("[СообщениеРезультатЗапуска]", НСтр("ru = 'Код возврата: {0}'")); + Сообщения.Вставить("[СообщениеОтказЗапуска]", НСтр("ru = 'Запускаемый файл не существует: {0}'")); + Сообщения.Вставить("[СообщениеЛогирование1С]", НСтр("ru = 'Исключение в log1CInternal: {0}, {1}'")); + Сообщения.Вставить("[СообщениеПутьКФайлуСкрипта]", НСтр("ru = 'Файл скрипта: {0}'")); + Сообщения.Вставить("[СообщениеПутьКФайлуРезервнойКопии]", НСтр("ru = 'Файл резервной копии: {0}'")); + Сообщения.Вставить("[СообщениеРезультатСозданияРезервнойКопииБазы]", НСтр("ru = 'Резервная копия успешно создана'")); + Сообщения.Вставить("[СообщениеОтказСозданияРезервнойКопииБазы]", НСтр("ru = 'Не удалось создать резервную копию базы'")); + Сообщения.Вставить("[СообщениеНачалоСеансаСоединенияСБазой]", НСтр("ru = 'Начат сеанс внешнего соединения с ИБ'")); + Сообщения.Вставить("[СообщениеРазрядностьОСНеопределена]", НСтр("ru = '<Неопределена>'")); + Сообщения.Вставить("[СообщениеВерсияCOMСоединителя]", НСтр("ru = 'Версия comcntr: {0} {1}'")); + Сообщения.Вставить("[СообщениеОтказСоединенияСБазой]", НСтр("ru = 'Исключение в createConnection на шаге: {0}, {1}, {2}'")); + Сообщения.Вставить("[СообщениеОтказЛогирования1С]", НСтр("ru = 'Исключение в write1CEventLog: {0}, {1}'")); + Сообщения.Вставить("[СообщениеОтказПриВызовеЗавершитьРезервноеКопирование]", НСтр("ru = 'Исключение при вызове РезервноеКопированиеИБСервер.ЗавершитьРезервноеКопирование: {0}, {1}'")); + Сообщения.Вставить("[СообщениеРезультатРезервногоКопированияБазы]", НСтр("ru = 'Резервное копирование базы выполнено успешно.'")); + Сообщения.Вставить("[СообщениеОтказРезервногоКопированияБазы]", НСтр("ru = 'Ошибка при резервном копировании информационной базы.'")); + Сообщения.Вставить("[СообщениеПараметрыБазы]", НСтр("ru = 'Параметры информационной базы: {0}.'")); + Сообщения.Вставить("[СообщениеРезервноеКопированиеЛогирование1С]", НСтр("ru = 'Протокол резервного копирования сохранен в журнал регистрации.'")); + Сообщения.Вставить("[СообщениеОтказЛогирования]", НСтр("ru = 'Исключение в writeEventLog: {0}, {1}'")); + Сообщения.Вставить("[СообщениеРазмерФайлаРезервнойКопииВМб]", НСтр("ru = 'Размер файла 1Cv8.1CD: {0} Мб'")); + Сообщения.Вставить("[СообщениеОтказСжатияФайлаРезервнойКопиВZIP]", НСтр("ru = 'Размер файла 1Cv8.1CD превышает 2 Гб, поэтому сжатие в zip не используется'")); + Сообщения.Вставить("[СообщениеНачалоСозданияРезервнойКопииБазы]", НСтр("ru = 'Начато создание резервной копии...'")); + Сообщения.Вставить("[СообщениеОтказСозданияРезервнойКопииБазыПодробно]", НСтр("ru = 'Исключение при создании резервной копии базы: {0}, {1}'")); + Сообщения.Вставить("[СообщениеПредположениеОшибкиРезервногоКопированияБазы]", НСтр("ru = 'За 15 минут файл резервной копии все еще не начал создаваться (размер {0} байт), предположительно, из-за возникшей ошибки. Резервное копирование прервано'")); + Сообщения.Вставить("[СообщениеОшибкаУдаленияФайлаБлокировок]", НСтр("ru = 'Ошибка при удалении файла блокировок 1Cv8.cdn: {0}, {1}'")); + + // Переменные макетов Заставка резервного копирования, Заставка восстановления. + Сообщения.Вставить("[СообщениеЗаставкиОшибкаШага]", НСтр("ru = 'Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.'")); + + // Переменные макета Макет файла загрузка ИБ. + Сообщения.Вставить("[СообщениеОтказПриВызовеЗавершитьВосстановление]", НСтр("ru = 'Исключение при вызове РезервноеКопированиеИБСервер.ЗавершитьВосстановление: {0}, {1}'")); + Сообщения.Вставить("[СообщениеРезультатВосстановленияБазы]", НСтр("ru = 'Восстановление информационной базы прошло успешно.'")); + Сообщения.Вставить("[СообщениеОтказВосстановленияБазы]", НСтр("ru = 'Ошибка при восстановлении информационной базы.'")); + Сообщения.Вставить("[СообщениеВосстановлениеЛогирование1С]", НСтр("ru = 'Протокол восстановления сохранен в журнал регистрации.'")); + Сообщения.Вставить("[СообщениеОтказПереносаФайлаБазыВоВременныйКаталог]", НСтр("ru = 'Ошибка переноса файла базы во временный каталог (возможно к файлу базы подключены активные сеансы): {0}, {1}.'")); + Сообщения.Вставить("[СообщениеПопыткаПереносаФайлаБазыВоВременныйКаталог]", НСтр("ru = 'Попытка переноса файла базы во временный каталог ({0} из 5): {1}, {2}.'")); + Сообщения.Вставить("[СообщениеОтказВосстановленияБазыПодробно]", НСтр("ru = 'Исключение при восстановлении базы из резервной копии: {0}, {1}.'")); + + Возврат Сообщения; + +КонецФункции + +Процедура УстановитьОбщиеПараметрыЗаставки(Параметры) Экспорт + + Параметры["[НаименованиеПродукта]"] = НСтр("ru = '1С:ПРЕДПРИЯТИЕ 8.3'"); + Параметры["[Копирайт]"] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '© ООО «1С-Софт», 1996-%1'"), Формат(Год(ТекущаяДатаСеанса()), "ЧГ=0")); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/СервисКриптографииDSS/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSS/Module.bsl new file mode 100644 index 000000000..f26495d81 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSS/Module.bsl @@ -0,0 +1,3897 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// ПОДСИСТЕМА СЕРВИС КРИПТОГРАФИИ DSS +// +// Содержит базовый функционал для взаимодействия с сервисами КриптоПро DSS по протоколу HTTP-сервисов (REST-API) +// - процедуры аутентификации и авторизации +// - работа с сертификатами +// - выполнение криптографических операций +// - сервисные функции +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность + +#Область БазовыеФункции + +// Шифрует данные для переданного списка сертификатов получателей. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// СертификатыПолучателей - ДвоичныеДанные, Структура, ФиксированнаяСтруктура, Массив, ФиксированныйМассив - +// сертификаты получателей зашифрованного сообщения, см. функцию ПолучитьДвоичныеДанныеСертификатов() +// ТипШифрования - Строка - тип шифрования, варианты: CMS или XML +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * ПараметрыШифрования - Структура - содержит дополнительные поля для шифрования, см. документацию по сервису +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция Зашифровать(ИдентификаторПользователя, + ДанныеДокумента, + СертификатыПолучателей, + ТипШифрования = "CMS", + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента); + СписокСертификатов = ПолучитьДвоичныеДанныеСертификатов(СертификатыПолучателей); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Content", СтруктураДокумента.Документ); + ПараметрыЗапроса.Вставить("Encryption", Новый Структура); + ПараметрыЗапроса.Encryption.Вставить("Type", ?(ТипШифрования = "XML", 1, 0)); + ПараметрыЗапроса.Encryption.Вставить("Certificates", СписокСертификатов); + Если ПараметрыОперации = Неопределено Тогда + ПараметрыЗапроса.Encryption.Вставить("Parameters", Новый Структура); + ИначеЕсли ПараметрыОперации.Свойство("ПараметрыШифрования") Тогда + ПараметрыЗапроса.Encryption.Вставить("Parameters", ПараметрыОперации.ПараметрыШифрования); + КонецЕсли; + + Если СписокСертификатов.Количество() > 0 И СтруктураДокумента.ТипДокумента <> "Неопределенно" Тогда + АдресПодключения = НастройкиПользователя.Методы.Документы + "/encrypt"; + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат, СтруктураДокумента.ТипДокумента); + КонецЕсли; + + Иначе + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Ложь); + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, "ПараметрыЗашифрования"); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Зашифровать", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Получает список идентификаторов сертификатов с помощью которых были зашифрованы данные, для указанной учетной записи сервиса. +// Если документ не содержит подходящих сертификатов, то массив пустой. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ТипШифрования - Строка - тип шифрования, варианты: CMS или XML +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СертификатыРасшифрования(ИдентификаторПользователя, ДанныеДокумента, ТипШифрования = "CMS", ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента); + АдресПодключения = НастройкиПользователя.Методы.Документы + "/decrypt/parse"; + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Content", СтруктураДокумента.Документ); + ПараметрыЗапроса.Вставить("Decryption", Новый Структура); + ПараметрыЗапроса.Decryption.Вставить("Type", ?(ТипШифрования = "XML", 1, 0)); + ПараметрыЗапроса.Decryption.Вставить("CertificateId", 0); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СертификатыШифрования", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Расшифровывает данные с использованием переданного идентификатора сертификата пользователя. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ИдентификаторСертификата - Число - идентификатор сертификата на сервере DSS +// ТипШифрования - Строка - тип шифрования, допустимые варианты: CMS или XML +// ПинКод - Строка - пин-код для доступа к закрытому ключу сертификата учетной записи +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// * Транзакция - Булево - признак осуществления операции в рамках подтверждения +// * ТипРезультата - Строка - в каком формате возвращать результат, если использовалась транзакция +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция Расшифровать( + ИдентификаторПользователя, + ДанныеДокумента, + ИдентификаторСертификата, + ТипШифрования = "CMS", + ПинКод = "", + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Документы + "/decrypt"; + + ЭтоТранзакция = СвойствоСтруктуры(ПараметрыОперации, "Транзакция", Ложь); + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента); + ПараметрыЗапроса = Новый Структура(); + ЗначениеПинКода = ПолучитьЗначениеПароля(ПинКод, НастройкиПользователя); + + Если ЭтоТранзакция Тогда + ПараметрыЗапроса.Вставить("Decryption", Новый Структура); + Если ЗначениеЗаполнено(ЗначениеПинКода) Тогда + ПараметрыЗапроса.Decryption.Вставить("PinCode", ЗначениеПинКода); + КонецЕсли; + ТипРезультата = СвойствоСтруктуры(ПараметрыОперации, "ТипРезультата"); + Иначе + ПараметрыЗапроса.Вставить("Content", СтруктураДокумента.Документ); + ПараметрыЗапроса.Вставить("Decryption", Новый Структура); + ПараметрыЗапроса.Decryption.Вставить("Type", ?(ТипШифрования = "XML", 1, 0)); + ПараметрыЗапроса.Decryption.Вставить("PinCode", ЗначениеПинКода); + ПараметрыЗапроса.Decryption.Вставить("CertificateId", ИдентификаторСертификата); + ТипРезультата = СтруктураДокумента.ТипДокумента; + КонецЕсли; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат, ТипРезультата); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Расшифровать", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Вычисляет хеш для переданных данных с указанным алгоритмом +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// АлгоритмХеширования - Строка - тип хеширования, варианты: +// GOST R 34.11-94, +// GR 34.11-2012 256, +// GR 34.11-2012 512, +// SHA-1, +// SHA-256, +// SHA-384, +// SHA-512, +// MD5. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ИнвертироватьПолубайты - Булево - если Истина, предварительно инвертирует байты в полученным результате +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ХешированиеДанных(ИдентификаторПользователя, + ДанныеДокумента, + АлгоритмХеширования = "GR 34.11-2012 256", + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента, Истина); + АдресПодключения = НастройкиПользователя.Методы.ХешДокумента; + ИнвертироватьПолубайты = СвойствоСтруктуры(ПараметрыОперации, "ИнвертироватьПолубайты", Ложь); + + ДанныеЗаголовка = Новый Структура; + ЭлементХеширования = Новый Структура("HashAlgorithm", АлгоритмХеширования); + ДанныеЗаголовка.Вставить("Hash", Новый Структура("Parameters", ЭлементХеширования)); + + ПредставлениеЗаголовка = СервисКриптографииDSSСлужебный.ПодготовитьЗаголовокПотока(ДанныеЗаголовка); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("CPDSS-OPERATION-PARAMS", ПредставлениеЗаголовка); + Заголовки.Вставить("Content-Type", "application/octet-stream"); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, СтруктураДокумента.Документ, "POST", "octet", Заголовки, ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат, СтруктураДокумента.ТипДокумента); + Если ИнвертироватьПолубайты Тогда + РезультатЗапроса.Вставить("Результат", СервисКриптографииDSSASNКлиентСервер.ИнвертироватьПолубайты(РезультатЗапроса.Результат)); + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ХешированиеДанных", ДанныеЗаголовка); + + Возврат РезультатЗапроса; + +КонецФункции + +// Данная функция предназначена для формирования подписи одиночного документа. +// Поддерживает прямой вызов (в т.ч. поточная) и транзакционную схему. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// СвойстваПодписи - Структура - СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиГост, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиXML, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCAdES, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиPDF, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиMSOffice. +// ИдентификаторСертификата - Число - идентификатор сертификата на сервере DSS +// ПинКод - Строка - пин-код для доступа к закрытому ключу сертификата учетной записи +// ПотоковыйРежим - Булево - формирование подписи в потоковом режим. Потовый режим возможно использовать +// только для отделенной CMS подписи без использования транзакции. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// * Транзакция - Булево - признак осуществления операции в рамках подтверждения +// * ТипРезультат - Строка - в каком формате возвращать результат, если использовалась транзакция +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция Подписать(ИдентификаторПользователя, + ДанныеДокумента, + СвойстваПодписи, + ИдентификаторСертификата, + ПинКод = "", + Знач ПотоковыйРежим = Ложь, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Документы; + ЭтоТранзакция = СвойствоСтруктуры(ПараметрыОперации, "Транзакция", Ложь); + ЗначениеПинКода = ПолучитьЗначениеПароля(ПинКод, НастройкиПользователя); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Signature", Новый Структура); + + Если ЗначениеЗаполнено(ЗначениеПинКода) Тогда + ПараметрыЗапроса.Signature.Вставить("PinCode", ЗначениеПинКода); + КонецЕсли; + + Если НЕ ЭтоТранзакция Тогда + ПараметрыЗапроса.Signature.Вставить("CertificateId", ИдентификаторСертификата); + ПараметрыПодписи = Новый Структура(); + + Для каждого СтрокаКлюча Из СвойстваПодписи Цикл + Если СтрокаКлюча.Ключ = "SignatureType" Тогда + ПараметрыЗапроса.Signature.Вставить("Type", СтрокаКлюча.Значение); + ИначеЕсли СтрокаКлюча.Ключ = "DocumentType" ИЛИ СтрокаКлюча.Ключ = "DocumentInfo" Тогда + Продолжить; + Иначе + ПараметрыПодписи.Вставить(СтрокаКлюча.Ключ, СтрокаКлюча.Значение); + КонецЕсли; + КонецЦикла; + + Если ПараметрыПодписи.Количество() > 0 Тогда + ПараметрыЗапроса.Signature.Вставить("Parameters", ПараметрыПодписи); + КонецЕсли; + + Если ПотоковыйРежим Тогда + ПотоковыйРежим = ПараметрыЗапроса.Signature.Type = "CAdES" + И СвойствоСтруктуры(ПараметрыЗапроса.Signature, "Parameters.IsDetached", "false") = "true"; + КонецЕсли; + + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента, ПотоковыйРежим); + Если НЕ ПотоковыйРежим Тогда + ПараметрыЗапроса.Вставить("Content", СтруктураДокумента.Документ); + КонецЕсли; + + ТипРезультата = СтруктураДокумента.ТипДокумента + Иначе + ПотоковыйРежим = Ложь; + ТипРезультата = СвойствоСтруктуры(ПараметрыОперации, "ТипРезультата"); + КонецЕсли; + + Заголовки = Новый Соответствие; + + Если ПотоковыйРежим Тогда + ПредставлениеЗаголовка = СервисКриптографииDSSСлужебный.ПодготовитьЗаголовокПотока(ПараметрыЗапроса); + Заголовки.Вставить("CPDSS-OPERATION-PARAMS", ПредставлениеЗаголовка); + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, СтруктураДокумента.Документ, "POST", "octet", Заголовки, ПараметрыОперации); + Иначе + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", Заголовки, ПараметрыОперации); + КонецЕсли; + + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат, ТипРезультата); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "Подписать", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Данная функция предназначена для формирования подписи пакета документа. Возможные режимы: транзакция и прямой вызов +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. НастройкиПользователяПоУмолчанию() +// МассивДокументов - Массив из см. СервисКриптографииDSSКлиентСервер.ПодготовитьПакетДляПодписи +// СвойстваПодписи - Структура - СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиГост, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиXML, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCAdES, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиPDF, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиMSOffice. +// ИдентификаторСертификата - Число - идентификатор сертификата на сервере DSS +// ПинКод - Строка - пин-код для доступа к закрытому ключу сертификата учетной записи +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// * Транзакция - Булево - признак осуществления операции в рамках подтверждения +// * ТипРезультат - Строка - в каком формате возвращать результат, если использовалась транзакция +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПодписатьПакет(ИдентификаторПользователя, + МассивДокументов, + СвойстваПодписи, + ИдентификаторСертификата, + ПинКод = "", + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Документы + "/packagesignature"; + ЭтоТранзакция = СвойствоСтруктуры(ПараметрыОперации, "Транзакция", Ложь); + ЗначениеПинКода = ПолучитьЗначениеПароля(ПинКод, НастройкиПользователя); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Signature", Новый Структура); + + Если ЗначениеЗаполнено(ЗначениеПинКода) Тогда + ПараметрыЗапроса.Signature.Вставить("PinCode", ЗначениеПинКода); + КонецЕсли; + + Если НЕ ЭтоТранзакция Тогда + ПараметрыЗапроса.Signature.Вставить("CertificateId", ИдентификаторСертификата); + ПараметрыПодписи = Новый Структура(); + ДокументыДляОбработки = СервисКриптографииDSSКлиентСервер.ПодготовитьПакетДляПодписи(МассивДокументов); + ТипРезультата = Новый Массив; + + Для каждого СтрокаКлюча Из СвойстваПодписи Цикл + Если СтрокаКлюча.Ключ = "SignatureType" Тогда + ПараметрыЗапроса.Signature.Вставить("Type", СтрокаКлюча.Значение); + ИначеЕсли СтрокаКлюча.Ключ = "DocumentType" ИЛИ СтрокаКлюча.Ключ = "DocumentInfo" Тогда + Продолжить; + Иначе + ПараметрыПодписи.Вставить(СтрокаКлюча.Ключ, СтрокаКлюча.Значение); + КонецЕсли; + КонецЦикла; + + Если ПараметрыПодписи.Количество() > 0 Тогда + ПараметрыЗапроса.Signature.Вставить("Parameters", ПараметрыПодписи); + КонецЕсли; + + ПараметрыЗапроса.Вставить("Documents", Новый Массив); + Для каждого СтрокаМассива Из ДокументыДляОбработки Цикл + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(СтрокаМассива.Content); + НоваяСтрока = Новый Структура; + НоваяСтрока.Вставить("Content", СтруктураДокумента.Документ); + НоваяСтрока.Вставить("Name", СтрокаМассива.Name); + НоваяСтрока.Вставить("OriginalContent", СтрокаМассива.OriginalContent); + + ПараметрыЗапроса.Documents.Добавить(НоваяСтрока); + ТипРезультата.Добавить(СтрокаМассива.ВернутьКак); + КонецЦикла; + + Иначе + ТипРезультата = СвойствоСтруктуры(ПараметрыОперации, "ТипРезультата", Новый Массив); + КонецЕсли; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + + КоличествоДокументов = РезультатЗапроса.Результат.Results.Количество(); + Если ТипРезультата.Количество() <> КоличествоДокументов Тогда + ТипРезультата = Новый Массив(КоличествоДокументов); + КонецЕсли; + + Результат = Новый Массив; + + Для Счетчик = 0 По КоличествоДокументов - 1 Цикл + ТекущийЭлемент = ТипРезультата[Счетчик]; + Подписанный = СервисКриптографииDSSСлужебный.ПодготовитьРезультатЗапроса(РезультатЗапроса.Результат.Results[Счетчик], ТекущийЭлемент); + Результат.Добавить(Подписанный); + КонецЦикла; + + РезультатЗапроса.Вставить("Результат", Результат); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодписатьПакет", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Проверяет сертификат с помощью сервиса КриптоПро SVS +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ДанныеСертификата - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПроверитьСертификат(ИдентификаторПользователя, ДанныеСертификата, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ПроверкаСертификата; + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеСертификата); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Content", СтруктураДокумента.Документ); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + + Результат = РезультатЗапроса.Результат.Result; + Если НЕ Результат Тогда + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, "ПроверкаСертификата", РезультатЗапроса.Результат.Message); + КонецЕсли; + РезультатЗапроса.Результат = Результат; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Формирует список подписантов для переданного документа, не работает для отделенной подписи +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ТипПодписи - см. СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьСведенияОПодписантах(ИдентификаторПользователя, ДанныеДокумента, ТипПодписи = "CMS", ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ИнформацияПодписантах; + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента); + ИдТиповПодписей = СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей(); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Content", СтруктураДокумента.Документ); + ПараметрыЗапроса.Вставить("SignatureType", ИдТиповПодписей[ТипПодписи]); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + Результат = Новый Массив; + МассивПодписей = СвойствоСтруктуры(РезультатЗапроса.Результат, "SignerInfoList", Новый Массив); + Для каждого СтрокаМассива Из МассивПодписей Цикл + ИндексПодписи = СвойствоСтруктуры(СтрокаМассива, "Index", 0) + 1; + Родитель = СвойствоСтруктуры(СтрокаМассива, "ParentId", 0); + Идентификатор = СвойствоСтруктуры(СтрокаМассива, "Id", 0); + СерийныйНомер = СвойствоСтруктуры(СтрокаМассива, "SignerCertificateInfo.SerialNumber", ""); + Отпечаток = СвойствоСтруктуры(СтрокаМассива, "SignerCertificateInfo.Thumbprint", ""); + Издатель = СвойствоСтруктуры(СтрокаМассива, "SignerCertificateInfo.IssuerName", ""); + ИмяСертификата = СвойствоСтруктуры(СтрокаМассива, "SignerCertificateInfo.SubjectName", ""); + + НоваяСтрока = Новый Структура(); + НоваяСтрока.Вставить("Индекс", ИндексПодписи); + НоваяСтрока.Вставить("Идентификатор", Идентификатор); + НоваяСтрока.Вставить("Родитель", Родитель); + НоваяСтрока.Вставить("СерийныйНомер", НРег(СерийныйНомер)); + НоваяСтрока.Вставить("Отпечаток", НРег(Отпечаток)); + НоваяСтрока.Вставить("Издатель", Издатель); + НоваяСтрока.Вставить("ИмяСертификата", ИмяСертификата); + Результат.Добавить(НоваяСтрока); + КонецЦикла; + + РезультатЗапроса.Вставить("Результат", Результат); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Проверяет подпись документа в различных форматах. +// Для ГОСТ нужно передавать сертификат. +// Для отсоединенной подписи нужно передавать исходный документ и передать дополнительные свойства. +// Для хеш нужно передать дополнительные свойства. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ИсходныйДокумент - ДвоичныеДанные, Строка, Неопределено - один файл, который необходимо обработать при проверке подписи +// ТипПодписи - см. СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей +// СвойстваПроверки - Структура - см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваПроверкиПодписи, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// Сертификат - ДвоичныеДанные, Строка - один файл, содержит данные сертификата который необходимо проверить, +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПроверитьПодпись(ИдентификаторПользователя, + ДанныеДокумента, + ИсходныйДокумент, + ТипПодписи, + СвойстваПроверки, + Сертификат = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ПроверкаПодписи; + ИдТиповПодписей = СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей(); + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Content", СтруктураДокумента.Документ); + ПараметрыЗапроса.Вставить("SignatureType", ИдТиповПодписей[ТипПодписи]); + + Если СвойстваПроверки <> Неопределено Тогда + ПараметрыЗапроса.Вставить("VerifyParams", СвойстваПроверки); + КонецЕсли; + + Если ИсходныйДокумент <> Неопределено Тогда + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ИсходныйДокумент); + ПараметрыЗапроса.Вставить("Source", СтруктураДокумента.Документ); + КонецЕсли; + + Если Сертификат <> Неопределено Тогда + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(Сертификат); + ПараметрыЗапроса.Вставить("Certificate", СтруктураДокумента.Документ); + КонецЕсли; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + МассивСертификатов = Новый Массив; + + Если РезультатЗапроса.Выполнено Тогда + + ЕстьОшибка = Ложь; + ОбщаяОшибка = ""; + Для каждого СтрокаМассива Из РезультатЗапроса.Результат Цикл + ЕстьОшибка = НЕ СтрокаМассива.Result ИЛИ ЕстьОшибка; + Сертификат = Base64Значение(СтрокаМассива.SignerCertificate); + ОбщаяОшибка = ОбщаяОшибка + ?(ПустаяСтрока(ОбщаяОшибка), "", Символы.ПС) + СтрокаМассива.Message; + Если Сертификат.Размер() > 0 Тогда + ПроверкаСертификата = Новый Структура(); + ПроверкаСертификата.Вставить("ПодписьВалидна", СтрокаМассива.Result); + ПроверкаСертификата.Вставить("Сертификат", Сертификат); + ПроверкаСертификата.Вставить("Отпечаток", НРег(СвойствоСтруктуры(СтрокаМассива, "SignerCertificateInfo.Thumbprint", ""))); + МассивСертификатов.Добавить(ПроверкаСертификата); + КонецЕсли; + КонецЦикла; + + Если ЕстьОшибка Тогда + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, "ПроверкаПодписи", ОбщаяОшибка); + КонецЕсли; + РезультатЗапроса.Вставить("Результат", НЕ ЕстьОшибка); + + РезультатЗапроса.Вставить("Сертификаты", МассивСертификатов); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверитьПодпись", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +#КонецОбласти + +#Область Аутентификация + +// Выполняет аутентификацию пользователя в серверном контексте по сценарию "Авторизация с использованием учетных данных пользователя" +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция АутентификацияПоЛогину(ИдентификаторПользователя, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + Принудительно = СвойствоСтруктуры(ВходящиеПараметры, "Принудительно", Ложь); + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ВходящиеПараметры); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ВходящиеПараметры); + АдресПодключения = НастройкиПользователя.Методы.Авторизация; + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("client_id", НастройкиПользователя.Подключение.ИдентификаторКлиента); + ПараметрыЗапроса.Вставить("username", НастройкиПользователя.Логин); + ПараметрыЗапроса.Вставить("resource", НастройкиПользователя.Подключение.ИдентификаторПодписи); + ПараметрыЗапроса.Вставить("grant_type", "password"); + ПараметрыЗапроса.Вставить("password", ПолучитьЗначениеПароля(НастройкиПользователя.Пароль, НастройкиПользователя)); + + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST"); + СохранитьНастройки = Ложь; + + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса); + Если РезультатЗапроса.Выполнено Тогда + СохранитьНастройки = Истина; + РезультатЗапроса = ОбновитьПолитикуПользователя(НастройкиПользователя, Принудительно, ВходящиеПараметры); + РезультатЗапроса.МаркерОбновлен = Истина; + РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + Иначе + РезультатЗапроса.Ошибка = РезультатЗапроса.Ошибка; + КонецЕсли; + + Если СохранитьНастройки Тогда + СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(НастройкиПользователя.Ссылка, НастройкиПользователя, ИсточникНастроек); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "АутентификацияПоЛогину", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Выполняет аутентификацию пользователя по сценарию "Авторизация по сертификату" в серверном контексте +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * СертификатАвторизации - ДвоичныеДанные +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция АутентификацияПоСертификату(ИдентификаторПользователя, ПараметрыОперации = Неопределено) Экспорт + + Результат = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Ложь); + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ВходящиеПараметры); + АдресПодключения = НастройкиПользователя.Методы.АвторизацияПоСертификату; + + СертификатАвторизации = СвойствоСтруктуры(ВходящиеПараметры, "СертификатАвторизации"); + Если СертификатАвторизации = Неопределено Тогда + СертификатАвторизации = СервисКриптографииDSSСлужебный.ПолучитьЗакрытыеДанные( + НастройкиПользователя, + "СертификатАвторизации"); + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(СертификатАвторизации) Тогда + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Результат, "НеЗагруженСертификатАвторизации"); + Возврат Результат; + КонецЕсли; + + ВременныйФайл = ПолучитьИмяВременногоФайла("pfx"); + СертификатАвторизации.Записать(ВременныйФайл); + + СертификатКлиента = Новый СертификатКлиентаФайл(ВременныйФайл, ПолучитьЗначениеПароля(НастройкиПользователя.ПарольСертификата, НастройкиПользователя)); + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("client_id", НастройкиПользователя.Подключение.ИдентификаторКлиента); + ПараметрыЗапроса.Вставить("response_type", "code"); + ПараметрыЗапроса.Вставить("scope", "dss+offline_access"); + ПараметрыЗапроса.Вставить("redirect_uri", НастройкиПользователя.Подключение.Заглушка); + ПараметрыЗапроса.Вставить("resource", НастройкиПользователя.Подключение.ИдентификаторПодписи); + ПараметрыЗапроса.Вставить("promt", "none"); + + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения, СертификатКлиента); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "GET"); + + УдалитьФайлы(ВременныйФайл); + + Если РезультатЗапроса.Выполнено Тогда + ПараметрыОтвета = СервисКриптографииDSSСлужебный.ПолучитьПараметрыИзОтвета(РезультатЗапроса.Заголовки["Location"]); + КодАвторизации = ПараметрыОтвета["code"]; + Если КодАвторизации <> Неопределено Тогда + Результат = ПолучитьТокенПоКодуАвторизации(КодАвторизации, НастройкиПользователя, ВходящиеПараметры); + Результат.МаркерОбновлен = Истина; + Результат.Вставить("НастройкиПользователя", НастройкиПользователя); + Иначе + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Результат, "ОшибкаТокена"); + КонецЕсли; + Иначе + Результат = РезультатЗапроса; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(Результат, "АутентификацияПоСертификату", ПараметрыЗапроса); + + Возврат Результат; + +КонецФункции + +// Формирует адрес подключения для веб-формы +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// НеявныйТипРазрешения - Булево - включает режим неявного типа разрешения на сервере DSS +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// Строка - web-адрес для открытия HTML формы аутентификации +// +Функция ПолучитьАдресВебАутентификации(ИдентификаторПользователя, НеявныйТипРазрешения = Ложь, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + ПараметрыЗапроса = Новый Структура(); + ПараметрыЗапроса.Вставить("client_id", НастройкиПользователя.Подключение.ИдентификаторКлиента); + ПараметрыЗапроса.Вставить("resource", НастройкиПользователя.Подключение.ИдентификаторПодписи); + ПараметрыЗапроса.Вставить("scope", "dss+offline_access"); + ПараметрыЗапроса.Вставить("redirect_uri", НастройкиПользователя.Подключение.Заглушка); + ПараметрыЗапроса.Вставить("login_hint", НастройкиПользователя.Логин); + + Если НЕ НеявныйТипРазрешения Тогда + ПараметрыЗапроса.Вставить("response_type", "code"); + Иначе + ПараметрыЗапроса.Вставить("response_type", "token"); + КонецЕсли; + + АдресПодключения = НастройкиПользователя.Методы.Аутентификация; + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); + + ПараметрыАдреса = СервисКриптографииDSSСлужебный.ПротоколПодключения(СвойстваПодключения.ЗащищенноеСоединение) + "://" + + СвойстваПодключения.Сервер + "/" + + СвойстваПодключения.АдресПодключения + "?" + + СервисКриптографииDSSСлужебный.СтруктураВСтроку(ПараметрыЗапроса); + + Возврат ПараметрыАдреса; + +КонецФункции + +// Выполняет окончательный шаг аутентификации: получает токен по коду авторизации, +// является продолжением других процессов аутентификации. +// +// Параметры: +// КодАвторизации - Строка - маркер авторизации полученный на предыдущих шагах аутентификации +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьТокенПоКодуАвторизации(КодАвторизации, ИдентификаторПользователя = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + Принудительно = СвойствоСтруктуры(ВходящиеПараметры, "Принудительно", Ложь); + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ВходящиеПараметры); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ВходящиеПараметры); + АдресПодключения = НастройкиПользователя.Методы.Авторизация; + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("client_id", НастройкиПользователя.Подключение.ИдентификаторКлиента); + ПараметрыЗапроса.Вставить("grant_type", "authorization_code"); + ПараметрыЗапроса.Вставить("code", КодАвторизации); + ПараметрыЗапроса.Вставить("redirect_uri", НастройкиПользователя.Подключение.Заглушка); + + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST"); + СохранитьНастройки = Ложь; + + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса); + Если РезультатЗапроса.Выполнено Тогда + СохранитьНастройки = Истина; + РезультатЗапроса = ОбновитьПолитикуПользователя(НастройкиПользователя, Принудительно, ВходящиеПараметры); + РезультатЗапроса.МаркерОбновлен = Истина; + РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + КонецЕсли; + + Если СохранитьНастройки Тогда + СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(НастройкиПользователя.Ссылка, НастройкиПользователя, ИсточникНастроек); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьТокенПоКодуАвторизации", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Выполняет обновление токена авторизации в случае если токен обновления был получен из сервиса в предыдущих вызовах +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ОбновитьТокенАутентификации(ИдентификаторПользователя, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + Принудительно = СвойствоСтруктуры(ВходящиеПараметры, "Принудительно", Ложь); + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ВходящиеПараметры); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ВходящиеПараметры); + АдресПодключения = НастройкиПользователя.Методы.Авторизация; + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); + ТокенОбновления = ПолучитьЗначениеПароля(НастройкиПользователя.ТокенАвторизации.ТокенОбновления, НастройкиПользователя); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("client_id", НастройкиПользователя.Подключение.ИдентификаторКлиента); + ПараметрыЗапроса.Вставить("grant_type", "refresh_token"); + ПараметрыЗапроса.Вставить("refresh_token", ТокенОбновления); + + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "POST"); + СохранитьНастройки = Ложь; + + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса = ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса); + Если РезультатЗапроса.Выполнено Тогда + СохранитьНастройки = Истина; + РезультатЗапроса.МаркерОбновлен = Истина; + КонецЕсли; + КонецЕсли; + + Если СохранитьНастройки Тогда + РезультатЗапроса = ОбновитьПолитикуПользователя(НастройкиПользователя, Принудительно, ВходящиеПараметры); + РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); + СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(НастройкиПользователя.Ссылка, НастройкиПользователя, ИсточникНастроек); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ОбновитьТокенАутентификации", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Выполняет проверку аутентификации учетной записи на сервере DSS/ +// При необходимости проводит первичную аутентификацию или обновляет маркер безопасности. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ДатаСеанса - Дата +// * ИсточникНастроек - Строка +// * Принудительно - Булево +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПроверитьАутентификацию(ИдентификаторПользователя, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + + ВидАутентификации = НастройкиПользователя.ПервичнаяАутентификация; + ПарольПользователя = СвойствоСтруктуры(ПараметрыОперации, "Пароль"); + Принудительно = СвойствоСтруктуры(ПараметрыОперации, "Принудительно", Ложь); + + Если ЗначениеЗаполнено(ПарольПользователя) Тогда + Если ВидАутентификации = Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации Тогда + НастройкиПользователя.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля(ПарольПользователя, + НастройкиПользователя.АвторизованныйПользователь); + Иначе + НастройкиПользователя.Пароль = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля(ПарольПользователя, + НастройкиПользователя.АвторизованныйПользователь); + КонецЕсли; + КонецЕсли; + + РезультатЗапроса = ПроверитьТокенАутентификации(НастройкиПользователя, Принудительно, ПараметрыОперации); + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПроверкаАутентификации", Неопределено); + + Возврат РезультатЗапроса; + +КонецФункции + +// Разбирает полученный токен авторизации (JWT), извлекает из него служебную информацию, проверяет на подмену логина +// +// Параметры: +// НастройкиПользователя - см. НастройкиПользователяПоУмолчанию +// РезультатЗапроса - Структура - дополняет переданную структуру ошибкой, если маркер не соответствует ожидаемому логину: +// * Выполнено - Булево - приравнивает Ложь +// * Ошибка - Строка - заполняет описание ошибки +// * КодОшибки - Строка - заполняет код ошибки +// +// Возвращаемое значение: +// Булево - Истина, если проверка пройдена +// +Функция ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса) Экспорт + + Результат = РезультатЗапроса; + НовыеДанные = РезультатЗапроса.Результат; + + ТокенАвторизации= НастройкиПользователя.ТокенАвторизации; + ТекущийТокен = ПолучитьЗначениеПароля(ТокенАвторизации.Токен, НастройкиПользователя); + НовыйТокен = СвойствоСтруктуры(НовыеДанные, "AccessToken"); + Длительность = 0; + + Если НовыйТокен <> Неопределено Тогда + Длительность = СвойствоСтруктуры(НовыеДанные, "ExpiresIn", 0); + Токен = НовыйТокен; + ТипТокена = СвойствоСтруктуры(НовыеДанные, "tokentype", "Bearer"); + ТокенОбновления = СвойствоСтруктуры(НовыеДанные, "RefreshToken", ""); + Иначе + Длительность = СвойствоСтруктуры(НовыеДанные, "Expires_In", 0); + Токен = СвойствоСтруктуры(НовыеДанные, "Access_Token", ""); + ТипТокена = СвойствоСтруктуры(НовыеДанные, "token_type", "Bearer"); + ТокенОбновления = СвойствоСтруктуры(НовыеДанные, "Refresh_Token", ""); + КонецЕсли; + + ДанныеТокена = РазобратьТокенАвторизации(Токен); + // добавить проверку на сервис ЦИ и логин, актуально для веб-авторизации + Если ВРег(ДанныеТокена.Логин) = ВРег(НастройкиПользователя.Логин) Тогда + ТокенАвторизации.Токен = СервисКриптографииDSSКлиентСервер.ОбъектПароля(Токен, 0); + ТокенАвторизации.ТипТокена = ТипТокена; + ТокенАвторизации.ТокенОбновления= СервисКриптографииDSSКлиентСервер.ОбъектПароля(ТокенОбновления, 0); + НастройкиПользователя.ЭлектроннаяПочта = ДанныеТокена.ЭлектроннаяПочта; + НастройкиПользователя.Телефон = ДанныеТокена.Телефон; + НастройкиПользователя.ИдентификаторНаСервере = ДанныеТокена.Идентификатор; + + Если ТекущийТокен <> Токен Тогда + ТокенАвторизации.СрокДействия = СервисКриптографииDSSСлужебный.ДатаСеанса() + + Длительность; + КонецЕсли; + + Иначе + Результат = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Ложь); + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Результат, "ПроверкаМаркерДоступа"); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область Сертификаты + +// Обращение к сервису для установки сертификата. Допускает формат сертификата как в кодировке DER так и BER +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ДанныеСертификата - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// подробнее в СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция УстановитьСертификат(ИдентификаторПользователя, ДанныеСертификата, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Сертификаты; + + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеСертификата); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("certificate", СтруктураДокумента.Документ); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УстановитьСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Получает данные одного и всех сертификатов учетной записи +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS, Структура - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - идентификатор сертификата в сервисе DSS +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяются поля: +// * ПроверитьНаличиеВБазе - Булево - синхронизировать получены данные с сервера с данным из РегистраСведений.СертификатыПользователяDSS +// +// Возвращаемое значение: +// Структура - подробнее СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию: +// * Результат - Соответствие - список сертификатов +// * Выполнено - Булево +// * МаркерОбновлен - Булево +// +Функция ПолучитьСертификатыСервиса(ИдентификаторПользователя, ИдентификаторСертификата = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ПроверитьНаличиеВБазе = СвойствоСтруктуры(ПараметрыОперации, "ПроверитьНаличиеВБазе", Ложь); + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Сертификаты; + + ОдинСертификат = Ложь; + Если ЗначениеЗаполнено(ИдентификаторСертификата) Тогда + АдресПодключения = АдресПодключения + "/" + XMLСтрока(ИдентификаторСертификата); + ОдинСертификат = Истина; + КонецЕсли; + + ПараметрыЗапроса = Новый Структура; + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "GET", "json", , ПараметрыОперации); + РезультатВыполнения = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(); + ЗаполнитьЗначенияСвойств(РезультатВыполнения, РезультатЗапроса); + + Если РезультатЗапроса.Выполнено Тогда + // разбираем ответ и формируем результат + СписокСертификатов = Новый Соответствие; + + Если ОдинСертификат Тогда + МассивРезультата = Новый Массив; + МассивРезультата.Добавить(РезультатЗапроса.Результат); + Иначе + МассивРезультата = РезультатЗапроса.Результат; + КонецЕсли; + + ПаролиСертификатов = СервисКриптографииDSSСлужебный.ПолучитьЗакрытыеДанные(НастройкиПользователя, "Сертификаты"); + + Для каждого СтрокаМассива Из МассивРезультата Цикл + ДанныеСертификата = СвойствоСтруктуры(СтрокаМассива, "CertificateBase64"); + СвойстваСертификата = ПолучитьОбъектСертификата(Base64Значение(ДанныеСертификата)); + Издатель = СвойствоСтруктуры(СвойстваСертификата, "Издатель.CN"); + ВнутреннийНомер = СвойствоСтруктуры(СтрокаМассива, "ID", 0); + НуженПинКод = СвойствоСтруктуры(СтрокаМассива, "HasPin", Ложь); + ОтпечатокСертификата= НРег(СвойстваСертификата.Отпечаток); + ОсновнойСертификат = СвойствоСтруктуры(СтрокаМассива, "IsDefault", Ложь); + АлгоритмыХеширования= СвойствоСтруктуры(СтрокаМассива, "HashAlgorithms", Новый Массив); + КомуВыдан = ЭлектроннаяПодпись.ПредставлениеСубъекта(СвойстваСертификата); + ПарольСертификата = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля( + ПаролиСертификатов[ОтпечатокСертификата], НастройкиПользователя.АвторизованныйПользователь); + Представление = СвойствоСтруктуры(СтрокаМассива, "FriendlyName", ""); + Представление = ?(ПустаяСтрока(Представление), СвойстваСертификата.Наименование, Представление); + Представление = ?(ПустаяСтрока(Представление), НСтр("ru = 'Не задано имя'"), Представление); + + НоваяСтрока = СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя(); + НоваяСтрока.Идентификатор = ВнутреннийНомер; + НоваяСтрока.Отпечаток = ОтпечатокСертификата; + НоваяСтрока.ТребуетсяПинКод = НуженПинКод; + НоваяСтрока.ПинКод = ПарольСертификата; + НоваяСтрока.Основной = ОсновнойСертификат; + НоваяСтрока.Представление = Представление; + НоваяСтрока.Содержимое = ДанныеСертификата; + НоваяСтрока.Издатель = Издатель; + НоваяСтрока.ДатаНачала = СвойстваСертификата.ДатаНачала; + НоваяСтрока.ДатаОкончания = СвойстваСертификата.ДатаОкончания; + НоваяСтрока.АлгоритмыХеширования = АлгоритмыХеширования; + НоваяСтрока.КомуВыдан = КомуВыдан; + + СписокСертификатов.Вставить(ОтпечатокСертификата, НоваяСтрока); + КонецЦикла; + + Если ПроверитьНаличиеВБазе Тогда + ПараметрыФоновогоЗадания = Новый Структура(); + ПараметрыФоновогоЗадания.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФоновогоЗадания.Вставить("СписокСертификатов", СписокСертификатов); + + СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ОбновитьКэшСертификатов", ПараметрыФоновогоЗадания); + + Для каждого СтрокаКлюча Из СписокСертификатов Цикл + СтрокаКлюча.Значение.Содержимое = "";// для уменьшения размера сеансовых данных + КонецЦикла; + + КонецЕсли; + + РезультатВыполнения.Вставить("Результат", СписокСертификатов); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатВыполнения, "ПолучитьДанныеСертификатов", ПараметрыЗапроса); + + Возврат РезультатВыполнения; + +КонецФункции + +// Проверяет валидность переданного пин-кода для указанного сертификата. +// Удобна в сценариях проверки пин-кода до выполнения самой криптографический операции. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - внутренний идентификатор сервиса, аналог кода справочника. +// ПинКодСертификата - Строка - проверяемый пин-код +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию. +// +Функция ВалидацияПинКодаСертификата(ИдентификаторПользователя, ИдентификаторСертификата, ПинКодСертификата = "", ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Сертификаты + "/%1/pin/check"; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, XMLСтрока(ИдентификаторСертификата)); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Pin", ПолучитьЗначениеПароля(ПинКодСертификата, НастройкиПользователя)); + ПараметрыЗапроса.Вставить("CheckAttempts", Истина); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + Если НЕ РезультатЗапроса.Результат.IsValid Тогда + РезультатЗапроса.Выполнено = Ложь; + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, РезультатЗапроса.Результат.ErrorDescription); + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ВалидацияПинКодаСертификата", ПараметрыЗапроса); + + Возврат РезультатЗапроса + +КонецФункции + +// Смена пин-кода для указанного сертификата +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - внутренний идентификатор сервиса, аналог кода справочника. +// СтарыйПинКод - Строка - текущий пин-код, может быть пустой строкой +// НовыйПинКод - Строка - устанавливаемый пин-код, может быть пустой строкой +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию. +// +Функция СменитьПинКодСертификата(ИдентификаторПользователя, ИдентификаторСертификата, СтарыйПинКод, НовыйПинКод, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Сертификаты + "/%1/pin"; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, XMLСтрока(ИдентификаторСертификата)); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("OldPin", ПолучитьЗначениеПароля(СтарыйПинКод, НастройкиПользователя)); + ПараметрыЗапроса.Вставить("NewPin", ПолучитьЗначениеПароля(НовыйПинКод, НастройкиПользователя)); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + ДопПараметры = Новый Структура("ПроверитьНаличиеВБазе", Истина); + РезультатОбновления = ПолучитьСертификатыСервиса(НастройкиПользователя, Неопределено, ДопПараметры); + Если РезультатОбновления.Выполнено Тогда + НастройкиПользователя.Сертификаты = РезультатОбновления.Результат; + РезультатЗапроса.МаркерОбновлен = Истина; + РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СменитьПинКодСертификата", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Установка основным (по-умолчанию)сертификата с указанным идентификатором +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - внутренний идентификатор сервиса, аналог кода справочника. +// Установить - Булево - установить сертификат основным или отменить. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию. +// +Функция НазначитьОсновнымСертификат(ИдентификаторПользователя, ИдентификаторСертификата, Установить = Истина, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Сертификаты + "/%1/default"; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, XMLСтрока(ИдентификаторСертификата)); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Default", Установить); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "НазначитьОсновнымСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Возвращает установленный на сервисе сертификат в виде объекта платформы: СертификатКриптографии +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - внутренний идентификатор сервиса, аналог кода справочника. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию. +// +Функция ПолучитьДанныеСертификата(ИдентификаторПользователя, ИдентификаторСертификата, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, ИдентификаторСертификата); + РезультатЗапроса = ПолучитьСертификатыСервиса(НастройкиПользователя, ТекущийСертификат.Идентификатор); + + Если РезультатЗапроса.Выполнено Тогда + Для каждого СтрокаКлюча Из РезультатЗапроса.Результат Цикл + ДанныеСертификата = Base64Значение(СтрокаКлюча.Значение.Содержимое); + РезультатЗапроса.Вставить("Результат", ПолучитьОбъектСертификата(ДанныеСертификата, Истина)); + КонецЦикла; + КонецЕсли; + + Возврат РезультатЗапроса; + +КонецФункции + +// Возвращает структуру описание сертификата построенную на основе XML описания +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - внутренний идентификатор сервиса, аналог кода справочника. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию. +// +Функция ПолучитьСвойстваСертификата(ИдентификаторПользователя, ИдентификаторСертификата, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Если ТипЗнч(ИдентификаторСертификата) = Тип("Число") Тогда + ИщемСертификат = ИдентификаторСертификата; + Иначе + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, ИдентификаторСертификата); + ИщемСертификат = ТекущийСертификат.Идентификатор; + КонецЕсли; + + АдресПодключения = НастройкиПользователя.Методы.Сертификаты + "/%1/content?format=%2"; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, XMLСтрока(ИщемСертификат), 2); + ПараметрыЗапроса = Новый Структура; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "GET", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = СервисКриптографииDSSСлужебный.ЗаполнитьСведенияСертификатаXMLОписание(РезультатЗапроса.Результат); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьСвойстваСертификата", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +#КонецОбласти + +#Область ЗапросыНаСертификат + +// Обращение к сервису для генерации закрытого ключа и формирование содержимого запроса на сертификат PKSC10 +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// УдостоверяющийЦентр - Число - идентификатор удостоверяющего центра зарегистрированного в сервисе +// КриптоПровайдер - Строка - идентификатор криптопровайдера зарегистрированного в сервисе +// ШаблонСертификата - Строка - шаблон используемый при создании запроса на сертификат, который зарегистрирован в сервисе +// ПоляАтрибутов - Соответствие - перечисление полей, которые используются при формировании запроса на сертификат, +// ключом является OID поля. +// ПинКод - Строка - значение пин-кода для создаваемого закрытого ключа +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СоздатьЗапросНаСертификат(ИдентификаторПользователя, + УдостоверяющийЦентр, + КриптоПровайдер, + ШаблонСертификата, + ПоляАтрибутов, + ПинКод = "", + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ЗапросНаСертификат; + ЭтоТранзакция = СвойствоСтруктуры(ПараметрыОперации, "Транзакция", Ложь); + ЗначениеПинКода = ПолучитьЗначениеПароля(ПинКод, НастройкиПользователя); + + ПараметрыЗапроса = Новый Структура; + Если НЕ ЭтоТранзакция Тогда + ПараметрыЗапроса.Вставить("AuthorityId", УдостоверяющийЦентр); + ПараметрыЗапроса.Вставить("Template", ШаблонСертификата); + КонецЕсли; + + Если ЗначениеЗаполнено(ЗначениеПинКода) Тогда + ПараметрыЗапроса.Вставить("PinCode", ЗначениеПинКода); + КонецЕсли; + ПараметрыЗапроса.Вставить("DistinguishedName", ПоляАтрибутов); + ПараметрыЗапроса.Вставить("Parameters", Новый Структура("GroupId", КриптоПровайдер)); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + Результат = СвойстваЗапросаНаСертификат(РезультатЗапроса.Результат); + РезультатЗапроса.Результат = Результат; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Обращение к сервису для получения реестра запросов на сертификат. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ТолькоАктуальные - Булево - проверяемое поле по умолчанию Истина, список включает только запросы, которые +// еще не обработаны. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СписокЗапросовНаСертификат(ИдентификаторПользователя, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ЗапросНаСертификат; + ТолькоАктуальные = СвойствоСтруктуры(ПараметрыОперации, "ТолькоАктуальные", Истина); + + ПараметрыЗапроса = Новый Структура; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "GET", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + Результат = Новый Массив; + + Для Каждого СтрокаМассива Из РезультатЗапроса.Результат Цикл + ДанныеЗапроса = СвойстваЗапросаНаСертификат(СтрокаМассива); + Если НЕ ТолькоАктуальные ИЛИ ДанныеЗапроса.Статус = "Обрабатывается" Тогда + Результат.Добавить(ДанныеЗапроса); + КонецЕсли; + КонецЦикла; + + РезультатЗапроса.Вставить("Результат", Результат); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Получает свойства ранее созданного запроса на сертификат. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. НастройкиПользователяПоУмолчанию() +// ИдентификаторЗапроса - Число - идентификатор запроса на сертификат, назначенный ему при создании +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьЗапросНаСертификат(ИдентификаторПользователя, + ИдентификаторЗапроса, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ЗапросНаСертификат; + АдресПодключения = АдресПодключения + "/" + Формат(ИдентификаторЗапроса, "ЧГ=0"); + ПараметрыЗапроса = Новый Структура; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "GET", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + Результат = СвойстваЗапросаНаСертификат(РезультатЗапроса.Результат); + РезультатЗапроса.Результат = Результат; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Удаляет ранее созданный запрос на сертификат на сервере. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторЗапроса - Число - идентификатор запроса на сертификат, назначенный ему при создании +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция УдалитьЗапросНаСертификат(ИдентификаторПользователя, + ИдентификаторЗапроса, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ЗапросНаСертификат; + АдресПодключения = АдресПодключения + "/" + Формат(ИдентификаторЗапроса, "ЧГ=0"); + ПараметрыЗапроса = Новый Структура; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "DELETE", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = Истина; + Иначе + РезультатЗапроса.Результат = Ложь; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗапросНаСертификат", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +#КонецОбласти + +#Область СервисныеФункции + +// Получает доступные настройки политики для указанного пользователя (требует предварительной авторизации) +// +// Параметры: +// НастройкиПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьПараметрыПолитики(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.ПолитикаПодписи; + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); + Токен = ПолучитьЗначениеПароля(НастройкиПользователя.ТокенАвторизации.Токен, НастройкиПользователя); + + ПараметрыЗапроса = Новый Структура; + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", НастройкиПользователя.ТокенАвторизации.ТипТокена + " " + + Токен); + + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыЗапроса, "GET", Заголовки, "json_list"); + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьПараметрыПолитики", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Создает транзакцию на сервере DSS c передачей необходимых данных. +// Данный функционал требуется, если в настройках пользователя для выполнения операций используется режим. +// подтверждения с использованием вторичной авторизации: SMS, Email, мобильные приложения. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ДанныеЗапроса - Структура - специфические поля передаваемые для создания транзакции +// КодОперации - Число - код вида создаваемой транзакции, список всех кодов заполняется в момент получения политики пользователя +// ДанныеДокумента - ДвоичныеДанные, Строка, Массив - для некоторых видов транзакций необходимо передавать данные для обработки, +// см. также СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СоздатьТранзакцию(ИдентификаторПользователя, ДанныеЗапроса, КодОперации, ДанныеДокумента = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + АдресПодключения = НастройкиПользователя.Методы.Транзакции; + + ДополнительныеПараметры = ДанныеЗапроса; + Если ТипЗнч(ДанныеЗапроса) = Тип("Структура") Тогда + ДополнительныеПараметры = Новый Массив; + Для каждого СтрокаКлюча Из ДанныеЗапроса Цикл + НоваяСтрока = Новый Структура("Name, Value", СтрокаКлюча.Ключ, XMLСтрока(СтрокаКлюча.Значение)); + ДополнительныеПараметры.Добавить(НоваяСтрока); + КонецЦикла; + КонецЕсли; + + ВозвращатьКак = Новый Массив; + СтруктураДокумента = Новый Структура; + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("OperationCode", КодОперации); + ПараметрыЗапроса.Вставить("Parameters", ДополнительныеПараметры); + + Если ТипЗнч(ДанныеДокумента) = Тип("Массив") Тогда + ДокументыДляОбработки = СервисКриптографииDSSКлиентСервер.ПодготовитьПакетДляПодписи(ДанныеДокумента); + МассивДокументов = Новый Массив; + Для каждого СтрокаМассива Из ДокументыДляОбработки Цикл + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(СтрокаМассива.Content); + НоваяСтрока = Новый Структура("Name, Content", СтрокаМассива.Name, СтруктураДокумента.Документ); + МассивДокументов.Добавить(НоваяСтрока); + ВозвращатьКак.Добавить(СтрокаМассива.ВернутьКак); + КонецЦикла; + ПараметрыЗапроса.Вставить("Documents", МассивДокументов); + + ИначеЕсли ДанныеДокумента <> Неопределено Тогда + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента); + ПараметрыЗапроса.Вставить("Document", СтруктураДокумента.Документ); + ВозвращатьКак = СтруктураДокумента.ТипДокумента; + + КонецЕсли; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(ИдентификаторПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = РезультатЗапроса.Результат; + РезультатЗапроса.Вставить("ТипРезультата", ВозвращатьКак); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьТранзакцию", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Заполняет структуру НастройкиПользователя данными из сервиса: настроенная политика и список сертификатов учетной записи +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// Принудительно - Булево - принудительный запрос к сервису для повторного получения данных об учетной записи +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ОбновитьПолитикуПользователя(ИдентификаторПользователя, Принудительно = Ложь, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатВызова = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Ложь); + + Если НЕ НастройкиПользователя.Политика.Заполнено ИЛИ Принудительно Тогда + + Удачно = Ложь; + РезультатЗапроса= ПолучитьПараметрыПолитики(НастройкиПользователя, ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + СервисКриптографииDSSСлужебный.НастройкиРаботыАнализПолитикиПользователя(НастройкиПользователя.Политика, РезультатЗапроса.Результат); + КонецЕсли; + + ПараметрыПоиска = Новый Структура("ПроверитьНаличиеВБазе", ЗначениеЗаполнено(НастройкиПользователя.Ссылка)); + РезультатЗапроса= ПолучитьСертификатыСервиса(НастройкиПользователя, Неопределено, ПараметрыПоиска); + + Если РезультатЗапроса.Выполнено Тогда + НастройкиПользователя.Сертификаты = РезультатЗапроса.Результат; + Удачно = Истина; + КонецЕсли; + + РезультатВызова.Выполнено = Удачно; + + Иначе + РезультатВызова.Выполнено = Истина; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатВызова, "ОбновитьПолитикуПользователя", ""); + + Возврат РезультатВызова; + +КонецФункции + +// Данная функция служит для получения список сервисов DSS (ЦИ и СЭП) доступных на указанном адресе сервера +// +// Параметры: +// АдресСервера - Строка - адрес сервера с опубликованной информацией о списках ЦИ и СЭП +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьОписаниеСервиса(АдресСервера, ПараметрыОперации = Неопределено) Экспорт + + СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресСервера); + АдресПодключения = ".well-known/webfinger"; + + СвойстваПодключения = Новый Структура; + СвойстваПодключения.Вставить("Сервер", СоставАдреса.ИмяСервера); + СвойстваПодключения.Вставить("Порт", СоставАдреса.Порт); + СвойстваПодключения.Вставить("ЗащищенноеСоединение", НРег(СоставАдреса.Схема) = "https"); + СвойстваПодключения.Вставить("ТаймАут", 20); + + ПараметрыЗапроса = Новый Структура(); + ПараметрыЗапроса.Вставить("resource", АдресСервера); + + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, АдресПодключения, ПараметрыЗапроса, "GET", , "text"); + + Если РезультатЗапроса.Выполнено Тогда + Результат = СервисКриптографииDSSСлужебный.РазобратьОтветСервисаОбнаружения(РезультатЗапроса.Результат); + РезультатЗапроса.Результат = Результат; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОписаниеСервиса", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Выполняет произвольный запрос к сервису по переданным параметрам запроса +// +// Параметры: +// НастройкиПользователя - см. НастройкиПользователяПоУмолчанию +// АдресПодключения - Строка - адрес для выполнения запроса +// ПараметрыЗапроса - Структура - содержит перечисления полей для выполнения запроса +// HTTPМетод - Строка - содержит метод вызова GET, POST и прочие варианты +// ТипСодержания - Строка - указывает как формировать тело запроса из ПараметрыМетода, поддерживаются варианты: +// octet: передать двоичными данными, +// text: передать структуру как форматированную строку, +// json_list: передать как json и вернуть как Соответствие, +// json: передать как json. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ВыполнитьЗапросКСервису(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, HTTPМетод, ТипСодержания) Экспорт + + Заголовки = Новый Соответствие; + СекретПользователя = ПолучитьПредставлениеСекрета(НастройкиПользователя, ПолучитьЗначениеПароля(НастройкиПользователя.Пароль, НастройкиПользователя)); + Заголовки.Вставить("Authorization", СекретПользователя); + + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресПодключения); + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения); + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, + СвойстваПодключения.АдресПодключения, + ПараметрыЗапроса, + HTTPМетод, + Заголовки, + ТипСодержания); + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ВыполнитьЗапросКСервису", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Получает выборку записей аудита (действий пользователя) на сервере +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ФильтрыОтбора - Массив из Структура, Неопределено - если передан массив, то каждый элемент это структура с полями: +// * Колонка - Число, Неопределено - колонка в БД, по которой осуществляется фильтрация +// * Операция - Число, Неопределено - операция, которая применяется фильтром +// * Значение - Строка, Неопределено - значение фильтра +// НачальнаяПозиция - Неопределено, Число - если не задано, то Значение по умолчанию - 0 +// КонечнаяПозиция - Неопределено, Число - если не задано, то Значение по умолчанию - 10 к начальной позиции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьЗаписиАудита(ИдентификаторПользователя, + ФильтрыОтбора, + НачальнаяПозиция = Неопределено, + КонечнаяПозиция = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + АдресПодключения = НастройкиПользователя.Методы.Аудит_ЗапросОтчета; + + ПараметрыЗапроса = Новый Структура; + Если ЗначениеЗаполнено(НачальнаяПозиция) Тогда + ПараметрыЗапроса.Вставить("StartPosition", НачальнаяПозиция); + Иначе + ПараметрыЗапроса.Вставить("StartPosition", 0); + КонецЕсли; + + Если ЗначениеЗаполнено(КонечнаяПозиция) Тогда + ПараметрыЗапроса.Вставить("EndPosition", КонечнаяПозиция); + Иначе + ПараметрыЗапроса.Вставить("EndPosition", ПараметрыЗапроса.StartPosition + 10); + КонецЕсли; + + Если ФильтрыОтбора <> Неопределено Тогда + + МассивФильтров = Новый Массив; + + Для Каждого СтрокаМассива Из ФильтрыОтбора Цикл + НоваяСтрока = Новый Структура; + НоваяСтрока.Вставить("Column", СтрокаМассива.Колонка); + НоваяСтрока.Вставить("Operation", СтрокаМассива.Операция); + НоваяСтрока.Вставить("FilterValue", СтрокаМассива.Значение); + МассивФильтров.Добавить(НоваяСтрока); + КонецЦикла; + + Если МассивФильтров.Количество() > 0 Тогда + ПараметрыЗапроса.Вставить("Filters", МассивФильтров); + КонецЕсли; + + КонецЕсли; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + + Если РезультатЗапроса.Выполнено Тогда + МассивЗаписей = Новый Массив; + + РезультатЗапроса.Вставить("ЧислитсяЗаписей", СвойствоСтруктуры(РезультатЗапроса.Результат, "TotalCount", 0)); + ПолученныеЗаписи = СвойствоСтруктуры(РезультатЗапроса.Результат, "records", Новый Массив); + + Для Каждого СтрокаМассива Из ПолученныеЗаписи Цикл + НоваяСтрока = Новый Структура; + + НоваяСтрока.Вставить("Идентификатор", СтрокаМассива.ID); + НоваяСтрока.Вставить("КодСобытия", СтрокаМассива.EventCode); + НоваяСтрока.Вставить("ИсточникСобытия", СтрокаМассива.EventSource); + НоваяСтрока.Вставить("ИсточникСобытияИнфо", СтрокаМассива.SourceDetails); + НоваяСтрока.Вставить("Описание", СтрокаМассива.Data); + НоваяСтрока.Вставить("Пользователь", СтрокаМассива.Login); + НоваяСтрока.Вставить("ИмяДоверенногоИздателя", СтрокаМассива.Realm); + НоваяСтрока.Вставить("Дата", СтрокаМассива.Date); + НоваяСтрока.Вставить("ДанныеСобытия", СтрокаМассива.ExtendedData); + НоваяСтрока.Вставить("Оператор", СтрокаМассива.DelegatedUserLogin); + НоваяСтрока.Вставить("УровеньСобытия", СтрокаМассива.EventLevel); + + МассивЗаписей.Добавить(НоваяСтрока); + + КонецЦикла; + + РезультатЗапроса.Вставить("Результат", МассивЗаписей); + КонецЕсли; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗапросЗаписейАудита", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + + +КонецФункции + +// Формируется данные об учетной записи в формате XML на основании отчета "Состояние учетной записи" +// +// Параметры: +// НастройкиПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СостояниеУчетнойЗаписи(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + Результат = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(); + ОбъектОтчета = Отчеты.СостояниеУчетнойЗаписиDSS.Создать(); + Если ОбъектОтчета <> Неопределено Тогда + ПараметрыОтчета = ОбъектОтчета.КомпоновщикНастроек.Настройки.ПараметрыДанных; + ПараметрыОтчета.УстановитьЗначениеПараметра("НастройкиПользователя", НастройкиПользователя); + ПараметрыОтчета.УстановитьЗначениеПараметра("ФорматРезультата", "XML"); + ДанныеОтчета = ОбъектОтчета.СформироватьДанныеОтчета(Неопределено); + Результат.Вставить("Результат", ДанныеОтчета); + Иначе + Результат.Выполнено = Ложь; + Результат.Ошибка = НСтр("ru = 'Не удалось сформировать отчет'", СервисКриптографииDSSСлужебный.КодЯзыка()); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ОбработкаДокументов + +// Отправляет документ на сервер, для последующей обработки. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// подробнее СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ПараметрыДокумента - см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваДокумента +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ЗагрузитьДокумент(ИдентификаторПользователя, + ДанныеДокумента, + ПараметрыДокумента, + ПараметрыОперации = Неопределено) Экспорт + + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ДанныеДокумента, Истина); + ПодготовленныеДанные = СтруктураДокумента.Документ; + АдресПодключения = НастройкиПользователя.Методы.Документы_Загрузить; + ПредставлениеЗаголовка = СервисКриптографииDSSСлужебный.ПодготовитьЗаголовокПотока(ПараметрыДокумента); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("CPDSS-POSTDOC", ПредставлениеЗаголовка); + Заголовки.Вставить("Content-Type", "application/octet-stream"); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПодготовленныеДанные, "POST", "octet", Заголовки, ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = СвойствоСтруктуры(РезультатЗапроса.Результат, "DocumentId", ""); + КонецЕсли; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗагрузитьДокумент", ПараметрыДокумента); + + Возврат РезультатЗапроса; + +КонецФункции + +// Отправляет пакет (небольшой) документов (небольших) на сервер, для последующей обработки. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыДокументов - Массив из см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваДокумента +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ЗагрузитьПакетДокументов(ИдентификаторПользователя, + ПараметрыДокументов, + ПараметрыОперации = Неопределено) Экспорт + + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + ПараметрыЗапроса = Новый Структура; + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_ЗагрузитьПакет; + Заголовки = Новый Соответствие; + ПараметрыЗапроса.Вставить("Documents", ПараметрыДокументов); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", Заголовки, ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = СвойствоСтруктуры(РезультатЗапроса.Результат, "DocumentIds", Новый Массив); + КонецЕсли; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ЗагрузитьПакетДокументов", ПараметрыДокументов); + + Возврат РезультатЗапроса; + +КонецФункции + +// Возвращает информацию о загруженном на сервер документе по его идентификатору. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторДокумента - Строка - идентификатор документа, присвоенный при его загрузке +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ИнформацияОДокументеПоИдентификатору(ИдентификаторПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_Информация; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторДокумента); + Заголовки = Новый Соответствие; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "GET", "json", Заголовки, ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = ИнформацияОДокументеОбработки(РезультатЗапроса.Результат); + КонецЕсли; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИнформацияОДокументеПоИдентификатору", ИдентификаторДокумента); + + Возврат РезультатЗапроса; + +КонецФункции + +// Возвращает информацию о загруженном на сервер документе по его хешу. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ХешДокумента - Строка - хеш документа, вычисленный при его загрузке на сервер +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ИнформацияОДокументеПоХешу(ИдентификаторПользователя, + ХешДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_ИнформацияХеш; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ХешДокумента); + Заголовки = Новый Соответствие; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "GET", "json", Заголовки, ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатЗапроса.Результат = ИнформацияОДокументеОбработки(РезультатЗапроса.Результат); + КонецЕсли; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИнформацияОДокументеПоИдентификатору", ХешДокумента); + + Возврат РезультатЗапроса; + +КонецФункции + +// Получить документ с сервера. Это может быть как ранее отправленный документ (см. ЗагрузитьДокумент), +// так и обработанный документ. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторДокумента - Строка +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьОбработанныйДокумент(ИдентификаторПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_Получить; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторДокумента); + Заголовки = Новый Соответствие; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "GET", "json", Заголовки, ПараметрыОперации); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьОбработанныйДокумент", ИдентификаторДокумента); + + Возврат РезультатЗапроса; + +КонецФункции + +// Изменяет информацию о ранее загруженном документе на сервере. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. НастройкиПользователяПоУмолчанию() +// ИдентификаторДокумента - Строка +// ПараметрыДокумента - Структура - подробнее ИнформацияОДокументеОбработки +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ИзменитьИнформациюОДокументе(ИдентификаторПользователя, + ИдентификаторДокумента, + ПараметрыДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_ИзменитьИнформацию; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторДокумента); + Заголовки = Новый Соответствие; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыДокумента, "PATCH", "json", Заголовки, ПараметрыОперации); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ИзменитьИнформациюОДокументе", ПараметрыДокумента); + + Возврат РезультатЗапроса; + +КонецФункции + +// Привязывает текущий документ к указанному. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторДокумента - Строка +// ИдентификаторРодительскогоДокумента - Строка +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПривязатьДокумент(ИдентификаторПользователя, + ИдентификаторДокумента, + ИдентификаторРодительскогоДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + ПараметрыЗапроса = Новый Структура; + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_Связанный; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторДокумента); + Заголовки = Новый Соответствие; + ПараметрыЗапроса.Вставить("DocumentId", ИдентификаторРодительскогоДокумента); + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", Заголовки, ПараметрыОперации); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПривязатьДокумент", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Посылает запрос на конвертацию документа, ранее загруженного на сервер. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторДокумента - Строка +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СконвертироватьДокумент(ИдентификаторПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_Конвертация; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторДокумента); + Заголовки = Новый Соответствие; + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "POST", "json", Заголовки, ПараметрыОперации); + + КонецЕсли; + + Если РезультатЗапроса.Выполнено Тогда + СостояниеДокумента = ИнформацияОКонвертацииДокумента(РезультатЗапроса.Результат); + + Если СостояниеДокумента.Статус = "Ошибка" Тогда + РезультатЗапроса.Выполнено = Ложь; + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, "ОшибкаКонвертации", СостояниеДокумента.Описание); + КонецЕсли; + + РезультатЗапроса.Результат = СостояниеДокумента; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СконвертироватьДокумент", ИдентификаторПользователя); + + Возврат РезультатЗапроса; + +КонецФункции + +// Получает информацию о преобразованном документе. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторДокумента - Строка +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьИнформациюДокументаКонвертации(ИдентификаторПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_КонвертацияИнформация; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторДокумента); + Заголовки = Новый Соответствие; + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "GET", "json", Заголовки, ПараметрыОперации); + + КонецЕсли; + + Если РезультатЗапроса.Выполнено Тогда + + СостояниеДокумента = ИнформацияОКонвертацииДокумента(РезультатЗапроса.Результат); + + Если СостояниеДокумента.Статус = "Ошибка" Тогда + РезультатЗапроса.Выполнено = Ложь; + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, "ОшибкаКонвертации", СостояниеДокумента.Описание); + КонецЕсли; + + РезультатЗапроса.Результат = СостояниеДокумента; + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьИнформациюДокументаКонвертации", ИдентификаторПользователя); + + Возврат РезультатЗапроса; + +КонецФункции + +// Удаляет документ ранее загруженный на сервер или обработанный на нем. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторДокумента - Строка +// ПараметрыДокумента - Структура - подробнее ИнформацияОДокументеОбработки +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция УдалитьДокумент(ИдентификаторПользователя, + ИдентификаторДокумента, + ПараметрыДокумента, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + + АдресПодключения = НастройкиПользователя.Методы.Документы_ИзменитьИнформацию; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторДокумента); + Заголовки = Новый Соответствие; + + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыДокумента, "DELETE", "json", Заголовки, ПараметрыОперации); + + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УдалитьДокумент", ПараметрыДокумента); + + Возврат РезультатЗапроса; + +КонецФункции + +#КонецОбласти + +#Область ЗакрытыеКлючи + +// Создает закрытый ключ и сертификат к нему на сервере, подписанный владельцем. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторАлгоритмаКлюча - Строка - идентификатор алгоритма закрытого ключа, подробности см. подробности см. СервисКриптографииDSSКлиентСервер.ИдентификаторАлгоритмаЗакрытогоКлюча +// ПараметрыКлюча - Строка - идентификатор набора параметров эллиптической кривой +// ПинКод - Строка - пин-код для доступа к вновь создаваемому ключу +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СоздатьЗакрытыйКлюч(ИдентификаторПользователя, + ИдентификаторАлгоритмаКлюча, + ПараметрыКлюча, + ПинКод = "", + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + ЗначениеПинКода = ПолучитьЗначениеПароля(ПинКод, НастройкиПользователя); + + Если РезультатЗапроса.Выполнено Тогда + ПараметрыЗапроса = Новый Структура; + Если ЗначениеЗаполнено(ЗначениеПинКода) Тогда + ПараметрыЗапроса.Вставить("PinCode", ЗначениеПинКода); + КонецЕсли; + + Если ЗначениеЗаполнено(ПараметрыКлюча) Тогда + ПараметрыЗапроса.Вставить("ParametersOid", ПараметрыКлюча); + Иначе + ПараметрыЗапроса.Вставить("ParametersOid", ""); + КонецЕсли; + + ПараметрыЗапроса.Вставить("AlgId", ИдентификаторАлгоритмаКлюча); + + АдресПодключения = НастройкиПользователя.Методы.ЗакрытыйКлюч + "/generate"; + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + Если НЕ СвойствоСтруктуры(РезультатЗапроса.Результат, "IsError", Ложь) Тогда + ДанныеСертификата = СвойствоСтруктуры(РезультатЗапроса.Результат, "CertificateBase64", ""); + ИнформацияКлюча = Новый Структура; + ИнформацияКлюча.Вставить("ИдентификаторСертификата", СвойствоСтруктуры(РезультатЗапроса.Результат, "ID", 0)); + ИнформацияКлюча.Вставить("Сертификат", ПолучитьДвоичныеДанныеИзBase64Строки(ДанныеСертификата)); + РезультатЗапроса.Результат = ИнформацияКлюча; + + ДопПараметры = Новый Структура("ПроверитьНаличиеВБазе", Истина); + РезультатОбновления = ПолучитьСертификатыСервиса(НастройкиПользователя, Неопределено, ДопПараметры); + Если РезультатОбновления.Выполнено Тогда + НастройкиПользователя.Сертификаты = РезультатОбновления.Результат; + РезультатЗапроса.МаркерОбновлен = Истина; + РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + + Иначе + РезультатЗапроса.Выполнено = Ложь; + РезультатЗапроса.Ошибка = СвойствоСтруктуры(РезультатЗапроса.Результат, "ErrorDescription", ""); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СоздатьЗакрытыйКлюч", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Устанавливает произвольный параметр для закрытого ключа. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - идентификатор сертификата на сервере DSS +// ИмяПараметра - Строка - имя параметра +// ЗначениеПараметра - Строка - значение параметра +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция УстановитьПараметрЗакрытогоКлюча(ИдентификаторПользователя, + ИдентификаторСертификата, + ИмяПараметра, + ЗначениеПараметра, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("Param", ИмяПараметра); + ПараметрыЗапроса.Вставить("Data", ЗначениеПараметра); + + АдресПодключения = НастройкиПользователя.Методы.ЗакрытыйКлюч + "/%1/params"; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, Формат(ИдентификаторСертификата, "ЧГ=0")); + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + Если СвойствоСтруктуры(РезультатЗапроса.Результат, "IsError", Ложь) Тогда + РезультатЗапроса.Выполнено = Ложь; + РезультатЗапроса.Ошибка = СвойствоСтруктуры(РезультатЗапроса.Результат, "ErrorDescription", ""); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "УстановитьПараметрЗакрытогоКлюча", ПараметрыЗапроса); + + Возврат РезультатЗапроса; + +КонецФункции + +// Позволяет получить значение параметра закрытого ключа. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторСертификата - Число - идентификатор сертификата на сервере DSS +// ИмяПараметра - Строка - имя параметра +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьПараметрЗакрытогоКлюча(ИдентификаторПользователя, + ИдентификаторСертификата, + ИмяПараметра, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + АдресПодключения = НастройкиПользователя.Методы.ЗакрытыйКлюч + "/%1/params?param=%2"; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, Формат(ИдентификаторСертификата, "ЧГ=0"), ИмяПараметра); + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "GET", "json", , ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + Если НЕ СвойствоСтруктуры(РезультатЗапроса.Результат, "IsError", Ложь) Тогда + РезультатЗапроса.Выполнено = СвойствоСтруктуры(РезультатЗапроса.Результат, "Value", Истина); + Иначе + РезультатЗапроса.Выполнено = Ложь; + РезультатЗапроса.Ошибка = СвойствоСтруктуры(РезультатЗапроса.Результат, "ErrorDescription", ""); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПолучитьПараметрЗакрытогоКлюча", ИмяПараметра); + + Возврат РезультатЗапроса; + +КонецФункции + +#КонецОбласти + +#Область АсинхронныеОперации + +// Создает операцию подписания в асинхронном режиме. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// СвойствоПодписи - Структура - изначально заполняется свойствами подписи, подробнее СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиАсинхронной() +// ИдентификаторСертификата - Число - идентификатор сертификата на сервере DSS +// ПинКод - Строка - пин-код для доступа к закрытому ключу сертификата учетной записи +// АсинхронныйРежим - Булево - указывает, что подпись нужно сделать в асинхронном режиме +// ОбратныйВызов - Строка - адрес обратного вызова +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПодписатьАсинхронно(ИдентификаторПользователя, + СвойствоПодписи, + ИдентификаторСертификата, + ПинКод, + АсинхронныйРежим = Ложь, + ОбратныйВызов = "", + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + ЗначениеПинКода = ПолучитьЗначениеПароля(ПинКод, НастройкиПользователя); + + Если РезультатЗапроса.Выполнено Тогда + Если СвойствоПодписи <> Неопределено Тогда + ПараметрыЗапроса = ОбщегоНазначения.СкопироватьРекурсивно(СвойствоПодписи); + ПараметрыЗапроса.Signature.Вставить("CertificateId", ИдентификаторСертификата); + + //@skip-warning + ПараметрыЗапроса.Вставить("IsAsync", АсинхронныйРежим); + Если АсинхронныйРежим Тогда + //@skip-warning + ПараметрыЗапроса.Вставить("Callback", ОбратныйВызов); + КонецЕсли; + + Иначе + ПараметрыЗапроса = Новый Структура; + + КонецЕсли; + + Если ЗначениеЗаполнено(ЗначениеПинКода) Тогда + ПараметрыЗапроса.Signature.Вставить("PinCode", ЗначениеПинКода); + КонецЕсли; + + АдресПодключения = НастройкиПользователя.Методы.ПодписьАсинхронная; + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, ПараметрыЗапроса, "POST", "json", , ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатОперации = Новый Структура; + ОтветСервиса = РезультатЗапроса.Результат.Operation; + СтатусОперации = ОтветСервиса.Status; + Если НЕ СтатусОперации = "Error" Тогда + РезультатОперации.Вставить("ИдентификаторОперации", СвойствоСтруктуры(ОтветСервиса, "ID", "")); + Если СтатусОперации = "Completed" Тогда + РезультатОперации.Вставить("Статус", "Завершено"); + МассивДокументов = Новый Массив; + Для Каждого СтрокаОтвета Из ОтветСервиса.Result.ProcessedDocuments Цикл + МассивДокументов.Добавить(СвойствоСтруктуры(СтрокаОтвета, "RefId", "")); + КонецЦикла; + РезультатОперации.Вставить("ИдентификаторыДокументов", МассивДокументов); + Иначе + РезультатОперации.Вставить("Статус", "Выполняется"); + КонецЕсли; + РезультатОперации.Вставить("СрокДействия", ДатаUTC(СвойствоСтруктуры(ОтветСервиса, "ExpirationDate", 0))); + + РезультатЗапроса.Результат = РезультатОперации; + Иначе + РезультатЗапроса.Выполнено = Ложь; + РезультатЗапроса.Ошибка = СвойствоСтруктуры(ОтветСервиса, "ErrorDescription", ""); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодписатьАсинхронно", СвойствоПодписи); + + Возврат РезультатЗапроса; + +КонецФункции + +// Получает сведения об операции начатой на сервере облачной подписи. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторОперации - Строка - идентификатор операции ранее созданной на сервере +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СведенияОбОперации(ИдентификаторПользователя, + ИдентификаторОперации, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + АдресПодключения = ЗаполнитьПараметрыСтроки(НастройкиПользователя.Методы.Операции, ИдентификаторОперации); + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "GET", "json", , ПараметрыОперации); + Если РезультатЗапроса.Выполнено Тогда + РезультатОперации = Новый Структура; + ОтветСервиса = РезультатЗапроса.Результат.Operation; + СтатусОперации = ОтветСервиса.Status; + Если НЕ СтатусОперации = "Error" Тогда + РезультатОперации.Вставить("ИдентификаторОперации", СвойствоСтруктуры(ОтветСервиса, "ID", "")); + Если СтатусОперации = "Completed" Тогда + РезультатОперации.Вставить("Статус", "Завершено"); + МассивДокументов = Новый Массив; + Для Каждого СтрокаОтвета Из ОтветСервиса.Result.ProcessedDocuments Цикл + МассивДокументов.Добавить(СвойствоСтруктуры(СтрокаОтвета, "RefId", "")); + КонецЦикла; + РезультатОперации.Вставить("ИдентификаторыДокументов", МассивДокументов); + Иначе + РезультатОперации.Вставить("Статус", "Выполняется"); + КонецЕсли; + РезультатОперации.Вставить("СрокДействия", ДатаUTC(СвойствоСтруктуры(ОтветСервиса, "ExpirationDate", 0))); + + РезультатЗапроса.Результат = РезультатОперации; + Иначе + РезультатЗапроса.Выполнено = Ложь; + РезультатЗапроса.Ошибка = СвойствоСтруктуры(ОтветСервиса, "ErrorDescription", ""); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СведенияОбОперации", ИдентификаторОперации); + + Возврат РезультатЗапроса; + +КонецФункции + +// Посылает запрос на выполнение операции, ранее созданной на сервере облачной подписи. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторОперации - Строка - идентификатор операции ранее созданной на сервере +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ВыполнитьОперацию(ИдентификаторПользователя, + ИдентификаторОперации, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ПроверитьВерсиюСервера(НастройкиПользователя, "2"); + + Если РезультатЗапроса.Выполнено Тогда + АдресПодключения = НастройкиПользователя.Методы.Операции + "/start"; + АдресПодключения = ЗаполнитьПараметрыСтроки(АдресПодключения, ИдентификаторОперации); + РезультатЗапроса = ПодключитьВыполнитьМетодСервиса(НастройкиПользователя, АдресПодключения, Неопределено, "POST", "json", , ПараметрыОперации); + КонецЕсли; + + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(РезультатЗапроса, "СведенияОбОперации", ИдентификаторОперации); + + Возврат РезультатЗапроса; + +КонецФункции + +#КонецОбласти + +#Область Прочие + +// Возвращает статус использования облачной подписи в рамках базы +// +// Возвращаемое значение: +// Булево +// +Функция ИспользоватьСервисОблачнойПодписи() Экспорт + + Результат = ПолучитьФункциональнуюОпцию("ИспользоватьСервисОблачнойПодписи"); + + Возврат Результат; + +КонецФункции + +// Возвращает возможность использования дополнительных возможностей для работы с облачной подписью, такими как +// формирование заявления для выпуска сертификата, заявление на изменение параметров подключения. +// +// Возвращаемое значение: +// Булево +// +Функция ИспользоватьРасширенныеВозможности() Экспорт + + Результат = ОбщегоНазначения.РазделениеВключено() + И ИспользоватьСервисОблачнойПодписи(); + + Результат = Ложь; + + Возврат Результат; + +КонецФункции + +// Перечисляет список допустимых способов первичной аутентификации (авторизации) +// +// Параметры: +// СервисПодписи - СправочникСсылка.ЭкземплярыСервераDSS - получает полный список авторизации с учетом ограничений +// +// Возвращаемое значение: +// Массив - содержит значения из ПеречисленияСсылка.СпособыАвторизацииDSS +// +Функция СписокПервичнойАвторизации(СервисПодписи) Экспорт + + Результат = Новый Массив; + + ПолныйСписок = СервисКриптографииDSSСлужебный.ДоступныеСпособыПервичнойАвторизации(); + СписокОграничений = СервисКриптографииDSSСлужебный.СпособыАвторизацииСОграничениями(СервисПодписи); + + Для Каждого СтрокаМассива Из ПолныйСписок Цикл + Если СписокОграничений.Найти(СтрокаМассива) <> Неопределено Тогда + Результат.Добавить(СтрокаМассива); + КонецЕсли; + КонецЦикла; + + Если Результат.Количество() = 0 Тогда + Результат = ПолныйСписок; + КонецЕсли; + + СервисКриптографииDSSПереопределяемый.СписокПервичнойАвторизации(Результат); + + Возврат Результат; + +КонецФункции + +// Перечисляет список допустимых способов вторичной авторизации (подтверждения операций) +// +// Параметры: +// СервисПодписи - СправочникСсылка.ЭкземплярыСервераDSS - получает полный список авторизации с учетом ограничений +// +// Возвращаемое значение: +// Массив - содержит значения из ПеречисленияСсылка.СпособыАвторизацииDSS +// +Функция СписокВторичнойАвторизации(СервисПодписи) Экспорт + + Результат = Новый Массив; + + ПолныйСписок = СервисКриптографииDSSСлужебный.ДоступныеСпособыВторичнойАвторизации(); + СписокОграничений = СервисКриптографииDSSСлужебный.СпособыАвторизацииСОграничениями(СервисПодписи); + + Для Каждого СтрокаМассива Из ПолныйСписок Цикл + Если СписокОграничений.Найти(СтрокаМассива) <> Неопределено Тогда + Результат.Добавить(СтрокаМассива); + КонецЕсли; + КонецЦикла; + + Если Результат.Количество() = 0 Тогда + Результат = ПолныйСписок; + КонецЕсли; + + СервисКриптографииDSSПереопределяемый.СписокВторичнойАвторизации(Результат); + + Возврат Результат; + +КонецФункции + +// Формирует структуру с информацией о доступных указанной учетной записи УЦ, Криптопровайдерах. +// Шаблонах и Полях запроса на основе данных политики авторизованного пользователя сервиса. +// Данная информация необходима при формировании запроса на сертификат отправляемый на сервер. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS, +// - Структура +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// Структура: +// * Заполнено - Булево - если данные актуальны для данной учетной, т.е. была аутентификация +// * Криптопровайдеры - Массив из Структура: +// ** Идентификатор - Строка - идентификатор криптопровайдера зарегистрированный на сервисе +// ** Описание - Строка - пользовательское представление +// * УдостоверяющиеЦентры - Массив из Структура: +// ** Имя - Строка - представление УЦ +// ** Идентификатор - Строка - идентификатор который передается в сервис криптографии DSS +// ** Сторонний - Булево - если сторонний, то потребует отдельной операции установки сертификата +// ** Шаблоны - см. ПолучитьРеестрШаблоновУдостоверяющегоЦентра +// ** ИменаПолей - см. ПолучитьРеестрПолейУдостоверяющегоЦентра +// +Функция ПолучитьИнформациюУдостоверяющихЦентров(ИдентификаторПользователя, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + + Результат = Новый Структура(); + + Результат.Вставить("УдостоверяющиеЦентры", СервисКриптографииDSSСлужебный.СкопироватьСтруктуру(НастройкиПользователя.Политика.УЦ)); + Результат.Вставить("КриптоПровайдеры", СервисКриптографииDSSСлужебный.СкопироватьСтруктуру(НастройкиПользователя.Политика.Криптопровайдеры)); + Результат.Вставить("Заполнено", НастройкиПользователя.Политика.Заполнено); + + Возврат Результат; + +КонецФункции + +// Формирует массив полей запроса на сертификат, которые допустимы для указанного УЦ. +// При запросе к сервису нельзя указывать "лишние" поля, также есть поля, заполнение и передача которых является +// обязательными. +// +// Параметры: +// УдостоверяющийЦентр - Структура - содержит информацию об удостоверяющем центре см. функцию ПолучитьИнформациюУдостоверяющегоЦентра() +// +// Возвращаемое значение: +// Массив из Структура: +// * OID - Строка - значение кода поля +// * Имя - Строка - имя поля +// * Длина - Число - содержит информацию об ограничении длины поля +// * Представление - Строка - пользовательское представление +// * Обязательно - Булево - если Истина, поля должны заполнено и передано, иначе сервер формирует ошибку +// +Функция ПолучитьРеестрПолейУдостоверяющегоЦентра(УдостоверяющийЦентр) Экспорт + + Результат = Новый Массив; + ВсеПоля = СервисКриптографииDSSASNКлиентСервер.ОпределитьТип_OID(Неопределено, "10"); + + Для каждого СтрокаМассива Из УдостоверяющийЦентр.ИменаПолей Цикл + НашлиЭлемент = ВсеПоля[СтрокаМассива["OID"]]; + + Если НашлиЭлемент <> Неопределено Тогда + НашлиЭлемент.Обязательно = СтрокаМассива["IsRequired"]; + Результат.Добавить(НашлиЭлемент); + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Формирует массив шаблонов допустимые в этом УЦ +// +// Параметры: +// УдостоверяющийЦентр - Структура: +// * Шаблоны - Массив из Структура: +// ** Шаблон - Строка +// ** Наименование - Строка +// +// Возвращаемое значение: +// Массив из Структура: +// * Шаблон - Строка - значение шаблона, +// * Наименование - Строка - пользовательское представление +// +Функция ПолучитьРеестрШаблоновУдостоверяющегоЦентра(УдостоверяющийЦентр) Экспорт + + Результат = Новый Массив; + + Для каждого СтрокаМассива Из УдостоверяющийЦентр.Шаблоны Цикл + НоваяСтрока = Новый Структура(); + НоваяСтрока.Вставить("Шаблон", СтрокаМассива.Шаблон); + НоваяСтрока.Вставить("Наименование", СтрокаМассива.Наименование); + Результат.Добавить(НоваяСтрока); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Служит для установки текущего пользователя для последующей работы с сервисом. +// Предусмотрена для случая, когда нужно указать конкретного пользователя, при использовании стандартного АПИ БСП, +// в котором данный параметры не предусмотрен. +// +// Параметры: +// СсылкаУчетнойЗаписи - СправочникСсылка.УчетныеЗаписиDSS - идентифицирующий признак в сеансовых данных +// ИсточникНастроек - Неопределено, Строка - варианты определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(). +// +Процедура УстановитьТекущегоПользователя(СсылкаУчетнойЗаписи, ИсточникНастроек = Неопределено) Экспорт + + ТекущиеНастройки = СервисКриптографииDSSСлужебный.ПолучитьКонтейнерНастроек(ИсточникНастроек); + ТекущиеНастройки.ТекущийПользователь = СсылкаУчетнойЗаписи; + СервисКриптографииDSSСлужебный.УстановитьКонтейнерНастроек(ТекущиеНастройки, ИсточникНастроек); + +КонецПроцедуры + +// Служит для создания новой учетной записи сервиса облачной подписи или обновления существующего элемента +// +// Параметры: +// НастройкиУчетнойЗаписи - Структура: +// * Владелец - СправочникСсылка.ЭкземплярыСервераDSS +// * Логин - Строка +// * ПервичнаяАутентификация - ПеречислениеСсылка.СпособыАвторизацииDSS +// * ВторичнаяАвторизация - ПеречислениеСсылка.СпособыАвторизацииDSS - необязательный +// * Комментарий - Строка - необязательный +// +// Возвращаемое значение: +// СправочникСсылка.УчетныеЗаписиDSS +// +Функция ОбновитьДанныеУчетнойЗаписиОблачнойПодписи(НастройкиУчетнойЗаписи) Экспорт + + Возврат СервисКриптографииDSSСлужебный.СоздатьУчетнуюЗаписьОблачнойПодписи(НастройкиУчетнойЗаписи); + +КонецФункции + +// Служит для создания нового подключения сервиса облачной подписи или обновления существующего элемента. +// Если был найден дублирующий элемент по полям: АдресСервера и ИдентификаторЦИ, то будет произведено обновление элемента. +// +// Параметры: +// НастройкиСервиса - Структура: +// * АдресСервера - Строка - поле поиска дублера +// * СервисПроверки - Строка +// * СервисПодписи - Строка +// * СервисИдентификации - Строка +// * ИдентификаторЦИ - Строка - поле поиска дублера +// * ИдентификаторСЭП - Строка +// * ШаблонПодтверждения - Строка +// * ВнутреннийИдентификатор - Строка +// * ОграничениеАвторизации - Строка +// * АдресЛичногоКабинета - Строка +// * Используется - Булево +// * ТаймАут - Число +// * Комментарий - Строка +// * ВерсияАПИ - Строка +// +// Возвращаемое значение: +// СправочникСсылка.ЭкземплярыСервераDSS +// +Функция ОбновитьДанныеСервераОблачнойПодписи(НастройкиСервиса) Экспорт + + Возврат СервисКриптографииDSSСлужебный.СоздатьСерверОблачнойПодписи(НастройкиСервиса); + +КонецФункции + +// Возвращает найденный сертификат по отбору +// +// Параметры: +// ОписаниеСертификата - Структура - с полем "Отпечаток", "СерийныйНомер" или "ИдентификаторСертификата" +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию. +// +Функция НайтиСертификат(ОписаниеСертификата, ПараметрыОперации = Неопределено) Экспорт + + Результат = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Истина); + НашлиСертификат = Неопределено; + + Если ОписаниеСертификата.Свойство("Отпечаток") Тогда + НашлиСертификат = СервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоОтпечатку(ОписаниеСертификата, Истина); + ИначеЕсли ОписаниеСертификата.Свойство("СерийныйНомер") Тогда + НашлиСертификат = СервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоСерийномуНомеру(ОписаниеСертификата, Истина); + ИначеЕсли ОписаниеСертификата.Свойство("ИдентификаторСертификата") Тогда + НашлиСертификат = СервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоИдентификаторуСертификата(ОписаниеСертификата, Истина); + КонецЕсли; + + Если НашлиСертификат = Неопределено Тогда + Результат.Выполнено = Ложь; + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки( + Результат, + "ОшибкаВыполнения", + НСтр("ru = 'Сертификат не обнаружен в сервисе облачной подписи'", СервисКриптографииDSSСлужебный.КодЯзыка())); + Иначе + Результат.Вставить("ДанныеСертификата", ПолучитьОбъектСертификата(НашлиСертификат.ДанныеСертификата, Истина)); + Результат.Вставить("УчетнаяЗапись", НашлиСертификат.УчетнаяЗапись); + Результат.Вставить("Идентификатор", НашлиСертификат.Идентификатор); + Результат.Вставить("ДатаНачала", НашлиСертификат.ДатаНачала); + Результат.Вставить("ДатаОкончания", НашлиСертификат.ДатаОкончания); + Результат.Вставить("Наименование", НашлиСертификат.Наименование); + Результат.Вставить("Отпечаток", НашлиСертификат.Отпечаток); + Результат.Вставить("СерийныйНомер", НашлиСертификат.СерийныйНомер); + Результат.Вставить("ИдентификаторСертификата", НашлиСертификат.ИдентификаторСертификата); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует ТаблицуЗначений с данным сертификатов хранимые в кеше сертификатов. +// Данные формируется на основе закэшированных сертификатов после последней аутентификации. +// +// Параметры: +// ВключитьСодержимоеСертификата - Булево - заполняет поле ДанныеСертификата двоичным содержимым сертификата +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// * Отпечаток - Строка +// * ДатаНачала - Дата +// * ДатаОкончания - Дата +// * ДанныеСертификата - Неопределено +// - ХранилищеЗначения +// +Функция ПолучитьВсеСертификатыСервиса(ВключитьСодержимоеСертификата = Истина) Экспорт + + Возврат СервисКриптографииDSSСлужебный.ПолучитьВсеСертификаты(ВключитьСодержимоеСертификата); + +КонецФункции + +// Функция поиска и получения ссылки учетной записи по полям поиска +// +// Параметры: +// ПоляПоиска - Структура - содержит поля для поиска. Список полей ограничивается списком реквизитов справочника. +// +// Возвращаемое значение: +// - Неопределено +// - СправочникСсылка.УчетныеЗаписиDSS +// +Функция НайтиУчетнуюЗапись(ПоляПоиска) Экспорт + + Результат = СервисКриптографииDSSСлужебный.ПроверитьДублированиеЛогинов(Неопределено, ПоляПоиска); + + Возврат Результат; + +КонецФункции + +// Формирует таблицу значений с данными учетных записей. +// Данные формируется на основе закэшированных сертификатов после последней аутентификации. +// +// Параметры: +// СсылкаСправочника - СправочникСсылка.УчетныеЗаписиDSS +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.УчетныеЗаписиDSS +// * Владелец - СправочникСсылка.ЭкземплярыСервераDSS +// * Наименование - Строка +// * Логин - Строка +// * ПометкаУдаления - Булево +// * Сервер - Строка - наименование сервера +// * ВнутреннийИдентификатор - Строка - идентификатор для поиска поставляемых данных +// +Функция ПолучитьВсеУчетныеЗаписи(СсылкаСправочника = Неопределено) Экспорт + + Возврат СервисКриптографииDSSСлужебный.ПолучитьВсеУчетныеЗаписи(СсылкаСправочника); + +КонецФункции + +// Возвращает таблицу содержащую все используемые серверы облачной подписи +// +// Параметры: +// ОтборЗапроса - Неопределено, Соответствие, Структура - содержит ключи и значения отбора +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.ЭкземплярыСервераDSS +// * Наименование - Строка +// * АдресСервера - Строка +// * АдресЛичногоКабинета - Строка +// * СервисИдентификации - Строка +// * СервисПодписи - Строка +// * СервисПроверки - Строка +// * СервисАудита - Строка +// * СервисСервисДокументов - Строка +// * ВнутреннийИдентификатор - Строка - необходим для поиска информации по поставляемым серверам +// * ИдентификаторЦИ - Строка +// * ИдентификаторСЭП - Строка +// * ШаблонПодтверждения - Строка +// * ВерсияАПИ - Строка +// * ТаймАут - Число +// +Функция ПолучитьВсеСерверы(ОтборЗапроса = Неопределено) Экспорт + + Возврат СервисКриптографииDSSСлужебный.ПолучитьВсеСерверы(ОтборЗапроса); + +КонецФункции + +// Сервисная функция, позволяющая определить учетную запись сервиса по сертификата +// +// Параметры: +// ДанныеСертификата - Строка - значение отпечатка сертификата +// - Структура - содержит обязательное поле "Отпечаток", "СерийныйНомер" или "ИдентификаторСертификата" +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. НастройкиПользователяПоУмолчанию +// +Функция ПолучитьНастройкиПользователяПоСертификату(ДанныеСертификата, ПараметрыОперации = Неопределено) Экспорт + + Если ТипЗнч(ДанныеСертификата) <> Тип("Структура") Тогда + СвойстваСертификата = Новый Структура("Отпечаток", ДанныеСертификата); + Иначе + СвойстваСертификата = ДанныеСертификата; + КонецЕсли; + + НашлиСертификат = НайтиСертификат(СвойстваСертификата); + + Если НашлиСертификат.Выполнено Тогда + Результат = ПолучитьНастройкиПользователя(НашлиСертификат.УчетнаяЗапись, ПараметрыОперации); + Иначе + Результат = НастройкиПользователяПоУмолчанию(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Вспомогательная функция формирования структуры сертификата подобной объекту СертификатКриптографии, +// с дополнительными полями. Предусмотрена для универсальной передачи информации о сертификате между +// сервером и клиентом. +// +// Параметры: +// ДанныеСертификата - ДвоичныеДанные - данные сертификата +// ВычислитьИдентификатор - Булево - дополняет структуру вычисленным идентификатором +// ДвоичныеДанныеКакHEX - Булево - режим преобразования двоичных данных +// +// Возвращаемое значение: +// Структура - содержит аналогичные поля объекта платформы и дополнительные поля: +// * Сертификат - ДвоичныеДанные - содержимое сертификата +// * Идентификатор - Строка +// * ДействителенС - Дата +// * ДействителенПо - Дата +// * СерийныйНомер - Строка +// - ДвоичныеДанные +// * Отпечаток - Строка +// - ДвоичныеДанные +// +Функция ПолучитьОбъектСертификата(ДанныеСертификата, ВычислитьИдентификатор = Ложь, ДвоичныеДанныеКакHEX = Истина) Экспорт + + ОбъектСертификата = Новый СертификатКриптографии(ДанныеСертификата); + РасширенныеСвойства = СервисКриптографииDSSASNКлиентСервер.ПолучитьСвойстваСертификата(ДанныеСертификата); + + СвойстваСертификата = Новый Структура; + СвойстваСертификата.Вставить("Версия", ОбъектСертификата.Версия); + СвойстваСертификата.Вставить("ДатаНачала", ОбъектСертификата.ДатаНачала); + СвойстваСертификата.Вставить("ДатаОкончания", ОбъектСертификата.ДатаОкончания); + СвойстваСертификата.Вставить("Издатель", ОбъектСертификата.Издатель); + СвойстваСертификата.Вставить("ИспользоватьДляПодписи", ОбъектСертификата.ИспользоватьДляПодписи); + СвойстваСертификата.Вставить("ИспользоватьДляШифрования", ОбъектСертификата.ИспользоватьДляШифрования); + СвойстваСертификата.Вставить("ОткрытыйКлюч", ОбъектСертификата.ОткрытыйКлюч); + СвойстваСертификата.Вставить("Отпечаток", ОбъектСертификата.Отпечаток); + СвойстваСертификата.Вставить("РасширенныеСвойства", ОбъектСертификата.РасширенныеСвойства); + СвойстваСертификата.Вставить("СерийныйНомер", ОбъектСертификата.СерийныйНомер); + СвойстваСертификата.Вставить("Субъект", ОбъектСертификата.Субъект); + СвойстваСертификата.Вставить("Наименование", СвойствоСтруктуры(ОбъектСертификата.Субъект, "CN", "")); + СвойстваСертификата.Вставить("Сертификат", ДанныеСертификата); + Если ВычислитьИдентификатор Тогда + СвойстваСертификата.Вставить("Идентификатор", СервисКриптографииDSSСлужебный.ВычислитьИдентификаторСертификата(ОбъектСертификата)); + Иначе + СвойстваСертификата.Вставить("Идентификатор", ""); + КонецЕсли; + + // для совместимости + СвойстваСертификата.Вставить("ДействителенС", ОбъектСертификата.ДатаНачала); + СвойстваСертификата.Вставить("ДействителенПо", ОбъектСертификата.ДатаОкончания); + СвойстваСертификата.Вставить("ИдентификаторСубъекта", РасширенныеСвойства.ИдентификаторСубъекта); + + Если ДвоичныеДанныеКакHEX Тогда + //@skip-warning + СвойстваСертификата.СерийныйНомер = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(СвойстваСертификата.СерийныйНомер)); + //@skip-warning + СвойстваСертификата.Отпечаток = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(СвойстваСертификата.Отпечаток)); + КонецЕсли; + + Возврат Новый ФиксированнаяСтруктура(СвойстваСертификата); + +КонецФункции + +// Функция формирует структуру (объект) описывающая сессионные данные учетной записи. +// +// Возвращаемое значение: +// Структура - содержит поля настроек пользователя: +// * ВерсияАПИ - Строка - номер сборки сервера DSS +// * ПризнакКонфиденциальности - Число - способ формирования конфиденциальных данных +// * ТокенАвторизации - Структура +// * Ссылка - СправочникСсылка.УчетныеЗаписиDSS - ссылка на справочник учетной записи, для которой сформированы сессионные данные +// * Сервер - СправочникСсылка.ЭкземплярыСервераDSS - ссылка на справочник сервера к которой привязана учетная запись +// * УникальныйИдентификатор - Строка - уникальный идентификатор ссылки +// * ИдентификаторНаСервере - Строка - уникальный идентификатор учетной записи присвоенный сервером облачной подписи +// * Логин - Строка +// * Пароль - Строка +// - Структура +// * ПарольСертификата - Строка +// - Структура +// * СертификатАвторизации - Булево - информация о наличии сертификата авторизации +// * Телефон - Строка - номер телефона полученный в момент авторизации +// * ЭлектроннаяПочта - Строка - адрес электронной почты полученный в момент авторизации +// * ПервичнаяАутентификация - ПеречислениеСсылка.СпособыАвторизацииDSS - основной способ авторизации (4 способа) +// * ВторичнаяАвторизация - ПеречислениеСсылка.СпособыАвторизацииDSS - основной способ подтверждения операций +// * Политика - см. НастройкиПолитикиПользователяПоУмолчанию +// * Подключение - Структура - данные для подключения к серверу, см. подробнее НастройкиРаботыПодключение() +// * Методы - Структура - данные для вызова операций на сервере, см. подробнее НастройкиРаботыТочкиПодключения() +// * Сертификаты - Соответствие из КлючИЗначение - список сертификатов учетной записи: +// ** Ключ - Строка +// ** Значение - Структура - подробнее СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя: +// *** Содержимое - Строка +// * ШаблонПодтверждения - Строка - идентификатор шаблона для произвольного подтверждения +// * ВерсияНастройки - Число - счетчик при количества записей в параметры сеанса +// * АвторизованныйПользователь - Строка - уникальный идентификатор пользователя 1С +// * ЗапоминатьПароли - Булево - признак необходимости хранения введенных паролей в параметрах сеанса +// * ДанныеБД - Булево - признак наличия зарегистрированного пользователя +// * НеудачныхПопыток - Число - количество подряд неудачных попыток авторизоваться +// +Функция НастройкиПользователяПоУмолчанию() Экспорт + + Возврат СервисКриптографииDSSСлужебный.НастройкиПользователяПоУмолчанию(); + +КонецФункции + +// Формирует данные для хранения политик работы пользователя. +// +// Возвращаемое значение: +// Структура: +// * Заполнено - Булево - признак, что произошла удачная авторизация и получены настройки учетной записи с сервера +// * ДатаЗаполнения - Дата - когда были заполнены настройки +// * Действия - Структура из КлючИЗначение - содержит список действий, которые допустимы для пользователя и признак подтверждения: +// ** Ключ - Строка +// ** Значение - Структура: +// *** Ключ - Строка - код операции +// *** Подтверждать - Булево +// * УЦ - Массив из Структура: +// ** Имя - Строка - представление УЦ +// ** Идентификатор - Строка - внутренний идентификатор УЦ на сервере DSS +// ** Сторонний - Булево - сторонний УЦ, требует отдельной операции установки сертификата +// ** Шаблоны - Массив из Структура: +// *** Наименование - Строка +// *** Шаблон - Строка - OID шаблона +// ** ИменаПолей - Массив из Структура: +// *** OID - Строка - идентификатор поля +// *** IsRequired - Булево - Истина, если поле обязательно для заполнения +// * Криптопровайдеры - Массив из Структура: +// ** Идентификатор - Строка - GUID криптопровайдера на сервере DSS +// ** Описание - Строка - представление криптопровайдера +// ** Тип - Число - тип криптопровайдера +// ** Имя - Строка - имя криптопровайдера +// * СервераШтамповВремени- Массив из Структура: +// ** Имя - Строка - представление сервера +// ** Адрес - Строка - Web-адрес службы штампа времени +// * ТипыПодписей - Массив из Число - идентификаторы типов подписи +// * РежимПинКода - Строка - строковая константа режим применения пин-кодов для сертификатов варианты: Обязательно, Запрещено, Опционально. +// +Функция НастройкиПолитикиПользователяПоУмолчанию() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Заполнено", Ложь); + Результат.Вставить("ДатаЗаполнения", '00010101'); + Результат.Вставить("Действия", Новый Структура); + Результат.Вставить("УЦ", Новый Массив); + Результат.Вставить("Криптопровайдеры", Новый Массив); + Результат.Вставить("СервераШтамповВремени", Новый Массив); + Результат.Вставить("РежимПинКода", "Опционально"); + + Возврат Результат; + +КонецФункции + +// Получает картинку используемую в подсистеме, если не найдена то будет пустая картинка +// +// Параметры: +// ИмяКартинки - Строка +// +// Возвращаемое значение: +// Картинка +// +Функция ПолучитьКартинкуПодсистемы(ИмяКартинки) Экспорт + + ИщемКартинку = Новый Структура(ИмяКартинки); + Результат = Неопределено; + + Попытка + ЗаполнитьЗначенияСвойств(ИщемКартинку, БиблиотекаКартинок); + ИщемКартинку.Свойство(ИмяКартинки, Результат); + Исключение + Результат = Новый Картинка; + КонецПопытки; + + Если Результат = Неопределено Тогда + Результат = Новый Картинка; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ПоддержкаВнешнегоСоединения + +// Формирует для внешнего потребителя список настроек пользователя сервиса. +// Для корректной работы, требуется предварительная аутентификация. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ДатаСеанса - Дата +// * ИсточникНастроек - Строка +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьПолитикуНастроек(ИдентификаторПользователя, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Результат = СервисКриптографииDSSСлужебный.ПолучитьПолитикуНастроек(НастройкиПользователя); + + Возврат Результат; + +КонецФункции + +// Подготавливает транзакцию для выполнения операции. +// Поддерживаемые операции: Подписание, Расшифровка, Аутентификация +// При необходимости проводит первичную аутентификацию или обновляет маркер безопасности. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ТипОперации - Строка - идентификатор операции +// ПараметрыОперации - Структура - позволяет указать параметры в зависимости от типа операции: +// * ИсточникНастроек - Строка - способ получения сеансовых данных. +// * Пароль - Строка - пароль для авторизации, для операции аутентификации обязателен. +// * ДатаСеанса - Дата - дата авторизации +// * ОжидатьВыборСпособа - Булево - выбор способа подтверждения. +// +// Для Расшифровка. +// * ДанныеДокумента - Массив из Структура: +// ** Ссылка - Произвольный - ключ для сопоставления результатов +// ** Содержание - ДвоичныеДанные, Строка - один файл, который необходимо обработать +// ** ИмяДокумента - Строка - представление документа +// ** ТипДокумента - Строка - тип документа (расширение файла) +// * Отпечаток - Строка - опционально +// * ПинКод - Строка - опционально +// +// Для Подпись. +// * ДанныеДокумента - Массив из Структура - подробное описание в разделе Расшифровка (выше) +// * Отпечаток - Строка +// * ПинКод - Строка - опционально +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПодготовитьТранзакцию(ИдентификаторПользователя, ТипОперации, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Результат = СервисКриптографииDSSСлужебный.ПодготовитьТранзакциюПодтверждения(НастройкиПользователя, ТипОперации, ПараметрыОперации); + + Возврат Результат; + +КонецФункции + +// Возвращает текущий статус ранее созданной операции с подтверждением. +// При необходимости проводит первичную аутентификацию или обновляет маркер безопасности. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторТранзакции - Неопределено, Строка - контролирует соответствие ожидаемой операции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать параметры в зависимости от типа операции +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьСтатусПодтверждения(ИдентификаторПользователя, ИдентификаторТранзакции = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Результат = СервисКриптографииDSSСлужебный.ПолучитьСтатусПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ПараметрыОперации); + + Возврат Результат; + +КонецФункции + +// Для изменения состояния ранее созданной операции с подтверждением. +// +// Параметры: +// ИдентификаторПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. функцию НастройкиПользователяПоУмолчанию() +// ТипОперации - Строка - идентификатор операции из возможных "ВременныйКод", "ВыборСпособа" +// НовоеЗначение - Строка +// - Число +// ИдентификаторТранзакции - Неопределено, Строка - контролирует соответствие ожидаемой операции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать параметры в зависимости от типа операции +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ИзменитьСтатусПодтверждения(ИдентификаторПользователя, ТипОперации, НовоеЗначение, ИдентификаторТранзакции = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Результат = СервисКриптографииDSSСлужебный.ИзменитьСтатусПодтверждения( + НастройкиПользователя, + ИдентификаторТранзакции, + ТипОперации, + НовоеЗначение, + ПараметрыОперации); + + Возврат Результат; + +КонецФункции + +// Получает результат после подтверждения операций расшифровки или подписи. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИдентификаторТранзакции - Неопределено, Строка - контролирует соответствие ожидаемой операции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать параметры в зависимости от типа операции +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПолучитьРезультатПодтверждения(ИдентификаторПользователя, ИдентификаторТранзакции = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Результат = СервисКриптографииDSSСлужебный.ПолучитьРезультатПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ПараметрыОперации); + + Возврат Результат; + +КонецФункции + +// Сохраняет закрытые данные пароли, пин-коды пользователя сервиса. +// +// Параметры: +// ИдентификаторПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. функцию НастройкиПользователяПоУмолчанию() +// ИмяПараметра - Строка - идентификатор сохраняемого значения +// ЗначениеПараметра - Строка, Структура - см. СервисКриптографииDSSКлиентСервер.ОбъектПароля +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать параметры в зависимости от типа операции +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция СохранитьЗакрытыеДанныеПользователя(ИдентификаторПользователя, ИмяПараметра, ЗначениеПараметра, ПараметрыОперации = Неопределено) Экспорт + + Результат = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Ложь); + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Если ЗначениеЗаполнено(НастройкиПользователя.Логин) Тогда + Результат = СервисКриптографииDSSСлужебный.СохранитьЗакрытыеДанныеПользователя(НастройкиПользователя, + ИмяПараметра, + ЗначениеПараметра, + ПараметрыОперации); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Функция предназначена для обобщения двух функций: создание подключения и вызов функции API. +// При подключении к серверу проверяется актуальность токена и по возможности он обновляется. +// Также функция автоматически формирует заголовок авторизации пользователя. +// +// Параметры: +// ИдентификаторПользователя - см. НастройкиПользователяПоУмолчанию +// АдресМетода - Строка - точка подключения к сервису +// ПараметрыМетода - Структура - содержит параметры передаваемые в метод вызова HTTP-запрос +// МетодHTTP - Строка - содержит метод вызова: GET, POST и прочие методы. +// ТипСодержания - Строка - указывает как формировать тело запроса из ПараметрыМетода, поддерживаются варианты: +// octet: передать двоичными данными, +// text: передать структуру как форматированную строку, +// json_list: передать как json и вернуть как Соответствие, +// json: передать как json. +// Заголовки - Структура, Соответствие - передается как параметр в объект HTTP-запрос +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПодключитьВыполнитьМетодСервиса( + ИдентификаторПользователя, + АдресМетода, + ПараметрыМетода, + МетодHTTP, + ТипСодержания = "text", + Заголовки = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = ПолучитьНастройкиПользователя(ИдентификаторПользователя, ПараметрыОперации); + Если НастройкиПользователя = Неопределено Тогда + РезультатЗапроса = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Ложь); + СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатЗапроса, "Пользователь"); + Возврат РезультатЗапроса; + КонецЕсли; + + СвойстваПодключения = СервисКриптографииDSSСлужебный.ПодготовитьСвойстваПодключения(НастройкиПользователя.Подключение, АдресМетода); + Соединение = СервисКриптографииDSSСлужебный.ПодготовитьПодключение(СвойстваПодключения); + + Если НЕ Соединение.Выполнено Тогда + Возврат Соединение; + КонецЕсли; + + Если Заголовки = Неопределено Тогда + Заголовки = Новый Соответствие; + КонецЕсли; + + ОбновилиТокен = Ложь; + + Для Счетчик = 1 По 2 Цикл + // проверим на валидность токен авторизации + РезультатАвторизации = ПроверитьТокенАутентификации(НастройкиПользователя, Счетчик = 2, ПараметрыОперации); + ОбновилиТокен = ОбновилиТокен ИЛИ РезультатАвторизации.МаркерОбновлен; + Токен = ПолучитьЗначениеПароля(НастройкиПользователя.ТокенАвторизации.Токен, НастройкиПользователя); + Если ЗначениеЗаполнено(НастройкиПользователя.ТокенАвторизации.ТипТокена) Тогда + Заголовки.Вставить("Authorization", НастройкиПользователя.ТокенАвторизации.ТипТокена + " " + + Токен); + КонецЕсли; + РезультатЗапроса = СервисКриптографииDSSСлужебный.ВыполнитьМетодСервиса(Соединение, СвойстваПодключения.АдресПодключения, ПараметрыМетода, МетодHTTP, Заголовки, ТипСодержания); + Если РезультатЗапроса.Выполнено ИЛИ НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатЗапроса.Ошибка) Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Если ОбновилиТокен Тогда + РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + РезультатЗапроса.МаркерОбновлен = ОбновилиТокен; + + Если РезультатЗапроса.Свойство("Заголовки") Тогда + РезультатЗапроса.Удалить("Заголовки"); + КонецЕсли; + + Возврат РезультатЗапроса; + +КонецФункции + +// Служебная функция для обновления токена учетной записи на стороне сервера. +// способами которые возможные не использовать интерактивное взаимодействие с пользователем. +// +// Параметры: +// НастройкиПользователя - см. НастройкиПользователяПоУмолчанию +// Принудительно - Булево - обновить токен не обращая внимания на срок действия. +// Авторизован - Булево - текущий статус авторизации учетной записи. +// ПараметрыОперации - Структура - позволяет указать дополнительные параметры операции: +// * ДатаСеанса - Дата +// * ИсточникНастроек - Строка +// +// Возвращаемое значение: +// Булево - Истина, если успешно обновился маркер безопасности +// +Функция ПроверитьТокенАутентификации(НастройкиПользователя, Принудительно, ПараметрыОперации = Неопределено) + + ДатаСеанса = СервисКриптографииDSSСлужебный.ДатаСеанса(); + ДатаСеанса = СвойствоСтруктуры(ПараметрыОперации, "ДатаСеанса", ДатаСеанса); + Авторизован = Ложь; + + Токен = ПолучитьЗначениеПароля(НастройкиПользователя.ТокенАвторизации.Токен, НастройкиПользователя); + ТокенОбновления = ПолучитьЗначениеПароля(НастройкиПользователя.ТокенАвторизации.ТокенОбновления, НастройкиПользователя); + + Если ЗначениеЗаполнено(Токен) + И НастройкиПользователя.ТокенАвторизации.СрокДействия >= ДатаСеанса Тогда + Авторизован = Истина; + КонецЕсли; + + Результат = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Авторизован); + + // проверим на валидность токена подключения + Если (НЕ Авторизован ИЛИ Принудительно) + И ЗначениеЗаполнено(ТокенОбновления) Тогда + Результат = ОбновитьТокенАутентификации(НастройкиПользователя, ПараметрыОперации); + Авторизован = Результат.Выполнено; + КонецЕсли; + + Если НЕ Авторизован ИЛИ Принудительно Тогда + + ВидАутентификации = НастройкиПользователя.ПервичнаяАутентификация; + + Если ВидАутентификации = Перечисления.СпособыАвторизацииDSS.Первичный_УчетныеДанные // основной сценарий + ИЛИ ВидАутентификации = Перечисления.СпособыАвторизацииDSS.Первичный_ДвухФакторная // возможно, если не подтверждается выпуск маркера безопасности + ИЛИ ВидАутентификации = Перечисления.СпособыАвторизацииDSS.Первичный_КодАвторизации Тогда // возможно, если не подтверждается выпуск маркера безопасности + Результат = АутентификацияПоЛогину(НастройкиПользователя, ПараметрыОперации); + ИначеЕсли ВидАутентификации = Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации Тогда + Результат = АутентификацияПоСертификату(НастройкиПользователя, ПараметрыОперации); + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция подготавливает массив сертификатов в двоичном виде для операции шифрования +// +// Параметры: +// - Сертификаты - Массив, ФиксированныйМассив, Структура, ДвоичныеДанные - содержит данные сертификатов +// +// Возвращаемое значение: +// Массив - содержит элементы с двоичными данными +// +Функция ПолучитьДвоичныеДанныеСертификатов(Сертификаты) + + Результат = Новый Массив; + + Если ТипЗнч(Сертификаты) = Тип("Массив") ИЛИ ТипЗнч(Сертификаты) = Тип("ФиксированныйМассив") Тогда + МассивСертификатов = Сертификаты; + Иначе + МассивСертификатов = Новый Массив; + МассивСертификатов.Добавить(Сертификаты); + КонецЕсли; + + Попытка + Для Каждого Сертификат Из МассивСертификатов Цикл + ДанныеСертификата = ПолучитьСодержимоеСертификата(Сертификат); + Если ЗначениеЗаполнено(ДанныеСертификата) Тогда + Результат.Добавить(ДанныеСертификата); + КонецЕсли; + КонецЦикла; + + Исключение + Результат = Новый Массив; + + КонецПопытки; + + Если 1 = 0 Тогда + СервисКриптографииDSSСлужебный.ДоступныНовыеДанные(Неопределено, Ложь); + СервисКриптографииDSSСлужебный.ОбработатьНовыеДанные(Неопределено, ""); + СервисКриптографииDSSСлужебный.ОбработкаДанныхОтменена(Неопределено); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для получения двоичных данных сертификата (содержимое) +// +// Параметры: +// Сертификат - ДвоичныеДанные, Структура, ФиксированнаяСтруктура - если структура содержит поле "Сертификат", +// то это поле преобразуется в двоичные данные, иначе структура должна содержать поля +// Отпечаток или Издатель с последующим поиском в регистре СертификатыПользователяDSS. +// +Функция ПолучитьСодержимоеСертификата(Сертификат) + + Результат = Неопределено; + + Если ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда + Результат = СервисКриптографииDSSКлиентСервер.СертификатВКодировкеDER(Сертификат); + ИначеЕсли (ТипЗнч(Сертификат) = Тип("Структура") ИЛИ ТипЗнч(Сертификат) = Тип("ФиксированнаяСтруктура")) + И Сертификат.Свойство("Сертификат") Тогда + Результат = СервисКриптографииDSSКлиентСервер.СертификатВКодировкеDER(Сертификат.Сертификат); + Иначе + НашлиСертификат = НайтиСертификат(Сертификат); + Если НашлиСертификат.Выполнено Тогда + Результат = НашлиСертификат.ДанныеСертификата; + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(Результат) Тогда + Результат = Base64Строка(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для подготовки входящих параметров для формирования запросов к серверу +// +// Параметры: +// НастройкиПользователя - Структура - см. подробнее НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * ИсточникНастроек - Строка - допустимо два варианта определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса (по-умолчанию), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище. +// +// Возвращаемое значение: +// см. НастройкиПользователяПоУмолчанию +// +Функция ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации = Неопределено) + + Результат = НастройкиПользователя; + Если НастройкиПользователя = Неопределено Тогда + Результат = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(); + ИначеЕсли ТипЗнч(НастройкиПользователя) <> Тип("Структура") Тогда + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ВходящиеПараметры); + Результат = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(НастройкиПользователя, ИсточникНастроек); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для формирования секрета пользователя в заголовке запроса +// Параметры: +// НастройкиПользователя - см. НастройкиПользователяПоУмолчанию +// ПарольКлиента - Строка - пароль в закрытом виде +// +// Возвращаемое значение: +// Строка - содержит строку для авторизации пользователя в сценарии двухфакторной авторизации +// +Функция ПолучитьПредставлениеСекрета(НастройкиПользователя, ПарольКлиента = "") + + Результат = ""; + + ИсходныеДанные = ПолучитьДвоичныеДанныеИзСтроки(НастройкиПользователя.Логин + + ":" + + ПарольКлиента, + "US-ASCII"); + Результат = "Basic " + ПолучитьBase64СтрокуИзДвоичныхДанных(ИсходныеДанные); + + Возврат Результат; + +КонецФункции + +// Общая функция формирования данных о документе загруженном для обработки +// +// Параметры: +// РезультатВызова - Структура - результат вызова Rest сервиса +// +// Возвращаемое значение: +// Структура: +// * ДополнительнаяИнформация - Структура: +// ** ШаблонДокумента - Строка +// ** ШаблонКонвертации - Строка +// ** МаленькийФайл - Булево +// * РазмерФайла - Число +// * ИмяФайла - Строка +// * ТипФайла - Строка +// * Хеш - Строка - значение хеша +// * АлгоритмХеша - Строка +// * Идентификатор - Строка - идентификатор документа +// * ВременныйФайл - Булево +// * ВремяДоступа - Дата - время последнее обращения к документу +// * ВремяЗагрузки - Дата - время загрузки на сервер\ +// * ИдентификаторПользователя- Строка - идентификатор пользователя владельца +// +Функция ИнформацияОДокументеОбработки(РезультатВызова) + + Результат = Новый Структура; + + ДополнительнаяИнформация = Новый Структура; + ДополнительнаяИнформация.Вставить("ШаблонДокумента", СвойствоСтруктуры(РезультатВызова, "AdditionalInfo.DocumentTemplate", "")); + ДополнительнаяИнформация.Вставить("МаленькийФайл", СвойствоСтруктуры(РезультатВызова, "AdditionalInfo.SmallFile", Ложь)); + ДополнительнаяИнформация.Вставить("ШаблонКонвертации", СвойствоСтруктуры(РезультатВызова, "AdditionalInfo.SnippetTemplate", "")); + + Результат.Вставить("ДополнительнаяИнформация", ДополнительнаяИнформация); + Результат.Вставить("РазмерФайла", СвойствоСтруктуры(РезультатВызова, "FileSize", 0)); + Результат.Вставить("ИмяФайла", СвойствоСтруктуры(РезультатВызова, "Name", "")); + Результат.Вставить("ТипФайла", СвойствоСтруктуры(РезультатВызова, "FileType", "")); + Результат.Вставить("Хеш", СвойствоСтруктуры(РезультатВызова, "Hash", "")); + Результат.Вставить("АлгоритмХеша", СвойствоСтруктуры(РезультатВызова, "HashAlgorithm", "")); + Результат.Вставить("Идентификатор", СвойствоСтруктуры(РезультатВызова, "Id", "")); + Результат.Вставить("ВременныйФайл", СвойствоСтруктуры(РезультатВызова, "IsTemporary", Ложь)); + Результат.Вставить("ВремяДоступа", ДатаUTC(СвойствоСтруктуры(РезультатВызова, "LastAccessTime", 0))); + Результат.Вставить("ВремяЗагрузки", ДатаUTC(СвойствоСтруктуры(РезультатВызова, "UploadTime", 0))); + Результат.Вставить("ИдентификаторПользователя", СвойствоСтруктуры(РезультатВызова, "UserId", "")); + + Возврат Результат; + +КонецФункции + +// Общая функция формирования данных о конвертации документа. +// +// Параметры: +// РезультатВызова - Структура - результат вызова Rest сервиса +// +// Возвращаемое значение: +// Структура: +// * Идентификатор - Строка - идентификатор документа, который был конвертирован +// * Статус - Строка - статус обработки документа +// * Формат - Строка - формат конвертации документа +// * Описание - Строка - дополнительная информация +// +Функция ИнформацияОКонвертацииДокумента(РезультатВызова) + + Результат = Новый Структура; + Результат.Вставить("Идентификатор", СвойствоСтруктуры(РезультатВызова, "OriginalDocument", "")); + Результат.Вставить("Статус", СвойствоСтруктуры(РезультатВызова, "ConvertationStatus", "")); + Результат.Вставить("Формат", СвойствоСтруктуры(РезультатВызова, "ConvertedFormat", "")); + Результат.Вставить("Описание",СвойствоСтруктуры(РезультатВызова, "ConvertationStatusReason", "")); + + Возврат Результат; + +КонецФункции + +// Конвертация даты UTC (число) в обычную дату +// +// Параметры: +// ЧислоДаты - Число +// +// Возвращаемое значение: +// Дата +// +Функция ДатаUTC(Знач ЧислоДаты, Добавка = 1970) + + МассивМесяцев = СтрРазделить("31,28,31,30,31,30,31,31,30,31,30,31", ",", Ложь); + + ЗначениеГода = Цел(ЧислоДаты / 31436000) + Добавка; + + ВисокосныхГодов = Цел((ЗначениеГода - 1969) / 4); + ВисокосныйГод = (Цел((ЗначениеГода - 1969) / 4) - ВисокосныхГодов) = 0; + + КоличествоДней = Цел(ЧислоДаты / 86400); + КоличествоДней = КоличествоДней - ВисокосныхГодов; + ДнейТекущегоГода = КоличествоДней % 365; + Если ВисокосныйГод Тогда + МассивМесяцев[1] = "29"; + КонецЕсли; + + ЗначениеМесяца = 1; + ЗначениеДня = 1; + ВсегоДней = 0; + Для Счетчик = 0 По 11 Цикл + ЗначениеМесяца = Счетчик + 1; + ДнейМесяца = Число(МассивМесяцев[Счетчик]); + ВсегоДней = ВсегоДней + ДнейМесяца; + Если ВсегоДней > ДнейТекущегоГода Тогда + ЗначениеДня = ДнейТекущегоГода - (ВсегоДней - ДнейМесяца) + 1; + Прервать; + КонецЕсли; + КонецЦикла; + + СекундыДня = ЧислоДаты % 86400; + + ЗначениеСекунд = СекундыДня % 60; + ЗначениеЧасов = Цел(СекундыДня / 3600); + ЗначениеМинут = Цел((СекундыДня - ЗначениеЧасов * 3600) / 60); + + Результат = Дата(ЗначениеГода, ЗначениеМесяца, ЗначениеДня, ЗначениеЧасов, ЗначениеМинут, ЗначениеСекунд); + + Возврат Результат; + +КонецФункции + +// Функция-обертка для разбора полей сложнопостроенной структуры. +// +// Параметры: +// ЗначениеСтруктуры - Структура +// - Соответствие +// - Массив +// Ключ - Строка - содержит полный путь к нужному значению +// ЗначениеПоУмолчанию - Произвольный +// +// Возвращаемое значение: +// - ДвоичныеДанные +// - Строка +// - Структура +// - Произвольный - см. СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры +// +Функция СвойствоСтруктуры(ЗначениеСтруктуры, Ключ, ЗначениеПоУмолчанию = Неопределено) + + Возврат СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ЗначениеСтруктуры, Ключ, ЗначениеПоУмолчанию); + +КонецФункции + +// Функция-обертка для функции подстановки параметров в строку. +// +// Параметры: +// ТекущееЗначение - Строка. +// ПараметрСтроки1 - Неопределено +// - Строка +// ПараметрСтроки2 - Неопределено +// - Строка +// ПараметрСтроки3 - Неопределено +// - Строка +// +// Возвращаемое значение: +// Строка +// +Функция ЗаполнитьПараметрыСтроки(ТекущееЗначение, + ПараметрСтроки1 = Неопределено, + ПараметрСтроки2 = Неопределено, + ПараметрСтроки3 = Неопределено) + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекущееЗначение, + ПараметрСтроки1, + ПараметрСтроки2, + ПараметрСтроки3); + +КонецФункции + +// Формирует свойства полученного запроса на сертификат, хранящегося на сервере +// +// Параметры: +// ДанныеЗапросаНаСертификат - Структура - элемент ответа сервера +// +// Возвращаемое значение: +// Структура: +// * Содержание - ДвоичныеДанные - содержание запроса на сертификат +// * Статус - Строка - варианты: Отклонен, Обрабатывается, Одобрен, Регистрация +// * ТипСертификата - Строка - тип сертификата +// * Идентификатор - Строка - идентификатор созданного запроса на сертификат +// +Функция СвойстваЗапросаНаСертификат(ДанныеЗапросаНаСертификат) + + ВсеСтатусы = Новый Соответствие; + ВсеСтатусы.Вставить("REJECTED", "Отклонен"); + ВсеСтатусы.Вставить("PENDING", "Обрабатывается"); + ВсеСтатусы.Вставить("ACCEPTED", "Одобрен"); + ВсеСтатусы.Вставить("REGISTRATION", "Регистрация"); + + ТекущийСтатус = ВсеСтатусы[ДанныеЗапросаНаСертификат.Status]; + ТекущийСтатус = ?(ТекущийСтатус = Неопределено, "НеОбрабатывается", ТекущийСтатус); + + Результат = Новый Структура(); + Результат.Вставить("Содержание", Base64Значение(ДанныеЗапросаНаСертификат.Base64Request)); + Результат.Вставить("Статус", ТекущийСтатус); + Результат.Вставить("ТипСертификата", ДанныеЗапросаНаСертификат.CertificateType); + Результат.Вставить("Идентификатор", ДанныеЗапросаНаСертификат.ID); + Результат.Вставить("Имя", ДанныеЗапросаНаСертификат.Subject); + Результат.Вставить("Владелец", ДанныеЗапросаНаСертификат.DistName); + + Возврат Результат; + +КонецФункции + +// Формирует структуру для параметров операции. +// +// Параметры: +// ПараметрыОперации - Неопределено +// - Структура +// КлючЗначения - Строка +// НовоеЗначение - Произвольный +// +// Возвращаемое значение: +// Структура +// +Функция ПроверитьПараметрыОперации(ПараметрыОперации, КлючЗначения = Неопределено, НовоеЗначение = Неопределено) + + Если ПараметрыОперации = Неопределено + ИЛИ ТипЗнч(ПараметрыОперации) <> Тип("Структура") Тогда + Результат = Новый Структура; + Иначе + Результат = ОбщегоНазначения.СкопироватьРекурсивно(ПараметрыОперации); + КонецЕсли; + + Если КлючЗначения <> Неопределено + И НЕ Результат.Свойство(КлючЗначения) Тогда + Результат.Вставить(КлючЗначения, НовоеЗначение); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует значение пароля на основе переданных данных. +// +// Параметры: +// ОбъектПароля - Структура, Строка - см. СервисКриптографииDSSКлиентСервер.ОбъектПароля +// НастройкиПользователя - Структура - структура хранящая данные сессионные данные учетной записи +// +// Возвращаемое значение: +// Строка +// +Функция ПолучитьЗначениеПароля(ОбъектПароля, НастройкиПользователя) + + Если ТипЗнч(ОбъектПароля) = Тип("Структура") Тогда + Если ОбъектПароля.Состояние = 4 + ИЛИ ОбъектПароля.Состояние = 3 + ИЛИ ОбъектПароля.Состояние = 2 Тогда + Результат = ""; + + ИначеЕсли ОбъектПароля.Состояние = 1 Тогда + Результат = ОткрытьСекретПользователя(ОбъектПароля.Значение, НастройкиПользователя); + + Иначе + Результат = Строка(ОбъектПароля.Значение); + + КонецЕсли; + + Иначе + Результат = ОбъектПароля; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Специализированная функция расшифровки секрета пользователя (пин-код, пароль), для последующей передачи сервису +// +// Параметры: +// СекретПользователя - Строка - зашифрованное представление пароля +// НастройкиПользователя - Структура - структура хранящая данные сессионные данные учетной записи +// +// Возвращаемое значение: +// Строка - открытое значение пароля +// +Функция ОткрытьСекретПользователя(СекретПользователя, НастройкиПользователя) + + Результат = ""; + + ПризнакКонфиденциальности = НастройкиПользователя.ПризнакКонфиденциальности; + + Если ЗначениеЗаполнено(СекретПользователя) И ПризнакКонфиденциальности = 0 Тогда + Результат = СекретПользователя; + + ИначеЕсли ЗначениеЗаполнено(СекретПользователя) Тогда + Случайность = СтрЗаменить(НастройкиПользователя.АвторизованныйПользователь, "-", ""); + Случайность = ПолучитьБуферДвоичныхДанныхИзHexСтроки(Случайность); + КлючПользователя = ПолучитьБуферДвоичныхДанныхИзBase64Строки(СекретПользователя); + + Модуль = КлючПользователя.Размер; + НовыйКлюч = Новый БуферДвоичныхДанных(КлючПользователя.Размер); + + Перемешать = Новый Массив(Модуль); + Для Счетчик = 1 По Модуль Цикл + Перемешать.Установить(Счетчик - 1, Счетчик); + КонецЦикла; + + Для Счетчик = 1 По Модуль Цикл + ИндексЭлемента = Счетчик % Случайность.Размер; + ЗначениеЭлемента = Случайность.Получить(ИндексЭлемента) % Модуль; + НашлиЗначение = Перемешать.Найти(ЗначениеЭлемента); + НашлиСчетчик = Перемешать.Найти(Счетчик); + Если НашлиЗначение <> Неопределено + И НашлиСчетчик <> Неопределено Тогда + Перемешать.Установить(НашлиСчетчик, ЗначениеЭлемента); + Перемешать.Установить(НашлиЗначение, Счетчик); + КонецЕсли; + КонецЦикла; + + Начало = Случайность.Получить(8) % Модуль; + + Ключ1 = Случайность.Получить(6); + Ключ2 = Случайность.Получить(7); + + Для Счетчик = 1 По Модуль Цикл + СледующийБайт = КлючПользователя.Получить(Счетчик - 1); + СледующийБайт = ?(Счетчик % 2 = 1, СледующийБайт - Ключ1, СледующийБайт - Ключ2); + Если СледующийБайт < 0 Тогда + СледующийБайт = СледующийБайт + 256; + КонецЕсли; + КлючПользователя.Установить(Счетчик - 1, СледующийБайт); + КонецЦикла; + + Для Счетчик = 1 По Модуль Цикл + СледующееМесто = Перемешать[Начало]; + СледующийБайт = КлючПользователя.Получить(Счетчик - 1); + НовыйКлюч.Установить(СледующееМесто - 1, СледующийБайт); + Начало = (Начало + 1) % Модуль; + КонецЦикла; + + Результат = ПолучитьСтрокуИзБуфераДвоичныхДанных(НовыйКлюч); + Результат = Сред(Результат, 8); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция технического разбора маркера безопасности в формате JWT +// +// Параметры: +// СодержимоеТокена - Строка - строка в формате Base64 +// +// Возвращаемое значение: +// Структура: +// * Логин - Строка +// * Идентификатор - Строка +// * Телефон - Строка +// * ЭлектроннаяПочта- Строка +// * ИдентификаторЦИ - Строка +// +Функция РазобратьТокенАвторизации(СодержимоеТокена) + + Результат = Новый Структура(); + Результат.Вставить("Логин", ""); + Результат.Вставить("Идентификатор", ""); + Результат.Вставить("Телефон", ""); + Результат.Вставить("ЭлектроннаяПочта", ""); + Результат.Вставить("ИдентификаторЦИ", ""); + + Попытка + МассивРазделов = СтрРазделить(СодержимоеТокена, "."); + + ПодготовленныйТекст = СтрЗаменить(МассивРазделов[1], "-", "+"); + ПодготовленныйТекст = СтрЗаменить(ПодготовленныйТекст, "_", "/"); + ПодготовленныйТекст = ПодготовленныйТекст + "=="; + + ПредставлениеТокена = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(ПодготовленныйТекст)); + КлючевыеПоля = СервисКриптографииDSSСлужебный.JsonВСтруктуру(ПредставлениеТокена, Истина); + Результат.Логин = КлючевыеПоля["unique_name"]; + Результат.Идентификатор = КлючевыеПоля["nameid"]; + Результат.Телефон = КлючевыеПоля["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone"]; + Результат.ЭлектроннаяПочта = КлючевыеПоля["email"]; + Результат.ИдентификаторЦИ = КлючевыеПоля["dss_iss"]; + + Исключение + ОбъектОшибки = ИнформацияОбОшибке(); + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове( + ПодробноеПредставлениеОшибки(ОбъектОшибки), + НСтр("ru = 'Разобрать токен авторизации'"), + СодержимоеТокена, + ОбъектОшибки); + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СервисКриптографииDSS/СервисКриптографииDSS.mdo b/SSL/src/CommonModules/СервисКриптографииDSS/СервисКриптографииDSS.mdo new file mode 100644 index 000000000..6bd880112 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSS/СервисКриптографииDSS.mdo @@ -0,0 +1,11 @@ + + + СервисКриптографииDSS + + ru + Сервис криптографии DSS + + true + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/Module.bsl new file mode 100644 index 000000000..6d1841682 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/Module.bsl @@ -0,0 +1,1677 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Модуль для клиент-серверного вызова +// Модуль предназначен для работы с бинарными данными ASN и PKCS: +// низкоуровневый: разбор сообщений ASN, реестр OID +// высокоуровневый: реестр данных о сертификатах найденных в зашифрованном сообщении, +// сведения о сертификате, данные о подписантах в электронной подписи +// +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность + +// Функция разбирает двоичные данные по формату ASN и раскладывает результат в структуру +// +// Параметры: +// ДанныеASN - ДвоичныеДанные - данные файла, которые надо разобрать как ASN структуру +// ПараметрыОперации - Структура - проверяется наличие значений влияющие на режим разбора данных: +// * ИсключитьСодержимое - Булево - исключает избыточный разбор бинарного содержимого, по умолчанию Истина +// * ВключитьИсходныеДанные - Булево - включает исходные данные в вид HEX, по умолчанию Ложь +// * ОтображатьОшибки - Булево - отображает исключение во время разбора, по умолчанию Ложь +// * ОграничениеDER - Булево - отключает анализ байтовых последовательностей +// +// Возвращаемое значение: +// - Неопределено +// - Структура из КлючИЗначение- содержит разобранную структуру в "сыром" виде: +// * Ключ - Строка +// * Значение - Структура: +// ** Тип - Строка +// ** Значение - Произвольный +// ** Данные - Строка - представление данных в HEX +// +Функция ЧтениеСтруктурыASNФайла(ДанныеASN, ПараметрыОперации = Неопределено) Экспорт + + ОпределениеASN = Новый Структура(); + ОпределениеASN.Вставить("Классы", ОпределитьТип_Классы()); + ОпределениеASN.Вставить("Теги", ОпределитьТип_Теги()); + ОпределениеASN.Вставить("Типы", ОпределитьТип_Тип()); + ОпределениеASN.Вставить("ИсключитьСодержимое", СвойствоСтруктуры(ПараметрыОперации, "ИсключитьСодержимое", Истина)); + ОпределениеASN.Вставить("ВключитьИсходныеДанные", СвойствоСтруктуры(ПараметрыОперации, "ВключитьИсходныеДанные", Ложь)); + ОпределениеASN.Вставить("ОтображатьОшибки", СвойствоСтруктуры(ПараметрыОперации, "ОтображатьОшибки", Ложь)); + ОпределениеASN.Вставить("ОграничениеDER", СвойствоСтруктуры(ПараметрыОперации, "ОграничениеDER", Ложь)); + + Результат = Неопределено; + Попытка + ПотокЧтенияФайла= ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДанныеASN); + + Результат = НоваяСтрока("Начало", Новый Массив); + ПрочитатьОчереднуюПорцию(ОпределениеASN, ПотокЧтенияФайла, 1, Результат); + Исключение + ОтработатьВозникновениеОшибки(ОпределениеASN); + Результат = Неопределено; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Функция для формирования массива поддерживаемых объектов OID. +// Также может служить, для анализа полей владельца существующего сертификата, подписи, шифрованного сообщения и прочее. +// +// Параметры: +// КлючевоеПоле - Строка - поле, которое будет ключом для объекта соответствия +// ФильтрНазначения - Строка - назначение поля, по которому могут быть отсечены лишние строки. Предусмотренные значения +// 10 - поля владельца сертификата или запроса на сертификат +// hash алгоритмы хеш, +// dec алгоритмы шифрования, +// X509 алгоритмы подписи. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка +// * Значение - Структура: +// ** OID - Строка - идентификатор объекта +// ** Имя - Строка - строковый идентификатор поля +// ** Длина - Число - рекомендуемая длина поля +// ** Представление- Строка - идентификатор поля для БСП +// ** Обязательно - Булево - Истина, если поле должно быть присутствовать в запросе на сертификат +// ** Назначение - Строка - основное использования данного поля +// +Функция ОпределитьТип_OID(Знач КлючевоеПоле = Неопределено, ФильтрНазначения = "") Экспорт + + Результат = Новый Соответствие; + + ВесьМассив = Новый Массив; + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.3", "CN", 64, "ОбщееИмя", "10")); + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.4", "SN", 64, "Фамилия", "10")); + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.42", "G", 64, "ИмяОтчество", "10")); + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.6", "C", 2, "Страна", "10"));// RU + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.8", "S", 128, "КодРегиона", "10"));// 77 г. Москва + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.7", "L", 128, "НаселенныйПункт", "10"));// "Москва г, Зеленоград г, Крюково п" + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.9", "Street", 128, "Улица", "10")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.100.5", "OGRNIP", 15, "ОГРНИП", "10")); + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.10", "O", 64, "Организация", "10")); + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.11", "OU", 64, "Подразделение", "10")); + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.12", "T", 64, "Должность", "10")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.100.1", "OGRN", 13, "ОГРН", "10")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.100.3", "SNILS", 14, "СНИЛС", "10")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.3.131.1.1", "INN", 12, "ИНН", "10")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.840.113549.1.9.1", "E", 128, "ЭлектроннаяПочта", "10")); + + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.5", "SerialNumber", 0, "СерийныйНомер")); + ВесьМассив.Добавить(НовыйАтрибут("2.5.4.13", "Description", 0, "Описание")); + + ВесьМассив.Добавить(НовыйАтрибут("1.2.840.113549.1.1.1", "rsaEncryption", 0)); + ВесьМассив.Добавить(НовыйАтрибут("1.2.840.113549.1.1.5", "sha1WithRSAEncryption", 0)); + ВесьМассив.Добавить(НовыйАтрибут("1.3.6.1.5.5.7.1.1", "authorityInfoAccess", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.14", "X509v3 Subject Key Identifier", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.15", "X509v3 Key Usage", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.16", "X509v3 Private Key Usage Period", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.17", "X509v3 Subject Alternative Name", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.18", "X509v3 Issuer Alternative Name", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.19", "X509v3 Basic Constraints", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.30", "X509v3 Name Constraints", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.31", "X509v3 CRL Distribution Points", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.32", "X509v3 Certificate Policies Extension", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.33", "X509v3 Policy Mappings", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.35", "X509v3 Authority Key Identifier", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.36", "X509v3 Policy Constraints", 0)); + ВесьМассив.Добавить(НовыйАтрибут("2.5.29.37", "X509v3 Extended Key Usage", 0)); + + ВесьМассив.Добавить(НовыйАтрибут("1.2.840.113549.1.7.3", "КонтейнерЗашифрованногоБлока", 0)); + + // алгоритмы хеш + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.2.2.9", "GOST R 34.11-94", 0, , "hash")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.7.1.1.2.1", "GOST R 34.11-94", 0, , "hash")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.7.1.1.2.2", "GOST R 34.11-2012-256", 0, , "hash")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.7.1.1.2.3", "GOST R 34.11-2012-512", 0, , "hash")); + + // алгоритмы шифрования + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.2.2.21", "GOST R 28147-89", 0, , "dec")); + + // алгоритмы экспорта / импорта ключей + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.2.2.19", "GOST R 34.10-2001", 0, , "X509")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.2.2.20", "GOST R 34.10-94", 0, , "X509")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.7.1.1.1.1", "GOST R 34.10-2012-256", 0, , "X509")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.7.1.1.1.2", "GOST R 34.10-2012-512", 0, , "X509")); + + // алгоритмы цифровой подписи + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.7.1.1.3.2", "GOST R 34.10-2012-256 + GOST R 34.11-2012-256", 0, , "X509")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.7.1.1.3.3", "GOST R 34.10-2012-512 + GOST R 34.11-2012-512", 0, , "X509")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.2.2.3", "GOST R 34.10-2001", 0, , "X509")); + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.2.2.4", "GOST R 34.10-94", 0, , "X509")); + + ВесьМассив.Добавить(НовыйАтрибут("1.2.643.100.111", "СредствоЭлектроннойПодписи", 0, , "X509")); + + Если НЕ ЗначениеЗаполнено(КлючевоеПоле) Тогда + КлючевоеПоле = "OID" + КонецЕсли; + + Результат = Новый Соответствие; + Для каждого СтрокаМассива Из ВесьМассив Цикл + Если НЕ ЗначениеЗаполнено(ФильтрНазначения) + ИЛИ СтрокаМассива.Назначение = ФильтрНазначения Тогда + Результат.Вставить(СтрокаМассива[КлючевоеПоле], СтрокаМассива); + КонецЕсли + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Функция для составления реестра сертификатов с помощью которых было зашифровано сообщение. +// +// Параметры: +// ДанныеФайла - ДвоичныеДанные - содержит зашифрованные данные +// +// Возвращаемое значение: +// Массив из см. СведенияСертификатаВладельца +// +Функция ПолучитьСертификатыШифрования(ДанныеФайла) Экспорт + + Результат = Новый Массив; + + СтруктураФайла = ЧтениеСтруктурыASNФайла(ДанныеФайла); + Если СтруктураФайла = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + ВеткаСтруктуры = НайтиOID(СтруктураФайла, "1.2.840.113549.1.7.3"); + + Если ВеткаСтруктуры = Неопределено + ИЛИ ВеткаСтруктуры.Уровень <> 1 Тогда + Возврат Результат; + КонецЕсли; + + МассивДанных = СвойствоСтруктуры(ВеткаСтруктуры.Ветка, "Значение[1].Значение[0].Значение[1].Значение", Новый Массив); + + Если МассивДанных = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + СтруктураВетки = Новый Соответствие; + + Для каждого СтрокаМассива Из МассивДанных Цикл + ДанныеВетки = НайтиПоТипуУзла(СтрокаМассива, "INTEGER"); + Если ДанныеВетки <> Неопределено И ДанныеВетки.Уровень = 1 Тогда + Сертификат = СведенияСертификатаВладельца(); + Для каждого СтрокаСертификата Из ДанныеВетки.Ветка.Значение Цикл + Если СтрокаСертификата.Тип = "INTEGER" Тогда + Сертификат.СерийныйНомер = Привести_ЧислоHEX(СтрокаСертификата.Значение); + ИначеЕсли ТипЗнч(СтрокаСертификата.Значение) = Тип("Массив") Тогда + СтруктураВетки = ЗаполнитьДанныеОбъектов(СтрокаСертификата.Значение); + ПолучитьПредставлениеОбъектов(СтруктураВетки, Сертификат, "10"); + КонецЕсли; + КонецЦикла; + Результат.Добавить(Сертификат); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Функция для анализа дополнительных свойств сертификата. +// +// Параметры: +// ДанныеФайла - ДвоичныеДанные - содержит данные сертификата +// +// Возвращаемое значение: +// см. СвойстваСертификатаПоУмолчанию +// +Функция ПолучитьСвойстваСертификата(ДанныеФайла) Экспорт + + Результат = СвойстваСертификатаПоУмолчанию(); + + СтруктураФайла = ЧтениеСтруктурыASNФайла(ДанныеФайла, Новый Структура("ИсключитьСодержимое, ВключитьИсходныеДанные", Ложь, Истина)); + Если СтруктураФайла = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Результат.Отпечаток = СервисКриптографииDSSСлужебныйВызовСервера.ВычислитьХешДвоичныхДанных(ДанныеФайла, "SHA1"); + + ПервыйТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Тип"); + ВторойТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Тип"); + ТретийТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[0].Тип"); + ЧетвертыйТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[0].Значение[0].Тип"); + + Если ПервыйТег <> "SEQUENCE" + ИЛИ ВторойТег <> "SEQUENCE" Тогда + Возврат Результат + КонецЕсли; + + Если ТретийТег = "OPTIONAL" + И ЧетвертыйТег = "INTEGER" Тогда + Версия = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[0].Значение[0].Значение", -1); + Если Версия >= 0 И Версия < 3 Тогда + Результат.Версия = Версия + 1 + КонецЕсли; + КонецЕсли; + + Если ПервыйТег = "SEQUENCE" Тогда + ДанныеОбъекта = ЗаполнитьДанныеОбъектов(СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[3].Значение")); + ПолучитьПредставлениеОбъектов(ДанныеОбъекта, Результат.Издатель, "10"); + ДанныеОбъекта = ЗаполнитьДанныеОбъектов(СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[5].Значение")); + ПолучитьПредставлениеОбъектов(ДанныеОбъекта, Результат.Субъект, "10"); + ДанныеОбъекта = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[4].Значение"); + Если ДанныеОбъекта <> Неопределено Тогда + Результат.ДатаНачала = ДанныеОбъекта[0].Значение; + Результат.ДатаОкончания = ДанныеОбъекта[1].Значение; + КонецЕсли; + КонецЕсли; + + ТретийТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[1].Тип"); + Если ТретийТег = "INTEGER" Тогда + СерийныйНомер = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[1].Значение", 0); + Если СерийныйНомер > 0 Тогда + Результат.СерийныйНомер = Привести_ЧислоHEX(СерийныйНомер); + КонецЕсли; + КонецЕсли; + + ТретийТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[1].Значение[0].Тип"); + Если ТретийТег = "OBJECT" Тогда + АлгоритмПубличногоКлюча = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[1].Значение[0].Значение"); + ВсеАлгоритмы = ОпределитьТип_OID(Неопределено, "X509"); + ОпределениеАлгоритма = ВсеАлгоритмы[АлгоритмПубличногоКлюча]; + Если ОпределениеАлгоритма <> Неопределено Тогда + Результат.АлгоритмПубличногоКлюча = ОпределениеАлгоритма.Имя; // Строка + КонецЕсли; + КонецЕсли; + + ТретийТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[6].Значение[1].Тип"); + Если ТретийТег = "BITSTRING" Тогда + ОткрытыйКлюч = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[6].Значение[1]"); + Результат.ОткрытыйКлюч = Сред(ОткрытыйКлюч.Данные, 7); + КонецЕсли; + + ВеткаСтруктуры = НайтиOID(СтруктураФайла, "1.2.643.100.111"); + Если ВеткаСтруктуры <> Неопределено Тогда + Результат.Программа = СвойствоСтруктуры(ВеткаСтруктуры.Ветка, "Значение[1].Значение.Значение", ""); + КонецЕсли; + + ВеткаСтруктуры = НайтиOID(СтруктураФайла, "2.5.29.15"); + Если ВеткаСтруктуры <> Неопределено Тогда + ЗначениеФлагов = СвойствоСтруктуры(ВеткаСтруктуры.Ветка, "Значение[2].Значение.Значение", ""); + Результат.ИспользоватьДляШифрования = Сред(ЗначениеФлагов, 4, 1) = "1"; + Результат.ИспользоватьДляПодписи = Сред(ЗначениеФлагов, 1, 1) = "1"; + Результат.ФлагиИспользования = ЗначениеФлагов; + КонецЕсли; + + ВсеАлгоритмы = ОпределитьТип_OID(Неопределено, "hash"); + Для Каждого СтрокаМассива Из ВсеАлгоритмы Цикл + ВеткаСтруктуры = НайтиOID(СтруктураФайла, СтрокаМассива.Ключ); + Если ВеткаСтруктуры <> Неопределено Тогда + Результат.АлгоритмыХеш.Добавить(СтрокаМассива.Значение.Имя); // Строка + КонецЕсли; + КонецЦикла; + + Если Результат.АлгоритмыХеш.Количество() = 0 Тогда + // совмещенный алгоритм + ВсеАлгоритмы = Новый Соответствие; + ВсеАлгоритмы.Вставить("1.2.643.2.2.3", НовыйАтрибут("1.2.643.2.2.3", "GOST R 34.11-94", 0, , "X509")); + ВсеАлгоритмы.Вставить("1.2.643.7.1.1.3.1", НовыйАтрибут("1.2.643.7.1.1.3.1", "GOST R 34.11-94", 0, , "X509")); + ВсеАлгоритмы.Вставить("1.2.643.7.1.1.3.2", НовыйАтрибут("1.2.643.7.1.1.3.2", "GOST R 34.11-2012-256", 0, , "X509")); + ВсеАлгоритмы.Вставить("1.2.643.7.1.1.3.3", НовыйАтрибут("1.2.643.7.1.1.3.3", "GOST R 34.11-2012-512", 0, , "X509")); + Для Каждого СтрокаМассива Из ВсеАлгоритмы Цикл + ВеткаСтруктуры = НайтиOID(СтруктураФайла, СтрокаМассива.Ключ); + Если ВеткаСтруктуры <> Неопределено Тогда + Результат.АлгоритмыХеш.Добавить(СтрокаМассива.Значение.Имя); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ВеткаСтруктуры = НайтиOID(СтруктураФайла, "2.5.29.14"); + Если ВеткаСтруктуры <> Неопределено Тогда + Результат.ИдентификаторСубъекта = СвойствоСтруктуры(ВеткаСтруктуры, "Следующий.Значение.Значение", ""); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция для анализа дополнительных свойств запроса на сертификат. +// +// Параметры: +// ДанныеФайла - ДвоичныеДанные - содержит данные сертификата +// ПараметрыОперации - Неопределено, Структура - определяет дополнительные параметры функции: +// * КлючевоеПоле - Строка - имя ключевого поля для формирования атрибутов владельца +// +// Возвращаемое значение: +// см. СервисКриптографииDSSASNКлиентСервер.СвойстваЗапросаНаСертификатПоУмолчанию +// +Функция ПолучитьСвойстваЗапросаНаСертификат(ДанныеФайла, ПараметрыОперации = Неопределено) Экспорт + + Результат = СвойстваЗапросаНаСертификатПоУмолчанию(); + КлючевоеПоле = СвойствоСтруктуры(ПараметрыОперации, "КлючевоеПоле", "Представление"); + + СтруктураФайла = ЧтениеСтруктурыASNФайла(ДанныеФайла, Новый Структура("ИсключитьСодержимое", Ложь)); + Если СтруктураФайла = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + ПервыйТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[2].Значение[0].Значение[0].Тип"); + ВторойТег = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[2].Значение[1].Тип"); + + Если ПервыйТег <> "OBJECT" + ИЛИ ВторойТег <> "BITSTRING" Тогда + Возврат Результат + КонецЕсли; + + ДанныеОбъекта = ЗаполнитьДанныеОбъектов(СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[1].Значение")); + Результат.Владелец = ПолучитьПредставлениеОбъектов(ДанныеОбъекта, Неопределено, "10", КлючевоеПоле); + + АлгоритмПубличногоКлюча = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[2].Значение[0].Значение[0].Значение"); + ВсеАлгоритмы = ОпределитьТип_OID(Неопределено, "X509"); + ОпределениеАлгоритма = ВсеАлгоритмы[АлгоритмПубличногоКлюча]; + Если ОпределениеАлгоритма <> Неопределено Тогда + Результат.АлгоритмПубличногоКлюча = ОпределениеАлгоритма.Имя; + КонецЕсли; + + ОткрытыйКлюч = СвойствоСтруктуры(СтруктураФайла, "Значение[0].Значение[0].Значение[2].Значение[1].Значение"); + Если ЗначениеЗаполнено(ОткрытыйКлюч) Тогда + Результат.ОткрытыйКлюч = ОткрытыйКлюч; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция для данных из электронной подписи, таких как значение подписи, алгоритм подписи, сертификат подписи. +// +// Параметры: +// ДанныеФайла - ДвоичныеДанные - содержит криптографические данные +// +// Возвращаемое значение: +// Массив - элементы содержат Структуру с полями: +// * ЗначениеПодписи - ДвоичныеДанные +// * АлгоритмПодписи - Строка +// * Издатель - см. СведенияСертификатаВладельца +// * АлгоритмХеша - Строка +// * АлгоритмШифрованияХеша - Строка +// * АлгоритмПубличногоКлюча - Строка +// * АлгоритмПодписи - Строка +// * ЗначениеПодписи - Строка +// * ЗначениеОткрытогоКлюча - Строка +// * Сертификат - ДвоичныеДанные +// * СертификатИздателя - см. СведенияСертификатаВладельца +// * АтрибутыПодписи - Строка +// * ВремяПодписи - Дата +// * ХешДокумента - Строка +// * СерийныйНомер - Строка +// +Функция ПолучитьСвойстваПодписи(ДанныеФайла) Экспорт + + Результат = Новый Массив; + + СтруктураФайла = ЧтениеСтруктурыASNФайла(ДанныеФайла, Новый Структура("ИсключитьСодержимое, ВключитьИсходныеДанные", Ложь, Истина)); + Если СтруктураФайла = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + ВеткаСтруктуры = НайтиOID(СтруктураФайла, "1.2.840.113549.1.7.2"); + + Если ВеткаСтруктуры = Неопределено + ИЛИ ВеткаСтруктуры.Уровень <> 1 Тогда + Возврат Результат; + КонецЕсли; + + ВеткаСтруктуры = НайтиOID(ВеткаСтруктуры.Ветка, "1.2.840.113549.1.7.1"); + + Если ВеткаСтруктуры = Неопределено ИЛИ ВеткаСтруктуры.Следующий = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + // ищем ветку со значением подписи + ВеткаПодписей = Неопределено; + ВеткаСертификатов = Неопределено; + Отсоединенная = Истина; + НашлиЭлемент = ВеткаСтруктуры.Следующий; + Если ТипЗнч(НашлиЭлемент.Значение) = Тип("Массив") + И НашлиЭлемент.Значение.Количество() = 1 + И НашлиЭлемент.Значение[0].Тип = "OCTETSTRING" Тогда + Отсоединенная = Ложь; + КонецЕсли; + + Если НЕ Отсоединенная Тогда + Родитель = НашлиЭлемент.Значение[0]; + НашлиЭлемент = СвойствоСтруктуры(Родитель, "Значение[0]"); + Иначе + Родитель = ВеткаСтруктуры.Ветка; + КонецЕсли; + + Пока НашлиЭлемент <> Неопределено Цикл + Если ВеткаПодписей = Неопределено И ТипЗнч(НашлиЭлемент.Значение) = Тип("Массив") И НашлиЭлемент.Тип = "SET" Тогда + ВеткаПодписей = НашлиЭлемент.Значение; + ИначеЕсли ВеткаСертификатов = Неопределено И ТипЗнч(НашлиЭлемент.Значение) = Тип("Массив") И НашлиЭлемент.Тип = "OPTIONAL" Тогда + ВеткаСертификатов = НашлиЭлемент.Значение; + КонецЕсли; + НашлиЭлемент = ПолучитьСледующийЭлемент(Родитель, НашлиЭлемент); + КонецЦикла; + + Если ВеткаПодписей = Неопределено ИЛИ ВеткаСертификатов = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + ВсеАлгоритмы = ОпределитьТип_OID(Неопределено); + СерийныеНомера = Новый Соответствие; + + Для Каждого СтрокаМассива Из ВеткаПодписей Цикл + НоваяСтрока = Новый Структура; + + НоваяСтрока.Вставить("АлгоритмХеша", ""); + НоваяСтрока.Вставить("АлгоритмШифрованияХеша", ""); + НоваяСтрока.Вставить("АлгоритмПубличногоКлюча", ""); + НоваяСтрока.Вставить("АлгоритмПодписи", ""); + НоваяСтрока.Вставить("ЗначениеПодписи", ""); + НоваяСтрока.Вставить("ЗначениеОткрытогоКлюча", ""); + НоваяСтрока.Вставить("Сертификат", Неопределено); + НоваяСтрока.Вставить("СертификатИздателя", СведенияСертификатаВладельца()); + НоваяСтрока.Вставить("АтрибутыПодписи", Неопределено); + НоваяСтрока.Вставить("ВремяПодписи", Неопределено); + НоваяСтрока.Вставить("ХешДокумента", Неопределено); + НоваяСтрока.Вставить("СерийныйНомер", ""); + + ДанныеПодписи = СвойствоСтруктуры(СтрокаМассива, "Значение", Новый Массив); + Счетчик = 1; + Для Каждого СтрокаПодписи Из ДанныеПодписи Цикл + + Если Счетчик = 2 Тогда // подписант и серийный номер + СерийныйНомер = СвойствоСтруктуры(СтрокаПодписи, "Значение[1].Значение", 0); + Если СерийныйНомер <> Неопределено Тогда + НоваяСтрока.СерийныйНомер = Привести_ЧислоHEX(СерийныйНомер); + КонецЕсли; + + ИначеЕсли СтрокаПодписи.Тип = "SEQUENCE" Тогда + НайденныйАлгоритм = ВсеАлгоритмы[СвойствоСтруктуры(СтрокаПодписи, "Значение[0].Значение", "")]; + Если НайденныйАлгоритм <> Неопределено И НайденныйАлгоритм.Назначение = "hash" Тогда + НоваяСтрока.АлгоритмХеша = НайденныйАлгоритм.Имя; + ИначеЕсли НайденныйАлгоритм <> Неопределено Тогда + НоваяСтрока.АлгоритмШифрованияХеша = НайденныйАлгоритм.Имя; + КонецЕсли; + + ИначеЕсли СтрокаПодписи.Тип = "OCTETSTRING" Тогда + НоваяСтрока.ЗначениеПодписи = СтрокаПодписи.Значение; + + ИначеЕсли СтрокаПодписи.Тип = "OPTIONAL" Тогда + Издатель = НайтиOID(СтрокаПодписи, "1.2.840.113549.1.9.16.2.47"); + ХешДокумента = НайтиOID(СтрокаПодписи, "1.2.840.113549.1.9.4"); + ВремяПодписи = НайтиOID(СтрокаПодписи, "1.2.840.113549.1.9.5"); + + Если Издатель <> Неопределено Тогда + ДанныеИздателя = ЗаполнитьДанныеОбъектов(Издатель.Следующий.Значение); + ПолучитьПредставлениеОбъектов(ДанныеИздателя, НоваяСтрока.СертификатИздателя, "10"); + КонецЕсли; + + Если ХешДокумента <> Неопределено Тогда + НоваяСтрока.АтрибутыПодписи = "31" + Сред(СтрокаПодписи.Данные, 3); // заменяем тег + ТекущаяВетка = СвойствоСтруктуры(ХешДокумента.Следующий, "Значение[0].Значение"); + Если ТипЗнч(ТекущаяВетка) = Тип("Структура") Тогда + НоваяСтрока.ХешДокумента = СвойствоСтруктуры(ТекущаяВетка, "Данные", ""); + Иначе + НоваяСтрока.ХешДокумента = СокрЛП(ТекущаяВетка); + КонецЕсли; + КонецЕсли; + + Если ВремяПодписи <> Неопределено Тогда + НоваяСтрока.ВремяПодписи = СвойствоСтруктуры(ВремяПодписи.Следующий, "Значение[0].Значение", ""); + КонецЕсли; + + КонецЕсли; + + Счетчик = Счетчик + 1; + + КонецЦикла; + + СерийныеНомера.Вставить(НоваяСтрока.СерийныйНомер, НоваяСтрока); + Результат.Добавить(НоваяСтрока); + + КонецЦикла; + + Для Каждого СтрокаМассива Из ВеткаСертификатов Цикл + НоваяСтрока = Неопределено; + СертификатПодписанта = СвойствоСтруктуры(СтрокаМассива, "Значение[0].Значение", Новый Массив); + + Если СертификатПодписанта.Количество() > 0 Тогда + СерийныйНомер = Привести_ЧислоHEX(СвойствоСтруктуры(СертификатПодписанта, "[1].Значение", 0)); + НоваяСтрока = СерийныеНомера[СерийныйНомер]; + КонецЕсли; + + Если НоваяСтрока <> Неопределено Тогда + НоваяСтрока.Сертификат = ПолучитьДвоичныеДанныеИзHexСтроки(СтрокаМассива.Данные); + НоваяСтрока.ЗначениеОткрытогоКлюча = СвойствоСтруктуры(СертификатПодписанта, "[6].Значение[1].Значение", ""); + ОпределениеАлгоритма = ВсеАлгоритмы[СвойствоСтруктуры(СертификатПодписанта, "[2].Значение[0].Значение", "")]; + Если ОпределениеАлгоритма <> Неопределено Тогда + НоваяСтрока.АлгоритмПодписи = ОпределениеАлгоритма.Имя; + КонецЕсли; + ДанныеВетки = СвойствоСтруктуры(СтрокаМассива, "Значение[1].Значение[0].Значение", ""); + ОпределениеАлгоритма = ВсеАлгоритмы[ДанныеВетки]; + Если ОпределениеАлгоритма <> Неопределено Тогда + НоваяСтрока.АлгоритмПубличногоКлюча = ОпределениеАлгоритма.Имя; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Анализирует тип криптографических данных +// +// Параметры: +// ДанныеФайла - ДвоичныеДанные - содержит криптографические данные +// +// Возвращаемое значение: +// Строка - фиксированные варианты Неопределено, Подпись, Шифрованные +// +Функция ОпределитьТипКриптоДанных(ДанныеФайла) Экспорт + + Результат = "Неопределено"; + СтруктураФайла = ЧтениеСтруктурыASNФайла(ДанныеФайла); + Если СтруктураФайла = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + ВеткаШифрования = НайтиOID(СтруктураФайла, "1.2.840.113549.1.7.3"); + ВеткаПодписи = НайтиOID(СтруктураФайла, "1.2.840.113549.1.7.2"); + + Если ВеткаШифрования <> Неопределено Тогда + Результат = "Шифрованные"; + ИначеЕсли ВеткаПодписи <> Неопределено Тогда + Результат = "Подпись"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Меняет местами байты в паре байтов (слово) +// +// Параметры: +// ДанныеФайла - ДвоичныеДанные - содержит данные для обработки +// +// Возвращаемое значение: +// ДвоичныеДанные +// +Функция ИнвертироватьПолубайты(ДанныеФайла) Экспорт + + СтрокаДанных = ПолучитьHexСтрокуИзДвоичныхДанных(ДанныеФайла); + СтрокаРезультата = ""; + Счетчик = 1; + ДлинаСтроки = СтрДлина(СтрокаДанных); + + Пока Счетчик < ДлинаСтроки Цикл + СтрокаРезультата = СтрокаРезультата + Сред(СтрокаДанных, Счетчик + 1, 1) + Сред(СтрокаДанных, Счетчик, 1); + Счетчик = Счетчик + 2; + КонецЦикла; + + Если ДлинаСтроки % 2 = 1 Тогда + СтрокаРезультата = СтрокаРезультата + "0" + Сред(СтрокаДанных, ДлинаСтроки, 1); + КонецЕсли; + + Результат = ПолучитьДвоичныеДанныеИзHexСтроки(СтрокаРезультата); + + Возврат Результат; + +КонецФункции + +// Формирует структуру, описывающую свойства сертификата ЭП. +// +// Возвращаемое значение: +// Структура: +// * Версия - Строка +// * СерийныйНомер - Строка +// * ОткрытыйКлюч - Строка +// * Отпечаток - Строка +// * ДатаНачала - Дата +// * ДатаОкончания - Дата +// * Издатель - см. СведенияСертификатаВладельца +// * Субъект - см. СведенияСертификатаВладельца +// * ИспользоватьДляПодписи - Булево +// * ИспользоватьДляШифрования- Булево +// * РасширенныеСвойства - Структура +// * АлгоритмПубличногоКлюча - Строка +// * Программа - Строка +// * АлгоритмыХеш - Строка +// * ИдентификаторСубъекта - Строка +// * ФлагиИспользования - Строка - единицы или нули с позиционным кодирование +// digitalSignature(0) цифровая подпись, +// nonRepudiation(1) non-repudiation, +// keyEncipherment(2) шифрование ключей, +// dataEncipherment(3) шифрование данных, +// keyAgreement(4) согласование ключей, +// keyCertSign(5) проверка подписей под квалифицированными сертификатами, +// cRLSign(6) проверка подписей под списками аннулированных сертификатов, +// encipherOnly(7) зашифрование данных в процессе согласования ключей, +// decipherOnly(8) расшифрование данных в процессе согласования ключей. +// +Функция СвойстваСертификатаПоУмолчанию() Экспорт + + Результат = Новый Структура(); + // совпадающие с платформой + Результат.Вставить("Версия", ""); + Результат.Вставить("СерийныйНомер", ""); + Результат.Вставить("ОткрытыйКлюч", ""); + Результат.Вставить("Отпечаток", ""); + Результат.Вставить("Издатель", СведенияСертификатаВладельца()); + Результат.Вставить("Субъект", СведенияСертификатаВладельца()); + Результат.Вставить("ДатаНачала", '00010101'); + Результат.Вставить("ДатаОкончания", '00010101'); + Результат.Вставить("ИспользоватьДляПодписи", Ложь); + Результат.Вставить("ИспользоватьДляШифрования", Ложь); + Результат.Вставить("РасширенныеСвойства", Новый Структура); + + // дополнительные + Результат.Вставить("ИдентификаторСубъекта", ""); + Результат.Вставить("Программа", ""); + Результат.Вставить("АлгоритмПубличногоКлюча", ""); + Результат.Вставить("АлгоритмыХеш", Новый Массив); + Результат.Вставить("ФлагиИспользования", ""); + + Возврат Результат; + +КонецФункции + +// Формирует описание сведений владельца сертификата + серийный номер +// +// Возвращаемое значение: +// Структура: +// * СерийныйНомер - Строка +// * ОбщееИмя - Строка +// * Фамилия - Строка +// * ИмяОтчество - Строка +// * Страна - Строка +// * КодРегиона - Строка +// * НаселенныйПункт - Строка +// * Улица - Строка +// * Организация - Строка +// * ЭлектроннаяПочта- Строка +// * Подразделение - Строка +// * Должность - Строка +// * ЭлектроннаяПочта- Строка +// * ОГРНИП - Строка +// * ОГРН - Строка +// * СНИЛС - Строка +// * ИНН - Строка +// +Функция СведенияСертификатаВладельца() Экспорт + + Результат = Новый Структура(); + Результат.Вставить("СерийныйНомер", ""); + Результат.Вставить("ОбщееИмя", ""); + Результат.Вставить("Фамилия", ""); + Результат.Вставить("ИмяОтчество", ""); + Результат.Вставить("Страна", ""); + Результат.Вставить("КодРегиона", ""); + Результат.Вставить("НаселенныйПункт", ""); + Результат.Вставить("Улица", ""); + Результат.Вставить("ОГРНИП", ""); + Результат.Вставить("Организация", ""); + Результат.Вставить("ЭлектроннаяПочта", ""); + Результат.Вставить("Подразделение", ""); + Результат.Вставить("Должность", ""); + Результат.Вставить("ОГРН", ""); + Результат.Вставить("СНИЛС", ""); + Результат.Вставить("ИНН", ""); + + Возврат Результат; + +КонецФункции + +// Формирует структуру описывающая свойства запроса на сертификат ЭП. +// +// Возвращаемое значение: +// Структура +// +Функция СвойстваЗапросаНаСертификатПоУмолчанию() Экспорт + + Результат = Новый Структура(); + Результат.Вставить("ОткрытыйКлюч", ""); + Результат.Вставить("АлгоритмПубличногоКлюча", ""); + Результат.Вставить("Владелец", Новый Соответствие); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область АнализASN1 + +Функция ОпределитьТип_Теги() + + Результат = Новый Соответствие; + + Результат.Вставить(0, "OPTIONAL"); + Результат.Вставить(1, "BOOLEAN"); + Результат.Вставить(2, "INTEGER"); + Результат.Вставить(3, "BITSTRING"); + Результат.Вставить(4, "OCTETSTRING"); + Результат.Вставить(5, "NULL"); + Результат.Вставить(6, "OBJECT"); + Результат.Вставить(7, "OBJECTDISCTRIPTION"); + Результат.Вставить(8, "INSTANCEOF"); + Результат.Вставить(9, "REAL"); + Результат.Вставить(10, "ENUMERATED"); + Результат.Вставить(11, "EMBEDDEDPVD"); + Результат.Вставить(12, "UTF8"); + Результат.Вставить(13, "RELATIVEOID"); + Результат.Вставить(16, "SEQUENCE"); + Результат.Вставить(17, "SET"); + Результат.Вставить(18, "NUMERICSTRING"); + Результат.Вставить(19, "PRINTABLESTRING"); + Результат.Вставить(20, "TELETEXSTRING"); + Результат.Вставить(21, "VIDEOSTRING"); + Результат.Вставить(22, "IA5STRING"); + Результат.Вставить(23, "UTCTIME"); + Результат.Вставить(24, "GENERALIZEDTIME"); + Результат.Вставить(25, "GRAFICSTRING"); + Результат.Вставить(26, "VISIBLESTRING"); + Результат.Вставить(27, "GENERALSTRING"); + Результат.Вставить(28, "UNIVERSALSTRING"); + Результат.Вставить(29, "CHARACTERSTRING"); + Результат.Вставить(30, "UNICODE"); + Результат.Вставить(35, "BITSTRING"); + + Возврат Результат; + +КонецФункции + +Функция ОпределитьТип_Классы() + + Результат = Новый Соответствие; + + Результат.Вставить(0, "U"); + Результат.Вставить(64, "A"); + Результат.Вставить(128, "C"); + Результат.Вставить(192, "P"); + + Возврат Результат; + +КонецФункции + +Функция ОпределитьТип_Тип() + + Результат = Новый Соответствие; + + Результат.Вставить(0, "Primitive"); + Результат.Вставить(32, "Constructed"); + + Возврат Результат; + +КонецФункции + +Функция ОпределитьТип_HEX() + + Возможные = Новый Соответствие; + Возможные.Вставить(0, "0"); + Возможные.Вставить(1, "1"); + Возможные.Вставить(2, "2"); + Возможные.Вставить(3, "3"); + Возможные.Вставить(4, "4"); + Возможные.Вставить(5, "5"); + Возможные.Вставить(6, "6"); + Возможные.Вставить(7, "7"); + Возможные.Вставить(8, "8"); + Возможные.Вставить(9, "9"); + Возможные.Вставить(10, "A"); + Возможные.Вставить(11, "B"); + Возможные.Вставить(12, "C"); + Возможные.Вставить(13, "D"); + Возможные.Вставить(14, "E"); + Возможные.Вставить(15, "F"); + + Возврат Возможные; + +КонецФункции + +// Возвращаемое значение: +// Структура: +// * OID - Строка +// * Имя - Строка +// * ДлинаПоля - Число +// * Представление - Строка +// * Назначение - Строка +// * Обязательно - Булево +// +Функция НовыйАтрибут(OID, ИмяПоля, ДлинаПоля, Представление = "", Назначение = "", Обязательно = Ложь) + + Результат = Новый Структура(); + Результат.Вставить("OID", OID); + Результат.Вставить("Имя", ИмяПоля); + Результат.Вставить("Длина", ?(ЗначениеЗаполнено(ДлинаПоля), ДлинаПоля, 0)); + Результат.Вставить("Представление", Представление); + Результат.Вставить("Обязательно", Обязательно); + Результат.Вставить("Назначение", Назначение); + + Возврат Результат; + +КонецФункции + +Функция ПолучитьТипТега(ОпределениеASN, ДанныеФайла) + + Если ПолучитьТипКласса(ОпределениеASN, ДанныеФайла) = "C" И ДанныеФайла.Блок <> 0 Тогда + НашлиЗначение = "CONTEXT"; + Иначе + НашлиЗначение = ОпределениеASN.Теги[ДанныеФайла.Блок]; + КонецЕсли; + + Если НашлиЗначение <> Неопределено Тогда + Возврат НашлиЗначение; + Иначе + Возврат Формат(ДанныеФайла, "ЧЦ=2"); + КонецЕсли; + +КонецФункции + +Функция ПолучитьТипКласса(ОпределениеASN, ДанныеФайла) + + НашлиЗначение = ОпределениеASN.Классы[ДанныеФайла.Класс]; + Если НашлиЗначение <> Неопределено Тогда + Возврат НашлиЗначение; + Иначе + ВызватьИсключение НСтр("ru = 'Ошибка определения класса'"); + КонецЕсли; + +КонецФункции + +Функция ПолучитьТип(ОпределениеASN, ДанныеФайла) + + Результат = ОпределениеASN.Типы[ДанныеФайла.Тип]; + Возврат Результат; + +КонецФункции + +Функция ПолучитьСледующийБайт(ПотокБайтов, ТекущийСчетчик) + + Если ПотокБайтов.Размер >= ТекущийСчетчик Тогда + ТекущийБайт = ПотокБайтов.Получить(ТекущийСчетчик - 1); + ТекущийСчетчик = ТекущийСчетчик + 1; + Иначе + ВызватьИсключение НСтр("ru = 'Неожиданный конец файла'"); + КонецЕсли; + + Возврат ТекущийБайт; + +КонецФункции + +Функция ПолучитьСледующиеБайты(ПотокБайтов, ТекущийСчетчик, Количество = 0, ПустыеБайты = Ложь) + + Если ПустыеБайты Тогда + ПредыдущийБайт = Неопределено; + ТекущийБайт = ПотокБайтов.Получить(ТекущийСчетчик - 1); + Пока Истина Цикл + Количество = Количество + 1; + ПредыдущийБайт = ТекущийБайт; + ТекущийБайт = ПотокБайтов.Получить(ТекущийСчетчик + Количество - 1); + Если ТекущийБайт = 0 И ПредыдущийБайт = 0 Тогда + Количество = Количество - 2; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ПотокБайтов.Размер >= (Количество + ТекущийСчетчик - 1) Тогда + Если Количество = 0 Тогда + Результат = Новый БуферДвоичныхДанных(0); + Иначе + Результат = ПотокБайтов.ПолучитьСрез(ТекущийСчетчик - 1, Количество); + КонецЕсли; + ТекущийСчетчик = ТекущийСчетчик + Количество; + + Иначе + ВызватьИсключение НСтр("ru = 'Неожиданный конец файла'"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьТекущийТег(ПотокБайтов, ТекущийСчетчик) + + ТекущийБайт = ПолучитьСледующийБайт(ПотокБайтов, ТекущийСчетчик); + Класс = ПобитовоеИ(ТекущийБайт, 192);// 0xc0 (класс блока) + Тип = ПобитовоеИ(ТекущийБайт, 32);// 0x20 (примитивный или составной) + Блок = ПобитовоеИ(ТекущийБайт, 31);// 0x1f (тип примитивного блока) + + Если Блок = 21 Тогда // 0x1f + Блок = 0; + Пока Истина Цикл + ТекущийБайт = ПолучитьСледующийБайт(ПотокБайтов, ТекущийСчетчик); + Блок = ПобитовоеИли(ПобитовыйСдвигВлево(Блок, 7), 127);// 0x7f + Если ПобитовоеИ(ТекущийБайт, 128) <> 0 Тогда // 0x80 + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Новый Структура("Блок, Тип, Класс", Блок, Тип, Класс); + +КонецФункции + +Функция ПолучитьТекущуюДлину(ПотокБайтов, ТекущийСчетчик) + + Результат = 0; + ТекущийБайт = ПолучитьСледующийБайт(ПотокБайтов, ТекущийСчетчик); + + Если ПроверитьБит(ТекущийБайт, 7) Тогда + Количество = ПобитовоеИ(ТекущийБайт, 127); + Если Количество = 127 Тогда + ВызватьИсключение НСтр("ru = 'ASN.1 syntax error'"); + КонецЕсли; + + Если Количество = 0 Тогда + Результат = -1; + ИначеЕсли Количество > ПотокБайтов.Размер Тогда + Результат = 0; + Иначе + МассивБайтов = ПолучитьСледующиеБайты(ПотокБайтов, ТекущийСчетчик, Количество); + Для каждого СтрокаМассива Из МассивБайтов Цикл + Результат = ПобитовоеИли(ПобитовыйСдвигВлево(Результат, 8), СтрокаМассива); + КонецЦикла; + КонецЕсли; + + Попытка + Результат = Число(Результат); + Исключение + Результат = 0; + КонецПопытки; + + Иначе + Результат = ТекущийБайт; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция Привести_Булево(МассивБайтов) + + Результат = Ложь; + + Если МассивБайтов.Размер <> 1 Тогда + ВызватьИсключение НСтр("ru = 'ASN.1 syntax error'"); + ИначеЕсли МассивБайтов[0] <> 0 Тогда + Результат = Истина; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция Привести_Целое(МассивБайтов) + + Результат = 0; + ЗначенияБайтов = Ложь; + Количество = МассивБайтов.Размер; + Если Количество > 1 Тогда + ЗначенияБайтов = МассивБайтов[0] = 255 И ПобитовоеИ(МассивБайтов[1], 128); + ЗначенияБайтов = ЗначенияБайтов ИЛИ (МассивБайтов[0] = 0 И НЕ ПобитовоеИ(МассивБайтов[1], 128)); + ИначеЕсли Количество = 0 Тогда + ЗначенияБайтов = Истина; + КонецЕсли; + + Если ЗначенияБайтов Тогда + ВызватьИсключение НСтр("ru = 'ASN.1 syntax error'"); + КонецЕсли; + + ОтрицательноеЗначение = ПроверитьБит(МассивБайтов[0], 8); + Если ОтрицательноеЗначение Тогда + Для Счетчик = 1 По Количество Цикл + МассивБайтов[Счетчик - 1] = 255 - МассивБайтов[Счетчик - 1]; + КонецЦикла; + Счетчик = Счетчик - 1; + Пока Счетчик > 0 Цикл + МассивБайтов[Счетчик] = МассивБайтов[Счетчик] + 1; + Если МассивБайтов[Счетчик] <= 255 Тогда + Прервать; + КонецЕсли; + МассивБайтов[Счетчик] = 0; + Счетчик = Счетчик - 1; + КонецЦикла; + КонецЕсли; + + Для каждого СтрокаМассива Из МассивБайтов Цикл + Результат = Результат * 256 + СтрокаМассива; + КонецЦикла; + + Если ОтрицательноеЗначение Тогда + Результат = - Результат; + КонецЕсли; + + Попытка + Результат = Число(Результат); + Исключение + Результат = 0; + КонецПопытки; + + Возврат Результат; + +КонецФункции + +Функция Привести_Пустое(МассивБайтов) + + Результат = Неопределено; + + Если МассивБайтов.Размер <> 0 Тогда + ВызватьИсключение НСтр("ru = 'ASN.1 syntax error'"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция Привести_Строка(МассивБайтов) + + Результат = ""; + + Для каждого СтрокаМассива Из МассивБайтов Цикл + Если СтрокаМассива > 31 Тогда // Лучше использовать НайтиНедопустимыеСимволыXML, но в веб-клиенте не работает + СледующийСимвол = Символ(СтрокаМассива); + Результат = Результат + СледующийСимвол; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция Привести_Дата(МассивБайтов, Алгоритм = "Z") + + ПредставлениеДаты = Привести_Строка(МассивБайтов); + Результат = '00010101'; + + Попытка + Если Алгоритм = "Z" Тогда + ГодДаты = Сред(ПредставлениеДаты, 1, 2); + МесяцДаты = Сред(ПредставлениеДаты, 3, 2); + ДеньДаты = Сред(ПредставлениеДаты, 5, 2); + ЧасДаты = Сред(ПредставлениеДаты, 7, 2); + МинутыДаты = Сред(ПредставлениеДаты, 9, 2); + СекундыДаты = Сред(ПредставлениеДаты, 11, 2); + + Если Число(ГодДаты) > 49 Тогда + ГодДаты = "19" + ГодДаты; + Иначе + ГодДаты = "20" + ГодДаты; + КонецЕсли; + + Результат = Дата(ГодДаты + МесяцДаты + ДеньДаты + ЧасДаты + МинутыДаты + СекундыДаты); + КонецЕсли; + + Исключение + Результат = '00010101'; + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +Функция Привести_СтрокаUTF(ПотокБайтов) + + Результат = ПолучитьСтрокуИзБуфераДвоичныхДанных(ПотокБайтов, "UTF-8"); + + Возврат Результат; + +КонецФункции + +Функция Привести_МассивHEX(ОпределениеASN, МассивБайтов, ВключитьРазделители = Истина) + + Результат = ""; + + Если ОпределениеASN.ИсключитьСодержимое Тогда + Возврат Результат; + КонецЕсли; + + Результат = ПолучитьHexСтрокуИзБуфераДвоичныхДанных(МассивБайтов); + Если НЕ ВключитьРазделители Тогда + Результат = СтрЗаменить(Результат, " ", ""); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция Привести_МассивБитов(МассивБайтов) + + Результат = ""; + + ВсегоБайт = МассивБайтов.Размер; + Если ВсегоБайт < 2 Тогда + Возврат Результат; + КонецЕсли; + + ЧислоБитов = МассивБайтов[0]; + + Для Счетчик = 2 По ВсегоБайт Цикл + РазмерОбхода = 7; + Если ВсегоБайт - Счетчик = 0 Тогда + РазмерОбхода = РазмерОбхода - ЧислоБитов; + КонецЕсли; + ЗначениеБайта = МассивБайтов[Счетчик - 1]; + БитовыйСдвиг = 128; + Для СчетчикБитов = 0 По РазмерОбхода Цикл + Если ПобитовоеИ(ЗначениеБайта, БитовыйСдвиг) > 0 Тогда + Результат = Результат + "1"; + Иначе + Результат = Результат + "0"; + КонецЕсли; + БитовыйСдвиг = БитовыйСдвиг / 2; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция Привести_Идентификатор(МассивБайтов) + + Результат = ""; + Значение = 0; + МассивЗначений = Новый Массив; + Количество = МассивБайтов.Размер; + + Для Счетчик = 1 По Количество Цикл + ТекущийБайт = МассивБайтов[Счетчик - 1]; + Если Значение = 0 И ТекущийБайт = 128 Тогда + ВызватьИсключение НСтр("ru = 'ASN.1 syntax error'"); + КонецЕсли; + Значение = ПобитовоеИли(ПобитовыйСдвигВлево(Значение, 7), ПобитовоеИ(ТекущийБайт, 127)); + Если ПобитовоеИ(ТекущийБайт, 128) = 0 Тогда + МассивЗначений.Добавить(Значение); + Значение = 0; + КонецЕсли; + КонецЦикла; + + Если МассивЗначений.Количество() = 0 ИЛИ МассивЗначений[0] > 1599 Тогда + ВызватьИсключение НСтр("ru = 'ASN.1 syntax error'"); + КонецЕсли; + + ПервоеЗначение = МассивЗначений[0]; + МассивЗначений.Удалить(0); + МассивЗначений.Вставить(0, ПервоеЗначение % 40); + МассивЗначений.Вставить(0, Цел(ПервоеЗначение / 40)); + + Для Счетчик = 1 По МассивЗначений.Количество() Цикл + МассивЗначений[Счетчик - 1] = Формат(МассивЗначений[Счетчик - 1], "ЧГ=0"); + КонецЦикла; + + Результат = СтрСоединить(МассивЗначений, "."); + + Возврат Результат; + +КонецФункции + +Функция Привести_ЧислоHEX(Знач ТекущееЧисло, ВключитьРазделители = Ложь) + + Результат = ""; + + Возможные = ОпределитьТип_HEX(); + + Пока ТекущееЧисло > 0 Цикл + ДобавитьЧисло = ТекущееЧисло % 256; + ТекущееЧисло = Цел(ТекущееЧисло / 256); + Результат = ?(ПустаяСтрока(Результат) ИЛИ НЕ ВключитьРазделители, "", " ") + Возможные[Цел(ДобавитьЧисло / 16)] + Возможные[ДобавитьЧисло % 16] + Результат; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция Привести_СтрокаБитов(ОпределениеASN, МассивБайтов, ТипКодирования) + + Результат = ""; + + Если ТипКодирования = 3 Тогда + Если ОпределениеASN.ИсключитьСодержимое Тогда + Результат = ""; + Иначе + Результат = Привести_МассивБитов(МассивБайтов); + КонецЕсли; + Иначе + ТекущийСчетчик = 1; + Пока МассивБайтов.Размер >= ТекущийСчетчик Цикл + ЗначениеТега = ПолучитьТекущийТег(МассивБайтов, ТекущийСчетчик); + Результат = Результат + ЗначениеТега.Значение; + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция Привести_СтрокаБайтов(ОпределениеASN, МассивБайтов) + + Удалось = Истина; + + Если ОпределениеASN.ОграничениеDER Тогда + Удалось = Ложь; + + Иначе + Попытка + Результат = НоваяСтрока("OCTETSTRING", Новый Массив); + ПрочитатьОчереднуюПорцию(ОпределениеASN, МассивБайтов, 1, Результат, Ложь); + Исключение + Удалось = Ложь; + + КонецПопытки; + + КонецЕсли; + + Если НЕ Удалось Тогда + Если ОпределениеASN.ИсключитьСодержимое Тогда + Результат = ""; + Иначе + Результат = Привести_МассивHEX(ОпределениеASN, МассивБайтов); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьТекущееЗначение(ОпределениеASN, ПотокБайтов, ТекущийСчетчик, Длина, Тег, ПустыеБайты = Ложь) + + Результат = Новый Структура("Значение, ИсходныеДанные"); + + НовыйПоток = ПолучитьСледующиеБайты(ПотокБайтов, ТекущийСчетчик, Длина, ПустыеБайты); + ОпределениеТипа = ОпределениеASN.Теги[Тег.Блок]; + + Если Тег.Класс = 128 Тогда + Значение = Привести_МассивHEX(ОпределениеASN, НовыйПоток); + ИначеЕсли Тег.Класс = 0 И ОпределениеТипа = "BOOLEAN" Тогда + Значение = Привести_Булево(НовыйПоток); + ИначеЕсли ОпределениеТипа = "INTEGER" ИЛИ ОпределениеТипа = "ENUMERATED" Тогда + Значение = Привести_Целое(НовыйПоток); + ИначеЕсли ОпределениеТипа = "OCTETSTRING" Тогда + Значение = Привести_СтрокаБайтов(ОпределениеASN, НовыйПоток); + ИначеЕсли ОпределениеТипа = "BITSTRING" Тогда + Значение = Привести_СтрокаБитов(ОпределениеASN, НовыйПоток, Тег.Блок); + ИначеЕсли ОпределениеТипа = "NULL" Тогда + Значение = Привести_Пустое(НовыйПоток); + ИначеЕсли ОпределениеТипа = "OBJECT" Тогда + Значение = Привести_Идентификатор(НовыйПоток); + ИначеЕсли ОпределениеТипа = "PRINTABLESTRING" + ИЛИ ОпределениеТипа = "IA5STRING" + ИЛИ ОпределениеТипа = "UNICODE" Тогда + Значение = Привести_Строка(НовыйПоток); + ИначеЕсли ОпределениеТипа = "UTCTIME" Тогда + Значение = Привести_Дата(НовыйПоток); + ИначеЕсли ОпределениеТипа = "UTF8" Тогда + Значение = Привести_СтрокаUTF(НовыйПоток); + ИначеЕсли ОпределениеТипа = "NUMERICSTRING" Тогда + Значение = Привести_Строка(НовыйПоток); + Иначе + Значение = Привести_МассивHEX(ОпределениеASN, НовыйПоток); + КонецЕсли; + + Результат.Значение = Значение; + Если ОпределениеASN.ВключитьИсходныеДанные Тогда + Результат.ИсходныеДанные = НовыйПоток; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция НоваяСтрока(ТипТега, Значение, ПотокБайтов = "") + + Результат = Новый Структура("Тип, Значение, Данные", ТипТега, Значение, ПотокБайтов); + + Возврат Результат; + +КонецФункции + +Функция НоваяВетка(ОпределениеASN, Родитель, ТипТега, Значение) + + ЗначениеВетки = Родитель.Значение; + ДобавилиСтроку = НоваяСтрока(ТипТега, Значение); + + Если ТипЗнч(ЗначениеВетки) = Тип("Массив") Тогда + ЗначениеВетки.Добавить(ДобавилиСтроку); + ИначеЕсли ТипЗнч(ЗначениеВетки) = Тип("Структура") Тогда + Количество = ЗначениеВетки.Количество(); + ЗначениеВетки.Вставить("Ветка" + Формат(Количество + 1, "ЧГ="), ДобавилиСтроку); + КонецЕсли; + + Возврат ДобавилиСтроку; + +КонецФункции + +Функция ПолучитьДанныеВетки(ОпределениеASN, ПотокБайтов, НоваяСтрока) + + Результат = Неопределено; + + Если ПотокБайтов <> Неопределено И ОпределениеASN.ВключитьИсходныеДанные Тогда + НоваяСтрока.Данные = ПолучитьHexСтрокуИзБуфераДвоичныхДанных(ПотокБайтов); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПрочитатьСоставнойТип(ОпределениеASN, ПотокБайтов, ТекущийСчетчик, ДеревоСтруктуры, ТекущаяДлина, Тег, ДлинаЗаголовка) + + Длина = ТекущаяДлина; + Если ТекущаяДлина = -1 Тогда + Длина = 0; + КонецЕсли; + + Если ОпределениеASN.ВключитьИсходныеДанные Тогда + Если ДлинаЗаголовка > 0 Тогда + ДанныеПотокаТега = ПотокБайтов.Прочитать(ТекущийСчетчик - 1 - ДлинаЗаголовка, ДлинаЗаголовка); + Иначе + ДанныеПотокаТега = Новый БуферДвоичныхДанных(0); + КонецЕсли; + КонецЕсли; + + ТипТега = ПолучитьТипТега(ОпределениеASN, Тег); + НовыйЭлемент = Новый Массив(); + НоваяСтрока = НоваяВетка(ОпределениеASN, ДеревоСтруктуры, ТипТега, НовыйЭлемент); + + Если ТекущаяДлина = -1 Тогда + Результат = ПрочитатьОчереднуюПорцию(ОпределениеASN, ПотокБайтов, ТекущийСчетчик, НоваяСтрока); + Иначе + НовыйПоток = ПолучитьСледующиеБайты(ПотокБайтов, ТекущийСчетчик, Длина); + Результат = ПрочитатьОчереднуюПорцию(ОпределениеASN, НовыйПоток, 1, НоваяСтрока); + КонецЕсли; + + Если ОпределениеASN.ВключитьИсходныеДанные Тогда + + Если ДлинаЗаголовка > 0 Тогда + ДанныеПотокаТега = ДанныеПотокаТега.Соединить(Результат); + КонецЕсли; + ПолучитьДанныеВетки(ОпределениеASN, ДанныеПотокаТега, НоваяСтрока); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПрочитатьОчереднуюПорцию(ОпределениеASN, ПотокБайтов, ТекущийСчетчик, ДеревоСтруктуры, ДобавлятьЭлемент = Истина) // пытаем разобрать двоичный образ тега + + Результат = Новый БуферДвоичныхДанных(0); + + Пока ПотокБайтов.Размер >= ТекущийСчетчик Цикл + + ЗаполнитьВетку = Неопределено; + + НачалоСчетчика = ТекущийСчетчик; + ЗначениеТега = ПолучитьТекущийТег(ПотокБайтов, ТекущийСчетчик); + ТекущаяДлина = ПолучитьТекущуюДлину(ПотокБайтов, ТекущийСчетчик); + Длина = ТекущаяДлина; + ПустыеБайты = Ложь; + Если ТекущаяДлина = -1 Тогда + Длина = 0; + ПустыеБайты = Истина; + КонецЕсли; + ДлинаЗаголовка = ТекущийСчетчик - НачалоСчетчика; + + Если ПолучитьТип(ОпределениеASN, ЗначениеТега) = "Primitive" Тогда + ТипТега = ПолучитьТипТега(ОпределениеASN, ЗначениеТега); + ЗначениеТега= ПолучитьТекущееЗначение(ОпределениеASN, ПотокБайтов, ТекущийСчетчик, Длина, ЗначениеТега, ПустыеБайты); + Значение = ЗначениеТега.Значение; + НовыйПоток = ЗначениеТега.ИсходныеДанные; + + Если ДобавлятьЭлемент Тогда + НоваяСтрока = НоваяВетка(ОпределениеASN, ДеревоСтруктуры, ТипТега, Значение); + ЗаполнитьВетку = НоваяСтрока; + Иначе + ДеревоСтруктуры.Тип = ТипТега; + ДеревоСтруктуры.Значение = Значение; + ЗаполнитьВетку = ДеревоСтруктуры; + КонецЕсли; + + ИначеЕсли ПолучитьТип(ОпределениеASN, ЗначениеТега) = "Constructed" Тогда + НовыйПоток = ПрочитатьСоставнойТип(ОпределениеASN, ПотокБайтов, ТекущийСчетчик, ДеревоСтруктуры, ТекущаяДлина, ЗначениеТега, ДлинаЗаголовка); + + КонецЕсли; + + + Если ОпределениеASN.ВключитьИсходныеДанные Тогда + + ДанныеПотокаТега = Новый БуферДвоичныхДанных(0); + + Если ДлинаЗаголовка > 0 Тогда + ДанныеПотокаТега = ДанныеПотокаТега.Соединить(ПотокБайтов.Прочитать(НачалоСчетчика - 1, ДлинаЗаголовка)); + КонецЕсли; + + ДанныеПотокаТега = ДанныеПотокаТега.Соединить(НовыйПоток); + + Если ТекущаяДлина = -1 Тогда + ДанныеПотокаТега = ДанныеПотокаТега.Соединить(Новый БуферДвоичныхДанных(2)); + КонецЕсли; + + Результат = Результат.Соединить(ДанныеПотокаТега); + + Если ЗаполнитьВетку <> Неопределено Тогда + ПолучитьДанныеВетки(ОпределениеASN, ДанныеПотокаТега, ЗаполнитьВетку); + КонецЕсли; + + КонецЕсли; + + Если ТекущаяДлина = -1 Тогда + ТекущийСчетчик = ТекущийСчетчик + 2; + КонецЕсли; + + КонецЦикла; + + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ЗашифрованныеДанные + +Функция ЗаполнитьДанныеОбъектов(МассивВеток, Результат = Неопределено) + + Если Результат = Неопределено Тогда + Результат = Новый Соответствие; + КонецЕсли; + + Идентификатор = ""; + Значение = ""; + Для каждого СтрокаВетки Из МассивВеток Цикл + Если ТипЗнч(СтрокаВетки.Значение) = Тип("Массив") Тогда + ЗаполнитьДанныеОбъектов(СтрокаВетки.Значение, Результат); + ИначеЕсли СтрокаВетки.Тип = "OBJECT" Тогда + Идентификатор = СтрокаВетки.Значение; + ИначеЕсли ЗначениеЗаполнено(Идентификатор) Тогда + Значение = СтрокаВетки.Значение; + КонецЕсли; + КонецЦикла; + + Если ЗначениеЗаполнено(Идентификатор) И ЗначениеЗаполнено(Значение) Тогда + Результат.Вставить(Идентификатор, Значение); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьПредставлениеОбъектов(ДанныеОбъектов, СтруктураЗаполнения = Неопределено, ФильтрПолей = "", КлючевоеПоле = "Представление") + + Результат = Новый Соответствие; + + Тип_Объекты = ОпределитьТип_OID("", ФильтрПолей); + Для каждого СтрокаОбъекта Из ДанныеОбъектов Цикл + Значение = Тип_Объекты[СтрокаОбъекта.Ключ]; + Если ЗначениеЗаполнено(Значение) Тогда + Результат.Вставить(Значение[КлючевоеПоле], СтрокаОбъекта.Значение); + КонецЕсли; + Если ЗначениеЗаполнено(Значение) + И СтруктураЗаполнения <> Неопределено + И СтруктураЗаполнения.Свойство(Значение[КлючевоеПоле]) Тогда + СтруктураЗаполнения.Вставить(Значение[КлючевоеПоле], СтрокаОбъекта.Значение); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область Прочее + +// Получает следующий элемент в коллекции, относительно текущего +// +// Параметры: +// Родитель - Структура - должно быть поле "Значение" с типом Массив +// ТекущийЭлемент - Структура - элемент массива из Родитель +// +// Возвращаемое значение: +// - Неопределено +// - Структура +// +Функция ПолучитьСледующийЭлемент(Родитель, ТекущийЭлемент) + + Результат = Неопределено; + ПредыдущийЭлемент = Неопределено; + + Для Каждого СтрокаЭлемента Из Родитель.Значение Цикл + + Если СтрокаЭлемента = ТекущийЭлемент Тогда + ПредыдущийЭлемент = ТекущийЭлемент; + + ИначеЕсли ПредыдущийЭлемент <> Неопределено Тогда + Результат = СтрокаЭлемента; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Рекурсивно ищет в текущей ветке вложенную ветку с указанным значением OID +// +// Параметры: +// СтруктураФайла - см. ЧтениеСтруктурыASNФайла +// Идентификатор - Строка - OID значение +// Уровень - Число - служебное +// +// Возвращаемое значение: +// Структура: +// * Уровень - Число - уровень где находиться найденная ветка +// * Ветка - Структура: +// * Следующий - Структура: +// +// +// +Функция НайтиOID(СтруктураФайла, Идентификатор, Уровень = 0) + + Результат = Неопределено; + НашлиЭлемент = Неопределено; + СледующийЭлемент = Неопределено; + КоличествоЭлементов = СтруктураФайла.Значение.Количество(); + + Для каждого ЭлементФайла Из СтруктураФайла.Значение Цикл + + Если НашлиЭлемент <> Неопределено Тогда + СледующийЭлемент = ЭлементФайла; + Прервать; + ИначеЕсли ТипЗнч(ЭлементФайла.Значение) = Тип("Массив") Тогда + РезультатПоиска = НайтиOID(ЭлементФайла, Идентификатор, Уровень + 1); + Если РезультатПоиска <> Неопределено Тогда + Если РезультатПоиска.Свойство("Уровень") Тогда + Результат = РезультатПоиска; + Иначе + НашлиЭлемент = РезультатПоиска; + КонецЕсли; + КонецЕсли; + ИначеЕсли ЭлементФайла.Значение = Идентификатор И ЭлементФайла.Тип = "OBJECT" Тогда + Если КоличествоЭлементов = 1 Тогда + Результат = ЭлементФайла; + Иначе + НашлиЭлемент = ЭлементФайла; + КонецЕсли; + КонецЕсли; + + Если Результат <> Неопределено Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если НашлиЭлемент <> Неопределено Тогда + Результат = Новый Структура("Ветка, Следующий, Уровень", СтруктураФайла, СледующийЭлемент, Уровень); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Рекурсивно ищет в текущей ветке вложенную ветку с указанным значением OID +// +// Параметры: +// СтруктураФайла - см. ЧтениеСтруктурыASNФайла +// Уровень - Число - служебное +// +// Возвращаемое значение: +// Структура: +// * Уровень - Число - уровень где находиться найденная ветка +// * Ветка - Структура +// +Функция НайтиПоТипуУзла(СтруктураФайла, ТипУзла, Уровень = 0) + + Результат = Неопределено; + + Для каждого ЭлементФайла Из СтруктураФайла.Значение Цикл + Если ТипЗнч(ЭлементФайла.Значение) = Тип("Массив") Тогда + Результат = НайтиПоТипуУзла(ЭлементФайла, ТипУзла, Уровень + 1); + ИначеЕсли ЭлементФайла.Тип = ТипУзла И ЗначениеЗаполнено(ЭлементФайла.Значение) Тогда + Результат = Новый Структура("Ветка, Уровень", СтруктураФайла, Уровень); + КонецЕсли; + Если Результат <> Неопределено Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// функция-обертка для упрощения вызова +// +Функция СвойствоСтруктуры(ДанныеСтруктуры, ИскомоеЗначение, ЗначениеПоУмолчанию = Неопределено) + + Возврат СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДанныеСтруктуры, ИскомоеЗначение, ЗначениеПоУмолчанию); + +КонецФункции + +// Предусмотрена для анализа отладочной информации +Процедура ОтработатьВозникновениеОшибки(ОпределениеASN) + + Если ОпределениеASN.ОтображатьОшибки Тогда + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(ТекстОшибки); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/СервисКриптографииDSSASNКлиентСервер.mdo b/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/СервисКриптографииDSSASNКлиентСервер.mdo new file mode 100644 index 000000000..bf9e6feda --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSASNКлиентСервер/СервисКриптографииDSSASNКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + СервисКриптографииDSSASNКлиентСервер + + ru + Сервис криптографии DSS ASN.1 анализатор + + true + true + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSКлиент/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSКлиент/Module.bsl new file mode 100644 index 000000000..7eb08474c --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSКлиент/Module.bsl @@ -0,0 +1,1983 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность + +// Выполняет интерактивную аутентификацию пользователя по сценарию: логин и пароль +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +Процедура АутентификацияПоЛогину(ОповещениеОЗавершении, НастройкиПользователя = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.АутентификацияПоЛогину(ТекущиеНастройки, ОповещениеОЗавершении); + +КонецПроцедуры + +// Выполняет интерактивную аутентификацию пользователя по сценарию: сертификат авторизации и пароль к нему +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +Процедура АутентификацияПоСертификату(ОповещениеОЗавершении, НастройкиПользователя = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.АутентификацияПоСертификату(ТекущиеНастройки, ОповещениеОЗавершении); + +КонецПроцедуры + +// Выполняет интерактивную аутентификацию пользователя по сценарию: двухфакторная авторизация с подтверждением +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. функцию СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +Процедура АутентификацияДвухФакторная(ОповещениеОЗавершении, НастройкиПользователя = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.АутентификацияДвухФакторная(ТекущиеНастройки, ОповещениеОЗавершении); + +КонецПроцедуры + +// Выполняет интерактивную аутентификацию пользователя по сценарию: Web-форма +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +Процедура АутентификацияЧерезВебФорму(ОповещениеОЗавершении, НастройкиПользователя = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.АутентификацияЧерезВебФорму(ТекущиеНастройки, ОповещениеОЗавершении); + +КонецПроцедуры + +// Выполняет запуск "произвольного" подтверждения операции +// В случае, если в настройках сервера не указано имя шаблона, то будет использоваться "фиктивное" подписание. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ОписаниеСодержания - Строка - формируемый заголовок формы подтверждения +// СпособПодтверждения - Массив из ПеречислениеСсылка.СпособыАвторизацииDSS - ограничивает список способов указанным значением +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * Сертификат - Строка - отпечаток сертификата +// * ДанныеДокументов - Массив, Структура - содержит данные о документах для этой операции. +// см. СервисКриптографииDSSПодтверждениеСервер.ПодготовитьНаборДокументов() +// +Процедура ПодтверждениеПроизвольнойОперации(ОповещениеОЗавершении, + НастройкиПользователя, + ОписаниеСодержания = "", + СпособПодтверждения = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПодтверждениеПроизвольнойОперации(ТекущиеНастройки, + ОповещениеОЗавершении, + ОписаниеСодержания, + СпособПодтверждения, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет запуск зашифрования данных +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать. +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// СертификатыПолучателей - ДвоичныеДанные, Структура, ФиксированнаяСтруктура, Массив, ФиксированныйМассив - +// сертификаты получателей зашифрованного сообщения, см. функцию СервисКриптографииDSS.ПолучитьДвоичныеДанныеСертификатов() +// ТипШифрования - Строка - одно из значений: CMS или XML +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * ПараметрыШифрования - Структура - содержит дополнительные поля для шифрования, см. документацию сервиса DSS +// +Процедура Зашифровать(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеДокумента, + СертификатыПолучателей, + ТипШифрования = "CMS", + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.Зашифровать(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеДокумента, + СертификатыПолучателей, + ТипШифрования, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет запуск цикла расшифрования данных +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать. +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ТипШифрования - Строка - тип шифрования, варианты: CMS или XML +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSSСлужебный.НайтиСертификат +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ИдентификаторТранзакции - Строка - передается, если произошло подтверждение операции в потребителе +// * ПинКод - Строка - пин-код для сертификата, который пользователь ввел в потребителе +// * ПодтверждатьПринудительно - Булево - Истина, если нужно запустить операцию с подтверждением, вне зависимости от +// установленных настроек DSS. +// * ЗапомнитьПинКод - Булево - Ложь, не запоминать пин-код в сеансовых данных +// +Процедура Расшифровать(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеДокумента, + ТипШифрования = "CMS", + ИдентификаторСертификата = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.Расшифровать(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеДокумента, + ТипШифрования, + ИдентификаторСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет запуск цикла расшифрования данных по всем известным учетным записям. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать. +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ТипШифрования - Строка - тип шифрования, варианты: CMS или XML +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * РасшифровкаПоУчетнымЗаписям - Булево - принудительно пытаться расшифровать по всем учетным записям +// +Процедура РасшифроватьВЦикле(ОповещениеОЗавершении, + ДанныеДокумента, + ТипШифрования = "CMS", + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.РасшифроватьВЦикле(ОповещениеОЗавершении, + ДанныеДокумента, + ТипШифрования, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет запуск цикла подписание данных. +// По анализу входящих данных, выбирается способ подписание: одиночное или пакетное. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеДокумента - ДвоичныеДанные +// - Строка - см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента() +// - Массив - несколько файлов которые нужно обработать см. СервисКриптографииDSSСлужебный.ПодготовитьПакетДляПодписи() +// СвойствоПодписи - Структура - СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиГост, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиXML, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCAdES, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиPDF, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиMSOffice. +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSSКлиентСервер.НайтиСертификат +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * ПотоковыйРежим - Булево - включает режим потокового подписания (только для одного документа и отсоединенной подписи) +// * ИдентификаторТранзакции - Строка - передается, если произошло подтверждение операции заранее в потребителе +// * ПинКод - Строка - пин-код для сертификата, который пользователь ввел заранее в потребителе +// * ПодтверждатьПринудительно - Булево - Истина, если нужно запустить операцию с подтверждением, вне зависимости от +// установленных настроек DSS. +// +Процедура Подписать(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеДокумента, + СвойствоПодписи = Неопределено, + ИдентификаторСертификата = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + Если СвойствоПодписи = Неопределено Тогда + ПараметрыПодписи = СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS(Истина, Ложь); + СервисКриптографииDSSКлиентСервер.ПолучитьИнформациюДокументаДляПодписи( + ПараметрыПодписи, + НСтр("ru = 'Тестовые данные'"), + "bin"); + Иначе + ПараметрыПодписи = СвойствоПодписи; + КонецЕсли; + + СервисКриптографииDSSСлужебныйКлиент.Подписать(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеДокумента, + ПараметрыПодписи, + ИдентификаторСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет запуск цикла для вычисления хеш-значения для переданных данных. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеДокумента - ДвоичныеДанные, Строка, Массив - один или несколько файлов, которые необходимо обработать. +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// АлгоритмХеширования - Строка - идентификатор алгоритма вычисления хеша, допустимые варианты +// GOST R 34.11-94, +// GR 34.11-2012 256, +// GR 34.11-2012 512, +// SHA-1, +// SHA-256, +// SHA-384, +// SHA-512, +// MD5. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ИнвертироватьПолубайты - Булево - если Истина, предварительно инвертирует байты в полученным результате +// +Процедура ХешированиеДанных(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеДокумента, + АлгоритмХеширования = "GR 34.11-2012 256", + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ХешированиеДанных(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеДокумента, + АлгоритмХеширования, + ПараметрыОперации); + +КонецПроцедуры + +// Запускает цикл получения основных свойств и содержимого сертификата установленного на сервере DSS. +// Для получения свойств произвольного сертификата из двоичных данных можно воспользоваться функцией СервисКриптографииDSS.ПолучитьОбъектСертификата. +// Для прямого разбора данных сертификата можно воспользоваться функционалом из модуля СервисКриптографииDSSASNКлиентСервер. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSSСлужебный.НайтиСертификат +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПолучитьДанныеСертификата(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторСертификата, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПолучитьДанныеСертификата(ТекущиеНастройки, + ОповещениеОЗавершении, + ИдентификаторСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Запускает цикл получения сведений о сертификате установленного на сервере DSS. +// Например, данная информация выводиться в форме: СвойствоСертификата. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. функцию СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSSСлужебный.НайтиСертификат +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПолучитьСвойстваСертификата(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторСертификата, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПолучитьСвойстваСертификата(ТекущиеНастройки, + ОповещениеОЗавершении, + ИдентификаторСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Запускает цикл для обновления кеша сертификатов учетной записи. +// Может потребоваться после установки сертификата. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОбновитьДанныеСертификатов(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбновитьДанныеСертификатов(ТекущиеНастройки, + ОповещениеОЗавершении, + ПараметрыОперации); + +КонецПроцедуры + +// Запускает цикл формирования запроса на новый сертификат. +// Одновременно на сервере генерируется новый закрытый ключ. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * ПоляЗапроса - Структура - содержит поля для формирования запроса: +// ** УдостоверяющийЦентр - Строка, Число - идентификатор удостоверяющего центра, список можно получить здесь +// СервисКриптографииDSS.ПолучитьИнформациюУдостоверяющихЦентров(). +// ** КриптоПровайдер - Строка, Число - идентификатор криптопровайдера, список можно получить здесь СервисКриптографииDSS.ПолучитьИнформациюУдостоверяющихЦентров() +// ** ШаблонСертификата - Строка - значение шаблона сертификата, список можно получить здесь СервисКриптографииDSS.ПолучитьРеестрШаблоновУдостоверяющегоЦентра +// ** ПоляАтрибутов - см. СервисКриптографииDSS.ПолучитьРеестрПолейУдостоверяющегоЦентра +// ** ПинКод - Строка - значение пин-кода для нового сертификата +// * ГотовыйЗапрос - Булево - если Истина, то пользователю не отображается форма с полями сертификата +// * ПодтверждатьПринудительно - Булево - если Истина, то пользователю необходимо пройти процедуру подтверждения +// +Процедура СоздатьЗапросНаСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.СоздатьЗапросНаСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + ПараметрыОперации); + +КонецПроцедуры + +// Запускает цикл получения реестра запросов на новый сертификат. +// Одновременно на сервере генерируется новый закрытый ключ. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * ТолькоАктуальные - Булево - по умолчанию Истина, Если Истина, то возвращается информация об запросах в статусе "Обрабатывается" +// +Процедура СписокЗапросовНаСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьЗапросыНаСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + "СписокЗапросовНаСертификат", + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Получает свойства ранее созданного запроса на сертификат на сервере. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// ИдентификаторЗапроса - Число - идентификатор ранее созданного запроса на сертификат +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +Процедура ПолучитьЗапросНаСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторЗапроса, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьЗапросыНаСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + "ПолучитьЗапросНаСертификат", + ПараметрыВызова, + ПараметрыОперации); + +КонецПроцедуры + +// Удаляет ранее созданный запрос на сертификат на сервере. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// ИдентификаторЗапроса - Число - идентификатор ранее созданного запроса на сертификат +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// +Процедура УдалитьЗапросНаСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторЗапроса, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьЗапросыНаСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + "УдалитьЗапросНаСертификат", + ПараметрыВызова, + ПараметрыОперации); + +КонецПроцедуры + +// Предназначена для получения информации об УЦ доступных учетной записи. +// Вызывает функцию СервисКриптографииDSS.ПолучитьИнформациюУдостоверяющихЦентров(). +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПолучитьИнформациюУдостоверяющихЦентров(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПолучитьИнформациюУдостоверяющихЦентров(ТекущиеНастройки, + ОповещениеОЗавершении, + ПараметрыОперации); + +КонецПроцедуры + +// Запускает цикл установки сертификата на сервере DSS. +// Внимание! Возможна установка произвольного сертификата, т.е. непривязанного с закрытому ключу. +// Но никаких значимых операций с такими сертификатами произвести не удаться. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеСертификата - ДвоичныеДанные, Строка - СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура УстановитьСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеСертификата, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.УстановитьСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет цикл для назначения указанного сертификата "по-умолчанию" на сервере DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSS.НайтиСертификат() +// Установить - Булево - установить / снять пометку основного для сертификата +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура НазначитьОсновнымСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторСертификата, + Установить = Истина, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.НазначитьОсновнымСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + ИдентификаторСертификата, + Установить, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет цикл смены пин-кода для закрытого ключа сертификата на сервере DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSS.НайтиСертификат() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура СменитьПинКодСертификата(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторСертификата, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.СменитьПинКодСертификата(ТекущиеНастройки, + ОповещениеОЗавершении, + ИдентификаторСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет цикл проверки валидности произвольного сертификата на сервере SVS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеСертификата - ДвоичныеДанные, Строка - СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента() +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПроверитьСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеСертификата, + ПараметрыОперации = Неопределено) Экспорт + + Если НастройкиПользователя = Неопределено Тогда + ТекущиеНастройки = НастройкиПользователя; + Иначе + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + КонецЕсли; + + СервисКриптографииDSSСлужебныйКлиент.ПроверитьСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет цикл получения сведений о подписантах переданного документа на сервере SVS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеДокумента - ДвоичныеДанные, Строка - СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента() +// ТипПодписи - см. СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПолучитьСведенияОПодписантах(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеДокумента, + ТипПодписи = "CMS", + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПолучитьСведенияОПодписантах(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеДокумента, + ТипПодписи, + ПараметрыОперации); + +КонецПроцедуры + +// Выполняет цикл получения проверки подписи переданного документа на сервере SVS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеДокумента - ДвоичныеДанные, Строка - СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента() +// ИсходныйДокумент - Строка, ДвоичныеДанные - СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента() +// ТипПодписи - см. СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * Сертификат - Строка, ДвоичныеДанные - СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента() +// для проверки отделенной подписи, "голой" подписи необходимо передать дополнительно сертификат. +// * СвойстваПроверки - см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваПроверкиПодписи +// +Процедура ПроверитьПодпись(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеДокумента, + ИсходныйДокумент = Неопределено, + ТипПодписи = "CMS", + ПараметрыОперации = Неопределено) Экспорт + + + Если НастройкиПользователя = Неопределено Тогда + ТекущиеНастройки = НастройкиПользователя; + Иначе + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + КонецЕсли; + + СервисКриптографииDSSСлужебныйКлиент.ПроверитьПодпись(ТекущиеНастройки, + ОповещениеОЗавершении, + ДанныеДокумента, + ИсходныйДокумент, + ТипПодписи, + ПараметрыОперации); + +КонецПроцедуры + +// Получает выборку записей аудита (действий пользователя) на сервере. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ФильтрыОтбора - Неопределено, Массив из Структура - если передан массив, то каждый элемент это структура с полями: +// * Колонка - Число, Неопределено - колонка в БД, по которой осуществляется фильтрация +// * Операция - Число, Неопределено - операция, которая применяется фильтром +// * Значение - Строка, Неопределено - значение фильтра +// НачальнаяПозиция - Неопределено, Число - если не задано, то Значение по умолчанию - 0 +// КонечнаяПозиция - Неопределено, Число - если не задано, то Значение по умолчанию - 10 к начальной позиции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ПолучитьЗаписиАудита(ОповещениеОЗавершении, + НастройкиПользователя, + ФильтрыОтбора, + НачальнаяПозиция = Неопределено, + КонечнаяПозиция = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПолучитьЗаписиАудита(ТекущиеНастройки, + ОповещениеОЗавершении, + ФильтрыОтбора, + НачальнаяПозиция, + КонечнаяПозиция, + ПараметрыОперации); + +КонецПроцедуры + +// Загружает данные документа на сервер, для последующей обработки. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать. +// см. функцию СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// ПараметрыДокумента - см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваДокумента +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции +// +Процедура ЗагрузитьДокумент(ОповещениеОЗавершении, + НастройкиПользователя, + ДанныеДокумента, + ПараметрыДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ЗагрузитьДокумент", + ПараметрыДокумента, + ДанныеДокумента, + ПараметрыОперации); + +КонецПроцедуры + +// Загружает пакет (небольшой) документов (небольших) на сервер, для последующей обработки. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыДокументов - Массив из см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваДокумента +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ЗагрузитьПакетДокументов(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыДокументов, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ЗагрузитьПакетДокументов", + ПараметрыДокументов, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Получает информацию о загруженном документе по его идентификатору. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторДокумента - Строка - идентификатор документа, присвоенный ему при загрузке +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ИнформацияОДокументеПоИдентификатору(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ИнформацияОДокументеПоИдентификатору", + ИдентификаторДокумента, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Получает информацию о загруженном документе по его идентификатору. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ХешДокумента - Строка - хеш-значение документа, присвоенный ему при загрузке +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ИнформацияОДокументеПоХешу(ОповещениеОЗавершении, + НастройкиПользователя, + ХешДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ИнформацияОДокументеПоХешу", + ХешДокумента, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Получает содержимое загруженного или обработанного документа по его идентификатору. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторДокумента - Строка - идентификатор документа, присвоенный ему при загрузке или обработке +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ПолучитьОбработанныйДокумент(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ПолучитьОбработанныйДокумент", + ИдентификаторДокумента, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Загружает данные документа на сервер, для последующей обработки. +// Внимание, данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторДокумента - Строка - идентификатор документа +// ПараметрыДокумента - Структура - подробнее СервисКриптографииDSS.ИнформацияОДокументеОбработки +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ИзменитьИнформациюОДокументе(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторДокумента, + ПараметрыДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ИзменитьИнформациюОДокументе", + ПараметрыДокумента, + ИдентификаторДокумента, + ПараметрыОперации); + +КонецПроцедуры + +// Привязывает текущий документ к указанному. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторДокумента - Строка - идентификатор документа +// ИдентификаторРодительскогоДокумента - Строка +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ПривязатьДокумент(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторДокумента, + ИдентификаторРодительскогоДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ПривязатьДокумент", + ИдентификаторДокумента, + ИдентификаторРодительскогоДокумента, + ПараметрыОперации); + +КонецПроцедуры + +// Посылает запрос на конвертацию документа, ранее загруженного на сервер. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторДокумента - Строка - идентификатор документа +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура СконвертироватьДокумент(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "СконвертироватьДокумент", + ИдентификаторДокумента, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Получает информацию о преобразованном документе. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторДокумента - Строка - идентификатор документа +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура ПолучитьИнформациюДокументаКонвертации(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ПолучитьИнформациюДокументаКонвертации", + ИдентификаторДокумента, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Удаляет документ, ранее загруженный на сервер или обработанный на нем. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторДокумента - Строка - идентификатор документа +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции/ +// +Процедура УдалитьДокумент(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторДокумента, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент( + ТекущиеНастройки, + ОповещениеОЗавершении, + "УдалитьДокумент", + ИдентификаторДокумента, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Создает закрытый ключ и сертификат к нему на сервере, подписанный владельцем. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторАлгоритмаКлюча - см. СервисКриптографииDSSКлиентСервер.ИдентификаторАлгоритмаЗакрытогоКлюча +// ПараметрыКлюча - Строка - идентификатор набора параметров эллиптической кривой +// ПинКод - Строка - значение пин-кода для нового закрытого ключа +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции +// +Процедура СоздатьЗакрытыйКлюч(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторАлгоритмаКлюча, + ПараметрыКлюча, + ПинКод = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ИдентификаторАлгоритмаКлюча", ИдентификаторАлгоритмаКлюча); + ПараметрыВыполнения.Вставить("ПараметрыКлюча", ПараметрыКлюча); + ПараметрыВыполнения.Вставить("ПинКод", ПинКод); + + СервисКриптографииDSSСлужебныйКлиент.ОперацияСЗакрытомКлючом( + ТекущиеНастройки, + ОповещениеОЗавершении, + "СоздатьЗакрытыйКлюч", + ПараметрыВыполнения, + ПараметрыОперации); + +КонецПроцедуры + +// Задает произвольный параметр для закрытого ключа. +// Внимание: данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSSКлиентСервер.НайтиСертификат +// ИмяПараметра - Строка - идентификатор произвольного параметра +// ЗначениеПараметра - Строка - значение параметра +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции +// +Процедура УстановитьПараметрЗакрытогоКлюча(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторСертификата, + ИмяПараметра, + ЗначениеПараметра, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВыполнения.Вставить("ИмяПараметра", ИмяПараметра); + ПараметрыВыполнения.Вставить("ЗначениеПараметра", ЗначениеПараметра); + + СервисКриптографииDSSСлужебныйКлиент.ОперацияСЗакрытомКлючом( + ТекущиеНастройки, + ОповещениеОЗавершении, + "УстановитьПараметрЗакрытогоКлюча", + ПараметрыВыполнения, + ПараметрыОперации); + +КонецПроцедуры + +// Получает произвольный параметр для закрытого ключа. +// Внимание, данный ресурс доступен не во всех сборках сервера DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторСертификата - Число, Строка, Структура - значения для поиска сведений о сертификате, см. СервисКриптографииDSSКлиентСервер.НайтиСертификат +// ИмяПараметра - Строка - идентификатор произвольного параметра +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции +// +Процедура ПолучитьПараметрЗакрытогоКлюча(ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторСертификата, + ИмяПараметра, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВыполнения.Вставить("ИмяПараметра", ИмяПараметра); + + СервисКриптографииDSSСлужебныйКлиент.ОперацияСЗакрытомКлючом( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ПолучитьПараметрЗакрытогоКлюча", + ПараметрыВыполнения, + ПараметрыОперации); + +КонецПроцедуры + +// Создает подпись документа в асинхронном режиме. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию. +// СвойствоПодписи - см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиАсинхронной +// ИдентификаторСертификата - Число - идентификатор сертификата на сервере DSS +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемые поля: +// * АсинхронныйРежим - Булево - указывает, что подпись нужно сделать в асинхронном режиме +// * ОбратныйВызов - Строка - адрес обратного вызова +// * ПинКод - Структура, +// - Строка +// +Процедура ПодписатьАсинхронно( + ОповещениеОЗавершении, + НастройкиПользователя, + СвойствоПодписи, + ИдентификаторСертификата, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПодписатьАсинхронно( + ТекущиеНастройки, + ОповещениеОЗавершении, + СвойствоПодписи, + ИдентификаторСертификата, + ПараметрыОперации); + +КонецПроцедуры + +// Получает сведения об операции начатой на сервере облачной подписи. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторОперации - Строка - идентификатор операции ранее созданной на сервере +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// +Процедура СведенияОбОперации( + ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторОперации, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ДанныеОпераций( + ТекущиеНастройки, + ОповещениеОЗавершении, + "СведенияОбОперации", + ИдентификаторОперации, + ПараметрыОперации); + +КонецПроцедуры + +// Посылает запрос на выполнение операции, ранее созданной на сервере облачной подписи. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторОперации - Строка - идентификатор операции ранее созданной на сервере +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// +Процедура ВыполнитьОперацию( + ОповещениеОЗавершении, + НастройкиПользователя, + ИдентификаторОперации, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ДанныеОпераций( + ТекущиеНастройки, + ОповещениеОЗавершении, + "ВыполнитьОперацию", + ИдентификаторОперации, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму выбора сертификата из списка и возвращает результат выбора. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ПолноеОписаниеСертификата - Булево - результат выбора дополнять полной информацией о сертификате см. НайтиСертификат +// +Процедура ВыборСертификата(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ВыборСертификата(ТекущиеНастройки, + ОповещениеОЗавершении, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму выбора учетной записи из списка, аутентифицирует ее и возвращает заполненные настройки пользователя DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВыбратьПользователя(ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыВызова = Новый Структура("НастройкиПользователя", Неопределено); + + СервисКриптографииDSSСлужебныйКлиент.ПроверкаАутентификацииПользователя(ОповещениеОЗавершении, ПараметрыВызова); + +КонецПроцедуры + +// Открывает форму отображения сведений сертификата, на основе данных полученных на сервере DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// Сертификат - Число - идентификатор сертификата +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ПоказатьСведениеСервиса - Булево - показывает в отдельной форме данные сервиса, иначе в стандартной форме "ОбщиеФормы.Сертификат" +// * ФормаВладелец - Форма - передается форма владелец +// +Процедура ПоказатьСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + Сертификат, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПоказатьСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + Сертификат, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму отображения сведений о запросе на сертификат, на основе данных PKSC10. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ЗапросНаСертификат - Число, ДвоичныеДанные - если число, то нужно указать идентификатор запроса на сертификат +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции: +// * ФормаВладелец - Форма - передается форма владелец +// +Процедура ПоказатьЗапросНаСертификат(ОповещениеОЗавершении, + НастройкиПользователя, + ЗапросНаСертификат, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПоказатьЗапросНаСертификат(ТекущиеНастройки, + ОповещениеОЗавершении, + ЗапросНаСертификат, + ПараметрыОперации); + +КонецПроцедуры + +// Запуск сервисной функции сохранения данных в файл. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ДанныеФайла - Строка, ДвоичныеДанные - может быть строкой Base64, адресом временного хранилища или двоичными данными +// ИмяФайла - Строка - можно полное имя файла или расширение файла (точка первый символ) +// ВыборФайла - Булево - нужно ли показывать пользователю диалог выбора файла +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура СохранитьДанныеВФайл(ОповещениеОЗавершении, + ДанныеФайла, + ИмяФайла, + ВыборФайла = Ложь, + ПараметрыОперации = Неопределено)Экспорт + + СервисКриптографииDSSСлужебныйКлиент.СохранитьДанныеВФайл(ОповещениеОЗавершении, + ДанныеФайла, + ИмяФайла, + ВыборФайла, + ПараметрыОперации); + +КонецПроцедуры + +// Запуск сервисной функции загрузки данных из файла. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ИмяФайла - Строка - можно полное имя файла или расширение файла (точка первый символ) +// АдресХранилища - Строка - указывает адрес временного хранилища куда поместить данные +// ВыборФайла - Булево - нужно ли показывать пользователю диалог выбора файла +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ЗагрузитьДанныеИзФайла(ОповещениеОЗавершении, + ИмяФайла, + АдресХранилища = Неопределено, + ВыборФайла = Ложь, + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ЗагрузитьДанныеИзФайла(ОповещениеОЗавершении, + ИмяФайла, + АдресХранилища, + ВыборФайла, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает отчет для отображения состояния сеансовых данных учетной записи. +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS - данные необходимые для получения сеансовых данных учетной записи +// ДополнительныеПараметры - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПоказатьОтчетСостояниеУчетнойЗаписи(УчетнаяЗапись, ДополнительныеПараметры) Экспорт + + ФорматРезультата = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДополнительныеПараметры, "ФорматРезультата", ""); + ОповещениеОЗавершении = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДополнительныеПараметры, "ОповещениеОЗавершении"); + + ПоказатьСостояниеУчетнойЗаписи(ОповещениеОЗавершении, УчетнаяЗапись, ФорматРезультата); + +КонецПроцедуры + +// Открывает сервисную функцию отображения состояния сеансовых данных учетной записи. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS - данные необходимые для получения сеансовых данных учетной записи +// ФорматРезультата - Строка - описывает формат результата, ожидаемые значение XML или пустое +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПоказатьСостояниеУчетнойЗаписи(ОповещениеОЗавершении, УчетнаяЗапись, ФорматРезультата, ПараметрыОперации = Неопределено) Экспорт + + Если ПараметрыОперации = Неопределено Тогда + ПараметрыОперации = Новый Структура(); + КонецЕсли; + + ТекущиеНастройки = ПолучитьНастройкиПользователя(УчетнаяЗапись, ПараметрыОперации); + + ПараметрыОперации.Вставить("ФорматРезультата", ФорматРезультата); + + СервисКриптографииDSSСлужебныйКлиент.ПоказатьСостояниеУчетнойЗаписи(ТекущиеНастройки, + ОповещениеОЗавершении, + ПараметрыОперации); + +КонецПроцедуры + +// Универсальная процедура для выполнения криптографических операций встроенных в существующие формы. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыВыполнения - Структура - состоит из обязательных полей: +// * ТипОперации - Строка - сейчас поддерживается "Подписание", "Расшифрование", "Шифрование", "Подтверждение", "Аутентификация" +// Полный список шагов (в зависимости от настроек и текущего состояния применяться могут не все) +// авторизация, проверка пин-кода, проверка сертификата и его даты действия, +// создание транзакции (только для Подписание, Расшифрование). +// * Сертификат - Число, ДвоичныеДанные, Массив - в зависимости от типа операции +// * ДанныеДокумента - Строка - адрес во временном хранилище +// * ТипДокумента - Строка - обычно расширение файла, требуется для корректного отображения документа в мобильном приложении +// * ОписаниеДокумента - Строка - обычно имя файла или его описание +// * ПарольПользователя - Строка - необходим для авторизации +// * ПинКод - Строка - пин-код сертификата +// * ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПодготовитьТранзакцию(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыВыполнения, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВыполнения.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыВыполнения.Вставить("ДатаСеанса", СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса()); + + СервисКриптографииDSSСлужебныйКлиент.ПодготовитьТранзакцию(ОповещениеОЗавершении, ПараметрыВыполнения, ПараметрыОперации); + +КонецПроцедуры + +// Принудительно получает повторно (обновляет) политику учетной записи. +// При этом требует повторной авторизации. +// Может потребоваться, в случае параллельного изменения настроек в личном кабинете учетной записи. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОбновитьПолитикуПользователя(ОповещениеОЗавершении, + НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОбновитьПолитикуПользователя(ТекущиеНастройки, + ОповещениеОЗавершении, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму элемента справочника "Учетные записи DSS". +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// СсылкаУчетнойЗаписи - СправочникСсылка.УчетныеЗаписиDSS - данные необходимые для открытия формы +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОткрытьСведенияУчетнойЗаписи(ОповещениеОЗавершении, + СсылкаУчетнойЗаписи, + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ОткрытьСведенияУчетнойЗаписи(ОповещениеОЗавершении, + СсылкаУчетнойЗаписи, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму списка справочника "Учетные записи DSS" +// +Процедура ОткрытьСписокУчетныхЗаписей() Экспорт + + ОткрытьФорму("Справочник.УчетныеЗаписиDSS.ФормаСписка"); + +КонецПроцедуры + +// Открывает форму подбора учетных записей облачной подписи. +// Данная форма предполагает возможность режим создания нового логина с помощью сервисов. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ПараметрыФормы - Структура: +// * Логин - Строка +// * Сервер - Строка +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// * ВыборНовойУчетнойЗаписи - Булево - по-умолчанию Истина, возможность указания логина и сервера +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОткрытьПодборУчетныхЗаписей(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ОткрытьПодборУчетныхЗаписей(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации); + +КонецПроцедуры + +// Открывает подходящую форму авторизации учетной записи. +// Может вызываться из формы элемента справочника "Учетные записи DSS" в момент изменения параметров. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// СсылкаУчетнойЗаписи - СправочникСсылка.УчетныеЗаписиDSS - данные необходимые для открытия формы +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. Проверяемы поля: +// * ПоказатьДиалог - Булево - режим отображения диалога авторизации +// * Принудительно - Булево - режим принудительной авторизации +// * ПарольПользователя - Строка - значение пароля, чтобы исключить вызов диалога ввода +// +Процедура ПроверкаАутентификацииПользователя(ОповещениеОЗавершении, + СсылкаУчетнойЗаписи, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(СсылкаУчетнойЗаписи, ПараметрыОперации); + + ПараметрыПроверки = Новый Структура(); + ПараметрыПроверки.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыПроверки.Вставить("ПараметрыОперации", ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПроверкаАутентификацииПользователя(ОповещениеОЗавершении, + ПараметрыПроверки, + СервисКриптографииDSSСлужебныйКлиент.СвойствоСтруктуры(ПараметрыОперации, "ПоказатьДиалог", Ложь), + СервисКриптографииDSSСлужебныйКлиент.СвойствоСтруктуры(ПараметрыОперации, "Принудительно", Ложь)); + +КонецПроцедуры + +// Открывает список учетных записей для выбора. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВыбратьУчетнуюЗапись(ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ПроверкаВыбранногоПользователя( + ОповещениеОЗавершении, + Неопределено, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму проверки выполнения базовых операций для учетной записи. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// СписокОпераций - Структура из КлючИЗначение - перечисляет список операций для проверки сервиса, если не указан, проверка операций по умолчанию: +// * Ключ - Строка - имя проверки +// * Значение - Булево - результат проверки. Полный список проверок см. Форма.ПроверкаСервиса.ВесьСписокОпераций +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПроверитьРаботоспособностьСервиса(ОповещениеОЗавершении, + НастройкиПользователя, + СписокОпераций = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ПроверитьРаботоспособностьСервиса(ТекущиеНастройки, + ОповещениеОЗавершении, + СписокОпераций, + ПараметрыОперации); + +КонецПроцедуры + +// Запускает цикл формирования адресов подключения к ЦИ и СЭП. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// АдресСервера - Строка - web-адрес сервере DSS, на котором опубликован сервис обнаружения +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ПолучитьОписаниеСервиса(ОповещениеОЗавершении, + АдресСервера = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ПолучитьОписаниеСервиса(ОповещениеОЗавершении, АдресСервера, ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму элемента справочника "Экземпляры сервера DSS". +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// СсылкаСервера - СправочникСсылка.ЭкземплярыСервераDSS - ссылка открываемого элемента +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОткрытьСведенияСервера(ОповещениеОЗавершении, + СсылкаСервера, + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ОткрытьСведенияСервера(ОповещениеОЗавершении, СсылкаСервера, ПараметрыОперации); + +КонецПроцедуры + +// Открывает форму списка выбора справочника "Экземпляры сервера DSS". +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВыборЭкземпляраСервера(ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ВыборЭкземпляраСервера(ОповещениеОЗавершении, ПараметрыОперации); + +КонецПроцедуры + +// Открывает служебную форму выбора настроек сервера полученные из данных службы обнаружения. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// АдресСервера - Строка - web-адрес сервере DSS, на котором опубликован сервис обнаружения +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВыбратьНастройкиСервиса(ОповещениеОЗавершении, + АдресСервера = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ВыбратьНастройкиСервиса(ОповещениеОЗавершении, АдресСервера, ПараметрыОперации); + +КонецПроцедуры + +// Открывает служебную форму выбора вида программы подписи перед созданием. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ДобавлениеПрограммыЭлектроннойПодписи(ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ДобавлениеПрограммыЭлектроннойПодписи(ОповещениеОЗавершении, ПараметрыОперации); + +КонецПроцедуры + +// Открывает служебную форму отображения ошибки при работе сервиса DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ТекстОшибки - Строка - подробнее СервисКриптографииDSSСлужебныйКлиент.ПолучитьОписаниеОшибки +// ЭтоКодОшибки - Булево - обозначает, что в параметре ТекстОшибки передан код ошибки +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВывестиОшибку(ОповещениеОЗавершении, + ТекстОшибки, + ЭтоКодОшибки = Ложь, + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ВывестиОшибку(ОповещениеОЗавершении, + ТекстОшибки, + ЭтоКодОшибки, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает служебную форму отображения информации пользователю при работе сервиса DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ТекстСообщения - Строка - содержит текст сообщения для пользователя +// ТаймАут - Число - время показа формы +// Заголовок - Строка - заголовок формы вывода информации +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВывестиИнформацию(ОповещениеОЗавершении, + ТекстСообщения, + ТаймАут = Неопределено, + Заголовок = "", + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ВывестиИнформацию(ОповещениеОЗавершении, + ТекстСообщения, + ТаймАут, + Заголовок, + ПараметрыОперации); + +КонецПроцедуры + +// Открывает служебную форму отображения информации пользователю при работе сервиса DSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ТекстСообщения - Строка - содержит текст сообщения для пользователя +// СписокКоманд - СписокЗначений - где элементы списка содержат информацию +// "значение" имя команды по правилам 1С, +// "представление" отображаемое представление, +// "картинка" необязательно. +// ТаймАут - Число - время показа формы +// Заголовок - Строка - заголовок формы вывода информации +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВывестиВопрос(ОповещениеОЗавершении, + ТекстСообщения, + СписокКоманд, + ТаймАут = Неопределено, + Заголовок = "", + ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ВывестиВопрос(ОповещениеОЗавершении, + ТекстСообщения, + СписокКоманд, + ТаймАут, + Заголовок, + ПараметрыОперации); + +КонецПроцедуры + +// Общая функция определения сеансовых настроек указанной учетной записи +// +// Параметры: +// НастройкиПользователя - Неопределено +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// - СправочникСсылка.УчетныеЗаписиDSS - значения поиска. +// Варианты поиска +// Неопределено - поиск по текущей учетной записи в параметрах сеанса +// Структура - это и есть сеансовые данные, с проверкой актуальности токена +// СправочникСсылка.УчетныеЗаписиDSS - поиск или формирование в сеансовых данных. +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + Результат = НастройкиПользователя; + НовыеПараметры = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыФормы(ПараметрыОперации); + + Если НастройкиПользователя = Неопределено Тогда + Результат = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(); + ИначеЕсли ТипЗнч(НастройкиПользователя) <> Тип("Структура") Тогда + Результат = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(НастройкиПользователя, НовыеПараметры); + Иначе + КлючНастроек = СервисКриптографииDSSКлиентСервер.КлючНастроекПользователя(НастройкиПользователя); + ТекущиеНастройки = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(КлючНастроек, НовыеПараметры); + + Если ТекущиеНастройки.ВерсияНастройки > НастройкиПользователя.ВерсияНастройки Тогда + Результат = ТекущиеНастройки; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Сервисная функция формирования идентификатора СЭП на основе web-адреса +// +// Параметры: +// АдресСервисаПодписи - Строка - адрес сервиса подписка, как полный, так и относительный +// +// Возвращаемое значение: +// Строка - текстовое представление идентификатора сервиса +// +Функция СформироватьИдентификаторСЭП(Знач АдресСервисаПодписи) Экспорт + + Результат = ""; + + Если СтрНайти(АдресСервисаПодписи, "/") > 0 Тогда + СоставАдреса = СервисКриптографииDSSСлужебныйКлиент.СтруктураВебАдреса(АдресСервисаПодписи); + ПутьНаСервере = СоставАдреса.ПутьНаСервере; + ДлинаСтроки = СтрДлина(ПутьНаСервере); + Иначе + ПутьНаСервере = АдресСервисаПодписи; + ДлинаСтроки = СтрДлина(ПутьНаСервере); + КонецЕсли; + + Если ДлинаСтроки > 0 Тогда + Если Прав(ПутьНаСервере, 1) = "/" Тогда + ПутьНаСервере = Сред(ПутьНаСервере, 1, ДлинаСтроки - 1); + КонецЕсли; + + ЭлементыПути = СтрРазделить(ПутьНаСервере, "/"); + ВсегоЭлементов = ЭлементыПути.Количество(); + Если ВсегоЭлементов > 0 Тогда + Результат = "urn:cryptopro:dss:signserver:" + ЭлементыПути[ВсегоЭлементов - 1]; + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Клиентский вызов функции проверки наличия сертификата в сервисе. +// Анализируется по наличию в кеше сертификатов. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ОписаниеСертификата - Строка +// - Число +// - Структура +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура НайтиСертификат(ОповещениеОЗавершении, ОписаниеСертификата, ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.НайтиСертификат(ОповещениеОЗавершении, ОписаниеСертификата, ПараметрыОперации); + +КонецПроцедуры + +// Анализирует вид ссылки и запускает соответствующее действие +// +// Параметры: +// НавигационнаяСсылка - Строка - сформированная навигационная ссылка +// ТипОбозревателя - Неопределено, Строка - для определенных случаев нужно открывать в IE +// +Процедура ПерейтиПоСсылке(НавигационнаяСсылка, ТипОбозревателя = Неопределено) Экспорт + + Позиция = СтрНайти(НавигационнаяСсылка, "://"); + Префикс = "---"; + ПолныйПуть = НавигационнаяСсылка; + Если Позиция > 0 Тогда + Префикс = Сред(НавигационнаяСсылка, 1, Позиция - 1); + ПолныйПуть = Сред(НавигационнаяСсылка, Позиция + 3); + КонецЕсли; + + Если Префикс = "file" Тогда + ФайловаяСистемаКлиент.ОткрытьФайл(ПолныйПуть); + ИначеЕсли СтрНайти("http, https, e1c, v8help, mailto, tel, skype", Префикс) > 0 Тогда + СервисКриптографииDSSСлужебныйКлиент.ОткрытьВБраузере(НавигационнаяСсылка, ТипОбозревателя); + Иначе + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка); + КонецЕсли; + +КонецПроцедуры + +// Готовит объект описания для пароля введенного пользователем, прежде чем он будет передан на сервер +// +// Параметры: +// ВведенныйСекрет - Строка +// ПризнакКонфиденциальности - Число - применяемый алгоритм +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОбъектПароля +// +Функция ПодготовитьОбъектПароля(ВведенныйСекрет, ПризнакКонфиденциальности = 1) Экспорт + + ТекущийПользователь = ПользователиКлиент.АвторизованныйПользователь(); + Результат = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля(ВведенныйСекрет, ТекущийПользователь, ПризнакКонфиденциальности); + + Возврат Результат; + +КонецФункции + +// Функция для получения статуса подключения подсистемы +// +// Возвращаемое значение: +// Булево +// +Функция ИспользоватьСервисОблачнойПодписи() Экспорт + + Результат = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(), "ИспользованиеОблачнойПодписиВозможно", Ложь); + + Возврат Результат = Истина; + +КонецФункции + +// Инициализирует параметры сеанса учетной записи. +// Востребована в случае смены аутентификационных данных: логин, пароль и прочее. +// +// Параметры: +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция СброситьПараметрыСеансаУчетнойЗаписи(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + Результат = СервисКриптографииDSSСлужебныйВызовСервера.СброситьПараметрыСеансаУчетнойЗаписи(НастройкиПользователя, ПараметрыОперации); + Возврат Результат; + +КонецФункции + +// Открывает форму для изменения параметров подключения учетной записи к серверу. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ПараметрыФормы - Структура: +// * ОбновитьАвтоматически - Булево - запустить обновление автоматически +// * РежимВвода - Булево - включает в форме режим только для изменения параметров +// * СодержимоеЗаявления - см. Обработки.УправлениеПодключениемDSS.СтруктураРеквизитовЗаявления +// * СостояниеЗаявления - ПеречислениеСсылка.СостоянияЗаявленияНаВыпускСертификата +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОткрытьЗаявлениеНаИзменение(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ОткрытьЗаявлениеНаИзменение(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации); + +КонецПроцедуры + +// Выполняет процедуру проверки учетной записи облачной подписи, +// в случае успеха регистрирует информацию о ней в справочниках СправочникСсылка.УчетныеЗаписиDSS +// и СправочникСсылка.ЭкземплярыСервераDSS. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции: +// * Результат - см. ОтветСервисаПоУмолчанию +// * ДополнительныеПараметры - Произвольный - значение, указанное при создании описания оповещения. +// ДанныеСервиса - Структура - подробнее в функции РазобратьФайлНастроекСервера модуля СервисКриптографииDSSСлужебный +// Логин - Строка - наименование логина +// Пароль - Строка +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ВосстановитьУчетнуюЗапись(ОповещениеОЗавершении, ДанныеСервиса, Логин, Пароль = "", ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.ВосстановитьУчетнуюЗапись(ОповещениеОЗавершении, ДанныеСервиса, Логин, Пароль, ПараметрыОперации); + +КонецПроцедуры + +// Формирует стандартный ответ применяемый в подсистеме. +// Содержит как обязательные поля, так и дополнительные поля. +// Состав дополнительных полей зависит от состояния операции и вида операции. +// Если "МаркерОбновлен" = Истина, то добавляется поле "НастройкиПользователя". +// +// Параметры: +// Выполнено - Булево - сразу устанавливает признак успешности выполнения операции +// ИдентификаторОшибки - Строка - ключевое слово для формирования описания ошибки +// +// Возвращаемое значение: +// Структура - содержит обязательные поля: +// * Выполнено - Булево - признак выполнения операция. Истина, если успешно. +// * Ошибка - Строка - строка с описанием ошибки, заполняется если Выполнено = Ложь +// * КодОшибки - Строка - строка с кодом ошибки, заполняется если Выполнено = Ложь +// * МаркерОбновлен - Булево - признак, того что в процессе запроса произошло обновление маркера безопасности +// +Функция ОтветСервисаПоУмолчанию(Выполнено = Истина, ИдентификаторОшибки = "") Экспорт + + ОтветМетода = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Выполнено); + + Если НЕ Выполнено И ЗначениеЗаполнено(ИдентификаторОшибки) Тогда + СервисКриптографииDSSСлужебныйКлиент.ПолучитьОписаниеОшибки(ОтветМетода, ИдентификаторОшибки); + КонецЕсли; + + Возврат ОтветМетода; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СервисКриптографииDSSКлиент/СервисКриптографииDSSКлиент.mdo b/SSL/src/CommonModules/СервисКриптографииDSSКлиент/СервисКриптографииDSSКлиент.mdo new file mode 100644 index 000000000..90300eb90 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSКлиент/СервисКриптографииDSSКлиент.mdo @@ -0,0 +1,10 @@ + + + СервисКриптографииDSSКлиент + + ru + Сервис криптографии DSS клиент + + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/Module.bsl new file mode 100644 index 000000000..200ffd9a9 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/Module.bsl @@ -0,0 +1,2657 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность +#Область ОбщиеФункции + +// Служебная функция для формирования описания сертификата хранящийся на сервере DSS +// +// Возвращаемое значение: +// Структура: +// * Идентификатор - Число - внутренний идентификатор (код) зарегистрированного сертификата на сервере DSS +// * Отпечаток - Строка - отпечаток сертификата, по которому в последующем производится поиск +// * ТребуетсяПинКод - Булево - признак того, что у сертификата установлен пин-код +// * ПинКод - Строка - хранит пин-код полученный в процессе работы пользователя, ввел вручную или получен из хранилища +// * Основной - Булево - признак сертификата "по-умолчанию" на сервере DSS +// * Представление - Строка - представление сертификата, используемое для отображение пользователю +// * Содержимое - Строка - данные сертификата в формате Base64 +// * ДатаНачала - Дата - начало срока действия сертификата +// * ДатаОкончания - Дата - окончание срока действия сертификата +// * Издатель - Строка - представление издателя сертификата +// * АлгоритмыХеширования - Массив - элементы массива содержат описание алгоритма хеширования +// +Функция СвойстваСертификатаПользователя() Экспорт + + Результат = Новый Структура(); + Результат.Вставить("Идентификатор", -1); + Результат.Вставить("Отпечаток", ""); + Результат.Вставить("КомуВыдан", ""); + Результат.Вставить("ТребуетсяПинКод", Истина); + Результат.Вставить("ПинКод", ""); + Результат.Вставить("Основной", Ложь); + Результат.Вставить("Представление", ""); + Результат.Вставить("Содержимое", ""); + Результат.Вставить("ДатаНачала", '00010101'); + Результат.Вставить("ДатаОкончания", '00010101'); + Результат.Вставить("Издатель", ""); + Результат.Вставить("АлгоритмыХеширования", Новый Массив); + + Возврат Результат; + +КонецФункции + +// Возвращает описание сертификата зарегистрированного на сервере DSS. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ТекущийСертификат - Неопределено - поиск "основного" сертификат, который имеет данный признак на сервере +// - Строка - "Любой", первый попавшийся сертификат +// - Число - поиск по идентификатору сертификата +// - Структура - содержит обязательное поле "Отпечаток", поиск по отпечатку сертификата +// +// Возвращаемое значение: +// см. СвойстваСертификатаПользователя +// +Функция НайтиСертификат(НастройкиПользователя, ТекущийСертификат) Экспорт + + Результат = СвойстваСертификатаПользователя(); + + ВсеСертификаты = НастройкиПользователя.Сертификаты; + + Если ТекущийСертификат = "Любой" Тогда + ПодобралиСертификат = Неопределено; + Для каждого СтрокаКлюча Из ВсеСертификаты Цикл + ТекущийСертификат = СтрокаКлюча.Значение; + Если ПодобралиСертификат = Неопределено Тогда + ПодобралиСертификат = ТекущийСертификат; + ИначеЕсли НЕ СтрокаКлюча.Значение.ТребуетсяПинКод + ИЛИ ЗначениеЗаполнено(СтрокаКлюча.Значение.ПинКод) Тогда + ПодобралиСертификат = СтрокаКлюча.Значение; + КонецЕсли; + КонецЦикла; + + Если ПодобралиСертификат <> Неопределено Тогда + Результат = ПодобралиСертификат; + КонецЕсли; + + ИначеЕсли ТекущийСертификат = Неопределено Тогда + Для каждого СтрокаКлюча Из ВсеСертификаты Цикл + Если СтрокаКлюча.Значение.Основной ИЛИ ВсеСертификаты.Количество() = 1 Тогда + Результат = СтрокаКлюча.Значение; + Прервать; + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипЗнч(ТекущийСертификат) = Тип("Число") Тогда + Для каждого СтрокаКлюча Из НастройкиПользователя.Сертификаты Цикл + Если СтрокаКлюча.Значение.Идентификатор = ТекущийСертификат Тогда + Результат = СтрокаКлюча.Значение; + Прервать; + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипЗнч(ТекущийСертификат) = Тип("Структура") Тогда + Отпечаток = ПолучитьПолеСтруктуры(ТекущийСертификат, "Отпечаток", "---"); + Отпечаток = НРег(Отпечаток); + Для каждого СтрокаКлюча Из ВсеСертификаты Цикл + Если СтрокаКлюча.Значение.Отпечаток = Отпечаток Тогда + Результат = СтрокаКлюча.Значение; + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для поиска и получения значения в сложнопостроенной среде: Структура, Соответствие, Массив (по индексу). +// +// Параметры: +// ДанныеСтруктуры - Структура, Соответствие, Массив - допускает сочетание +// ПутьДанных - Строка - полный путь в дереве +// ЗначениеПоУмолчанию - Произвольный - возвращает значение, если не найдено в дереве, по умолчанию Неопределено +// УчитыватьРегистр - Булево - учитывать регистр ключей при поиске +// +// Возвращаемое значение: +// Произвольный - значение полученное по указанному пути +// +// Пример: +// ВторичныйМетод = СервисКриптографииDSSСлужебный.ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].AuthnMethod", ""), +// ВторичныйМетод = СервисКриптографииDSSСлужебный.ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge['Fff fdf'], ""). +// +Функция ПолучитьПолеСтруктуры(ДанныеСтруктуры, Знач ПутьДанных, ЗначениеПоУмолчанию = Неопределено, УчитыватьРегистр = Ложь) Экспорт + + Если ДанныеСтруктуры = Неопределено Тогда + Возврат ЗначениеПоУмолчанию; + КонецЕсли; + + СпецСимвол = "~"; + ПутьДанных = СтрЗаменить(ПутьДанных, "['", СпецСимвол); + ПутьДанных = СтрЗаменить(ПутьДанных, "'].", СпецСимвол); + ПутьДанных = СтрЗаменить(ПутьДанных, "']", СпецСимвол); + ПутьДанных = СтрЗаменить(ПутьДанных, "[", СпецСимвол); + ПутьДанных = СтрЗаменить(ПутьДанных, "].", СпецСимвол); + ПутьДанных = СтрЗаменить(ПутьДанных, "]", СпецСимвол); + ПутьДанных = СтрЗаменить(ПутьДанных, "'", СпецСимвол); + ПутьДанных = СтрЗаменить(ПутьДанных, ".", СпецСимвол); + + ПоследовательностьПолей = СтрРазделить(ПутьДанных, СпецСимвол, Ложь); + Результат = ЗначениеПоУмолчанию; + СледующееПоле = ДанныеСтруктуры; + + Для каждого СтрокаМассива Из ПоследовательностьПолей Цикл + НашлиПоле = Неопределено; + Если ТипЗнч(СледующееПоле) = Тип("Массив") + ИЛИ ТипЗнч(СледующееПоле) = Тип("ФиксированныйМассив") Тогда + Если ЭтоЦелоеЧисло(СтрокаМассива) Тогда + ИндексПоля = Число(СтрокаМассива); + Если СледующееПоле.Количество() > ИндексПоля И ИндексПоля >= 0 Тогда + НашлиПоле = СледующееПоле.Получить(ИндексПоля); + КонецЕсли; + КонецЕсли; + СледующееПоле = НашлиПоле; + + ИначеЕсли ТипЗнч(СледующееПоле) = Тип("Соответствие") + ИЛИ ТипЗнч(СледующееПоле) = Тип("ФиксированноеСоответствие") Тогда + Если УчитыватьРегистр Тогда + НашлиПоле = СледующееПоле.Получить(СтрокаМассива); + Иначе + Для каждого СтрокаКлюча Из СледующееПоле Цикл + Если НРег(СтрокаКлюча.Ключ) = НРег(СтрокаМассива) Тогда + НашлиПоле = СтрокаКлюча.Значение; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + СледующееПоле = НашлиПоле; + + ИначеЕсли (ТипЗнч(СледующееПоле) = Тип("Структура") + ИЛИ ТипЗнч(СледующееПоле) = Тип("ФиксированнаяСтруктура") + ИЛИ ТипЗнч(СледующееПоле) = Тип("ДанныеФормыСтруктура")) + И ЭтоИмяПеременной(СтрокаМассива) Тогда + СледующееПоле.Свойство(СтрокаМассива, СледующееПоле); + + Иначе + СледующееПоле = Неопределено; + + КонецЕсли; + + Если СледующееПоле = Неопределено Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Если СледующееПоле <> Неопределено Тогда + Результат = СледующееПоле; + КонецЕсли; + + Если ЗначениеПоУмолчанию <> Неопределено + И ТипЗнч(Результат) <> ТипЗнч(ЗначениеПоУмолчанию) Тогда + МассивТипа = Новый Массив; + МассивТипа.Добавить(ТипЗнч(ЗначениеПоУмолчанию)); + ТипЗначения = Новый ОписаниеТипов(МассивТипа); + Результат = ТипЗначения.ПривестиЗначение(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для формирования представления номера телефона. +// В данном представлении частично скрывается информация по шаблону: 8911*****11. +// +// Параметры: +// ТекущийТелефон - Строка - номер телефона +// +// Возвращаемое значение: +// Строка - представление номера телефона без части цифр +// +Функция ПредставлениеТелефона(ТекущийТелефон) Экспорт + + Результат = СокрЛП(ТекущийТелефон); + Счетчик = СтрДлина(Результат); + ВсегоЦифр = 0; + + Пока Счетчик > 0 Цикл + ЭтоЦифра = СтрНайти("0123456789", Сред(Результат, Счетчик, 1)) > 0; + Если ЭтоЦифра Тогда + ВсегоЦифр = ВсегоЦифр + 1; + КонецЕсли; + + Если ВсегоЦифр > 2 И ЭтоЦифра Тогда + Результат = Сред(Результат, 1, Счетчик - 1) + "*" + Сред(Результат, Счетчик + 1); + КонецЕсли; + + Если ВсегоЦифр >= 7 Тогда + Прервать; + КонецЕсли; + + Счетчик = Счетчик - 1; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Служебная функция для формирования представления адреса электронной почты. +// В данном представлении частично скрывается информация по шаблону "q**r.ru". +// +// Параметры: +// ТекущийАдрес - Строка - адрес электронной почты +// +// Возвращаемое значение: +// Строка - представление адреса электронной почты без части информации +// +Функция ПредставлениеАдресаПочты(ТекущийАдрес) Экспорт + + Результат = СокрЛП(ТекущийАдрес); + Позиция = СтрНайти(ТекущийАдрес, "@"); + Если Позиция > 0 Тогда + ПерваяЧасть = Сред(ТекущийАдрес, 1, Позиция - 1); + ДлинаЧасти = СтрДлина(ПерваяЧасть); + Если ДлинаЧасти > 2 Тогда + Результат = Сред(ПерваяЧасть, 1, 1) + Прав("**********", ДлинаЧасти - 2) + Сред(Результат, Позиция - 1, 1) + Сред(Результат, Позиция); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для конвертирования отпечатка из двоичного или строки Base64 представления в HEX +// +// Параметры: +// ОтпечатокСертификата - ДвоичныеДанные, Строка - значение отпечатка +// +// Возвращаемое значение: +// Строка - HEX представление отпечатка без пробелов +// +Функция ТрансформироватьОтпечаток(ОтпечатокСертификата) Экспорт + + Если ТипЗнч(ОтпечатокСертификата) = Тип("ДвоичныеДанные") Тогда + Результат = ПолучитьHexСтрокуИзДвоичныхДанных(ОтпечатокСертификата); + Иначе + Результат = ПолучитьHexСтрокуИзДвоичныхДанных(Base64Значение(ОтпечатокСертификата)); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для анализа наличия конфиденциальных данных. +// +// Параметры: +// ТекущиеДанные - Неопределено - данные введены, но не видны +// - Строка - в открытом виде +// - Структура - подробнее ОбъектПароля +// +// Возвращаемое значение: +// Булево - введены конфиденциальные данные +// +Функция ТребуетсяВводКонфиденциальныхДанных(ТекущиеДанные) Экспорт + + Результат = Истина; + + Если ТипЗнч(ТекущиеДанные) = Тип("Структура") Тогда + Результат = ТекущиеДанные.Состояние = 3; + + ИначеЕсли ТекущиеДанные = Неопределено Тогда + Результат = Ложь; + + Иначе + Результат = НЕ ЗначениеЗаполнено(ТекущиеДанные); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует структуру с описанием пароля. +// +// Параметры: +// ЗначениеПароля - Строка - текущее значение +// СостояниеПароля - Число - описывает состояние значения пароля +// 0 - представлен в открытом виде, +// 1 - представлен в закрытом виде, +// 2 - установлен, хранится в сеансовых данных и значение пустое, +// 3 - не заполнен, +// 4 - пустой пароль. +// Признак - Число - алгоритм закрытия +// +// Возвращаемое значение: +// Структура: +// * Значение - Строка +// * Состояние - Число +// * Признак - Число - алгоритм закрытия +// +Функция ОбъектПароля(ЗначениеПароля, СостояниеПароля = 0, Признак = 1) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Значение", Строка(ЗначениеПароля)); + Результат.Вставить("Состояние", СостояниеПароля); + Результат.Вставить("Признак", Признак); + + Возврат Результат; + +КонецФункции + +// Формирует структуру с описанием пароля. +// Параметры: +// ЗначениеПароля - Строка, Структура - открытое значение пароля, см. также см. СервисКриптографииDSSКлиентСервер.ОбъектПароля +// АвторизованныйПользователь - СправочникСсылка.Пользователи, Строка - ссылка на текущего пользователя +// Признак - Число - алгоритм закрытия +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОбъектПароля +// +Функция ПодготовитьОбъектПароля(ЗначениеПароля, АвторизованныйПользователь, Признак = 1) Экспорт + + Если ТипЗнч(ЗначениеПароля) = Тип("Структура") Тогда + Результат = ЗначениеПароля; + Если ЗначениеПароля.Состояние = 0 И ЗначениеЗаполнено(ЗначениеПароля.Значение) Тогда + Результат = ОбъектПароля(ЗакрытьСекретПользователя(ЗначениеПароля.Значение, АвторизованныйПользователь, Признак), 1); + КонецЕсли; + + ИначеЕсли ЗначениеПароля = Неопределено Тогда + Результат = ОбъектПароля(ЗначениеПароля, 3); + + ИначеЕсли НЕ ЗначениеЗаполнено(ЗначениеПароля) Тогда + Результат = ОбъектПароля(ЗначениеПароля, 4); + + ИначеЕсли ЗначениеЗаполнено(Признак) Тогда + Результат = ОбъектПароля(ЗакрытьСекретПользователя(ЗначениеПароля, АвторизованныйПользователь, Признак), 1); + + Иначе + Результат = ОбъектПароля(ЗначениеПароля, 0); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Извлекает текстовое представление пароля из объекта +// +// Параметры: +// ОбъектПароля - Строка, Структура - см. СервисКриптографииDSSКлиентСервер.ОбъектПароля +// АвторизованныйПользователь - Строка, +// - СправочникСсылка.Пользователи +// +// Возвращаемое значение: +// Строка +// +Функция ПолучитьЗначениеПароля(ОбъектПароля, АвторизованныйПользователь) Экспорт + + Если ТипЗнч(ОбъектПароля) = Тип("Структура") Тогда + + Если ОбъектПароля.Состояние = 0 Тогда + Результат = ЗакрытьСекретПользователя(ОбъектПароля.Значение, АвторизованныйПользователь); + ИначеЕсли ОбъектПароля.Состояние = 1 Тогда + Результат = ОбъектПароля.Значение; + Иначе + Результат = ""; + КонецЕсли; + + Иначе + Результат = Строка(ОбъектПароля); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция определения актуальности данных аутентификации учетной записи облачной подписи +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДатаСеанса - Дата - дата и время на стороне потребителя в универсальном виде +// +// Возвращаемое значение: +// Булево - Истина, если аутентификация актуальна +// +Функция УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса) Экспорт + + Результат = Ложь; + + Если НастройкиПользователя.Политика.Заполнено Тогда + Если НастройкиПользователя.ТокенАвторизации.СрокДействия >= ДатаСеанса Тогда + Результат = Истина; + ИначеЕсли НЕ ТребуетсяВводКонфиденциальныхДанных(НастройкиПользователя.ТокенАвторизации.ТокенОбновления) Тогда + Результат = Истина; + ИначеЕсли НастройкиПользователя.ЗапоминатьПароли Тогда + Результат = Истина; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Определяет режим обязательного подтверждения выполняемой операции. +// см. СвойствоВыполняемойОперации() +// +// Параметры: +// НастройкиПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - данные учетной записи облачной подписи +// ВидОперации - Строка - вид выполняемой операции +// +// Возвращаемое значение: +// Булево +// +Функция ТребуетсяПодтверждениеОперации(НастройкиПользователя, ВидОперации = "") Экспорт + + КлючДействия = СвойствоВыполняемойОперации(НастройкиПользователя, ВидОперации); + + Результат = КлючДействия.Подтверждать; + + Возврат Результат; + +КонецФункции + +// Определяет описание свойство выполняемой операции. +// Такими операциями могут быть: ПодписьПакета, ПодписьДокумента, Расшифрование, ЗапросНаСертификат, СменаПинКода +// и т.д. +// +// Параметры: +// НастройкиПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - данные учетной записи облачной подписи +// ВидОперации - Строка - вид выполняемой операции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// Булево +// +Функция СвойствоВыполняемойОперации(НастройкиПользователя, ВидОперации = "", ПараметрыОперации = Неопределено) Экспорт + + ЗначениеПоУмолчанию = Новый Структура("КодОперации, Подтверждать", 0, Ложь); + + Если ТипЗнч(НастройкиПользователя) = Тип("СправочникСсылка.УчетныеЗаписиDSS") Тогда + ТекущиеНастройки = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + Иначе + ТекущиеНастройки = НастройкиПользователя; + КонецЕсли; + + Результат = ПолучитьПолеСтруктуры(ТекущиеНастройки, "Политика.Действия." + ВидОперации, ЗначениеПоУмолчанию); + + Возврат Результат; + +КонецФункции + +// Возвращает описание типа для справочника учетных записей облачной подписи +// +// Возвращаемое значение: +// Тип +// +Функция ПолучитьТипОблачнойПодписи() Экспорт + + Результат = Тип("СправочникСсылка.УчетныеЗаписиDSS"); + + Возврат Результат; + +КонецФункции + +// Возвращает описание типа для справочника серверов облачной подписи +// +// Возвращаемое значение: +// Тип +// +Функция ПолучитьТипСервераОблачнойПодписи() Экспорт + + Результат = Тип("СправочникСсылка.ЭкземплярыСервераDSS"); + + Возврат Результат; + +КонецФункции + +// Определяет идентификатор алгоритма закрытого ключ на основе его имени. +// +// Параметры: +// ИмяАлгоритма - Строка +// +// Возвращаемое значение: +// Строка - строковое представление идентификатора (число) алгоритма +// +Функция ИдентификаторАлгоритмаЗакрытогоКлюча(ИмяАлгоритма) Экспорт + + ВсеАлгоритмы = Новый Соответствие(); + + ВсеАлгоритмы.Вставить("CALG_GR3410EL", "11811"); // Идентификатор алгоритма ЭЦП по ГОСТ Р 34.10-2001 + ВсеАлгоритмы.Вставить("GOST R 34.10-2001", "11811"); // Альтернативное имя алгоритма + ВсеАлгоритмы.Вставить("CALG_DH_EL_SF", "43556"); // Идентификатор алгоритма обмена ключей по алгоритму DH на базе закрытого ключа пользователя. Открытый ключ получается по ГОСТ Р 34.10 2001. + ВсеАлгоритмы.Вставить("CALG_DH_EL_EPHEM", "43557"); // Идентификатор алгоритма обмена ключей по алгоритму DH на базе закрытого ключа эфемерной пары. Открытый ключ получается по ГОСТ Р 34.10 2001. + + ВсеАлгоритмы.Вставить("CALG_GR3410_12_256", "11849"); // Идентификатор алгоритма ЭЦП по ГОСТ Р 34.10-2012 (256 бит). + ВсеАлгоритмы.Вставить("GOST R 34.10-2012-256", "11849"); // Альтернативное имя алгоритма + ВсеАлгоритмы.Вставить("CALG_DH_GR3410_12_256_SF", "43590"); // Идентификатор алгоритма обмена ключей по алгоритму DH на базе закрытого ключа пользователя. Открытый ключ получается по ГОСТ Р 34.10 2012 (256 бит). + + ВсеАлгоритмы.Вставить("CALG_GR3410_12_512", "11837"); // Идентификатор алгоритма ЭЦП по ГОСТ Р 34.10-2012 (512 бит). + ВсеАлгоритмы.Вставить("GOST R 34.10-2012-512", "11837"); // Альтернативное имя алгоритма + ВсеАлгоритмы.Вставить("CALG_DH_GR3410_12_512_SF", "43586"); // Идентификатор алгоритма обмена ключей по алгоритму DH на базе закрытого ключа пользователя. Открытый ключ получается по ГОСТ Р 34.10 2012 (512 бит). + + ВсеАлгоритмы.Вставить("CALG_RSA_KEYX", "41984"); // Идентификатор алгоритм обмена открытыми ключами RSA. + ВсеАлгоритмы.Вставить("CALG_RSA_SIGN", "9216"); // Идентификатор алгоритма ЭЦП RSA. + + Результат = ВсеАлгоритмы[ИмяАлгоритма]; + Если Результат = Неопределено Тогда + Результат = ИмяАлгоритма; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует массив поддерживаемых версий в АПИ БСП +// +// Возвращаемое значение: +// Массив из Строка - содержит список строк с версиями +// +Функция ПоддерживаемыеВерсии() Экспорт + + Результат = Новый Массив; + Результат.Добавить("2.0.2882"); + Результат.Добавить("2.0.3284"); + + Возврат Результат; + +КонецФункции + +// Проверяет логин (имя учетной записи) на допустимые символы +// +// Параметры: +// ЛогинПользователя - Строка +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево +// * Ошибка - Строка - представления для формирования форматированной строки, в случае если Выполнено Ложь +// +Функция ПроверитьКорректностьЛогина(ЛогинПользователя) Экспорт + + Результат = Новый Структура("Выполнено", Истина); + + ПредставлениеОшибки = ""; + ШаблонОшибки = "%1"; + Запрещенные = Новый Массив; + Запрещенные.Добавить(" "); + + Для Счетчик = 1 По СтрДлина(ЛогинПользователя) Цикл + ТекущийСимвол = Сред(ЛогинПользователя, Счетчик, 1); + Если Запрещенные.Найти(ТекущийСимвол) = Неопределено Тогда + ПредставлениеОшибки = ПредставлениеОшибки + ТекущийСимвол; + Иначе + Результат.Выполнено = Ложь; + ПредставлениеОшибки = ПредставлениеОшибки + СтрШаблон(ШаблонОшибки, ТекущийСимвол); + КонецЕсли; + КонецЦикла; + + Если НЕ Результат.Выполнено Тогда + Результат.Вставить("Ошибка", ПредставлениеОшибки); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ФормированиеСвойствПодписи + +// Таблица для получения кодов и наименований типов подписей, в различных комбинациях +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка, Число - строковый или числовой идентификатор +// * Значение - Строка, Число - строковый или числовой идентификатор +// +Функция ПолучитьТипыПодписей() Экспорт + + Результат = Новый Соответствие; + Результат.Вставить("XML", 0); + Результат.Вставить("ГОСТ", 1); + Результат.Вставить("CMS", 5); + Результат.Вставить("CAdES", 2); + Результат.Вставить("PDF", 3); + Результат.Вставить("MSOffice", 4); + + Результат.Вставить("XMLDSig", 0); + Результат.Вставить("GOST3410", 1); + + Результат.Вставить(0, "XML"); + Результат.Вставить(1, "ГОСТ"); + Результат.Вставить(5, "CMS"); + Результат.Вставить(2, "CAdES"); + Результат.Вставить(3, "PDF"); + Результат.Вставить(4, "MSOffice"); + + Возврат Результат; + +КонецФункции + +// Формирует список документов для представления в формах подтверждения +// Параметры: +// ДанныеДокументов - Массив - содержит элементы из структур с описанием документов +// - Структура - содержит описание документа +// +// Возвращаемое значение: +// Структура: +// * СписокДокументов - Массив из Структура +// +Функция ПодготовитьНаборДокументов(ДанныеДокументов) Экспорт + + Результат = Новый Структура("СписокДокументов", Новый Массив); + + Если ТипЗнч(ДанныеДокументов) = Тип("Структура") Тогда + Результат.СписокДокументов.Добавить(ДанныеДокументов); + + ИначеЕсли ТипЗнч(ДанныеДокументов) = Тип("Массив") Тогда + Для каждого СтрокаМассива Из ДанныеДокументов Цикл + Результат.СписокДокументов.Добавить(СтрокаМассива); + КонецЦикла; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует параметры запроса в случае пакетной подписи документов +// Передается массив документов каждый элемент массива это структура, поля которой содержит +// адрес во временном хранилище, двоичные данные или Base64. +// +// Параметры: +// МассивДокументов - Массив - содержит элементы из структур: +// * Содержание - ДвоичныеДанные, Строка - двоичные данные, адрес во временном хранилище или Base64 +// * ИмяДокумента - Строка - имя документа +// * ТипДокумента - Строка - расширение документа, используется для правильного отображения в мобильном приложении +// * ИсходноеСодержание - ДвоичныеДанные, Строка - содержимое исходного документа, используется в режиме "СоПодпись" +// +// Возвращаемое значение: +// Массив из Структура: +// * Content - Строка - Base64 +// * Name - Строка - имя файла или описание файла +// * Type - Строка - расширение файла, как было передано из входящих данных +// * OriginalContent - Строка - Base64 +// * ВернутьКак - см. ПодготовитьДанныеДокумента +// +Функция ПодготовитьПакетДляПодписи(МассивДокументов) Экспорт + + Результат = Новый Массив; + + Для каждого СтрокаМассива Из МассивДокументов Цикл + + ТипДокумента = ПолучитьТипДанныхДокумента(СтрокаМассива.Содержание); + + НоваяСтрока = Новый Структура("Content, Name, Type, OriginalContent, ВернутьКак"); + НоваяСтрока.Content = СтрокаМассива.Содержание; + НоваяСтрока.Name = СтрокаМассива.ИмяДокумента; + НоваяСтрока.Type = СтрокаМассива.ТипДокумента; + НоваяСтрока.OriginalContent = СтрокаМассива.ИсходноеСодержание; + НоваяСтрока.ВернутьКак = ТипДокумента; + + Результат.Добавить(НоваяСтрока); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Базовая функция для формирования структуры описание для операции подписи документа. +// Строит структуру параметров с учетом применения в режиме транзакции. +// Вызывается для окончательного формирования структуры из функций: +// ПолучитьСвойствоПодписиГост(), +// ПолучитьСвойствоПодписиCMS(), +// ПолучитьСвойствоПодписиXML(), +// ПолучитьСвойствоПодписиCAdES(), +// ПолучитьСвойствоПодписиPDF(), +// ПолучитьСвойствоПодписиMSOffice(). +// В случае вызова сервиса без транзакции, происходит трансформация структуры в СервисКриптографииDSS.Подписать. +// +// Параметры: +// ТипПодписи - Строка - строковый идентификатор типа подписи: ГОСТ, XML, CAdES, PDF, MSOffice +// ПараметрыПодписи - Структура - структура которые сформированы заранее в выше описанных функциях +// +// Возвращаемое значение: +// Структура - содержит поля, необходимые для формирования запроса к сервису в зависимости от типа подписи +// +Функция ПолучитьОписаниеПодписи(ТипПодписи, ПараметрыПодписи = Неопределено) Экспорт + + Результат = Новый Структура(); + + Если ПараметрыПодписи = Неопределено Тогда + ПараметрыПодписи = Новый Структура; + КонецЕсли; + + ДополнительныеПараметры = Новый Структура; + + Если ТипПодписи = "ГОСТ" Тогда + Результат.Вставить("SignatureType", "GOST3410"); + ДополнительныеПараметры.Вставить("Hash", "false"); + + ИначеЕсли ТипПодписи = "XML" Тогда + Результат.Вставить("SignatureType", "XMLDSig"); + ДополнительныеПараметры.Вставить("XMLDSigType", "XMLEnveloped"); + + ИначеЕсли ТипПодписи = "CAdES" Тогда + Результат.Вставить("SignatureType", "CAdES"); + ДополнительныеПараметры.Вставить("IsDetached", "false"); + ДополнительныеПараметры.Вставить("CADESType", "XLT1"); + Если ПараметрыПодписи.Свойство("CmsSignatureType") Тогда + ДополнительныеПараметры.Вставить("CmsSignatureType", "sign"); + Если ПараметрыПодписи.CmsSignatureType = "cosign" Тогда + ДополнительныеПараметры.Вставить("OriginalDocument", ""); + КонецЕсли; + КонецЕсли; + Если ПараметрыПодписи.Свойство("ContentEncoding") Тогда + ДополнительныеПараметры.Вставить("ContentEncoding", "base64"); + КонецЕсли; + Если ПараметрыПодписи.Свойство("Hash") Тогда + ДополнительныеПараметры.Вставить("Hash", "false"); + КонецЕсли; + Если ПараметрыПодписи.Свойство("CmsSignatureType") Тогда + ДополнительныеПараметры.Вставить("CmsSignatureType", "sign"); + КонецЕсли; + Если ПараметрыПодписи.Свойство("TSPAddress") Тогда + ДополнительныеПараметры.Вставить("TSPAddress", ""); + КонецЕсли; + + ИначеЕсли ТипПодписи = "PDF" Тогда + Результат.Вставить("SignatureType", "PDF"); + ДополнительныеПараметры.Вставить("PDFFormat", "CMS"); + ДополнительныеПараметры.Вставить("PDFReason", "test");// обязательно + ДополнительныеПараметры.Вставить("PDFLocation", "temp");// обязательно + + ИначеЕсли ТипПодписи = "MSOffice" Тогда + Результат.Вставить("SignatureType", "MSOffice"); + + КонецЕсли; + + ВсеТипы = ПолучитьТипыПодписей(); + Результат.Вставить("SignatureType", ВсеТипы[ТипПодписи]); + + ЗаполнитьЗначенияСвойств(ДополнительныеПараметры, ПараметрыПодписи); + + Для каждого СтрокаКлюча Из ДополнительныеПараметры Цикл + Результат.Вставить(СтрокаКлюча.Ключ, СтрокаКлюча.Значение); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Сервисная функция для формирования параметров запроса к сервису для подписи документа в формате ГОСТ. +// +// Параметры: +// ХешДокумента - Булево - Истина, если формируется подпись для хеша документа, в данных документа в этом случае +// передается Хеш документа. +// +// Возвращаемое значение: +// см. ПолучитьОписаниеПодписи +// +Функция ПолучитьСвойствоПодписиГост(ХешДокумента = Ложь) Экспорт + + Дополнение = Новый Структура("Hash", ?(ХешДокумента, "True", "False")); + Результат = ПолучитьОписаниеПодписи("ГОСТ", Дополнение); + Возврат Результат; + +КонецФункции + +// Сервисная функция для формирования параметров запроса к сервису для подписи документа в формате CMS. +// Как частный вариант реализации для CAdES-BES подписи, подробнее в ПолучитьСвойствоПодписиCAdES. +// +// Параметры: +// ОтделеннаяПодпись - Булево - Истина, если формируется отделенная подпись +// ХешДокумента - Булево - подпись хеша документа, в данных документа передается хеш документа +// ВариантПодписи - Строка - варианты: "Подпись", "СоПодпись", "Заверяющая" +// ИсходныйДокумент - ДвоичныеДанные +// ИндексПодписи - Число - индекс подписи, которую заверяем +// +// Возвращаемое значение: +// см. ПолучитьОписаниеПодписи +// +Функция ПолучитьСвойствоПодписиCMS(ОтделеннаяПодпись, + ХешДокумента, + ВариантПодписи = "Подпись", + ИсходныйДокумент = Неопределено, + ИндексПодписи = Неопределено) Экспорт + + Результат = ПолучитьСвойствоПодписиCAdES("BES", ОтделеннаяПодпись, ХешДокумента, ВариантПодписи, "", ИсходныйДокумент); + + Возврат Результат; + +КонецФункции + +// Сервисная функция для формирования параметров запроса к сервису для подписи документа в формате XML. +// +// Параметры: +// ВариантПодписи - Строка - содержит возможные варианты: +// Шаблон (XMLTemplate) - подготовленный специальным образом документ, в этом случае данные для подписания включены в шаблон +// Включенная (XMLEnveloped) - включена в исходный документ отдельным узлом +// Содержащая (XMLEnveloping) - содержит в себе исходный документ в виде включенного узла. +// +// Возвращаемое значение: +// см. ПолучитьОписаниеПодписи +// +Функция ПолучитьСвойствоПодписиXML(ВариантПодписи = "") Экспорт + + Дополнение = Новый Структура; + + Если ВариантПодписи = "Шаблон" Тогда + Дополнение.Вставить("XMLDSigType", "XMLTemplate"); + ИначеЕсли ВариантПодписи = "Включенная" Тогда + Дополнение.Вставить("XMLDSigType", "XMLEnveloped"); + Иначе + Дополнение.Вставить("XMLDSigType", "XMLEnveloping"); + КонецЕсли; + + Результат = ПолучитьОписаниеПодписи("XML", Дополнение); + + Возврат Результат; + +КонецФункции + +// Сервисная функция для формирования параметров запроса к сервису для подписи документа в формате CAdES +// +// Параметры: +// ТипПодписи - Строка - содержит варианты: XLT1 (CAdES-X Long Type 1), T (CAdES-T), BES (CAdES-BES) +// ОтделеннаяПодпись - Булево - Истина, если формируется отделенная подпись +// ХешДокумента - Булево - подпись хеша документа, в данных документа передается хеш документа +// ВариантПодписи - Строка - варианты: "Подпись", "СоПодпись", "Заверяющая" +// АдресTSPСлужбы - Строка - адрес службы штампов времени (TSP или OCSP службы), для ТипПодписи Т и XLT1 +// зарегистрированный адрес можно узнать в политике настроек пользователя. +// ИсходныйДокумент - ДвоичныеДанные - передается для режима подписи: "СоПодпись" (Base64) в пакетном режиме игнорируется. +// ИндексПодписи - Число - индекс подписи, для которой создается заверяющая подпись +// +// Возвращаемое значение: +// см. ПолучитьОписаниеПодписи +// +Функция ПолучитьСвойствоПодписиCAdES( + ТипПодписи, + ОтделеннаяПодпись, + ХешДокумента, + ВариантПодписи, + АдресTSPСлужбы = "", + ИсходныйДокумент = Неопределено, + ИндексПодписи = Неопределено) Экспорт + + Дополнение = Новый Структура(); + Дополнение.Вставить("IsDetached", ?(ОтделеннаяПодпись, "true", "false")); + Дополнение.Вставить("CADESType", ТипПодписи); + Дополнение.Вставить("Hash", ?(ХешДокумента, "true", "false")); + Дополнение.Вставить("CmsSignatureType", "sign"); + Если ВРег(ВариантПодписи) = "СОПОДПИСЬ" Тогда + Дополнение.Вставить("CmsSignatureType", "cosign"); + Дополнение.Вставить("OriginalDocument", "ИсходныйДокумент"); + ИначеЕсли ВРег(ВариантПодписи) = "ЗАВЕРЯЮЩАЯ" Тогда + Дополнение.Вставить("CmsSignatureType", "counterSign"); + КонецЕсли; + + Если ТипПодписи = "XLT1" ИЛИ ТипПодписи = "T" Тогда + Дополнение.Вставить("TSPAddress", АдресTSPСлужбы); + КонецЕсли; + + Если ЗначениеЗаполнено(ИндексПодписи) Тогда + Дополнение.Вставить("SignatureIndex", Формат(ИндексПодписи, "ЧГ=")); + КонецЕсли; + + Результат = ПолучитьОписаниеПодписи("CAdES", Дополнение); + + Возврат Результат; + +КонецФункции + +// Сервисная функция для формирования параметров запроса к сервису для подписи документа в формате CMS. +// Как частный вариант реализации для CAdES-BES подписи, подробнее ПолучитьСвойствоПодписиCAdES. +// +// Параметры: +// ТипПодписи - Строка - возможные варианты: CMS (PKCS7), CAdEST, CAdES (CAdES-X Long Type 1) +// ЦельПодписания - Строка - описание цели подписания документа +// МестоПодписания - Строка - описание места подписания документа +// ШаблонВидимойПодписи - Строка - строковое представление шаблона видимой подписи +// ИдентификаторШаблона - Число - +// 1 - простой текстовый шаблон, +// 2 - шаблон с логотипом и текстом, +// 3 - шаблон в виде изображения. +// УровеньИзменений - Строка - описывает уровень изменения документа после подписания +// NOT_CERTIFIED - для утверждения, +// CERTIFIED_NO_CHANGES_ALLOWED - изменения запрещены, +// CERTIFIED_FORM_FILLING - заполнение полей форм, +// CERTIFIED_FORM_FILLING_AND_ANNOTATIONS - комментарии и заполнение полей форм. +// +// Возвращаемое значение: +// см. ПолучитьОписаниеПодписи +// +Функция ПолучитьСвойствоПодписиPDF(ТипПодписи, ЦельПодписания, МестоПодписания, + ШаблонВидимойПодписи = "", + ИдентификаторШаблона = 1, + УровеньИзменений = "") Экспорт + + Дополнение = Новый Структура(); + Дополнение.Вставить("PDFFormat", ТипПодписи); + Дополнение.Вставить("PDFReason", ЦельПодписания);// обязательно + Дополнение.Вставить("PDFLocation", МестоПодписания);// обязательно + Если ЗначениеЗаполнено(ШаблонВидимойПодписи) Тогда + Дополнение.Вставить("PdfSignatureAppearance", ШаблонВидимойПодписи); + КонецЕсли; + Если ЗначениеЗаполнено(ИдентификаторШаблона) Тогда + Дополнение.Вставить("PdfSignatureTemplateId ", Формат(ИдентификаторШаблона, "ЧГ=")); + КонецЕсли; + Если ЗначениеЗаполнено(УровеньИзменений) Тогда + Дополнение.Вставить("PDFCertificationLevel", УровеньИзменений); + КонецЕсли; + + Результат = ПолучитьОписаниеПодписи("PDF", Дополнение); + Возврат Результат; + +КонецФункции + +// Сервисная функция для формирования параметров запроса к сервису для подписи документа в формате MS Office. +// Подписывает новые форматы файлов MS Word и Excel например *.docx. +// При подписывании файла *.doc созданного в MS Word 2003 возникает ошибка. +// +// Возвращаемое значение: +// см. ПолучитьОписаниеПодписи +// +Функция ПолучитьСвойствоПодписиMSOffice() Экспорт + + Дополнение = Новый Структура(); + Результат = ПолучитьОписаниеПодписи("MSOffice", Дополнение); + + Возврат Результат; + +КонецФункции + +// Сервисная функция для формирования подпись в асинхронном режиме +// +// Параметры: +// СвойстваПодписи - Структура - СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиГост, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиXML, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCAdES, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиPDF, +// СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиMSOffice. +// ИдентификаторыДокументов - Строка, Массив - идентификатор или идентификаторы документов загруженных на сервер +// ИдентификаторПрофиля - Строка - идентификатор профиля подписи +// ИдентификаторыСвязанныхДокументов - Строка, Массив - идентификатор связанного документа загруженных на сервер +// +// Возвращаемое значение: +// см. ПолучитьОписаниеПодписи +// +Функция ПолучитьСвойствоПодписиАсинхронной(СвойстваПодписи, ИдентификаторыДокументов, ИдентификаторПрофиля = Неопределено, ИдентификаторыСвязанныхДокументов = Неопределено) Экспорт + + Подпись = Новый Структура; + Подпись.Вставить("Type", СвойстваПодписи.SignatureType); + СвойстваПодписи.Удалить("SignatureType"); + Подпись.Вставить("Parameters", СвойстваПодписи); + + Результат = Новый Структура; + Результат.Вставить("Signature", Подпись); + + МассивДокументов = Новый Массив; + Если ТипЗнч(ИдентификаторыДокументов) = Тип("Строка") Тогда + МассивДокументов.Добавить(ИдентификаторыДокументов); + Иначе + МассивДокументов = ИдентификаторыДокументов; + КонецЕсли; + + ДанныеДокументов = Новый Массив; + Для Каждого СтрокаМассива Из МассивДокументов Цикл + НоваяСтрока = Новый Структура("RefId", СтрокаМассива); + ДанныеДокументов.Добавить(НоваяСтрока); + КонецЦикла; + + МассивДокументов = Новый Массив; + Если ТипЗнч(ИдентификаторыСвязанныхДокументов) = Тип("Строка") Тогда + МассивДокументов.Добавить(ИдентификаторыСвязанныхДокументов); + ИначеЕсли ИдентификаторыСвязанныхДокументов <> Неопределено Тогда + МассивДокументов = ИдентификаторыСвязанныхДокументов; + КонецЕсли; + + Для Счетчик = 0 По МассивДокументов.Количество() - 1 Цикл + СтрокаМассива = ДанныеДокументов[Счетчик]; + СтрокаМассива.Вставить("RelatedRefId", МассивДокументов[Счетчик]); + КонецЦикла; + + // дополняем текущую структуру информацией о документах + Результат.Вставить("BinaryData", ДанныеДокументов); + Если ЗначениеЗаполнено(ИдентификаторПрофиля) Тогда + Результат.Вставить("ProcessingTemplateId", ИдентификаторПрофиля); + КонецЕсли; + + Возврат Результат; + +КонецФункции + + +// Формирует атрибуты для проверки отсоединенной подписи и хеш значения +// +// Параметры: +// АлгоритмХеш - Строка - один из вариантов +// GOST R 34.11-94, +// GR 34.11-2012 256, +// GR 34.11-2012 512, +// SHA-1, +// SHA-256, +// SHA-384, +// SHA-512, +// MD5. +// СодержимоеPKCS7 - Булево - признак, что содержимое документа это PKCS7 +// СодержимоеХеш - Булево - Истина, если переданные содержать хеш значение +// НомерПодписи - Число - индекс проверяемой подписи, если 0, то проверяются все подписи +// +// Возвращаемое значение: +// Структура - содержит поля, необходимые для формирования запроса к сервису: +// * Hash - Булево +// * HashAlgorithm - Строка +// * ExtractContent- Булево +// * VerifyAll - Булево +// * SignatureIndex- Число +// * VerifyPKCS7 - Булево +// +Функция ПолучитьСвойстваПроверкиПодписиХеш( + АлгоритмХеш, + СодержимоеPKCS7 = Истина, + СодержимоеХеш = Ложь, + НомерПодписи = 0) Экспорт + + Атрибуты = Новый Структура(); + Атрибуты.Вставить("Hash", СодержимоеХеш); + Атрибуты.Вставить("HashAlgorithm", АлгоритмХеш); + Атрибуты.Вставить("ExtractContent", Ложь); + Атрибуты.Вставить("VerifyAll", Ложь); + + Если НомерПодписи <> 0 Тогда + Атрибуты.Вставить("SignatureIndex", НомерПодписи); + Иначе + Атрибуты.Вставить("VerifyAll", Истина); + КонецЕсли; + + Атрибуты.Вставить("VerifyPKCS7", СодержимоеPKCS7); + + Возврат Атрибуты; + +КонецФункции + +// Формирует атрибуты для проверки подписи с помощью сервиса. +// Для PDF и XML значение СодержимоеPKCS7 должно быть Ложь. +// +// Параметры: +// СодержимоеPKCS7 - Булево - указывает, что содержимое представляет собой PKCS7 +// НомерПодписи - Число - индекс проверяемой подписи, если 0, проверяются все подписи +// +// Возвращаемое значение: +// Структура - содержит поля, необходимые для формирования запроса к сервису: +// * VerifyPKCS7 - Булево +// * ExtractContent - Булево +// * VerifyAll - Булево +// * SignatureIndex - Число +// +Функция ПолучитьСвойстваПроверкиПодписи( + СодержимоеPKCS7 = Истина, + НомерПодписи = 0) Экспорт + + Атрибуты = Новый Структура(); + Атрибуты.Вставить("VerifyAll", Ложь); + Если НомерПодписи <> 0 Тогда + Атрибуты.Вставить("SignatureIndex", НомерПодписи); + Иначе + Атрибуты.Вставить("VerifyAll", Истина); + КонецЕсли; + + Атрибуты.Вставить("VerifyPKCS7", СодержимоеPKCS7); + Атрибуты.Вставить("ExtractContent", Ложь); + + Возврат Атрибуты; + +КонецФункции + +// Служебная процедура дополняет атрибуты проверки подписи информацией о документе, +// требуется в случае использования режима подтверждения. +// +// Параметры: +// СвойствоПодписи - Структура - сформированная структура с атрибутами для проверки подписи +// ИнформацияДокумента - Строка - описание проверяемого документа +// ТипДокумента - Строка - расширения документа, необходимое для отображения в мобильном приложении +// +Процедура ПолучитьИнформациюДокументаДляПодписи(СвойствоПодписи, ИнформацияДокумента, ТипДокумента) Экспорт + + СвойствоПодписи.Вставить("DocumentInfo", ИнформацияДокумента); + СвойствоПодписи.Вставить("DocumentType", ТипДокумента); + +КонецПроцедуры + +#КонецОбласти + +#Область ФормированиеСвойствТранзакций + +// Сервисная функция для формирования специфических параметров для вызова сервиса +// в случае использования подтверждения расшифрования. +// +// Параметры: +// ТипШифрования - Строка - значение из двух вариантов: CMS или XML +// ИдентификаторСертификата - Число - внутренний идентификатор сертификата +// ТипДокумента - Строка - расширение документа, которые может использоваться для определения алгоритма отображения на мобильном устройстве +// ИнформацияОДокументе - Строка - описание документа +// +// Возвращаемое значение: +// Массив из Структура: +// * Name - Строка - имя поля +// * Value - Строка - значение поля +// +Функция СвойстваТранзакцииРасшифрования( + ТипШифрования, + ИдентификаторСертификата, + ТипДокумента = "", + ИнформацияОДокументе = "") Экспорт + + ДанныеЗапроса = Новый Массив; + НоваяСтрока = Новый Структура("Name, Value", "EncryptionType", ТипШифрования); + ДанныеЗапроса.Добавить(НоваяСтрока); + НоваяСтрока = Новый Структура("Name, Value", "CertificateID", Формат(ИдентификаторСертификата, "ЧГ=")); + ДанныеЗапроса.Добавить(НоваяСтрока); + НоваяСтрока = Новый Структура("Name, Value", "DocumentInfo", ИнформацияОДокументе); + ДанныеЗапроса.Добавить(НоваяСтрока); + НоваяСтрока = Новый Структура("Name, Value", "DocumentType", ТипДокумента); + ДанныеЗапроса.Добавить(НоваяСтрока); + + Возврат ДанныеЗапроса; + +КонецФункции + +// Сервисная функция для формирования специфических параметров для вызова сервиса +// в случае использования подтверждения подписания. +// +// Параметры: +// СвойстваПодписи - Структура - содержит поля, которые сформированы в блоке "ФормированиеСвойствПодписи" +// ИдентификаторСертификата - Число - внутренний идентификатор сертификата +// +// Возвращаемое значение: +// Массив из Структура: +// * Name - Строка - имя поля +// * Value - Строка - значение поля +// +Функция СвойстваТранзакцииПодписания(СвойстваПодписи, ИдентификаторСертификата) Экспорт + + ДанныеЗапроса = Новый Массив; + Для каждого СтрокаКлюча Из СвойстваПодписи Цикл + НоваяСтрока = Новый Структура("Name, Value", СтрокаКлюча.Ключ, СтрокаКлюча.Значение); + ДанныеЗапроса.Добавить(НоваяСтрока); + КонецЦикла; + + НоваяСтрока = Новый Структура("Name, Value", "CertificateID", ИдентификаторСертификата); + ДанныеЗапроса.Добавить(НоваяСтрока); + + Возврат ДанныеЗапроса; + +КонецФункции + +// Сервисная функция для формирования специфических параметров для вызова сервиса +// в случае использования подтверждения смены пин-код сертификата. +// +// Параметры: +// ИдентификаторСертификата - Число - внутренний идентификатор сертификата +// +// Возвращаемое значение: +// Массив из Структура - в данном случает состоит из одного элемента: +// * Name - Строка - имя поля +// * Value - Строка - значение поля +// +Функция СвойстваТранзакцииСменыПинКода(ИдентификаторСертификата = 0) Экспорт + + ДанныеЗапроса = Новый Массив; + НоваяСтрока = Новый Структура("Name, Value", "CertificateID", Формат(ИдентификаторСертификата, "ЧГ=")); + ДанныеЗапроса.Добавить(НоваяСтрока); + + Возврат ДанныеЗапроса; + +КонецФункции + +// Сервисная функция для формирования специфических параметров для вызова сервиса +// в случае использования подтверждения запроса на новый сертификат. +// +// Параметры: +// ИдентификаторУЦ - Число - внутренний идентификатор УЦ +// ИдентификаторШаблона - Строка - OID шаблона запроса +// ИмяСертификата - Строка - имя сертификата, suject name +// +// Возвращаемое значение: +// Массив из Структура - в данном случает состоит из одного элемента: +// * Name - Строка - имя поля +// * Value- Строка - значение поля +// +Функция СвойстваТранзакцииЗапросНаСертификат(ИдентификаторУЦ, + ИдентификаторШаблона, + ИмяСертификата) Экспорт + + ДанныеЗапроса = Новый Массив; + НоваяСтрока = Новый Структура("Name, Value", "CAId", Формат(ИдентификаторУЦ, "ЧГ=")); + ДанныеЗапроса.Добавить(НоваяСтрока); + НоваяСтрока = Новый Структура("Name, Value", "CertSubjectName", ИмяСертификата); + ДанныеЗапроса.Добавить(НоваяСтрока); + НоваяСтрока = Новый Структура("Name, Value", "CertTemplateOid", Формат(ИдентификаторШаблона, "ЧГ=")); + ДанныеЗапроса.Добавить(НоваяСтрока); + + Возврат ДанныеЗапроса; + +КонецФункции + +#КонецОбласти + +#Область ФормированиеСвойствДокумента + +// Формирует структуру с описанием свойств документа, предназначенного для загрузки на сервер. +// +// Параметры: +// ИмяФайла - Строка - имя файла +// ТипФайла - Строка - тип формата документа +// ВременныйФайл - Булево - регистрировать документ как временный +// ИдРодителя - Строка - идентификатор родительского документа +// МаленькийФайл - Булево - признак, что файл маленький +// ШаблонДокумента - Строка - содержимое шаблона документа +// ШаблонКонвертации - Строка - содержимое шаблона конвертации документа +// +// Возвращаемое значение: +// Структура - содержит поля, необходимые для формирование запроса к серверу: +// * FileName - Строка +// * FileType - Строка +// * ParentDocumentId - Строка +// * IsTemporary - Булево +// * AdditionalInfo - Структура: +// ** DocumentTemplate - Строка +// ** SnippetTemplate - Строка +// ** SmallFile - Булево +// +Функция ПолучитьСвойстваДокумента( + ИмяФайла, + ТипФайла, + ВременныйФайл, + ИдРодителя, + МаленькийФайл = Неопределено, + ШаблонДокумента = "", + ШаблонКонвертации = "") Экспорт + + Результат = Новый Структура; + + Если ЗначениеЗаполнено(ИмяФайла) Тогда + Результат.Вставить("FileName", ИмяФайла); + Иначе + Результат.Вставить("FileName", "Temp.txt"); + КонецЕсли; + + Если ЗначениеЗаполнено(ТипФайла) Тогда + Результат.Вставить("FileType", ТипФайла); + Иначе + Результат.Вставить("FileType", "txt"); + КонецЕсли; + + Если ЗначениеЗаполнено(ИдРодителя) Тогда + Результат.Вставить("ParentDocumentId", ИдРодителя); + КонецЕсли; + + Результат.Вставить("IsTemporary", ВременныйФайл); + + ДополнительнаяИнформация = Новый Структура; + Если ЗначениеЗаполнено(ШаблонДокумента) Тогда + ДополнительнаяИнформация.Вставить("DocumentTemplate", ШаблонДокумента); + Иначе + ДополнительнаяИнформация.Вставить("DocumentTemplate", ""); + КонецЕсли; + + Если ЗначениеЗаполнено(ШаблонКонвертации) Тогда + ДополнительнаяИнформация.Вставить("SnippetTemplate", ШаблонКонвертации); + Иначе + ДополнительнаяИнформация.Вставить("SnippetTemplate", ""); + КонецЕсли; + + Если МаленькийФайл <> Неопределено Тогда + ДополнительнаяИнформация.Вставить("SmallFile", МаленькийФайл); + КонецЕсли; + + Результат.Вставить("AdditionalInfo", ДополнительнаяИнформация); + + Возврат Результат; + +КонецФункции + +// Дополняет свойства документа для загрузки данными самого документа. +// Такой состав свойств документа необходим при выполнении функции СервисКриптографииDSS.ЗагрузитьПакетДокументов. +// +// Параметры: +// СвойстваДокумента - см. СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваДокумента +// СодержимоеДокумента - ДвоичныеДанные, Строка - один файл, который необходимо обработать, +// подробнее в СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(). +// +Процедура ДополнитьСвойстваДокументаСодержимым(СвойстваДокумента, СодержимоеДокумента) Экспорт + + СтруктураДокумента = ПодготовитьДанныеДокумента(СодержимоеДокумента); + СвойстваДокумента.Вставить("Content", СтруктураДокумента.Документ); + +КонецПроцедуры + +#КонецОбласти + +#Область Прочее + +// Определяет по входящим данным, в каком виде они поступили. +// Будет возращен результат запроса в таким же типом. +// +// Параметры: +// ДанныеДокумента - ДвоичныеДанные - двоичные данные документа. +// - Строка - может быть адресом во временном хранилище или Base64. +// - Структура - состоит из двух обязательных полей: +// * Ссылка - СправочникСсылка, ДокументСсылка - данные для позиционирования на элементе с данными +// * Реквизит - Строка - имя реквизита с типом "ХранилищеЗначения" +// +// Возвращаемое значение: +// Строка - описание типа документа из фиксированного списка: ДвоичныеДанные, АдресХранилища, Base64, Файл, СсылкаБазы, +// Неопределено. +// +Функция ПолучитьТипДанныхДокумента(ДанныеДокумента) Экспорт + + Результат = "Неопределено"; + + Если ТипЗнч(ДанныеДокумента) = Тип("Массив") + И ДанныеДокумента.Количество() > 0 Тогда + ЭлементДанных = ДанныеДокумента[0]; + Иначе + ЭлементДанных = ДанныеДокумента; + КонецЕсли; + + Если ТипЗнч(ЭлементДанных) = Тип("ДвоичныеДанные") Тогда + Результат = "ДвоичныеДанные"; + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("Строка") И ЭтоАдресВременногоХранилища(ЭлементДанных) Тогда + Результат = "АдресХранилища"; + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("Строка") Тогда + НашлиСимволы = СтрНайти(ЭлементДанных, ":") > 0 ИЛИ СтрНайти(ЭлементДанных, "\") > 0 ИЛИ СтрНайти(ЭлементДанных, ".") > 0; + Если НашлиСимволы Тогда + Результат = "Файл"; + Иначе + Результат = "Base64"; + КонецЕсли; + ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("Структура") Тогда + Результат = "СсылкаБазы"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для подготовки данных документов для передачи на сервере. +// Почти всегда задействован формат в Base64 (кроме случая поточной подписи). +// +// Параметры: +// ДанныеДокумента - ДвоичныеДанные, Строка, Структура - см. ПолучитьТипДанныхДокумента(), +// если данные переданы как адрес во временном хранилище, результат возвращается в новом адресе временного хранилища. +// Если данные переданы как ссылка, данные возвращаются как двоичные данные. +// ДвоичнымиДанными - Булево - вернуть как двоичные данные +// +// Возвращаемое значение: +// Структура: +// * ТипДокумента - Строка - определяет в каком формате вернуть результат выполнения операции, +// определяется на основе входящих данных, варианты: АдресХранилища, Base64, ДвоичныеДанные. +// * Документ - Строка, ДвоичныеДанные - содержимое документа +// +Функция ПодготовитьДанныеДокумента(ДанныеДокумента, ДвоичнымиДанными = Ложь) Экспорт + + ТипДокумента = ПолучитьТипДанныхДокумента(ДанныеДокумента); + + Результат = Новый Структура; + Результат.Вставить("ТипДокумента", ТипДокумента); + Результат.Вставить("Документ", ""); + + ИсходныйДокумент = ""; + Если ТипДокумента = "ДвоичныеДанные" Тогда + ИсходныйДокумент = ДанныеДокумента; + ИначеЕсли ТипДокумента = "АдресХранилища" Тогда + ИсходныйДокумент = ПолучитьИзВременногоХранилища(ДанныеДокумента); + ИначеЕсли ТипДокумента = "Base64" Тогда + ИсходныйДокумент = ДанныеДокумента; + ИначеЕсли ТипДокумента = "СсылкаБазы" Тогда + ИсходныйДокумент = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьДанныеБазыПоСсылке(ДанныеДокумента); + КонецЕсли; + + Если ТипЗнч(ИсходныйДокумент) = Тип("ДвоичныеДанные") И НЕ ДвоичнымиДанными Тогда + ИсходныйДокумент = Base64Строка(ИсходныйДокумент); + ИначеЕсли ТипЗнч(ИсходныйДокумент) = Тип("Строка") И ДвоичнымиДанными Тогда + ИсходныйДокумент = ПолучитьДвоичныеДанныеИзBase64Строки(ИсходныйДокумент); + КонецЕсли; + + Результат.Вставить("Документ", ИсходныйДокумент); + + Если ЗначениеЗаполнено(Результат.Документ) + И ДвоичнымиДанными Тогда + Результат.Вставить("Документ", Результат.Документ); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает данные сертификата в кодировке DER. +// +// Параметры: +// Сертификат - ДвоичныеДанные - данные сертификата +// ПроверочныйСимвол - Строка +// Возвращаемое значение: +// ДвоичныеДанные - данные сертификата в кодировке DER +// +Функция СертификатВКодировкеDER(Сертификат, ПроверочныйСимвол = "") Экспорт + + Попытка + СертификатТекст = ПолучитьСтрокуИзДвоичныхДанных(Сертификат); + Исключение + СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Если СтрНайти(СертификатТекст, "-----BEGIN CERTIFICATE-----") > 0 Тогда + СертификатТекст = СтрЗаменить(СертификатТекст, "-----BEGIN CERTIFICATE-----" + ПроверочныйСимвол, ""); + СертификатТекст = СтрЗаменить(СертификатТекст, ПроверочныйСимвол + "-----END CERTIFICATE-----", ""); + Возврат Base64Значение(СертификатТекст); + Иначе + Возврат Сертификат; + КонецЕсли; + +КонецФункции + +// Формирует идентификатор версии АПИ сервера. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// - Строка - содержит версию сервера указанного в "СправочникСсылка.ЭкземплярыСервераDSS" +// +// Возвращаемое значение: +// Число +// +Функция ИдентификаторВерсииСервера(НастройкиПользователя) Экспорт + + Если Тип("Строка") = ТипЗнч(НастройкиПользователя) Тогда + ТекущаяВерсия = НастройкиПользователя; + Иначе + ТекущаяВерсия = НастройкиПользователя.ВерсияАПИ; + КонецЕсли; + + ИДВерсии = 1; + Если ТекущаяВерсия > "2.0.2882" Тогда + ИДВерсии = 2; + КонецЕсли; + + Возврат ИДВерсии; + +КонецФункции + +// Базовая функция для формирования результата выполнения функций и процедур в серверных вызовах. +// Данный формат возврата результата используется в большинстве функций и процедур подсистемы. +// Содержит как обязательные поля, так и дополнительные поля. +// Состав дополнительных полей зависит от состояния операции и вида операции. +// Если "МаркерОбновлен" = Истина, то добавляется поле "НастройкиПользователя". +// +// Параметры: +// Выполнено - Булево - устанавливает признак успешности выполнения +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево - признак успешного выполнения вызова. +// Если Истина, то обычно структура дополняется полем "Результат". +// * МаркерОбновлен - Булево - признак, что в процессе работы обновился токен авторизации. +// Если Истина, структура дополняется полем "НастройкиПользователя". +// * Ошибка - Строка - содержит форматированный текст ошибки, если поле Выполнено = Ложь +// * КодОшибки - Строка - содержит код ошибки +// +Функция ОтветСервисаПоУмолчанию(Выполнено = Истина) Экспорт + + ОтветМетода = Новый Структура; + ОтветМетода.Вставить("Выполнено", Выполнено); + ОтветМетода.Вставить("Ошибка", ""); + ОтветМетода.Вставить("КодОшибки", ""); + ОтветМетода.Вставить("МаркерОбновлен", Ложь); + + Возврат ОтветМетода; + +КонецФункции + +#КонецОбласти + +#Область ОбработкаОшибок + +// Формирует параметризированное описание ошибки, по переданном идентификатору ошибки. +// Необходимо отменить, что в модуле формируются ошибки, которые используются на стороне клиента. +// Описание остальных ошибок (исключительно серверных) содержатся в серверном модуле СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки. +// +// Параметры: +// РезультатОперации - Структура, Неопределено - структура со стандартным содержанием ответа сервиса +// ТипОшибки - Строка - ключевое слово возникшей ошибки +// ТекстОшибки - Строка - дополнительная информация, включаемая в текст ошибки +// +// Возвращаемое значение: +// Строка - описание ошибки в формате "Код ошибки" "Описание ошибки" "Текст ошибки" +// +Функция ПолучитьОписаниеОшибки(РезультатОперации, ТипОшибки, ТекстОшибки = "") Экспорт + + Результат = ""; + НашлиОшибку = Неопределено; + КодОшибки = ""; + + Если ЗначениеЗаполнено(ТипОшибки) Тогда + НашлиОшибку = ДоступныйРеестрОшибок(ТипОшибки); + КонецЕсли; + + Если НашлиОшибку = Неопределено Тогда + НашлиОшибку = ДоступныйРеестрОшибок("ОшибкаВыполнения"); + Если ЗначениеЗаполнено(ТипОшибки) Тогда + КодОшибки = НашлиОшибку.КодОшибки; + НашлиОшибку.КодОшибки = НашлиОшибку.КодОшибки + " (" + ТипОшибки + ")"; + КонецЕсли; + Иначе + КодОшибки = НашлиОшибку.КодОшибки; + КонецЕсли; + + Результат = НашлиОшибку.КодОшибки + ": " + НашлиОшибку.Описание; + Если НЕ ПустаяСтрока(ТекстОшибки) Тогда + Результат = Результат + " " + ТекстОшибки; + КонецЕсли; + + Если РезультатОперации <> Неопределено Тогда + РезультатОперации.Вставить("КодОшибки", КодОшибки); + РезультатОперации.Вставить("Ошибка", Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Проверяет описание ошибки вид ошибок ввода пин-кода +// +// Параметры: +// ТекстОшибки - Строка - содержание ошибки +// +// Возвращаемое значение: +// Булево - Истина, если это ошибка при вводе пин-кода сертификата +// +Функция ЭтоОшибкаПинКода(ТекстОшибки) Экспорт + + Результат = ПолучитьКодОшибки(ТекстОшибки) = "210009"; + Возврат Результат; + +КонецФункции + +// Проверяет описание ошибки на вид ошибок связанных с аутентификацией +// +// Параметры: +// ОписаниеОшибки - Строка - содержание ошибки +// +// Возвращаемое значение: +// Булево - Истина, если это ошибка при аутентификации пользователя +// +Функция ЭтоОшибкаАутентификации(ОписаниеОшибки) Экспорт + + Результат = Ложь; + + Если Сред(ОписаниеОшибки, 1, 2) = "20" + ИЛИ Сред(ОписаниеОшибки, 1, 6) = "000003" Тогда + Результат = Истина; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Проверяет описание ошибки на вид ошибок отказа пользователя от продолжения операции +// +// Параметры: +// ТекстОшибки - Строка - содержание ошибки +// +// Возвращаемое значение: +// Булево - Истина, если это ошибка при отказе пользователя +// +Функция ЭтоОшибкаОтказа(ТекстОшибки) Экспорт + + Результат = ПолучитьКодОшибки(ТекстОшибки) = "210000" + ИЛИ ПолучитьКодОшибки(ТекстОшибки) = "210001" + ИЛИ ПолучитьКодОшибки(ТекстОшибки) = "300045"; + Возврат Результат; + +КонецФункции + +// Проверяет описание ошибки на вид ошибок наличие необработанного запроса на сертификат +// +// Параметры: +// ТекстОшибки - Строка - содержание ошибки +// +// Возвращаемое значение: +// Булево - Истина, если это ошибка этого вида +// +Функция ЭтоОшибкаНеобработанныеЗапросы(ТекстОшибки) Экспорт + + Результат = ПолучитьКодОшибки(ТекстОшибки) = "300011"; + Возврат Результат; + +КонецФункции + +// Возвращает код ошибки из содержание ошибки +// +// Параметры: +// ТекстОшибки - Строка - содержание ошибки +// +// Возвращаемое значение: +// Строка - строка из 6 символов обозначающая код ошибки +// +Функция ПолучитьКодОшибки(ТекстОшибки) Экспорт + + Результат = ""; + Позиция = СтрНайти(ТекстОшибки, ":"); + Если Позиция = 7 Тогда + Результат = Сред(ТекстОшибки, 1, 6); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует представление структуры запроса, необходимая для записи в журнал регистрации. +// +// Параметры: +// ВходящийКонтекст - Структура, Произвольный - содержание данных +// +// Возвращаемое значение: +// Строка - представление структуры +// +Функция ФильтроватьПараметрыВызова(ВходящийКонтекст) Экспорт + + Результат = ""; + + КлючевыеПоля = Новый Соответствие; + КлючевыеПоля.Вставить("password", ""); + КлючевыеПоля.Вставить("client_id", ""); + КлючевыеПоля.Вставить("oldpin", ""); + КлючевыеПоля.Вставить("newpin", ""); + КлючевыеПоля.Вставить("pin", ""); + КлючевыеПоля.Вставить(НРег("НастройкиПользователя"), ""); + КлючевыеПоля.Вставить("пароль", ""); + КлючевыеПоля.Вставить(НРег("пинкод"), ""); + КлючевыеПоля.Вставить(НРег("ПарольПользователя"), ""); + + ФильтроватьПараметрыВызоваРекурсивно(Результат, ВходящийКонтекст, КлючевыеПоля); + + Возврат Результат; + +КонецФункции + +// Возвращает имя события для журнала регистрации, которое используется для записи ошибок в подсистеме облачной подписи. +// +// Возвращаемое значение: +// Строка - имя события. +// +Функция ИмяСобытияЖурналаРегистрации() Экспорт + + Возврат НСтр("ru = 'Сервис криптографии облачной подписи'"); + +КонецФункции + +// Формирует результат выполнения операции, по факту проверки поддерживаемой версии АПИ +// +// Параметры: +// НастройкиПользователя - Структура +// - Строка +// РеестрИдВерсий - Строка - перечисление идентификаторов версий, через запятую +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ПроверитьВерсиюСервера(НастройкиПользователя, Знач РеестрИдВерсий) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Истина); + Результат.Вставить("Ошибка", ""); + Результат.Вставить("КодОшибки", ""); + Результат.Вставить("МаркерОбновлен", Ложь); + + РеестрИдВерсий = СтрЗаменить(РеестрИдВерсий, " ", ""); + РазрешенныеВерсии = СтрРазделить(РеестрИдВерсий, ",", Ложь); + ИдВерсии = Формат(ИдентификаторВерсииСервера(НастройкиПользователя), "ЧГ=0"); + + Если РазрешенныеВерсии.Найти(ИдВерсии) = Неопределено Тогда + Результат.Выполнено = Ложь; + СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьОписаниеОшибки(Результат, "НеПоддерживаемаяВерсия"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ИсточникХраненияНастроекПользователя + +// Формирует идентификатор способа хранения сессионных настроек пользователя, использующие регистр сведений "БезопасноеХранилищеДанных". +// +// Возвращаемое значение: +// Строка +// +Функция ИсточникНастроекХранилище() Экспорт + + Возврат "Хранилище"; + +КонецФункции + +// Формирует идентификатор способа хранения сессионных настроек пользователя, использующие параметры сеанса. +// +// Возвращаемое значение: +// Строка +// +Функция ИсточникНастроекПараметрыСеанса() Экспорт + + Возврат "ПараметрыСеанса"; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ПодтверждениеОпераций + +// Процедура для анализа ответа сервиса на аутентификационное испытание в процессе подтверждения операций +// По результатам анализа заполняются данные цикла подтверждения. +// +// Параметры: +// РезультатЗапроса - Структура - ответ сервиса облачной подписи +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// ДатаСеанса - Дата - используется для вычисления времени даты и времени действия созданной транзакции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура РазобратьРезультатЗапроса(РезультатЗапроса, + НастройкиПользователя, + ДанныеПодтверждения, + ДатаСеанса, + ПараметрыОперации = Неопределено) Экспорт + + НовыйЭтап = ДанныеПодтверждения.ЭтапЦикла; + ВторичнаяАвторизация = ДанныеПодтверждения.ВторичнаяАвторизация; + ТекстОшибки = ""; + КодОшибки = ""; + + Если РезультатЗапроса.Выполнено Тогда + АнализОтвета = РезультатЗапроса.Результат; + Если РезультатЗапроса.МаркерОбновлен Тогда + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьНастройкиПользователя(НастройкиПользователя, РезультатЗапроса.НастройкиПользователя, ПараметрыОперации); + КонецЕсли; + + Если ПолучитьПолеСтруктуры(АнализОтвета, "IsError", Истина) Тогда + ТипОшибки = ПолучитьПолеСтруктуры(АнализОтвета, "Error", ""); + Если ТипОшибки = "authentication_declined" Тогда + НовыйЭтап = "Отказ"; + Иначе + НовыйЭтап = "Ошибка"; + КонецЕсли; + СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьОписаниеОшибки(РезультатЗапроса, ТипОшибки); + КодОшибки = РезультатЗапроса.КодОшибки; + ТекстОшибки = ПолучитьПолеСтруктуры(АнализОтвета, "ErrorDescription", ""); + + ИначеЕсли ПолучитьПолеСтруктуры(АнализОтвета, "IsFinal", Истина) Тогда + РезультатВыполнения = СервисКриптографииDSSСлужебныйВызовСервера.ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса, ПараметрыОперации); + + НовыйЭтап = "Окончание"; + Если РезультатВыполнения.Выполнено Тогда + НовыйЭтап = "Окончание"; + Иначе + НовыйЭтап = "Ошибка"; + КодОшибки = РезультатВыполнения.КодОшибки; + ТекстОшибки = РезультатВыполнения.Ошибка; + РезультатЗапроса = РезультатВыполнения; + КонецЕсли; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "ВводКода" Тогда + ИщемОшибку = ПолучитьПолеСтруктуры(АнализОтвета, "Challenge.Title.Value", ""); + Если ЗначениеЗаполнено(ИщемОшибку) Тогда + ДанныеПодтверждения.ОписаниеПодтверждения = ИщемОшибку; + НовыйЭтап = "Предупреждение"; + КонецЕсли; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Выбор" Тогда + ПолучитьДанныеВторичнойАвторизации(АнализОтвета, ДанныеПодтверждения, ДатаСеанса); + Если ДанныеПодтверждения.ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение") + ИЛИ ДанныеПодтверждения.ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite") Тогда + НовыйЭтап = "Ожидание"; + Иначе + НовыйЭтап = "ВводКода"; + КонецЕсли; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Начало" Тогда + ПолучитьМетодыВторичнойАвторизации(АнализОтвета, ДанныеПодтверждения, ВторичнаяАвторизация); + Если ДанныеПодтверждения.СписокМетодов.Количество() = 0 Тогда + НовыйЭтап = "Ошибка"; + ТекстОшибки = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьОписаниеОшибки(Неопределено, "МетодАвторизации"); + ИначеЕсли ДанныеПодтверждения.СписокМетодов.Количество() = 1 Тогда + ПолучитьДанныеВторичнойАвторизации(АнализОтвета, ДанныеПодтверждения, ДатаСеанса); + Если ДанныеПодтверждения.ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение") + ИЛИ ДанныеПодтверждения.ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite") Тогда + НовыйЭтап = "Ожидание"; + Иначе + НовыйЭтап = "ВводКода"; + КонецЕсли; + ИначеЕсли ЗначениеЗаполнено(ВторичнаяАвторизация) Тогда + НовыйЭтап = "Выбор"; + Иначе + НовыйЭтап = "Выбор"; + КонецЕсли; + КонецЕсли; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Предупреждение" Тогда + НовыйЭтап = "ВводКода"; + + Иначе + НовыйЭтап = "Ошибка"; + ТекстОшибки = РезультатЗапроса.Ошибка; + + КонецЕсли; + + Если НовыйЭтап = "Ошибка" Тогда + ДанныеПодтверждения.Ошибка = ТекстОшибки; + ДанныеПодтверждения.КодОшибки = КодОшибки; + КонецЕсли; + + Если ДанныеПодтверждения.ЭтапЦикла <> НовыйЭтап Тогда + ДанныеПодтверждения.ЭтапЦикла = НовыйЭтап; + КонецЕсли; + +КонецПроцедуры + +// Функция для формирования параметров запроса к сервису облачной подписи в зависимости от состояния +// данных цикла подтверждения. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// +// Возвращаемое значение: +// Структура - сформированные параметры для запроса к сервису. Содержит различные необязательные поля: +// * ClientId - Строка +// * Resource - Строка +// * TransactionTokenId - Строка +// * ConfirmationScope - Строка +// * ConfirmationParams - Структура: +// ** Templte - Строка +// * Resource - Строка +// * ChallengeResponse - Структура: +// ** ChoiceChallengeResponse - Массив из Структура: +// *** RefId - Строка +// *** ChoiceSelected - Массив из Структура: +// **** RefID - Строка +// ** TextChallengeResponse - Массив из Структура: +// *** RefId - Строка +// *** ChoiceSelected - Массив из Структура: +// **** RefID - Строка +// **** Value - Строка +// +Функция ПодготовитьПараметрыОтправкиЗапроса(НастройкиПользователя, ДанныеПодтверждения) Экспорт + + НастройкиПользователя = НастройкиПользователя; + ДанныеПодтверждения = ДанныеПодтверждения; + ПараметрыЗапроса = Новый Структура; + + Если ДанныеПодтверждения.ЭтапЦикла = "Начало" Тогда + ПараметрыЗапроса.Вставить("Resource", НРег(НастройкиПользователя.Подключение.ИдентификаторПодписи)); + Если ДанныеПодтверждения.ТипПодтверждения = "Транзакция" Тогда + ПараметрыЗапроса.Вставить("TransactionTokenId", ДанныеПодтверждения.Идентификатор); + ИначеЕсли ДанныеПодтверждения.ТипПодтверждения = "ПроизвольнаяОперация" Тогда + Если ЗначениеЗаполнено(ДанныеПодтверждения.Идентификатор) Тогда + ПараметрыЗапроса.Вставить("TransactionTokenId", ДанныеПодтверждения.Идентификатор); + Иначе + ПараметрыЗапроса.Вставить("ConfirmationScope", ДанныеПодтверждения.ШаблонПодтверждения); + ПараметрыЗапроса.Вставить("ConfirmationParams", Новый Структура("Templte", ДанныеПодтверждения.Заголовок)); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Выбор" Тогда + НовыйЭлемент = Новый Структура; + НовыйЭлемент.Вставить("RefId", ДанныеПодтверждения.Идентификатор); + НовыйЭлемент.Вставить("ChoiceSelected", Новый Массив); + ОписаниеВыбора = Новый Структура; + ОписаниеВыбора.Вставить("RefID", ТипВторичнойАвторизации(ДанныеПодтверждения.ВторичнаяАвторизация)); + НовыйЭлемент.ChoiceSelected.Добавить(ОписаниеВыбора); + + МассивИспытаний = Новый Массив; + МассивИспытаний.Добавить(НовыйЭлемент); + + ПараметрыЗапроса.Вставить("Resource", НастройкиПользователя.Подключение.ИдентификаторПодписи); + ПараметрыЗапроса.Вставить("ChallengeResponse", Новый Структура); + ПараметрыЗапроса.ChallengeResponse.Вставить("ChoiceChallengeResponse", МассивИспытаний); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "ВводКода" Тогда + НовыйЭлемент = Новый Структура; + НовыйЭлемент.Вставить("RefId", ДанныеПодтверждения.Идентификатор); + НовыйЭлемент.Вставить("Value", ДанныеПодтверждения.КодПользователя); + + МассивИспытаний = Новый Массив; + МассивИспытаний.Добавить(НовыйЭлемент); + + ПараметрыЗапроса.Вставить("Resource", НастройкиПользователя.Подключение.ИдентификаторПодписи); + ПараметрыЗапроса.Вставить("ChallengeResponse", Новый Структура); + ПараметрыЗапроса.ChallengeResponse.Вставить("TextChallengeResponse", МассивИспытаний); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Ожидание" Тогда + НовыйЭлемент = Новый Структура; + НовыйЭлемент.Вставить("RefId", ДанныеПодтверждения.Идентификатор); + + МассивИспытаний = Новый Массив; + МассивИспытаний.Добавить(НовыйЭлемент); + + ПараметрыЗапроса.Вставить("Resource", НастройкиПользователя.Подключение.ИдентификаторПодписи); + ПараметрыЗапроса.Вставить("ChallengeResponse", Новый Структура); + ПараметрыЗапроса.ChallengeResponse.Вставить("TextChallengeResponse", МассивИспытаний); + + КонецЕсли; + + Если ПараметрыЗапроса.Количество() > 0 Тогда + ПараметрыЗапроса.Вставить("ClientId", НастройкиПользователя.Подключение.ИдентификаторКлиента); + КонецЕсли; + + Возврат ПараметрыЗапроса; + +КонецФункции + +#КонецОбласти + +#Область ФормированиеОписаниеОшибок + +Функция ДоступныйРеестрОшибок(Знач ИдентификаторОшибки) + + Результат = Неопределено; + ИдентификаторОшибки = НРег(ИдентификаторОшибки); + + Если ИдентификаторОшибки = НРег("СертификатыНеОбнаружены") Тогда + Результат = ОписаниеОшибки_СертификатыНеОбнаружены(); + ИначеЕсли ИдентификаторОшибки = НРег("ОшибкаВыполнения") Тогда + Результат = ОписаниеОшибки_ОшибкаВыполнения(); + ИначеЕсли ИдентификаторОшибки = НРег("РасшифровкаВЦикле") Тогда + Результат = ОписаниеОшибки_РасшифровкаВЦикле(); + ИначеЕсли ИдентификаторОшибки = НРег("Отказ") Тогда + Результат = ОписаниеОшибки_Отказ(); + ИначеЕсли ИдентификаторОшибки = "authentication_declined" Тогда + Результат = ОписаниеОшибки_authentication_declined(); + ИначеЕсли ИдентификаторОшибки = "certificate_not_found" Тогда + Результат = ОписаниеОшибки_certificate_not_found(); + ИначеЕсли ИдентификаторОшибки = НРег("ТипПодписи") Тогда + Результат = ОписаниеОшибки_ТипПодписи(); + ИначеЕсли ИдентификаторОшибки = НРег("ОтказПользователя") Тогда + Результат = ОписаниеОшибки_ОтказПользователя(); + ИначеЕсли ИдентификаторОшибки = НРег("УстановкаРасширенияСФайлами") Тогда + Результат = ОписаниеОшибки_УстановкаРасширенияСФайлами(); + ИначеЕсли ИдентификаторОшибки = НРег("ПолучениеФайла") Тогда + Результат = ОписаниеОшибки_ПолучениеФайла(); + ИначеЕсли ИдентификаторОшибки = НРег("НеподдерживаемаяВерсия") Тогда + Результат = ОписаниеОшибки_НеПоддерживаемаяВерсия(); + ИначеЕсли ИдентификаторОшибки = НРег("МетодАвторизации") Тогда + Результат = ОписаниеОшибки_МетодАвторизации(); + ИначеЕсли ИдентификаторОшибки = НРег("ПоляВыбранногоЗапросаНаСертификат") Тогда + Результат = ОписаниеОшибки_ПоляВыбранногоЗапросаНаСертификат(); + ИначеЕсли ИдентификаторОшибки = НРег("ЗавершениеРаботы") Тогда + Результат = ОписаниеОшибки_ЗавершениеРаботы(); + ИначеЕсли ИдентификаторОшибки = НРег("ОбработкаНастроекЗаявления") Тогда + Результат = ОписаниеОшибки_ОбработкаНастроекЗаявления(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует структуру для хранения описания ошибки. +// +// Параметры: +// КодОшибки - Строка +// ТекстОшибки - Строка - текст описания ошибки +// +// Возвращаемое значение: +// Структура: +// * КодОшибки - Строка +// * Описание - Строка - текст описания ошибки +// +Функция ОбщееОписаниеОшибки(КодОшибки, ТекстОшибки) + + Результат = Новый Структура(); + Результат.Вставить("КодОшибки", КодОшибки); + Результат.Вставить("Описание", ТекстОшибки); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_СертификатыНеОбнаружены() + + Результат = ОбщееОписаниеОшибки("100002", + НСтр("ru = 'Сообщение зашифровано неизвестными сертификатами.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ОшибкаВыполнения() + + Результат = ОбщееОписаниеОшибки("100003", + НСтр("ru = 'Ошибка сервиса. + |1. Возможно сервер сейчас не доступен, проверьте настройки сети и работоспособность сервера. + |2. Неправильные параметры запроса. + |3. Проверьте настройки и права сервера 1С на подключение к сервису облачной подписи. + |4. Проверьте настройки для TLS подключения (сертификаты сервера).'")); + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_РасшифровкаВЦикле() + + Результат = ОбщееОписаниеОшибки("100004", + НСтр("ru = 'Не удалось расшифровать документ по данным всех учетных записей'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_Отказ() + + Результат = ОбщееОписаниеОшибки("210000", + НСтр("ru = 'Пользователь отказался от аутентификации.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_authentication_declined() + + Результат = ОбщееОписаниеОшибки("210001", + НСтр("ru = 'Пользователь отказался от подтверждения операции.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_МетодАвторизации() + + Результат = ОбщееОписаниеОшибки("200003", + НСтр("ru = 'Не обнаружены доступные способы подтверждения в настройках сервиса.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_certificate_not_found() + + Результат = ОбщееОписаниеОшибки("300006", + НСтр("ru = 'Сертификат не обнаружен.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ТипПодписи() + + Результат = ОбщееОписаниеОшибки("300044", + НСтр("ru = 'Данный тип подписи не поддерживается сервером DSS.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ОтказПользователя() + + Результат = ОбщееОписаниеОшибки("300045", + НСтр("ru = 'Пользователь отказался от выбранного действия.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_УстановкаРасширенияСФайлами() + + Результат = ОбщееОписаниеОшибки("300046", + НСтр("ru = 'Не удалось установить расширения работы с файлами в Веб-клиенте.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ПолучениеФайла() + + Результат = ОбщееОписаниеОшибки("300047", + НСтр("ru = 'Возникла ошибка при получении данных файла.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_НеПоддерживаемаяВерсия() + + Результат = ОбщееОписаниеОшибки("300052", + НСтр("ru = 'Запрос требуемого ресурса не поддерживается текущий версией сервера DSS.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ПоляВыбранногоЗапросаНаСертификат() + + Результат = ОбщееОписаниеОшибки("300068", + НСтр("ru = 'В выбранном запросе на сертификат атрибуты отличаются от указанных пользователем.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ЗавершениеРаботы() + + Результат = ОбщееОписаниеОшибки("300070", + НСтр("ru = 'Завершение работы системы.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ОбработкаНастроекЗаявления() + + Результат = ОбщееОписаниеОшибки("300072", + НСтр("ru = 'Ошибка при обработке настроек заявления.'")); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ВспомогательныеПроцедурыИФункции + +// Служебная функция для получения реестра типов вторичной авторизации типа для аутентификационного испытания +// варианты методов. +// otpviasms (SMS), +// mobile (myDSS), +// airkey (AirKeyDSS), +// oath, +// simauth, +// otpviaemail (почта), +// mtmo. +// +// Параметры: +// Перечисление - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - ПеречислениеСсылка.СпособыАвторизацииDSS +// * Значение - Строка - представление метода +// +Функция ТипыВторичнойАвторизации() + + Префикс = "http://dss.cryptopro.ru/identity/authenticationmethod/"; + + Результат = Новый Соответствие; + Результат.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение"), Префикс + "mobile"); + Результат.Вставить(Префикс + "mobile", ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение")); + + Результат.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС"), Префикс + "otpviasms"); + Результат.Вставить(Префикс + "otpviasms", ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС")); + + Результат.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта"), Префикс + "otpviaemail"); + Результат.Вставить(Префикс + "otpviaemail", ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта")); + + Результат.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite"), Префикс + "airkey"); + Результат.Вставить(Префикс + "airkey", ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite")); + + Возврат Результат; + +КонецФункции + +// Служебная функция для разбора типа аутентификационного испытания в процессе процедуры подтверждения +// варианты методов. +// otpviasms (SMS). +// mobile (myDSS). +// airkey (AirKeyDSS). +// oath. +// simauth. +// otpviaemail (Электронная почта). +// mtmo. +// +// Параметры: +// МетодАутентификации - Строка - значение аутентификационного испытания +// +// Возвращаемое значение: +// Структура: +// * Ключ - ПеречислениеСсылка.СпособыАвторизацииDSS +// * Значение - Строка - представление метода +// +Функция ТипВторичнойАвторизации(МетодАутентификации) + + ВсеТипыПодтверждения = ТипыВторичнойАвторизации(); + Результат = ВсеТипыПодтверждения[МетодАутентификации]; + + Возврат Результат; + +КонецФункции + +// Служебная процедура для разбора аутентификационного испытания в процессе процедуры подтверждения +// и заполнения данных цикла подтверждения. +// +// Параметры: +// ДанныеОтвета - Структура - значение аутентификационного испытания +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// +Процедура ПолучитьДанныеВторичнойАвторизации(ДанныеОтвета, ДанныеПодтверждения, ДатаСеанса) + + ВторичныйМетод = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].AuthnMethod", ""); + ДанныеПодтверждения.Идентификатор = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].RefID", ""); + ДанныеПодтверждения.ОписаниеПодтверждения = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].Label", ""); + ДанныеПодтверждения.ГрафическийКод = Неопределено; + ДанныеПодтверждения.ВторичнаяАвторизация = ТипВторичнойАвторизации(ВторичныйМетод); + + ДанныеГрафическогоКода = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].Image"); + СрокДействия = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].ExpiresIn", 0); + Если ЗначениеЗаполнено(ДанныеГрафическогоКода) Тогда + ДанныеПодтверждения.ГрафическийКод = ПолучитьДвоичныеДанныеИзBase64Строки(ДанныеГрафическогоКода.Value); + КонецЕсли; + + Если ДанныеПодтверждения.ДоступныеМетоды.Найти(ДанныеПодтверждения.ВторичнаяАвторизация) = Неопределено Тогда + ДанныеПодтверждения.ЭтапЦикла = "Ошибка"; + ДанныеПодтверждения.Ошибка = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьОписаниеОшибки(Неопределено, "МетодАвторизации"); + КонецЕсли; + + Если СрокДействия > 0 Тогда + ДанныеПодтверждения.СрокДействия = ДатаСеанса + СрокДействия; + Иначе + ДанныеПодтверждения.СрокДействия = Неопределено; + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура для разбора первого этапа аутентификационного испытания - выбор способа подтверждения +// и заполнения данных цикла подтверждения. +// +// Параметры: +// ДанныеОтвета - Структура - значение аутентификационного испытания +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// ВторичнаяАвторизация - ПеречислениеСсылка.СпособыАвторизацииDSS +// +Процедура ПолучитьМетодыВторичнойАвторизации(ДанныеОтвета, ДанныеПодтверждения, ВторичнаяАвторизация) + + ВсеТипыПодтверждения = ТипыВторичнойАвторизации(); + + ДанныеПодтверждения.СписокМетодов.Очистить(); + + НесколькоМетодов = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.ChoiceChallenge"); + Если НесколькоМетодов <> Неопределено Тогда + ДанныеПодтверждения.Идентификатор = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.ChoiceChallenge[0].RefID", ""); + НесколькоМетодов = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.ChoiceChallenge[0].Choice"); + Для каждого СтрокаМассива Из НесколькоМетодов Цикл + ВторичныйМетод = ВсеТипыПодтверждения[ПолучитьПолеСтруктуры(СтрокаМассива, "RefID", "")]; + Если ДанныеПодтверждения.ДоступныеМетоды.Найти(ВторичныйМетод) <> Неопределено Тогда + ДанныеПодтверждения.СписокМетодов.Добавить(ВторичныйМетод); + КонецЕсли; + КонецЦикла; + + ДанныеПодтверждения.ОписаниеПодтверждения = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.Title.Value", ""); + ДанныеПодтверждения.Идентификатор = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.ContextData.RefID", ""); + + Иначе + ВторичныйМетод = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].AuthnMethod", ""); + ВторичныйМетод = ТипВторичнойАвторизации(ВторичныйМетод); + ДанныеПодтверждения.Идентификатор = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].RefID", ""); + ДанныеПодтверждения.ОписаниеПодтверждения = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].Label", ""); + Если ДанныеПодтверждения.ДоступныеМетоды.Найти(ВторичныйМетод) <> Неопределено Тогда + ДанныеПодтверждения.СписокМетодов.Добавить(ВторичныйМетод); + КонецЕсли; + + КонецЕсли; + + Если ДанныеПодтверждения.СписокМетодов.Найти(ВторичнаяАвторизация) = Неопределено Тогда + ВторичнаяАвторизация = Неопределено; + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура участвуют в рекурсивном формировании представления структуры. +// При этом исключается содержание объемных и конфиденциальных блоков данных. +// +// Параметры: +// НовыйОбъект - Произвольный +// ВходящийКонтекст - Структура +// КлючевыеПоля - Структура - исключаемые поля +// +Процедура ФильтроватьПараметрыВызоваРекурсивно(НовыйОбъект, ВходящийКонтекст, КлючевыеПоля) + + ТипКонтекста = ТипЗнч(ВходящийКонтекст); + + Если Тип("Строка") = ТипКонтекста Тогда // ограничим длину и проверим на пароль + Представление = Лев(ВходящийКонтекст, 50); + Позиция = СтрНайти(НРег(Представление), "password"); + Если Позиция > 0 Тогда + Представление = Сред(Представление, 1, Позиция - 1); + КонецЕсли; + НовыйОбъект = НовыйОбъект + Представление; + + ИначеЕсли Тип("ДвоичныеДанные") = ТипКонтекста Тогда + НовыйОбъект = НовыйОбъект + "<<ДвоичныеДанные>>"; + + ИначеЕсли Тип("Массив") = ТипКонтекста + ИЛИ Тип("ФиксированныйМассив") = ТипКонтекста Тогда + НовыйОбъект = НовыйОбъект + "["; + Для каждого СтрокаМассива Из ВходящийКонтекст Цикл + ФильтроватьПараметрыВызоваРекурсивно(НовыйОбъект, СтрокаМассива, КлючевыеПоля); + НовыйОбъект = НовыйОбъект + "," + Символы.ПС; + КонецЦикла; + НовыйОбъект = НовыйОбъект + "]"; + + ИначеЕсли Тип("Структура") = ТипКонтекста + ИЛИ Тип("ФиксированнаяСтруктура") = ТипКонтекста + ИЛИ Тип("Соответствие") = ТипКонтекста + ИЛИ Тип("ФиксированноеСоответствие") = ТипКонтекста Тогда + + НовыйОбъект = НовыйОбъект + "{"; + Для каждого СтрокаКлюча Из ВходящийКонтекст Цикл + КлючСтроки = НРег(СокрЛП(СтрокаКлюча.Ключ)); + ЗначениеСтроки = СтрокаКлюча.Значение; + + НовыйОбъект = НовыйОбъект + КлючСтроки + "="; + Если КлючевыеПоля[КлючСтроки] <> Неопределено Тогда + ЗначениеСтроки = "******"; + КонецЕсли; + + ФильтроватьПараметрыВызоваРекурсивно(НовыйОбъект, ЗначениеСтроки, КлючевыеПоля); + НовыйОбъект = НовыйОбъект + "," + Символы.ПС; + КонецЦикла; + НовыйОбъект = НовыйОбъект + "}"; + + ИначеЕсли Тип("Число") = ТипКонтекста Тогда + НовыйОбъект = НовыйОбъект + Формат(ВходящийКонтекст, "ЧН=; ЧГ="); + + Иначе + НовыйОбъект = НовыйОбъект + СокрЛП(ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Служебная функция, проверяет строковое значение, что оно целое число +// +// Параметры: +// ПроверяемоеЗначение - Строка +// +// Возвращаемое значение: +// Булево +// +Функция ЭтоЦелоеЧисло(Знач ПроверяемоеЗначение) + + Если ПроверяемоеЗначение = "0" Тогда + Возврат Истина; + КонецЕсли; + + ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)); + + Возврат ОписаниеЧисла.ПривестиЗначение(ПроверяемоеЗначение) <> 0; + +КонецФункции + +// Служебная функция, проверяет имя поля на соответствие имени переменной +// +// Параметры: +// ПроверяемоеЗначение - Строка +// +// Возвращаемое значение: +// Булево +// +Функция ЭтоИмяПеременной(Знач ПроверяемоеЗначение) + + Результат = ЗначениеЗаполнено(ПроверяемоеЗначение); + ВсеБуквы = "_QWERTYUIOPASDFGHJKLZXCVBNM" + "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ"; + ВсеЦифры = "01234566789"; + ПроверяемоеЗначение = ВРег(ПроверяемоеЗначение); + + Если СтрНайти(ВсеБуквы, Лев(ПроверяемоеЗначение, 1)) = 0 Тогда + Результат = Ложь; + Иначе + ВсеБуквы = ВсеБуквы + ВсеЦифры; + Для Счетчик = 1 По СтрДлина(ПроверяемоеЗначение) Цикл + Если СтрНайти(ВсеБуквы, Сред(ПроверяемоеЗначение, Счетчик, 1)) = 0 Тогда + Результат = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная, определяет ключ для сохранения и получения настроек из параметра сеанса +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +// Возвращаемое значение: +// - Строка +// - СправочникСсылка.УчетныеЗаписиDSS +// +Функция КлючНастроекПользователя(НастройкиПользователя) Экспорт + + Если НастройкиПользователя.ДанныеБД Тогда + Результат = НастройкиПользователя.Ссылка; + Иначе + Результат = НастройкиПользователя.Логин + НастройкиПользователя.Подключение.Сервер; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Запутывает содержание пароля введенного пользователем, прежде чем он будет передан на сервер. +// +// Параметры: +// ВведенныйСекрет - Строка +// АвторизованныйПользователь - СправочникСсылка.Пользователи - ссылка на текущего пользователя +// ПризнакКонфиденциальности - Число - применяемый алгоритм +// +// Возвращаемое значение: +// Строка - запутанная строка +// +Функция ЗакрытьСекретПользователя(ВведенныйСекрет, АвторизованныйПользователь, ПризнакКонфиденциальности = 1) Экспорт + + Если ПризнакКонфиденциальности = 0 Тогда + Результат = ВведенныйСекрет; + + Иначе + Если ТипЗнч(АвторизованныйПользователь) = Тип("Строка") Тогда + ДанныеПользователя = АвторизованныйПользователь; + Иначе + ДанныеПользователя = Строка(АвторизованныйПользователь.УникальныйИдентификатор()); + КонецЕсли; + + КлючПользователя = ПолучитьБуферДвоичныхДанныхИзСтроки(Прав(ДанныеПользователя, 6) + "_" + ВведенныйСекрет); + + Модуль = КлючПользователя.Размер; + Случайность = СтрЗаменить(ДанныеПользователя, "-", ""); + Случайность = ПолучитьБуферДвоичныхДанныхИзHexСтроки(Случайность); + + Перемешать = Новый Массив(Модуль); + Для Счетчик = 1 По Модуль Цикл + Перемешать.Установить(Счетчик - 1, Счетчик); + КонецЦикла; + + Для Счетчик = 1 По Модуль Цикл + ИндексЭлемента = Счетчик % Случайность.Размер; + ЗначениеЭлемента = Случайность.Получить(ИндексЭлемента) % Модуль; + НашлиЗначение = Перемешать.Найти(ЗначениеЭлемента); + НашлиСчетчик = Перемешать.Найти(Счетчик); + Если НашлиЗначение <> Неопределено + И НашлиСчетчик <> Неопределено Тогда + Перемешать.Установить(НашлиСчетчик, ЗначениеЭлемента); + Перемешать.Установить(НашлиЗначение, Счетчик); + КонецЕсли; + КонецЦикла; + + Результат = Новый БуферДвоичныхДанных(КлючПользователя.Размер); + + Начало = Случайность.Получить(8) % Модуль; + + Ключ1 = Случайность.Получить(6); + Ключ2 = Случайность.Получить(7); + + Для Счетчик = 1 По Модуль Цикл + СледующееМесто = Перемешать[Начало]; + СледующийБайт = КлючПользователя.Получить(СледующееМесто - 1); + Результат.Установить(Счетчик - 1, СледующийБайт); + Начало = (Начало + 1) % Модуль; + КонецЦикла; + + Для Счетчик = 1 По Модуль Цикл + СледующийБайт = Результат.Получить(Счетчик - 1); + СледующийБайт = ?(Счетчик % 2 = 1, СледующийБайт + Ключ1, СледующийБайт + Ключ2) % 256; + Результат.Установить(Счетчик - 1, СледующийБайт); + КонецЦикла; + + Результат = ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(Результат); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формируем представление перечисления способов авторизации на сервере. +// +// Параметры: +// ЗначениеВыбора - СписокЗначений - где значение ПеречислениеСсылка.СпособыАвторизацииDSS +// - ПеречислениеСсылка.СпособыАвторизацииDSS +// +// Возвращаемое значение: +// Строка +// Неопределено +// +Функция ПолучитьПредставлениеСпособовАвторизации(ЗначениеВыбора) Экспорт + + Результат = ""; + + Варианты = Новый Соответствие(); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_УчетныеДанные"), + НСтр("ru = 'Логин и пароль'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная"), + НСтр("ru = 'Логин и пароль с дополнительным подтверждением'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации"), + НСтр("ru = 'Сертификат авторизации'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_КодАвторизации"), + НСтр("ru = 'Авторизация через Web-форму'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение"), + НСтр("ru = 'Мобильное приложение myDSS'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта"), + НСтр("ru = 'Электронная почта'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС"), + НСтр("ru = 'SMS'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite"), + НСтр("ru = 'Мобильное приложение AirKey DSS'")); + Варианты.Вставить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение"), + НСтр("ru = 'Мобильное приложение недоступно'")); + + Если ТипЗнч(ЗначениеВыбора) = Тип("СписокЗначений") Тогда + Для Каждого СтрокаСписка Из ЗначениеВыбора Цикл + ТекущееЗначение = Варианты[СтрокаСписка.Значение]; + Если ЗначениеЗаполнено(ТекущееЗначение) Тогда + СтрокаСписка.Представление = ТекущееЗначение; + КонецЕсли; + КонецЦикла; + Иначе + Результат = Варианты[ЗначениеВыбора]; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/СервисКриптографииDSSКлиентСервер.mdo b/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/СервисКриптографииDSSКлиентСервер.mdo new file mode 100644 index 000000000..ab1021199 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSКлиентСервер/СервисКриптографииDSSКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + СервисКриптографииDSSКлиентСервер + + ru + Сервис криптографии DSS клиент-сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/Module.bsl new file mode 100644 index 000000000..bba91d229 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/Module.bsl @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Процедура позволяет переопределить список способов первичной аутентификации, доступный пользователю +// +// Параметры: +// МассивСпособов - Массив из ПеречислениеСсылка.СпособыАвторизацииDSS +// +//@skip-warning Пустой метод +// +Процедура СписокПервичнойАвторизации(МассивСпособов) Экспорт + + +КонецПроцедуры + +// Процедура позволяет переопределить список способов вторичной авторизация, доступный пользователю +// +// Параметры: +// МассивСпособов - Массив из ПеречислениеСсылка.СпособыАвторизацииDSS +// +//@skip-warning Пустой метод +// +Процедура СписокВторичнойАвторизации(МассивСпособов) Экспорт + + +КонецПроцедуры + +// Процедура вызывается при изменении значения константы ИспользоватьСервисОблачнойПодписи +// +//@skip-warning Пустой метод +// +Процедура ПриВключенииСервисаОблачнойПодписи() Экспорт + +КонецПроцедуры + +// Позволяет переопределить использование синхронного режима работы в зависимости от вида клиента +// +// Параметры: +// ТекущийРежим - Булево - для ВебКлиента Ложь, для остальных Истина +// +//@skip-warning Пустой метод +// +Процедура ИспользоватьСинхронныйРежим(ТекущийРежим) Экспорт + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/СервисКриптографииDSSПереопределяемый.mdo b/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/СервисКриптографииDSSПереопределяемый.mdo new file mode 100644 index 000000000..37af06a56 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSПереопределяемый/СервисКриптографииDSSПереопределяемый.mdo @@ -0,0 +1,11 @@ + + + СервисКриптографииDSSПереопределяемый + + ru + Сервис криптографии DSS переопределяемый + + true + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/Module.bsl new file mode 100644 index 000000000..b94adad57 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/Module.bsl @@ -0,0 +1,2106 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Служебный модуль предназначен для внутреннего использования +// Основное назначение модуля - поддержка процедур подтверждения операций в сервисе "Облачная подпись" +// Реализовано две схемы: самостоятельная и встраиваемая в существующие формы +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность + +// Формирует фоновое задание для запроса сервера в процессе подтверждения +// +// Параметры: +// ОповещениеСледующее - ОписаниеОповещения - обработчик для получения результатов запроса +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОтправкаЗапроса(ОповещениеСледующее, НастройкиПользователя, ДанныеПодтверждения, ПараметрыОперации = Неопределено) Экспорт + + СервисКриптографииDSSСлужебныйКлиент.НачатьЗамерВремени(ДанныеПодтверждения, "ЭтапЦикла"); + + АдресПодключения = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(НастройкиПользователя.Методы, "ДвухфакторнаяАвторизация", ""); + + Если ЗначениеЗаполнено(АдресПодключения) Тогда + ПараметрыЗапроса = СервисКриптографииDSSКлиентСервер.ПодготовитьПараметрыОтправкиЗапроса(НастройкиПользователя, ДанныеПодтверждения); + ПараметрыЗадания = Новый Структура(); + ПараметрыЗадания.Вставить("БазовыйВызов", ДанныеПодтверждения.ТипПодтверждения = "Аутентификация"); + ПараметрыЗадания.Вставить("Подключение", НастройкиПользователя.Подключение); + ПараметрыЗадания.Вставить("АдресПодключения", АдресПодключения); + ПараметрыЗадания.Вставить("ПараметрыЗапроса", ПараметрыЗапроса); + ПараметрыЗадания.Вставить("HTTPМетод", "POST"); + ПараметрыЗадания.Вставить("ТипСодержания", "json"); + ПараметрыЗадания.Вставить("НастройкиПользователя", НастройкиПользователя); + + Если ПараметрыОперации = Неопределено Тогда + ПараметрыОперации = Новый Структура(); + КонецЕсли; + + СинхронныйРежим = ПолучитьПолеСтруктуры(ПараметрыОперации, "СинхронныйРежим"); + Если СинхронныйРежим = Неопределено Тогда + // При подтверждении операций принудительно используем режим фоновых заданий, + // если иное не задано в параметрах вызова + ПараметрыОперации.Вставить("СинхронныйРежим", Ложь); + КонецЕсли; + + НовоеЗадание = СервисКриптографииDSSСлужебныйВызовСервера.ВыполнитьЗапросКСервису(ПараметрыЗадания, ПараметрыОперации); + + СервисКриптографииDSSСлужебныйКлиент.ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, НовоеЗадание); + КонецЕсли; + +КонецПроцедуры + +// Организует цикл ожидания ввода пользователя и ответа сервиса +// +// Параметры: +// ОповещениеСледующее - ОписаниеОповещения - обработчик для получения результатов запроса +// РезультатВыполнения - Структура - ответ сервиса облачной подписи +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// ФормаВладелец - ФормаКлиентскогоПриложения - форма владелец +// +Процедура ОбработатьРезультатЗапроса(ОповещениеСледующее, + РезультатВыполнения, + НастройкиПользователя, + ДанныеПодтверждения, + ФормаВладелец = Неопределено) Экспорт + + НастройкиПользователя = НастройкиПользователя; + ДанныеПодтверждения = ДанныеПодтверждения; + ТекущийЭтап = ДанныеПодтверждения.ЭтапЦикла; + + СервисКриптографииDSSКлиентСервер.РазобратьРезультатЗапроса(РезультатВыполнения, + НастройкиПользователя, + ДанныеПодтверждения, + СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса()); + + Если ДанныеПодтверждения.ЭтапЦикла = "Ошибка" Тогда + ПредставлениеОшибки = НСтр("ru = 'Ошибка при выполнении этапа:'") + " " + ТекущийЭтап + Символы.ПС + + ДанныеПодтверждения.КодОшибки + ": " + ДанныеПодтверждения.Ошибка; + СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ПредставлениеОшибки); + ОткрытьФормуОшибкиПодтверждения(ОповещениеСледующее, ДанныеПодтверждения, Истина, ФормаВладелец); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Ожидание" Тогда + Если ФормаВладелец <> Неопределено Тогда + ОтветСервера = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветСервера.Вставить("НастройкиПользователя", НастройкиПользователя); + ОтветСервера.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервера); + Иначе + ОткрытьФормуПодтвержденияМобильноеПриложение(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя); + КонецЕсли + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "ВводКода" Тогда + Если ФормаВладелец <> Неопределено Тогда + ОтветСервера = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветСервера.Вставить("НастройкиПользователя", НастройкиПользователя); + ОтветСервера.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервера); + Иначе + ОткрытьФормуПодтвержденияКода(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя); + КонецЕсли + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Предупреждение" Тогда + ОтветСервера = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветСервера.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ОтветСервера.Вставить("НастройкиПользователя", НастройкиПользователя); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервера); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Окончание" Тогда + ОтветСервера = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветСервера.МаркерОбновлен = Истина; + ОтветСервера.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ОтветСервера.Вставить("НастройкиПользователя", НастройкиПользователя); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервера); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Отказ" Тогда + ОтветСервера = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветСервера.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ОтветСервера.Вставить("НастройкиПользователя", НастройкиПользователя); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервера); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Выбор" Тогда + Если ДанныеПодтверждения.ДоступныеМетоды.Количество() = 1 Тогда + ДанныеПодтверждения.ВторичнаяАвторизация = ДанныеПодтверждения.ДоступныеМетоды[0]; + КонецЕсли; + + Если ЗначениеЗаполнено(ДанныеПодтверждения.ВторичнаяАвторизация) Тогда + ПараметрыВызова = Новый Структура(); + ПараметрыВызова.Вставить("ОповещениеОЗавершении", ОповещениеСледующее); + ПараметрыВызова.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ПараметрыВызова.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыВызова.Вставить("ФормаВладелец", ФормаВладелец); + ОповещениеСледующее = Новый ОписаниеОповещения("ОтправкаЗапросаПослеВыбораСпособа", ЭтотОбъект, ПараметрыВызова); + ОтправкаЗапроса(ОповещениеСледующее, НастройкиПользователя, ДанныеПодтверждения) + + Иначе + ОткрытьФормуВыбораСпособа(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя, ФормаВладелец); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Формирует представление оставшегося времени +// +// Параметры: +// ВсегоСекунд - Число - остаток времени в секундах +// КороткийФормат - Булево - формировать короткое представление +// +// Возвращаемое значение: +// Строка +// +Функция РазницаФормат(ВсегоСекунд, КороткийФормат = Ложь) Экспорт + + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + Результат = ""; + Часов = Цел(ВсегоСекунд / 3600); + Минут = Цел(ВсегоСекунд / 60); + Секунд = ВсегоСекунд % 60; + + Если КороткийФормат Тогда + Если Часов > 0 Тогда + Результат = Результат + СокрЛП(Часов) + ":"; + КонецЕсли; + + Если Минут > 0 И Часов > 0 Тогда + Результат = Результат + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + ":"; + Иначе + Результат = Результат + Формат(Минут, "ЧЦ=2; ЧН=0") + ":"; + КонецЕсли; + + Результат = Результат + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН="); + + Результат = "(" + Результат + ")"; + + Иначе + Если Часов = 1 Тогда + Результат = Результат + Формат(Часов, "ЧЦ=2; ЧН=00;") + " " + НСтр("ru = 'час'", КодЯзыка) + " "; + ИначеЕсли Часов > 0 Тогда + Результат = Результат + Формат(Часов, "ЧЦ=2; ЧН=00;") + " " + НСтр("ru = 'час.'", КодЯзыка) + " "; + КонецЕсли; + + Если Минут > 0 И Часов > 0 Тогда + Результат = Результат + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=") + " " + НСтр("ru = 'мин.'", КодЯзыка) + " "; + Иначе + Результат = Результат + Формат(Минут, "ЧЦ=2; ЧН=00") + " " + НСтр("ru = 'мин.'", КодЯзыка) + " "; + КонецЕсли; + + Если Минут > 0 Тогда + Результат = Результат + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН=") + " " + НСтр("ru = 'сек.'", КодЯзыка); + Иначе + Результат = Результат + Формат(Секунд, "ЧЦ=2; ЧН=00") + " " + НСтр("ru = 'сек.'", КодЯзыка); + КонецЕсли; + + Результат = НСтр("ru = 'Осталось'", КодЯзыка) + " " + Результат; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует список выбора способа подтверждения в зависимости от состояния цикла подтверждения +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения +// ИмяЭлемента - Строка - имя элемента со списком выбора +// +Процедура ФильтроватьСписокСпособов(КонтекстФормы, ИмяЭлемента = "ПодтверждениеСпособПодтверждения") Экспорт + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + + ЭлементФормы = КонтекстФормы.Элементы[ИмяЭлемента]; + СписокМетодов = ДанныеПодтверждения.СписокМетодов; + ЕстьОфлайн = ДанныеПодтверждения.ГрафическийКод <> Неопределено; + + СписокВыбора = ЭлементФормы.СписокВыбора; + СписокВыбора.Очистить(); + + Если СписокМетодов.Количество() = 0 Тогда + Для каждого СтрокаКлюча Из ДанныеПодтверждения.ДоступныеМетоды Цикл + СписокВыбора.Добавить(СтрокаКлюча, ПолучитьПредставлениеСпособа(СтрокаКлюча, ДанныеПодтверждения, НастройкиПользователя)); + КонецЦикла; + Иначе + Для каждого СтрокаКлюча Из СписокМетодов Цикл + Если ДанныеПодтверждения.ДоступныеМетоды.Найти(СтрокаКлюча) <> Неопределено Тогда + СписокВыбора.Добавить(СтрокаКлюча, ПолучитьПредставлениеСпособа(СтрокаКлюча, ДанныеПодтверждения, НастройкиПользователя)); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ЕстьОфлайн Тогда + СписокВыбора.Добавить(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение"), + ПолучитьПредставлениеСпособа(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение"), ДанныеПодтверждения, НастройкиПользователя)); + КонецЕсли; + + СформироватьПодсказкуСпособовВыбора(КонтекстФормы, ИмяЭлемента); + +КонецПроцедуры + +// Проверяет наличие запущенного цикла подтверждения +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения +// ИсключитьИнициализацию - Булево +// +// Возвращаемое значение: +// Булево - если Истина, то процесс подтверждения не окончен +// +Функция ПроверитьЗапущенныйЦиклПодтверждения(КонтекстФормы, ИсключитьИнициализацию = Ложь) Экспорт + + Результат = Истина; + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + Если (ДанныеПодтверждения.ЭтапЦикла = "Инициализация" И НЕ ИсключитьИнициализацию) + ИЛИ ДанныеПодтверждения.ЭтапЦикла = "Окончание" + ИЛИ ДанныеПодтверждения.ЭтапЦикла = "Ошибка" + Тогда + Результат = Ложь; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Подключает обработку ожидания для формы подтверждения. +// Предварительно проверяя состояние формы и объекта подтверждения. +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения +// ВстроенноеПодтверждение - Булево +// +Процедура ПодключитьОжидание(КонтекстФормы, ВстроенноеПодтверждение = Ложь) Экспорт + + Если ПроверитьЗапущенныйЦиклПодтверждения(КонтекстФормы, ВстроенноеПодтверждение) + И КонтекстФормы.Открыта() Тогда + КонтекстФормы.ПодключитьОбработчикОжидания("Подключаемый_ПодтверждениеОбработчикОжидания", 1, Истина); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +#Область СамостоятельноеПодтверждение + +// Служебная процедура обработки события выбора навигационной ссылки со списком документов +// +Процедура ОбработкаНавигационнойСсылкиДокументов(НавигационнаяСсылка, СтандартнаяОбработка, ФормаВладелец = Неопределено) Экспорт + + Если Сред(НавигационнаяСсылка, 1, 5) = "Всего" Тогда + СтандартнаяОбработка = Ложь; + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("СписокДокументов", ФормаВладелец.ДанныеДокументов.СписокДокументов); + ОткрытьФормуСпискаФайлов(Неопределено, ПараметрыФормы, ФормаВладелец); + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура для оформления элемента формы отображающий оставшееся время +// +// Параметры: +// ЭлементФормы - ГруппаФормы +// ВремяИстекло - Булево +// +Процедура ОформитьВремяИстекло(ЭлементФормы, ВремяИстекло = Истина) Экспорт + + ПустойЦвет = Новый Цвет; + ЦветФона = ?(ВремяИстекло, WebЦвета.НавахоБелый, ПустойЦвет); + ЦветШрифта = ?(НЕ ВремяИстекло, WebЦвета.Серый, ПустойЦвет); + ЭлементФормы.ЦветФона = ЦветФона; + + Если ЭлементФормы.ПодчиненныеЭлементы.Найти("Осталось") <> Неопределено Тогда + ЭлементФормы.ПодчиненныеЭлементы.Осталось.ЦветТекста = ЦветШрифта; + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура обработки события смены способа подтверждения из списка выбора +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - содержит реквизиты: +// * ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// * СпособПодтверждения - ПеречислениеСсылка.СпособыАвторизацииDSS +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Процедура ПриИзмененииСпособаПодтверждения(КонтекстФормы) Экспорт + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + СпособПодтверждения = КонтекстФормы.СпособПодтверждения; + + Если СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + ОповещениеСледующее = КонтекстФормы.ОписаниеОповещенияОЗакрытии; + КонтекстФормы.ОписаниеОповещенияОЗакрытии = Неопределено; + ВыполнитьОповещениеФормы(КонтекстФормы, Неопределено, "ПодтверждениеЗакрытьФорму"); + ДанныеПодтверждения.ВторичнаяАвторизация = СпособПодтверждения; + ДанныеПодтверждения.ЭтапЦикла = "Ожидание"; + ОткрытьФормуОфлайнПодтверждения(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя); + + ИначеЕсли СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение") + И ДанныеПодтверждения.ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + ОповещениеСледующее = КонтекстФормы.ОписаниеОповещенияОЗакрытии; + КонтекстФормы.ОписаниеОповещенияОЗакрытии = Неопределено; + ВыполнитьОповещениеФормы(КонтекстФормы, Неопределено, "ПодтверждениеЗакрытьФорму"); + ДанныеПодтверждения.ВторичнаяАвторизация = СпособПодтверждения; + ДанныеПодтверждения.ЭтапЦикла = "Ожидание"; + ОткрытьФормуПодтвержденияМобильноеПриложение(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя); + + ИначеЕсли СпособПодтверждения <> ДанныеПодтверждения.ВторичнаяАвторизация Тогда + Если ДанныеПодтверждения.ЭтапЦикла <> "Выбор" Тогда + ДанныеПодтверждения.ЭтапЦикла = "Начало"; + КонецЕсли; + ДанныеПодтверждения.Идентификатор = ДанныеПодтверждения.ИдентификаторТранзакции; + ДанныеПодтверждения.ВторичнаяАвторизация = СпособПодтверждения; + + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветПользователя.Вставить("НастройкиПользователя", НастройкиПользователя); + ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ВыполнитьОповещениеФормы(КонтекстФормы, ОтветПользователя, "ПодтверждениеЗакрытьФорму"); + + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура для асинхронной обработки результата ответа сервиса после выбора способа подтверждения +// +Процедура ОтправкаЗапросаПослеВыбораСпособа(РезультатВызова, ДополнительныеПараметры) Экспорт + + НастройкиПользователя = ДополнительныеПараметры.НастройкиПользователя; + ДанныеПодтверждения = ДополнительныеПараметры.ДанныеПодтверждения; + ОповещениеСледующее = ДополнительныеПараметры.ОповещениеОЗавершении; + ФормаВладелец = ДополнительныеПараметры.ФормаВладелец; + РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(РезультатВызова, ДанныеПодтверждения); + + ОбработатьРезультатЗапроса( + ОповещениеСледующее, + РезультатВыполнения, + НастройкиПользователя, + ДанныеПодтверждения, + ФормаВладелец); + +КонецПроцедуры + +#КонецОбласти + +#Область ВстроенноеПодтверждение + +#Область ПодключаемыеОбработчики + +// Служебная, вызывается при событии нажатия добавленной кнопки +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения +// ПолеФормы - ПолеФормы +// ДанныеВыбора - СписокЗначений +// - Неопределено +// СтандартнаяОбработка- Булево +// +Процедура ПодтверждениеНачалоВыбора(КонтекстФормы, ПолеФормы, ДанныеВыбора, СтандартнаяОбработка) Экспорт + + СтандартнаяОбработка = Ложь; + ИмяЭлемента = ПолеФормы.Имя; + + Если ИмяЭлемента = "ПодтверждениеПредставлениеСертификата" Тогда + ОписаниеСледующее = Новый ОписаниеОповещения("ВыбратьСертификатАвторизацииПослеПолучения", ЭтотОбъект, КонтекстФормы); + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(); + СервисКриптографииDSSКлиент.ЗагрузитьДанныеИзФайла(ОписаниеСледующее, ".pfx", , Истина, ПараметрыОперации); + КонецЕсли; + +КонецПроцедуры + +// Служебная, вызывается при событии нажатия добавленной кнопки +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения: +// * ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// Команда - КомандаФормы +// ОписаниеДанных - Структура +// ЗначениеПароля - Строка +// +// Возвращаемое значение: +// Булево +// +Функция ПодтверждениеОбработкаКоманды(КонтекстФормы, Команда, ОписаниеДанных, ЗначениеПароля) Экспорт + + ОбновитьФорму = Ложь; + ИмяКоманды = Команда.Имя; + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + + Если ИмяКоманды = "ПодтверждениеОК" Тогда + ДанныеПодтверждения.ЭтапЦикла = "ВводКодаПользователем"; + ДанныеПодтверждения.КодПользователя = КонтекстФормы.КодПодтверждения; + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ОписаниеДанных, ЗначениеПароля); + УправлениеЭлементамиОбщее(КонтекстФормы, 1); + + ИначеЕсли ИмяКоманды = "ПодтверждениеПовторить" Тогда + ДанныеПодтверждения.Идентификатор = ДанныеПодтверждения.ИдентификаторТранзакции; // Строка + ДанныеПодтверждения.ЭтапЦикла = "Начало"; + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ОписаниеДанных, ЗначениеПароля); + УправлениеЭлементамиОбщее(КонтекстФормы, 2); + + ИначеЕсли ИмяКоманды = "ПодтверждениеАвторизация" Тогда + ПараметрыОперации = Новый Структура("КонтекстФормы", КонтекстФормы); + ОбработкаСледующая = Новый ОписаниеОповещения("ПодтверждениеРезультатАвторизации", ЭтотОбъект, ПараметрыОперации); + СервисКриптографииDSSКлиент.ПроверкаАутентификацииПользователя(ОбработкаСледующая, КонтекстФормы.НастройкиПользователя.Ссылка); + + ИначеЕсли ИмяКоманды = "ПодтверждениеПомощь" Тогда + КонтекстФормы.ОткрытьСправкуФормы(); + + КонецЕсли; + + Возврат ОбновитьФорму; + +КонецФункции + +// Служебная, вызывается при событии изменении пользователем реквизитов формы (не только добавленных) +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - содержит реквизиты: +// * ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// * ПарольЛогина - Строка +// * СпособПодтверждения - ПеречислениеСсылка.СпособыАвторизацииDSS +// ПолеФормы - ПолеФормы +// ОписаниеДанных - Структура +// ЗначениеПароля - Строка +// +// Возвращаемое значение: +// Булево +// +Функция ПодтверждениеПриИзменении(КонтекстФормы, ПолеФормы, ОписаниеДанных, ЗначениеПароля) Экспорт + + ИмяЭлемента = ПолеФормы.Имя; + ОбновитьФорму = Ложь; + АктивизироватьПоле = Ложь; + + Если ИмяЭлемента = "ПодтверждениеПароль" Тогда + КонтекстФормы.ПарольЛогина = СервисКриптографииDSSКлиентСервер.ЗакрытьСекретПользователя(КонтекстФормы.ПарольЛогина, КонтекстФормы.НастройкиПользователя.АвторизованныйПользователь); + + ИначеЕсли ИмяЭлемента = "Сертификат" Тогда + ПодключитьОжидание(КонтекстФормы, Истина); + ОбновитьФорму = Истина; + + ИначеЕсли ИмяЭлемента = "ПодтверждениеСпособПодтверждения" Тогда + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + ОбновитьФорму = Истина; + + Если ДанныеПодтверждения.ЭтапЦикла = "Инициализация" Тогда + ОбновитьФорму = НЕ ЗначениеЗаполнено(ДанныеПодтверждения.ВторичнаяАвторизация); + КонтекстФормы.ДанныеПодтверждения.ВторичнаяАвторизация = КонтекстФормы.СпособПодтверждения; + + ИначеЕсли КонтекстФормы.СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + КонтекстФормы.ДанныеПодтверждения.ВторичнаяАвторизация = КонтекстФормы.СпособПодтверждения; + КонтекстФормы.ДанныеПодтверждения.ЭтапЦикла = "ВводКода"; + КонтекстФормы.ГрафическийКод = ПоместитьВоВременноеХранилище(ДанныеПодтверждения.ГрафическийКод, КонтекстФормы.УникальныйИдентификатор); + АктивизироватьПоле = Истина; + + ИначеЕсли КонтекстФормы.СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение") + И ДанныеПодтверждения.ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + КонтекстФормы.ДанныеПодтверждения.ВторичнаяАвторизация = КонтекстФормы.СпособПодтверждения; + КонтекстФормы.ДанныеПодтверждения.ЭтапЦикла = "Ожидание"; + + Иначе + Если КонтекстФормы.ДанныеПодтверждения.ЭтапЦикла <> "Выбор" Тогда + КонтекстФормы.ДанныеПодтверждения.ЭтапЦикла = "Начало"; + КонтекстФормы.ОжидатьВыполнения = Ложь; + КонецЕсли; + ДанныеПодтверждения.Идентификатор = ДанныеПодтверждения.ИдентификаторТранзакции; + ДанныеПодтверждения.ВторичнаяАвторизация = КонтекстФормы.СпособПодтверждения; + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ОписаниеДанных, ЗначениеПароля); + + КонецЕсли; + + ИначеЕсли ИмяЭлемента = "ПодтверждениеЗапомнитьПарольЛогина" Тогда + КонтекстФормы.НастройкиПользователя.ЗапоминатьПароли = КонтекстФормы.ЗапомнитьПарольЛогина; + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьНастройкиПользователя(КонтекстФормы.НастройкиПользователя, КонтекстФормы.НастройкиПользователя); + + КонецЕсли; + + Если ОбновитьФорму Тогда + УправлениеЭлементамиОбщее(КонтекстФормы, 3); + КонецЕсли; + + Если АктивизироватьПоле Тогда + АктивизироватьПолеФормыПодтверждения(КонтекстФормы, "Выбор"); + КонецЕсли; + + Возврат ОбновитьФорму; + +КонецФункции + +// Служебная, вызывается при событии выбора навигационной ссылки +// +// Возвращаемое значение: +// Булево +// +Функция ПодтверждениеОбработкаНавигационнойСсылки(КонтекстФормы, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) Экспорт + + ОбновитьФорму = Ложь; + + Возврат ОбновитьФорму; + +КонецФункции + +// Служебная, вызывается событии подключенной обработки ожидания +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - содержит реквизиты: +// * ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// * СпособПодтверждения - ПеречислениеСсылка.СпособыАвторизацииDSS +// * ДанныеСертификата - Структура +// * ПодтверждениеТипОперации - Строка +// * ОжидатьВыполнения - Булево +// ОписаниеДанных - Структура +// ЗначениеПароля - Строка +// +Процедура ПодтверждениеОбработкаОжидания(КонтекстФормы, ОписаниеДанных, ЗначениеПароля) Экспорт + + ОблачныйСертификат = КонтекстФормы.ДанныеСертификата.Облачный; + + Если НЕ ОблачныйСертификат Тогда + Возврат; + КонецЕсли; + + АктуальноеВремя = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + ТипОперации = КонтекстФормы.ПодтверждениеТипОперации; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + + Если ДанныеПодтверждения.ОбновитьРазмерыФормы Тогда + КонтекстФормы.ДанныеПодтверждения.ОбновитьРазмерыФормы = Ложь; + АктивизироватьПолеФормыПодтверждения(КонтекстФормы, "Инициализация"); + КонецЕсли; + + ПроверитьСервер = ДанныеПодтверждения.ЭтапЦикла = "Ожидание" + ИЛИ (ДанныеПодтверждения.ЭтапЦикла = "ВводКода" + И ДанныеПодтверждения.ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение")); + + Разница = 0; + Если ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Разница = ДанныеПодтверждения.СрокДействия - АктуальноеВремя; + КонецЕсли; + + МобильныйКлиент = Ложь; + #Если МобильныйКлиент Тогда + МобильныйКлиент = Истина; + #КонецЕсли + + Если ДанныеПодтверждения.ЭтапЦикла = "ВводКода" И НЕ МобильныйКлиент Тогда + ЭлементыФормы = КонтекстФормы.Элементы; + ЭлементыФормы.ПодтверждениеОК.Заголовок = ПодтверждениеОтобразитьОсталось(ДанныеПодтверждения, ЭлементыФормы.ПодтверждениеОК.Заголовок); + КонецЕсли; + + Разница = АктуальноеВремя - ДанныеПодтверждения.СрокОпроса; + Если ПроверитьСервер И Разница >= ДанныеПодтверждения.ПериодОпроса Тогда + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ОписаниеДанных, ЗначениеПароля, Истина); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Начало" И НЕ КонтекстФормы.ОжидатьВыполнения Тогда + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ОписаниеДанных, ЗначениеПароля); + УправлениеЭлементамиОбщее(КонтекстФормы, 4); + КонецЕсли; + + КлючДействия = КлючДействияОперации(ТипОперации, НастройкиПользователя, ДанныеПодтверждения); + + Если КлючДействия.Подтверждать Тогда + ПодключитьОжидание(КонтекстФормы, Истина); + КонецЕсли; + +КонецПроцедуры + +// Служебная, вызывается при событии открытия формы +// +Процедура ПодтверждениеПриОткрытии(КонтекстФормы, Отказ = Ложь, ПарольУстановлен = Ложь, ОписаниеДанных = Неопределено) Экспорт + + Если НЕ Отказ Тогда + ТипОперации = КонтекстФормы.ПодтверждениеТипОперации; + + ОблачныйСертификат = КонтекстФормы.ДанныеСертификата.Облачный; + КонтекстФормы.ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПарольВПамяти = ПарольУстановлен; + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПакетнаяОперация = ПроверитьПакетнуюОперацию(ТипОперации, ОписаниеДанных, ДанныеПодтверждения); + УправлениеЭлементамиОбщее(КонтекстФормы, 5); + Если ТипОперации <> "Проверка" Тогда + ФильтроватьСписокСпособов(КонтекстФормы); + Если КонтекстФормы.Открыта() И ОблачныйСертификат Тогда + ПодключитьОжидание(КонтекстФормы, Истина); + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Служебная, асинхронное продолжение обработки в ПодтверждениеОбработкаКоманды. +// Применяется в случае отдельной авторизации пользователей: двухфакторная и веб-форма. +// +Процедура ПодтверждениеРезультатАвторизации(РезультатВыполнения, ВходящийКонтекст) Экспорт + + КонтекстФормы = ВходящийКонтекст.КонтекстФормы; + + Если ПроверитьКонтекстФормы(КонтекстФормы) И РезультатВыполнения.Выполнено Тогда + КонтекстФормы.НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + УправлениеЭлементамиОбщее(КонтекстФормы, 6); + ВыполнитьОповещениеФормы(КонтекстФормы, Истина, "ПодтверждениеАвторизация"); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Прочее + +// Служебная, проверяет необходимость интерактивного взаимодействия с пользователем. +// В этом случае форма отображается пользователю, вне зависимости от параметров операции. +// +// Возвращаемое значение: +// Булево +// +Функция ОблачнаяПодписьТребуетПодтверждения(КонтекстФормы, УчетАвторизации = Ложь) Экспорт + + Результат = Ложь; + + ДанныеСертификата = КонтекстФормы.ДанныеСертификата; + ТипОперации = КонтекстФормы.ПодтверждениеТипОперации; + + Если ДанныеСертификата.Облачный Тогда + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + ДатаСеанса = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + Авторизован = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса); + КлючДействия = КлючДействияОперации(ТипОперации, НастройкиПользователя, ДанныеПодтверждения); + ТребуетПинКод = ТипОперации <> "Шифрование"; + + Если Авторизован И ТипОперации <> "Шифрование" Тогда + ТекущийСертификат = ДанныеПодтверждения.Сертификат; + ТребуетПинКод = ТекущийСертификат.ТребуетсяПинКод И НЕ ЗначениеЗаполнено(ТекущийСертификат.ПинКод); + КонецЕсли; + + Если УчетАвторизации Тогда + Результат = Авторизован И КлючДействия.Подтверждать; + Иначе + Результат = ТребуетПинКод ИЛИ НЕ Авторизован ИЛИ КлючДействия.Подтверждать; + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная, отображает ошибку, в результате выбора сертификата +// +Процедура ПроверитьНаОшибкуСертификата(КонтекстФормы) Экспорт + + Если ЗначениеЗаполнено(КонтекстФормы.Сертификат) + И ЗначениеЗаполнено(КонтекстФормы.ДанныеСертификата) Тогда + + Если ЗначениеЗаполнено(КонтекстФормы.ДанныеСертификата.Ошибка) Тогда + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, КонтекстФормы.ДанныеСертификата.Ошибка); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Служебная, общая процедура позволяющая проверить тип операции по типу сертификата +// +// Возвращаемое значение: +// Булево +// +Функция ЭтоОперацияОблачнойПодписи(КонтекстФормы) Экспорт + + ДанныеСертификата = КонтекстФормы.ДанныеСертификата; + Результат = ДанныеСертификата.Облачный; + + Возврат Результат; + +КонецФункции + +// Служебная, проверяет возможность отправки запроса на сервис облачной подписи в момент открытия формы. +// +// Возвращаемое значение: +// Булево +// +Функция ПроверкаВыполненияНачальнойОперации(КонтекстФормы, БезПодтверждения = Неопределено) Экспорт + + Результат = Ложь; + + Если ЭтоОперацияОблачнойПодписи(КонтекстФормы) Тогда + Если БезПодтверждения = Неопределено Тогда + Результат = ОблачнаяПодписьТребуетПодтверждения(КонтекстФормы); + ИначеЕсли БезПодтверждения Тогда + Результат = ОблачнаяПодписьТребуетПодтверждения(КонтекстФормы, Истина); + Иначе + Результат = Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная, используется при интерактивном нажатии кнопки основного действия. +// В случае обнаружения ошибок выдает сообщения о ней. +// Проверяется наличие пин-кода и способа подтверждения. +// +// Возвращаемое значение: +// Булево +// +Функция ПроверкаПередВыполнениемОперации(КонтекстФормы, ЗначениеПароля) Экспорт + + Результат = Истина; + + Если ЭтоОперацияОблачнойПодписи(КонтекстФормы) Тогда + ТекстОшибки = ""; + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + + ТипОперации = КонтекстФормы.ПодтверждениеТипОперации; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + СертификатАвторизации = НастройкиПользователя.СертификатАвторизации ИЛИ НастройкиПользователя.ПервичнаяАутентификация <> ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации"); + ДатаСеанса = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + Авторизован = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса); + КлючДействия = КлючДействияОперации(ТипОперации, НастройкиПользователя, ДанныеПодтверждения); + ТребуетПинКод = ТипОперации <> "Шифрование"; + ВыбранСпособ = Истина; + + Если ТипОперации <> "Шифрование" И ТипОперации <> "Проверка" Тогда + ВыбранСпособ = ЗначениеЗаполнено(ДанныеПодтверждения.ВторичнаяАвторизация); + КонецЕсли; + + Если Авторизован И ТипОперации <> "Шифрование" Тогда + ТекущийСертификат = ДанныеПодтверждения.Сертификат; + ТребуетПинКод = ТекущийСертификат.ТребуетсяПинКод И НЕ ЗначениеЗаполнено(ЗначениеПароля); + КонецЕсли; + + Если КлючДействия.Подтверждать И НЕ ВыбранСпособ Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Не указан способ подтверждения'", КодЯзыка); + КонецЕсли; + + Если ТребуетПинКод И Авторизован Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Не указан пин-код к закрытому ключу сертификата'", КодЯзыка); + КонецЕсли; + + Если НЕ Авторизован + И НЕ СертификатАвторизации + И НЕ ЗначениеЗаполнено(КонтекстФормы.ПодтверждениеДанныеСертификата) Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Необходимо загрузить сертификат авторизации.'", КодЯзыка); + КонецЕсли; + + Если НЕ ПустаяСтрока(ТекстОшибки) Тогда + Результат = Ложь; + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, СокрЛП(ТекстОшибки)); + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная, формирует параметры запроса для отправки на сервис облачной подписи, и по необходимости +// вторичной авторизации и начало цикла подтверждения. +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - содержит реквизиты: +// * ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// * ПарольЛогина - Строка +// * СпособПодтверждения - ПеречислениеСсылка.СпособыАвторизацииDSS +// * ДанныеСертификата - Структура +// * ПодтверждениеТипОперации - Строка +// * ОжидатьВыполнения - Булево +// * КодПодтверждения - Строка +// ОписаниеДанных - Структура +// ЗначениеПароля - Строка +// Индекс - Число - элемент данных для обработки +// +Процедура ВыполнитьНачальнуюОперациюСервиса( + КонтекстФормы, + ОписаниеДанных = Неопределено, + ЗначениеПароля = "", + Индекс = 0) Экспорт + + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + ТипОперации = КонтекстФормы.ПодтверждениеТипОперации; + КонтекстФормы.КодПодтверждения = ""; + ПарольПользователя = Неопределено; + Если ТипОперации <> "Проверка" Тогда + Если ЗначениеЗаполнено(КонтекстФормы.ПарольЛогина) Тогда + ПарольПользователя = СервисКриптографииDSSКлиентСервер.ОбъектПароля(КонтекстФормы.ПарольЛогина, 1); + Иначе + ПарольПользователя = СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(""); + КонецЕсли; + КонецЕсли; + ДатаСеанса = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + Авторизован = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса); + + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("КонтекстФормы", КонтекстФормы); + ПараметрыОперации.Вставить("ТипОперации", ТипОперации); + ПараметрыОперации.Вставить("ОписаниеДанных", ОписаниеДанных); + ПараметрыОперации.Вставить("ЗначениеПароля", ЗначениеПароля); + ПараметрыОперации.Вставить("Индекс", Индекс); + + ОповещениеСледующее = Новый ОписаниеОповещения("ВыполнитьНачальнуюОперациюСервисаПослеАвторизации", ЭтотОбъект, ПараметрыОперации); + + Если НЕ Авторизован + И ТипОперации <> "Аутентификация" + И НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") Тогда + ПараметрыОперации = Новый Структура; + Если ПарольПользователя <> Неопределено Тогда + ПараметрыОперации.Вставить("ПарольПользователя", ПарольПользователя); + КонецЕсли; + СервисКриптографииDSSКлиент.ПроверкаАутентификацииПользователя(ОповещениеСледующее, НастройкиПользователя.Ссылка, ПараметрыОперации); + + Иначе + РезультатВыполнения = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, РезультатВыполнения); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Служебная процедура открывает форму для вывода ошибки возникшей в процессе подтверждения +// +Процедура ОткрытьФормуОшибкиПодтверждения(ОповещениеСледующее, + ДанныеПодтверждения, + РежимПовторения = Истина, + ФормаВладелец = Неопределено) + + СервисКриптографииDSSСлужебныйВызовСервера.НачальныеНастройкиФормы("ПодтверждениеОперацииОшибка"); + + ПараметрыФормы = Новый Структура("ОписаниеОшибки"); + ПараметрыФормы.Вставить("ОписаниеОшибки", ДанныеПодтверждения.Ошибка); + ПараметрыФормы.Вставить("РежимПовторения", РежимПовторения); + ПараметрыФормы.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + + ОповещениеОЗавершении = СервисКриптографииDSSСлужебныйКлиент.ОбъектОповещенияОбработкиФормы(ОповещениеСледующее); + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.ПодтверждениеОперацииОшибка", ПараметрыФормы, ФормаВладелец, , , , ОповещениеОЗавершении); + +КонецПроцедуры + +// Служебная процедура открывает форму для ввода одноразового пароля, для случаев SMS и EMAIL +// +Процедура ОткрытьФормуПодтвержденияКода(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя) + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("ЗаголовокФормы", ДанныеПодтверждения.Заголовок); + ПараметрыФормы.Вставить("ДанныеДокументов", ДанныеПодтверждения.ДанныеДокументов); + ПараметрыФормы.Вставить("Сертификат", ДанныеПодтверждения.Сертификат); + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФормы.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + + ОповещениеОЗавершении = СервисКриптографииDSSСлужебныйКлиент.ОбъектОповещенияОбработкиФормы(ОповещениеСледующее); + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.ПодтверждениеОперацииКодПодтверждения", ПараметрыФормы, , , , , ОповещениеОЗавершении); + +КонецПроцедуры + +// Служебная процедура открывает форму для ожидания результата подтверждения от сервиса облачной подписи, +// для случаев мобильных приложений. +// +Процедура ОткрытьФормуПодтвержденияМобильноеПриложение(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя) + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("ЗаголовокФормы", ДанныеПодтверждения.Заголовок); + ПараметрыФормы.Вставить("ДанныеДокументов", ДанныеПодтверждения.ДанныеДокументов); + ПараметрыФормы.Вставить("Сертификат", ДанныеПодтверждения.Сертификат); + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФормы.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + + ОповещениеОЗавершении = СервисКриптографииDSSСлужебныйКлиент.ОбъектОповещенияОбработкиФормы(ОповещениеСледующее); + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.ПодтверждениеОперацииМобильноеПриложение", ПараметрыФормы, , , , , ОповещениеОЗавершении); + +КонецПроцедуры + +// Служебная процедура открывает форму выбора способа подтверждения. +// Вызывается в начале подтверждения, если учетная запись не содержит соответствующей настройки. +// +Процедура ОткрытьФормуВыбораСпособа(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя, ФормаВладелец = Неопределено) + + СписокСпособов = Новый Массив; + Для каждого СтрокаКлюча Из ДанныеПодтверждения.СписокМетодов Цикл + СписокСпособов.Добавить(СтрокаКлюча); + КонецЦикла; + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("СписокСпособов", СписокСпособов); + ПараметрыФормы.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + + ОповещениеОЗавершении = СервисКриптографииDSSСлужебныйКлиент.ОбъектОповещенияОбработкиФормы(ОповещениеСледующее); + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.ПодтверждениеОперацииВыборСпособа", ПараметрыФормы, ФормаВладелец, , , , ОповещениеОЗавершении); + +КонецПроцедуры + +// Служебная процедура открывает форму офлайн подтверждения с помощью мобильного приложения +// +// Параметры: +// ОповещениеСледующее - ОписаниеОповещения +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Процедура ОткрытьФормуОфлайнПодтверждения(ОповещениеСледующее, ДанныеПодтверждения, НастройкиПользователя) + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("ЗаголовокФормы", ДанныеПодтверждения.Заголовок); // строка + ПараметрыФормы.Вставить("ДанныеДокументов", ДанныеПодтверждения.ДанныеДокументов); + ПараметрыФормы.Вставить("Сертификат", ДанныеПодтверждения.Сертификат); + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФормы.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + + ОповещениеОЗавершении = СервисКриптографииDSSСлужебныйКлиент.ОбъектОповещенияОбработкиФормы(ОповещениеСледующее); + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.ПодтверждениеОперацииОфлайн", ПараметрыФормы, , , , , ОповещениеОЗавершении); + +КонецПроцедуры + +// Служебная процедура открывает форму списка документов для возможности их просмотра +// +Процедура ОткрытьФормуСпискаФайлов(ОповещениеСледующее, ПараметрыФормы, ВладелецФормы) + + ОповещениеОЗавершении = СервисКриптографииDSSСлужебныйКлиент.ОбъектОповещенияОбработкиФормы(ОповещениеСледующее); + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.ПодтверждениеОперацииВыборНавигационнойСсылки", ПараметрыФормы, , , , , ОповещениеОЗавершении); + +КонецПроцедуры + +// Функция определяет зарегистрированный адрес электронной почты учетной записи и формирует его представление +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// КодЯзыка - Строка - код языка вычисленный в контексте вызова +// +// Возвращаемое значение: +// Строка +// +Функция СодержаниеПредставленияТелефона(НастройкиПользователя, КодЯзыка) + + Если ЗначениеЗаполнено(НастройкиПользователя.Телефон) Тогда + Результат = НСтр("ru = 'Одноразовый пароль на'", КодЯзыка) + " " + + СервисКриптографииDSSКлиентСервер.ПредставлениеТелефона(НастройкиПользователя.Телефон); + Иначе + Результат = НСтр("ru = 'Одноразовый пароль на мобильный телефон'", КодЯзыка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция определяет зарегистрированный телефон учетной записи и формирует его представление +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// КодЯзыка - Строка - код языка вычисленный в контексте вызова +// +// Возвращаемое значение: +// Строка +// +Функция СодержаниеПредставленияПочты(НастройкиПользователя, КодЯзыка) + + Если ЗначениеЗаполнено(НастройкиПользователя.ЭлектроннаяПочта) Тогда + Результат = НСтр("ru = 'Одноразовый пароль на электронную почту'", КодЯзыка) + " " + + СервисКриптографииDSSКлиентСервер.ПредставлениеАдресаПочты(НастройкиПользователя.ЭлектроннаяПочта); + Иначе + Результат = НСтр("ru = 'Одноразовый пароль на электронную почту'", КодЯзыка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Продолжение функции при начале выбора поля сертификата авторизации +// +Процедура ВыбратьСертификатАвторизацииПослеПолучения(РезультатВызова, КонтекстФормы) Экспорт + + Если РезультатВызова.Выполнено Тогда + КонтекстФормы.ПодтверждениеДанныеСертификата = РезультатВызова.Результат.ДанныеФайла; + КонтекстФормы.ПодтверждениеПредставлениеСертификата = НСтр("ru = 'Сертификат загружен'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()); + КонецЕсли; + +КонецПроцедуры + +// Продолжение функции ВыполнитьНачальнуюОперациюСервиса +// +// Параметры: +// РезультатВызова - Структура +// ВходящийКонтекст - Структура: +// * Индекс - Число +// * ЗначениеПароля - Строка +// * ОписаниеДанных - Структура +// * КонтекстФормы - ФормаКлиентскогоПриложения +// +Процедура ВыполнитьНачальнуюОперациюСервисаПослеАвторизации(РезультатВызова, ВходящийКонтекст) Экспорт + + КонтекстФормы = ВходящийКонтекст.КонтекстФормы; + + Если РезультатВызова.Выполнено Тогда + + Если РезультатВызова.МаркерОбновлен Тогда + КонтекстФормы.НастройкиПользователя = РезультатВызова.НастройкиПользователя; + КонецЕсли; + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + ТипОперации = КонтекстФормы.ПодтверждениеТипОперации; + НаборДанных = ПолучитьПолеСтруктуры(ВходящийКонтекст.ОписаниеДанных, "НаборДанных", Неопределено); + ПакетнаяОперация = ПроверитьПакетнуюОперацию(ТипОперации, ВходящийКонтекст.ОписаниеДанных, ДанныеПодтверждения); + ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПакетнаяОперация = ПакетнаяОперация; + + Если ПакетнаяОперация Тогда + ПредставлениеДанных = Новый Структура(); + ПредставлениеДанных.Вставить("Расширение", ""); + ПредставлениеДанных.Вставить("Представление", НСтр("ru = 'Список документов'", ДанныеПодтверждения.КодЯзыка)); + ПредставлениеДанных.Вставить("Данные", Новый Массив); + + ВходящийКонтекст.Вставить("ПредставлениеДанных", ПредставлениеДанных); + ВыполнитьНачальнуюОперациюСервисаПодготовитьДанные(0, ВходящийКонтекст); + + Иначе + Если НаборДанных <> Неопределено Тогда + ТекущийЭлементНабораДанных = НаборДанных[ВходящийКонтекст.Индекс]; + Иначе + ТекущийЭлементНабораДанных = ВходящийКонтекст.ОписаниеДанных; + КонецЕсли; + ПредставлениеДанных = ПолучитьПредставлениеДанных(ТекущийЭлементНабораДанных, ВходящийКонтекст.ОписаниеДанных); + ВыполнитьНачальнуюОперациюСервисаПослеПодготовкиДанных(ПредставлениеДанных, ВходящийКонтекст); + + КонецЕсли; + + Иначе + КонтекстФормы.ДанныеПодтверждения.ЭтапЦикла = "Ошибка"; + ПоказатьОшибкуФормыПодтверждения(КонтекстФормы, + КонтекстФормы.ДанныеПодтверждения, + РезультатВызова.Ошибка, + ВходящийКонтекст.ОписаниеДанных, + ВходящийКонтекст.ЗначениеПароля); + КонецЕсли; + +КонецПроцедуры + +// Определяет вид подписания: пакетное или одиночный документ +// +// Параметры: +// ТипОперации - Строка - тип операции для которой предназначена форма +// ОписаниеДанных - Структура - служебные данные формы подписания +// ДанныеПодтверждения - Структура - описывает данные цикла подтверждения +// +// Возвращаемое значение: +// Булево - Истина, если это пакетная операция +// +Функция ПроверитьПакетнуюОперацию(ТипОперации, ОписаниеДанных, ДанныеПодтверждения) + + ПакетнаяОперация = Ложь; + + НаборДанных = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ОписаниеДанных, "НаборДанных", Неопределено); + Если НаборДанных <> Неопределено Тогда + ПакетнаяОперация = ТипОперации = "Подписание"; + КонецЕсли; + + ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПакетнаяОперация = ПакетнаяОперация; + + Возврат ПакетнаяОперация; + +КонецФункции + +// Функция формирования представления элемента формы для выбранного способа подтверждения операции +// +// Параметры: +// ВторичнаяАвторизация - ПеречислениеСсылка - выбранный способ подтверждения +// ДанныеПодтверждения - Структура - описывает данные цикла подтверждения +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +// Возвращаемое значение: +// - Строка +// - ФорматированнаяСтрока +// +Функция ПолучитьПредставлениеСпособа(ВторичнаяАвторизация, ДанныеПодтверждения, НастройкиПользователя) + + КодЯзыка = ДанныеПодтверждения.КодЯзыка; + + Результат = ""; + + Если ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС") Тогда + Результат = СтроковыеФункцииКлиент.ФорматированнаяСтрока(СодержаниеПредставленияТелефона(НастройкиПользователя, КодЯзыка)); + + ИначеЕсли ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта") Тогда + Результат = СтроковыеФункцииКлиент.ФорматированнаяСтрока(СодержаниеПредставленияПочты(НастройкиПользователя, КодЯзыка)); + + ИначеЕсли ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение") Тогда + Результат = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр("ru='Мобильное приложение КриптоПро myDSS'", КодЯзыка)); + + ИначеЕсли ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite") Тогда + Результат = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр("ru='Мобильное приложение AirKey DSS'", КодЯзыка)); + + ИначеЕсли ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + Результат = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр("ru = 'Офлайн-подтверждение через приложение'", КодЯзыка)); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция выводит полученную информацию с сервера и оформляет ее в соответствии со этапом цикла +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - форма, содержащая элементы подтверждения +// ИмяЭлементаФормы - Строка - имя оформляемого элемента +// +Процедура ВывестиИнформациюСервера(КонтекстФормы, ИмяЭлементаФормы = "ПодтверждениеИнформацияСервера") Экспорт + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + + Если ДанныеПодтверждения.ЭтапЦикла = "Ошибка" + ИЛИ ДанныеПодтверждения.ЭтапЦикла = "Предупреждение" Тогда + СтильИнформации = ДанныеПодтверждения.Оформление.ПоясняющийОшибкуТекст; + Иначе + СтильИнформации = ДанныеПодтверждения.Оформление.ПодтверждениеОперацииОписаниеЦвет; + КонецЕсли; + + КонтекстФормы.Элементы[ИмяЭлементаФормы].ЦветТекста = СтильИнформации; + КонтекстФормы.ИнформацияСервера = ДанныеПодтверждения.ОписаниеПодтверждения; + +КонецПроцедуры + +// Служебная, обрабатывает изменение этапа цикла подтверждения +// +Процедура ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ОписаниеДанных, ЗначениеПароля, ОжиданиеОтветаПользователя = Ложь) + + РазрешенЗапросСервера = НЕ КонтекстФормы.ОжидатьВыполнения; + + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + ВторичнаяАвторизация = ДанныеПодтверждения.ВторичнаяАвторизация; + ДатаСеанса = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + + ПараметрыЦикла = Новый Структура; + ПараметрыЦикла.Вставить("КонтекстФормы", КонтекстФормы); + ПараметрыЦикла.Вставить("ОписаниеДанных", ОписаниеДанных); + ПараметрыЦикла.Вставить("ЗначениеПароля", ЗначениеПароля); + ПараметрыЦикла.Вставить("ОжиданиеОтветаПользователя", ОжиданиеОтветаПользователя); + + ОбработкаЦикла = Новый ОписаниеОповещения("ПодтверждениеОбработатьРезультатЗапроса", ЭтотОбъект, ПараметрыЦикла); + + Если ДанныеПодтверждения.ЭтапЦикла = "Ошибка" Тогда + КонтекстФормы.ОжидатьВыполнения = Ложь; + ПоказатьОшибкуФормыПодтверждения(КонтекстФормы, ДанныеПодтверждения, "", ОписаниеДанных, ЗначениеПароля); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Предупреждение" Тогда + ВывестиИнформациюСервера(КонтекстФормы); + КонтекстФормы.ДанныеПодтверждения.ЭтапЦикла = "ВводКода"; + КонтекстФормы.ОжидатьВыполнения = Ложь; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Отказ" Тогда + КонтекстФормы.ОжидатьВыполнения = Ложь; + КонтекстФормы.Закрыть(); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Окончание" И РазрешенЗапросСервера Тогда + ПараметрыОтвета = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + КонтекстФормы.ОжидатьВыполнения = Истина; + ВыполнитьОповещениеФормы(КонтекстФормы, ПараметрыОтвета, "ПодтверждениеВыполнитьОсновнуюОперацию"); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Ожидание" И РазрешенЗапросСервера Тогда + Разница = ДатаСеанса - КонтекстФормы.ДанныеПодтверждения.СрокОпроса; + Если Разница > ДанныеПодтверждения.ПериодОпроса Тогда + КонтекстФормы.ОжидатьВыполнения = Истина; + КонтекстФормы.ДанныеПодтверждения.СрокОпроса = ДатаСеанса; + ОтправкаЗапроса(ОбработкаЦикла, НастройкиПользователя, ДанныеПодтверждения); + КонецЕсли; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "ВводКода" И РазрешенЗапросСервера Тогда + Если ВторичнаяАвторизация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + Разница = ДатаСеанса - КонтекстФормы.ДанныеПодтверждения.СрокОпроса; + Если Разница > ДанныеПодтверждения.ПериодОпроса Тогда + КонтекстФормы.ОжидатьВыполнения = Истина; + КонтекстФормы.ДанныеПодтверждения.СрокОпроса = ДатаСеанса; + ОтправкаЗапроса(ОбработкаЦикла, НастройкиПользователя, ДанныеПодтверждения); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "ВводКодаПользователем" И РазрешенЗапросСервера Тогда + ДанныеПодтверждения.ЭтапЦикла = "ВводКода"; + КонтекстФормы.ДанныеПодтверждения = ДанныеПодтверждения; + КонтекстФормы.ОжидатьВыполнения = Истина; + ОтправкаЗапроса(ОбработкаЦикла, НастройкиПользователя, ДанныеПодтверждения); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Начало" И РазрешенЗапросСервера Тогда + КонтекстФормы.ОжидатьВыполнения = Истина; + ВыполнитьНачальнуюОперациюСервиса(КонтекстФормы, ОписаниеДанных, ЗначениеПароля); + + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Выбор" И РазрешенЗапросСервера Тогда + // если выбран способ, то отправка запроса, иначе ждем пользователя + Если ЗначениеЗаполнено(ДанныеПодтверждения.ВторичнаяАвторизация) Тогда + КонтекстФормы.ОжидатьВыполнения = Истина; + ОтправкаЗапроса(ОбработкаЦикла, НастройкиПользователя, ДанныеПодтверждения); + Иначе + КонтекстФормы.ОжидатьВыполнения = Ложь; + ФильтроватьСписокСпособов(КонтекстФормы); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Служебная получает описание операции из настроек пользователя +// +Функция КлючДействияОперации(ТипОперации, НастройкиПользователя, ДанныеПодтверждения) + + Если ТипОперации = "Подтверждение" + ИЛИ ТипОперации = "Аутентификация" Тогда + КлючДействия = СервисКриптографииDSSКлиентСервер.СвойствоВыполняемойОперации(НастройкиПользователя, ТипОперации); + КлючДействия.Подтверждать = Истина; + + Иначе + Если ТипОперации = "Подписание" Тогда + Если ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПакетнаяОперация Тогда + ВидОперации = "ПодписьПакета"; + Иначе + ВидОперации = "ПодписьДокумента"; + КонецЕсли; + ИначеЕсли ТипОперации = "Расшифрование" Тогда + ВидОперации = "Расшифрование"; + Иначе + ВидОперации = ТипОперации; + КонецЕсли; + + КлючДействия = СервисКриптографииDSSКлиентСервер.СвойствоВыполняемойОперации(НастройкиПользователя, ВидОперации); + + КонецЕсли; + + Возврат КлючДействия; + +КонецФункции + +// Служебная, проверяет возможность выполнения операции для существующей и открытой формы +// +Функция ПроверитьКонтекстФормы(КонтекстФормы) + + Результат = Истина; + + Если КонтекстФормы = Неопределено ИЛИ НЕ КонтекстФормы.Открыта() Тогда + Результат = Ложь; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная, формирует представление текущего элемента данных, необходимых для создания транзакции подписания +// +// Параметры: +// ОписаниеДанных - Структура +// ТекущийЭлементНабораДанных - Неопределено +// - Структура +// +Функция ПолучитьПредставлениеДанных(ТекущийЭлементНабораДанных, ОписаниеДанных) + + Расширение = ""; + СписокПредставлений = ПолучитьПолеСтруктуры(ОписаниеДанных, "СписокПредставлений"); + Представление = ПолучитьПолеСтруктуры(ОписаниеДанных, "Представление", ""); + НаборДанных = ПолучитьПолеСтруктуры(ОписаниеДанных, "НаборДанных", Неопределено); + Результат = Новый Структура; + Результат.Вставить("Данные", Неопределено); + + Если СписокПредставлений <> Неопределено И НаборДанных <> Неопределено Тогда + НашлиИндекс = НаборДанных.Найти(ТекущийЭлементНабораДанных); + КоличествоПредставлений = СписокПредставлений.Количество(); + Если КоличествоПредставлений = 1 ИЛИ НашлиИндекс = Неопределено Тогда + Представление = СписокПредставлений[0].Представление + + ?(НаборДанных.Количество() > 1, " (" + СокрЛП(НашлиИндекс) + ")", ""); + ИначеЕсли КоличествоПредставлений > НашлиИндекс Тогда + Представление = СписокПредставлений[НашлиИндекс].Представление; + КонецЕсли; + КонецЕсли; + + Если ТекущийЭлементНабораДанных <> Неопределено Тогда + Если ТекущийЭлементНабораДанных.Свойство("Объект") Тогда + ДанныеФайла = СервисКриптографииDSSСлужебныйВызовСервера.ЗначенияРеквизитовОбъекта(ТекущийЭлементНабораДанных.Объект, "Расширение"); + Расширение = ДанныеФайла.Расширение; // Строка + + Если СписокПредставлений <> Неопределено Тогда + СписокПредставлений = ОписаниеДанных.СписокПредставлений; + НашлиСтроку = СписокПредставлений.НайтиПоЗначению(ТекущийЭлементНабораДанных.Объект); + Представление = НашлиСтроку.Представление + КонецЕсли; + + КонецЕсли; + Результат.Вставить("Данные", ТекущийЭлементНабораДанных.Данные); + КонецЕсли; + + Результат.Вставить("Расширение", Расширение); + Результат.Вставить("Представление", Представление); + + Возврат Результат + +КонецФункции + +// Служебная, требуется для обновления размеров формы после открытия формы. +// Используется механизм выключения и включения видимости группы элементов. +// +Процедура ОбновитьРазмерыФормы(КонтекстФормы) + + СписокГрупп = КонтекстФормы.ИменаГруппКонтейнера; + ЭлементыФормы = КонтекстФормы.Элементы; + + ИзменитьВидимостьКонтейнеров(СписокГрупп, ЭлементыФормы, Неопределено); + ИзменитьВидимостьКонтейнеров(СписокГрупп, ЭлементыФормы, Неопределено); + +КонецПроцедуры + +// Служебная, формирует параметры с данными необходимые для создания транзакции подтверждения. +// Начало цикла получения данных для операций (шифрования, подписание, расшифрование), +// см. подробнее ВыполнитьНачальнуюОперациюСервиса. +// +// Параметры: +// ИндексЭлемента - Число +// ВходящийКонтекст - Структура: +// * Индекс - Число +// * ПредставлениеДанных - Структура: +// ** Данные - Массив из Структура +// +Процедура ВыполнитьНачальнуюОперациюСервисаПодготовитьДанные(ИндексЭлемента, ВходящийКонтекст) + + КонтекстФормы = ВходящийКонтекст.КонтекстФормы; + ОписаниеДанных = ВходящийКонтекст.ОписаниеДанных; + + Если ОписаниеДанных.НаборДанных.Количество() > ИндексЭлемента Тогда + ЭлементДанных = ОписаниеДанных.НаборДанных[ИндексЭлемента]; + ПредставлениеДанных = ПолучитьПредставлениеДанных(ЭлементДанных, ОписаниеДанных); + + НоваяСтрока = Новый Структура(); + НоваяСтрока.Вставить("Содержание", Неопределено); + НоваяСтрока.Вставить("ИмяДокумента", ПредставлениеДанных.Представление); + НоваяСтрока.Вставить("ТипДокумента", ПредставлениеДанных.Расширение); + НоваяСтрока.Вставить("ИсходноеСодержание", ""); + + ВходящийКонтекст.ПредставлениеДанных.Данные.Добавить(НоваяСтрока); + ВходящийКонтекст.Индекс = ИндексЭлемента + 1; + + ОбработчикСледующий = Новый ОписаниеОповещения("ВыполнитьНачальнуюОперациюСервисаПослеПолученияДанных", ЭтотОбъект, ВходящийКонтекст); + + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("ОбработчикСледующий", ОбработчикСледующий); + ПараметрыОперации.Вставить("КонтекстФормы", КонтекстФормы); + ПараметрыОперации.Вставить("ОписаниеДанных", ВходящийКонтекст.ОписаниеДанных); + ПараметрыОперации.Вставить("Данные", ЭлементДанных.Данные); + + ВыполнитьОповещениеФормы(КонтекстФормы, ПараметрыОперации, "ПодтверждениеПодготовитьДанные"); + + Иначе + ВыполнитьНачальнуюОперациюСервисаПослеПодготовкиДанных(ВходящийКонтекст.ПредставлениеДанных, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Служебная, продолжение цикла формирования параметров с данными необходимые для создания транзакции подтверждения. +// Получение очередной порции данных см.подробнее ВыполнитьНачальнуюОперациюСервиса. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * Индекс - Число +// * ПредставлениеДанных - Структура: +// ** Данные - Массив из Структура +// +Процедура ВыполнитьНачальнуюОперациюСервисаПослеПолученияДанных(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ЭтоXMLDSig = (ТипЗнч(РезультатВыполнения) = Тип("Структура") И РезультатВыполнения.Свойство("ПараметрыXMLDSig")); + ЭтоCMS = (ТипЗнч(РезультатВыполнения) = Тип("Структура") И РезультатВыполнения.Свойство("ПараметрыCMS")); + + Если ТипЗнч(РезультатВыполнения) = Тип("Структура") + И Не ЭтоXMLDSig + И Не ЭтоCMS Тогда + Возврат; + КонецЕсли; + + Количество = ВходящийКонтекст.ПредставлениеДанных.Данные.Количество(); + ВходящийКонтекст.ПредставлениеДанных.Данные[Количество - 1].Содержание = РезультатВыполнения; + + ВыполнитьНачальнуюОперациюСервисаПодготовитьДанные(ВходящийКонтекст.Индекс, ВходящийКонтекст); + +КонецПроцедуры + +// Служебная, окончание цикла формирования параметров с данными необходимые для создания транзакции подтверждения. +// Отправляет запрос на сервис, см. подробнее ВыполнитьНачальнуюОперациюСервиса. +// +// Параметры: +// ДанныеОперации - Структура +// ВходящийКонтекст - Структура: +// * КонтекстФормы - ФормаКлиентскогоПриложения: +// ** ДанныеСертификата - Структура: +// *** Идентификатор - Строка +// +Процедура ВыполнитьНачальнуюОперациюСервисаПослеПодготовкиДанных(ДанныеОперации, ВходящийКонтекст) + + КонтекстФормы = ВходящийКонтекст.КонтекстФормы; + + Если ПроверитьКонтекстФормы(КонтекстФормы) Тогда + СледующаяОбработка = Новый ОписаниеОповещения("ВыполнитьНачальнуюОперациюСервисаПослеВыполнения", ЭтотОбъект, ВходящийКонтекст); + + ПарольПользователя = Неопределено; + ЗначениеПинКода = ?(ЗначениеЗаполнено(ВходящийКонтекст.ЗначениеПароля), ВходящийКонтекст.ЗначениеПароля, Неопределено); + Если ВходящийКонтекст.ТипОперации <> "Проверка" Тогда + Если ЗначениеЗаполнено(КонтекстФормы.ПарольЛогина) Тогда + ПарольПользователя = СервисКриптографииDSSКлиентСервер.ОбъектПароля(КонтекстФормы.ПарольЛогина, 1); + Иначе + ПарольПользователя = СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(""); + КонецЕсли; + КонецЕсли; + + ПараметрыВызова = Новый Структура; + + Если ЗначениеЗаполнено(КонтекстФормы.ПодтверждениеДанныеСертификата) Тогда + ПараметрыВызова.Вставить("СертификатАвторизации", КонтекстФормы.ПодтверждениеДанныеСертификата); + КонецЕсли; + + ПараметрыВызова.Вставить("ТипОперации", ВходящийКонтекст.ТипОперации); + ПараметрыВызова.Вставить("Сертификат", КонтекстФормы.ДанныеСертификата.Идентификатор); + ПараметрыВызова.Вставить("ДанныеДокумента", ДанныеОперации.Данные); + ПараметрыВызова.Вставить("ПарольПользователя", ПарольПользователя); + ПараметрыВызова.Вставить("ПинКод", СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ЗначениеПинКода)); + ПараметрыВызова.Вставить("ТипДокумента", ДанныеОперации.Расширение); + ПараметрыВызова.Вставить("ОписаниеДокумента", ДанныеОперации.Представление); + ПараметрыВызова.Вставить("ДанныеПодтверждения", КонтекстФормы.ДанныеПодтверждения); + + КонтекстФормы.ОжидатьВыполнения = Истина; + + СервисКриптографииDSSКлиент.ПодготовитьТранзакцию( + СледующаяОбработка, + КонтекстФормы.НастройкиПользователя, + ПараметрыВызова); + + УправлениеЭлементамиОбщее(КонтекстФормы, 7); + КонецЕсли; + +КонецПроцедуры + +// Служебная, асинхронная обработка результата первичного запроса сервиса. +// Обработка результат выполнения первичной операции см. подробнее ВыполнитьНачальнуюОперациюСервиса. +// +Процедура ВыполнитьНачальнуюОперациюСервисаПослеВыполнения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + АктивизироватьПоле = Ложь; + КонтекстФормы = ВходящийКонтекст.КонтекстФормы; + КонтекстФормы.ОжидатьВыполнения = Ложь; + + Если НЕ ПроверитьКонтекстФормы(КонтекстФормы) Тогда + Возврат; + КонецЕсли; + + Если РезультатВыполнения.МаркерОбновлен Тогда + НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + КонтекстФормы.НастройкиПользователя = НастройкиПользователя; + КонецЕсли; + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + + Если РезультатВыполнения.Выполнено Тогда + + ЗначениеПароля = ВходящийКонтекст.ЗначениеПароля; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + + Если ЗначениеЗаполнено(ЗначениеПароля) Тогда + ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПинКод = ЗначениеПароля; + ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПинКодПроверен = Истина; + КонецЕсли; + + Результат = РезультатВыполнения.Результат; + + Если Результат.Подтверждение Тогда + АктивизироватьПоле = Истина; + ДанныеПодтверждения = Результат.ДанныеПодтверждения; + КонтекстФормы.ДанныеПодтверждения = ДанныеПодтверждения; + ВывестиИнформациюСервера(КонтекстФормы); + ФильтроватьСписокСпособов(КонтекстФормы); + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ВходящийКонтекст.ОписаниеДанных, ВходящийКонтекст.ЗначениеПароля); + ПодключитьОжидание(КонтекстФормы); + Иначе + ПакетнаяОперация = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПакетнаяОперация; + ПараметрыВыполнения = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ПараметрыВыполнения.Вставить("ДанныеПакета", Неопределено); + Если ПакетнаяОперация Тогда + ПараметрыВыполнения.ДанныеПакета = ВходящийКонтекст.ПредставлениеДанных.Данные; + КонецЕсли; + КонтекстФормы.ОжидатьВыполнения = Истина; + ВыполнитьОповещениеФормы(КонтекстФормы, ПараметрыВыполнения, "ПодтверждениеВыполнитьОсновнуюОперацию"); + КонецЕсли; + УправлениеЭлементамиОбщее(КонтекстФормы, 8); + + Иначе + ДанныеПодтверждения.ЭтапЦикла = "Ошибка"; + ПоказатьОшибкуФормыПодтверждения(КонтекстФормы, + ДанныеПодтверждения, + РезультатВыполнения.Ошибка, + ВходящийКонтекст.ОписаниеДанных, + ВходящийКонтекст.ЗначениеПароля); + + КонецЕсли; + + Если АктивизироватьПоле Тогда + АктивизироватьПолеФормыПодтверждения(КонтекстФормы, "Начало"); + КонецЕсли; + +КонецПроцедуры + +// Служебная, отображает сообщение об ошибке пользователю и ожидает ответа пользователя +// +Процедура ПоказатьОшибкуФормыПодтверждения(КонтекстФормы, + ДанныеПодтверждения, + СодержаниеОшибки, + ОписаниеДанных = Неопределено, + ЗначениеПароля = "") + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("КонтекстФормы", КонтекстФормы); + ПараметрыЦикла.Вставить("ОписаниеДанных", ОписаниеДанных); + ПараметрыЦикла.Вставить("ЗначениеПароля", ЗначениеПароля); + + ОбработкаРезультата = Новый ОписаниеОповещения("ПоказатьОшибкуФормыПодтвержденияПослеПоказа", ЭтотОбъект, ПараметрыЦикла); + + Если ЗначениеЗаполнено(СодержаниеОшибки) Тогда + Если НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(СодержаниеОшибки) Тогда + СервисКриптографииDSSКлиент.ВывестиОшибку(ОбработкаРезультата, СодержаниеОшибки); + КонецЕсли; + + ИначеЕсли ЗначениеЗаполнено(ДанныеПодтверждения.Ошибка) Тогда + ОткрытьФормуОшибкиПодтверждения(ОбработкаРезультата, ДанныеПодтверждения, Истина, КонтекстФормы); + + КонецЕсли; + +КонецПроцедуры + +// Служебная, обрабатывает ответ пользователя: повторить операцию или отказаться +// см. ПоказатьОшибкуФормыПодтверждения +// +Процедура ПоказатьОшибкуФормыПодтвержденияПослеПоказа(РезультатВызова, ВходящийКонтекст) Экспорт + + КонтекстФормы = ВходящийКонтекст.КонтекстФормы; + + Если РезультатВызова.Выполнено Тогда + Если РезультатВызова.Свойство("ДанныеПодтверждения") Тогда + КонтекстФормы.ДанныеПодтверждения = РезультатВызова.ДанныеПодтверждения; + Если КонтекстФормы.СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + КонтекстФормы.СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение"); + КонецЕсли; + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ВходящийКонтекст.ОписаниеДанных, ВходящийКонтекст.ЗначениеПароля); + КонецЕсли; + УправлениеЭлементамиОбщее(КонтекстФормы, 9); + ВыполнитьОповещениеФормы(КонтекстФормы, СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь), "ПодтверждениеВыполнитьОсновнуюОперацию"); + + ИначеЕсли КонтекстФормы.Открыта() Тогда + КонтекстФормы.Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +// Служебная, посылает оповещение о событии форме для обработки в ее контексте +// +Процедура ВыполнитьОповещениеФормы(КонтекстФормы, РезультатВызова, ИмяСобытия) + + Оповестить(ИмяСобытия, РезультатВызова, КонтекстФормы.УникальныйИдентификатор); + +КонецПроцедуры + +// Служебная, асинхронно обрабатывает результат запроса к сервису облачной подписи для встроенного подтверждения +// см. ПодтверждениеОбработатьЭтапЦикла +// +Процедура ПодтверждениеОбработатьРезультатЗапроса(РезультатВыполнения, ВходящийКонтекст) Экспорт + + КонтекстФормы = ВходящийКонтекст.КонтекстФормы; + ОжидатьВыполнения = Ложь; + Если КонтекстФормы <> Неопределено Тогда + ОжидатьВыполнения = КонтекстФормы.ОжидатьВыполнения; + КонтекстФормы.ОжидатьВыполнения = Ложь; + КонецЕсли; + + Если ПроверитьКонтекстФормы(КонтекстФормы) Тогда + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + РезультатВызова = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(РезультатВыполнения, ДанныеПодтверждения); + ЭтапЦикла = ""; + + Если РезультатВызова.Выполнено Тогда + ЭтапЦикла = ДанныеПодтверждения.ЭтапЦикла; + СервисКриптографииDSSКлиентСервер.РазобратьРезультатЗапроса( + РезультатВызова, + КонтекстФормы.НастройкиПользователя, + КонтекстФормы.ДанныеПодтверждения, + СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса()); + + Если КонтекстФормы.ДанныеПодтверждения.ЭтапЦикла <> "Ошибка" Тогда + ФильтроватьСписокСпособов(КонтекстФормы); + КонецЕсли; + + ВывестиИнформациюСервера(КонтекстФормы); + ПодтверждениеОбработатьЭтапЦикла(КонтекстФормы, ВходящийКонтекст.ОписаниеДанных, ВходящийКонтекст.ЗначениеПароля); + + Иначе + ДанныеПодтверждения.ЭтапЦикла = "Ошибка"; + ПоказатьОшибкуФормыПодтверждения(КонтекстФормы, + КонтекстФормы.ДанныеПодтверждения, + РезультатВызова.Ошибка, + ВходящийКонтекст.ОписаниеДанных, + ВходящийКонтекст.ЗначениеПароля); + КонецЕсли; + + Если НЕ ВходящийКонтекст.ОжиданиеОтветаПользователя ИЛИ ОжидатьВыполнения Тогда + УправлениеЭлементамиОбщее(КонтекстФормы, 10); + КонецЕсли; + + Иначе + СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(РезультатВыполнения, "Ошибка"); + КонецЕсли; + + АктивизироватьПолеФормыПодтверждения(КонтекстФормы, ЭтапЦикла); + +КонецПроцедуры + +// Служебная для обработки элементов формы, активирует поле ввода одноразового пароля после получения ответа от сервиса +// +Процедура АктивизироватьПолеФормыПодтверждения(КонтекстФормы, БылЭтап = "Начало") + + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + ТипОперации = КонтекстФормы.ПодтверждениеТипОперации; + ЭлементыФормы = КонтекстФормы.Элементы; + + Если БылЭтап = "Инициализация" Тогда + ОбновитьРазмерыФормы(КонтекстФормы); + ДатаСеанса = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + ЕстьАвторизация = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса); + + Если НЕ ЕстьАвторизация И ТипОперации = "Шифрование" Тогда + КонтекстФормы.ТекущийЭлемент = ЭлементыФормы.ПодтверждениеПароль; + КонецЕсли; + + ИначеЕсли (БылЭтап = "Выбор" ИЛИ БылЭтап = "Начало") Тогда + Если ДанныеПодтверждения.ЭтапЦикла = "ВводКода" Тогда + ОбновитьРазмерыФормы(КонтекстФормы); + Если ЭлементыФормы.ПодтверждениеКодПодтверждения.Видимость Тогда + КонтекстФормы.ТекущийЭлемент = ЭлементыФормы.ПодтверждениеКодПодтверждения; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Служебная для обработки элементов формы, формирует подсказку для выбранного способа подтверждения +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - содержит реквизиты: +// * ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИмяЭлемента - Строка +// +Процедура СформироватьПодсказкуСпособовВыбора(КонтекстФормы, ИмяЭлемента = "ПодтверждениеСпособПодтверждения") + + ЭлементФормы = КонтекстФормы.Элементы[ИмяЭлемента]; + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + СписокВыбора = ЭлементФормы.СписокВыбора; + + КодЯзыка = ДанныеПодтверждения.КодЯзыка; + ОбщаяСтрока = ""; + + Если СписокВыбора.Количество() = 0 Тогда + ОбщаяСтрока = ?(ПустаяСтрока(ОбщаяСтрока), ОбщаяСтрока, ОбщаяСтрока + Символы.ПС) + + НСтр("ru = 'Пользователю не назначен ни один способ подтверждения.'", КодЯзыка); + КонецЕсли; + + ПерваяЧасть = НСтр("ru = 'Можно сохранить настройки подтверждения в'", КодЯзыка); + ВтораяЧасть = НСтр("ru = 'карточке'", КодЯзыка); + ТретьяЧасть = НСтр("ru = 'учетной записи'", КодЯзыка); + + ОбщаяСтрока = ?(ПустаяСтрока(ОбщаяСтрока), ОбщаяСтрока, ОбщаяСтрока + Символы.ПС) + + ПерваяЧасть + " " + + "" + ВтораяЧасть + " " + ТретьяЧасть + " + | "; + + Результат = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ОбщаяСтрока); + + ЭлементФормы.РасширеннаяПодсказка.Заголовок = Результат; + +КонецПроцедуры + +// Служебная для обработки элементов формы, формирует заголовок оставшегося времени +// +Функция ПодтверждениеОтобразитьОсталось(ДанныеПодтверждения, ТекущийЗаголовок) + + ДатаСеанса = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + Разница = 0; + Если ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Разница = ДанныеПодтверждения.СрокДействия - ДатаСеанса; + КонецЕсли; + + Если Разница > 0 Тогда + Осталось = РазницаФормат(Разница, Истина); + ИначеЕсли НЕ ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Осталось = ""; + КонецЕсли; + + Позиция = СтрНайти(ТекущийЗаголовок, "("); + Если Позиция > 0 Тогда + Результат = СокрЛП(Сред(ТекущийЗаголовок, 1, Позиция - 1)) + " " + Осталось; + Иначе + Результат = СокрЛП(ТекущийЗаголовок) + " " + Осталось; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная для обработки элементов формы, меняет видимость групп формы со встроенным подтверждением +// +Процедура ИзменитьВидимостьКонтейнеров(СписокГрупп, ЭлементыФормы, ТекущийСтатус = Ложь) + + ВиднаГруппа = Ложь; + + Для каждого СтрокаКлюча Из СписокГрупп Цикл + Если СтрокаКлюча.Ключ = "ГруппаСертификата" Тогда + Продолжить; + КонецЕсли; + + НашлиЭлемент = НайтиЭлементФормы(ЭлементыФормы, СтрокаКлюча.Значение); + Если НЕ НашлиЭлемент Тогда + Продолжить; + КонецЕсли; + + ТекущийЭлемент = ЭлементыФормы[СтрокаКлюча.Значение]; + + Если ТекущийСтатус = "Проверка" Тогда + Если НЕ ТекущийЭлемент.Видимость Тогда + ВиднаГруппа = ВиднаГруппа ИЛИ ТекущийЭлемент.Видимость; + КонецЕсли; + ИначеЕсли ТекущийСтатус = Неопределено Тогда + ТекущийЭлемент.Видимость = НЕ ТекущийЭлемент.Видимость; + Иначе + ТекущийЭлемент.Видимость = ТекущийСтатус; + КонецЕсли; + КонецЦикла; + + Если ТекущийСтатус = "Проверка" И НЕ ВиднаГруппа Тогда + Для каждого СтрокаКлюча Из СписокГрупп Цикл + Если СтрокаКлюча.Ключ = "ГруппаСертификата" Тогда + Продолжить; + КонецЕсли; + + НашлиЭлемент = НайтиЭлементФормы(ЭлементыФормы, СтрокаКлюча.Значение); + Если НЕ НашлиЭлемент Тогда + Продолжить; + КонецЕсли; + + ТекущийЭлемент = ЭлементыФормы[СтрокаКлюча.Значение]; + ТекущийЭлемент.Видимость = Истина; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Служебная для обработки элементов формы, проверяет наличие элемента на форме +// +Функция НайтиЭлементФормы(ЭлементыФормы, ИмяЭлемента) + + Результат = Ложь; + + НашлиЭлемент = ЭлементыФормы.Найти(ИмяЭлемента); + Если НашлиЭлемент <> Неопределено Тогда + Результат = Истина; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная для обработки элементов формы, меняет свойства элемента формы +// +Процедура УстановитьСвойствоЭлемента(ЭлементыФормы, ИмяЭлемента, СвойствоЭлемента, ЗначениеЭлемента) + + Если НайтиЭлементФормы(ЭлементыФормы, ИмяЭлемента) Тогда + ЭлементыФормы[ИмяЭлемента][СвойствоЭлемента] = ЗначениеЭлемента; + КонецЕсли; + +КонецПроцедуры + +// Служебная для обработки элементов формы, адаптированная для элементов формы подписания +// +// Параметры: +// ЭлементыФормы - ФормаКлиентскогоПриложения +// НеНачалось - Булево +// НуженПинКод - Булево +// ПроверенПинКод - Булево +// СтандартныйВид - Булево +// +Процедура УправлениеЭлементамиДляПодписания(ЭлементыФормы, НеНачалось, НуженПинКод, ПроверенПинКод = Ложь, СтандартныйВид = Ложь) + + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + + ЭлементыФормы.ГруппаПароль.Видимость = НуженПинКод ИЛИ СтандартныйВид; + ЭлементыФормы.Пароль.ТолькоПросмотр = ПроверенПинКод; + Если СтандартныйВид Тогда + ЭлементыФормы.Подписать.КнопкаПоУмолчанию = Истина; + ЭлементыФормы.Пароль.ТолькоПросмотр = Ложь; + Иначе + ЭлементыФормы.Страницы.Видимость = Ложь; + КонецЕсли; + ЭлементыФормы.Подписать.Видимость = НеНачалось ИЛИ СтандартныйВид; + ЭлементыФормы.Пароль.Заголовок = ?(НуженПинКод И НЕ СтандартныйВид, НСтр("ru = 'Пин-код'", КодЯзыка), НСтр("ru = 'Пароль'", КодЯзыка)); + ЭлементыФормы.ЗапомнитьПароль.Заголовок = ?(НуженПинКод И НЕ СтандартныйВид, + НСтр("ru = 'Запомнить пин-код'", КодЯзыка), + НСтр("ru = 'Запомнить пароль'", КодЯзыка)); + ЭлементыФормы.ГруппаПодписание.ОтображатьЗаголовок = СтандартныйВид; + +КонецПроцедуры + +// Служебная для обработки элементов формы, адаптированная для элементов формы расшифрования +// +// Параметры: +// ЭлементыФормы - ФормаКлиентскогоПриложения +// НеНачалось - Булево +// НуженПинКод - Булево +// ПроверенПинКод - Булево +// СтандартныйВид - Булево +// +Процедура УправлениеЭлементамиДляРасшифрования(ЭлементыФормы, НеНачалось, НуженПинКод, ПроверенПинКод = Ложь, СтандартныйВид = Ложь) + + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + + ЭлементыФормы.ГруппаПароль.Видимость = НуженПинКод ИЛИ СтандартныйВид; + ЭлементыФормы.Пароль.ТолькоПросмотр = ПроверенПинКод; + Если СтандартныйВид Тогда + ЭлементыФормы.ФормаРасшифровать.КнопкаПоУмолчанию = Истина; + ЭлементыФормы.Пароль.ТолькоПросмотр = Ложь; + Иначе + ЭлементыФормы.Страницы.Видимость = Ложь; + КонецЕсли; + ЭлементыФормы.ФормаРасшифровать.Видимость = НеНачалось ИЛИ СтандартныйВид; + ЭлементыФормы.Пароль.Заголовок = ?(НуженПинКод И НЕ СтандартныйВид, НСтр("ru = 'Пин-код'", КодЯзыка), НСтр("ru = 'Пароль'", КодЯзыка)); + ЭлементыФормы.ЗапомнитьПароль.Заголовок = ?(НуженПинКод И НЕ СтандартныйВид, НСтр("ru = 'Запомнить пин-код'", КодЯзыка), НСтр("ru = 'Запомнить пароль'", КодЯзыка)); + ЭлементыФормы.ГруппаРасшифровка.ОтображатьЗаголовок = СтандартныйВид; + +КонецПроцедуры + +// Служебная для обработки элементов формы, адаптированная для элементов формы проверки сертификата +// +// Параметры: +// ЭлементыФормы - ФормаКлиентскогоПриложения +// НеНачалось - Булево +// НуженПинКод - Булево +// ПроверенПинКод - Булево +// СтандартныйВид - Булево +// +Процедура УправлениеЭлементамиДляПроверки(ЭлементыФормы, НеНачалось, НуженПинКод, ПроверенПинКод = Ложь, СтандартныйВид = Ложь) + + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + + ЭлементыФормы.ГруппаВводаПароля.Видимость = НуженПинКод ИЛИ СтандартныйВид; + ЭлементыФормы.Пароль.ТолькоПросмотр = ПроверенПинКод; + Если СтандартныйВид Тогда + ЭлементыФормы.ФормаПроверить.КнопкаПоУмолчанию = Истина; + ЭлементыФормы.Пароль.ТолькоПросмотр = Ложь; + Иначе + ЭлементыФормы.Страницы.Видимость = Ложь; + КонецЕсли; + ЭлементыФормы.ГруппаВводаПароля.ОтображатьЗаголовок = СтандартныйВид; + ЭлементыФормы.ФормаПроверить.Видимость = НеНачалось ИЛИ СтандартныйВид; + ЭлементыФормы.Пароль.Заголовок = ?(НуженПинКод И НЕ СтандартныйВид, НСтр("ru = 'Пин-код'", КодЯзыка), НСтр("ru = 'Пароль'", КодЯзыка)); + ЭлементыФормы.ЗапомнитьПароль.Заголовок = ?(НуженПинКод И НЕ СтандартныйВид, + НСтр("ru = 'Запомнить пин-код'", КодЯзыка), + НСтр("ru = 'Запомнить пароль'", КодЯзыка)); + +КонецПроцедуры + +// Служебная для обработки элементов формы, выбирает адаптированную процедуру управления элементами формы +// +Процедура УправлениеЭлементамиФормы(КонтекстФормы, СтандартныйВид, НеНачалось, НуженПинКод, ПроверенПинКод = Ложь) + + ФормаИсточник = КонтекстФормы.ПодтверждениеТипОперации; + ЭлементыФормы = КонтекстФормы.Элементы; + + Если ФормаИсточник = "Подписание" Тогда + УправлениеЭлементамиДляПодписания(ЭлементыФормы, НеНачалось, НуженПинКод, ПроверенПинКод, СтандартныйВид); + ИначеЕсли ФормаИсточник = "Расшифрование" Тогда + УправлениеЭлементамиДляРасшифрования(ЭлементыФормы, НеНачалось, НуженПинКод, ПроверенПинКод, СтандартныйВид); + ИначеЕсли ФормаИсточник = "Проверка" Тогда + УправлениеЭлементамиДляПроверки(ЭлементыФормы, НеНачалось, НуженПинКод, ПроверенПинКод, СтандартныйВид); + КонецЕсли; + +КонецПроцедуры + +// Служебная для обработки элементов формы, общая форма управления добавленными элементами формы встроенного подтверждения +// +Процедура УправлениеЭлементамиОбщее(КонтекстФормы, ОткудаВызов) + + СписокГрупп = КонтекстФормы.ИменаГруппКонтейнера; + ЭлементыФормы = КонтекстФормы.Элементы; + ОблачныйСертификат = КонтекстФормы.ДанныеСертификата.Облачный; + ФормаИсточник = КонтекстФормы.ПодтверждениеТипОперации; + + Если НЕ ОблачныйСертификат Тогда + УправлениеЭлементамиФормы(КонтекстФормы, Истина, Ложь, Ложь, Ложь); + ИзменитьВидимостьКонтейнеров(СписокГрупп, ЭлементыФормы, Ложь); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель1", "Видимость", Ложь); + Возврат; + КонецЕсли; + + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + Если ФормаИсточник = "Аутентификация" + И НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") Тогда + ОтдельнаяАвторизация= Ложь; + Иначе + ОтдельнаяАвторизация= НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_КодАвторизации"); + КонецЕсли; + + ИспользованиеВозможно = СервисКриптографииDSSКлиент.ИспользоватьСервисОблачнойПодписи(); + ОперацияАутентификации = ФормаИсточник = "Аутентификация"; + ДатаСеанса = СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + ОжидатьВыполнения = КонтекстФормы.ОжидатьВыполнения; + БылаАвторизация = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ЕстьАвторизация И ИспользованиеВозможно И ФормаИсточник <> "Проверка"; + ПинКодПроверен = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПинКодПроверен; + ПарольВПамяти = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПарольВПамяти; + СпособПодтверждения = ДанныеПодтверждения.ВторичнаяАвторизация; + ЕстьАвторизация = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса) ИЛИ ОперацияАутентификации; + ЕстьКомментарий = Ложь; + НеНачалось = ДанныеПодтверждения.ЭтапЦикла = "Инициализация" + ИЛИ (ДанныеПодтверждения.ЭтапЦикла = "Ошибка" И НЕ ОтдельнаяАвторизация И НЕ ЕстьАвторизация); + НуженПинКод = ?(ЗначениеЗаполнено(ДанныеПодтверждения.Сертификат), ДанныеПодтверждения.Сертификат.ТребуетсяПинКод, Истина); + СертификатАвторизации = НастройкиПользователя.СертификатАвторизации + ИЛИ НастройкиПользователя.ПервичнаяАутентификация <> ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации"); + + КлючДействия = КлючДействияОперации(ФормаИсточник, НастройкиПользователя, ДанныеПодтверждения); + ТребуетсяПодтверждение = КлючДействия.Подтверждать; + + Если НайтиЭлементФормы(ЭлементыФормы, "Комментарий") Тогда + ЕстьКомментарий = ЭлементыФормы.Комментарий.Видимость; + Иначе + ЕстьКомментарий = ФормаИсточник = "Проверка"; + КонецЕсли; + + Если НЕ ТребуетсяПодтверждение ИЛИ НЕ ИспользованиеВозможно Тогда + ВариантВидимости = 0; + ИначеЕсли СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite") + ИЛИ СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение") Тогда + ВариантВидимости = 3; + ИначеЕсли СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС") + ИЛИ СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта") Тогда + ВариантВидимости = 1; + ИначеЕсли СпособПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда + ВариантВидимости = 2; + Иначе + ВариантВидимости = 4; + КонецЕсли; + + ЭтапыПодтверждения = Новый Массив; + ЭтапыПодтверждения.Добавить((БылаАвторизация ИЛИ ВариантВидимости <> 0) И НуженПинКод И НЕ ПарольВПамяти); + ЭтапыПодтверждения.Добавить(БылаАвторизация); + ЭтапыПодтверждения.Добавить(ТребуетсяПодтверждение); + + УправлениеЭлементамиФормы(КонтекстФормы, Ложь, НеНачалось И (НЕ ОтдельнаяАвторизация ИЛИ ЕстьАвторизация), НуженПинКод И ИспользованиеВозможно, ПинКодПроверен); + + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель1", "Видимость", ЭтапыПодтверждения[0]); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель2", "Видимость", ЭтапыПодтверждения[1]); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель3", "Видимость", ИспользованиеВозможно И (ВариантВидимости ИЛИ БылаАвторизация)); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель4", "Видимость", ЕстьКомментарий И (ВариантВидимости <> 0 ИЛИ БылаАвторизация)); + + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗапись", "Видимость", НЕ ОтдельнаяАвторизация И БылаАвторизация); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеЛогин", "Видимость", ЗначениеЗаполнено(КонтекстФормы.Логин)); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтверждениеПарольЗапомнить", "Видимость", НЕ ОтдельнаяАвторизация И БылаАвторизация); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеЗапомнитьПарольЛогина", "Видимость", ЗначениеЗаполнено(КонтекстФормы.Логин)); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗаписьВеб", "Видимость", ОтдельнаяАвторизация И БылаАвторизация); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПредставлениеСертификата", "Видимость", НЕ ОтдельнаяАвторизация И БылаАвторизация И НЕ СертификатАвторизации); + + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияКод", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации) И (ВариантВидимости = 1 ИЛИ ВариантВидимости = 2) И ВариантВидимости); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПовторить", "Видимость", НЕ НеНачалось И ВариантВидимости = 1 И ВариантВидимости); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияОфлайн", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации) И ВариантВидимости = 2 И ВариантВидимости); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияВыбор", "Видимость", ВариантВидимости <> 0); + Если БылаАвторизация И ИспользованиеВозможно Тогда + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияВыбор", "Доступность", ВариантВидимости <> 0); + КонецЕсли; + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияОписание", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации) И ВариантВидимости); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияОнлайн", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации) И ВариантВидимости = 3 И ВариантВидимости); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеСпособПодтвержденияОшибка", "Видимость", ВариантВидимости = 4 И ВариантВидимости); + + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПредставлениеСертификата", "ТолькоПросмотр", ЕстьАвторизация ИЛИ (ОперацияАутентификации И НЕ НеНачалось)); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПароль", "ТолькоПросмотр", ЕстьАвторизация И НЕ ОперацияАутентификации); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗаписьВеб", "ТолькоПросмотр", ЕстьАвторизация); + + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеОК", "КнопкаПоУмолчанию", НЕ НеНачалось); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеОК", "Доступность", НЕ НеНачалось И НЕ ОжидатьВыполнения); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеИнструкция", "Видимость", НЕ НеНачалось И ВариантВидимости = 2); + + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПовторить", "Доступность", НЕ НеНачалось И НЕ ОжидатьВыполнения); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеКодПодтверждения", "Доступность", НЕ НеНачалось И НЕ ОжидатьВыполнения); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеСпособПодтверждения", "Доступность", ВариантВидимости <> 0); + Если ОтдельнаяАвторизация Тогда + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеАвторизацияВеб", "Доступность", БылаАвторизация И НЕ ЕстьАвторизация); + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеАвторизацияВеб", "Заголовок", + ?(НЕ ЕстьАвторизация, НСтр("ru = 'авторизоваться'", КодЯзыка), НСтр("ru = 'авторизован'", КодЯзыка))); + КонецЕсли; + + Если ВариантВидимости = 1 Тогда + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеКодПодтверждения", "Заголовок", НСтр("ru = 'Одноразовый пароль'", КодЯзыка)); + ИначеЕсли ВариантВидимости = 2 Тогда + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеКодПодтверждения", "Заголовок", НСтр("ru = 'Код'", КодЯзыка)); + КонецЕсли; + + // нумеруем этапы + ВсегоЭтапов = 0; + Для Счетчик = 1 По ЭтапыПодтверждения.Количество() Цикл + Если ЭтапыПодтверждения[Счетчик - 1] Тогда + ВсегоЭтапов = ВсегоЭтапов + 1; + КонецЕсли; + КонецЦикла; + + Всего = 1; + Для Счетчик = 1 По ЭтапыПодтверждения.Количество() Цикл + Если ЭтапыПодтверждения[Счетчик - 1] И ВсегоЭтапов > 1 Тогда + ЗначениеШага = Всего; + Всего = Всего + 1; + Иначе + ЗначениеШага = -1; + КонецЕсли; + КонтекстФормы["ПодтверждениеШаг" + Счетчик] = ЗначениеШага; + УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель" + Счетчик + "Номер", "Видимость", ЗначениеШага > 0); + КонецЦикла; + + ИзменитьВидимостьКонтейнеров(СписокГрупп, ЭлементыФормы, "Проверка"); + +КонецПроцедуры + +// Обертка для упрощения вызова основной функции +// +Функция ПолучитьПолеСтруктуры(ДанныеСтруктуры, Знач ПутьДанных, ЗначениеПоУмолчанию = Неопределено, УчитыватьРегистр = Ложь) + + Возврат СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДанныеСтруктуры, ПутьДанных, ЗначениеПоУмолчанию, УчитыватьРегистр); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/СервисКриптографииDSSПодтверждениеКлиент.mdo b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/СервисКриптографииDSSПодтверждениеКлиент.mdo new file mode 100644 index 000000000..708e44151 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеКлиент/СервисКриптографииDSSПодтверждениеКлиент.mdo @@ -0,0 +1,10 @@ + + + СервисКриптографииDSSПодтверждениеКлиент + + ru + Сервис криптографии DSS подтверждение клиент + + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеСервер/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеСервер/Module.bsl new file mode 100644 index 000000000..356ce7cab --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеСервер/Module.bsl @@ -0,0 +1,1033 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Специализированный модуль для организации процесса подтверждения операций +// Реализован механизм встраивания в существующие формы (БСП) +// Поддержаны самостоятельные формы подтверждения в базовом функционале облачной подписи +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность + +// Функция подготовки данных цикла подтверждения +// +// Возвращаемое значение: +// Структура: +// * ЭтапЦикла - Строка - варианты: +// Инициализация, Начало, Выбор, Ошибка, Окончание, ВводКода, Проверка, Предупреждение, Ожидание, Отказ. +// * СрокДействия - Неопределено, Дата - срок действия транзакции или подтверждения +// * Идентификатор - Строка - идентификатор аутентификационного испытания +// * ИдентификаторТранзакции - Строка - идентификатор транзакции требующей подтверждения +// * Ошибка - Строка - описание ошибки полученной при разборе результат запроса +// * КодОшибки - Строка - код ошибки полученные при разборе результата запроса +// * ГрафическийКод - Строка - полученный QRCode в формате строки Base64 +// * Заголовок - Строка - заголовок формы подтверждения полученный от потребителя +// * СписокМетодов - Соответствие - варианты подтверждения полученные от сервиса +// * ДоступныеМетоды - Массив - допустимые способы подтверждения полученные от потребителя +// * КодПользователя - Строка - код подтверждения введенный пользователем +// * ТипПодтверждения - Строка - поддерживаемые типы подтверждения: Транзакция, Аутентификация, ПроизвольнаяОперация +// * ШаблонПодтверждения - Строка - имя шаблона подтверждения зарегистрированный на сервисе облачной подписи +// * ОписаниеПодтверждения - Строка - описание операции подтверждения, полученной от сервиса +// * ВторичнаяАвторизация - ПеречислениеСсылка.СпособыАвторизацииDSS - выбранный способ подтверждения +// * Сертификат - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// * ДанныеДокументов - Структура, Массив из Структура - с полями: ИмяФайла, АдресХранилища +// * ПараметрыВариантаВстроенного- Структура - служит для хранения информации встроенного варианта подтверждения +// * ПериодОпроса - Число - период опроса результат подтверждения, актуально для мобильных приложений +// * СрокОпроса - Дата - время последнего вызова сервиса +// * ОбновитьРазмерыФормы - Булево - для встроенного подтверждения, принудительно меняет форму БСП после открытия или смены сертификата +// * КодЯзыка - Строка - служебное поле для ускорения работы с формированием строк сообщений +// * Оформление - Структура - кеш стилей, служебное +// +Функция ДанныеВторичнойАвторизацииПоУмолчанию() Экспорт + + Результат = Новый Структура(); + Результат.Вставить("ЭтапЦикла", "Начало"); + Результат.Вставить("СрокДействия", Неопределено); + Результат.Вставить("Идентификатор", Неопределено); + Результат.Вставить("ГрафическийКод", Неопределено); + Результат.Вставить("Заголовок", ""); + Результат.Вставить("СписокМетодов", Новый Массив); + Результат.Вставить("ДоступныеМетоды", СервисКриптографииDSSСлужебный.ДоступныеСпособыВторичнойАвторизации()); + Результат.Вставить("Ошибка", ""); + Результат.Вставить("КодОшибки", ""); + Результат.Вставить("КодПользователя", ""); + Результат.Вставить("ТипПодтверждения", ""); + Результат.Вставить("ШаблонПодтверждения", ""); + Результат.Вставить("ОписаниеПодтверждения", ""); + Результат.Вставить("ВторичнаяАвторизация", Перечисления.СпособыАвторизацииDSS.ПустаяСсылка()); + Результат.Вставить("ИдентификаторТранзакции", ""); + Результат.Вставить("Сертификат", Неопределено); + Результат.Вставить("ДанныеДокументов", Неопределено); + Результат.Вставить("ПараметрыВариантаВстроенного", Новый Структура); + Результат.Вставить("ПериодОпроса", 3); + Результат.Вставить("СрокОпроса", '19800101'); + Результат.Вставить("ОбновитьРазмерыФормы", Истина); + Результат.Вставить("КодЯзыка", СервисКриптографииDSSСлужебный.КодЯзыка()); + Результат.Вставить("Оформление", Новый Структура()); + + Результат.Оформление.Вставить("ПоясняющийОшибкуТекст", СервисКриптографииDSSСлужебный.ПолучитьЭлементСтиля("ПоясняющийОшибкуТекст", "Цвет")); + Результат.Оформление.Вставить("ПодтверждениеОперацииОписаниеЦвет", СервисКриптографииDSSСлужебный.ПолучитьЭлементСтиля("ПодтверждениеОперацииОписаниеЦвет", "Цвет")); + + Возврат Результат; + +КонецФункции + +// Формирует представление списка документа, операция над которыми требует подтверждения +// +// Параметры: +// ДанныеДокументов - Структура - содержит поле "СписокДокументов" с типом массив +// +// Возвращаемое значение: +// - Строка +// - ФорматированнаяСтрока +// +Функция ПолучитьПредставлениеДокументов(ДанныеДокументов) Экспорт + + Результат = ""; + + Если ТипЗнч(ДанныеДокументов) = Тип("Структура") Тогда + + КоличествоЭлементов = ДанныеДокументов.СписокДокументов.Количество(); + Если КоличествоЭлементов = 1 Тогда + НоваяСтрока = ДанныеДокументов.СписокДокументов[0]; + ИначеЕсли КоличествоЭлементов > 0 Тогда + + ПредставлениеСтроки = СтрокаСЧислом( + НСтр("ru = ';%1 документ;;%1 документа;%1 документов;%1 документов'", СервисКриптографииDSSСлужебный.КодЯзыка()), + КоличествоЭлементов, + ВидЧисловогоЗначения.Количественное); + + НоваяСтрока = ОписаниеДокументаПоУмолчанию(); + НоваяСтрока.НаименованиеФайла = ПредставлениеСтроки; + НоваяСтрока.НавигационнаяСсылка = "Всего" + XMLСтрока(КоличествоЭлементов); + КонецЕсли; + + Результат = ПредставлениеДокумента(НоваяСтрока); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует представление сертификата с помощь которого операция требует подтверждения +// +// Параметры: +// Сертификат - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +// Возвращаемое значение: +// Строка +// +Функция ПолучитьПредставлениеСертификата(Сертификат) Экспорт + + ПредставлениеСертификата = ""; + + Если ЗначениеЗаполнено(Сертификат) Тогда + ПредставлениеСертификата = Сертификат.Представление; + КонецЕсли; + + Возврат ПредставлениеСертификата; + +КонецФункции + +// Формирует представление одиночного документа для форм подтверждения +// +// Параметры: +// СтруктураДокумента - Структура - содержит поля "НаименованиеФайла" и "НавигационнаяСсылка" +// +// Возвращаемое значение: +// ФорматированнаяСтрока +// +Функция ПредставлениеДокумента(СтруктураДокумента) Экспорт + + ОбщаяСтрока = "" + СтруктураДокумента.НаименованиеФайла + ""; + Результат = СтроковыеФункции.ФорматированнаяСтрока(ОбщаяСтрока); + + Возврат Результат; + +КонецФункции + +// Формирует структура описывающую одиночный документ для операций подтверждения +// +// Возвращаемое значение: +// Структура: +// * НаименованиеФайла - Строка - представление документа +// * НавигационнаяСсылка - Строка - навигационная ссылка позволяющая открыть документ +// +Функция ОписаниеДокументаПоУмолчанию() Экспорт + + Результат = Новый Структура; + Результат.Вставить("НаименованиеФайла", ""); + Результат.Вставить("НавигационнаяСсылка", ""); + + Возврат Результат; + +КонецФункции + +// Возвращает описание сертификата, если он является сертификатом облака +// +// Параметры: +// СертификатСсылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// +// Возвращаемое значение: +// Структура: +// * Облачный - Булево +// * Ошибка - Строка - содержит описание проблемы выбранного облачного сертификата +// * Идентификатор - Число - идентификатор облачного сертификата +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS - связанный с данным сертификатом учетная запись +// +Функция ПроверитьВыбранныйСертификат(СертификатСсылка) Экспорт + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + РеквизитыСертификата = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СертификатСсылка, "Программа, Отпечаток", Истина); + Отпечаток = СервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(РеквизитыСертификата.Отпечаток); + + Результат = ДанныеСертификатаПоУмолчанию(); + Результат.Отпечаток = Отпечаток; + + Если НЕ СервисКриптографииDSSСлужебный.ПроверитьПраво("СертификатыПользователяDSS") Тогда + Возврат Результат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СертификатыПользователяDSS.УчетнаяЗаписьDSS КАК УчетнаяЗаписьDSS, + | СертификатыПользователяDSS.Идентификатор КАК Идентификатор + |ИЗ + | РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS + |ГДЕ + | СертификатыПользователяDSS.Отпечаток = &Отпечаток + | И СертификатыПользователяDSS.УчетнаяЗаписьDSS = &Программа + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ ПЕРВЫЕ 1 + | СертификатыПользователяDSS.УчетнаяЗаписьDSS, + | СертификатыПользователяDSS.Идентификатор + |ИЗ + | РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS + |ГДЕ + | СертификатыПользователяDSS.Отпечаток = &Отпечаток + | И СертификатыПользователяDSS.УчетнаяЗаписьDSS <> &Программа"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Отпечаток", Отпечаток); + Запрос.УстановитьПараметр("Программа", РеквизитыСертификата.Программа); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + + ПредставлениеСертификата = НСтр("ru = 'Для сертификата:'", КодЯзыка) + " " + СокрЛП(СертификатСсылка); + Если НЕ ЗначениеЗаполнено(Выборка.УчетнаяЗаписьDSS) Тогда + Результат.Вставить("Ошибка", СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, "СертификатБезУчетнойЗаписи", ПредставлениеСертификата)); + ИначеЕсли РеквизитыСертификата.Программа <> Выборка.УчетнаяЗаписьDSS Тогда + Результат.Вставить("Ошибка", СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, "ЧужойСертификат", ПредставлениеСертификата)); + Иначе + Результат.Вставить("Облачный", Истина); + Результат.Вставить("Идентификатор", Выборка.Идентификатор); + Результат.Вставить("УчетнаяЗапись", Выборка.УчетнаяЗаписьDSS); + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Дополняет настройки пользователя, в случае если нет элемента справочника. +// Например, в процессе восстановления учетной записи по логину. +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения, Неопределено - в данных формы должны быть реквизит НастройкиПользователя +// СерверПодписи - СправочникСсылка.ЭкземплярыСервераDSS, Структура - содержит описание сервера для указанного логина, если +// передана структура, то она должна содержать те же поля в функции СервисКриптографииDSSСлужебный.ПолучитьВсеСерверы. +// Логин - Строка - имя пользователя сервиса облачной подписи +// +Процедура ДополнитьНастройкиПользователя(КонтекстФормы, СерверПодписи, Логин) Экспорт + + РеквизитыФормы = Новый Структура("НастройкиПользователя, ДанныеПодтверждения"); + Если КонтекстФормы <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(РеквизитыФормы, КонтекстФормы); + КонецЕсли; + + Если ТипЗнч(СерверПодписи) = Тип("СправочникСсылка.ЭкземплярыСервераDSS") Тогда + ВсеСерверы = СервисКриптографииDSSСлужебный.ПолучитьВсеСерверы(Новый Структура("Ссылка", СерверПодписи)); + Если ВсеСерверы.Количество() > 0 Тогда + ДанныеСервера = Новый Структура(); + ТекущаяСтрока = ВсеСерверы[0]; + Для Каждого СтрокаКолонки Из ВсеСерверы.Колонки Цикл + ДанныеСервера.Вставить(СтрокаКолонки.Имя, ТекущаяСтрока[СтрокаКолонки.Имя]); + КонецЦикла; + КонецЕсли; + Иначе + ДанныеСервера = СерверПодписи; + КонецЕсли; + + Если КонтекстФормы = Неопределено Тогда + КонтекстФормы = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + СервисКриптографииDSSСлужебный.ДополнитьНастройкиПользователя(КонтекстФормы, ДанныеСервера, Логин); + ИначеЕсли РеквизитыФормы.НастройкиПользователя <> Неопределено Тогда + СервисКриптографииDSSСлужебный.ДополнитьНастройкиПользователя(КонтекстФормы.НастройкиПользователя, ДанныеСервера, Логин); + КонецЕсли; + + Если РеквизитыФормы.ДанныеПодтверждения <> Неопределено Тогда + КонтекстФормы.ДанныеПодтверждения.ШаблонПодтверждения = КонтекстФормы.НастройкиПользователя.ШаблонПодтверждения; + КонецЕсли; + +КонецПроцедуры + +// Подготавливает существующие формы для процедуры подтверждения при создании формы +// Добавляет реквизиты, элементы формы, заполняет нужные данные. +// Для полноценного работы встроенного подтверждения необходимы доработки в целевой форме: +// добавить процедуры для обработки событий добавленных элементов +// Подключаемый_ПодтверждениеОбработкаКоманды +// Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки +// Подключаемый_ПодтверждениеПриИзменении +// Подключаемый_ПодтверждениеОбработчикОжидания +// добавить вызовы в существующие события +// ПриСозданииНаСервере +// ПриОткрытии +// ОбработкаОповещения, добавить обработку событий "ПодтверждениеВыполнитьОсновнуюОперацию", "ПодтверждениеАвторизация" +// также надо позаботиться о заполнении структуры "ДанныеСертификата" +// например при изменении сертификата, см. ПодтверждениеПриИзмененииСертификата. +// Пример реализации встроенного подтверждения можно посмотреть в форме Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПодписаниеДанных. +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - форма куда будут добавлены элементы для организации подтверждения +// ТипОперации - Строка - поддерживаются следующие варианты "Шифрование", "Расшифрование", "Подписание", "Аутентификация" +// ГруппаСертификата - Строка - имя группы, где расположен элементы формы с сертификатом +// ИмяГруппы - Строка - имя группы куда будут размещены элементы +// ИмяГруппыВторой - Строка - имя дополнительной группы для размещения элементов +// ИмяГруппаКоманды - Строка - имя группы для размещения кнопок +// ПараметрыОперации - Неопределено, Структура - позволяет передать дополнительные параметры вызова: +// * ЕстьРазделители - Булево - выводить ли разделителя для обозначения последовательности операций +// +Процедура ПодготовитьГруппуПодтверждения(КонтекстФормы, + ТипОперации, + ГруппаСертификата, + ИмяГруппы, + ИмяГруппыВторой = "", + ИмяГруппаКоманды = "", + ПараметрыОперации = Неопределено) Экспорт + + Если НЕ ФормаПодготовлена(КонтекстФормы) Тогда + ПодготовитьГруппуПодтвержденияРеквизиты(КонтекстФормы); + ПодготовитьГруппуПодтвержденияИнициализация(КонтекстФормы); + + ЕстьРазделители = ТипОперации <> "Шифрование" + И ТипОперации <> "Проверка" + И СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ПараметрыОперации, "ЕстьРазделители", Истина); + + КонтекстФормы.ИменаГруппКонтейнера.Вставить("ГруппаСертификата", ГруппаСертификата); + КонтекстФормы.ИменаГруппКонтейнера.Вставить("КонтейнерЭлементов1", ИмяГруппы); + КонтекстФормы.ИменаГруппКонтейнера.Вставить("КонтейнерЭлементов2", ИмяГруппыВторой); + КонтекстФормы.ИменаГруппКонтейнера.Вставить("ГруппаКоманды", ИмяГруппаКоманды); + КонтекстФормы.ИменаГруппКонтейнера.Вставить("ЕстьРазделители", ЕстьРазделители); + + КонтекстФормы.ПодтверждениеТипОперации = ТипОперации; + Если ТипОперации <> "Проверка" Тогда + ПодготовитьГруппуПодтвержденияЭлементы(КонтекстФормы); + КонецЕсли; + СервисКриптографииDSSСлужебныйВызовСервера.НачальныеНастройкиФормы(КонтекстФормы.ИмяФормы); + КонецЕсли; + +КонецПроцедуры + +// Дополняет данные подтверждения для произвольного подтверждения для встроенного варианта +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения - содержит реквизиты: +// * ДанныеПодтверждения - см. ДанныеВторичнойАвторизацииПоУмолчанию +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// * Логин - Строка +// * СпособПодтверждения - ПеречислениеСсылка.СпособыАвторизацииDSS +// * ЗапомнитьПарольЛогина - Булево +// * ПарольЛогина - Строка +// * ГрафическийКод - Строка +// ЗаголовокОперации - Строка +// ПервичнаяАвторизация - Строка +// - ПеречислениеСсылка.СпособыАвторизацииDSS +// ВторичнаяАвторизация - Строка +// - ПеречислениеСсылка.СпособыАвторизацииDSS +// Логин - Неопределено, Строка - логина пользователя +// ПараметрыОперации - Структура: +// * ТипПодтверждения - Строка +// +Процедура ДополнитьПроизвольноеПодтверждение( + КонтекстФормы, + ЗаголовокОперации, + ПервичнаяАвторизация, + ВторичнаяАвторизация, + Логин = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ДанныеСертификата = КонтекстФормы.ДанныеСертификата; + ДанныеПодтверждения = КонтекстФормы.ДанныеПодтверждения; + НастройкиПользователя = КонтекстФормы.НастройкиПользователя; + НастройкиПользователя.ПервичнаяАутентификация = ПолучитьЗначениеПеречисления(ПервичнаяАвторизация); + + ДанныеСертификата.Облачный = Истина; + Если Логин <> Неопределено Тогда + НастройкиПользователя.Логин = Логин; + ДанныеПодтверждения.ПараметрыВариантаВстроенного.ЕстьАвторизация = Истина; + КонецЕсли; + + ДанныеПодтверждения.ТипПодтверждения = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ПараметрыОперации, "ТипПодтверждения", "ПроизвольнаяОперация"); + ДанныеПодтверждения.ЭтапЦикла = "Инициализация"; + ДанныеПодтверждения.Заголовок = ЗаголовокОперации; + ДанныеПодтверждения.СрокДействия = СервисКриптографииDSSСлужебный.ДатаСеанса() + 60 * 5; + ДанныеПодтверждения.Сертификат = СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя(); + ДанныеПодтверждения.Сертификат.ТребуетсяПинКод = Ложь; + Если ЗначениеЗаполнено(ВторичнаяАвторизация) Тогда + ДанныеПодтверждения.ДоступныеМетоды = СформироватьСписокМетодовАвторизации(ВторичнаяАвторизация); + КонецЕсли; + + Если ДанныеПодтверждения.ДоступныеМетоды.Найти(ДанныеПодтверждения.ВторичнаяАвторизация) = Неопределено + И ДанныеПодтверждения.ДоступныеМетоды.Количество() > 0 Тогда + ДанныеПодтверждения.ВторичнаяАвторизация = ДанныеПодтверждения.ДоступныеМетоды[0]; + Иначе + ДанныеПодтверждения.ВторичнаяАвторизация = НастройкиПользователя.ВторичнаяАвторизация; + КонецЕсли; + + КонтекстФормы.Логин = НастройкиПользователя.Ссылка; + КонтекстФормы.ЗапомнитьПарольЛогина = НастройкиПользователя.ЗапоминатьПароли; + КонтекстФормы.ГрафическийКод = ""; + ТекущийПароль = Неопределено; + + Если НастройкиПользователя.ПервичнаяАутентификация = Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации Тогда + ТекущийПароль = НастройкиПользователя.ПарольСертификата; + Иначе + ТекущийПароль = НастройкиПользователя.Пароль; + КонецЕсли; + + ЗначениеПароля = СервисКриптографииDSSКлиентСервер.ПолучитьЗначениеПароля(ТекущийПароль, НастройкиПользователя.АвторизованныйПользователь); + КонтекстФормы.ПарольЛогина = ЗначениеПароля; + + КонтекстФормы.НастройкиПользователя = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(НастройкиПользователя); + КонтекстФормы.ДанныеПодтверждения = ДанныеПодтверждения; + КонтекстФормы.СпособПодтверждения = ДанныеПодтверждения.ВторичнаяАвторизация; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +#Область СамостоятельныеПодтверждение + +// Служебная общая процедура вызываемая при создании формы самостоятельного подтверждения +// +Процедура ПодготовитьФормуПодтвержденияПриСоздании(КонтекстФормы) Экспорт + + Параметры = КонтекстФормы.Параметры; + + КонтекстФормы.ВремяИстекло = Ложь; + КонтекстФормы.ДанныеПодтверждения = Параметры.ДанныеПодтверждения; + КонтекстФормы.Сертификат = Параметры.Сертификат; + КонтекстФормы.ДанныеДокументов = Параметры.ДанныеДокументов; + КонтекстФормы.НастройкиПользователя = Параметры.НастройкиПользователя; + КонтекстФормы.ПредставлениеДокументов = ПолучитьПредставлениеДокументов(КонтекстФормы.ДанныеДокументов); + КонтекстФормы.ПредставлениеСертификата = ПолучитьПредставлениеСертификата(КонтекстФормы.Сертификат); + КонтекстФормы.СпособПодтверждения = КонтекстФормы.ДанныеПодтверждения.ВторичнаяАвторизация; + + Если ЗначениеЗаполнено(Параметры.ЗаголовокФормы) Тогда + КонтекстФормы.Заголовок = Параметры.ЗаголовокФормы; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ВстроенноеПодтверждение + +// Перезаполняет служебные данные формы в случае смены сертификата +// +// Параметры: +// КонтекстФормы - ФормаКлиентскогоПриложения +// Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// +Процедура ПодтверждениеПриИзмененииСертификата(КонтекстФормы, Сертификат) Экспорт + + НовыйСтатус = Ложь; + + Если ЗначениеЗаполнено(Сертификат) Тогда + + ДанныеСертификата = ПроверитьВыбранныйСертификат(Сертификат); + КонтекстФормы.ДанныеСертификата = ДанныеСертификата; + ДанныеПодтверждения = ДанныеВторичнойАвторизацииПоУмолчанию(); + + ДополнитьДанныеПодтверждения(ДанныеПодтверждения); + + ДанныеПодтверждения.ЭтапЦикла = "Инициализация"; + НовыйСтатус = ДанныеСертификата.Облачный; + + Если ДанныеСертификата.Облачный + И ЗначениеЗаполнено(ДанныеСертификата.Ошибка) Тогда + НовыйСтатус = Ложь; + КонецЕсли; + + Если НовыйСтатус Тогда + + НастройкиПользователя = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(ДанныеСертификата.УчетнаяЗапись); + ДанныеПодтверждения.Сертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, ДанныеСертификата.Идентификатор); + + ДанныеПодтверждения.ТипПодтверждения = "Транзакция"; + ДанныеПодтверждения.Заголовок = НСтр("ru = 'Подписание данных'", ДанныеПодтверждения.КодЯзыка); + + ДанныеПодтверждения.ВторичнаяАвторизация = НастройкиПользователя.ВторичнаяАвторизация; + ДанныеПодтверждения.СрокДействия = СервисКриптографииDSSСлужебный.ДатаСеанса() + 60 * 5; + + Авторизован = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, СервисКриптографииDSSСлужебный.ДатаСеанса()); + ДваЭтапа = НЕ ЗначениеРеквизитаФормы(КонтекстФормы, "БезПодтверждения", Ложь) + ИЛИ НЕ Авторизован + ИЛИ ДанныеПодтверждения.Сертификат.ТребуетсяПинКод; + + ДанныеПодтверждения.ПараметрыВариантаВстроенного.ЕстьАвторизация = НЕ Авторизован; + + Если НЕ ДваЭтапа Тогда + ДанныеПодтверждения.ЭтапЦикла = "Начало"; + КонецЕсли; + + КонтекстФормы.Логин = НастройкиПользователя.Ссылка; + КонтекстФормы.ЗапомнитьПарольЛогина = НастройкиПользователя.ЗапоминатьПароли; + + КонтекстФормы.ГрафическийКод = ""; + + ТекущийПароль = Неопределено; + Если НастройкиПользователя.ПервичнаяАутентификация = Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации Тогда + ТекущийПароль = НастройкиПользователя.ПарольСертификата; + Иначе + ТекущийПароль = НастройкиПользователя.Пароль; + КонецЕсли; + + ЗначениеПароля = СервисКриптографииDSSКлиентСервер.ПолучитьЗначениеПароля(ТекущийПароль, НастройкиПользователя.АвторизованныйПользователь); + КонтекстФормы.ПарольЛогина = ЗначениеПароля; + + КонтекстФормы.НастройкиПользователя = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(НастройкиПользователя); + КонтекстФормы.ДанныеПодтверждения = ДанныеПодтверждения; + КонтекстФормы.СпособПодтверждения = ДанныеПодтверждения.ВторичнаяАвторизация; + + КонецЕсли; + + Иначе + КонтекстФормы.ДанныеСертификата = ДанныеСертификатаПоУмолчанию(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Формирует массив способов авторизации по входящим данным +// +// Параметры: +// ВариантыАвторизации - Строка, ПеречислениеСсылка.СпособыАвторизацииDSS, Массив - если передан массив, +// то он может быть строкой или перечислением. +// +Функция СформироватьСписокМетодовАвторизации(ВариантыАвторизации) + + Результат = Новый Массив; + + Если ТипЗнч(ВариантыАвторизации) <> Тип("Массив") Тогда + ОбщийСписок = Новый Массив; + ОбщийСписок.Добавить(ВариантыАвторизации); + Иначе + ОбщийСписок = ВариантыАвторизации; + КонецЕсли; + + Для Каждого СтрокаМассива Из ОбщийСписок Цикл + ТекущееЗначение = ПолучитьЗначениеПеречисления(СтрокаМассива); + Если ЗначениеЗаполнено(ТекущееЗначение) Тогда + Результат.Добавить(ТекущееЗначение); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Преобразует строковое представление Перечисления.СпособыАвторизацииDSS в случае необходимости +// +// Параметры: +// ТекущееЗначение - Строка +// - ПеречислениеСсылка.СпособыАвторизацииDSS +// +// Возвращаемое значение: +// ПеречислениеСсылка.СпособыАвторизацииDSS +// +Функция ПолучитьЗначениеПеречисления(ТекущееЗначение) + + Результат = Неопределено; + + Если ТипЗнч(ТекущееЗначение) = Тип("Строка") Тогда + Результат = Перечисления.СпособыАвторизацииDSS[ТекущееЗначение]; + Иначе + Результат = ТекущееЗначение; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Подготавливает структуру "ДанныеСертификата" для встроенного подтверждения +// +Функция ДанныеСертификатаПоУмолчанию() + + Результат = Новый Структура; + Результат.Вставить("Облачный", Ложь); + Результат.Вставить("Ошибка", ""); + Результат.Вставить("Отпечаток", ""); + Результат.Вставить("УчетнаяЗапись", Справочники.УчетныеЗаписиDSS.ПустаяСсылка()); + Результат.Вставить("Идентификатор", 0); + + Возврат Результат; + +КонецФункции + +// Дополняет данные цикла подтверждения реквизитами для работы во встроенном режиме +// +Процедура ДополнитьДанныеПодтверждения(ДанныеПодтверждения) + + ДанныеПодтверждения.ПараметрыВариантаВстроенного.Вставить("ЕстьАвторизация", Ложь); + ДанныеПодтверждения.ПараметрыВариантаВстроенного.Вставить("ПинКод", "");// данное поле задействовано в интегрированных формах + ДанныеПодтверждения.ПараметрыВариантаВстроенного.Вставить("ПинКодПроверен", Ложь); + ДанныеПодтверждения.ПараметрыВариантаВстроенного.Вставить("ПакетнаяОперация", Ложь); + ДанныеПодтверждения.ПараметрыВариантаВстроенного.Вставить("ТипРезультата", Неопределено); + ДанныеПодтверждения.ПараметрыВариантаВстроенного.Вставить("ПарольВПамяти", Ложь); + +КонецПроцедуры + +// Безопасное получение реквизиты формы, с проверка его наличия +// +Функция ЗначениеРеквизитаФормы(КонтекстФормы, ИмяРеквизита, ЗначениеПоУмолчанию = Неопределено) + + Результат = ЗначениеПоУмолчанию; + + ИщемСвойство = Новый Структура(ИмяРеквизита); + ЗаполнитьЗначенияСвойств(ИщемСвойство, КонтекстФормы); + + Если ИщемСвойство[ИмяРеквизита] <> Неопределено Тогда + Результат = ИщемСвойство[ИмяРеквизита]; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Создает дополнительные реквизиты формы для встроенного подтверждения +// +Процедура ПодготовитьГруппуПодтвержденияРеквизиты(КонтекстФормы) + + // создать реквизиты формы и инициализируем значения + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + МассивРеквизитов = Новый Массив; + + // - представление галки запомнить пароль + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ЗапомнитьПарольЛогина", Новый ОписаниеТипов("Булево"), + НСтр("ru = 'Запомнить пароль'", КодЯзыка)); + // - представление способа подтверждения + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "СпособПодтверждения", Новый ОписаниеТипов("ПеречислениеСсылка.СпособыАвторизацииDSS"), + НСтр("ru = 'Запомнить пароль'", КодЯзыка)); + // - структура сессионных данных + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "НастройкиПользователя", Новый ОписаниеТипов(), + НСтр("ru = 'Настройки пользователя'", КодЯзыка)); + // - структура содержит данные цикла обмена с сервисом + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ДанныеПодтверждения", Новый ОписаниеТипов(), + НСтр("ru = 'Данные подтверждения'", КодЯзыка)); + // - структура содержит общие данные выбранного сертификата + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ДанныеСертификата", Новый ОписаниеТипов(), + НСтр("ru = 'Данные сертификата'", КодЯзыка)); + // - данные поля ввода для кода подтверждения + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "КодПодтверждения", Новый ОписаниеТипов("Строка"), + НСтр("ru = 'Код подтверждения'", КодЯзыка)); + // - признак для блокировки повторного запроса на сервер + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ОжидатьВыполнения", Новый ОписаниеТипов("Булево"), + НСтр("ru = 'Ожидать подтверждения'", КодЯзыка)); + // - строка полученная от сервера + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ИнформацияСервера", Новый ОписаниеТипов("Строка"), + НСтр("ru = 'Информация сервера'", КодЯзыка)); + // - справочник учетных записей + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "Логин", Новый ОписаниеТипов("СправочникСсылка.УчетныеЗаписиDSS"), + НСтр("ru = 'Логин'", КодЯзыка)); + // - пароль или пин-код для логина + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ПарольЛогина", Новый ОписаниеТипов("Строка"), + НСтр("ru = 'Пароль пользователя'", КодЯзыка)); + // - адрес графического кода во временном хранилище + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ГрафическийКод", Новый ОписаниеТипов("Строка"), + НСтр("ru = 'Графический код'", КодЯзыка)); + // - имя группы контейнера + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ИменаГруппКонтейнера", Новый ОписаниеТипов(), + НСтр("ru = 'Имя группы'", КодЯзыка)); + // - идентификатор типа операции + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ПодтверждениеТипОперации", Новый ОписаниеТипов("Строка"), + НСтр("ru = 'Идентификатор типа операции'", КодЯзыка)); + // - представление состояние сертификата авторизации + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ПодтверждениеПредставлениеСертификата", Новый ОписаниеТипов("Строка"), + НСтр("ru = 'Состояние сертификата'", КодЯзыка)); + // - структура содержит общие данные выбранного сертификата + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ПодтверждениеДанныеСертификата", Новый ОписаниеТипов(), + НСтр("ru = 'Данные сертификата авторизации'", КодЯзыка)); + + // - служебные реквизиты для оформления + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ПодтверждениеШаг1", Новый ОписаниеТипов("Число")); + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ПодтверждениеШаг2", Новый ОписаниеТипов("Число")); + ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, "ПодтверждениеШаг3", Новый ОписаниеТипов("Число")); + + КонтекстФормы.ИзменитьРеквизиты(МассивРеквизитов,); + +КонецПроцедуры + +// Добавляет новый реквизит в форме. Также производится проверка на существование такого реквизита. +// Может потребоваться в случае индивидуального оформления формы, но тип реквизиты должен соответствовать ожидаемому. +// +Функция ДобавитьНовыйРеквизит(КонтекстФормы, МассивРеквизитов, ИмяНовогоРеквизита, ТипРеквизита, ЗаголовокРеквизита = "") + + Результат = Ложь; + ИщемПоле = Новый Структура(ИмяНовогоРеквизита, Null); + ЗаполнитьЗначенияСвойств(ИщемПоле, КонтекстФормы); + + Если ИщемПоле[ИмяНовогоРеквизита] = Null Тогда + НовыйРеквизит = Новый РеквизитФормы(ИмяНовогоРеквизита, ТипРеквизита, , ЗаголовокРеквизита); + МассивРеквизитов.Добавить(НовыйРеквизит); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Производит начальное заполнение добавленных реквизитов для встроенного подтверждения +// +Процедура ПодготовитьГруппуПодтвержденияИнициализация(КонтекстФормы) + + КонтекстФормы.ЗапомнитьПарольЛогина = Истина; + КонтекстФормы.ДанныеСертификата = ДанныеСертификатаПоУмолчанию(); + КонтекстФормы.ДанныеПодтверждения = ДанныеВторичнойАвторизацииПоУмолчанию(); + КонтекстФормы.НастройкиПользователя = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + КонтекстФормы.ИменаГруппКонтейнера = Новый Структура; + ДополнитьДанныеПодтверждения(КонтекстФормы.ДанныеПодтверждения); + +КонецПроцедуры + +// Проверяет, была ли подготовлена форма для встроенного подтверждения +// +Функция ФормаПодготовлена(КонтекстФормы) + + ВсеСвойства = Новый Структура("ИменаГруппКонтейнера", Неопределено); + ЗаполнитьЗначенияСвойств(ВсеСвойства, КонтекстФормы); + Результат = ВсеСвойства.ИменаГруппКонтейнера <> Неопределено; + Возврат Результат; + +КонецФункции + +// Добавляет нужные элементы на форму для встроенного подтверждения +// +Процедура ПодготовитьГруппуПодтвержденияЭлементы(КонтекстФормы) + + СписокГрупп = КонтекстФормы.ИменаГруппКонтейнера; + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + ЭлементыФормы = КонтекстФормы.Элементы; + ИспользованиеВозможно = СервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи(); + + КонтейнерОбщий = ЭлементыФормы[СписокГрупп.ГруппаСертификата]; + КонтейнерПервый = ЭлементыФормы[СписокГрупп.КонтейнерЭлементов1]; + КонтейнерВторой = КонтейнерПервый; + КонтейнерКоманд = КонтейнерПервый; + + Если ЗначениеЗаполнено(СписокГрупп.КонтейнерЭлементов2) Тогда + КонтейнерВторой = КонтекстФормы.Элементы[СписокГрупп.КонтейнерЭлементов2]; + КонецЕсли; + + Если ЗначениеЗаполнено(СписокГрупп.ГруппаКоманды) Тогда + КонтейнерКоманд = КонтекстФормы.Элементы[СписокГрупп.ГруппаКоманды]; + КонецЕсли; + + ЕстьРазделители = СписокГрупп.ЕстьРазделители И ИспользованиеВозможно; + + ЭлементФормы = ДобавитьРазделитель(ЭлементыФормы, ЕстьРазделители, "ПодтверждениеРазделитель1", КонтейнерОбщий, "1", "Первый", НСтр("ru = 'Данные сертификата'", КодЯзыка)); + ЭлементФормы = ДобавитьРазделитель(ЭлементыФормы, ЕстьРазделители, "ПодтверждениеРазделитель2", КонтейнерПервый, "2", , НСтр("ru = 'Данные учетной записи'", КодЯзыка)); + ГруппаПодтвержденияУчетнаяЗапись = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗапись", КонтейнерПервый); + ГруппаПодтвержденияУчетнаяЗаписьВеб = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗаписьВеб", КонтейнерПервый); + ЭлементФормы = ДобавитьРазделитель(ЭлементыФормы, ЕстьРазделители, "ПодтверждениеРазделитель3", КонтейнерПервый, "3", , НСтр("ru = 'Подтверждение операции'", КодЯзыка)); + ГруппаПодтвержденияОписание = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтвержденияОписание", КонтейнерПервый); + ГруппаПодтвержденияВыбор = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтвержденияВыбор", КонтейнерПервый); + ГруппаПодтвержденияОнлайн = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтвержденияОнлайн", КонтейнерВторой); + ГруппаПодтвержденияОфлайн = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтвержденияОфлайн", КонтейнерВторой); + ГруппаПодтвержденияКод = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтвержденияКод", КонтейнерКоманд); + Если КонтейнерКоманд = КонтейнерПервый Тогда + ЭлементФормы = ДобавитьРазделитель(ЭлементыФормы, ЕстьРазделители, "ПодтверждениеРазделитель4", КонтейнерВторой); + КонецЕсли; + + // добавить команды формы + // + ДобавитьКоманду(КонтекстФормы, "ПодтверждениеОК"); + ДобавитьКоманду(КонтекстФормы, "ПодтверждениеПовторить"); + ДобавитьКоманду(КонтекстФормы, "ПодтверждениеАвторизация"); + + ГруппаПодтвержденияУчетнаяЗапись.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеЛогин", НСтр("ru = 'Уч. запись'", КодЯзыка), ГруппаПодтвержденияУчетнаяЗапись, , "ПолеВвода"); + УстановитьПутьКДанным(ЭлементФормы, "Логин"); + ЭлементФормы.ТолькоПросмотр = Истина; + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеПредставлениеСертификата", НСтр("ru = 'Сертификат авторизации'", КодЯзыка), ГруппаПодтвержденияУчетнаяЗапись, , "ПолеВвода"); + УстановитьПутьКДанным(ЭлементФормы, "ПодтверждениеПредставлениеСертификата"); + ЭлементФормы.ВысотаЗаголовка = 2; + ЭлементФормы.КнопкаВыбора = Истина; + ЭлементФормы.КартинкаКнопкиВыбора = БиблиотекаКартинок.ОткрытьФайл; + ЭлементФормы.РедактированиеТекста = Ложь; + ЭлементФормы.ПропускатьПриВводе = Истина; + ЭлементФормы.РастягиватьПоГоризонтали = Ложь; + ЭлементФормы.ПодсказкаВвода = НСтр("ru = 'Загрузите сертификат авторизации'", КодЯзыка); + ЭлементФормы.УстановитьДействие("НачалоВыбора", "Подключаемый_ПодтверждениеНачалоВыбора"); + + ВременнаяГруппа = ДобавитьГруппу(ЭлементыФормы, "ГруппаПодтверждениеПарольЗапомнить", ГруппаПодтвержденияУчетнаяЗапись); + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеПароль", НСтр("ru = 'Пароль'", КодЯзыка), ВременнаяГруппа, , "ПолеВвода"); + УстановитьПутьКДанным(ЭлементФормы, "ПарольЛогина"); + ЭлементФормы.ПропускатьПриВводе = Ложь; + ЭлементФормы.РежимПароля = Истина; + ЭлементФормы.РастягиватьПоГоризонтали = Ложь; + ЭлементФормы.ОграничениеТипа = Новый ОписаниеТипов("Строка"); + ЭлементФормы.ПодсказкаВвода = НСтр("ru = 'введите пароль'", КодЯзыка); + ЭлементФормы.УстановитьДействие("ПриИзменении", "Подключаемый_ПодтверждениеПриИзменении"); + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеЗапомнитьПарольЛогина", НСтр("ru = 'Запомнить пароль'", КодЯзыка), ВременнаяГруппа, , "ПолеФлажка"); + УстановитьПутьКДанным(ЭлементФормы, "ЗапомнитьПарольЛогина"); + ЭлементФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + ЭлементФормы.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; + ЭлементФормы.Подсказка = НСтр("ru = 'Пароль сохраняется на время сессии работы в 1С'", КодЯзыка); + ЭлементФормы.УстановитьДействие("ПриИзменении", "Подключаемый_ПодтверждениеПриИзменении"); + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеПредупреждениеВеб", "Пример", ГруппаПодтвержденияУчетнаяЗаписьВеб, "ДекорацияФормы"); + ЭлементФормы.Заголовок = НСтр("ru = 'Требуется авторизация на сервере облачной подписи'", КодЯзыка); + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеАвторизацияВеб", НСтр("ru = 'Авторизация'", КодЯзыка), ГруппаПодтвержденияУчетнаяЗаписьВеб, "КнопкаФормы"); + УстановитьПутьКДанным(ЭлементФормы, "ПодтверждениеАвторизация", "ИмяКоманды"); + ЭлементФормы.Вид = ВидКнопкиФормы.Гиперссылка; + + ГруппаПодтвержденияВыбор.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеСпособПодтверждения", НСтр("ru = 'Способ подтверждения'", КодЯзыка), ГруппаПодтвержденияВыбор, , "ПолеВвода"); + УстановитьПутьКДанным(ЭлементФормы, "СпособПодтверждения"); + ЭлементФормы.ВысотаЗаголовка = 2; + ЭлементФормы.РежимВыбораИзСписка = Истина; + ЭлементФормы.РедактированиеТекста = Ложь; + ЭлементФормы.УстановитьДействие("ПриИзменении", "Подключаемый_ПодтверждениеПриИзменении"); + ЭлементФормы.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; + ЭлементФормы.РасширеннаяПодсказка.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_ПодтверждениеОбработкаНавигационнойСсылки"); + ЭлементФормы.АвтоОтметкаНезаполненного = Истина; + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеСпособПодтвержденияОшибка", "", ГруппаПодтвержденияВыбор, "ДекорацияФормы", "Надпись"); + ЭлементФормы.Заголовок = " " + НСтр("ru = 'Для продолжения укажите способ подтверждения'"); + ЭлементФормы.Высота = 1; + ЭлементФормы.РастягиватьПоГоризонтали = Истина; + ЭлементФормы.АвтоМаксимальнаяВысота = Ложь; + ЭлементФормы.АвтоМаксимальнаяШирина = Ложь; + ЭлементФормы.Шрифт = СервисКриптографииDSSСлужебный.ПолучитьЭлементСтиля("МелкийЗаголовокПодтвержденияШрифт"); + ЭлементФормы.ЦветТекста = WebЦвета.Серый; + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеИнформацияСервераЗаголовок", "", ГруппаПодтвержденияОписание, "ДекорацияФормы", "Надпись"); + ЭлементФормы.Высота = 2; + ЭлементФормы.Ширина = 9; + ЭлементФормы.РастягиватьПоГоризонтали = Ложь; + ЭлементФормы.АвтоМаксимальнаяВысота = Ложь; + ЭлементФормы.АвтоМаксимальнаяШирина = Ложь; + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеИнформацияСервера", НСтр("ru = 'Сообщение сервиса'", КодЯзыка), ГруппаПодтвержденияОписание, , "ПолеНадписи"); + УстановитьПутьКДанным(ЭлементФормы, "ИнформацияСервера"); + ЭлементФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ЭлементФормы.ЦветТекста = СервисКриптографииDSSСлужебный.ПолучитьЭлементСтиля("ПодтверждениеОперацииОписаниеЦвет", "Цвет"); + ЭлементФормы.АвтоМаксимальнаяВысота = Ложь; + ЭлементФормы.АвтоМаксимальнаяШирина = Ложь; + ЭлементФормы.РастягиватьПоГоризонтали = Истина; + ЭлементФормы.РастягиватьПоВертикали = Истина; + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеКодПодтверждения", НСтр("ru = 'Код подтверждения'", КодЯзыка), ГруппаПодтвержденияКод, , "ПолеВвода"); + УстановитьПутьКДанным(ЭлементФормы, "КодПодтверждения"); + ЭлементФормы.ВысотаЗаголовка = 2; + ЭлементФормы.Ширина = 8; + ЭлементФормы.ПропускатьПриВводе = Ложь; + ЭлементФормы.РастягиватьПоГоризонтали = Ложь; + ЭлементФормы.РастягиватьПоВертикали = Ложь; + ЭлементФормы.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.ПриИзмененииЗначения; + ЭлементФормы.УстановитьДействие("ПриИзменении", "Подключаемый_ПодтверждениеПриИзменении"); + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеОК", "ОК", ГруппаПодтвержденияКод, "КнопкаФормы"); + УстановитьПутьКДанным(ЭлементФормы, "ПодтверждениеОК", "ИмяКоманды"); + ЭлементФормы.ПропускатьПриВводе = Ложь; + + ГруппаИнструкции = ДобавитьГруппу(ЭлементыФормы, "ПодтверждениеИнструкция", ГруппаПодтвержденияКод, , , НСтр("ru = 'Требуется помощь?'", КодЯзыка)); + ГруппаИнструкции.Поведение = ПоведениеОбычнойГруппы.Всплывающая; + ГруппаИнструкции.Отображение = ОтображениеОбычнойГруппы.Нет; + ГруппаИнструкции.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлемента.Центр; + + ТекстИнструкции = НСтр("ru = '1. Откройте мобильное приложение на своем устройстве. + |2. Наведите камеру устройства на QR-код. + |3. Введите код подтверждения или код отказа.'"); + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеСодержаниеИнструкции", ТекстИнструкции, ГруппаИнструкции, "ДекорацияФормы", "Надпись"); + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеПовторить", НСтр("ru = 'Выслать заново'", КодЯзыка), ГруппаПодтвержденияКод, "КнопкаФормы"); + УстановитьПутьКДанным(ЭлементФормы, "ПодтверждениеПовторить", "ИмяКоманды"); + ЭлементФормы.Ширина = 13; + + ГруппаПодтвержденияОнлайн.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Центр; + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеАнимация", НСтр("ru = 'Анимация'", КодЯзыка), ГруппаПодтвержденияОнлайн, "ДекорацияФормы", "Картинка"); + ЭлементФормы.ТекстНевыбраннойКартинки = НСтр("ru = 'Анимация'", КодЯзыка); + ЭлементФормы.РастягиватьПоГоризонтали = Истина; + ЭлементФормы.Картинка = БиблиотекаКартинок.АнимацияПодтверждения; + ЭлементФормы.Рамка = СервисКриптографииDSSСлужебный.ПолучитьЭлементСтиля("ПоУмолчанию", "Рамка"); + ЭлементФормы.Высота = 9; + ЭлементФормы.Ширина = 23; + + ГруппаПодтвержденияОфлайн.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Центр; + ГруппаПодтвержденияОфлайн.ВертикальноеПоложениеПодчиненных = ВертикальноеПоложениеЭлемента.Центр; + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, "ПодтверждениеГрафическийКод", "QR-code", ГруппаПодтвержденияОфлайн, , "ПолеКартинки"); + УстановитьПутьКДанным(ЭлементФормы, "ГрафическийКод"); + ЭлементФормы.РастягиватьПоГоризонтали = Истина; + ЭлементФормы.Высота = 9; + ЭлементФормы.Ширина = 23; + ЭлементФормы.РазмерКартинки = РазмерКартинки.Пропорционально; + ЭлементФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ЭлементФормы.ТекстНевыбраннойКартинки = НСтр("ru = 'Код для сканирования'", КодЯзыка); + ЭлементФормы.Рамка = СервисКриптографииDSSСлужебный.ПолучитьЭлементСтиля("ПоУмолчанию", "Рамка"); + +КонецПроцедуры + +// Служебная функция, устанавливает путь к данным, если нужно +Процедура УстановитьПутьКДанным(ЭлементФормы, ПутьКДанным, КлючевойРеквизит = "ПутьКДанным") + + Если ПустаяСтрока(ЭлементФормы[КлючевойРеквизит]) Тогда + ЭлементФормы[КлючевойРеквизит] = ПутьКДанным; + КонецЕсли; + +КонецПроцедуры + +// Служебная функция добавления группы элементов для разделителя шага подтверждения +// +Функция ДобавитьРазделитель(ЭлементыФормы, СоздаватьРазделитель, ИмяЭлемента, ЭлементВладелец, ДобавитьНомер = "", ЭлементВставки = Неопределено, Заголовок = "") + + ВладелецГруппа = ЭлементВладелец; + + Если СоздаватьРазделитель Тогда + ВладелецГруппа = ДобавитьГруппу(ЭлементыФормы, ИмяЭлемента, ЭлементВладелец, , ЭлементВставки); + ВладелецГруппа.ВертикальноеПоложениеПодчиненных = ВертикальноеПоложениеЭлемента.Центр; + + Если ЗначениеЗаполнено(ДобавитьНомер) Тогда + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, ИмяЭлемента + "Номер", "", ВладелецГруппа, "ПолеФормы", "ПолеКартинки"); + ЭлементФормы.ПутьКДанным = "ПодтверждениеШаг" + ДобавитьНомер; + ЭлементФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ЭлементФормы.Рамка = СервисКриптографииDSSСлужебный.ПолучитьЭлементСтиля("ПоУмолчанию", "Рамка"); + ЭлементФормы.КартинкаЗначений = БиблиотекаКартинок.ЭтапыПодтверждения; + ЭлементФормы.РастягиватьПоГоризонтали = Ложь; + КонецЕсли; + + ЭлементФормы = ДобавитьЭлемент(ЭлементыФормы, ИмяЭлемента + "Линия", "", ВладелецГруппа, "ДекорацияФормы", "Картинка"); + ЭлементФормы.АвтоМаксимальнаяШирина = Ложь; + ЭлементФормы.АвтоМаксимальнаяВысота = Ложь; + ЭлементФормы.РастягиватьПоГоризонтали = Истина; + ЭлементФормы.РастягиватьПоВертикали = Ложь; + ЭлементФормы.Высота = 1; + ЭлементФормы.Картинка = БиблиотекаКартинок.РазделительШагов; + ЭлементФормы.РазмерКартинки = РазмерКартинки.Растянуть; + + КонецЕсли; + + Возврат ВладелецГруппа; + +КонецФункции + +// Служебная функция добавления группы формы +// +Функция ДобавитьГруппу(ЭлементыФормы, ИмяГруппы, ЭлементВладелец, ТипГруппы = "ГруппаФормы", ЭлементВставки = Неопределено, Заголовок = "") + + КудаВставить = ЭлементВставки; + Если ЭлементВставки = "Первый" Тогда + КудаВставить = ЭлементВладелец.ПодчиненныеЭлементы[0]; + КонецЕсли; + + НашлиЭлемент = ЭлементыФормы.Найти(ИмяГруппы); + Если НашлиЭлемент = Неопределено Тогда + Результат = ЭлементыФормы.Вставить(ИмяГруппы, Тип(ТипГруппы), ЭлементВладелец, КудаВставить); + Иначе + Результат = НашлиЭлемент; + КонецЕсли; + + Результат.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Результат.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + Результат.РастягиватьПоВертикали = Ложь; + Результат.СквозноеВыравнивание = СквозноеВыравнивание.Использовать; + Результат.РастягиватьПоГоризонтали = Неопределено; + Результат.Видимость = Ложь; + + Если ЗначениеЗаполнено(Заголовок) Тогда + Результат.Заголовок = Заголовок; + Результат.ОтображатьЗаголовок = Истина; + Результат.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; + Иначе + Результат.ОтображатьЗаголовок = Ложь; + Результат.Отображение = ОтображениеОбычнойГруппы.Нет; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для добавления элемента формы различных видов +// +Функция ДобавитьЭлемент(ЭлементыФормы, ИмяЭлемента, ЗаголовокЭлемента, ЭлементВладелец, ТипЭлемента = "ПолеФормы", ВидПоля = "") + + НашлиЭлемент = ЭлементыФормы.Найти(ИмяЭлемента); + Если НашлиЭлемент = Неопределено Тогда + Результат = ЭлементыФормы.Добавить(ИмяЭлемента, Тип(ТипЭлемента), ЭлементВладелец); + Иначе + Результат = НашлиЭлемент; + КонецЕсли; + + Результат.Заголовок = ЗаголовокЭлемента; + + Если ТипЭлемента = "КнопкаФормы" Тогда + Результат.АвтоМаксимальнаяШирина = Ложь; + Результат.АвтоМаксимальнаяВысота = Ложь; + Результат.РастягиватьПоГоризонтали = Ложь; + КонецЕсли; + + Если ЗначениеЗаполнено(ВидПоля) Тогда + Если ТипЭлемента = "ПолеФормы" Тогда + Результат.Вид = ВидПоляФормы[ВидПоля]; + Результат.ПропускатьПриВводе = Истина; + Результат.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево; + ИначеЕсли ТипЭлемента = "ДекорацияФормы" Тогда + Результат.Вид = ВидДекорацииФормы[ВидПоля]; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для добавления команды формы +// +Функция ДобавитьКоманду(КонтекстФормы, ИмяКоманды) + + НоваяКоманда = КонтекстФормы.Команды.Добавить(ИмяКоманды); + НоваяКоманда.Действие = "Подключаемый_ПодтверждениеОбработкаКоманды"; + + Возврат НоваяКоманда; + +КонецФункции + +#КонецОбласти + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеСервер/СервисКриптографииDSSПодтверждениеСервер.mdo b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеСервер/СервисКриптографииDSSПодтверждениеСервер.mdo new file mode 100644 index 000000000..e4c9d143e --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSПодтверждениеСервер/СервисКриптографииDSSПодтверждениеСервер.mdo @@ -0,0 +1,11 @@ + + + СервисКриптографииDSSПодтверждениеСервер + + ru + Сервис криптографии DSS подтверждение сервер + + true + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/Module.bsl new file mode 100644 index 000000000..f26b0ace4 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/Module.bsl @@ -0,0 +1,7084 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +#Область ИнтеграцияСПодсистемамиБСП + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// Используется для инициализации параметра сеанса в рамках механизмов БСП +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +// +// Параметры: +// ИмяПараметра - Строка +// УстановленныеПараметры - Массив из Строка +// +Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт + + Если ИмяПараметра = "ПодключениеDSS" Тогда + ТекущиеНастройки = НастройкиРаботы(); + УстановитьКонтейнерНастроек(ТекущиеНастройки); + УстановленныеПараметры.Добавить("ПодключениеDSS"); + КонецЕсли; + +КонецПроцедуры + +// Используется для инициализации параметра сеанса в рамках механизмов БСП, +// см. ИнтеграцияПодсистемБСП.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +// +Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт + + Обработчики.Вставить("ПодключениеDSS", "СервисКриптографииDSSСлужебный.УстановкаПараметровСеанса"); + +КонецПроцедуры + +// Формирует список параметров ИБ. +// +// Параметры: +// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров, описание состав колонок +// см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ(). +// +Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ИспользоватьСервисОблачнойПодписи"); + + СтрокаПараметра = ТаблицаПараметров.Добавить(); + СтрокаПараметра.Имя = "СерверОблачнойПодписи"; + СтрокаПараметра.Описание = НСтр("ru = 'Сервер облачной подписи'", КодЯзыка()); + СтрокаПараметра.Тип = Новый ОписаниеТипов("Строка"); + КонецЕсли; + +КонецПроцедуры + +// Вызывается перед попыткой записи значений параметров ИБ в одноименные константы. +// +// Параметры: +// ЗначенияПараметров - Структура - значения параметров которые требуется установить. +// В случае если значение параметра устанавливается в данной процедуре из структуры +// необходимо удалить соответствующую пару КлючИЗначение. +// +Процедура ПриУстановкеЗначенийПараметровИБ(Знач ЗначенияПараметров) Экспорт + + Если ЗначенияПараметров.Свойство("СерверОблачнойПодписи") Тогда + НастройкиСервиса = РазобратьФайлНастроекСервера(ЗначенияПараметров.СерверОблачнойПодписи); + СоздатьСерверОблачнойПодписи(НастройкиСервиса); + ЗначенияПараметров.Удалить("СерверОблачнойПодписи"); + КонецЕсли; + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. +Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт + + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СостояниеУчетнойЗаписиDSS); + +КонецПроцедуры + +// Заполняет структуру массивами поддерживаемых версий всех подлежащих версионированию программных интерфейсов, +// используя в качестве ключей имена программных интерфейсов. +// Обеспечивает функциональность Web-сервиса InterfaceVersion. +// При внедрении надо поменять тело процедуры так, чтобы она возвращала актуальные наборы версий (см. пример.ниже). +// +// Параметры: +// СтруктураПоддерживаемыхВерсий - Структура из КлючИЗначение: +// * Ключ - Строка - имя программного интерфейса, +// * Значение - Массив из Строка - поддерживаемые версии программного интерфейса. +// +// Пример реализации: +// +// // СервисПередачиФайлов +// МассивВерсий = Новый Массив; +// МассивВерсий.Добавить("1.0.1.1"); +// МассивВерсий.Добавить("1.0.2.1"); +// СтруктураПоддерживаемыхВерсий.Вставить("СервисПередачиФайлов", МассивВерсий); +// // Конец СервисПередачиФайлов. +// +Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий) Экспорт + + МассивВерсий = Новый Массив; + МассивВерсий.Добавить("1.0.0.1"); + СтруктураПоддерживаемыхВерсий.Вставить("ОблачнаяПодпись", МассивВерсий); + +КонецПроцедуры + +// Возвращает структуру параметров, необходимых для работы клиентского кода +// при запуске конфигурации, т.е. в обработчиках событий +// - ПередНачаломРаботыСистемы, +// - ПриНачалеРаботыСистемы. +// +// Важно: при запуске недопустимо использовать команды сброса кэша +// повторно используемых модулей, иначе запуск может привести +// к непредсказуемым ошибкам и лишним серверным вызовам. +// +// Параметры: +// Параметры - Структура - (возвращаемое значение) структура параметров работы клиента при запуске. +// +// Пример реализации: +// Для установки параметров работы клиента можно использовать шаблон: +// +// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); +//. +// +// +Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт + + Параметры.Вставить("ИспользованиеОблачнойПодписиВозможно", СервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи()); + +КонецПроцедуры + +// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт + + Объекты.Вставить(Метаданные.Справочники.УчетныеЗаписиDSS.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); + Объекты.Вставить(Метаданные.Справочники.ЭкземплярыСервераDSS.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); + +КонецПроцедуры + +// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных. +Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт + + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.УчетныеЗаписиDSS.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + + СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ЭкземплярыСервераDSS.ПолноеИмя(), "ПолноеИмя"); + Если СтрокаТаблицы <> Неопределено Тогда + ЗагружаемыеСправочники.Удалить(СтрокаТаблицы); + КонецЕсли; + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов. +Процедура ПриОпределенииОбъектовСКомандамиОтчетов(Объекты) Экспорт + + Объекты.Добавить(Метаданные.Справочники.УчетныеЗаписиDSS); + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт + + Списки.Вставить(Метаданные.Справочники.УчетныеЗаписиDSS, Истина); + +КонецПроцедуры + +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных. +Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт + + Описание = Описание + ""; + +КонецПроцедуры + +#КонецОбласти + +#Область ПоставляемыеДанные + +// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. +Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.ВидДанных = ВидПоставляемыхДанных(); + Обработчик.КодОбработчика = "СервисОблачнойПодписи"; + Обработчик.Обработчик = СервисКриптографииDSSСлужебный; + +КонецПроцедуры + +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.РегистрыСведений.СертификатыПользователяDSS); + Типы.Добавить(Метаданные.Константы.ИспользоватьСервисОблачнойПодписи); + +КонецПроцедуры + +// Вызывается при получении уведомления о новых данных. +// В теле следует проверить, необходимы ли эти данные приложению, +// и если да - установить флажок Загружать. +// +// Параметры: +// Дескриптор - ОбъектXDTO - дескриптор. +// Загружать - Булево - Истина, если загружать, Ложь - иначе. +// +Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт + + Если Дескриптор.DataType = ВидПоставляемыхДанных() Тогда + + Загружать = Истина; + + КонецЕсли; + +КонецПроцедуры + +// Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные. +// +// Параметры: +// Дескриптор - ОбъектXDTO - дескриптор. +// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален +// после завершения процедуры. Если в менеджере сервиса не был +// указан файл - значение аргумента равно Неопределено. +// +Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт + + Если Дескриптор.DataType = ВидПоставляемыхДанных() Тогда + ОбработатьПоставляемыеСервера(ПутьКФайлу); + КонецЕсли; + +КонецПроцедуры + +// Вызывается при отмене обработки данных в случае сбоя. +// +// Параметры: +// Дескриптор - ОбъектXDTO - дескриптор. +// +Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт + + МодульПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); + + ПротоколОшибкиПриВызове(НСтр("ru = 'Обработка данных отменена.'"), + "ПоставляемыеДанные", + МодульПоставляемыеДанные.ПолучитьОписаниеДанных(Дескриптор)); + + +КонецПроцедуры + +#КонецОбласти + +#Область ИнтеграцияВПодсистемуЭлектроннаяПодпись + +// Формирует массив сертификатов (объектов), которые задействованы в "Облачной подписи". +// Массив формируется на основе закэшированных сертификатов после последней аутентификации. +// +// Параметры: +// ДвоичныеДанныеКакHEX - Булево - режим преобразования двоичных данных +// +// Возвращаемое значение: +// Массив из Структура - описывает объект сертификата +// +Функция ПолучитьДанныеСертификатов(ДвоичныеДанныеКакHEX = Истина) Экспорт + + МассивСертификатов = Новый Массив; + НашлиСертификаты = ПолучитьВсеСертификаты(); + + Для каждого СтрокаТаблицы Из НашлиСертификаты Цикл + ДанныеСертификата = СтрокаТаблицы.ДанныеСертификата.Получить(); + Если ЗначениеЗаполнено(ДанныеСертификата) Тогда + МассивСертификатов.Добавить(СервисКриптографииDSS.ПолучитьОбъектСертификата(ДанныеСертификата, Ложь, ДвоичныеДанныеКакHEX)); + КонецЕсли; + КонецЦикла; + + Возврат МассивСертификатов; + +КонецФункции + +// Формирует ТаблицуЗначений с данным сертификатов хранимые в кеше сертификатов. +// Данные формируется на основе закэшированных сертификатов после последней аутентификации. +// +// Возвращаемое значение: +// ТаблицаЗначений +// +Функция ПолучитьВсеСертификаты(ВключитьСодержимоеСертификата = Истина) Экспорт + + ТаблицаСертификатов = Новый ТаблицаЗначений; + + Если НЕ ПроверитьПраво("СертификатыПользователяDSS") Тогда + Возврат ТаблицаСертификатов; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ + | СертификатыПользователяDSS.УчетнаяЗаписьDSS КАК УчетнаяЗапись, + | СертификатыПользователяDSS.Отпечаток КАК Отпечаток, + | СертификатыПользователяDSS.ДатаНачала КАК ДатаНачала, + | СертификатыПользователяDSS.ДатаОкончания КАК ДатаОкончания, + | ВЫБОР + | КОГДА &ВключитьСодержимоеСертификата + | ТОГДА СертификатыПользователяDSS.ДанныеСертификата + | ИНАЧЕ НЕОПРЕДЕЛЕНО + | КОНЕЦ КАК ДанныеСертификата + |ИЗ + | РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ВключитьСодержимоеСертификата", ВключитьСодержимоеСертификата); + + ТаблицаСертификатов = Запрос.Выполнить().Выгрузить(); + + Возврат ТаблицаСертификатов; + +КонецФункции + +// Формирует таблицу значений с данными учетных записей. +// Данные формируется на основе закэшированных сертификатов после последней аутентификации. +// +// Возвращаемое значение: +// ТаблицаЗначений +// +Функция ПолучитьВсеУчетныеЗаписи(СправочникСсылка = Неопределено) Экспорт + + ТаблицаУчетныхЗаписей = Новый ТаблицаЗначений; + + Если НЕ ПроверитьПраво("УчетныеЗаписиDSS") + И НЕ ПроверитьПраво("ЭкземплярыСервераDSS") Тогда + Возврат ТаблицаУчетныхЗаписей; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | УчетныеЗаписиDSS.Ссылка КАК Ссылка, + | УчетныеЗаписиDSS.Наименование КАК Наименование, + | УчетныеЗаписиDSS.Логин КАК Логин, + | УчетныеЗаписиDSS.ПометкаУдаления КАК ПометкаУдаления, + | УчетныеЗаписиDSS.ДополнительнаяИнформация КАК ДополнительнаяИнформация, + | ЭкземплярыСервераDSS.Наименование КАК Сервер, + | ЭкземплярыСервераDSS.Ссылка КАК Владелец, + | ЭкземплярыСервераDSS.ВнутреннийИдентификатор КАК ВнутреннийИдентификатор + |ИЗ + | Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + | ПО УчетныеЗаписиDSS.Владелец = ЭкземплярыСервераDSS.Ссылка + |ГДЕ + | ЭкземплярыСервераDSS.Используется + | И 1 = 1"; + + Если ЗначениеЗаполнено(СправочникСсылка) Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "1 = 1", "УчетныеЗаписиDSS.Ссылка = &СправочникСсылка"); + КонецЕсли; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("СправочникСсылка", СправочникСсылка); + ТаблицаУчетныхЗаписей = Запрос.Выполнить().Выгрузить(); + + Возврат ТаблицаУчетныхЗаписей; + +КонецФункции + +// Формирует таблицу значений с данными используемых серверов облачной подписи +// +// Параметры: +// ОтборЗапроса - Неопределено, Соответствие, Структура - содержит ключи и значения отбора +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.ЭкземплярыСервераDSS +// * Наименование - Строка +// * АдресСервера - Строка +// * АдресЛичногоКабинета - Строка +// * СервисИдентификации - Строка +// * СервисПодписи - Строка +// * СервисПроверки - Строка +// * СервисАудита - Строка +// * СервисОбработкиДокументов - Строка +// * ВнутреннийИдентификатор - Строка - необходим для поиска информации по поставляемым серверам +// * ИдентификаторЦИ - Строка +// * ИдентификаторСЭП - Строка +// * ШаблонПодтверждения - Строка +// * ВерсияАПИ - Строка +// * ТаймАут - Число +// +Функция ПолучитьВсеСерверы(ОтборЗапроса = Неопределено) Экспорт + + ТаблицаСерверов = Новый ТаблицаЗначений; + + Если НЕ ПроверитьПраво("ЭкземплярыСервераDSS") Тогда + Возврат ТаблицаСерверов; + КонецЕсли; + + Если ОтборЗапроса = Неопределено Тогда + ОтборВыборки = Новый Структура; + Иначе + ОтборВыборки = ОтборЗапроса; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЭкземплярыСервераDSS.Ссылка КАК Ссылка, + | ЭкземплярыСервераDSS.Наименование КАК Наименование, + | ЭкземплярыСервераDSS.АдресСервера КАК АдресСервера, + | ЭкземплярыСервераDSS.АдресЛичногоКабинета КАК АдресЛичногоКабинета, + | ЭкземплярыСервераDSS.СервисИдентификации КАК СервисИдентификации, + | ЭкземплярыСервераDSS.СервисПодписи КАК СервисПодписи, + | ЭкземплярыСервераDSS.СервисПроверки КАК СервисПроверки, + | ЭкземплярыСервераDSS.СервисАудита КАК СервисАудита, + | ЭкземплярыСервераDSS.СервисОбработкиДокументов КАК СервисОбработкиДокументов, + | ЭкземплярыСервераDSS.ВнутреннийИдентификатор КАК ВнутреннийИдентификатор, + | ЭкземплярыСервераDSS.ИдентификаторЦИ КАК ИдентификаторЦИ, + | ЭкземплярыСервераDSS.ИдентификаторСЭП КАК ИдентификаторСЭП, + | ЭкземплярыСервераDSS.ШаблонПодтверждения КАК ШаблонПодтверждения, + | ЭкземплярыСервераDSS.ВерсияАПИ КАК ВерсияАПИ, + | ЭкземплярыСервераDSS.ТаймАут КАК ТаймАут + |ИЗ + | Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + |ГДЕ + | ЭкземплярыСервераDSS.Используется + |{ГДЕ + | ЭкземплярыСервераDSS.Ссылка.*}"; + + ПостроительЗапроса = Новый ПостроительОтчета; + ПостроительЗапроса.Текст = ТекстЗапроса; + ПостроительЗапроса.ЗаполнитьНастройки(); + + Для Каждого СтрокаКлюча Из ОтборВыборки Цикл + НовыйОтборЗапроса(ПостроительЗапроса.Отбор, СтрокаКлюча.Ключ, СтрокаКлюча.Значение, Ложь); + КонецЦикла; + + Запрос = ПостроительЗапроса.ПолучитьЗапрос(); + ТаблицаСерверов = Запрос.Выполнить().Выгрузить(); + + Возврат ТаблицаСерверов; + +КонецФункции + +// Формирует массив учетных записей у которых нет закэшированных сертификатов +// +// Возвращаемое значение: +// Массив - элементы из СправочникСсылка.УчетныеЗаписиDSS +// +Функция УчетныеЗаписиБезСертификатов() Экспорт + + Результат = Новый Массив; + + Если НЕ (ПроверитьПраво("СертификатыПользователяDSS") + И ПроверитьПраво("УчетныеЗаписиDSS") + И ПроверитьПраво("ЭкземплярыСервераDSS")) Тогда + Возврат Результат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | УчетныеЗаписиDSS.Ссылка КАК Ссылка + |ИЗ + | Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + | ПО УчетныеЗаписиDSS.Владелец = ЭкземплярыСервераDSS.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS + | ПО УчетныеЗаписиDSS.Ссылка = СертификатыПользователяDSS.УчетнаяЗаписьDSS + |ГДЕ + | СертификатыПользователяDSS.УчетнаяЗаписьDSS ЕСТЬ NULL + | И ЭкземплярыСервераDSS.Используется + | И УчетныеЗаписиDSS.ПометкаУдаления = ЛОЖЬ"; + + Запрос = Новый Запрос(ТекстЗапроса); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Результат.Добавить(Выборка.Ссылка); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Процедура для взаимодействия с формой БСП "НастройкиЭлектроннойПодписиИШифрования" +// +// Параметры: +// ТаблицаВыборки - ТаблицаЗначений +// +Процедура ДополнитьВыборкуПрограмм(ТаблицаВыборки) Экспорт + + КолонкаСсылки = ТаблицаВыборки.Колонки.Найти("Ссылка"); + Если КолонкаСсылки <> Неопределено Тогда + КолонкаСсылки.Имя = "НоваяСсылка"; + ТаблицаВыборки.Колонки.Добавить("Ссылка"); + Для каждого СтрокаТаблицы Из ТаблицаВыборки Цикл + СтрокаТаблицы.Ссылка = СтрокаТаблицы.НоваяСсылка; + КонецЦикла; + ТаблицаВыборки.Колонки.Удалить(КолонкаСсылки); + КонецЕсли; + + ВсеУчетныеЗаписи = ПолучитьВсеУчетныеЗаписи(); + + Для каждого СтрокаТаблицы Из ВсеУчетныеЗаписи Цикл + НоваяСтрока = Новый Структура( + "ЭтоПрограммаОблачногоСервиса, + |ТипРазмещения, + |ИмяПрограммы, + |Ссылка, + |Наименование, + |ПометкаУдаления", + Ложь, 3, СтрокаТаблицы.Сервер); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы); + СтрокаВыборки = ТаблицаВыборки.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаВыборки, НоваяСтрока); + КонецЦикла; + + ТаблицаВыборки.Сортировать("Наименование"); + +КонецПроцедуры + +// Процедура для взаимодействия с формой БСП "НастройкиЭлектроннойПодписиИШифрования" +// +Процедура ИзменитьПометкуУдаленияПрограммы(Программа, УникальныйИдентификатор) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + МодульУправлениеДоступом.ПроверитьИзменениеРазрешено(Программа); + КонецЕсли; + + ЗаблокироватьДанныеДляРедактирования(Программа, , УникальныйИдентификатор); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.УчетныеЗаписиDSS"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Программа); + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + Объект = Программа.ПолучитьОбъект(); + Объект.ПометкаУдаления = Не Объект.ПометкаУдаления; + Объект.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + РазблокироватьДанныеДляРедактирования(Программа, УникальныйИдентификатор); + ВызватьИсключение; + КонецПопытки; + + РазблокироватьДанныеДляРедактирования(Программа, УникальныйИдентификатор); + +КонецПроцедуры + +#КонецОбласти + +#Область ПрочиеВозможности + +// Служебная функция для обработки элемента справочника сервера, для изменения или создания нового элемента +// справочника серверы облачной подписи. +// +// Параметры: +// НастройкиСервиса - см. РазобратьФайлНастроекСервера +// +// Возвращаемое значение: +// - Неопределено +// - СправочникСсылка.ЭкземплярыСервераDSS +// +Функция СоздатьСерверОблачнойПодписи(НастройкиСервиса) Экспорт + + КодЯзыка = КодЯзыка(); + ЕстьЭкземпляр = Неопределено; + Результат = Неопределено; + + Если ЗначениеЗаполнено(НастройкиСервиса.ВнутреннийИдентификатор) Тогда + ДанныеКлюча = Новый Структура(); + ДанныеКлюча.Вставить("ВнутреннийИдентификатор", НастройкиСервиса.ВнутреннийИдентификатор); + ЕстьЭкземпляр = ПроверитьДублированиеСерверов(Неопределено, ДанныеКлюча); + + ИначеЕсли ЗначениеЗаполнено(НастройкиСервиса.АдресСервера) + И ЗначениеЗаполнено(НастройкиСервиса.ИдентификаторЦИ) Тогда + ДанныеКлюча = Новый Структура(); + ДанныеКлюча.Вставить("АдресСервера", НастройкиСервиса.АдресСервера); + ДанныеКлюча.Вставить("ИдентификаторЦИ", НастройкиСервиса.ИдентификаторЦИ); + ЕстьЭкземпляр = ПроверитьДублированиеСерверов(Неопределено, ДанныеКлюча); + + Иначе + ЗаписатьОшибкуВЖурналРегистрации(НСтр("ru = 'Некорректно заполнены настройки для сервера облачной подписи'", КодЯзыка), НастройкиСервиса); + Возврат Результат; + + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + ЕстьИзменения = Ложь; + Если ЗначениеЗаполнено(ЕстьЭкземпляр) Тогда + ОбъектСервера = ЕстьЭкземпляр.ПолучитьОбъект(); + ОписаниеОбъекта = ОбъектСервера.Метаданные().Реквизиты; + Для каждого СтрокаКлюча Из НастройкиСервиса Цикл + Если ОписаниеОбъекта.Найти(СтрокаКлюча.Ключ) <> Неопределено Тогда + ЕстьИзменения = СтрокаКлюча.Значение <> ОбъектСервера[СтрокаКлюча.Ключ]; + КонецЕсли; + КонецЦикла; + Иначе + ОбъектСервера = Справочники.ЭкземплярыСервераDSS.СоздатьЭлемент(); + ОбъектСервера.Заполнить(Неопределено); + ЕстьИзменения = Истина; + КонецЕсли; + + Если ЕстьИзменения Тогда + ИДВерсии = СервисКриптографииDSSКлиентСервер.ИдентификаторВерсииСервера(НастройкиСервиса.ВерсияАПИ); + + ОбъектСервера.АдресСервера = НастройкиСервиса.АдресСервера; + ОбъектСервера.ВерсияАПИ = НастройкиСервиса.ВерсияАПИ; + ОбъектСервера.СервисПодписи = НастройкиСервиса.СервисПодписи; + ОбъектСервера.СервисПроверки = НастройкиСервиса.СервисПроверки; + ОбъектСервера.СервисИдентификации = НастройкиСервиса.СервисИдентификации; + ОбъектСервера.ИдентификаторЦИ = НастройкиСервиса.ИдентификаторЦИ; + ОбъектСервера.ИдентификаторСЭП = НастройкиСервиса.ИдентификаторСЭП; + ОбъектСервера.ШаблонПодтверждения = НастройкиСервиса.ШаблонПодтверждения; + ОбъектСервера.ВнутреннийИдентификатор = НастройкиСервиса.ВнутреннийИдентификатор; + ОбъектСервера.ТаймАут = НастройкиСервиса.ТаймАут; + ОбъектСервера.АдресЛичногоКабинета = НастройкиСервиса.АдресЛичногоКабинета; + ОбъектСервера.Используется = НастройкиСервиса.Используется; + ОбъектСервера.Комментарий = НастройкиСервиса.Комментарий; + ОбъектСервера.Наименование = СокрЛП(ОбъектСервера.АдресСервера); + + Если ИДВерсии > 1 Тогда + ОбъектСервера.СервисОбработкиДокументов = НастройкиСервиса.СервисОбработкиДокументов; + ОбъектСервера.СервисАудита = НастройкиСервиса.СервисАудита; + КонецЕсли; + + ОбъектСервера.ОграничениеАвторизации.Очистить(); + Если ЗначениеЗаполнено(НастройкиСервиса.ОграничениеАвторизации) Тогда + МассивСпособов = СтрРазделить(НастройкиСервиса.ОграничениеАвторизации, ","); + Для Каждого СтрокаМассива Из МассивСпособов Цикл + ЗначениеСпособа = Перечисления.СпособыАвторизацииDSS[СокрЛП(СтрокаМассива)]; + НоваяСтрока = ОбъектСервера.ОграничениеАвторизации.Добавить(); + НоваяСтрока.СпособАвторизации = ЗначениеСпособа; + КонецЦикла; + КонецЕсли; + + ОбъектСервера.ДополнительныеСвойства.Вставить("ПоставляемыеДанные", Истина); + + Если ОбъектСервера.ПроверитьЗаполнение() Тогда + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ЭкземплярыСервераDSS"); + Если НЕ ОбъектСервера.ЭтоНовый() Тогда + ЭлементБлокировки.УстановитьЗначение("Ссылка", ОбъектСервера.Ссылка); + КонецЕсли; + + Удачно = Истина; + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + ОбъектСервера.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ПротоколОшибкиПриВызове( + НСтр("ru = 'Не выполнена проверка перед записью экземпляра сервера облачной подписи'", КодЯзыка), + "ЗаписьДанныхНастроекСервера", + НастройкиСервиса, + ИнформацияОбОшибке()); + Удачно = Ложь; + КонецПопытки; + + Если Удачно Тогда + Результат = ОбъектСервера.Ссылка; + КонецЕсли; + + Иначе + ПротоколОшибкиПриВызове( + НСтр("ru = 'Не выполнена проверка перед записью экземпляра сервера облачной подписи'", КодЯзыка), + "ЗаписьДанныхНастроекСервера", + НастройкиСервиса); + КонецЕсли; + + Иначе + Результат = ОбъектСервера.Ссылка; + + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат Результат; + +КонецФункции + +// Служебная функция для обработки элемента справочника учетных записей, для изменения или создания нового элемента +// справочника учетные записи облачной подписи. +// +// Параметры: +// НастройкиУчетнойЗаписи - Структура: +// * Владелец - СправочникСсылка.ЭкземплярыСервераDSS +// * Логин - Строка +// * ПервичнаяАутентификация - ПеречислениеСсылка.СпособыАвторизацииDSS +// * ВторичнаяАвторизация - ПеречислениеСсылка.СпособыАвторизацииDSS - (необязательный) +// * Комментарий - Строка - (необязательный) +// +// Возвращаемое значение: +// - Неопределено +// - СправочникСсылка.УчетныеЗаписиDSS +// +Функция СоздатьУчетнуюЗаписьОблачнойПодписи(НастройкиУчетнойЗаписи) Экспорт + + КодЯзыка = КодЯзыка(); + ЕстьЭкземпляр = Неопределено; + Результат = Неопределено; + + ДанныеКлюча = Новый Структура(); + ДанныеКлюча.Вставить("Владелец", НастройкиУчетнойЗаписи.Владелец); + ДанныеКлюча.Вставить("Логин", НастройкиУчетнойЗаписи.Логин); + ЕстьЭкземпляр = ПроверитьДублированиеЛогинов(Неопределено, ДанныеКлюча); + + УстановитьПривилегированныйРежим(Истина); + + ЕстьИзменения = Ложь; + Если ЗначениеЗаполнено(ЕстьЭкземпляр) Тогда + ОбъектУчетнойЗаписи = ЕстьЭкземпляр.ПолучитьОбъект(); + ОписаниеОбъекта = ОбъектУчетнойЗаписи.Метаданные().Реквизиты; + Для каждого СтрокаКлюча Из НастройкиУчетнойЗаписи Цикл + Если ОписаниеОбъекта.Найти(СтрокаКлюча.Ключ) <> Неопределено Тогда + ЕстьИзменения = СтрокаКлюча.Значение <> ОбъектУчетнойЗаписи[СтрокаКлюча.Ключ]; + КонецЕсли; + КонецЦикла; + Иначе + ОбъектУчетнойЗаписи = Справочники.УчетныеЗаписиDSS.СоздатьЭлемент(); + ОбъектУчетнойЗаписи.Заполнить(Неопределено); + ЕстьИзменения = Истина; + КонецЕсли; + + Если ЕстьИзменения Тогда + ОбъектУчетнойЗаписи.Владелец = НастройкиУчетнойЗаписи.Владелец; + ОбъектУчетнойЗаписи.Логин = НастройкиУчетнойЗаписи.Логин; + ОбъектУчетнойЗаписи.ПервичнаяАутентификация = НастройкиУчетнойЗаписи.ПервичнаяАутентификация; + ОбъектУчетнойЗаписи.ВторичнаяАвторизация = ПолучитьПолеСтруктуры(НастройкиУчетнойЗаписи, "ВторичнаяАвторизация"); + ОбъектУчетнойЗаписи.Комментарий = ПолучитьПолеСтруктуры(НастройкиУчетнойЗаписи, "Комментарий", ""); + ОбъектУчетнойЗаписи.Наименование = СокрЛП(НастройкиУчетнойЗаписи.Логин) + " на " + СокрЛП(НастройкиУчетнойЗаписи.Владелец); + + Если ОбъектУчетнойЗаписи.ПроверитьЗаполнение() Тогда + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.УчетныеЗаписиDSS"); + Если НЕ ОбъектУчетнойЗаписи.ЭтоНовый() Тогда + ЭлементБлокировки.УстановитьЗначение("Ссылка", ОбъектУчетнойЗаписи.Ссылка); + КонецЕсли; + + Удачно = Истина; + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + ОбъектУчетнойЗаписи.Записать(); + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ПротоколОшибкиПриВызове( + НСтр("ru = 'Не выполнена проверка перед записью учетной записи облачной подписи'", КодЯзыка), + "ЗаписьДанныхНастроекУчетнойЗаписи", + НастройкиУчетнойЗаписи, + ИнформацияОбОшибке()); + Удачно = Ложь; + + КонецПопытки; + + Если Удачно Тогда + Результат = ОбъектУчетнойЗаписи.Ссылка; + КонецЕсли; + + Иначе + ПротоколОшибкиПриВызове( + НСтр("ru = 'Не выполнена проверка перед записью учетной записи облачной подписи'", КодЯзыка), + "ЗаписьДанныхНастроекУчетнойЗаписи", + НастройкиУчетнойЗаписи); + КонецЕсли; + + Иначе + Результат = ОбъектУчетнойЗаписи.Ссылка; + + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат Результат; + +КонецФункции + +// Служебная функция для обработки представления мобильного телефона, во внутреннее значение. +// +// Параметры: +// ТелефонМобильный - Строка - представление мобильного телефона +// +// Возвращаемое значение: +// Строка - внутреннее представление мобильного телефона +// +Функция ТелефонМобильныйБезРазделителей(Знач ТелефонМобильный) Экспорт + + Результат = ""; + ВсеЦифры = "0123456789"; + ТелефонМобильный = СокрЛП(ТелефонМобильный); + + Для Счетчик = 1 По СтрДлина(ТелефонМобильный) Цикл + ТекущийСимвол = Сред(ТелефонМобильный, Счетчик, 1); + Если СтрНайти(ВсеЦифры, ТекущийСимвол) > 0 Тогда + Результат = Результат + ТекущийСимвол; + КонецЕсли; + КонецЦикла; + + Если ПустаяСтрока(Результат) Тогда + Результат = ""; + Иначе + Если СтрДлина(Результат) = 10 Тогда + Результат = "8" + Результат; + Возврат ТелефонМобильный; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция проверки версии платформы. +// +// Параметры: +// ОжидаемаяВерсия - Строка +// +// Возвращаемое значение: +// Булево - Истина, если версия платформы равно или больше ожидаемой +// +Функция НужнаяВерсияПлатформы(ОжидаемаяВерсия) Экспорт + + СистемнаяИнформация = Новый СистемнаяИнформация; + Результат = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, ОжидаемаяВерсия) >= 0; + + Возврат Результат; + +КонецФункции + +// Формирует параметризированное описание ошибки, по переданном ключевому слову. +// Параметры: +// РезультатОперации - Структура - структура со стандартным содержанием ответа сервиса +// - Неопределено +// ТипОшибки - Строка - ключевое слово возникшей ошибки +// ТекстОшибки - Строка - дополнительная информация, включаемая в текст ошибки +// +// Возвращаемое значение: +// Строка - описание ошибки в формате: Код ошибки - Описание ошибки - Текст ошибки +// +Функция ПолучитьОписаниеОшибки(РезультатОперации, ТипОшибки, ТекстОшибки = "") Экспорт + + Результат = ""; + + НашлиОшибку = ДоступныйРеестрОшибок(ТипОшибки); + Если НашлиОшибку = Неопределено Тогда + Результат = СервисКриптографииDSSКлиентСервер.ПолучитьОписаниеОшибки(РезультатОперации, ТипОшибки, ТекстОшибки); + Иначе + КодОшибки = НашлиОшибку.КодОшибки; + Результат = КодОшибки + ": " + НашлиОшибку.Описание; + Если НЕ ПустаяСтрока(ТекстОшибки) Тогда + Результат = Результат + Символы.ПС + Символы.ПС + + НСтр("ru = 'Детали ошибки:'") + + Символы.ПС + ТекстОшибки; + КонецЕсли; + + Если РезультатОперации <> Неопределено Тогда + РезультатОперации.Вставить("КодОшибки", КодОшибки); + РезультатОперации.Вставить("Ошибка", Результат); + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная процедура для записи в журнал регистрации факта возникновения ошибки +// +// Параметры: +// ТекстОшибки - Строка - описание ошибки +// ПараметрыВызова - Структура - значения полей которые вызвали ошибку +// +Процедура ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки, ПараметрыВызова = Неопределено) Экспорт + + ДанныеВызова = ""; + Если ТипЗнч(ПараметрыВызова) = Тип("Строка") Тогда + ДанныеВызова = ПараметрыВызова; + ИначеЕсли ЗначениеЗаполнено(ПараметрыВызова) Тогда + ДанныеВызова = СервисКриптографииDSSКлиентСервер.ФильтроватьПараметрыВызова(ПараметрыВызова); + КонецЕсли; + + ШаблонЗаписи = + "Параметры: + |%1 + | + |ПредставлениеОшибки: + |%2"; + + СодержаниеОшибки = СтрШаблон( + ШаблонЗаписи, + ДанныеВызова, + СокрЛП(ТекстОшибки)); + + ЗаписьЖурналаРегистрации(СервисКриптографииDSSКлиентСервер.ИмяСобытияЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка,,, + СодержаниеОшибки); + +КонецПроцедуры + +// Формирует структуру описания сертификата, который был закэширован +// +// Параметры: +// ОтпечатокСертификата - Строка +// - Структура +// - Массив +// ДобавитьСодержимое - Булево - добавляет в ответ двоичные данные сертификата +// +// Возвращаемое значение: +// Структура - содержит сведения о сертификате в полях: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// * Идентификатор - Строка - вычисленный идентификатор сертификата +// * ДатаНачала - Дата - дата начала действия сертификата +// * ДатаОкончания - Дата - дата окончания действия сертификата +// * Наименование - Строка - представление сертификата +// * Отпечаток - Строка - HEX представление отпечатка +// * СерийныйНомер - Строка - HEX представление отпечатка +// * ИдентификаторСертификата - Строка +// * ДанныеСертификата - ДвоичныеДанные - содержимое сертификата, если были запрошены +// +Функция ПолучитьДанныеСертификатаПоОтпечатку(ОтпечатокСертификата, ДобавитьСодержимое = Ложь) Экспорт + + ПолеПоиска = Новый Структура("Отпечаток", ""); + Если ТипЗнч(ОтпечатокСертификата) <> Тип("Структура") Тогда + ПолеПоиска.Отпечаток = ОтпечатокСертификата; + Иначе + ЗаполнитьЗначенияСвойств(ПолеПоиска, ОтпечатокСертификата); + КонецЕсли; + + Результат = ПолучитьДанныеСертификатаПоПолюПоиска(ПолеПоиска, ДобавитьСодержимое); + + Возврат Результат; + +КонецФункции + +// Формирует структуру описания сертификата, который был закэширован +// +// Параметры: +// СерийныйНомер - Структура +// - Строка +// - Массив +// ДобавитьСодержимое - Булево - добавляет в ответ двоичные данные сертификата +// +// Возвращаемое значение: +// Структура - содержит сведения о сертификате в полях: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// * Идентификатор - Строка - вычисленный идентификатор сертификата +// * ДатаНачала - Дата - дата начала действия сертификата +// * ДатаОкончания - Дата - дата окончания действия сертификата +// * Наименование - Строка - представление сертификата +// * Отпечаток - Строка - HEX представление отпечатка +// * СерийныйНомер - Строка - HEX представление отпечатка +// * ИдентификаторСертификата- Строка +// * ДанныеСертификата - ДвоичныеДанные - содержимое сертификата, если были запрошены +// +Функция ПолучитьДанныеСертификатаПоСерийномуНомеру(СерийныйНомер, ДобавитьСодержимое = Ложь) Экспорт + + ПолеПоиска = Новый Структура("СерийныйНомер", ""); + Если ТипЗнч(СерийныйНомер) <> Тип("Структура") Тогда + ПолеПоиска.СерийныйНомер = СерийныйНомер; + Иначе + ЗаполнитьЗначенияСвойств(ПолеПоиска, СерийныйНомер); + КонецЕсли; + + Результат = ПолучитьДанныеСертификатаПоПолюПоиска(ПолеПоиска, ДобавитьСодержимое); + + Возврат Результат; + +КонецФункции + +// Формирует структуру описания сертификата, который был закэширован +// +// Параметры: +// ИдентификаторСертификата- Структура +// - Строка +// - Массив +// ДобавитьСодержимое - Булево - добавляет в ответ двоичные данные сертификата +// +// Возвращаемое значение: +// Структура - содержит сведения о сертификате в полях: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// * Идентификатор - Строка - вычисленный идентификатор сертификата +// * ДатаНачала - Дата - дата начала действия сертификата +// * ДатаОкончания - Дата - дата окончания действия сертификата +// * Наименование - Строка - представление сертификата +// * Отпечаток - Строка - HEX представление отпечатка +// * СерийныйНомер - Строка - HEX представление отпечатка +// * ИдентификаторСертификата - Строка +// * ДанныеСертификата - ДвоичныеДанные - содержимое сертификата, если были запрошены +// +Функция ПолучитьДанныеСертификатаПоИдентификаторуСертификата(ИдентификаторСертификата, ДобавитьСодержимое = Ложь) Экспорт + + ПолеПоиска = Новый Структура("ИдентификаторСертификата", ""); + Если ТипЗнч(ИдентификаторСертификата) <> Тип("Структура") Тогда + ПолеПоиска.ИдентификаторСертификата = ИдентификаторСертификата; + Иначе + ЗаполнитьЗначенияСвойств(ПолеПоиска, ИдентификаторСертификата); + КонецЕсли; + + Результат = ПолучитьДанныеСертификатаПоПолюПоиска(ПолеПоиска); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ВыполнениеЗапросовВФоне + +// Процедуры данной области служат для работы асинхронном режиме, с использованием фоновых заданий +// Предназначение этих функций разворачивание структуры ПараметрыВызова обратно +// в отдельные параметры вызова и помещение результата вызова +// во временное хранилище по переданному адресу. +// Также дополнительно возвращается структура настроек пользователя, может быть актуальна при ситуации +// обновления маркера доступа + +// Описание и параметры вызова см. СервисКриптографииDSS.АутентификацияПоСертификату() +// +Процедура АутентификацияПоСертификату(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова("НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.АутентификацияПоСертификату( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.АутентификацияПоЛогину() +Процедура АутентификацияПоЛогину(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова("НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.АутентификацияПоЛогину( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьТокенПоКодуАвторизации() +Процедура ПолучитьТокенПоКодуАвторизации(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова("КодАвторизации, НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьТокенПоКодуАвторизации( + ВсеПараметры.КодАвторизации, + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ПараметрыВызова.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ВыполнитьЗапросКСервису() +// или в СервисКриптографииDSS.ПодключитьВыполнитьМетодСервиса() +// Предназначена для отправки запроса на сервер без "посредников". +// В этом случае правильность заполнения параметров выполняется на стороне "потребителя". +// +Процедура ВыполнитьЗапросКСервису(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ПараметрыЗапроса", ПараметрыВызова); + + ПараметрыЗапроса = ВсеПараметры.ПараметрыЗапроса; + + Если ПараметрыЗапроса.БазовыйВызов Тогда + РезультатЗапроса = СервисКриптографииDSS.ВыполнитьЗапросКСервису( + ПараметрыЗапроса.НастройкиПользователя, + ПараметрыЗапроса.АдресПодключения, + ПараметрыЗапроса.ПараметрыЗапроса, + ПараметрыЗапроса.HTTPМетод, + ПараметрыЗапроса.ТипСодержания); + + Иначе + РезультатЗапроса = СервисКриптографииDSS.ПодключитьВыполнитьМетодСервиса( + ПараметрыЗапроса.НастройкиПользователя, + ПараметрыЗапроса.АдресПодключения, + ПараметрыЗапроса.ПараметрыЗапроса, + ПараметрыЗапроса.HTTPМетод, + ПараметрыЗапроса.ТипСодержания, + , ВсеПараметры.ПараметрыОперации); + КонецЕсли; + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.Зашифровать() +Процедура Зашифровать(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеДокумента, + |СертификатыПолучателей, + |ТипШифрования, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.Зашифровать( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.СертификатыПолучателей, + ВсеПараметры.ТипШифрования, + ВсеПараметры.ПараметрыОперации); + + ТрансформироватьДанныеДокумента(РезультатЗапроса, ПараметрыВызова); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СертификатыРасшифрования() +Процедура СертификатыРасшифрования(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеДокумента, + |ТипШифрования, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.СертификатыРасшифрования( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.ТипШифрования, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ХешированиеДанных() +Процедура ХешированиеДанных(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеДокумента, + |АлгоритмХеширования, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ХешированиеДанных( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.АлгоритмХеширования, + ВсеПараметры.ПараметрыОперации); + + ТрансформироватьДанныеДокумента(РезультатЗапроса, ПараметрыВызова); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СоздатьТранзакцию() +Процедура СоздатьТранзакцию(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеЗапроса, + |КодОперации, + |ДанныеДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.СоздатьТранзакцию( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеЗапроса, + ВсеПараметры.КодОперации, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.ПараметрыОперации); + + ТрансформироватьДанныеДокумента(РезультатЗапроса, ПараметрыВызова, Истина); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.Расшифровать() +Процедура Расшифровать(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеДокумента, + |ТипШифрования, + |ИдентификаторСертификата, + |ПинКод, + |НастройкиПользователя", ПараметрыВызова); + + ПинКод = ВсеПараметры.ПинКод; + + РезультатЗапроса = СервисКриптографииDSS.Расшифровать( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.ИдентификаторСертификата, + ВсеПараметры.ТипШифрования, + ПинКод, + ВсеПараметры.ПараметрыОперации); + + ТрансформироватьДанныеДокумента(РезультатЗапроса, ПараметрыВызова); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ВалидацияПинКодаСертификата() +Процедура ВалидацияПинКодаСертификата(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |ПинКод, + |НастройкиПользователя", ПараметрыВызова); + + ПинКод = ВсеПараметры.ПинКод; + + РезультатЗапроса = СервисКриптографииDSS.ВалидацияПинКодаСертификата( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторСертификата, + ПинКод, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.Подписать() +Процедура Подписать(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |ДанныеДокумента, + |СвойствоПодписи, + |ПинКод, + |ПотоковыйРежим, + |НастройкиПользователя", ПараметрыВызова); + + ПинКод = ВсеПараметры.ПинКод; + + РезультатЗапроса = СервисКриптографииDSS.Подписать( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.СвойствоПодписи, + ВсеПараметры.ИдентификаторСертификата, + ПинКод, + ВсеПараметры.ПотоковыйРежим, + ВсеПараметры.ПараметрыОперации); + + ТрансформироватьДанныеДокумента(РезультатЗапроса, ПараметрыВызова); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПодписатьПакет() +Процедура ПодписатьПакет(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |ДанныеДокумента, + |СвойствоПодписи, + |ПинКод, + |НастройкиПользователя", ПараметрыВызова); + + ПинКод = ВсеПараметры.ПинКод; + + РезультатЗапроса = СервисКриптографииDSS.ПодписатьПакет( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.СвойствоПодписи, + ВсеПараметры.ИдентификаторСертификата, + ПинКод, + ВсеПараметры.ПараметрыОперации); + + ТрансформироватьДанныеДокумента(РезультатЗапроса, ПараметрыВызова); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьДанныеСертификата() +Процедура ПолучитьДанныеСертификата(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьДанныеСертификата( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторСертификата, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьСертификатыСервиса() +Процедура ОбновитьДанныеСертификатов(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "НастройкиПользователя", ПараметрыВызова); + + ВсеПараметры.ПараметрыОперации.Вставить("ПроверитьНаличиеВБазе", Истина); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьСертификатыСервиса( + ВсеПараметры.НастройкиПользователя, + Неопределено, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СоздатьЗапросНаСертификат() +Процедура СоздатьЗапросНаСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "УдостоверяющийЦентр, + |КриптоПровайдер, + |ШаблонСертификата, + |ПоляАтрибутов, + |ПинКод, + |НастройкиПользователя", ПараметрыВызова); + + ПинКод = ВсеПараметры.ПинКод; + + РезультатЗапроса = СервисКриптографииDSS.СоздатьЗапросНаСертификат( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.УдостоверяющийЦентр, + ВсеПараметры.КриптоПровайдер, + ВсеПараметры.ШаблонСертификата, + ВсеПараметры.ПоляАтрибутов, + ПинКод, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СписокЗапросовНаСертификат() +Процедура СписокЗапросовНаСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.СписокЗапросовНаСертификат( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьЗапросНаСертификат() +Процедура ПолучитьЗапросНаСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторЗапроса, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьЗапросНаСертификат( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторЗапроса, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.УдалитьЗапросНаСертификат() +Процедура УдалитьЗапросНаСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторЗапроса, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.УдалитьЗапросНаСертификат( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторЗапроса, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.УстановитьСертификат() +Процедура УстановитьСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеСертификата, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.УстановитьСертификат( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеСертификата, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.НазначитьОсновнымСертификат() +Процедура НазначитьОсновнымСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |Установить, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.НазначитьОсновнымСертификат( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторСертификата, + ВсеПараметры.Установить, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СменитьПинКодСертификата() +Процедура СменитьПинКодСертификата(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |СтарыйПинКод, + |НовыйПинКод, + |НастройкиПользователя", ПараметрыВызова); + + ПинКодНовый = ВсеПараметры.НовыйПинКод; + ПинКодСтарый = ВсеПараметры.СтарыйПинКод; + + РезультатЗапроса = СервисКриптографииDSS.СменитьПинКодСертификата( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторСертификата, + ПинКодСтарый, + ПинКодНовый, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПроверитьСертификат() +Процедура ПроверитьСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеСертификата, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПроверитьСертификат( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеСертификата, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьСведенияОПодписантах() +Процедура ПолучитьСведенияОПодписантах(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеДокумента, + |ТипПодписи, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьСведенияОПодписантах( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.ТипПодписи, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПроверитьПодпись() +Процедура ПроверитьПодпись(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ТипПодписи, + |ДанныеДокумента, + |ИсходныйДокумент, + |НастройкиПользователя", ПараметрыВызова); + + СвойстваПроверки = ПолучитьПолеСтруктуры(ВсеПараметры.ПараметрыОперации, "СвойстваПроверки"); + Если СвойстваПроверки = Неопределено Тогда + СвойстваПроверки = СервисКриптографииDSSКлиентСервер.ПолучитьСвойстваПроверкиПодписи(Истина); + КонецЕсли; + + Сертификат = ПолучитьПолеСтруктуры(ВсеПараметры.ПараметрыОперации, "Сертификат"); + + РезультатЗапроса = СервисКриптографииDSS.ПроверитьПодпись( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.ИсходныйДокумент, + ВсеПараметры.ТипПодписи, + СвойстваПроверки, + Сертификат, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ОбновитьПолитикуПользователя() +Процедура ОбновитьПолитикуПользователя(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова("НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ОбновитьПолитикуПользователя( + ВсеПараметры.НастройкиПользователя, + Истина, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьОписаниеСервиса() +Процедура ПолучитьОписаниеСервиса(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова("АдресСервера", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьОписаниеСервиса( + ВсеПараметры.АдресСервера, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("АдресСервера", ПараметрыВызова.АдресСервера); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьСвойстваСертификата() +Процедура ПолучитьСвойстваСертификата(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьСвойстваСертификата( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторСертификата, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.НайтиСертификат() +Процедура НайтиСертификат(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ОписаниеСертификата", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.НайтиСертификат( + ВсеПараметры.ОписаниеСертификата, + ВсеПараметры.ПараметрыОперации); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Реализует пакетный вызов методов, чтобы получить результат за один вызов фонового задания. +// Предназначена для поддержки встроенных в формы БСП возможностей авторизации и подтверждения операций, +// подробнее о параметрах СервисКриптографииDSSКлиент.ПодготовитьТранзакцию. +// +// Параметры: +// ПараметрыВызова - Структура: +// * НастройкиПользователя - Структура, СправочникСсылка.УчетныеЗаписиDSS - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию() +// * ПараметрыВыполнения - Структура: +// ** ТипОперации - Строка +// ** Сертификат - Структура +// - Строка +// ** ДанныеДокумента - Неопределено +// - ДвоичныеДанные +// - Строка +// - Массив +// ** ПарольПользователя - Строка +// - Структура +// ** ПинКод - Строка +// - Структура +// ** ДатаСеанса - Дата +// ** ТипДокумента - Строка +// ** ОписаниеДокумента - Строка +// ** ДанныеПодтверждения - см. ПодготовитьДанныеПодтверждения +// * ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// АдресРезультата - Строка - указывает куда поместить результат выполнения операции +// +Процедура ПодготовитьТранзакцию(ПараметрыВызова, АдресРезультата) Экспорт + + НастройкиПользователя = ПараметрыВызова.НастройкиПользователя; + ПараметрыВыполнения = ПараметрыВызова.ПараметрыВыполнения; + ВходящиеПараметры = ПараметрыВызова.ПараметрыОперации; + + РезультатЗапроса = ПакетнаяОперацияПользователя(НастройкиПользователя, ПараметрыВыполнения, ВходящиеПараметры); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Формирует отчет о состоянии учетной записи и конвертирует результат в XML. +// Для формирования используется алгоритмы из Отчет.СостояниеУчетнойЗаписиDSS, +// подробнее СервисКриптографииDSSКлиент.ПоказатьСостояниеУчетнойЗаписи. +// +Процедура СостояниеУчетнойЗаписи(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.СостояниеУчетнойЗаписи( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьЗаписиАудита() +Процедура ПолучитьЗаписиАудита(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "Фильтры, + |НачальнаяПозиция, + |КонечнаяПозиция, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьЗаписиАудита( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.Фильтры, + ВсеПараметры.НачальнаяПозиция, + ВсеПараметры.КонечнаяПозиция, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ЗагрузитьДокумент() +Процедура ЗагрузитьДокумент(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ДанныеДокумента, + |ПараметрыДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ЗагрузитьДокумент( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ДанныеДокумента, + ВсеПараметры.ПараметрыДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ЗагрузитьПакетДокументов() +Процедура ЗагрузитьПакетДокументов(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ПараметрыДокументов, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ЗагрузитьПакетДокументов( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ПараметрыДокументов, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ИнформацияОДокументеПоИдентификатору() +Процедура ИнформацияОДокументеПоИдентификатору(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ИнформацияОДокументеПоИдентификатору( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ИнформацияОДокументеПоХешу() +Процедура ИнформацияОДокументеПоХешу(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ХешДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ИнформацияОДокументеПоХешу( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ХешДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьОбработанныйДокумент() +Процедура ПолучитьОбработанныйДокумент(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьОбработанныйДокумент( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ИзменитьИнформациюОДокументе() +Процедура ИзменитьИнформациюОДокументе(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторДокумента, + |ПараметрыДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ИзменитьИнформациюОДокументе( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторДокумента, + ВсеПараметры.ПараметрыДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПривязатьДокумент() +Процедура ПривязатьДокумент(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторДокумента, + |ИдентификаторРодительскогоДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПривязатьДокумент( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторДокумента, + ВсеПараметры.ИдентификаторРодительскогоДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СконвертироватьДокумент() +Процедура СконвертироватьДокумент(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.СконвертироватьДокумент( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьИнформациюДокументаКонвертации() +Процедура ПолучитьИнформациюДокументаКонвертации(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьИнформациюДокументаКонвертации( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.УдалитьДокумент() +Процедура УдалитьДокумент(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторДокумента, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.УдалитьДокумент( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторДокумента, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СоздатьЗакрытыйКлюч() +Процедура СоздатьЗакрытыйКлюч(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторАлгоритмаКлюча, + |ПараметрыКлюча, + |ПинКод, + |НастройкиПользователя", ПараметрыВызова); + + ПинКод = ВсеПараметры.ПинКод; + + РезультатЗапроса = СервисКриптографииDSS.СоздатьЗакрытыйКлюч( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторАлгоритмаКлюча, + ВсеПараметры.ПараметрыКлюча, + ПинКод, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.УстановитьПараметрЗакрытогоКлюча() +Процедура УстановитьПараметрЗакрытогоКлюча(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |ИмяПараметра, + |ЗначениеПараметра, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.УстановитьПараметрЗакрытогоКлюча( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторСертификата, + ВсеПараметры.ИмяПараметра, + ВсеПараметры.ЗначениеПараметра, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПолучитьПараметрЗакрытогоКлюча() +Процедура ПолучитьПараметрЗакрытогоКлюча(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторСертификата, + |ИмяПараметра, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ПолучитьПараметрЗакрытогоКлюча( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторСертификата, + ВсеПараметры.ИмяПараметра, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ПодписатьАсинхронно() +Процедура ПодписатьАсинхронно(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "СвойствоПодписи, + |ИдентификаторСертификата, + |ПинКод, + |АсинхронныйРежим, + |ОбратныйВызов, + |НастройкиПользователя", ПараметрыВызова); + + ПинКод = ВсеПараметры.ПинКод; + + РезультатЗапроса = СервисКриптографииDSS.ПодписатьАсинхронно( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.СвойствоПодписи, + ВсеПараметры.ИдентификаторСертификата, + ПинКод, + ВсеПараметры.АсинхронныйРежим, + ВсеПараметры.ОбратныйВызов, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.СведенияОбОперации() +Процедура СведенияОбОперации(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторОперации, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.СведенияОбОперации( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторОперации, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +// Описание и параметры вызова см. СервисКриптографииDSS.ВыполнитьОперацию() +Процедура ВыполнитьОперацию(ПараметрыВызова, АдресРезультата) Экспорт + + ВсеПараметры = ПодготовитьПеременныеВызова( + "ИдентификаторОперации, + |НастройкиПользователя", ПараметрыВызова); + + РезультатЗапроса = СервисКриптографииDSS.ВыполнитьОперацию( + ВсеПараметры.НастройкиПользователя, + ВсеПараметры.ИдентификаторОперации, + ВсеПараметры.ПараметрыОперации); + + РезультатЗапроса.Вставить("НастройкиПользователя", ВсеПараметры.НастройкиПользователя); + + ПоместитьВоВременноеХранилище(РезультатЗапроса, АдресРезультата); + +КонецПроцедуры + +#КонецОбласти + +#Область СеансовыеДанные + +// Заполняет / перезаполняет параметр сеанса используемый для хранения сеансовых данных +// +// Параметры: +// СсылкаСервера - СправочникСсылка.ЭкземплярыСервераDSS - указывается в случае изменения сведений в справочнике +// ИсточникНастроек- Неопределено, Строка - варианты определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(). +// +Процедура ЗаполнитьНастройкиПодключения(СсылкаСервера = Неопределено, ИсточникНастроек = Неопределено) Экспорт + + ОбщиеНастройки = НастройкиРаботы(СсылкаСервера, ПолучитьИсточникНастроек(ИсточникНастроек)); + УстановитьКонтейнерНастроек(ОбщиеНастройки, ПолучитьИсточникНастроек(ИсточникНастроек)); + +КонецПроцедуры + +// Сохраняет новые параметры пользователя в сеансовых данных. +// +// Параметры: +// СсылкаУчетнойЗаписи - СправочникСсылка.УчетныеЗаписиDSS - идентифицирующий признак в сеансовых данных +// НастройкиПользователя - см. НастройкиРаботыПодключение +// ИсточникНастроек - Неопределено, Строка - варианты определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(). +// +// Возвращаемое значение: +// Булево - настройки сохранены +// +Функция УстановитьНастройкиПользователя(СсылкаУчетнойЗаписи, НастройкиПользователя, ИсточникНастроек = Неопределено) Экспорт + + Результат = Ложь; + + Если НЕ ПроверитьСредуВыполнения("ФоновоеЗадание") Тогда + ТекущиеНастройки = ПолучитьНастройкиПользователя(СсылкаУчетнойЗаписи, ПолучитьИсточникНастроек(ИсточникНастроек)); + ВерсияНастройки = НастройкиПользователя.ВерсияНастройки + 1; + ЗапоминатьПароли = ПолучитьПолеСтруктуры(НастройкиПользователя, "ЗапоминатьПароли", Ложь); + Если ТекущиеНастройки <> Неопределено Тогда + ЗапоминатьПароли = ПолучитьПолеСтруктуры(ТекущиеНастройки, "ЗапоминатьПароли", Ложь); + ВерсияНастройки = Макс(ВерсияНастройки, ТекущиеНастройки.ВерсияНастройки + 1); + КонецЕсли; + + НастройкиПользователя.ВерсияНастройки = ВерсияНастройки; + + Если НЕ ЗапоминатьПароли Тогда + НастройкиПользователя.Пароль = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + НастройкиПользователя.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + + ДанныеКонтейнера = ПолучитьКонтейнерНастроек(ПолучитьИсточникНастроек(ИсточникНастроек)); + ДанныеКонтейнера.Пользователи.Вставить(СсылкаУчетнойЗаписи, НастройкиПользователя); + УстановитьКонтейнерНастроек(ДанныеКонтейнера, ПолучитьИсточникНастроек(ИсточникНастроек)); + + Результат = Истина; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для заполнения доступных учетной записи действия и данных на сервере DSS. +// Обычно запускается при первичной авторизации пользователя на сервере DSS. +// Дозаполняет структуру данными настроек пользователя на сервере DSS. +// +// Параметры: +// ПолитикаПользователя - Структура: +// * Заполнено - Булево - признак, что произошла удачная авторизация и получены настройки учетной записи с сервера +// * ДатаЗаполнения - Дата - когда были заполнены настройки +// * Действия - Структура из КлючИЗначение: +// ** Ключ - Строка - имя действия, содержит список действий, которые допустимы для пользователя и признак подтверждения: +// ** Значение - Структура: +// *** КодОперации - Число +// *** Подтверждать- Булево +// * УЦ - Массив - массив структур содержащие поля: +// ** Имя - Строка - представление УЦ +// ** Идентификатор - Строка - внутренний идентификатор УЦ на сервере DSS +// ** Сторонний - Булево - сторонний УЦ, требует отдельной операции установки сертификата +// ** Шаблоны - Массив из Структура: +// *** Наименование - Строка +// *** Шаблон - Строка - OID шаблона +// ** ИменаПолей - Массив - строки содержащие структуры: +// *** OID - Строка - идентификатор поля +// *** IsRequired - Булево - Истина, если поле обязательно для заполнения +// * Криптопровайдеры - Массив из Структура: +// ** Идентификатор - Строка - GUID криптопровайдера на сервере DSS +// ** Описание - Строка - представление криптопровайдера +// ** Тип - Число - тип криптопровайдера +// ** Имя - Строка - имя криптопровайдера +// * СервераШтамповВремени- Массив - массив структур содержащие поля: +// ** Имя - Строка - представление сервера +// ** Адрес - Строка - Web-адрес службы штампа времени +// * ТипыПодписей - Массив - массив из чисел, идентификаторов типов подписи +// * РежимПинКода - Строка - строковая константа режим применения пин-кодов для сертификатов варианты: Обязательно, Запрещено, Опционально +// ДанныеПолитики - Структура - сформированная структура на основе данных JSON, которые вернул сервер DSS +// +Процедура НастройкиРаботыАнализПолитикиПользователя(ПолитикаПользователя, ДанныеПолитики) Экспорт + + // По документации API сервиса, поля + // "CAPolicy" Массив Для формирования сертификатов + // "AllowThirdPartyTsp" Булево + // "CSPsPolicy" Массив Список криптопровайдеров + // "AllowHashSigning" Булево + // "ActionPolicy" Массив Действия для подтверждения, устаревший - надо анализировать маркер безопасности? + // "PinCodeMode" Строка Варианты "Allow" + // "AllowedSignatureTypes" Массив Разрешенные типы подписей + // "TspServices" Массив Список служб для формирования усовершенствованной подписи (с штампом времени) + // "TransactionConfirmation" Строка не используется + + // контролируемые действия пользователя + СписокДействий = Новый Структура; + СписокДействий.Вставить("Issue", "ВыпускМаркера:0"); + СписокДействий.Вставить("SignDocument", "ПодписьДокумента:2"); + СписокДействий.Вставить("SignDocuments", "ПодписьПакета:4"); + СписокДействий.Вставить("DecryptDocument", "Расшифрование:8"); + СписокДействий.Вставить("CreateRequest", "ЗапросНаСертификат:16:Истина"); + СписокДействий.Вставить("ChangePin", "СменаПинКода:32:Истина"); + СписокДействий.Вставить("RenewCertificate", "ОбновлениеСертификата:64"); + СписокДействий.Вставить("RevokeCertificate", "ОтзывСертификата:128"); + СписокДействий.Вставить("HoldCertificate", "ПриостановкаСертификата:256"); + СписокДействий.Вставить("UnholdCertificate", "ВосстановлениеСертификата:512"); + СписокДействий.Вставить("DeleteCertificate", "УдалениеСертификата:1024"); + СписокДействий.Вставить("PrivateKeyAccess", "ДоступККлючу:0"); + + Для каждого СтрокаКлюча Из СписокДействий Цикл + Составляющие= СтрРазделить(СтрокаКлюча.Значение, ":"); + СписокДействий.Вставить(СтрокаКлюча.Ключ, Составляющие); + НовыйЭлемент= Новый Структура; + НовыйЭлемент.Вставить("КодОперации", Число(Составляющие[1])); + НовыйЭлемент.Вставить("Подтверждать", Истина); + ПолитикаПользователя.Действия.Вставить(Составляющие[0], НовыйЭлемент); + КонецЦикла; + + // действия для подтверждения + ВсегоПолей = 0; + ПоляДействий = ПолучитьПолеСтруктуры(ДанныеПолитики, "ActionPolicy", Новый Массив); + Для каждого СтрокаМассива Из ПоляДействий Цикл + КлючПолитики = ПолучитьПолеСтруктуры(СтрокаМассива, "Action"); + ЗначениеПолитики= ПолучитьПолеСтруктуры(СтрокаМассива, "MfaRequired"); + КлючПоиска = ""; + Если КлючПолитики <> Неопределено И СписокДействий.Свойство(КлючПолитики, КлючПоиска) Тогда + ПолитикаПользователя.Действия[КлючПоиска[0]].Подтверждать = ЗначениеПолитики; + ВсегоПолей = ВсегоПолей + 1; + КонецЕсли; + КонецЦикла; + + // данные для запроса на сертификат + ПолитикаПользователя.УЦ.Очистить(); + ПоляИздателя = ПолучитьПолеСтруктуры(ДанныеПолитики, "CAPolicy", Новый Массив); + Для каждого СтрокаМассива Из ПоляИздателя Цикл + Идентификатор = ПолучитьПолеСтруктуры(СтрокаМассива, "ID"); + Активный = ПолучитьПолеСтруктуры(СтрокаМассива, "Active"); + ИмяУЦ = ПолучитьПолеСтруктуры(СтрокаМассива, "Name"); + ШаблоныСертификатов = ПолучитьПолеСтруктуры(СтрокаМассива, "EKUTemplates", Новый Соответствие); + ПоляЗапроса = ПолучитьПолеСтруктуры(СтрокаМассива, "NamePolicy"); + ТипУЦ = ПолучитьПолеСтруктуры(СтрокаМассива, "CAType", ""); + МассивШаблонов = Новый Массив; + Для каждого СтрокаКлюча Из ШаблоныСертификатов Цикл + Для каждого СтрокаМассива Из СтрокаКлюча.Значение Цикл + НовыйШаблон = Новый Структура(); + НовыйШаблон.Вставить("Наименование", СтрокаКлюча.Ключ + " (" + СтрокаМассива + ")"); + НовыйШаблон.Вставить("Шаблон", СтрокаМассива); + МассивШаблонов.Добавить(НовыйШаблон); + КонецЦикла; + КонецЦикла; + + Если Активный = Истина Тогда + НоваяСтрока = Новый Структура(); + НоваяСтрока.Вставить("Имя", ИмяУЦ); + НоваяСтрока.Вставить("Идентификатор", Идентификатор); + НоваяСтрока.Вставить("Шаблоны", МассивШаблонов); + НоваяСтрока.Вставить("ИменаПолей", ПоляЗапроса); + НоваяСтрока.Вставить("Сторонний", ТипУЦ = "DSSOutOfBandEnroll"); + Если НоваяСтрока.Сторонний Тогда + ПолитикаПользователя.УЦ.Вставить(0, НоваяСтрока); + Иначе + ПолитикаПользователя.УЦ.Добавить(НоваяСтрока); + КонецЕсли; + ВсегоПолей = ВсегоПолей + 1; + КонецЕсли; + КонецЦикла; + + // заполняем список криптопровайдеров + ПолитикаПользователя.Криптопровайдеры.Очистить(); + ПоляПровайдеров = ПолучитьПолеСтруктуры(ДанныеПолитики, "CSPsPolicy", Новый Массив); + Для каждого СтрокаМассива Из ПоляПровайдеров Цикл + НоваяСтрока = Новый Структура; + НоваяСтрока.Вставить("Идентификатор",ПолучитьПолеСтруктуры(СтрокаМассива, "GroupID")); + НоваяСтрока.Вставить("Описание", ПолучитьПолеСтруктуры(СтрокаМассива, "Description")); + НоваяСтрока.Вставить("Тип", ПолучитьПолеСтруктуры(СтрокаМассива, "ProviderType")); + НоваяСтрока.Вставить("Имя", ПолучитьПолеСтруктуры(СтрокаМассива, "ProviderName")); + + Если СтрНайти(НоваяСтрока.Описание, "10-2012") > 0 Тогда + ПолитикаПользователя.Криптопровайдеры.Вставить(0, НоваяСтрока); + Иначе + ПолитикаПользователя.Криптопровайдеры.Добавить(НоваяСтрока); + КонецЕсли; + + КонецЦикла; + + // заполняем список TspServices + ПолитикаПользователя.СервераШтамповВремени.Очистить(); + СписокСервисов = ПолучитьПолеСтруктуры(ДанныеПолитики, "TspServices", Новый Массив); + Для каждого СтрокаМассива Из СписокСервисов Цикл + НоваяСтрока = Новый Структура; + НоваяСтрока.Вставить("Имя", ПолучитьПолеСтруктуры(СтрокаМассива, "Name")); + НоваяСтрока.Вставить("Адрес", ПолучитьПолеСтруктуры(СтрокаМассива, "Url")); + ПолитикаПользователя.СервераШтамповВремени.Добавить(НоваяСтрока); + КонецЦикла; + + // заполняем список типов подписей + ВсеТипы = СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей(); + ПолитикаПользователя.ТипыПодписей.Очистить(); + СписокТипов = ПолучитьПолеСтруктуры(ДанныеПолитики, "AllowedSignatureTypes", Новый Массив); + Для каждого СтрокаМассива Из СписокТипов Цикл + ПолитикаПользователя.ТипыПодписей.Добавить(ВсеТипы[СтрокаМассива]); + КонецЦикла; + + // определяется режим запроса пин-кода + ПолеПинКода = ПолучитьПолеСтруктуры(ДанныеПолитики, "PinCodeMode", "Allow"); + ПолитикаПользователя.РежимПинКода = "Опционально"; + Если ПолеПинКода = "Forbid" Тогда + ПолитикаПользователя.РежимПинКода = "Запрещено"; + ИначеЕсли ПолеПинКода = "Required" Тогда + ПолитикаПользователя.РежимПинКода = "Обязательно"; + ИначеЕсли ПолеПинКода = "Allow" Тогда + ПолитикаПользователя.РежимПинКода = "Опционально"; + КонецЕсли; + + ПолитикаПользователя.Заполнено = ВсегоПолей > 0; + + Если ПолитикаПользователя.Заполнено Тогда + ПолитикаПользователя.ДатаЗаполнения = ДатаСеанса(); + КонецЕсли; + +КонецПроцедуры + +// Универсальная функция получения закрытых данных из безопасного хранилища. +// Необходимо передать идентификатор пользователя. +// +// Параметры: +// НастройкиПользователя - Структура - структура хранящая сессионные данные учетной записи +// - Строка - GUID полученный для пользователя +// ИмяЗначения - Строка - необязательно, если передано, то возвращается значение из структуры хранения +// +// Возвращаемое значение: +// Строка +// +Функция ПолучитьЗакрытыеДанные(НастройкиПользователя, ИмяЗначения = Неопределено) Экспорт + + Результат = ""; + КлючЗначения = КлючЗаписиКонфиденциальныхДанных(НастройкиПользователя); + ДанныеХранилища = ПрочитатьДанныеБезопасногоХранилища(КлючЗначения); + ЗначениеПоУмолчанию = КонфиденциальныеДанныеПользователя(); + + Если ЗначениеЗаполнено(ДанныеХранилища) Тогда + ЗаполнитьЗначенияСвойств(ЗначениеПоУмолчанию, ДанныеХранилища); + КонецЕсли; + + Если ТипЗнч(ЗначениеПоУмолчанию.Пароль) = Тип("Строка") Тогда + Если ЗначениеЗаполнено(ЗначениеПоУмолчанию.Пароль) Тогда + ЗначениеПоУмолчанию.Пароль = СервисКриптографииDSSКлиентСервер.ОбъектПароля(ЗначениеПоУмолчанию.Пароль, 1); + Иначе + ЗначениеПоУмолчанию.Пароль = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + КонецЕсли; + + Если ТипЗнч(ЗначениеПоУмолчанию.ПарольСертификата) = Тип("Строка") Тогда + Если ЗначениеЗаполнено(ЗначениеПоУмолчанию.ПарольСертификата) Тогда + ЗначениеПоУмолчанию.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ОбъектПароля(ЗначениеПоУмолчанию.ПарольСертификата, 1); + Иначе + ЗначениеПоУмолчанию.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + КонецЕсли; + + Для Каждого СтрокаКлюча Из ЗначениеПоУмолчанию.Сертификаты Цикл + Если ТипЗнч(СтрокаКлюча.Значение) = Тип("Строка") Тогда + Если ЗначениеЗаполнено(СтрокаКлюча.Значение) Тогда + ЗначениеПоУмолчанию.Сертификаты[СтрокаКлюча.Ключ] = СервисКриптографииDSSКлиентСервер.ОбъектПароля(СтрокаКлюча.Значение, 1); + Иначе + ЗначениеПоУмолчанию.Сертификаты[СтрокаКлюча.Ключ] = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ЗначениеЗаполнено(ИмяЗначения) Тогда + ЗначениеПоУмолчанию.Свойство(ИмяЗначения, Результат); + Иначе + Результат = ЗначениеПоУмолчанию; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Универсальная процедура сохранения закрытых данных в безопасное хранилища +// +// Параметры: +// НастройкиПользователя - Структура - СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// - Строка - GUID полученный для пользователя +// Значение - Строка, Структура, Соответствие - данные сохраняемые в безопасном хранилище +// ИмяЗначения - Строка - имя свойства в структуре конфиденциальных данных +// +Процедура СохранитьЗакрытыеДанные(НастройкиПользователя, Значение, ИмяЗначения = Неопределено) Экспорт + + КлючЗначения = КлючЗаписиКонфиденциальныхДанных(НастройкиПользователя); + НовоеЗначение = Значение; + + Если ЗначениеЗаполнено(ИмяЗначения) Тогда + ВсеДанные = ПолучитьЗакрытыеДанные(НастройкиПользователя); + ВсеДанные.Вставить(ИмяЗначения, Значение); + НовоеЗначение = ВсеДанные; + КонецЕсли; + + ЗаписатьДанныеБезопасногоХранилища(КлючЗначения, НовоеЗначение); + +КонецПроцедуры + +// Специализированная процедура для сохранения данных пин-кодов в безопасном хранилище +// +// Параметры: +// НастройкиПользователя - Структура - структура хранящая сессионные данные учетной записи +// - Строка - GUID полученный для пользователя +// ОтпечатокСертификата - Строка - отпечаток сертификата для которого производятся изменения +// ПинКод - Строка - значение пин-кода, если значение пустая строка, то происходит сброс значения +// +Процедура СохранитьПинКодСертификата(НастройкиПользователя, ОтпечатокСертификата, ПинКод = "") Экспорт + + ВсеСертификаты = ПолучитьЗакрытыеДанные(НастройкиПользователя, "Сертификаты"); + Если ЗначениеЗаполнено(ПинКод) Тогда + ВсеСертификаты.Вставить(ОтпечатокСертификата, ПинКод); + Иначе + ВсеСертификаты.Удалить(ОтпечатокСертификата); + КонецЕсли; + + СохранитьЗакрытыеДанные(НастройкиПользователя, ВсеСертификаты, "Сертификаты"); + +КонецПроцедуры + +// Подготавливает / обновляет и устанавливает структуру сессионных данных указанной учетной записи +// +// Параметры: +// ТекущийПользователь - СправочникСсылка.УчетныеЗаписиDSS - ссылка на учетной записи, для которой нужно получить структуру +// ИсточникНастроек - см. СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса +// - Строка - подробнее СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище +// +// Возвращаемое значение: +// Структура - данные сохраняемые в параметры сеанса: +// * ТекущийПользователь - СправочникСсылка.УчетныеЗаписиDSS - для реализации процесса указания учетной записи +// * Пользователи - Соответствие из КлючИЗначение: +// ** Ключ - СправочникСсылка.УчетныеЗаписиDSS +// ** Значение - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ОбновитьНастройкиПользователя(ТекущийПользователь, ИсточникНастроек = Неопределено) Экспорт + + ТекущиеНастройки= ПолучитьКонтейнерНастроек(ПолучитьИсточникНастроек(ИсточникНастроек)); + ТаблицаЗаписей = ПолучитьДанныеАккаунтов(ТекущийПользователь); + + Для каждого СтрокаТаблицы Из ТаблицаЗаписей Цикл + НастройкиПользователяDSS = НастройкиРаботыДанныеПользователя(СтрокаТаблицы); + ТекущиеНастройки.Пользователи.Вставить(СтрокаТаблицы.Ссылка, НастройкиПользователяDSS); + КонецЦикла; + + Если ТаблицаЗаписей.Количество() = 0 Тогда + ТекущиеНастройки.Пользователи.Вставить(ТекущийПользователь, НастройкиПользователяПоУмолчанию()); + КонецЕсли; + + УстановитьКонтейнерНастроек(ТекущиеНастройки, ПолучитьИсточникНастроек(ИсточникНастроек)); + + Возврат ТекущиеНастройки; + +КонецФункции + +// Позволяет получить структуру сессионных данных указанной учетной записи. +// Конфиденциальные данные на клиент не передаются, они только оттуда принимают. +// +// Параметры: +// ИскатьПользователя - СправочникСсылка.УчетныеЗаписиDSS - ссылка на учетной записи, для которой нужно получить структуру +// ИсточникНастроек - Строка - варианты определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(). +// +// Возвращаемое значение: +// см. НастройкиРаботыДанныеПользователя +// +Функция ПолучитьНастройкиПользователя(ИскатьПользователя = Неопределено, ИсточникНастроек = Неопределено) Экспорт + + Результат = Неопределено; + + ТекущиеНастройки = ПолучитьКонтейнерНастроек(ПолучитьИсточникНастроек(ИсточникНастроек)); + НашлиИдентификатор = Неопределено; + + Если ИскатьПользователя <> Неопределено Тогда + НашлиИдентификатор = ИскатьПользователя; + Если ТекущиеНастройки.Пользователи[ИскатьПользователя] = Неопределено Тогда + ТекущиеНастройки = ОбновитьНастройкиПользователя(ИскатьПользователя, ИсточникНастроек); + КонецЕсли; + + ИначеЕсли ЗначениеЗаполнено(ТекущиеНастройки.ТекущийПользователь) Тогда + НашлиИдентификатор = ТекущиеНастройки.ТекущийПользователь; + + КонецЕсли; + + Если НашлиИдентификатор <> Неопределено Тогда + Результат = ТекущиеНастройки.Пользователи[НашлиИдентификатор]; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Подготавливает сессионные настройки учетной записи передаваемые на клиент. +// Перед передачей очищаются конфиденциальные данные: пароли, пин-коды сертификатов и токены авторизации. +// +// Параметры: +// НастройкиПользователя - см. НастройкиРаботыДанныеПользователя +// +// Возвращаемое значение: +// см. НастройкиРаботыДанныеПользователя +// +Функция ЗакрытьНастройкиПользователя(НастройкиПользователя) Экспорт + + Результат = НастройкиПользователя; + + ТокенАвторизации = Результат.ТокенАвторизации; + + Если НастройкиПользователя.ЗапоминатьПароли Тогда + Результат.Пароль = ЗакрытьКонфиденциальноеЗначение(Результат.Пароль); + Результат.ПарольСертификата = ЗакрытьКонфиденциальноеЗначение(Результат.ПарольСертификата); + Иначе + Результат.Пароль = ЗакрытьКонфиденциальноеЗначение(""); + Результат.ПарольСертификата = ЗакрытьКонфиденциальноеЗначение(""); + КонецЕсли; + + ТокенАвторизации.Токен = ЗакрытьКонфиденциальноеЗначение(ТокенАвторизации.Токен); + ТокенАвторизации.ТокенОбновления = ЗакрытьКонфиденциальноеЗначение(ТокенАвторизации.ТокенОбновления); + + Для каждого СтрокаКлюча Из Результат.Сертификаты Цикл + СтрокаКлюча.Значение.ПинКод = ЗакрытьКонфиденциальноеЗначение(СтрокаКлюча.Значение.ПинКод); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Получает значение хранящиеся в источнике настроек сеанса об всех учетных записях. +// +// Параметры: +// ИсточникНастроек - Неопределено, Строка - варианты определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(). +// +// Возвращаемое значение: +// см. НастройкиРаботы +// +Функция ПолучитьКонтейнерНастроек(ИсточникНастроек = Неопределено) Экспорт + + ЕстьПраво = ПроверитьПраво("ПодключениеDSS", "Получение"); + ТекущиеНастройки = Неопределено; + + Если ЕстьПраво + И (ИсточникНастроек = Неопределено + ИЛИ ИсточникНастроек = СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса()) Тогда + ТекущиеНастройки = ПараметрыСеанса.ПодключениеDSS.Получить(); + + ИначеЕсли ИсточникНастроек = СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище() Тогда + КлючНастроек = КлючЗаписиКонфиденциальныхДанных("НастройкиСеанса"); + ТекущиеНастройки = ПрочитатьДанныеБезопасногоХранилища(КлючНастроек); + + // принудительно сбрасываются настройки раз в сутки + Если ТекущиеНастройки <> Неопределено + И ТекущиеНастройки.ДатаФормирования <> НачалоДня(ТекущаяДатаСеанса()) Тогда + ТекущиеНастройки = Неопределено; + КонецЕсли; + + КонецЕсли; + + Если ТекущиеНастройки = Неопределено Тогда + ТекущиеНастройки = НастройкиРаботы(); + Иначе + ТекущиеНастройки = Новый Структура(ТекущиеНастройки); + КонецЕсли; + + Возврат ТекущиеНастройки; + +КонецФункции + +// Сохраняет структуру параметров сеансовых данных. +// +// Параметры: +// ТекущиеНастройки - см. НастройкиРаботы +// ИсточникНастроек - Неопределено, Строка - варианты определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(). +// +Процедура УстановитьКонтейнерНастроек(ТекущиеНастройки, ИсточникНастроек = Неопределено) Экспорт + + ЗначениеСеанса = Новый ФиксированнаяСтруктура(ТекущиеНастройки); + ЕстьПраво = ПроверитьПраво("ПодключениеDSS", "Установка"); + + Если ЕстьПраво + И (ИсточникНастроек = Неопределено + ИЛИ ИсточникНастроек = СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса()) Тогда + ЗначениеСеанса = Новый ХранилищеЗначения(ЗначениеСеанса); + ПараметрыСеанса.ПодключениеDSS = ЗначениеСеанса; + + ИначеЕсли ИсточникНастроек = СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище() Тогда + КлючНастроек = КлючЗаписиКонфиденциальныхДанных("НастройкиСеанса"); + ЗаписатьДанныеБезопасногоХранилища(КлючНастроек, ЗначениеСеанса); + + КонецЕсли; + +КонецПроцедуры + +// По переданным параметрам операции определяется источник настроек пользователя +// +// Параметры: +// ПараметрыОперации - Структура - проверяется на наличие поля "ИсточникНастроек" +// +// Возвращаемое значение: +// Строка - идентификатор источника сессионных настроек пользователя +// +Функция ПолучитьИсточникНастроек(ПараметрыОперации) Экспорт + + Результат = СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(); + + ИсточникНастроек = Неопределено; + Если ТипЗнч(ПараметрыОперации) = Тип("Структура") Тогда + ИсточникНастроек = ПолучитьПолеСтруктуры(ПараметрыОперации, "ИсточникНастроек"); + ИначеЕсли ТипЗнч(ПараметрыОперации) = Тип("Строка") Тогда + ИсточникНастроек = ПараметрыОперации; + КонецЕсли; + + #Если ВнешнееСоединение Тогда + Если ИсточникНастроек = Неопределено + И ПроверитьСредуВыполнения("ВнешнееСоединение") Тогда + Результат = СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(); + КонецЕсли; + #КонецЕсли + + Если ИсточникНастроек = СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса() + ИЛИ ИсточникНастроек = СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище() Тогда + Результат = ИсточникНастроек; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для формирования сессионных данных сохраняемых в параметрах сеанса +// Также эта функция может использования обновления параметров в случае, если произошли изменения в справочнике +// "ЭкземплярыСервераDSS". +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS - отбор по указанной ссылке +// СерверПодписи - СправочникСсылка.ЭкземплярыСервераDSS - отбор по указанной ссылке +// +// Возвращаемое значение: +// Массив из СправочникСсылка.УчетныеЗаписиDSS +// +Функция ПолучитьУчетныеЗаписи(СерверПодписи = Неопределено) Экспорт + + Результат = Новый Массив; + ВсеУчетныеЗаписи = ПолучитьДанныеАккаунтов(, СерверПодписи); + + Для каждого СтрокаТаблицы Из ВсеУчетныеЗаписи Цикл + Результат.Добавить(СтрокаТаблицы.Ссылка); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Служебная функция формирует структуру (объект) описывающая сессионные данные учетной записи +// +// Возвращаемое значение: +// Структура +// +Функция НастройкиПользователяПоУмолчанию() Экспорт + + ДанныеПолитики = Новый Структура(); + ДанныеПолитики.Вставить("Заполнено", Ложь); + ДанныеПолитики.Вставить("ДатаЗаполнения", Неопределено); + ДанныеПолитики.Вставить("Действия", Новый Структура()); + ДанныеПолитики.Вставить("УЦ", Новый Массив); + ДанныеПолитики.Вставить("Криптопровайдеры", Новый Массив); + ДанныеПолитики.Вставить("СервераШтамповВремени", Новый Массив); + ДанныеПолитики.Вставить("ТипыПодписей", Новый Массив); + ДанныеПолитики.Вставить("РежимПинКода", "Опционально");// определяет режим работы с пин-кодом: Обязательно, Запрещено, Опционально + + ДанныеПользователя = Новый Структура(); + ДанныеПользователя.Вставить("ВерсияАПИ", "2.0.2882"); + ДанныеПользователя.Вставить("ПризнакКонфиденциальности", 1); + ДанныеПользователя.Вставить("Ссылка", Справочники.УчетныеЗаписиDSS.ПустаяСсылка()); + ДанныеПользователя.Вставить("Сервер", Справочники.ЭкземплярыСервераDSS.ПустаяСсылка()); + ДанныеПользователя.Вставить("ТокенАвторизации", НастройкиРаботыШаблонТокена()); + ДанныеПользователя.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор()); + ДанныеПользователя.Вставить("Логин", ""); + ДанныеПользователя.Вставить("Пароль", СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3)); + ДанныеПользователя.Вставить("ПарольСертификата", СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3)); + ДанныеПользователя.Вставить("СертификатАвторизации", Ложь); + ДанныеПользователя.Вставить("ЗапоминатьПароли", Истина); + ДанныеПользователя.Вставить("Телефон", "");// данные из токена авторизации + ДанныеПользователя.Вставить("ЭлектроннаяПочта", "");// данные из токена авторизации + ДанныеПользователя.Вставить("ПервичнаяАутентификация", Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации); + ДанныеПользователя.Вставить("ВторичнаяАвторизация", Перечисления.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение); + ДанныеПользователя.Вставить("Политика", ДанныеПолитики); + ДанныеПользователя.Вставить("Подключение", Новый ФиксированнаяСтруктура()); + ДанныеПользователя.Вставить("Методы", Новый ФиксированнаяСтруктура()); + ДанныеПользователя.Вставить("Сертификаты", Новый Соответствие); + ДанныеПользователя.Вставить("ШаблонПодтверждения", ""); + ДанныеПользователя.Вставить("ВерсияНастройки", 0); + ДанныеПользователя.Вставить("АвторизованныйПользователь", Строка(Пользователи.АвторизованныйПользователь().УникальныйИдентификатор())); + ДанныеПользователя.Вставить("ИдентификаторНаСервере", ""); + ДанныеПользователя.Вставить("ДанныеБД", Истина); + ДанныеПользователя.Вставить("НеудачныхПопыток", 0); + + Возврат ДанныеПользователя; + +КонецФункции + +// Служебная функция для формирования сессионных данных сохраняемых в параметрах сеанса +// Также эта функция может использования обновления параметров в случае, если произошли изменения в справочнике +// "ЭкземплярыСервераDSS". +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS - отбор по указанной ссылке +// СерверПодписи - СправочникСсылка.ЭкземплярыСервераDSS - отбор по указанной ссылке +// +// Возвращаемое значение: +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.УчетныеЗаписиDSS - содержит текущую учетную запись +// * ПервичнаяАутентификация - ПеречислениеСсылка.СпособыАвторизацииDSS +// * ВторичнаяАвторизация - ПеречислениеСсылка.СпособыАвторизацииDSS +// * Логин - Строка +// * АдресСервера - Строка +// * ТаймАут - Число +// * ВерсияАПИ - Строка +// * СервисПодписи - Строка +// * СервисПроверки - Строка +// * СервисИдентификации - Строка +// * СервисАудита - Строка +// * СервисОбработкиДокументов - Строка +// * ИдентификаторЦИ - Строка +// * ИдентификаторСЭП - Строка +// * ШаблонПодтверждения - Строка +// +Функция ПолучитьДанныеАккаунтов(УчетнаяЗапись = Неопределено, СерверПодписи = Неопределено) Экспорт + + ТаблицаУчетныхЗаписей = Новый ТаблицаЗначений; + + Если НЕ (ПроверитьПраво("ЭкземплярыСервераDSS") + И ПроверитьПраво("УчетныеЗаписиDSS")) Тогда + Возврат ТаблицаУчетныхЗаписей; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | УчетныеЗаписиDSS.Ссылка КАК Ссылка, + | УчетныеЗаписиDSS.ПервичнаяАутентификация КАК ПервичнаяАутентификация, + | УчетныеЗаписиDSS.ВторичнаяАвторизация КАК ВторичнаяАвторизация, + | УчетныеЗаписиDSS.Логин КАК Логин, + | ЭкземплярыСервераDSS.Ссылка КАК Сервер, + | ЭкземплярыСервераDSS.АдресСервера КАК АдресСервера, + | ЭкземплярыСервераDSS.ТаймАут КАК ТаймАут, + | ЭкземплярыСервераDSS.ВерсияАПИ КАК ВерсияАПИ, + | ЭкземплярыСервераDSS.СервисАудита КАК СервисАудита, + | ЭкземплярыСервераDSS.СервисОбработкиДокументов КАК СервисОбработкиДокументов, + | ЭкземплярыСервераDSS.СервисПодписи КАК СервисПодписи, + | ЭкземплярыСервераDSS.СервисПроверки КАК СервисПроверки, + | ЭкземплярыСервераDSS.СервисИдентификации КАК СервисИдентификации, + | ЭкземплярыСервераDSS.ИдентификаторЦИ КАК ИдентификаторЦИ, + | ЭкземплярыСервераDSS.ИдентификаторСЭП КАК ИдентификаторСЭП, + | ЭкземплярыСервераDSS.ШаблонПодтверждения КАК ШаблонПодтверждения + |ИЗ + | Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + | ПО УчетныеЗаписиDSS.Владелец = ЭкземплярыСервераDSS.Ссылка + |ГДЕ + | НЕ УчетныеЗаписиDSS.ПометкаУдаления + | И (&УчетнаяЗапись = НЕОПРЕДЕЛЕНО + | ИЛИ УчетныеЗаписиDSS.Ссылка = &УчетнаяЗапись) + | И (&СерверПодписи = НЕОПРЕДЕЛЕНО + | ИЛИ ЭкземплярыСервераDSS.Ссылка = &СерверПодписи)"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); + Запрос.УстановитьПараметр("СерверПодписи", СерверПодписи); + ТаблицаУчетныхЗаписей = Запрос.Выполнить().Выгрузить(); + + Возврат ТаблицаУчетныхЗаписей; + +КонецФункции + +// Служебная функция для формирования сессионных данных сохраняемых в источнике настроек. +// Также эта функция может использования обновления параметров в случае, если произошли изменения в справочнике +// "ЭкземплярыСервераDSS". +// +// Параметры: +// СсылкаСервера - СправочникСсылка.ЭкземплярыСервераDSS - отбор учетных записей по серверу, +// ИсточникНастроек- Неопределено, Строка - варианты определенные в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса(), +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище(). +// +// Возвращаемое значение: +// Структура: +// * ТекущийПользователь - СправочникСсылка.УчетныеЗаписиDSS - содержит текущую учетную запись +// * Пользователи - Соответствие - содержит список учетных записей с которыми производилась работа в текущем сеансе +// +Функция НастройкиРаботы(СсылкаСервера = Неопределено, ИсточникНастроек = Неопределено) + + Если СсылкаСервера = Неопределено Тогда + Результат = Новый Структура; + Результат.Вставить("ТекущийПользователь", Неопределено);// Пользователь в сервисе облачной криптографии + Результат.Вставить("Пользователи", Новый Соответствие); + Результат.Вставить("РаботаВМоделиСервиса", ОбщегоНазначения.РазделениеВключено()); + Результат.Вставить("ДатаФормирования", НачалоДня(ТекущаяДатаСеанса())); + Иначе + Результат = ПолучитьКонтейнерНастроек(ПолучитьИсточникНастроек(ИсточникНастроек)); + ТаблицаЗаписей = ПолучитьДанныеАккаунтов(Неопределено, СсылкаСервера); + + Для каждого СтрокаТаблицы Из ТаблицаЗаписей Цикл + НастройкиПользователяDSS = НастройкиРаботыДанныеПользователя(СтрокаТаблицы); + Результат.Пользователи.Вставить(СтрокаТаблицы.Ссылка, НастройкиПользователяDSS); + КонецЦикла; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Дополняет общую структуру сессионных данных учетной записи DSS без привязки к справочнику. +// Внимание, данная функция должна вызываться из сеанса подключения текущего пользователя. +// +// Параметры: +// НастройкиПользователя - см. НастройкиРаботыДанныеПользователя +// ДанныеСервера - Структура - содержит реквизиты справочника ЭкземплярыСервераDSS +// Логин - Строка +// +Процедура ДополнитьНастройкиПользователя(НастройкиПользователя, ДанныеСервера, Логин) Экспорт + + НастройкиПользователя.Сервер = ДанныеСервера.Ссылка; + НастройкиПользователя.Логин = Логин; + НастройкиПользователя.Подключение = НастройкиРаботыПодключение(ДанныеСервера); + НастройкиПользователя.Методы = НастройкиРаботыТочкиПодключения(ДанныеСервера); + НастройкиПользователя.ШаблонПодтверждения = ДанныеСервера.ШаблонПодтверждения; + НастройкиПользователя.ДанныеБД = Ложь; + +КонецПроцедуры + +#КонецОбласти + +#Область Прочие + +// Служебная функция для получения элемента стиля по его имени +// +// Параметры: +// ИмяСтиля - Строка - имя стиля, неважно цвет, шрифт или другое +// ТипСтиля - Строка +// +// Возвращаемое значение: +// Произвольный +// +Функция ПолучитьЭлементСтиля(ИмяСтиля, ТипСтиля = "Шрифт") Экспорт + + Если ТипСтиля = "Шрифт" Тогда + Результат = Новый Шрифт(); + ИначеЕсли ТипСтиля = "Рамка" Тогда + ПараметрыОперации = Новый Массив; + ПараметрыОперации.Добавить(ТипРамкиЭлементаУправления.БезРамки); + ПараметрыОперации.Добавить(0); + Результат = Новый(Тип(ТипСтиля), ПараметрыОперации); + Иначе + Результат = Новый Цвет(); + КонецЕсли; + + НашлиСтиль = Метаданные.ЭлементыСтиля.Найти(ИмяСтиля); + Если НашлиСтиль <> Неопределено Тогда + Результат = НашлиСтиль.Значение; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Функция-обертка для запуска фонового задания для организации асинхронной обработки операций +// +// Параметры: +// ИмяПроцедуры - Строка - полный путь запускаемой процедуры в общем модуле +// ПараметрыПроцедуры - Структура - содержит именованные параметры для запуска процедур и функций +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры) Экспорт + + ИдентификаторОперации = ПолучитьПолеСтруктуры(ПараметрыПроцедуры, "ПараметрыОперации.ИдентификаторОперации"); + СинхронныйРежим = ПолучитьПолеСтруктуры(ПараметрыПроцедуры, "ПараметрыОперации.СинхронныйРежим"); + + Если СинхронныйРежим = Неопределено Тогда + СинхронныйРежим = НЕ ОбщегоНазначения.ЭтоВебКлиент(); + СервисКриптографииDSSПереопределяемый.ИспользоватьСинхронныйРежим(СинхронныйРежим); + КонецЕсли; + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор); + Если ИдентификаторОперации <> Неопределено Тогда + ПараметрыВыполнения.Вставить("КлючФоновогоЗадания", Строка(ИдентификаторОперации)); + КонецЕсли; + + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Вызов API сервиса криптографии DSS'", КодЯзыка()) + + ": " + ИмяПроцедуры; + ПараметрыВыполнения.ОжидатьЗавершение = 0; + ПараметрыВыполнения.ДополнительныйРезультат = Ложь; + ПараметрыВыполнения.ЗапуститьНеВФоне = СинхронныйРежим; + + Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, ПараметрыВыполнения); + +КонецФункции + +// Базовая функция для формирования результата выполнения функций и процедур в серверных вызовах. +// Данный формат используется в большинстве функций и процедур подсистемы. +// Есть аналог в клиентском модуле СервисКриптографииDSSСлужебныйКлиент. +// +// Параметры: +// Выполнено - Булево - устанавливает признак успешности выполнения +// +// Возвращаемое значение: +// Структура - в зависимости от значений полей Выполнено и МаркерОбновлен, может дополняться полями: +// * Выполнено - Булево - признак успешного выполнения вызова, +// если Истина, то обычно структура дополняется полем "Результат". +// * МаркерОбновлен- Булево - признак, что в процессе работы обновился токен авторизации, +// если Истина, структура дополняется полем "НастройкиПользователя". +// * Ошибка - Строка - содержит форматированный текст ошибки, если поле Выполнено = Ложь +// * КодОшибки - Строка - содержит код ошибки +// +Функция ОтветСервисаПоУмолчанию(Выполнено = Истина) + + Возврат СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Выполнено); + +КонецФункции + +// Функция-обертка используется для централизованного управление языком при формировании сообщений пользователю +// +// Возвращаемое значение: +// Строка - текстовый код языка (альфа2) +// +Функция КодЯзыка() Экспорт + + Возврат ОбщегоНазначения.КодОсновногоЯзыка(); + +КонецФункции + +// Функция-обертка используется для централизованного вызова для копирования структуры +// Параметры: +// СтруктураИсточник - Структура +// +// Возвращаемое значение: +// Структура +// +Функция СкопироватьСтруктуру(СтруктураИсточник) Экспорт + + Результат = ОбщегоНазначения.СкопироватьРекурсивно(СтруктураИсточник, Ложь); + Возврат Результат; + +КонецФункции + +// Функция используется для централизованного получения текущего времени и даты +// +// Возвращаемое значение: +// Дата +// +Функция ДатаСеанса() Экспорт + + Возврат ТекущаяДатаСеанса(); + +КонецФункции + +// Перечисляет список допустимых способов первичной аутентификации (авторизации) +// +// Возвращаемое значение: +// Массив - содержит значения из ПеречисленияСсылка.СпособыАвторизацииDSS +// +Функция ДоступныеСпособыПервичнойАвторизации() Экспорт + + Результат = Новый Массив; + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Первичный_УчетныеДанные); + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Первичный_ДвухФакторная); + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации); + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Первичный_КодАвторизации); + + Возврат Результат; + +КонецФункции + +// Перечисляет список допустимых способов вторичной авторизации (подтверждения операций) +// +// Возвращаемое значение: +// Массив - содержит значения из ПеречисленияСсылка.СпособыАвторизацииDSS +// +Функция ДоступныеСпособыВторичнойАвторизации() Экспорт + + Результат = Новый Массив; + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение); + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта); + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_СМС); + Результат.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_AirKeyLite); + + Возврат Результат; + +КонецФункции + +// Получает список способов авторизации (первичная и вторичная), которые указаны в настройках сервера +// +// Возвращаемое значение: +// Массив - содержит значения из ПеречисленияСсылка.СпособыАвторизацииDSS +// +Функция СпособыАвторизацииСОграничениями(СервисПодписи) Экспорт + + Результат = Новый Массив; + + Если НЕ ПроверитьПраво("ЭкземплярыСервераDSS") Тогда + Возврат Результат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ + | ЭкземплярыСервераDSSОграничениеАвторизации.СпособАвторизации КАК СпособАвторизации + |ИЗ + | Справочник.ЭкземплярыСервераDSS.ОграничениеАвторизации КАК ЭкземплярыСервераDSSОграничениеАвторизации + |ГДЕ + | ЭкземплярыСервераDSSОграничениеАвторизации.Ссылка = &СервисПодписи + | + |УПОРЯДОЧИТЬ ПО + | ЭкземплярыСервераDSSОграничениеАвторизации.НомерСтроки"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("СервисПодписи", СервисПодписи); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Результат.Добавить(Выборка.СпособАвторизации); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Проверяет тип сеанса приложения с ожидаемым. +// +// Параметры: +// ТипСеанса - Строка - идентификатор ожидаемого типа сеанса, допустимые идентификаторы +// ФоновоеЗадание, +// ВнешнееСоединение, +// ВебКлиент, +// Клиент (сводное понятие для всех клиентов), +// ТонкийКлиент. +// +// Возвращаемое значение: +// Булево +// +Функция ПроверитьСредуВыполнения(ТипСеанса) + + Результат = Ложь; + + ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы(); + ИмяПриложения = ТекущийСеансИнформационнойБазы.ИмяПриложения; + ФоновоеЗадание = ТекущийСеансИнформационнойБазы.ПолучитьФоновоеЗадание(); + + ИменаПриложений = Новый Массив; + Если ФоновоеЗадание <> Неопределено + И НРег(ТипСеанса) = НРег("ФоновоеЗадание") Тогда + Результат = Истина; + + ИначеЕсли НРег(ТипСеанса) = НРег("Клиент") Тогда + ИменаПриложений.Добавить("1CV8"); + ИменаПриложений.Добавить("1CV8C"); + ИменаПриложений.Добавить("WebClient"); + ИменаПриложений.Добавить("MobileClient"); + + ИначеЕсли НРег(ТипСеанса) = НРег("ВебКлиент") Тогда + ИменаПриложений.Добавить("WebClient"); + + ИначеЕсли НРег(ТипСеанса) = НРег("ТонкийКлиент") Тогда + ИменаПриложений.Добавить("1CV8C"); + + ИначеЕсли НРег(ТипСеанса) = НРег("ВнешнееСоединение") Тогда + ИменаПриложений.Добавить("COMConnection"); + ИменаПриложений.Добавить("WSConnection"); + ИменаПриложений.Добавить("BackgroundJob"); + ИменаПриложений.Добавить("HTTPServiceConnection"); + + КонецЕсли; + + Результат = Результат ИЛИ ИменаПриложений.Найти(ИмяПриложения) <> Неопределено; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область РаботаСоСправочникамиПодсистемы + +// Служебная функция для проверки дублирования логинов при записи элемента справочника "УчетныеЗаписиDSS" +// +// Параметры: +// ТекущаяСсылка - СправочникСсылка.УчетныеЗаписиDSS - ссылка записываемого элемента справочника +// ДанныеКлюча - Структура - содержит поля для поиска дублей. Список полей определяется в функции КлючиУникальностиСправочника +// +// Возвращаемое значение: +// - Неопределено +// - СправочникСсылка.УчетныеЗаписиDSS +// +Функция ПроверитьДублированиеЛогинов(ТекущаяСсылка, ДанныеКлюча) Экспорт + + Результат = Неопределено; + + Если НЕ ПроверитьПраво("УчетныеЗаписиDSS") Тогда + Возврат Результат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | УчетныеЗаписиDSS.Ссылка КАК Ссылка + |ИЗ + | Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS + |ГДЕ + | УчетныеЗаписиDSS.Ссылка <> &ТекущаяСсылка"; + + Запрос = Новый Запрос(); + Запрос.УстановитьПараметр("ТекущаяСсылка", ТекущаяСсылка); + + ВсегоПараметров = 0; + Для каждого СтрокаКлюча Из ДанныеКлюча Цикл + ВсегоПараметров = ВсегоПараметров + 1; + ИмяПараметра = "П" + Формат(ВсегоПараметров, ""); + ТекстЗапроса = ТекстЗапроса + " + | И УчетныеЗаписиDSS." + СтрокаКлюча.Ключ + " = &" + ИмяПараметра; + Запрос.УстановитьПараметр(ИмяПараметра, СтрокаКлюча.Значение); + КонецЦикла; + + Запрос.Текст = ТекстЗапроса; + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + Результат = Выборка.Ссылка; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для проверки дублирования элементов справочника "ЭкземплярыСервераDSS" +// Поля проверки дублирования: ИдентификаторЦИ, АдресСервера. +// +// Параметры: +// ТекущаяСсылка - СправочникСсылка.ЭкземплярыСервераDSS - ссылка на справочник "ЭкземплярыСервераDSS", в рамках которого проверяется уникальность +// ДанныеКлюча - Структура - содержит поля для поиска дублей. Список полей определяется в функции КлючиУникальностиСправочника +// +// Возвращаемое значение: +// СправочникСсылка.ЭкземплярыСервераDSS - первый найденный экземпляр +// +Функция ПроверитьДублированиеСерверов(ТекущаяСсылка, ДанныеКлюча) Экспорт + + Результат = Неопределено; + ЕстьАдрес = ДанныеКлюча.Свойство("АдресСервера"); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЭкземплярыСервераDSS.Ссылка КАК Ссылка, + | ЭкземплярыСервераDSS.АдресСервера КАК АдресСервера + |ИЗ + | Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + |ГДЕ + | ЭкземплярыСервераDSS.Ссылка <> &ТекущаяСсылка"; + + Запрос = Новый Запрос(); + Запрос.УстановитьПараметр("ТекущаяСсылка", ТекущаяСсылка); + + Для каждого СтрокаКлюча Из ДанныеКлюча Цикл + Если СтрокаКлюча.Ключ = "АдресСервера" Тогда + Продолжить; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + " + |И ЭкземплярыСервераDSS." + СтрокаКлюча.Ключ + " = &" + СтрокаКлюча.Ключ; + Запрос.УстановитьПараметр(СтрокаКлюча.Ключ, СтрокаКлюча.Значение); + КонецЦикла; + + Запрос.Текст = ТекстЗапроса; + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + Если ЕстьАдрес Тогда + СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(ДанныеКлюча.АдресСервера); + ТекущийАдрес = ВРег(СоставАдреса.ИмяСервера + "/" + СоставАдреса.ПутьНаСервере); + + Пока ВыборкаЗапроса.Следующий() Цикл + СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(ВыборкаЗапроса.АдресСервера); + ПолныйАдрес = СоставАдреса.ИмяСервера + "/" + СоставАдреса.ПутьНаСервере; + Если ВРег(ПолныйАдрес) = ТекущийАдрес Тогда + Результат = ВыборкаЗапроса.Ссылка; + Прервать; + КонецЕсли; + КонецЦикла; + Иначе + Если ВыборкаЗапроса.Следующий() Тогда + Результат = ВыборкаЗапроса.Ссылка; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Прототип функции для разбора файла содержащего настройки сервера DSS +// +// Параметры: +// ТекстФайлаНастроек - Строка - содержит текст файла настроек +// +// Возвращаемое значение: +// Структура - содержит список полей, которые возможны для поиска: +// * АдресСервера - Строка +// * СервисПроверки - Строка +// * СервисПодписи - Строка +// * СервисИдентификации - Строка +// * ИдентификаторЦИ - Строка +// * ИдентификаторСЭП - Строка +// * ШаблонПодтверждения - Строка +// * ВнутреннийИдентификатор - Строка +// * ОграничениеАвторизации - Строка +// * АдресЛичногоКабинета - Строка +// * Используется - Булево +// * ТаймАут - Число +// * Комментарий - Строка +// * ВерсияАПИ - Строка +// +Функция РазобратьФайлНастроекСервера(ТекстФайлаНастроек) Экспорт + + Результат = Новый Структура; + Результат.Вставить("АдресСервера", ""); + Результат.Вставить("ТаймАут", 120); + Результат.Вставить("ВерсияАПИ", ""); + Результат.Вставить("Комментарий", ""); + Результат.Вставить("Используется", Истина); + Результат.Вставить("СервисПодписи", ""); + Результат.Вставить("СервисПроверки", ""); + Результат.Вставить("СервисИдентификации", ""); + Результат.Вставить("СервисАудита", ""); + Результат.Вставить("СервисОбработкиДокументов", ""); + Результат.Вставить("ИдентификаторЦИ", ""); + Результат.Вставить("ИдентификаторСЭП", ""); + Результат.Вставить("ШаблонПодтверждения", ""); + Результат.Вставить("ВнутреннийИдентификатор", ""); + Результат.Вставить("АдресЛичногоКабинета", ""); + Результат.Вставить("ОграничениеАвторизации", ""); + + Если ТипЗнч(ТекстФайлаНастроек) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Результат, ТекстФайлаНастроек); + + ИначеЕсли ЗначениеЗаполнено(ТекстФайлаНастроек) Тогда + ВсегоСтрок = СтрЧислоСтрок(ТекстФайлаНастроек); + Для Счетчик = 1 По ВсегоСтрок Цикл + ТекущаяСтрока = СтрПолучитьСтроку(ТекстФайлаНастроек, Счетчик); + Позиция = СтрНайти(ТекущаяСтрока, ":"); + Если Позиция > 0 Тогда + Ключ = СокрЛП(Сред(ТекущаяСтрока, 1, Позиция - 1)); + Значение = СокрЛП(Сред(ТекущаяСтрока, Позиция + 1)); + Если Результат.Свойство(Ключ) Тогда + Результат.Вставить(Ключ, Значение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + // пост-обработка данных по приведению типов + Результат.ТаймАут = ПолучитьПолеСтруктуры(Результат, "ТаймАут", 120); + + Если ЗначениеЗаполнено(Результат.Используется) + И ТипЗнч(Результат.Используется) = Тип("Строка") Тогда + Результат.Используется = ВРег(Результат.Используется) = "ИСТИНА"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Единая точка, определяющая набор реквизитов композитного ключа справочников +// +// Возвращаемое значение: +// Строка - содержит список полей через запятую +// +Функция КлючиУникальностиСправочника(ИмяСправочника) Экспорт + + Результат = ""; + + Если ИмяСправочника = "ЭкземплярыСервераDSS" Тогда + Результат = "АдресСервера, ИдентификаторЦИ"; + ИначеЕсли ИмяСправочника = "УчетныеЗаписиDSS" Тогда + Результат = "Владелец, Логин"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область РаботаСОшибками + +// Анализирует ответ сервиса на наличие. В случае ошибок, формирует описание данной ошибки +// +// Параметры: +// ОтветСервиса - HTTPОтвет - содержит "сырой" ответ сервиса +// РезультатВыполнения - Структура - дополняет переданную структуру в случае ошибки, полям: +// * Выполнено - Булево - приравнивает Ложь +// * Ошибка - Строка - заполняет описание ошибки +// * КодОшибки - Строка - заполняет код ошибки +// +// Возвращаемое значение: +// Булево - Истина, если ошибок неопределено +// +Функция ПроверитьОшибкуВыполненияМетода(ОтветСервиса, РезультатВыполнения) + + // сформировать ответ в параметризированной форме + ИщемОшибку = Цел(ОтветСервиса.КодСостояния / 100); + Если ИщемОшибку = 4 ИЛИ ИщемОшибку = 5 Тогда + РезультатВыполнения.Выполнено = Ложь; + ТелоОтвета = Новый Соответствие; + ДанныеОтвета = ОтветСервиса.ПолучитьТелоКакСтроку(); + ТипКонтента = СокрЛП(ОтветСервиса.Заголовки["Content-Type"]); + Ответ_Ошибка = ""; + Ответ_Сообщение = ДанныеОтвета; + + Если СтрНайти(ТипКонтента, "application/json") > 0 + И НЕ ПустаяСтрока(ДанныеОтвета) Тогда + Попытка + ТелоОтвета = JsonВСтруктуру(ДанныеОтвета, Истина); + Исключение + ОбъектОшибки = ИнформацияОбОшибке(); + ПротоколОшибкиПриВызове( + ПодробноеПредставлениеОшибки(ОбъектОшибки), + НСтр("ru = 'Проверить ошибку выполнения метода'"), + ДанныеОтвета, + ОбъектОшибки); + КонецПопытки; + + Ответ_Ошибка = ПолучитьПолеСтруктуры(ТелоОтвета, "error", ""); + Ответ_Сообщение = ПолучитьПолеСтруктуры(ТелоОтвета, "message", ""); + Если ПустаяСтрока(Ответ_Сообщение) Тогда + Ответ_Сообщение = ПолучитьПолеСтруктуры(ТелоОтвета, "MessageDetail", ""); + КонецЕсли; + Если ПустаяСтрока(Ответ_Сообщение) Тогда + Ответ_Сообщение = ПолучитьПолеСтруктуры(ТелоОтвета, "error_description", ""); + КонецЕсли; + + Если ПустаяСтрока(Ответ_Ошибка) Тогда + Ответ_Ошибка = Ответ_Сообщение; + КонецЕсли; + + КонецЕсли; + + Если ОтветСервиса.КодСостояния = 401 Тогда + ПолучитьОписаниеОшибки(РезультатВыполнения, "HTTP401"); + + ИначеЕсли ОтветСервиса.КодСостояния = 403 Тогда + ПолучитьОписаниеОшибки(РезультатВыполнения, "HTTP403"); + + ИначеЕсли ОтветСервиса.КодСостояния = 404 Тогда + ПолучитьОписаниеОшибки(РезультатВыполнения, "HTTP404"); + + ИначеЕсли ОтветСервиса.КодСостояния = 405 Тогда + ПолучитьОписаниеОшибки(РезультатВыполнения, "HTTP405"); + + ИначеЕсли ОтветСервиса.КодСостояния = 500 Тогда + ПолучитьОписаниеОшибки(РезультатВыполнения, "HTTP500", Ответ_Сообщение); + + Иначе + ПолучитьОписаниеОшибки(РезультатВыполнения, Ответ_Ошибка, Ответ_Сообщение); + + КонецЕсли; + КонецЕсли; + + Возврат РезультатВыполнения.Выполнено; + +КонецФункции + +#КонецОбласти + +#Область ОбработкаСертификатовИЗапросов + +// Служебная процедура для обновления кеша сертификатов в регистре сведений СертификатыПользователяDSS. +// Данный регистр служит для поиска соответствия учетной записи и сертификата с которым производятся действия. +// +// Параметры: +// ПараметрыОбновления - Структура: +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// * СписокСертификатов - Соответствие из КлючИЗначение: +// ** Ключ - Строка - это отпечаток сертификата +// ** Значение - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +// ПараметрыОперации - Строка - адрес возврата результат обработки, формальный параметр, необходимый для выполнения в фоновом задании +// +Процедура ОбновитьКэшСертификатов(ПараметрыОбновления, ПараметрыОперации = Неопределено) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + НастройкиПользователя = ПараметрыОбновления.НастройкиПользователя; + СписокСертификатов = ПараметрыОбновления.СписокСертификатов; + + СсылкаУчетнойЗаписи = НастройкиПользователя.Ссылка; + + Если СписокСертификатов.Количество() = 0 + ИЛИ НЕ ЗначениеЗаполнено(СсылкаУчетнойЗаписи) + ИЛИ ТипЗнч(СсылкаУчетнойЗаписи) <> Тип("СправочникСсылка.УчетныеЗаписиDSS") Тогда + Возврат; + КонецЕсли; + + ТаблицаСертификатов = Новый ТаблицаЗначений; + ТаблицаСертификатов.Колонки.Добавить("Отпечаток", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(40))); + + Для каждого СтрокаМассива Из СписокСертификатов Цикл + НоваяСтрока = ТаблицаСертификатов.Добавить(); + НоваяСтрока.Отпечаток = СтрокаМассива.Ключ; + КонецЦикла; + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаСертификатов.Отпечаток КАК Отпечаток + |ПОМЕСТИТЬ ТаблицаСертификатов + |ИЗ + | &ТаблицаСертификатов КАК ТаблицаСертификатов + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ТаблицаСертификатов.Отпечаток КАК Отпечаток, + | 1 КАК Действие + |ИЗ + | ТаблицаСертификатов КАК ТаблицаСертификатов + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS + | ПО ТаблицаСертификатов.Отпечаток = СертификатыПользователяDSS.Отпечаток + | И (СертификатыПользователяDSS.УчетнаяЗаписьDSS = &УчетнаяЗапись) + |ГДЕ + | СертификатыПользователяDSS.Отпечаток ЕСТЬ NULL + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | СертификатыПользователяDSS.Отпечаток, + | 2 + |ИЗ + | РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS + | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаСертификатов КАК ТаблицаСертификатов + | ПО (ТаблицаСертификатов.Отпечаток = СертификатыПользователяDSS.Отпечаток) + |ГДЕ + | СертификатыПользователяDSS.УчетнаяЗаписьDSS = &УчетнаяЗапись + | И ТаблицаСертификатов.Отпечаток ЕСТЬ NULL"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ТаблицаСертификатов", ТаблицаСертификатов); + Запрос.УстановитьПараметр("УчетнаяЗапись", СсылкаУчетнойЗаписи); + ТаблицаДляДобавления = Запрос.Выполнить().Выгрузить(); + + Для каждого СтрокаТаблицы Из ТаблицаДляДобавления Цикл + Если СтрокаТаблицы.Действие = 2 Тогда // удалить + РегистрЗаписи = РегистрыСведений.СертификатыПользователяDSS.СоздатьМенеджерЗаписи(); + РегистрЗаписи.УчетнаяЗаписьDSS = СсылкаУчетнойЗаписи; + РегистрЗаписи.Отпечаток = СтрокаТаблицы.Отпечаток; + РегистрЗаписи.Удалить(); + + ИначеЕсли СтрокаТаблицы.Действие = 1 Тогда // добавить + ТекущийСертификат = СписокСертификатов[СтрокаТаблицы.Отпечаток]; + АлгоритмПодписи = ""; + АлгоритмХеширования = ""; + АлгоритмОткрытогоКлюча = ""; + СерийныйНомер = ""; + ДанныеСертификата = ПолучитьДвоичныеДанныеИзBase64Строки(ТекущийСертификат.Содержимое); + + Если ТекущийСертификат.АлгоритмыХеширования.Количество() > 0 Тогда + АлгоритмХеширования = ТекущийСертификат.АлгоритмыХеширования[0]; + КонецЕсли; + + ОбъектСертификата = СервисКриптографииDSS.ПолучитьОбъектСертификата(ДанныеСертификата, Истина); + + ПолученыДанные = СервисКриптографииDSS.ПолучитьСвойстваСертификата(НастройкиПользователя, ТекущийСертификат.Идентификатор); + Если ПолученыДанные.Выполнено Тогда + СведенияСертификата = ПолученыДанные.Результат; + АлгоритмПодписи = СведенияСертификата.АлгоритмПодписи; + АлгоритмОткрытогоКлюча = СведенияСертификата.АлгоритмОткрытогоКлюча; + СерийныйНомер = СведенияСертификата.СерийныйНомер; + Иначе + СерийныйНомер = ОбъектСертификата.СерийныйНомер; + КонецЕсли; + + РегистрЗаписи = РегистрыСведений.СертификатыПользователяDSS.СоздатьМенеджерЗаписи(); + РегистрЗаписи.УчетнаяЗаписьDSS = СсылкаУчетнойЗаписи; + РегистрЗаписи.Отпечаток = СтрокаТаблицы.Отпечаток; + РегистрЗаписи.Идентификатор = ТекущийСертификат.Идентификатор; + РегистрЗаписи.ДатаНачала = ТекущийСертификат.ДатаНачала; + РегистрЗаписи.ДатаОкончания = ТекущийСертификат.ДатаОкончания; + РегистрЗаписи.Наименование = ТекущийСертификат.Представление; + РегистрЗаписи.СерийныйНомер = СерийныйНомер; + РегистрЗаписи.ДанныеСертификата = Новый ХранилищеЗначения(ДанныеСертификата); + РегистрЗаписи.АлгоритмХеширования = АлгоритмХеширования; + РегистрЗаписи.АлгоритмПодписи = АлгоритмПодписи; + РегистрЗаписи.АлгоритмКлюча = АлгоритмОткрытогоКлюча; + РегистрЗаписи.ДатаДобавления = ДатаСеанса(); + РегистрЗаписи.ИдентификаторСертификата = ОбъектСертификата.Идентификатор; + + РегистрЗаписи.Записать(Истина); + КонецЕсли; + КонецЦикла; + + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + +// Служебная процедура для очистки кеша сертификатов, для выбранной учетной записи. +// Может потребоваться при событиях изменения данных в справочнике учетной записи. +// +// Параметры: +// СсылкаУчетнойЗаписи - СправочникСсылка.УчетныеЗаписиDSS - по этому значению осуществляется отбор удаляемых записей +// +Процедура ОчиститьСписокСертификатов(СсылкаУчетнойЗаписи) Экспорт + + Если НЕ ЗначениеЗаполнено(СсылкаУчетнойЗаписи) + ИЛИ ТипЗнч(СсылкаУчетнойЗаписи) <> Тип("СправочникСсылка.УчетныеЗаписиDSS") Тогда + Возврат; + КонецЕсли; + + РегистрЗаписи = РегистрыСведений.СертификатыПользователяDSS.СоздатьНаборЗаписей(); + РегистрЗаписи.Отбор.УчетнаяЗаписьDSS.Установить(СсылкаУчетнойЗаписи); + РегистрЗаписи.Очистить(); + РегистрЗаписи.Записать(Истина); + +КонецПроцедуры + +// Возвращает сведения о сертификате зарегистрированный на сервере DSS. +// +// Параметры: +// XMLОписаниеСертификата - Строка - строка содержащая XML описание сертификата +// +// Возвращаемое значение: +// Структура: +// * Версия - Строка - версия сертификата +// * СерийныйНомер - Строка +// * Издатель - Соответствие - поля атрибутов издателя +// * Субъект - Соответствие - поля атрибутов владельца +// * ДатаНачала - Дата - дата начала действия +// * ДатаОкончания - Дата - дата окончания действия +// * АлгоритмОткрытогоКлюча - Строка - описание алгоритма +// * ПараметрыОткрытогоКлюча - Строка +// * ОткрытыйКлюч - Строка +// * РасширениеСертификата - Соответствие - содержит поля расширения сертификата +// * АлгоритмПодписи - Строка +// +Функция ЗаполнитьСведенияСертификатаXMLОписание(XMLОписаниеСертификата) Экспорт + + Результат = Новый Структура(); + + ЧтениеСтроки= Новый ЧтениеXML; + ЧтениеСтроки.УстановитьСтроку(XMLОписаниеСертификата); + Построитель = Новый ПостроительDOM; + ДокументОписания = Построитель.Прочитать(ЧтениеСтроки); + + Результат.Вставить("Версия", "V" + ПолучитьПолеОписания(ДокументОписания, "//%version", Ложь)); + Результат.Вставить("СерийныйНомер", НРег(ПолучитьПолеОписания(ДокументОписания, "//%serial-number", Ложь))); + Результат.Вставить("Издатель", ПолучитьПолеОписания(ДокументОписания, "//%issuer/%rdn/%rdn-attr")); + Результат.Вставить("Субъект", ПолучитьПолеОписания(ДокументОписания, "//%subject/%rdn/%rdn-attr")); + Результат.Вставить("ДатаНачала", ПолучитьПолеОписания(ДокументОписания, "//%validity/%notBefore", Ложь, Тип("Дата"))); + Результат.Вставить("ДатаОкончания", ПолучитьПолеОписания(ДокументОписания, "//%validity/%notAfter", Ложь, Тип("Дата"))); + Результат.Вставить("АлгоритмОткрытогоКлюча", ПолучитьПолеОписания(ДокументОписания, "//%public-key-algorithm/%algorithm/%name", Ложь)); + Результат.Вставить("ПараметрыОткрытогоКлюча", ПолучитьПолеОписания(ДокументОписания, "//%public-key-algorithm/%parameters", Ложь)); + Результат.Вставить("ОткрытыйКлюч", ПолучитьПолеОписания(ДокументОписания, "//%subject-public-key/%value", Ложь)); + Результат.Вставить("РасширениеСертификата", ПолучитьПолеОписания(ДокументОписания, "//%extensions/%extension")); + Результат.Вставить("АлгоритмПодписи", ПолучитьПолеОписания(ДокументОписания, "//%signed-content/%signature-algorithm/%algorithm/%name", Ложь)); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область РаботаСПодключениеКСерверу + +// Функция используемая для формирования адреса подключения к сервисам DSS или SVS +// +// Параметры: +// ЗащищенноеСоединение - Булево - признак использования защищенного соединения к сервере +// +// Возвращаемое значение: +// Строка - строка протокола подключения +// +Функция ПротоколПодключения(ЗащищенноеСоединение = Истина) Экспорт + + Если ЗащищенноеСоединение Тогда + Результат = "https"; + Иначе + Результат = "http"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Подготавливает структуру с описанием свойств для подключения на основании описания настроек в справочнике "ЭкземплярыСервераDSS" +// +// Параметры: +// СвойстваПользователя - Структура - раздел "Подключение" в настройках пользователя, подробнее в НастройкиРаботыПодключение +// АдресПодключения - Строка - адрес подключения к сервису: ЦИ, СЭП, проверки. Может быть как относительным, так и полным. +// +// Возвращаемое значение: +// Структура - вновь сформированный раздел "Подключение" подробнее в НастройкиРаботыПодключение +// +Функция ПодготовитьСвойстваПодключения(СвойстваПользователя, АдресПодключения) Экспорт + + Результат = СкопироватьСтруктуру(СвойстваПользователя); + //@skip-warning + Результат.Вставить("АдресПодключения", АдресПодключения); + + Позиция = СтрНайти(АдресПодключения, "://"); + ПозицияСервера = СтрНайти(Результат.Сервер, "://"); + + // в настройках экземпляра сервера DSS указали полные пути для подключения + Если Позиция > 0 Тогда + СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресПодключения); + Результат.АдресПодключения = СоставАдреса.ПутьНаСервере; + Результат.Сервер = СоставАдреса.Хост; + Результат.Порт = СоставАдреса.Порт; + Результат.ЗащищенноеСоединение = НРег(СоставАдреса.Схема) = "https"; + ИначеЕсли ПозицияСервера > 0 Тогда + СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(Результат.Сервер); + Результат.Сервер = СоставАдреса.Хост; + Результат.Порт = СоставАдреса.Порт; + Результат.ЗащищенноеСоединение = НРег(СоставАдреса.Схема) = "https"; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Результат.Порт) Тогда + Результат.Порт = ?(Результат.ЗащищенноеСоединение, 443, 80); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Создает подключение к серверу на основе переданных параметров. +// В случае возникновения ошибок, возвращает соответствующее состояние. +// +// Параметры: +// СвойстваПодключения - Структура - состоит из следующих полей: +// * Сервер - Строка - адрес сервера +// * Протокол - Строка - варианты "http" или "https" +// * Порт - Число - номер порта подключения +// * ТаймАут - Число - ограничение времени для выполнения одного запроса +// СертификатКлиента - СертификатКлиентаФайл - необходим для одного из варианта аутентификации пользователя +// +// Возвращаемое значение: +// см. ОтветСервисаПоУмолчанию +// +Функция ПодготовитьПодключение(СвойстваПодключения, СертификатКлиента = Неопределено) Экспорт + + Результат = ОтветСервисаПоУмолчанию(Ложь); + + Если НЕ ЗначениеЗаполнено(СвойстваПодключения.Сервер) Тогда + ПолучитьОписаниеОшибки(Результат, "Подключение"); + Возврат Результат; + КонецЕсли; + + Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси(ПротоколПодключения(СвойстваПодключения.ЗащищенноеСоединение)); + + Попытка + СертификатыУЦ = Новый СертификатыУдостоверяющихЦентровОС; + ТипСоединения = Неопределено; + Если СертификатКлиента = Неопределено + И СвойстваПодключения.ЗащищенноеСоединение Тогда + ТипСоединения = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(Неопределено, СертификатыУЦ); + ИначеЕсли СвойстваПодключения.ЗащищенноеСоединение Тогда + ТипСоединения = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(СертификатКлиента, Неопределено); + КонецЕсли; + + Соединение = Новый HTTPСоединение( + СвойстваПодключения.Сервер, + СвойстваПодключения.Порт, + "", + "", + Прокси, + СвойстваПодключения.ТаймАут, + ТипСоединения); + + Результат.Выполнено = Истина; + Результат.Вставить("Результат", Соединение); + + Исключение + Результат.Выполнено = Ложь; + ПолучитьОписаниеОшибки(Результат, "Подключение"); + ПротоколОшибкиПриВызове(Результат.Ошибка, + "Подключение", + "", + ИнформацияОбОшибке()); + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +// Функция реализует выполнение HTTP метода с указанными параметрами. +// Это базовая функция для работы с сервисом. +// +// Параметры: +// Соединение - см. ПодготовитьПодключение +// АдресМетода - Строка - точка подключения к сервису +// ПараметрыМетода - Структура, ДвоичныеДанные - содержит параметры передаваемые в метод +// МетодHTTP - Строка - содержит метод вызова (GET, POST и пр.) +// Заголовки - Соответствие - содержит список заголовков при выполнении метода +// ТипСодержания - Строка - указывает как формировать тело запроса из ПараметрыМетода, поддерживается +// octet - передать двоичными данными, +// text - передать структуру как форматированную строку, +// json_list - передать как json и вернуть как Соответствие, +// json - передать как json. +// ПодписыватьЗапрос - Булево - использовать усиленный протокол обмена с сервисом, с использованием HMAC +// +// Возвращаемое значение: +// см. ОтветСервисаПоУмолчанию +// +Функция ВыполнитьМетодСервиса(Соединение, + АдресМетода, + ПараметрыМетода, + МетодHTTP, + Заголовки = Неопределено, + ТипСодержания = "text", + ПодписыватьЗапрос = Ложь) Экспорт + + + Если Соединение.Выполнено Тогда + ОтветМетода = ОтветСервисаПоУмолчанию(); + Иначе + Возврат Соединение; + КонецЕсли; + + Если Заголовки = Неопределено Тогда + Заголовки = Новый Соответствие; + КонецЕсли; + + Если СтрНайти(ТипСодержания, "json") > 0 Тогда + Заголовки.Вставить("Content-Type", "application/json"); + ИначеЕсли ТипСодержания = "text" Тогда + Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded"); + КонецЕсли; + + Если ПараметрыМетода = Неопределено Тогда + ПараметрыМетода = Новый Структура(); + КонецЕсли; + + Если ТипСодержания = "octet" Тогда + ПараметрыЗапроса = ПараметрыМетода; + ИначеЕсли ПараметрыМетода.Количество() = 0 Тогда + ПараметрыЗапроса = ""; + ИначеЕсли ТипСодержания = "text" Тогда + ПараметрыЗапроса = СтруктураВСтроку(ПараметрыМетода); + ИначеЕсли Сред(ТипСодержания, 1, 4) = "json" Тогда + ПараметрыЗапроса = JsonИзСтруктуры(ПараметрыМетода); + КонецЕсли; + + Если ЗначениеЗаполнено(ПараметрыЗапроса) + И МетодHTTP = "GET" Тогда + АдресМетода = АдресМетода + "?" + ПараметрыЗапроса; + ПараметрыЗапроса = ""; + КонецЕсли; + + Запрос = Новый HTTPЗапрос(АдресМетода, Заголовки); + Если ТипСодержания = "octet" Тогда + Запрос.УстановитьТелоИзДвоичныхДанных(ПараметрыЗапроса); + Иначе + Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса); + КонецЕсли; + + Попытка + Ответ = Соединение.Результат.ВызватьHTTPМетод(МетодHTTP, Запрос); + Исключение + ОтветМетода = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(ОтветМетода, "ВыполнениеМетода"); + ПротоколОшибкиПриВызове(ОтветМетода.Ошибка, + "ВыполнениеМетода", + ПараметрыМетода, + ИнформацияОбОшибке()); + Возврат ОтветМетода; + КонецПопытки; + + ОтветМетода.Вставить("КодСостояния", Ответ.КодСостояния); + + ТелоОтвета = Новый Соответствие; + ЗаголовкиОтвета = Ответ.Заголовки; + + Если ПроверитьОшибкуВыполненияМетода(Ответ, ОтветМетода) Тогда + + ТипКонтента = СокрЛП(ЗаголовкиОтвета["Content-Type"]); + Если ТипКонтента = "application/octet-stream" Тогда + ДанныеОтвета = ""; + ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные(); + Иначе + ДанныеОтвета = Ответ.ПолучитьТелоКакСтроку(); + КонецЕсли; + + Если СтрНайти(ТипКонтента, "application/json") > 0 + И НЕ ПустаяСтрока(ДанныеОтвета) Тогда + Если ТипСодержания = "json_list" Тогда + ТелоОтвета = JsonВСтруктуру(ДанныеОтвета, Истина); + Иначе + ТелоОтвета = JsonВСтруктуру(ДанныеОтвета, Ложь); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + ОтветМетода.Вставить("Заголовки", ЗаголовкиОтвета); + ОтветМетода.Вставить("Результат", ТелоОтвета); + + Возврат ОтветМетода; + +КонецФункции + +// Разбирает ответ сервиса обнаружения, если таковой развернут на сервере. +// +// Параметры: +// ДанныеСервиса - Массив из Структура - объект сериализованный из JSON +// +// Возвращаемое значение: +// см. ОтветСервисаПоУмолчанию +// +Функция РазобратьОтветСервисаОбнаружения(ДанныеСервиса) Экспорт + + Результат = Новый Структура(); + Результат.Вставить("СервисыЦИ", Новый Массив); + Результат.Вставить("СервисыСЭП", Новый Массив); + + Для каждого СтрокаМассива Из ДанныеСервиса Цикл + СсылкаНаАдреса = ПолучитьПолеСтруктуры(СтрокаМассива, "links", Новый Массив); + + Для каждого СтрокаСсылки Из СсылкаНаАдреса Цикл + Заголовок = ПолучитьПолеСтруктуры(СтрокаСсылки, "title.ru-RU"); + АдресСервиса= ПолучитьПолеСтруктуры(СтрокаСсылки, "href", ""); + ТипСервиса = ПолучитьПолеСтруктуры(СтрокаСсылки, "rel", ""); + + Если ТипСервиса = "http://dss.cryptopro.ru/signserver" Тогда + НоваяСтрока = Новый Структура(); + НоваяСтрока.Вставить("Заголовок", Заголовок); + НоваяСтрока.Вставить("АдресСервиса", АдресСервиса); + Результат.СервисыСЭП.Добавить(НоваяСтрока); + ИначеЕсли ТипСервиса = "http://dss.cryptopro.ru/sts" Тогда + НоваяСтрока = Новый Структура(); + НоваяСтрока.Вставить("Заголовок", Заголовок); + НоваяСтрока.Вставить("АдресСервиса", АдресСервиса); + Результат.СервисыЦИ.Добавить(НоваяСтрока); + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Преобразует параметры (структура) в строку параметров для GET запроса +// +// Параметры: +// ПараметрыМетода - Структура - содержит параметры и их значения +// URLКодировка - Булево - преобразовать значения в URL кодировку +// +// Возвращаемое значение: +// Строка - сформированная строка предназначенная для заполнения адреса или тела HTTPЗапроса +// +Функция СтруктураВСтроку(ПараметрыМетода, URLКодировка = Ложь) Экспорт + + Результат = ""; + + Для каждого СтрокаКлюча Из ПараметрыМетода Цикл + ЗначениеКлюча = СтрокаКлюча.Значение; + Если URLКодировка = Истина Тогда + ЗначениеКлюча = КодироватьСтроку(ЗначениеКлюча, СпособКодированияСтроки.КодировкаURL); + КонецЕсли; + Результат = Результат + ?(ПустаяСтрока(Результат), "", "&") + СтрокаКлюча.Ключ + "=" + ЗначениеКлюча; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Преобразует строку в формате JSON в соответствие. +// +// Параметры: +// СтрокаJSON - Строка - строка в формате JSON. +// КакСоответствие - Булево - сформировать результат как соответствие. +// +// Возвращаемое значение: +// Структура, Соответствие - сформированное структура полей +// +Функция JsonВСтруктуру(СтрокаJSON, КакСоответствие = Ложь) Экспорт + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтрокаJSON); + + Объект = ПрочитатьJSON(ЧтениеJSON, КакСоответствие); + + ЧтениеJSON.Закрыть(); + + Возврат Объект; + +КонецФункции + +// Преобразует структуру или соответствие в строку JSON. Двоичные данные преобразуются в строки Base64. +// +// Параметры: +// СтрокаJSON - Структура, Соответствие - структура, которую необходимо преобразовать в строку JSON. +// ОграничитьДлину - Булево - ограничить длину значения не более 100 символов +// +// Возвращаемое значение: +// Строка - текстовое представление JSON +// +Функция JsonИзСтруктуры(Объект, ОграничитьДлину = Ложь) + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(); + + Если ОграничитьДлину Тогда + НовыйОбъект = СкопироватьСтруктуру(Объект); + Для каждого СтрокаКлюча Из НовыйОбъект Цикл + Если ТипЗнч(СтрокаКлюча.Значение) = Тип("Строка") Тогда + НовыйОбъект.Вставить(СтрокаКлюча.Ключ, Сред(СтрокаКлюча.Значение, 1, 100)); + ИначеЕсли ТипЗнч(СтрокаКлюча.Значение) = Тип("ДвоичныеДанные") Тогда + НовыйОбъект.Вставить(СтрокаКлюча.Ключ, Сред(Base64Значение(СтрокаКлюча.Значение), 1, 100)); + КонецЕсли; + КонецЦикла; + ЗаписатьJSON(ЗаписьJSON, НовыйОбъект); + Иначе + ЗаписатьJSON(ЗаписьJSON, Объект); + КонецЕсли; + + Возврат ЗаписьJSON.Закрыть(); + +КонецФункции + +// Разбирает адресную строку содержащую параметры в Соответствие +// +// Параметры: +// ДанныеСтраницы - Строка - строка адрес или текст HTML страницы +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - это имя параметра +// * Значение - Строка - его переданное значение +// +Функция ПолучитьПараметрыИзОтвета(ДанныеСтраницы) Экспорт + + Результат = Новый Соответствие(); + + ПервыйСимвол = СтрНайти(ДанныеСтраницы, "?"); + Пока ПервыйСимвол > 0 Цикл + ВторойСимвол = СтрНайти(ДанныеСтраницы, "=", , ПервыйСимвол + 1); + Если ВторойСимвол <> 0 Тогда + ИмяКлюча = Сред(ДанныеСтраницы, ПервыйСимвол + 1, ВторойСимвол - ПервыйСимвол - 1); + ПервыйСимвол = СтрНайти(ДанныеСтраницы, "&", , ВторойСимвол + 1); + Если ПервыйСимвол = 0 Тогда + ЗначениеКлюча = НРег(Сред(ДанныеСтраницы, ВторойСимвол + 1)); + Иначе + ЗначениеКлюча = НРег(Сред(ДанныеСтраницы, ВторойСимвол + 1, ПервыйСимвол - ВторойСимвол - 1)); + КонецЕсли; + Результат.Вставить(ИмяКлюча, ЗначениеКлюча); + Иначе + ПервыйСимвол = 0; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Служебная функция для преобразования параметров по формату Base64URL, с последующей передачей в заголовке запроса +// +// Параметры: +// ПараметрыЗапроса - Структура, Соответствие - поля и их значения для формирования строки +// +// Возвращаемое значение: +// Строка - преобразованное значение JSON и закодированное в Base64URL +// +Функция ПодготовитьЗаголовокПотока(ПараметрыЗапроса) Экспорт + + ПредставлениеЗаголовка = JsonИзСтруктуры(ПараметрыЗапроса); + ПредставлениеЗаголовка = НормализоватьСтрокуПараметров(ПредставлениеЗаголовка, Ложь); + ПредставлениеЗаголовка = СтрЗаменить(ПредставлениеЗаголовка, """: ", """:"); + ПредставлениеЗаголовка = Base64URL(ПредставлениеЗаголовка); + + Возврат ПредставлениеЗаголовка; + +КонецФункции + +// Служебная процедура проверки результата вызова сервиса. +// Если в результате вызова была ошибка, то она записывается с журнал регистрации дополнительно регистрируется +// ключевые параметры вызова. +// +// Параметры: +// РезультатВызова - Строка +// - Структура - см. ОтветСервисаПоУмолчанию +// ВидОперации - Строка - описание операции, при выполнении, которой возникла ошибка +// ВходящийКонтекст - Строка, Структура - желательно структуру фильтровать на критичные данные и их размер +// см. СервисКриптографииDSSКлиентСервер.ФильтроватьПараметрыВызова() +// КонтекстОшибки - ИнформацияОбОшибке +// +Процедура ПротоколОшибкиПриВызове(РезультатВызова, ВидОперации, ВходящийКонтекст, КонтекстОшибки = Неопределено) Экспорт + + НоваяОшибка = ""; + ПодробнаяОшибка = ""; + + Если ТипЗнч(РезультатВызова) = Тип("Строка") Тогда + НоваяОшибка = РезультатВызова; + ИначеЕсли НЕ РезультатВызова.Выполнено Тогда + НоваяОшибка = РезультатВызова.Ошибка; + КонецЕсли; + + Если КонтекстОшибки <> Неопределено Тогда + ПодробнаяОшибка = ПодробноеПредставлениеОшибки(КонтекстОшибки); + КонецЕсли; + + Если ЗначениеЗаполнено(НоваяОшибка) Тогда + КодЯзыка = КодЯзыка(); + + ТекстОшибки = НСтр( + "ru = 'Ошибка: %2 + | + |Вид операции: %1'", КодЯзыка); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ВидОперации, НоваяОшибка); + + Если ЗначениеЗаполнено(ПодробнаяОшибка) Тогда + ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + + НСтр("ru = 'Подробности:'", КодЯзыка()) + + Символы.ПС + ПодробнаяОшибка; + КонецЕсли; + + НовыйОбъект = СервисКриптографииDSSКлиентСервер.ФильтроватьПараметрыВызова(ВходящийКонтекст); + ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки, НовыйОбъект); + КонецЕсли; + +КонецПроцедуры + +// Подготавливает данные перед возвратом "клиенту" +// +// Параметры: +// РезультатЗапроса- Строка - всегда данные закодированные в Base64 +// ТипРезультата - Строка - варианты преобразования: ДвоичныеДанные, АдресХранилища, Base64 +// +// Возвращаемое значение: +// ДвоичныеДанные, Строка - если строка, то может быть адрес хранилища или Base64 +// +Функция ПодготовитьРезультатЗапроса(РезультатЗапроса, ТипРезультата = "ДвоичныеДанные") Экспорт + + Результат = Неопределено; + + Если ТипРезультата = "ДвоичныеДанные" + ИЛИ ПустаяСтрока(ТипРезультата) Тогда + Результат = Base64Значение(РезультатЗапроса); + ИначеЕсли ТипРезультата = "АдресХранилища" Тогда + Результат = ПоместитьВоВременноеХранилище(Base64Значение(РезультатЗапроса), Новый УникальныйИдентификатор); + ИначеЕсли ТипРезультата = "Base64" Тогда + Результат = РезультатЗапроса; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ФормированиеОписаниеОшибок + +Функция ДоступныйРеестрОшибок(Знач ИдентификаторОшибки) + + Результат = Неопределено; + ИдентификаторОшибки = НРег(ИдентификаторОшибки); + + Если ИдентификаторОшибки = НРег("Подключение") Тогда + Результат = ОписаниеОшибки_Подключение(); + ИначеЕсли ИдентификаторОшибки = НРег("Пользователь") Тогда + Результат = ОписаниеОшибки_Пользователь(); + ИначеЕсли ИдентификаторОшибки = "http401" Тогда + Результат = ОписаниеОшибки_HTTP401(); + ИначеЕсли ИдентификаторОшибки = "http404" Тогда + Результат = ОписаниеОшибки_HTTP404(); + ИначеЕсли ИдентификаторОшибки = "http405" Тогда + Результат = ОписаниеОшибки_HTTP405(); + ИначеЕсли ИдентификаторОшибки = "http500" Тогда + Результат = ОписаниеОшибки_HTTP500(); + ИначеЕсли ИдентификаторОшибки = НРег("ПараметрыЗашифрования") Тогда + Результат = ОписаниеОшибки_ПараметрыЗашифрования(); + ИначеЕсли ИдентификаторОшибки = "invalid_pin" Тогда + Результат = ОписаниеОшибки_invalid_pin(); + ИначеЕсли ИдентификаторОшибки = "invalid_grant" Тогда + Результат = ОписаниеОшибки_invalid_grant(); + ИначеЕсли ИдентификаторОшибки = "unsupported_grant_type" Тогда + Результат = ОписаниеОшибки_unsupported_grant_type(); + ИначеЕсли ИдентификаторОшибки = "unauthorized_client" Тогда + Результат = ОписаниеОшибки_unauthorized_client(); + ИначеЕсли ИдентификаторОшибки = "invalid_client" Тогда + Результат = ОписаниеОшибки_invalid_client(); + ИначеЕсли ИдентификаторОшибки = НРег("ОшибкаТокена") Тогда + Результат = ОписаниеОшибки_ОшибкаТокена(); + ИначеЕсли ИдентификаторОшибки = "http403" Тогда + Результат = ОписаниеОшибки_HTTP403(); + ИначеЕсли ИдентификаторОшибки = "invalid_request" Тогда + Результат = ОписаниеОшибки_invalid_request(); + ИначеЕсли ИдентификаторОшибки = "transaction_pending" Тогда + Результат = ОписаниеОшибки_transaction_pending(); + ИначеЕсли ИдентификаторОшибки = "invalid_certificate" Тогда + Результат = ОписаниеОшибки_invalid_certificate(); + ИначеЕсли ИдентификаторОшибки = "invalid_transaction" Тогда + Результат = ОписаниеОшибки_invalid_transaction(); + ИначеЕсли ИдентификаторОшибки = "transaction_expired" Тогда + Результат = ОписаниеОшибки_transaction_expired(); + ИначеЕсли ИдентификаторОшибки = "max_attempts_exceeded" Тогда + Результат = ОписаниеОшибки_max_attempts_exceeded(); + ИначеЕсли ИдентификаторОшибки = "internal_error" Тогда + Результат = ОписаниеОшибки_internal_error(); + ИначеЕсли ИдентификаторОшибки = "authentication_failed" Тогда + Результат = ОписаниеОшибки_authentication_failed(); + ИначеЕсли ИдентификаторОшибки = "pending_requests_exist" Тогда + Результат = ОписаниеОшибки_pending_requests_exist(); + ИначеЕсли ИдентификаторОшибки = "invalid_signature_params" Тогда + Результат = ОписаниеОшибки_invalid_signature_params(); + ИначеЕсли ИдентификаторОшибки = "content_required" Тогда + Результат = ОписаниеОшибки_content_required(); + ИначеЕсли ИдентификаторОшибки = "invalid_enroll" Тогда + Результат = ОписаниеОшибки_invalid_enroll(); + ИначеЕсли ИдентификаторОшибки = "invalid_rev_request" Тогда + Результат = ОписаниеОшибки_invalid_rev_request(); + ИначеЕсли ИдентификаторОшибки = "request_not_found" Тогда + Результат = ОписаниеОшибки_request_not_found(); + ИначеЕсли ИдентификаторОшибки = "invalid_certificate_format" Тогда + Результат = ОписаниеОшибки_invalid_certificate_format(); + ИначеЕсли ИдентификаторОшибки = "appropriate_enroll_not_found" Тогда + Результат = ОписаниеОшибки_appropriate_enroll_not_found(); + ИначеЕсли ИдентификаторОшибки = "invalid_request_status" Тогда + Результат = ОписаниеОшибки_invalid_request_status(); + ИначеЕсли ИдентификаторОшибки = "duplicate_friendly_name" Тогда + Результат = ОписаниеОшибки_duplicate_friendly_name(); + ИначеЕсли ИдентификаторОшибки = "invalid_frinendly_name_length" Тогда + Результат = ОписаниеОшибки_invalid_frinendly_name_length(); + ИначеЕсли ИдентификаторОшибки = "invalid_parameters" Тогда + Результат = ОписаниеОшибки_invalid_parameters(); + ИначеЕсли ИдентификаторОшибки = "invalid_certificate_status" Тогда + Результат = ОписаниеОшибки_invalid_certificate_status(); + ИначеЕсли ИдентификаторОшибки = "parameters_required" Тогда + Результат = ОписаниеОшибки_parameters_required(); + ИначеЕсли ИдентификаторОшибки = "invalid_content" Тогда + Результат = ОписаниеОшибки_invalid_content(); + ИначеЕсли ИдентификаторОшибки = "invalid_recipients" Тогда + Результат = ОписаниеОшибки_invalid_recipients(); + ИначеЕсли ИдентификаторОшибки = "unsupported_response_type" Тогда + Результат = ОписаниеОшибки_unsupported_response_type(); + ИначеЕсли ИдентификаторОшибки = "invalid_scope" Тогда + Результат = ОписаниеОшибки_invalid_scope(); + ИначеЕсли ИдентификаторОшибки = "login_required" Тогда + Результат = ОписаниеОшибки_login_required(); + ИначеЕсли ИдентификаторОшибки = "invalid_phone" Тогда + Результат = ОписаниеОшибки_invalid_phone(); + ИначеЕсли ИдентификаторОшибки = "wrong_operation" Тогда + Результат = ОписаниеОшибки_wrong_operation(); + ИначеЕсли ИдентификаторОшибки = "user_not_found" Тогда + Результат = ОписаниеОшибки_user_not_found(); + ИначеЕсли ИдентификаторОшибки = "contact_confirmation_required" Тогда + Результат = ОписаниеОшибки_contact_confirmation_required(); + ИначеЕсли ИдентификаторОшибки = "invalid_authentication_scheme" Тогда + Результат = ОписаниеОшибки_invalid_authentication_scheme(); + ИначеЕсли ИдентификаторОшибки = "authn_method_not_confirmed" Тогда + Результат = ОписаниеОшибки_authn_method_not_confirmed(); + ИначеЕсли ИдентификаторОшибки = "document_info_invalid" Тогда + Результат = ОписаниеОшибки_document_info_invalid(); + ИначеЕсли ИдентификаторОшибки = "invalid_operation" Тогда + Результат = ОписаниеОшибки_invalid_operation(); + ИначеЕсли ИдентификаторОшибки = "invalid_certificate_id" Тогда + Результат = ОписаниеОшибки_invalid_certificate_id(); + ИначеЕсли ИдентификаторОшибки = "invalid_subject_name" Тогда + Результат = ОписаниеОшибки_invalid_subject_name(); + ИначеЕсли ИдентификаторОшибки = НРег("ПроверкаСертификата") Тогда + Результат = ОписаниеОшибки_ПроверкаСертификата(); + ИначеЕсли ИдентификаторОшибки = НРег("ПроверкаПодписи") Тогда + Результат = ОписаниеОшибки_ПроверкаПодписи(); + ИначеЕсли ИдентификаторОшибки = НРег("ПроверкаМаркерДоступа") Тогда + Результат = ОписаниеОшибки_ПроверкаМаркерДоступа(); + ИначеЕсли ИдентификаторОшибки = НРег("СертификатБезУчетнойЗаписи") Тогда + Результат = ОписаниеОшибки_СертификатБезУчетнойЗаписи(); + ИначеЕсли ИдентификаторОшибки = НРег("ЧужойСертификат") Тогда + Результат = ОписаниеОшибки_ЧужойСертификат(); + ИначеЕсли ИдентификаторОшибки = НРег("ПодсистемаОтключена") Тогда + Результат = ОписаниеОшибки_ПодсистемаОтключена(); + ИначеЕсли ИдентификаторОшибки = НРег("НезагруженСертификатАвторизации") Тогда + Результат = ОписаниеОшибки_НеЗагруженСертификатАвторизации(); + ИначеЕсли ИдентификаторОшибки = "error_bad_bounds" Тогда + Результат = ОписаниеОшибки_error_bad_bounds(); + ИначеЕсли ИдентификаторОшибки = "error_invalid_filter_value" Тогда + Результат = ОписаниеОшибки_error_invalid_filter_value(); + ИначеЕсли ИдентификаторОшибки = "error_operation_not_supported" Тогда + Результат = ОписаниеОшибки_error_operation_not_supported(); + ИначеЕсли ИдентификаторОшибки = "invalid_object_state" Тогда + Результат = ОписаниеОшибки_invalid_object_state(); + ИначеЕсли ИдентификаторОшибки = "invalid_object_data" Тогда + Результат = ОписаниеОшибки_invalid_object_data(); + ИначеЕсли ИдентификаторОшибки = "forbidden_object_operation" Тогда + Результат = ОписаниеОшибки_forbidden_object_operation(); + ИначеЕсли ИдентификаторОшибки = НРег("ОшибкаКонвертации") Тогда + Результат = ОписаниеОшибки_ОшибкаКонвертации(); + ИначеЕсли ИдентификаторОшибки = "algid_is_not_supported" Тогда + Результат = ОписаниеОшибки_algid_is_not_supported(); + ИначеЕсли ИдентификаторОшибки = "param_set_is_not_supported" Тогда + Результат = ОписаниеОшибки_param_set_is_not_supported(); + ИначеЕсли ИдентификаторОшибки = "provider_not_found" Тогда + Результат = ОписаниеОшибки_provider_not_found(); + ИначеЕсли ИдентификаторОшибки = "enroll_is_missing" Тогда + Результат = ОписаниеОшибки_enroll_is_missing(); + ИначеЕсли ИдентификаторОшибки = "cert_not_found" Тогда + Результат = ОписаниеОшибки_cert_not_found(); + ИначеЕсли ИдентификаторОшибки = "key_not_found" Тогда + Результат = ОписаниеОшибки_key_not_found(); + ИначеЕсли ИдентификаторОшибки = "param_is_null" Тогда + Результат = ОписаниеОшибки_param_is_null(); + ИначеЕсли ИдентификаторОшибки = "value_is_null" Тогда + Результат = ОписаниеОшибки_value_is_null(); + ИначеЕсли ИдентификаторОшибки = НРег("ДействиеЭтапаПодтверждения") Тогда + Результат = ОписаниеОшибки_ДействиеЭтапаПодтверждения(); + ИначеЕсли ИдентификаторОшибки = "max_request_length_exceeded" Тогда + Результат = ОписаниеОшибки_max_request_length_exceeded(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует структуру для хранения описания ошибки +// +// Параметры: +// КодОшибки - Строка +// ТекстОшибки - Строка - текст описания ошибки +// +// Возвращаемое значение: +// Структура: +// * КодОшибки - Строка +// * Описание - Строка - текст описания ошибки +// +Функция ОбщееОписаниеОшибки(КодОшибки, ТекстОшибки) + + Результат = Новый Структура(); + Результат.Вставить("КодОшибки", КодОшибки); + Результат.Вставить("Описание", ТекстОшибки); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_Подключение() + + Результат = ОбщееОписаниеОшибки("000001", + НСтр("ru = 'Ошибка подключения к серверу.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_Пользователь() + + Результат = ОбщееОписаниеОшибки("000002", + НСтр("ru = 'Необходимо указать параметры аутентификации пользователя.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_HTTP401() + + Результат = ОбщееОписаниеОшибки("000003", + НСтр("ru = 'Пользователь не авторизован. + |1. Возможно учетная запись заблокирована. + |2. Указанный логин не зарегистрирован. + |3. Указанный указан неверный пароль при авторизации с подтверждением.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_HTTP404() + + Результат = ОбщееОписаниеОшибки("000005", + НСтр("ru = 'Запрашиваемый ресурс не обнаружен. + |1. Не опубликован запрашиваемый адрес. + |2. Сертификат по ID не найден на сервере. + |3. Не найден документ. + |4. Не найден закрытый ключ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_HTTP405() + + Результат = ОбщееОписаниеОшибки("000006", + НСтр("ru = 'Не совместимый метод HTTP.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_HTTP500() + + Результат = ОбщееОписаниеОшибки("000000", + НСтр("ru = 'Внутренняя ошибка сервера DSS.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ПараметрыЗашифрования() + + Результат = ОбщееОписаниеОшибки("100001", + НСтр("ru = 'Ошибка формирования параметров для зашифрования.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_pin() + + Результат = ОбщееОписаниеОшибки("210009", + НСтр("ru = 'Неверно указан ПИН-код на закрытый ключ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_grant() + + Результат = ОбщееОписаниеОшибки("200005", + НСтр("ru = 'Авторизация на сервере запрещена. + |1. Неправильный пароль. + |2. Требует подтверждения вторым фактором, неправильно выбран способ авторизации. + |3. Учетная запись заблокирована.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_unsupported_grant_type() + + Результат = ОбщееОписаниеОшибки("200006", + НСтр("ru = 'Неподдерживаемый способ авторизации.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_unauthorized_client() + + Результат = ОбщееОписаниеОшибки("200007", + НСтр("ru = 'OAuth-клиент использует незарегистрированный сценарий аутентификации (Flow) + |или был передан некорректный redirect_uri.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_client() + + Результат = ОбщееОписаниеОшибки("200008", + НСтр("ru = 'OAuth-клиент не зарегистрирован или неверно указан clientID.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ОшибкаТокена() + + Результат = ОбщееОписаниеОшибки("200010", + НСтр("ru = 'Ошибка получения токена авторизации. + |1. На сервере не разрешен выбранный способ аутентификации. + |2. В настройках сервера неправильно указан идентификатор СЭП или клиента.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_HTTP403() + + Результат = ОбщееОписаниеОшибки("200011", + НСтр("ru = 'Доступ запрещен. Возможные причины ошибки: + |1. Для операции требуется ""вторичное"" подтверждение. + |2. Недопустимый способ аутентификации. + |3. Неверно указан пароль. + |4. Сертификат авторизации не зарегистрирован на сервере облачной подписи. + |5. В настройках сервера не указан способ ""вторичного"" подтверждения операции.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_request() + + Результат = ОбщееОписаниеОшибки("300001", + НСтр("ru = 'Неверно сформированы параметры запроса + |1. Для операций авторизации, подписи. + |2. Не найден связанный документ для загружаемого файла, передан пустой файл. + |3. Не найден привязываемый документ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_transaction_pending() + + Результат = ОбщееОписаниеОшибки("300003", + НСтр("ru = 'У пользователя уже есть неподтвержденная транзакция.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_certificate() + + Результат = ОбщееОписаниеОшибки("300004", + НСтр("ru = 'Неверный идентификатор сертификата.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_transaction() + + Результат = ОбщееОписаниеОшибки("300005", + НСтр("ru = '1. Срок действия транзакции истек. + |2. Передан неверный идентификатор транзакции.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_transaction_expired() + + Результат = ОбщееОписаниеОшибки("300007", + НСтр("ru = 'Срок действия транзакции истек.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_max_attempts_exceeded() + + Результат = ОбщееОписаниеОшибки("300008", + НСтр("ru = 'Исчерпаны попытки подтвердить транзакцию одноразовым паролем.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_internal_error() + + Результат = ОбщееОписаниеОшибки("300009", + НСтр("ru = 'Внутренняя ошибка сервиса при подтверждении транзакции.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_authentication_failed() + + Результат = ОбщееОписаниеОшибки("300010", + НСтр("ru = 'Ошибка аутентификации, переданы неправильные аутентификационные данные + |или пользователь не может быть аутентифицирован.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_pending_requests_exist() + + Результат = ОбщееОписаниеОшибки("300011", + НСтр("ru = 'У пользователя есть необработанный запрос на сертификат (статус PENDING).'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_signature_params() + + Результат = ОбщееОписаниеОшибки("300012", + НСтр("ru = 'Неверно указаны параметры подписи.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_content_required() + + Результат = ОбщееОписаниеОшибки("300013", + НСтр("ru = 'Не передан документ для подписания.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_enroll() + + Результат = ОбщееОписаниеОшибки("300014", + НСтр("ru = 'Неверно указан идентификатор УЦ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_rev_request() + + Результат = ОбщееОписаниеОшибки("300015", + НСтр("ru = 'Неверно указан идентификатор запроса.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_request_not_found() + + Результат = ОбщееОписаниеОшибки("300016", + НСтр("ru = 'Не найден соответствующий сертификату запрос.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_certificate_format() + + Результат = ОбщееОписаниеОшибки("300017", + НСтр("ru = 'Сертификат имеет неверный формат. + |Например, сертификат передан с заголовками.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_appropriate_enroll_not_found() + + Результат = ОбщееОписаниеОшибки("300018", + НСтр("ru = 'Не найден соответствующий обработчик УЦ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_request_status() + + Результат = ОбщееОписаниеОшибки("300019", + НСтр("ru = 'Соответствующий запрос не находится в состоянии ""Обрабатывается"".'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_duplicate_friendly_name() + + Результат = ОбщееОписаниеОшибки("300020", + НСтр("ru = 'Указанное дружественно имя уже назначено.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_frinendly_name_length() + + Результат = ОбщееОписаниеОшибки("300021", + НСтр("ru = 'Длина дружественного имени больше 255 символов.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_parameters() + + Результат = ОбщееОписаниеОшибки("300022", + НСтр("ru = 'Невалидные параметры запроса.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_certificate_status() + + Результат = ОбщееОписаниеОшибки("300023", + НСтр("ru = 'Повторный отзыв сертификата.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_parameters_required() + + Результат = ОбщееОписаниеОшибки("300024", + НСтр("ru = 'Не заполнено поле Encryption.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_content() + + Результат = ОбщееОписаниеОшибки("300025", + НСтр("ru = 'Неправильный формат документа. + |1. В случае XML шифрования, необходимо передать корректный xml-документ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_recipients() + + Результат = ОбщееОписаниеОшибки("300026", + НСтр("ru = 'Сертификаты получателей не заданы или не соответствует требованиям.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_unsupported_response_type() + + Результат = ОбщееОписаниеОшибки("300027", + НСтр("ru = 'Тип ответа не поддерживается.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_scope() + + Результат = ОбщееОписаниеОшибки("300028", + НСтр("ru = 'Неправильная область использования.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_login_required() + + Результат = ОбщееОписаниеОшибки("300029", + НСтр("ru = 'Требуется аутентификация.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_phone() + + Результат = ОбщееОписаниеОшибки("300031", + НСтр("ru = 'Переданное значение не является номером телефона.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_wrong_operation() + + Результат = ОбщееОписаниеОшибки("300032", + НСтр("ru = 'Неправильный вызов метода, например, номер телефона не добавлен пользователю или добавлен, но уже подтвержден.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_user_not_found() + + Результат = ОбщееОписаниеОшибки("300033", + НСтр("ru = 'Пользователь не найден.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_contact_confirmation_required() + + Результат = ОбщееОписаниеОшибки("300034", + НСтр("ru = 'Номер телефона пользователя не подтвержден.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_authentication_scheme() + + Результат = ОбщееОписаниеОшибки("300035", + НСтр("ru = 'Указан неверный уровень метода аутентификации.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_authn_method_not_confirmed() + + Результат = ОбщееОписаниеОшибки("300036", + НСтр("ru = 'Попытка назначить метод аутентификации без указания подтвержденного номера мобильного телефона.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_document_info_invalid() + + Результат = ОбщееОписаниеОшибки("300037", + НСтр("ru = 'Не заполнена информация о документе'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_operation() + + Результат = ОбщееОписаниеОшибки("300038", + НСтр("ru = 'Неверный вид операции при создании транзакции.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_certificate_id() + + Результат = ОбщееОписаниеОшибки("300039", + НСтр("ru = 'Неправильно указан идентификатор сертификата.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_subject_name() + + Результат = ОбщееОписаниеОшибки("300040", + НСтр("ru = 'Неправильно указано имя запроса на сертификат.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ПроверкаСертификата() + + Результат = ОбщееОписаниеОшибки("300041", + НСтр("ru = 'Ошибка при проверке сертификата.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ПроверкаПодписи() + + Результат = ОбщееОписаниеОшибки("300042", + НСтр("ru = 'Ошибка при проверке подписи.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ПроверкаМаркерДоступа() + + Результат = ОбщееОписаниеОшибки("300043", + НСтр("ru = 'Полученный маркер доступа не соответствует запрошенному логину. + |Потребуется повторная аутентификация, может потребоваться перезапустить программу.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_СертификатБезУчетнойЗаписи() + + Результат = ОбщееОписаниеОшибки("300048", + НСтр("ru = 'Выбранный сертификат является облачным, но в параметрах не указана учетная запись облачной подписи'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ЧужойСертификат() + + Результат = ОбщееОписаниеОшибки("300049", + НСтр("ru = 'Ошибка заполнения сертификата. + |1. Сертификат привязан к другой учетной записи облачной подписи. + |2. Нет подтверждения наличия сертификата на сервере облачной подписи.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ПодсистемаОтключена() + + Результат = ОбщееОписаниеОшибки("300050", + НСтр("ru = 'Отключена подсистема ""Облачная подпись"". + |Для подключения подсистемы обратитесь к администратору.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_НеЗагруженСертификатАвторизации() + + Результат = ОбщееОписаниеОшибки("300051", + НСтр("ru = 'Не найдены данные сертификата авторизации. + |Повторите загрузку данных сертификата в карточке учетной записи.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_error_bad_bounds() + + Результат = ОбщееОписаниеОшибки("300053", + НСтр("ru = 'Некорректно заданы границы выборки записей аудита.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_error_invalid_filter_value() + + Результат = ОбщееОписаниеОшибки("300054", + НСтр("ru = 'Некорректно задан фильтр для выборки записей аудита.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_error_operation_not_supported() + + Результат = ОбщееОписаниеОшибки("300055", + НСтр("ru = 'Операция не поддерживается для указанной колонки при выборке записей аудита.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_object_state() + + Результат = ОбщееОписаниеОшибки("300056", + НСтр("ru = 'Превышена квота для пользователя.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_invalid_object_data() + + Результат = ОбщееОписаниеОшибки("300057", + НСтр("ru = 'Ошибка при конвертации документа. + |1. Ошибка при конвертации документа. + |2. Не найден ожидаемый шаблон.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_forbidden_object_operation() + + Результат = ОбщееОписаниеОшибки("300058", + НСтр("ru = 'Невозможно использовать переданный шаблон, + |так как использование внешних шаблонов запрещено.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ОшибкаКонвертации() + + Результат = ОбщееОписаниеОшибки("300059", + НСтр("ru = 'Ошибка конвертации документа.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_algid_is_not_supported() + + Результат = ОбщееОписаниеОшибки("300060", + НСтр("ru = 'Запрошенный идентификатор алгоритма не поддерживается.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_param_set_is_not_supported() + + Результат = ОбщееОписаниеОшибки("300061", + НСтр("ru = 'Набор параметров кривой не поддерживается.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_provider_not_found() + + Результат = ОбщееОписаниеОшибки("300062", + НСтр("ru = 'Не найден запрошенный криптографический провайдер.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_enroll_is_missing() + + Результат = ОбщееОписаниеОшибки("300063", + НСтр("ru = 'Не найден подходящий модуль УЦ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_cert_not_found() + + Результат = ОбщееОписаниеОшибки("300064", + НСтр("ru = 'Не найден сертификат, связанный с закрытым ключом.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_key_not_found() + + Результат = ОбщееОписаниеОшибки("300065", + НСтр("ru = 'Не найден закрытый ключ.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_param_is_null() + + Результат = ОбщееОписаниеОшибки("300066", + НСтр("ru = 'Пустое имя параметра.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_value_is_null() + + Результат = ОбщееОписаниеОшибки("300067", + НСтр("ru = 'Пустое значение параметра.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_ДействиеЭтапаПодтверждения() + + Результат = ОбщееОписаниеОшибки("300069", + НСтр("ru = 'Выполняемое действие не соответствует этапу цикла подтверждения.'")); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки. +// +// Возвращаемое значение: +// см. ОбщееОписаниеОшибки +// +Функция ОписаниеОшибки_max_request_length_exceeded() + + Результат = ОбщееОписаниеОшибки("300071", + НСтр("ru = 'Попытка подписи документов, превышающих разрешенный размер.'")); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ПоддержкаВнешнегоСоединения + +// Реализует пакетный вызов методов, чтобы получить результат за один вызов фонового задания +// +// Возвращаемое значение: +// см. ОтветСервисаПоУмолчанию +// +Функция ПакетнаяОперацияПользователя(НастройкиПользователя, ПараметрыВыполнения, ВходящиеПараметры) + + Результат = Новый Структура(); + Результат.Вставить("Подтверждение", Ложь); + Результат.Вставить("ДанныеПодтверждения", ""); + + РезультатЗапроса = ОтветСервисаПоУмолчанию(Истина); + РезультатЗапроса.Вставить("Результат", Результат); + + ОтдельныйВыбор = ПолучитьПолеСтруктуры(ВходящиеПараметры, "ОтдельныйВыбор", Ложь); + ПодтверждатьПринудительно = ПолучитьПолеСтруктуры(ВходящиеПараметры, "ПодтверждатьПринудительно", Ложь); + ТипОперации = ПараметрыВыполнения.ТипОперации; + Сертификат = ПараметрыВыполнения.Сертификат; + ДанныеДокумента = ПараметрыВыполнения.ДанныеДокумента; + ПарольПользователя = ПараметрыВыполнения.ПарольПользователя; + ПинКод = ПараметрыВыполнения.ПинКод; + ДатаСеанса = ПараметрыВыполнения.ДатаСеанса; + ТипДокумента = ПараметрыВыполнения.ТипДокумента; + ОписаниеДокумента = ПараметрыВыполнения.ОписаниеДокумента; + ДанныеПодтверждения = ПараметрыВыполнения.ДанныеПодтверждения; + + Если ДанныеПодтверждения = Неопределено Тогда + ДанныеПодтверждения = СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); + КонецЕсли; + + СвойствоТранзакции = Неопределено; + ЕстьТранзакция = Ложь; + ВыполнитьВыбор = Ложь; + МаркерОбновлен = Ложь; + ТекущийСертификат = Новый Структура("ТребуетсяПинКод", Ложь); + + Если ТипЗнч(ПинКод) = Тип("Структура") Тогда + ПроверитьПинКод = ЗначениеЗаполнено(ПинКод.Значение) И (ПинКод.Состояние = 0 ИЛИ ПинКод.Состояние = 1); + Иначе + ПроверитьПинКод = ЗначениеЗаполнено(ПинКод); + КонецЕсли; + + // шаг авторизации + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("Пароль", ПарольПользователя); + ПараметрыОперации.Вставить("ДатаСеанса", ДатаСеанса); + РезультатЗапроса = СервисКриптографииDSS.ПроверитьАутентификацию(НастройкиПользователя, ПараметрыОперации); + + // проверка сертификата + Если РезультатЗапроса.Выполнено + И (ТипОперации = "Подписание" + ИЛИ ТипОперации = "Расшифрование") Тогда + НастройкиПользователя = ПроверитьМаркерОбновления(РезультатЗапроса, НастройкиПользователя, МаркерОбновлен); + + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, Сертификат); + + Если ТекущийСертификат.ДатаОкончания < ДатаСеанса И ТипОперации = "Подписание" Тогда + РезультатЗапроса = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатЗапроса, + "ПроверкаСертификата", + НСтр("ru = 'У выбранного сертификата истек срок действия. + |Выберите другой сертификат.'")); + Иначе + ДанныеСертификата = ПолучитьСодержимоеСертификата(НастройкиПользователя.Ссылка, ТекущийСертификат.Отпечаток); + РезультатЗапроса = СервисКриптографииDSS.ПроверитьСертификат(НастройкиПользователя, ДанныеСертификата) + КонецЕсли; + КонецЕсли; + + // подготовка данных для транзакции + Если РезультатЗапроса.Выполнено Тогда + НастройкиПользователя = ПроверитьМаркерОбновления(РезультатЗапроса, НастройкиПользователя, МаркерОбновлен); + Если ТипОперации = "Подписание" Тогда + КлючДействия = СервисКриптографииDSSКлиентСервер.СвойствоВыполняемойОперации(НастройкиПользователя, "ПодписьДокумента"); + ПодписьCMS = СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS(Истина, Ложь); + СервисКриптографииDSSКлиентСервер.ПолучитьИнформациюДокументаДляПодписи(ПодписьCMS, ОписаниеДокумента, ТипДокумента); + Если ТипЗнч(ДанныеДокумента) = Тип("Массив") Тогда + КлючДействия = СервисКриптографииDSSКлиентСервер.СвойствоВыполняемойОперации(НастройкиПользователя, "ПодписьПакета"); + КонецЕсли; + СвойствоТранзакции = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииПодписания(ПодписьCMS, ТекущийСертификат.Идентификатор); + + ИначеЕсли ТипОперации = "Расшифрование" Тогда + КлючДействия = СервисКриптографииDSSКлиентСервер.СвойствоВыполняемойОперации(НастройкиПользователя, "Расшифрование"); + СвойствоТранзакции = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииРасшифрования("CMS", ТекущийСертификат.Идентификатор, ТипДокумента, ОписаниеДокумента); + + ИначеЕсли ТипОперации = "Подтверждение" Тогда + КлючДействия = Новый Структура("Подтверждать, КодОперации", Истина, 0); + + ИначеЕсли ТипОперации = "Аутентификация" Тогда + КлючДействия = Новый Структура("Подтверждать, КодОперации", Истина, 0); + + Иначе + КлючДействия = Новый Структура("Подтверждать, КодОперации", Ложь, 0); + + КонецЕсли; + КонецЕсли; + + // проверка пин-кода - отправить в получение результата подтверждения. + Если РезультатЗапроса.Выполнено + И ПроверитьПинКод + И ТекущийСертификат.ТребуетсяПинКод Тогда + НастройкиПользователя = ПроверитьМаркерОбновления(РезультатЗапроса, НастройкиПользователя, МаркерОбновлен); + РезультатЗапроса = СервисКриптографииDSS.ВалидацияПинКодаСертификата(НастройкиПользователя, ТекущийСертификат.Идентификатор, ПинКод) + КонецЕсли; + + // создание транзакции + Если РезультатЗапроса.Выполнено + И (КлючДействия.Подтверждать ИЛИ ПодтверждатьПринудительно) Тогда + ЕстьТранзакция = Истина; + НастройкиПользователя = ПроверитьМаркерОбновления(РезультатЗапроса, НастройкиПользователя, МаркерОбновлен); + Если ТипОперации = "Подтверждение" ИЛИ ТипОперации = "Аутентификация" Тогда + РезультатЗапроса.Вставить("Результат", ""); + Иначе + РезультатЗапроса = СервисКриптографииDSS.СоздатьТранзакцию(НастройкиПользователя, СвойствоТранзакции, КлючДействия.КодОперации, ДанныеДокумента, ВходящиеПараметры); + Если РезультатЗапроса.Выполнено Тогда + ДанныеПодтверждения.ПараметрыВариантаВстроенного.Вставить("ТипРезультата", РезультатЗапроса.ТипРезультата); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + // начало процесса подтверждения + Если ЕстьТранзакция + И РезультатЗапроса.Выполнено Тогда + НастройкиПользователя = ПроверитьМаркерОбновления(РезультатЗапроса, НастройкиПользователя, МаркерОбновлен); + + ИдентификаторТранзакции = РезультатЗапроса.Результат; + ДанныеПодтверждения.Идентификатор = ИдентификаторТранзакции; + ДанныеПодтверждения.ИдентификаторТранзакции = ИдентификаторТранзакции; + ДанныеПодтверждения.ЭтапЦикла = "Начало"; + + РезультатЗапроса = ОтправитьЗапросОбъектаПодтверждения(НастройкиПользователя, ДанныеПодтверждения, ДатаСеанса, ВходящиеПараметры); + + Результат.Подтверждение = Истина; + Результат.ДанныеПодтверждения = ДанныеПодтверждения; + + Если РезультатЗапроса.Выполнено Тогда + Результат.ДанныеПодтверждения = ДанныеПодтверждения; + + Если ДанныеПодтверждения.ЭтапЦикла = "Выбор" + И ЗначениеЗаполнено(ДанныеПодтверждения.ВторичнаяАвторизация) + И НЕ ОтдельныйВыбор Тогда + ВыполнитьВыбор = Истина; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Если ВыполнитьВыбор Тогда + РезультатЗапроса = ОтправитьЗапросОбъектаПодтверждения(НастройкиПользователя, ДанныеПодтверждения, ДатаСеанса, ВходящиеПараметры); + + Если РезультатЗапроса.Выполнено Тогда + Результат.ДанныеПодтверждения = ДанныеПодтверждения; + КонецЕсли; + + КонецЕсли; + + РезультатЗапроса.Вставить("Результат", Результат); + + НастройкиПользователя = ПроверитьМаркерОбновления(РезультатЗапроса, НастройкиПользователя, МаркерОбновлен); + + Если МаркерОбновлен ИЛИ ТипОперации = "Аутентификация" Тогда + РезультатЗапроса.МаркерОбновлен = Истина; + РезультатЗапроса.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + + ПротоколОшибкиПриВызове(РезультатЗапроса, "ПодготовитьТранзакцию", ПараметрыВыполнения); + + Возврат РезультатЗапроса; + +КонецФункции + +// Служебная реализация СервисКриптографииDSS.ПолучитьПолитикуНастроек +// +// Возвращаемое значение: +// см. ОтветСервисаПоУмолчанию +// +Функция ПолучитьПолитикуНастроек(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + ДатаСеанса = ДатаСеанса(); + ДатаСеанса = ПолучитьПолеСтруктуры(ПараметрыОперации, "ДатаСеанса", ДатаСеанса); + Авторизована = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса); + Результат = ОтветСервисаПоУмолчанию(Авторизована); + + Если Авторизована Тогда + + ОписаниеПолитики = Новый Структура(); + ОписаниеПолитики.Вставить("УЦ", НастройкиПользователя.Политика.УЦ); + ОписаниеПолитики.Вставить("Криптопровайдеры", НастройкиПользователя.Политика.Криптопровайдеры); + ОписаниеПолитики.Вставить("Логин", НастройкиПользователя.Логин); + ОписаниеПолитики.Вставить("Телефон", НастройкиПользователя.Телефон); + ОписаниеПолитики.Вставить("ЭлектроннаяПочта", НастройкиПользователя.ЭлектроннаяПочта); + ОписаниеПолитики.Вставить("ПервичнаяАутентификация", КонвертацияТипАвторизации(НастройкиПользователя.ПервичнаяАутентификация)); + ОписаниеПолитики.Вставить("Сертификаты", Новый Массив); + ОписаниеПолитики.Вставить("Действия", Новый Структура); + + Для Каждого СтрокаДействия Из НастройкиПользователя.Политика.Действия Цикл + ОписаниеПолитики.Действия.Вставить(СтрокаДействия.Ключ, СтрокаДействия.Значение.Подтверждать); + КонецЦикла; + + Для Каждого СтрокаСертификата Из НастройкиПользователя.Сертификаты Цикл + НоваяСтрока = Новый Структура(); + НоваяСтрока.Вставить("Отпечаток", СтрокаСертификата.Ключ); + НоваяСтрока.Вставить("НуженПинКод", СтрокаСертификата.Значение.ТребуетсяПинКод); + ОписаниеПолитики.Сертификаты.Добавить(НоваяСтрока); + КонецЦикла; + + Результат.Вставить("Результат", ОписаниеПолитики); + + Иначе + + ПолучитьОписаниеОшибки(Результат, "Пользователь"); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная реализация СервисКриптографииDSS.ПодготовитьТранзакцию +// +// Возвращаемое значение: +// см. ОтветСервисаПоУмолчанию +// +Функция ПодготовитьТранзакциюПодтверждения(НастройкиПользователя, ТипОперации, ПараметрыОперации = Неопределено) Экспорт + + ДанныеПодтверждения = СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); + + ПодтверждатьПринудительно = ПолучитьПолеСтруктуры(ПараметрыОперации, "ПодтверждатьПринудительно", Ложь); + ОтдельныйВыбор = ПолучитьПолеСтруктуры(ПараметрыОперации, "ОтдельныйВыбор", Ложь); + ДанныеДокумента = ПолучитьПолеСтруктуры(ПараметрыОперации, "ДанныеДокумента", Новый Массив); + ДатаСеанса = ПолучитьПолеСтруктуры(ПараметрыОперации, "ДатаСеанса", ДатаСеанса()); + ИсточникНастроек = ПолучитьИсточникНастроек(ПараметрыОперации); + ПинКод = ПолучитьПолеСтруктуры(ПараметрыОперации, "ПинКод"); + Отпечаток = ПолучитьПолеСтруктуры(ПараметрыОперации, "Отпечаток"); + + ДанныеПодтверждения.ТипПодтверждения = "Транзакция"; + ДанныеПодтверждения.ДанныеДокументов = ДанныеДокумента; + Если ДанныеПодтверждения.ДоступныеМетоды.Найти(НастройкиПользователя.ВторичнаяАвторизация) <> Неопределено Тогда + ДанныеПодтверждения.ВторичнаяАвторизация = НастройкиПользователя.ВторичнаяАвторизация; + ИначеЕсли ДанныеПодтверждения.ДоступныеМетоды.Количество() = 1 Тогда + ДанныеПодтверждения.ВторичнаяАвторизация = НастройкиПользователя.ВторичнаяАвторизация; + КонецЕсли; + + Если ДанныеДокумента.Количество() = 1 ИЛИ ТипОперации = "Расшифровка" Тогда + ТипДокумента = ДанныеДокумента[0].ТипДокумента; + ОписаниеДокумента = ДанныеДокумента[0].ИмяДокумента; + СодержимоеДокумента = ДанныеДокумента[0].Содержание; + Иначе + ТипДокумента = ""; + ОписаниеДокумента = ""; + СодержимоеДокумента = ДанныеДокумента; + КонецЕсли; + + Если ЗначениеЗаполнено(Отпечаток) Тогда + Сертификат = Новый Структура("Отпечаток", Отпечаток); + Иначе + Сертификат = Неопределено; + КонецЕсли; + + Если ТипОперации = "Аутентификация" Тогда + ДанныеПодтверждения.ТипПодтверждения = "Аутентификация"; + + ИначеЕсли ТипОперации = "Расшифровка" И Сертификат = Неопределено Тогда + СтруктураДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(СодержимоеДокумента, Истина); + ВсеСертификаты = СервисКриптографииDSSASNКлиентСервер.ПолучитьСертификатыШифрования(СтруктураДокумента.Документ); + Для Каждого СтрокаМассива Из ВсеСертификаты Цикл + НашлиСертификат = СервисКриптографииDSS.НайтиСертификат(СтрокаМассива); + Если НашлиСертификат.Выполнено Тогда + Сертификат = НашлиСертификат; + Прервать; + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипОперации = "Подпись" И Сертификат = Неопределено Тогда + Сертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, "Любой"); + + КонецЕсли; + + ПараметрыВыполнения = Новый Структура(); + ПараметрыВыполнения.Вставить("ТипОперации", ТипОперации); + ПараметрыВыполнения.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ПараметрыВыполнения.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыВыполнения.Вставить("ПарольПользователя", ПолучитьПолеСтруктуры(ПараметрыОперации, "Пароль")); + ПараметрыВыполнения.Вставить("ПинКод", ПинКод); + ПараметрыВыполнения.Вставить("ДатаСеанса", ПолучитьПолеСтруктуры(ПараметрыОперации, "ДатаСеанса", ДатаСеанса)); + ПараметрыВыполнения.Вставить("ТипДокумента", ТипДокумента); + ПараметрыВыполнения.Вставить("ОписаниеДокумента", ОписаниеДокумента); + ПараметрыВыполнения.Вставить("Сертификат", Сертификат); + + ВходящиеПараметры = Новый Структура; + ВходящиеПараметры.Вставить("ОтдельныйВыбор", ОтдельныйВыбор); + ВходящиеПараметры.Вставить("ДатаСеанса", ДатаСеанса); + ВходящиеПараметры.Вставить("ИсточникНастроек", ИсточникНастроек); + ВходящиеПараметры.Вставить("ПодтверждатьПринудительно", ПодтверждатьПринудительно); + + РезультатЗапроса = ПакетнаяОперацияПользователя(НастройкиПользователя, ПараметрыВыполнения, ВходящиеПараметры); + Если РезультатЗапроса.МаркерОбновлен Тогда + НастройкиПользователя = РезультатЗапроса.НастройкиПользователя; + УстановитьНастройкиПользователя(НастройкиПользователя.Ссылка, НастройкиПользователя, ИсточникНастроек); + КонецЕсли; + + ЭтапЦикла = ""; + Если РезультатЗапроса.Выполнено Тогда + ЭтапЦикла = ДанныеПодтверждения.ЭтапЦикла; + КонецЕсли; + + Если ЭтапЦикла = "Начало" + И (ТипОперации = "Расшифровка" ИЛИ ТипОперации = "Подпись") Тогда + РезультатЗапроса.Выполнено = Ложь; + ПолучитьОписаниеОшибки(РезультатЗапроса, "ДействиеЭтапаПодтверждения"); + КонецЕсли; + + Если РезультатЗапроса.Выполнено Тогда + ДанныеПодтверждения.Вставить("ТипОперации", ТипОперации); + ДанныеПодтверждения.Вставить("ИдентификаторПользователя", НастройкиПользователя.Ссылка); + ЗаписатьОбъектПодтверждения(НастройкиПользователя, ДанныеПодтверждения); + Иначе + ДанныеПодтверждения.ЭтапЦикла = "Ошибка"; + ДанныеПодтверждения.Ошибка = РезультатЗапроса.Ошибка; + ДанныеПодтверждения.КодОшибки = РезультатЗапроса.КодОшибки; + КонецЕсли; + + Результат = ПодготовитьДанныеПодтверждения(ДанныеПодтверждения); + + Возврат Результат; + +КонецФункции + +// Служебная реализация СервисКриптографииDSS.ПолучитьСтатусПодтверждения +// +// Возвращаемое значение: +// Структура - СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию() +// +Функция ПолучитьСтатусПодтверждения(НастройкиПользователя, ИдентификаторТранзакции = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ДанныеПодтверждения = ПрочитатьОбъектПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ПараметрыОперации); + + Если ДанныеПодтверждения.ЭтапЦикла = "Ожидание" Тогда + ОтправитьЗапросОбъектаПодтверждения(НастройкиПользователя, ДанныеПодтверждения); + ЗаписатьОбъектПодтверждения(НастройкиПользователя, ДанныеПодтверждения); + КонецЕсли; + + Результат = ПодготовитьДанныеПодтверждения(ДанныеПодтверждения); + + Возврат Результат; + +КонецФункции + +// Служебная реализация СервисКриптографииDSS.ИзменитьСтатусПодтверждения +// +// Возвращаемое значение: +// Структура - СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию() +// +Функция ИзменитьСтатусПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ТипОперации, НовоеЗначение, ПараметрыОперации = Неопределено) Экспорт + + ДанныеПодтверждения = ПрочитатьОбъектПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ПараметрыОперации); + ОтправитьЗапрос = Ложь; + + Если ТипОперации = "ВыборСпособа" И ДанныеПодтверждения.ЭтапЦикла = "Выбор" Тогда + ДанныеПодтверждения.ВторичнаяАвторизация = КонвертацияТипАвторизации(НовоеЗначение); + ОтправитьЗапрос = Истина; + + ИначеЕсли ТипОперации = "ВременныйКод" + И (ДанныеПодтверждения.ЭтапЦикла = "ВводКода" ИЛИ ДанныеПодтверждения.ЭтапЦикла = "Предупреждение") Тогда + ОтправитьЗапрос = Истина; + + ИначеЕсли НЕ ДанныеПодтверждения.ЭтапЦикла = "Ошибка" Тогда + ДанныеПодтверждения.ЭтапЦикла = "Ошибка"; + ПолучитьОписаниеОшибки(ДанныеПодтверждения, "ДействиеЭтапаПодтверждения"); + + КонецЕсли; + + Если ОтправитьЗапрос Тогда + ОтправитьЗапросОбъектаПодтверждения(НастройкиПользователя, ДанныеПодтверждения); + КонецЕсли; + + ЗаписатьОбъектПодтверждения(НастройкиПользователя, ДанныеПодтверждения); + + Возврат ДанныеПодтверждения; + +КонецФункции + +// Служебная реализация СервисКриптографииDSS.ПолучитьРезультатПодтверждения +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторТранзакции - Строка +// ПараметрыОперации - Структура +// +// Возвращаемое значение: +// см. ОтветСервисаПоУмолчанию +// +Функция ПолучитьРезультатПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ПараметрыОперации = Неопределено) Экспорт + + ДанныеПодтверждения = ПрочитатьОбъектПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ПараметрыОперации); + ИсточникНастроек = ПолучитьИсточникНастроек(ПараметрыОперации); + РезультатЗапроса = ОтветСервисаПоУмолчанию(Ложь); + + Если ДанныеПодтверждения.ЭтапЦикла = "Окончание" И ДанныеПодтверждения.ТипПодтверждения = "Транзакция" Тогда + + ДанныеДокументов = ДанныеПодтверждения.ДанныеДокументов; + ТипРезультата = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ТипРезультата; + ЭтоПакет = ДанныеДокументов.Количество() > 0; + ПинКод = ПолучитьПолеСтруктуры(ДанныеПодтверждения, "ПинКод", ""); + + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("Транзакция", Истина); + ПараметрыОперации.Вставить("ИсточникНастроек", ИсточникНастроек); + ПараметрыОперации.Вставить("ТипРезультата", ТипРезультата); + + Если ДанныеПодтверждения.ТипОперации = "Подписание" И ЭтоПакет Тогда + РезультатЗапроса = СервисКриптографииDSS.ПодписатьПакет( + НастройкиПользователя, + Неопределено, + Неопределено, + Неопределено, + ПинКод, + ПараметрыОперации); + + ИначеЕсли ДанныеПодтверждения.ТипОперации = "Подписание" Тогда + РезультатЗапроса = СервисКриптографииDSS.Подписать( + НастройкиПользователя, + Неопределено, + Неопределено, + Неопределено, + ПинКод, + Ложь, + ПараметрыОперации); + + ИначеЕсли ДанныеПодтверждения.ТипОперации = "Расшифровка" Тогда + РезультатЗапроса = СервисКриптографииDSS.Расшифровать( + НастройкиПользователя, + Неопределено, + Неопределено, + Неопределено, + ПинКод, + ПараметрыОперации); + + Иначе + ПолучитьОписаниеОшибки(РезультатЗапроса, "ОписаниеОшибки_invalid_transaction"); + + КонецЕсли; + + Если РезультатЗапроса.Выполнено Тогда + + МассивДокументов = Новый Массив; + Если ТипЗнч(РезультатЗапроса.Результат) = Тип("Массив") Тогда + Для Счетчик = 0 По РезультатЗапроса.Результат.Количество() - 1 Цикл + НоваяСтрока = Новый Структура; + НоваяСтрока.Вставить("Ссылка", ДанныеДокументов[Счетчик].Ссылка); + НоваяСтрока.Вставить("Содержание", РезультатЗапроса.Результат[Счетчик]); + МассивДокументов.Добавить(НоваяСтрока); + КонецЦикла; + + Иначе + НоваяСтрока = Новый Структура; + НоваяСтрока.Вставить("Ссылка", ДанныеДокументов[0].Ссылка); + НоваяСтрока.Вставить("Содержание", РезультатЗапроса.Результат); + МассивДокументов.Добавить(НоваяСтрока); + + КонецЕсли; + + РезультатЗапроса.Вставить("Результат", МассивДокументов); + + КонецЕсли; + + КонецЕсли; + + Возврат РезультатЗапроса; + +КонецФункции + +// Служебная реализация СервисКриптографииDSS.СохранитьЗакрытыеДанныеПользователя +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИмяПараметра - Строка +// ЗначениеПараметра - Произвольный +// ПараметрыОперации - Неопределено +// - Структура +// +// Возвращаемое значение: +// Структура - ОтветСервисаПоУмолчанию +// +Функция СохранитьЗакрытыеДанныеПользователя(НастройкиПользователя, ИмяПараметра, ЗначениеПараметра, ПараметрыОперации = Неопределено) Экспорт + + Успешно = Ложь; + ИдентификаторПользователя = НастройкиПользователя.УникальныйИдентификатор; + + Если НРег(ИмяПараметра) = НРег("ПинКод") Тогда + НовоеЗначение = ?(ЗначениеЗаполнено(ЗначениеПараметра), ЗначениеПараметра, Неопределено); + НовоеЗначение = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля(НовоеЗначение, Пользователи.АвторизованныйПользователь()); + Отпечаток = ПолучитьПолеСтруктуры(ПараметрыОперации, "Отпечаток", ""); + Если ЗначениеЗаполнено(Отпечаток) Тогда + СохранитьПинКодСертификата( + ИдентификаторПользователя, + Отпечаток, + НовоеЗначение); + НашлиСертификат = НастройкиПользователя.Сертификаты[НРег(Отпечаток)]; + Если НашлиСертификат <> Неопределено Тогда + НашлиСертификат.ПинКод = НовоеЗначение; + КонецЕсли; + КонецЕсли; + ИначеЕсли НРег(ИмяПараметра) = НРег("Пароль") Тогда + НовоеЗначение = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля(ЗначениеПараметра, Пользователи.АвторизованныйПользователь()); + СохранитьЗакрытыеДанные(ИдентификаторПользователя, НовоеЗначение, ИмяПараметра); + НастройкиПользователя.Пароль = НовоеЗначение; + Успешно = Истина; + ИначеЕсли НРег(ИмяПараметра) = НРег("ПарольСертификата") Тогда + НовоеЗначение = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля(ЗначениеПараметра, Пользователи.АвторизованныйПользователь()); + СохранитьЗакрытыеДанные(ИдентификаторПользователя, НовоеЗначение, ИмяПараметра); + НастройкиПользователя.ПарольСертификата = НовоеЗначение; + Успешно = Истина; + КонецЕсли; + + Результат = ОтветСервисаПоУмолчанию(Успешно); + + Если Успешно Тогда + Результат.МаркерОбновлен = Истина; + Результат.Вставить("НастройкиПользователя", НастройкиПользователя); + УстановитьНастройкиПользователя(НастройкиПользователя.Ссылка, НастройкиПользователя, ПараметрыОперации); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Технологическая процедура отправки запроса на сервер +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеПодтверждения - Структура +// ДатаСеанса - Дата +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию +// +Функция ОтправитьЗапросОбъектаПодтверждения(НастройкиПользователя, ДанныеПодтверждения, ДатаСеанса = Неопределено, ПараметрыОперации = Неопределено) + + АдресПодключения = НастройкиПользователя.Методы.ДвухфакторнаяАвторизация; + ПараметрыЗапроса = СервисКриптографииDSSКлиентСервер.ПодготовитьПараметрыОтправкиЗапроса(НастройкиПользователя, ДанныеПодтверждения); + Если НЕ ЗначениеЗаполнено(ДатаСеанса) Тогда + ДатаСеанса = ДатаСеанса(); + КонецЕсли; + + Если ДанныеПодтверждения.ТипПодтверждения = "Аутентификация" Тогда + РезультатЗапроса = СервисКриптографииDSS.ВыполнитьЗапросКСервису( + НастройкиПользователя, + АдресПодключения, + ПараметрыЗапроса, + "POST", + "json"); + + Иначе + РезультатЗапроса = СервисКриптографииDSS.ПодключитьВыполнитьМетодСервиса( + НастройкиПользователя, + АдресПодключения, + ПараметрыЗапроса, + "POST", + "json"); + КонецЕсли; + + Если РезультатЗапроса.Выполнено Тогда + СервисКриптографииDSSКлиентСервер.РазобратьРезультатЗапроса( + РезультатЗапроса, + НастройкиПользователя, + ДанныеПодтверждения, + ДатаСеанса); + Иначе + ДанныеПодтверждения.ЭтапЦикла = "Ошибка"; + ДанныеПодтверждения.Ошибка = РезультатЗапроса.Ошибка; + ДанныеПодтверждения.КодОшибки = РезультатЗапроса.КодОшибки; + КонецЕсли; + + Возврат РезультатЗапроса; + +КонецФункции + +// Технологическая процедура для записи объекта подтверждения. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ДанныеПодтверждения - Структура +// +Процедура ЗаписатьОбъектПодтверждения(НастройкиПользователя, ДанныеПодтверждения) + + КлючПоиска = КлючПоискаДанных(НастройкиПользователя); + ЗаписатьДанныеБезопасногоХранилища(КлючПоиска, ДанныеПодтверждения); + +КонецПроцедуры + +// Технологическая функция для получения объекта подтверждения. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ИдентификаторТранзакции - Неопределено, Строка - контролирует соответствие ожидаемой операции +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать параметры в зависимости от типа операции. +// +// Возвращаемое значение: +// Структура +// +Функция ПрочитатьОбъектПодтверждения(НастройкиПользователя, ИдентификаторТранзакции, ПараметрыОперации = Неопределено) + + КлючПоиска = КлючПоискаДанных(НастройкиПользователя); + Результат = ПрочитатьДанныеБезопасногоХранилища(КлючПоиска); + + Если Результат = Неопределено Тогда + Результат = СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); + Результат.ЭтапЦикла = "Ошибка"; + ПолучитьОписаниеОшибки(Результат, "invalid_transaction"); + ИначеЕсли (Результат.ИдентификаторТранзакции <> ИдентификаторТранзакции + И ИдентификаторТранзакции <> Неопределено) Тогда + Результат.ЭтапЦикла = "Ошибка"; + ПолучитьОписаниеОшибки(Результат, "invalid_transaction"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Готовить данные подтверждения операции +// +// Параметры: +// СтруктураДанных - Структура, Неопределено - объект подтверждения операции +// +// Возвращаемое значение: +// Структура: +// * ЭтапЦикла - Строка +// * СрокДействия - Дата +// * ГрафическийКод - Строка +// * Заголовок - Строка +// * Ошибка - Строка +// * КодОшибки - Строка +// * ОписаниеПодтверждения - Строка +// * ИдентификаторТранзакции - Строка +// * ТипОперации - Строка +// * Сертификат - Структура +// * ВторичнаяАвторизация - см. КонвертацияТипАвторизации +// * ДоступныеМетоды - Массив из см. КонвертацияТипАвторизации +// +Функция ПодготовитьДанныеПодтверждения(СтруктураДанных) + + Результат = Новый Структура(); + Результат.Вставить("ЭтапЦикла", "Начало"); + Результат.Вставить("СрокДействия", Неопределено); + Результат.Вставить("ГрафическийКод", Неопределено); + Результат.Вставить("Заголовок", ""); + Результат.Вставить("Ошибка", ""); + Результат.Вставить("КодОшибки", ""); + Результат.Вставить("ОписаниеПодтверждения", ""); + Результат.Вставить("ИдентификаторТранзакции", ""); + Результат.Вставить("Сертификат", Неопределено); + Результат.Вставить("ВторичнаяАвторизация", 0); + Результат.Вставить("ДоступныеМетоды", Новый Массив); + + Если СтруктураДанных <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Результат, СтруктураДанных); + + Результат.Вставить("ВторичнаяАвторизация", КонвертацияТипАвторизации(СтруктураДанных.ВторичнаяАвторизация)); + Результат.Вставить("ДоступныеМетоды", Новый Массив); + + Для Каждого СтрокаМассива Из СтруктураДанных.ДоступныеМетоды Цикл + Результат.ДоступныеМетоды.Добавить(КонвертацияТипАвторизации(СтрокаМассива)); + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует строковый идентификатор для поиска данных подтверждения +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +// Возвращаемое значение: +// Строка +// +Функция КлючПоискаДанных(НастройкиПользователя) + + ТекущийПользователь = НастройкиПользователя.АвторизованныйПользователь; + КлючЗначения = "ЭлектроннаяПодписьDSS." + ТекущийПользователь + "." + НастройкиПользователя.УникальныйИдентификатор + ".Подтверждение"; + + Возврат КлючЗначения; + +КонецФункции + +// Преобразуется значение перечисления в числовое константное представление. +// +// Параметры: +// СпособАвторизации - Число +// - ПеречислениеСсылка.СпособыАвторизацииDSS +// +// Возвращаемое значение: +// - Число +// - ПеречислениеСсылка.СпособыАвторизацииDSS +// +Функция КонвертацияТипАвторизации(СпособАвторизации) + + ОтборСпособов = Новый Соответствие(); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Первичный_УчетныеДанные, 1); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации, 2); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Первичный_ДвухФакторная, 3); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Первичный_КодАвторизации, 4); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение, 5); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение, 6); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Вторичный_СМС, 7); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта, 8); + ОтборСпособов.Вставить(Перечисления.СпособыАвторизацииDSS.Вторичный_AirKeyLite, 9); + + Если ТипЗнч(СпособАвторизации) = Тип("Число") Тогда + Результат = Перечисления.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение; + Для Каждого СтрокаОтбора Из ОтборСпособов Цикл + Если СтрокаОтбора.Значение = СпособАвторизации Тогда + Результат = СтрокаОтбора.Ключ; + Прервать; + КонецЕсли; + КонецЦикла; + + Иначе + Результат = ОтборСпособов[СпособАвторизации]; + Если Результат = Неопределено Тогда + Результат = 0; + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции. + +#Область ВспомогательныеПроцедурыФункции + +// Служебная функция для преобразования строки по формату Base64URL +// +// Параметры: +// ЗначениеСтроки - Строка +// +// Возвращаемое значение: +// Строка - преобразованное значение строки и закодированное в Base64URL +// +Функция Base64URL(ЗначениеСтроки) + + НовоеЗначение = ПолучитьДвоичныеДанныеИзСтроки(ЗначениеСтроки); + НовоеЗначение = ПолучитьBase64СтрокуИзДвоичныхДанных(НовоеЗначение); + НовоеЗначение = НормализоватьСтрокуПараметров(НовоеЗначение); + НовоеЗначение = СтрЗаменить(НовоеЗначение, "+", "-"); + НовоеЗначение = СтрЗаменить(НовоеЗначение, "/", "_"); + Результат = НовоеЗначение; + + Возврат Результат; + +КонецФункции + +// Служебная функция для контроля наличия входящих параметров и обязательность наличия поля "ПараметрыОперации", +// используется во всех асинхронных вызовах. "ПараметрыОперации" - служит для передачи дополнительных значений, +// а также для будущего расширения функциональности. +// +// Параметры: +// ИменаПараметров - Строка - строка с именами параметров, разделенных запятой +// ТекущиеЗначения - Структура - значение полей поступившие на вход +// +// Возвращаемое значение: +// Структура - структура со списком обязательных полей +// +Функция ПодготовитьПеременныеВызова(ИменаПараметров, ТекущиеЗначения) + + Результат = Новый Структура(ИменаПараметров); + Результат.Вставить("ПараметрыОперации", Новый Структура); + Результат.Вставить("ТрансформироватьРезультат", Неопределено); + + ЗаполнитьЗначенияСвойств(Результат, ТекущиеЗначения); + + ТрансформироватьРезультат = ПолучитьПолеСтруктуры(Результат.ПараметрыОперации, "ТрансформироватьРезультат"); + Если ТрансформироватьРезультат <> Неопределено Тогда + Результат.ТрансформироватьРезультат = ТрансформироватьРезультат; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для поиска и получения значения в разнородной среде Структура, Соответствие, Массив (по индексу). +// +// Параметры: +// ДанныеСтруктуры - Структура +// - Соответствие +// - Массив - допускает сочетание предыдущих параметров. +// ПутьКДанным - Строка - полный путь в дереве. +// ЗначениеПоУмолчанию - Произвольный - возвращает значение, если не найдено в дереве +// +// Возвращаемое значение: +// Произвольный - значение полученное по указанному пути +// +// Пример: +// ВторичныйМетод = ПолучитьПолеСтруктуры(ДанныеОтвета, "Challenge.TextChallenge[0].AuthnMethod", ""); +// +Функция ПолучитьПолеСтруктуры(ДанныеСтруктуры, Знач ПутьДанных, ЗначениеПоУмолчанию = Неопределено, УчитыватьРегистр = Ложь) + + Возврат СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДанныеСтруктуры, ПутьДанных, ЗначениеПоУмолчанию, УчитыватьРегистр); + +КонецФункции + +// Вспомогательная процедура проверки статуса обновления маркера авторизации после запросе к сервису +// +// Параметры: +// РезультатВызова - см. ОтветСервисаПоУмолчанию +// НастройкиПользователя - см. НастройкиРаботыДанныеПользователя +// МаркерОбновлен - Булево - возвращает статуса обновленного маркера +// +Функция ПроверитьМаркерОбновления(РезультатВызова, НастройкиПользователя, МаркерОбновлен) + + Если РезультатВызова.МаркерОбновлен Тогда + НастройкиПользователя = РезультатВызова.НастройкиПользователя; + КонецЕсли; + + МаркерОбновлен = МаркерОбновлен ИЛИ РезультатВызова.МаркерОбновлен; + + Возврат НастройкиПользователя; + +КонецФункции + +// Вычисляет идентификатор сертификата на основе данных издателя. +// +// Параметры: +// СвойстваСертификата - Структура - структура которая соответствует объекту "СертификатКриптографии", см. ПолучитьОбъектСертификата() +// +// Возвращаемое значение: +// Строка - вычисленный уникальный идентификатор сертификата +// +Функция ВычислитьИдентификаторСертификата(СвойстваСертификата) Экспорт + + СерийныйНомерСтрока = НРег(СтрЗаменить(СвойстваСертификата.СерийныйНомер, " ", "")); + + КлючиПоиска = Новый Соответствие; + КлючиПоиска.Вставить("CN", "2.5.4.3"); + КлючиПоиска.Вставить("SN", "2.5.4.4"); + КлючиПоиска.Вставить("C", "2.5.4.6"); + КлючиПоиска.Вставить("L", "2.5.4.7"); + КлючиПоиска.Вставить("S", "2.5.4.8"); + КлючиПоиска.Вставить("O", "2.5.4.10"); + КлючиПоиска.Вставить("OU", "2.5.4.11"); + КлючиПоиска.Вставить("T", "2.5.4.12"); + КлючиПоиска.Вставить("G", "2.5.4.42"); + КлючиПоиска.Вставить("E", "1.2.840.113549.1.9.1"); + КлючиПоиска.Вставить("2.5.4.3", "2.5.4.3"); + КлючиПоиска.Вставить("2.5.4.4", "2.5.4.4"); + КлючиПоиска.Вставить("2.5.4.6", "2.5.4.6"); + КлючиПоиска.Вставить("2.5.4.7", "2.5.4.7"); + КлючиПоиска.Вставить("2.5.4.8", "2.5.4.8"); + КлючиПоиска.Вставить("2.5.4.10", "2.5.4.10"); + КлючиПоиска.Вставить("2.5.4.11", "2.5.4.11"); + КлючиПоиска.Вставить("2.5.4.12", "2.5.4.12"); + КлючиПоиска.Вставить("2.5.4.42", "2.5.4.42"); + КлючиПоиска.Вставить("1.2.840.113549.1.9.1", "1.2.840.113549.1.9.1"); + + КлючевыеСвойства = Новый СписокЗначений; + МассивКлючей = Новый Массив; + Для каждого СтрокаКлюча Из СвойстваСертификата.Издатель Цикл + ИмяКлюча = СтрЗаменить(СтрокаКлюча.Ключ, "OID", ""); + ИмяКлюча = СтрЗаменить(ИмяКлюча, "_", "."); + ПредставлениеКлюча = КлючиПоиска[ИмяКлюча]; + Если ПредставлениеКлюча <> Неопределено + И МассивКлючей.Найти(ПредставлениеКлюча) = Неопределено Тогда + МассивКлючей.Добавить(ПредставлениеКлюча); + КлючевыеСвойства.Добавить(СтрокаКлюча.Значение, ПредставлениеКлюча); + КонецЕсли; + КонецЦикла; + + КлючевыеСвойства.СортироватьПоПредставлению(НаправлениеСортировки.Возр); + + МассивЗначений = КлючевыеСвойства.ВыгрузитьЗначения(); + МассивЗначений.Добавить(СерийныйНомерСтрока); + ИздательИСерийныйНомер = СтрСоединить(МассивЗначений, "#"); + + Хеширование = Новый ХешированиеДанных(ХешФункция.SHA1); + Хеширование.Добавить(ИздательИСерийныйНомер); + + Возврат НРег(СтрЗаменить(Хеширование.ХешСумма, " ", "")); + +КонецФункции + +// Функция участвующая в разборе файла XML с описанием сертификата получает значение поля. +// +// Параметры: +// ЭлементДокумента - ЭлементDOM +// +// Возвращаемое значение: +// Строка - строковое значение узла +// +Функция ПолучитьЗначениеПоляОписания(ЭлементДокумента) + + Результат = ""; + + Для каждого СтрокаЭлемента Из ЭлементДокумента.ДочерниеУзлы Цикл + Если СтрокаЭлемента.ТипУзла = ТипУзлаDOM.Текст Тогда + Результат = СокрЛП(СтрокаЭлемента.Данные); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Функция участвующая в разборе файла XML с описанием сертификата +// ищет поле по имени и получает значение найденного узла. +// +// Параметры: +// ЭлементДокумента - ЭлементDOM +// ИмяЭлемента - Строка - имя узла для поиска +// +// Возвращаемое значение: +// Строка - строковое значение узла +// +Функция ПолучитьЗначениеПоИмениЭлемента(ЭлементДокумента, ИмяЭлемента) + + Результат = ""; + ВсеЭлементы = ЭлементДокумента.ПолучитьЭлементыПоИмени(ИмяЭлемента); + + Для каждого СтрокаЭлемента Из ВсеЭлементы Цикл + Результат = ПолучитьЗначениеПоляОписания(СтрокаЭлемента); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Функция участвующая в разборе файла XML с описанием сертификата +// преобразует значение в нужный тип (в безопасном режим), без выдачи ошибок. +// +// Параметры: +// ТекущиеДанные - Строка +// ИмяЭлемента - Тип - тип к которому нужно преобразовать +// +// Возвращаемое значение: +// Произвольный - преобразованное к типу значение +// +Функция ПривестиКТипу(ТекущиеДанные, ТипДанных) + + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипДанных); + ЭталонныйТип = Новый ОписаниеТипов(МассивТипов); + Возврат ЭталонныйТип.ПривестиЗначение(ТекущиеДанные); + +КонецФункции + +// Функция участвующая в разборе файла XML с описанием сертификата +// ищет поле по имени и получает значение найденного узла. +// +// Параметры: +// ДокументОписания - ДокументDOM +// ПутьПоиска - Строка - выражение XPath для поиска узла, если в выражении используется символ "%", то он заменяется префикс имен +// КакКоллекцию - Булево - вернуть найденные узлы как коллекцию (Соответствие) +// ТипДанных - Неопределено, Тип - преобразует найденные значения к нужному типу +// +// Возвращаемое значение: +// - Строка - подготовленное значение поля +// - Соответствие - содержит имя поля и его значение +// +Функция ПолучитьПолеОписания(ДокументОписания, Знач ПутьПоиска, КакКоллекцию = Истина, ТипДанных = Неопределено) + + Результат = Новый Соответствие(); + ЭлементДляПоиска = ДокументОписания.ЭлементДокумента; + ПрефиксИмен = ЭлементДляПоиска.Префикс + ":"; + ПутьПоиска = СтрЗаменить(ПутьПоиска, "%", ПрефиксИмен); + + ПространствоИмен = Новый РазыменовательПространствИменDOM(ДокументОписания); + ВыборкаЭлементов = ДокументОписания.ВычислитьВыражениеXPath(ПутьПоиска, ДокументОписания.ЭлементДокумента, ПространствоИмен); + + СледующийЭлемент = ВыборкаЭлементов.ПолучитьСледующий(); + + Пока СледующийЭлемент <> Неопределено Цикл + Если КакКоллекцию Тогда + ИмяЭлемента = ПолучитьЗначениеПоИмениЭлемента(СледующийЭлемент, "name"); + Значение = ПолучитьЗначениеПоИмениЭлемента(СледующийЭлемент, "value"); + Результат.Вставить(ИмяЭлемента, Значение); + Иначе + Результат = ПолучитьЗначениеПоляОписания(СледующийЭлемент); + КонецЕсли; + СледующийЭлемент = ВыборкаЭлементов.ПолучитьСледующий(); + КонецЦикла; + + Если ТипДанных <> Неопределено Тогда + Результат = ПривестиКТипу(Результат, ТипДанных); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция используется для нормализации в ПодготовитьЗаголовокПотока() +// +// Параметры: +// ДанныеСтроки - Строка - строковое представление параметра +// УбратьКонцовку - Булево +// +// Возвращаемое значение: +// Строка - приведенная строка +// +Функция НормализоватьСтрокуПараметров(ДанныеСтроки, УбратьКонцовку = Истина) + + Результат = СтрЗаменить(ДанныеСтроки, Символы.ПС, ""); + Результат = СтрЗаменить(Результат, Символы.ВК, ""); + + Если УбратьКонцовку Тогда + ДлинаСтроки = СтрДлина(Результат); + ПоследнийСимвол = Сред(Результат, ДлинаСтроки, 1); + Пока ПоследнийСимвол = "=" Цикл + ДлинаСтроки = ДлинаСтроки - 1; + Результат = Сред(Результат, 1, ДлинаСтроки); + ПоследнийСимвол = Сред(Результат, ДлинаСтроки, 1); + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для заполнения раздела "Подключение" в сессионных данных учетной записи +// +// Параметры: +// ВыборкаПользователей - см. ПолучитьДанныеАккаунтов +// +// Возвращаемое значение: +// Структура: +// * Сервер - Строка - адрес основного сервера +// * Порт - Число - если 0, то определяется по протоколу подключения +// * ИдентификаторКлиента - Строка - идентификатор клиента идентификации на сервере DSS +// * ИдентификаторПодписи - Строка - идентификатор сервиса подписи +// * ЗащищенноеСоединение - Булево - Истина, использовать защищенное подключение +// * ТаймАут - Число - время ожидания ответа +// * Заглушка - Строка - фиксированное строковое выражение +// +Функция НастройкиРаботыПодключение(ВыборкаПользователей) + + ДанныеПодключения = Новый Структура(); + ДанныеПодключения.Вставить("Сервер", ВыборкаПользователей.АдресСервера); + ДанныеПодключения.Вставить("Порт", 0); + ДанныеПодключения.Вставить("ИдентификаторКлиента", ВыборкаПользователей.ИдентификаторЦИ); + ДанныеПодключения.Вставить("ИдентификаторПодписи", ВыборкаПользователей.ИдентификаторСЭП); + ДанныеПодключения.Вставить("ЗащищенноеСоединение", Истина); + ДанныеПодключения.Вставить("ТаймАут", ВыборкаПользователей.ТаймАут); + ДанныеПодключения.Вставить("Заглушка", "urn:ietf:wg:oauth:2.0:oob:auto"); + + Если ВыборкаПользователей <> Неопределено Тогда + ДанныеПодключения = Новый ФиксированнаяСтруктура(ДанныеПодключения); + КонецЕсли; + + Возврат ДанныеПодключения; + +КонецФункции + +// Служебная функция для заполнения раздела "Методы" в сессионных данных учетной записи, +// Заполняет адреса вызова для всех возможных операций. +// +// Параметры: +// ВыборкаПользователей - см. ПолучитьДанныеАккаунтов +// +// Возвращаемое значение: +// Структура - где Ключ - внутренний идентификатор сервиса 1С, значение - фактическое значение адреса подключения +// +Функция НастройкиРаботыТочкиПодключения(ВыборкаПользователей = Неопределено) + + ИДВерсии = СервисКриптографииDSSКлиентСервер.ИдентификаторВерсииСервера(ВыборкаПользователей.ВерсияАПИ); + + СервисИдентификации = ВыборкаПользователей.СервисИдентификации; + СервисПодписи = ВыборкаПользователей.СервисПодписи; + СервисПроверки = ВыборкаПользователей.СервисПроверки; + СервисПользователей = ВыборкаПользователей.СервисИдентификации; + СервисДокументов = ""; + СервисАудита = ""; + + Если ИДВерсии > 1 Тогда + СервисДокументов = ВыборкаПользователей.СервисОбработкиДокументов; + СервисАудита = ВыборкаПользователей.СервисАудита; + КонецЕсли; + + Методы = Новый Структура(); + + // раздел: авторизация + Методы.Вставить("Аутентификация", СервисИдентификации + "/oauth/authorize"); // страница для интерактивного ввода пароля пользователя + Методы.Вставить("АвторизацияПоСертификату", СервисИдентификации + "/oauth/authorize/certificate");// аутентификация по SSL сертификату пользователя + Методы.Вставить("Авторизация", СервисИдентификации + "/oauth/token"); // запрос токена по коду подтверждения, по паролю и прочее + Методы.Вставить("ДвухфакторнаяАвторизация", СервисИдентификации + "/confirmation"); // двухфакторная аутентификация + + // раздел: управление пользователями + Методы.Вставить("ИнформацияПользователя", СервисПользователей + "/ums/user"); // информация о пользователю по GUID + Методы.Вставить("СписокПользователей", СервисПользователей + "/ums/users"); // работы со списком пользователей (поиск и пр.) + Методы.Вставить("СредстваАутентификации", СервисПользователей + "/ums/authntokens"); // список средств аутентификации + Методы.Вставить("ПолитикаУправлениеПользователями", СервисПользователей + "/ums/policy"); // политика управления пользователями + Методы.Вставить("ПолитикаГруппыПользователей", СервисПользователей + "/ums/groupPolicy"); // политика группы пользователей + + Если ИДВерсии > 1 Тогда + + // раздел: обработка документов + Методы.Вставить("Документы_Загрузить", СервисДокументов + "/api/documents"); // загрузить один документ на сервер, удалить документ + Методы.Вставить("Документы_ЗагрузитьПакет", СервисДокументов + "/api/documents/pack"); // загрузить пакет документов на сервер + Методы.Вставить("Документы_Информация", СервисДокументов + "/api/documents/%1/info"); // информация о документе по идентификатору + Методы.Вставить("Документы_ИнформацияХеш", СервисДокументов + "/api/documents/hash/%1/info"); // информация о документе по хешу + Методы.Вставить("Документы_ИзменитьИнформацию", СервисДокументов + "/api/documents/%1");// изменить информацию о документе по идентификатору + Методы.Вставить("Документы_Получить", СервисДокументов + "/api/documents/%1/content"); // получить документ с сервера по идентификатору + Методы.Вставить("Документы_Связанный", СервисДокументов + "/api/documents/%1/link"); // привязать документ на сервере по идентификаторам и получить информацию о нем + Методы.Вставить("Документы_Конвертация", СервисДокументов + "/api/documents/%1/converted_content"); // конвертация документа, получение конвертации документа + Методы.Вставить("Документы_КонвертацияИнформация", СервисДокументов + "/rest/api/documents/%1/converted_content/info"); // информация о конвертации документа + + // раздел: сервис аудита + Методы.Вставить("Аудит_ЗапросОтчета", СервисАудита + "/api/audit"); // запрос отчета + Методы.Вставить("Аудит_ОтчетСервера", СервисАудита + "/api/reports/create"); // запрос отчета о КриптоПро + + // раздел: сведения об операциях + Методы.Вставить("ОперацииПользователя", СервисИдентификации + "/operations"); // сведения об операциях пользователя + + // раздел: закрытый ключ + Методы.Вставить("ЗакрытыйКлюч", СервисПодписи + "/rest/api/keys"); // операции с закрытым ключом + + // раздел: асинхронные операции + Методы.Вставить("ПодписьАсинхронная", СервисПодписи + "/rest/api/v2/signature");// операции подписания + Методы.Вставить("Операции", СервисПодписи + "/api/operations/%1"); // управление операциями + + КонецЕсли; + + // раздел: работа с данными + Методы.Вставить("ПолитикаПодписи", СервисПодписи + "/rest/api/policy"); // политика подписи + Методы.Вставить("ЗапросНаСертификат", СервисПодписи + "/rest/api/requests"); // создание запроса на сертификат + Методы.Вставить("Транзакции", СервисПодписи + "/rest/api/transactions"); // создание транзакций для обработки + Методы.Вставить("ХешДокумента", СервисПодписи + "/rest/api/documents/hash"); // вычисление хеша для документа + Методы.Вставить("Сертификаты", СервисПодписи + "/rest/api/certificates"); // операции с сертификатами + Методы.Вставить("Документы", СервисПодписи + "/rest/api/documents"); // операции с документами + + // раздел: работа сервиса проверки + Если ЗначениеЗаполнено(СервисПроверки) Тогда + Методы.Вставить("ПроверкаСертификата", СервисПроверки + "/rest/api/certificates"); // проверка сертификата + Методы.Вставить("ПолитикаПроверки", СервисПроверки + "/rest/api/policy"); // политика проверки + Методы.Вставить("ПроверкаПодписи", СервисПроверки + "/rest/api/signatures"); // проверка подписи + Методы.Вставить("ИнформацияПодписантах", СервисПроверки + "/rest/api/signatures/signersInfo");// информация о подписанте + Иначе + Методы.Вставить("ПроверкаСертификата", ""); + Методы.Вставить("ПолитикаПроверки", ""); + Методы.Вставить("ПроверкаПодписи", ""); + Методы.Вставить("ИнформацияПодписантах", ""); + КонецЕсли; + + Возврат Новый ФиксированнаяСтруктура(Методы); + +КонецФункции + +// Служебная функция формирования структуры описания маркера безопасности (токена) +// +// Возвращаемое значение: +// Структура: +// * Токен - Строка - строка Base64, которую вернул сервис +// * ТипТокена - Строка - почти всегда Bearer +// * ТокенОбновления - Строка - идентификатор токена обновления +// * СрокДействия - Дата - дата с временем окончания действия токена, сохраняется по времени сервера 1С +// +Функция НастройкиРаботыШаблонТокена() + + ДанныеТокена = Новый Структура(); + ДанныеТокена.Вставить("Токен", ""); + ДанныеТокена.Вставить("ТипТокена", ""); + ДанныеТокена.Вставить("ТокенОбновления", ""); + ДанныеТокена.Вставить("СрокДействия", Дата(1, 1, 1)); + + Возврат ДанныеТокена; + +КонецФункции + +// Формирует общую структуру сессионных данных указанной учетной записи DSS. +// Внимание данная функция должна вызываться из сеанса подключения текущего пользователя. +// +// Параметры: +// ВыборкаПользователей - см. ПолучитьДанныеАккаунтов +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция НастройкиРаботыДанныеПользователя(ВыборкаПользователей) + + ДанныеПользователя = НастройкиПользователяПоУмолчанию(); + ИдентификаторУчетнойЗаписи = СокрЛП(ВыборкаПользователей.Ссылка.УникальныйИдентификатор()); + ДанныеХранилища = ПолучитьЗакрытыеДанные(ИдентификаторУчетнойЗаписи); + + ДанныеПользователя.ВерсияАПИ = ВыборкаПользователей.ВерсияАПИ; + ДанныеПользователя.Ссылка = ВыборкаПользователей.Ссылка; + ДанныеПользователя.Сервер = ВыборкаПользователей.Сервер; + ДанныеПользователя.УникальныйИдентификатор = ИдентификаторУчетнойЗаписи; + ДанныеПользователя.Логин = ВыборкаПользователей.Логин; + ДанныеПользователя.Пароль = ДанныеХранилища.Пароль; + ДанныеПользователя.ПарольСертификата = ДанныеХранилища.ПарольСертификата; + ДанныеПользователя.СертификатАвторизации = ЗначениеЗаполнено(ДанныеХранилища.СертификатАвторизации); + ДанныеПользователя.ПервичнаяАутентификация = ВыборкаПользователей.ПервичнаяАутентификация; + ДанныеПользователя.ВторичнаяАвторизация = ВыборкаПользователей.ВторичнаяАвторизация; + ДанныеПользователя.Подключение = НастройкиРаботыПодключение(ВыборкаПользователей); + ДанныеПользователя.Методы = НастройкиРаботыТочкиПодключения(ВыборкаПользователей); + ДанныеПользователя.ШаблонПодтверждения = ВыборкаПользователей.ШаблонПодтверждения; + + НастройкиРаботыАнализПолитикиПользователя(ДанныеПользователя.Политика, Неопределено); + + Возврат ДанныеПользователя; + +КонецФункции + +// Формирует структуру описания сертификата, который был закэширован. +// +// Параметры: +// ПоляСертификата - Структура - содержит поле "Отпечаток", "СерийныйНомер" или "Идентификатор", значения данных полей может быть Строка или Массив +// ДобавитьСодержимое - Булево - добавляет в ответ двоичные данные сертификата +// +// Возвращаемое значение: +// - Структура: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// * Идентификатор - Строка - вычисленный идентификатор сертификата +// * ДатаНачала - Дата - дата начала действия сертификата +// * ДатаОкончания - Дата - дата окончания действия сертификата +// * Наименование - Строка - представление сертификата +// * Отпечаток - Строка - HEX представление отпечатка +// * СерийныйНомер - Строка - HEX представление отпечатка +// * ИдентификаторСертификата- Строка +// * ДанныеСертификата - ДвоичныеДанные - содержимое сертификата +// - Массив из Структура - содержит сведения о сертификате в полях выше +// +Функция ПолучитьДанныеСертификатаПоПолюПоиска(ПоляСертификата, ДобавитьСодержимое = Ложь) + + Результат = Неопределено; + РезультатКакМассив = Ложь; + + Если НЕ (ПроверитьПраво("СертификатыПользователяDSS") + И ПроверитьПраво("УчетныеЗаписиDSS")) Тогда + Возврат Результат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СертификатыПользователяDSS.УчетнаяЗаписьDSS КАК УчетнаяЗапись, + | СертификатыПользователяDSS.Идентификатор КАК Идентификатор, + | СертификатыПользователяDSS.ДатаНачала КАК ДатаНачала, + | СертификатыПользователяDSS.ДатаОкончания КАК ДатаОкончания, + | СертификатыПользователяDSS.Наименование КАК Наименование, + | СертификатыПользователяDSS.Отпечаток КАК Отпечаток, + | СертификатыПользователяDSS.СерийныйНомер КАК СерийныйНомер, + | СертификатыПользователяDSS.ИдентификаторСертификата КАК ИдентификаторСертификата, + | ВЫБОР + | КОГДА &ДобавитьСодержимое = ИСТИНА + | ТОГДА СертификатыПользователяDSS.ДанныеСертификата + | ИНАЧЕ НЕОПРЕДЕЛЕНО + | КОНЕЦ КАК ДанныеСертификата + |ИЗ + | РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS + |{ГДЕ + | СертификатыПользователяDSS.Отпечаток КАК Отпечаток, + | СертификатыПользователяDSS.СерийныйНомер КАК СерийныйНомер, + | СертификатыПользователяDSS.ИдентификаторСертификата КАК ИдентификаторСертификата}"; + + ПостроительЗапроса = Новый ПостроительОтчета; + ПостроительЗапроса.Текст = ТекстЗапроса; + ПостроительЗапроса.ЗаполнитьНастройки(); + + Если ПоляСертификата.Свойство("Отпечаток") Тогда + НовыйОтборЗапроса(ПостроительЗапроса.Отбор, "Отпечаток", ПоляСертификата.Отпечаток, РезультатКакМассив); + КонецЕсли; + + Если ПоляСертификата.Свойство("СерийныйНомер") Тогда + НовыйОтборЗапроса(ПостроительЗапроса.Отбор, "СерийныйНомер", ПоляСертификата.СерийныйНомер, РезультатКакМассив); + КонецЕсли; + + Если ПоляСертификата.Свойство("ИдентификаторСертификата") Тогда + НовыйОтборЗапроса(ПостроительЗапроса.Отбор, "ИдентификаторСертификата", ПоляСертификата.ИдентификаторСертификата, РезультатКакМассив); + КонецЕсли; + + Запрос = ПостроительЗапроса.ПолучитьЗапрос(); + Запрос.УстановитьПараметр("ДобавитьСодержимое", ДобавитьСодержимое); + + РезультатЗапроса = Запрос.Выполнить(); + + Если НЕ РезультатЗапроса.Пустой() Тогда + Выборка = РезультатЗапроса.Выбрать(); + + Результат = Новый Массив; + + Пока Выборка.Следующий() Цикл + НоваяСтрока = Новый Структура("УчетнаяЗапись, Идентификатор, Отпечаток, СерийныйНомер, ИдентификаторСертификата, ДатаНачала, ДатаОкончания, Наименование"); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка); + Если ДобавитьСодержимое Тогда + НоваяСтрока.Вставить("ДанныеСертификата", Выборка.ДанныеСертификата.Получить()); + КонецЕсли; + + Если НЕ РезультатКакМассив Тогда + Результат = НоваяСтрока; + Прервать; + КонецЕсли; + Результат.Добавить(НоваяСтрока); + КонецЦикла; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная, необходима для заполнения отборов в запросе +// +Процедура НовыйОтборЗапроса(ОтборыЗапроса, ОписаниеОтбора, ЗначениеОтбора, РезультатКакМассив) + + НовыйОтбор = ОтборыЗапроса.Добавить(ОписаниеОтбора); + НовыйОтбор.Использование = Истина; + Если ТипЗнч(ЗначениеОтбора) = Тип("Массив") Тогда + РезультатКакМассив = Истина; + СписокОтбора = Новый СписокЗначений; + СписокОтбора.ЗагрузитьЗначения(ЗначениеОтбора); + НовыйОтбор.ВидСравнения = ВидСравнения.ВСписке; + НовыйОтбор.Значение = СписокОтбора; + Иначе + РезультатКакМассив = Ложь; + НовыйОтбор.ВидСравнения = ВидСравнения.Равно; + НовыйОтбор.Значение = ЗначениеОтбора; + КонецЕсли; + +КонецПроцедуры + +// Служит для проверки права на чтения на указанный объект метаданных +// В основном проверка идет перед формирование запроса к ИБ. +// +// Параметры: +// СсылкаМетаданных - ОбъектМетаданных, Строка - объект проверки права +// ТипПрава - Строка - проверяемое право +// +// Возвращаемое значение: +// Булево +// +Функция ПроверитьПраво(СсылкаМетаданных, ТипПрава = "Чтение") Экспорт + + Если СсылкаМетаданных = "СертификатыПользователяDSS" Тогда + ОбъектМетаданных = Метаданные.РегистрыСведений.СертификатыПользователяDSS; + ИначеЕсли СсылкаМетаданных = "УчетныеЗаписиDSS" Тогда + ОбъектМетаданных = Метаданные.Справочники.УчетныеЗаписиDSS; + ИначеЕсли СсылкаМетаданных = "ЭкземплярыСервераDSS" Тогда + ОбъектМетаданных = Метаданные.Справочники.ЭкземплярыСервераDSS; + ИначеЕсли СсылкаМетаданных = "ПодключениеDSS" Тогда + ОбъектМетаданных = Метаданные.ПараметрыСеанса.ПодключениеDSS; + Иначе + ОбъектМетаданных = СсылкаМетаданных; + КонецЕсли; + + Результат = ПравоДоступа(ТипПрава, ОбъектМетаданных); + + Возврат Результат; + +КонецФункции + +// Формирует ключ поиска конфиденциальных данных в безопасном хранилище. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// - Строка - идентификатор поиска +// +// Возвращаемое значение: +// Строка - полный путь поиска в регистре БезопасноеХранилище, включает в себя данные об учетной записи и пользователе 1С +// +Функция КлючЗаписиКонфиденциальныхДанных(НастройкиПользователя) + + Если ТипЗнч(НастройкиПользователя) = Тип("Строка") + ИЛИ ТипЗнч(НастройкиПользователя) = Тип("УникальныйИдентификатор") Тогда + ТекущийПользователь = Пользователи.АвторизованныйПользователь(); + КлючЗначения = "ЭлектроннаяПодписьDSS." + ТекущийПользователь.УникальныйИдентификатор() + "." + НастройкиПользователя; + Иначе + ТекущийПользователь = НастройкиПользователя.АвторизованныйПользователь; + КлючЗначения = "ЭлектроннаяПодписьDSS." + ТекущийПользователь + "." + НастройкиПользователя.УникальныйИдентификатор; + КонецЕсли; + + Возврат КлючЗначения; + +КонецФункции + +// Служебная функция для формирования описания конфиденциальных данных пользователя об учетной записи DSS +// +// Возвращаемое значение: +// Структура: +// * ПризнакКонфиденциальности - Число - реализованный алгоритм +// * СертификатАвторизации - Строка - данные сертификата для авторизации +// * Пароль - Строка - пароль для логина в закрытом виде +// * ПарольСертификата - Строка - пароль для доступа к файлу сертификата авторизации в закрытом виде +// * Сертификаты - Соответствие из КлючИЗначение - хранит пин-коды для сертификатов ЭП, где: +// ** Ключ - Строка - отпечаток сертификата +// ** Значение - Строка - пин-код сертификата +// +Функция КонфиденциальныеДанныеПользователя() + + Результат = Новый Структура(); + Результат.Вставить("СертификатАвторизации", ""); + Результат.Вставить("Пароль", ЗакрытьКонфиденциальноеЗначение("")); + Результат.Вставить("ПарольСертификата", ЗакрытьКонфиденциальноеЗначение("")); + Результат.Вставить("Сертификаты", Новый Соответствие); + + Возврат Результат; + +КонецФункции + +// Служит для получения содержимого сертификата из кеш сертификатов +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS - ссылка на учетную запись по которой осуществляется поиск +// ОтпечатокСертификата - Строка - строковое представление отпечатка сертификата +// +// Возвращаемое значение: +// ДвоичныеДанные - полный путь поиска в регистре БезопасноеХранилище, включает в себя данные об учетной записи и +// пользователе 1С. +// +Функция ПолучитьСодержимоеСертификата(УчетнаяЗапись, ОтпечатокСертификата) + + Результат = ""; + + Если НЕ ПроверитьПраво("СертификатыПользователяDSS") Тогда + Возврат Результат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | СертификатыПользователяDSS.ДанныеСертификата КАК ДанныеСертификата, + | СертификатыПользователяDSS.Отпечаток КАК Отпечаток + |ИЗ + | РегистрСведений.СертификатыПользователяDSS КАК СертификатыПользователяDSS + |ГДЕ + | СертификатыПользователяDSS.УчетнаяЗаписьDSS = &УчетнаяЗапись + | И СертификатыПользователяDSS.Отпечаток = &ОтпечатокСертификата"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("УчетнаяЗапись", УчетнаяЗапись); + Запрос.УстановитьПараметр("ОтпечатокСертификата", ОтпечатокСертификата); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + Результат = Выборка.ДанныеСертификата.Получить(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служит для трансформации результатов вызова сервиса облачной подписи +// +// Параметры: +// РезультатЗапроса - см. ОтветСервисаПоУмолчанию +// ПараметрыВызова - Структура - обязательно содержит поле ТрансформироватьРезультат, обычно передается в параметре вызова "ПараметрыОперации" +// ЭтоТранзакция - Булево - не требует преобразования, только возврат начального состояния +// +Процедура ТрансформироватьДанныеДокумента(РезультатЗапроса, ПараметрыВызова, ЭтоТранзакция = Ложь) + + + ТрансформироватьРезультат = ПараметрыВызова.ТрансформироватьРезультат; + + Если РезультатЗапроса.Выполнено + И ТрансформироватьРезультат <> Неопределено Тогда + + ДанныеЗапроса = РезультатЗапроса.Результат; + ТипРезультата = ТрансформироватьРезультат.ТипРезультата; + + Если ЭтоТранзакция Тогда + РезультатЗапроса.Вставить("ТрансформироватьРезультат", ТрансформироватьРезультат); + + ИначеЕсли ТипЗнч(ДанныеЗапроса) = Тип("Массив") Тогда + Для Счетчик = 1 По ДанныеЗапроса.Количество() Цикл + ДанныеДокумента = ДанныеЗапроса[Счетчик - 1]; + ТипДанных = СервисКриптографииDSSКлиентСервер.ПолучитьТипДанныхДокумента(ДанныеДокумента); + НовыйАдрес = ТрансформироватьРезультат.АдресаВременногоХранилища[Счетчик - 1]; + Если ТипЗнч(ТипРезультата) = Тип("Массив") Тогда + НужныйТип = ТипРезультата[Счетчик - 1]; + Иначе + НужныйТип = ТипРезультата; + КонецЕсли; + + Если ТипРезультата = "Неопределено" Тогда + Если ЗначениеЗаполнено(НовыйАдрес) Тогда + ДанныеЗапроса[Счетчик - 1] = ОбработатьАдресДанныхДокумента(ДанныеДокумента, НовыйАдрес); + КонецЕсли; + Иначе + ДанныеЗапроса[Счетчик - 1] = ОбработкаТрансформацииДанныхДокумента(ДанныеДокумента, НужныйТип, ТипДанных, НовыйАдрес); + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипРезультата = "Неопределено" Тогда + НовыйАдрес = ТрансформироватьРезультат.АдресаВременногоХранилища[0]; + РезультатЗапроса.Результат = ОбработатьАдресДанныхДокумента(ДанныеЗапроса, НовыйАдрес); + + Иначе + НовыйАдрес = ТрансформироватьРезультат.АдресаВременногоХранилища[0]; + РезультатЗапроса.Результат = ОбработкаТрансформацииДанныхДокумента(ДанныеЗапроса, ТипРезультата, ТипДанных, НовыйАдрес); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Вспомогательная функция для трансформации элемента данных, используется в ТрансформироватьДанныеДокумента +// +// Параметры: +// ДанныеДокумента - ДвоичныеДанные, Строка - входящие данные +// ТипРезультата - Строка - тип данных который нужно получить +// ТипДанных - Строка - тип входящих данных +// НовыйАдрес - Строка - адрес временного хранилища +// +// Возвращаемое значение: +// ДвоичныеДанные, Строка - результат трансформации +// +Функция ОбработкаТрансформацииДанныхДокумента(ДанныеДокумента, ТипРезультата, ТипДанных, НовыйАдрес) + + Результат = ДанныеДокумента; + + Если ТипРезультата = "АдресХранилища" Тогда + Если ТипДанных = "АдресХранилища" Тогда + Результат = ОбработатьАдресДанныхДокумента(Результат, НовыйАдрес); + + ИначеЕсли ТипДанных = "Base64" Тогда + Результат = Base64Значение(ДанныеДокумента); + Результат = ПоместитьВоВременноеХранилище(Результат, НовыйАдрес); + + Иначе + Результат = ПоместитьВоВременноеХранилище(ДанныеДокумента, НовыйАдрес); + + КонецЕсли; + + ИначеЕсли ТипРезультата = "Base64" Тогда + Результат = ПодготовитьРезультатЗапроса(ДанныеДокумента, ТипРезультата); + + ИначеЕсли ТипРезультата = "ДвоичныеДанные" + ИЛИ ТипРезультата = "СсылкаБазы" Тогда + Если ТипДанных = "АдресХранилища" Тогда + Результат = ПолучитьИзВременногоХранилища(ДанныеДокумента); + УдалитьИзВременногоХранилища(ДанныеДокумента); + + ИначеЕсли ТипДанных = "Base64" Тогда + Результат = Base64Значение(ДанныеДокумента); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Вспомогательная функция для трансформации элемента данных, используется в ТрансформироватьДанныеДокумента. +// Перекладывает данные по новому адресу временного хранилища. +// +// Параметры: +// ДанныеДокумента - ДвоичныеДанные, Строка - входящие данные +// АдресДокумента - Строка - адрес временного храни +// +// Возвращаемое значение: +// Строка - адрес временного хранилища +// +Функция ОбработатьАдресДанныхДокумента(ДанныеДокумента, АдресДокумента) + + Результат = ДанныеДокумента; + + Если ТипЗнч(ДанныеДокумента) = Тип("Строка") + И ЭтоАдресВременногоХранилища(ДанныеДокумента) Тогда + НовыйОбъект = ПолучитьИзВременногоХранилища(ДанныеДокумента); + УдалитьИзВременногоХранилища(ДанныеДокумента); + Результат = ПоместитьВоВременноеХранилище(НовыйОбъект, АдресДокумента); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для определения идентификатора поставляемых данных для загрузки в справочник ЭкземплярыСервераDSS. +// +Функция ВидПоставляемыхДанных() + + Возврат "СервисОблачнойПодписи"; + +КонецФункции + +// Служебная универсальная функция для обработки содержимого архива +// +// Параметры: +// ПутьКФайлу - Строка - путь к файлу с архивом +// ТипСодержимого - Строка - один из фиксированных вариантов: ДвоичныеДанные, ВременноеХранилище +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - имя файла +// * Значение - Строка - адрес временного хранилища +// - ДвоичныеДанные +// +Функция ПолучитьДанныеАрхива(ПутьКФайлу, ТипСодержимого = "ДвоичныеДанные") + + Результат = Новый Соответствие; + + КаталогРаспаковки = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(КаталогРаспаковки); + + Попытка + + Архиватор = Новый ЧтениеZipФайла(ПутьКФайлу); + Архиватор.ИзвлечьВсе(КаталогРаспаковки, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + Архиватор.Закрыть(); + + Исключение + + ПротоколОшибкиПриВызове( + НСтр("ru = 'Не удалось распаковать архив с поставляемыми данными.'"), + "ПоставляемыеДанные", + ПутьКФайлу, + ИнформацияОбОшибке()); + Возврат Результат; + + КонецПопытки; + + ИмеющиесяФайлы = НайтиФайлы(КаталогРаспаковки, "*"); + + ПозицияОбхода = 0; + КоличествоФайлов = ИмеющиесяФайлы.Количество(); + Пока ПозицияОбхода < КоличествоФайлов Цикл + + Файл = ИмеющиесяФайлы[ПозицияОбхода]; + + ДанныеФайла = Новый ДвоичныеДанные(Файл.ПолноеИмя); + Если ТипСодержимого = "ВременноеХранилище" Тогда + ДанныеФайла = ПоместитьВоВременноеХранилище(ДанныеФайла); + КонецЕсли; + + Результат.Вставить(Файл.Имя, ДанныеФайла); + + ПозицияОбхода = ПозицияОбхода + 1; + КонецЦикла; + + УдалитьФайлы(КаталогРаспаковки); + + Возврат Результат; + +КонецФункции + +// Служебная процедура служит для обработки получения реестра серверов облачной подписи +// через механизм "Поставляемые данные". +// +Процедура ОбработатьПоставляемыеСервера(ПутьКФайлу) + + Удачно = Истина; + КоличествоСерверов = 0; + КодЯзыка = КодЯзыка(); + ВсеДанные = ПолучитьДанныеАрхива(ПутьКФайлу, "ДвоичныеДанные"); + + Если ВсеДанные.Количество() <> 1 Тогда + ПротоколОшибкиПриВызове( + НСтр("ru = 'Поставляемые данные не содержат нужной информации.'", КодЯзыка), + "ПоставляемыеДанные", + ПутьКФайлу, + ИнформацияОбОшибке()); + Удачно = Ложь; + КонецЕсли; + + ИспользоватьСервисОблачнойПодписи = Ложь; + ЭтоМассивСерверов = Ложь; + ЭтоПереключатель = Ложь; + ТекущиеДанные = Неопределено; + + Для Каждого СтрокаКлюча Из ВсеДанные Цикл + ДанныеФайла = ПолучитьСтрокуИзДвоичныхДанных(СтрокаКлюча.Значение); + ТекущиеДанные = JsonВСтруктуру(ДанныеФайла); + КонецЦикла; + + Если Удачно Тогда + + ЭтоМассивСерверов = Тип("Массив") = ТипЗнч(ТекущиеДанные); + ЭтоПереключатель = Тип("Структура") = ТипЗнч(ТекущиеДанные); + + КонецЕсли; + + Удачно = ЭтоМассивСерверов ИЛИ ЭтоПереключатель; + + Если ЭтоМассивСерверов Тогда + + Для Каждого СтрокаМассива Из ТекущиеДанные Цикл + СерверОблачнойПодписи = Неопределено; + + Если ЗначениеЗаполнено(СтрокаМассива) Тогда + НастройкиСервиса = РазобратьФайлНастроекСервера(СтрокаМассива); + СерверОблачнойПодписи = СоздатьСерверОблачнойПодписи(НастройкиСервиса); + КонецЕсли; + + Если ЗначениеЗаполнено(СерверОблачнойПодписи) Тогда + КоличествоСерверов = КоличествоСерверов + 1; + КонецЕсли; + + КонецЦикла; + + Если КоличествоСерверов = 0 + ИЛИ КоличествоСерверов <> ТекущиеДанные.Количество() Тогда + ПротоколОшибкиПриВызове( + НСтр("ru = 'Запись поставляемых данных завершилась с ошибками.'", КодЯзыка), + "ПоставляемыеДанные", + ПутьКФайлу, + ИнформацияОбОшибке()); + Удачно = Ложь; + Иначе + ИспользоватьСервисОблачнойПодписи = Истина; + КонецЕсли; + + КонецЕсли; + + Если ЭтоПереключатель Тогда + Удачно = ТекущиеДанные.Свойство("ИспользоватьСервисОблачнойПодписи"); + ИспользоватьСервисОблачнойПодписи = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ТекущиеДанные, "ИспользоватьСервисОблачнойПодписи", Ложь); + КонецЕсли; + + Если Удачно Тогда + + Попытка + ИзменитьРежимИспользоватьСервисОблачнойПодписи(ИспользоватьСервисОблачнойПодписи); + Исключение + ПротоколОшибкиПриВызове( + НСтр("ru = 'Запись поставляемых данных завершилась с ошибками.'", КодЯзыка), + "ПоставляемыеДанные", + ПутьКФайлу, + ИнформацияОбОшибке()); + Удачно = Ложь; + КонецПопытки; + + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура необходима для изменения константы подсистемы// +// +Процедура ИзменитьРежимИспользоватьСервисОблачнойПодписи(НовоеЗначение) + + Если СервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи() <> НовоеЗначение Тогда + УстановитьПривилегированныйРежим(Истина); + Константы.ИспользоватьСервисОблачнойПодписи.Установить(НовоеЗначение); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + +КонецПроцедуры + +// Служебная, для упрощения проверки данных. +// +// Параметры: +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ОбъектПароля +// +Функция ЗакрытьКонфиденциальноеЗначение(ТекущееЗначение) + + Если ТипЗнч(ТекущееЗначение) = Тип("Структура") Тогда + Если ТекущееЗначение.Состояние <> 3 Тогда + Результат = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 2); + Иначе + Результат = ТекущееЗначение; + КонецЕсли; + + ИначеЕсли ЗначениеЗаполнено(ТекущееЗначение) Тогда + Результат = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 2); + + Иначе + Результат = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Предназначено для помещения данных в безопасное хранилище. +// +// Параметры: +// КлючЗначения - Строка +// - Произвольный +// ТекущееЗначение - Структура +// ИмяРаздела - Строка +// +Процедура ЗаписатьДанныеБезопасногоХранилища(КлючЗначения, ТекущееЗначение, ИмяРаздела = "Данные") + + УстановитьПривилегированныйРежим(Истина); + + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(КлючЗначения, ТекущееЗначение, ИмяРаздела); + + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + +// Предназначена для чтения данных из безопасного хранилища. +// +// Параметры: +// КлючЗначения - Строка +// - Произвольный +// ТекущееЗначение - Структура +// ИмяРаздела - Строка +// +Функция ПрочитатьДанныеБезопасногоХранилища(КлючЗначения, ИмяРаздела = "Данные") + + УстановитьПривилегированныйРежим(Истина); + + Результат = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(КлючЗначения, ИмяРаздела); + + УстановитьПривилегированныйРежим(Ложь); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/СервисКриптографииDSSСлужебный.mdo b/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/СервисКриптографииDSSСлужебный.mdo new file mode 100644 index 000000000..e7cc3c37a --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебный/СервисКриптографииDSSСлужебный.mdo @@ -0,0 +1,11 @@ + + + СервисКриптографииDSSСлужебный + + ru + Сервис криптографии DSS служебный + + true + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/Module.bsl new file mode 100644 index 000000000..bb7797706 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/Module.bsl @@ -0,0 +1,1783 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +#Область Прочие + +// Служебная функция для получения результатов выполнения фонового задания к сервису облачной подписи. +// Дополнительно контролирует статус обновления маркера доступа, +// а также убирает конфиденциальные данные см. подробнее СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(). +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ПолучитьРезультатВыполненияФоновогоЗадания(АдресРезультата, ПараметрыОперации = Неопределено) Экспорт + + Результат = ПолучитьИзВременногоХранилища(АдресРезультата); + + Если Результат = Неопределено Тогда + Результат = СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию(Ложь); + КонецЕсли; + + НастройкиПользователя = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Результат, "НастройкиПользователя"); + + Если НастройкиПользователя <> Неопределено Тогда + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); + КлючНастроек = СервисКриптографииDSSКлиентСервер.КлючНастроекПользователя(НастройкиПользователя); + ОбновилиНастройки = СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(КлючНастроек, НастройкиПользователя, ИсточникНастроек); + НастройкиПользователя = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(НастройкиПользователя); + Результат.Вставить("МаркерОбновлен", ОбновилиНастройки); + Результат.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для сброса пользовательских настроек формы (размеры) в начальное положение +// Внимание, специфика работы платформы такова, что начальные настройки применяться в новом сеансе. +// +// Параметры: +// ИмяФормы - Строка - имя формы подсистемы +// +Процедура НачальныеНастройкиФормы(ИмяФормы) Экспорт + + Если СтрНайти(ИмяФормы, ".") = 0 Тогда + ПутьФормы = "Обработка.УправлениеПодключениемDSS.Форма." + ИмяФормы + "/НастройкиФормы"; + ПутьОкна = "Обработка.УправлениеПодключениемDSS.Форма." + ИмяФормы + "/НастройкиОкна"; + Иначе + ПутьФормы = ИмяФормы + "/НастройкиФормы"; + ПутьОкна = ИмяФормы + "/НастройкиОкна"; + КонецЕсли; + + ОбщегоНазначения.ХранилищеСистемныхНастроекУдалить(ПутьФормы, "", ИмяПользователя()); + ОбщегоНазначения.ХранилищеСистемныхНастроекУдалить(ПутьОкна, "", ИмяПользователя()); + +КонецПроцедуры + +// Получает сессионные данные пользователя по отпечатку (серийному номеру) сертификата +// см. подробнее СервисКриптографииDSS.ПолучитьНастройкиПользователяПоСертификату(). +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ПолучитьНастройкиПользователяПоСертификату(ДанныеСертификата, ПараметрыОперации = Неопределено) Экспорт + + НастройкиПользователя = СервисКриптографииDSS.ПолучитьНастройкиПользователяПоСертификату(ДанныеСертификата, ПараметрыОперации); + + Если НастройкиПользователя <> Неопределено Тогда + Результат = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(НастройкиПользователя); + Иначе + Результат = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Вычисляет хеш двоичных данных по указанному алгоритму +// +// Параметры: +// Данные - ДвоичныеДанные - данные для вычисления хеша +// Алгоритм - Строка - алгоритм вычисления хеша, поддерживаются варианты предусмотренные платформой +// см. системное перечисление ХешФункция. +// +// Возвращаемое значение: +// Строка, Число - если строка, то это hex представление вычисленного хеша +// +Функция ВычислитьХешДвоичныхДанных(Данные, Алгоритм) Экспорт + + Временный = Новый ХешированиеДанных(ХешФункция[Алгоритм]); + Временный.Добавить(Данные); + + Результат = Временный.ХешСумма; + + Если ТипЗнч(Результат) = Тип("ДвоичныеДанные") Тогда + Результат = ПолучитьHexСтрокуИзДвоичныхДанных(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Анализирует состояние блока конфиденциальной информации. +// Подробное описание Обработки.УправлениеПодключениемDSS.СлужебныеДанныеОблачнойПодписи. +// +// Возвращаемое значение: +// Структура +// +Функция СлужебныеДанныеОблачнойПодписи(ШифрованныеБлок, КлючПоиска = Неопределено) Экспорт + + Возврат Обработки.УправлениеПодключениемDSS.СлужебныеДанныеОблачнойПодписи(ШифрованныеБлок, КлючПоиска); + +КонецФункции + +// Формирует структура для поиска раздела в в блоке конфиденциальной информации. +// Описание подробное Обработки.УправлениеПодключениемDSS.КлючПоискаУчетнойЗаписи. +// +// Возвращаемое значение: +// Структура +// +Функция КлючПоискаУчетнойЗаписи(ТекущаяУчетнаяЗапись, Сервер = "", Логин = "") Экспорт + + Возврат Обработки.УправлениеПодключениемDSS.КлючПоискаУчетнойЗаписи(ТекущаяУчетнаяЗапись, Сервер, Логин); + +КонецФункции + +// Предназначена для получения инициализированных сессионных данных учетной записи из параметров сеанса. +// По необходимости инициализирует их и убирает при возврате на клиент конфиденциальные данные. +// Подробнее СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(). +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ПолучитьНастройкиПользователя(СсылкаУчетнойЗаписи = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); + НастройкиПользователя = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(СсылкаУчетнойЗаписи, ИсточникНастроек); + Если НастройкиПользователя <> Неопределено Тогда + Результат = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(НастройкиПользователя); + Иначе + Результат = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область АсинхронныйВызовСервисов + +// Функции данной области предназначены для организации асинхронного режима работы (через фоновые задания) с сервисом DSS +// Во всех функциях формируется адрес во временном хранилище для размещения результатов работы фонового задания +// Также идет подготовка параметров для вызова фоновых заданий - упаковка в структуры, +// которые потом в модуле СервисКриптографииDSSСлужебный распаковываются +// +// Данные во временном хранилище: +// Для ряда функций проверяются переданные данные помещенные во временное хранилище, они извлекаются в двоичные данные. +// В модуле СервисКриптографииDSSСлужебный.ПодготовитьДанныеДокумента() в таком случае они снова помещаются во временное +// хранилище. +// +// см. СервисКриптографииDSS.АутентификацияПоСертификату() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция АутентификацияПоСертификату(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.АутентификацияПоСертификату", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.АутентификацияПоЛогину() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция АутентификацияПоЛогину(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.АутентификацияПоЛогину", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.Зашифровать() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция Зашифровать(НастройкиПользователя, ДанныеДокумента, СертификатыПолучателей, ТипШифрования = "CMS", ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПодготовленныеДанные = ТрансформироватьДанныеДокумента(ДанныеДокумента, ПараметрыОперации, ПараметрыВызова); + + ПараметрыВызова.Вставить("ДанныеДокумента", ПодготовленныеДанные); + ПараметрыВызова.Вставить("СертификатыПолучателей", ТрансформироватьДанныеДокумента(СертификатыПолучателей)); + ПараметрыВызова.Вставить("ТипШифрования", ТипШифрования); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.Зашифровать", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.СертификатыРасшифрования() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СертификатыРасшифрования(НастройкиПользователя, ДанныеДокумента, ТипШифрования = "CMS", ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ДанныеДокумента", ТрансформироватьДанныеДокумента(ДанныеДокумента)); + ПараметрыВызова.Вставить("ТипШифрования", ТипШифрования); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СертификатыРасшифрования", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ХешированиеДанных() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ХешированиеДанных(НастройкиПользователя, ДанныеДокумента, АлгоритмХеширования = "GR 34.11-2012 256", ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПодготовленныеДанные = ТрансформироватьДанныеДокумента(ДанныеДокумента, ПараметрыОперации, ПараметрыВызова); + + ПараметрыВызова.Вставить("ДанныеДокумента", ПодготовленныеДанные); + ПараметрыВызова.Вставить("АлгоритмХеширования", АлгоритмХеширования); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ХешированиеДанных", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.СоздатьТранзакцию() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СоздатьТранзакцию(НастройкиПользователя, ДанныеЗапроса, КодОперации, ДанныеДокумента = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + ПодготовленныеДанные = ТрансформироватьДанныеДокумента(ДанныеДокумента, ПараметрыОперации, ПараметрыВызова); + + ПараметрыВызова.Вставить("ДанныеЗапроса", ДанныеЗапроса); + ПараметрыВызова.Вставить("КодОперации", КодОперации); + ПараметрыВызова.Вставить("ДанныеДокумента", ПодготовленныеДанные); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СоздатьТранзакцию", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.Расшифровать() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция Расшифровать(НастройкиПользователя, ДанныеДокумента, ИдентификаторСертификата, ТипШифрования = "CMS", ПинКод = "", ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПодготовленныеДанные = ТрансформироватьДанныеДокумента(ДанныеДокумента, ПараметрыОперации, ПараметрыВызова); + ТекущиеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВызова.Вставить("ДанныеДокумента", ПодготовленныеДанные); + ПараметрыВызова.Вставить("ТипШифрования", ТипШифрования); + ПараметрыВызова.Вставить("ПинКод", ПроверитьПинКодСертификата(ИдентификаторСертификата, ПинКод, ТекущиеНастройки)); + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.Расшифровать", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.Подписать() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция Подписать(НастройкиПользователя, ДанныеДокумента, СвойствоПодписи, ИдентификаторСертификата, ПинКод = "", ПотоковыйРежим = Ложь, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПодготовленныеДанные = ТрансформироватьДанныеДокумента(ДанныеДокумента, ПараметрыОперации, ПараметрыВызова); + ТекущиеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВызова.Вставить("ДанныеДокумента", ПодготовленныеДанные); + ПараметрыВызова.Вставить("СвойствоПодписи", СвойствоПодписи); + ПараметрыВызова.Вставить("ПинКод", ПроверитьПинКодСертификата(ИдентификаторСертификата, ПинКод, ТекущиеНастройки)); + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыВызова.Вставить("ПотоковыйРежим", ПотоковыйРежим); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.Подписать", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПодписатьПакет() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПодписатьПакет(НастройкиПользователя, ДанныеДокумента, СвойствоПодписи, ИдентификаторСертификата = 0, ПинКод = "", ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПодготовленныеДанные = ТрансформироватьДанныеДокумента(ДанныеДокумента, ПараметрыОперации, ПараметрыВызова); + ТекущиеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВызова.Вставить("ДанныеДокумента", ПодготовленныеДанные); + ПараметрыВызова.Вставить("СвойствоПодписи", СвойствоПодписи); + ПараметрыВызова.Вставить("ПинКод", ПроверитьПинКодСертификата(ИдентификаторСертификата, ПинКод, ТекущиеНастройки)); + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПодписатьПакет", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ВалидацияПинКодаСертификата() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ВалидацияПинКодаСертификата(НастройкиПользователя, ИдентификаторСертификата, Знач ПинКод = "", ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + ТекущиеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("ПинКод", ПроверитьПинКодСертификата(ИдентификаторСертификата, ПинКод, ТекущиеНастройки)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ВалидацияПинКодаСертификата", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПолучитьДанныеСертификата() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьДанныеСертификата(НастройкиПользователя, ИдентификаторСертификата, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьДанныеСертификата", ПараметрыВызова); + +КонецФункции + +// - см. см. СервисКриптографииDSS.ПолучитьСвойстваСертификата() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьСвойстваСертификата(НастройкиПользователя, ИдентификаторСертификата, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьСвойстваСертификата", ПараметрыВызова); + +КонецФункции + +// -см. СервисКриптографииDSS.ОбновитьДанныеСертификатов() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ОбновитьДанныеСертификатов(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ОбновитьДанныеСертификатов", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.СоздатьЗапросНаСертификат() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СоздатьЗапросНаСертификат(НастройкиПользователя, + УдостоверяющийЦентр, + КриптоПровайдер, + ШаблонСертификата, + ПоляАтрибутов, + ПинКод = "", + ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("УдостоверяющийЦентр", УдостоверяющийЦентр); + ПараметрыВызова.Вставить("КриптоПровайдер", КриптоПровайдер); + ПараметрыВызова.Вставить("ШаблонСертификата", ШаблонСертификата); + ПараметрыВызова.Вставить("ПоляАтрибутов", ПоляАтрибутов); + ПараметрыВызова.Вставить("ПинКод", ПинКод); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СоздатьЗапросНаСертификат", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.СписокЗапросовНаСертификат() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СписокЗапросовНаСертификат(НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СписокЗапросовНаСертификат", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.ПолучитьЗапросНаСертификат() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьЗапросНаСертификат(НастройкиПользователя, + ИдентификаторЗапроса, + ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьЗапросНаСертификат", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.УдалитьЗапросНаСертификат() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция УдалитьЗапросНаСертификат(НастройкиПользователя, + ИдентификаторЗапроса, + ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.УдалитьЗапросНаСертификат", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.УстановитьСертификат() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция УстановитьСертификат(НастройкиПользователя, + ДанныеСертификата, + ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ДанныеСертификата", ТрансформироватьДанныеДокумента(ДанныеСертификата)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.УстановитьСертификат", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.НазначитьОсновнымСертификат() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция НазначитьОсновнымСертификат(НастройкиПользователя, ИдентификаторСертификата, Установить = Истина, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("Установить", Установить); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.НазначитьОсновнымСертификат", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.СменитьПинКодСертификата() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СменитьПинКодСертификата(НастройкиПользователя, ИдентификаторСертификата, СтарыйПинКод, НовыйПинКод, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("СтарыйПинКод", СтарыйПинКод); + ПараметрыВызова.Вставить("НовыйПинКод", НовыйПинКод); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СменитьПинКодСертификата", ПараметрыВызова); + +КонецФункции + +// - см. см. СервисКриптографииDSS.ПроверитьСертификат() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПроверитьСертификат(НастройкиПользователя, ДанныеСертификата, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ДанныеСертификата", ТрансформироватьДанныеДокумента(ДанныеСертификата)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПроверитьСертификат", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.ПолучитьСведенияОПодписантах() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьСведенияОПодписантах(НастройкиПользователя, ДанныеДокумента, ТипПодписи = "CMS", ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ДанныеДокумента", ТрансформироватьДанныеДокумента(ДанныеДокумента)); + ПараметрыВызова.Вставить("ТипПодписи", ТипПодписи); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьСведенияОПодписантах", ПараметрыВызова); + +КонецФункции + +// - см. СервисКриптографииDSS.ПроверитьПодпись() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПроверитьПодпись(НастройкиПользователя, + ДанныеДокумента, + ИсходныйДокумент, + ТипПодписи, + СвойстваПроверки, + Сертификат, + ПараметрыОперации) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ДанныеДокумента", ТрансформироватьДанныеДокумента(ДанныеДокумента)); + ПараметрыВызова.Вставить("ТипПодписи", ТипПодписи); + ПараметрыВызова.Вставить("СвойстваПроверки", СвойстваПроверки); + ПараметрыВызова.Вставить("ИсходныйДокумент", ТрансформироватьДанныеДокумента(ИсходныйДокумент)); + ПараметрыВызова.Вставить("Сертификат", ТрансформироватьДанныеДокумента(Сертификат)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПроверитьПодпись", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ОбновитьПолитикуПользователя() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ОбновитьПолитикуПользователя(НастройкиПользователя, + ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ОбновитьПолитикуПользователя", ПараметрыВызова); + +КонецФункции + +// См. СервисКриптографииDSS.ПолучитьОписаниеСервиса +Функция ПолучитьОписаниеСервиса(АдресСервера, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("АдресСервера", АдресСервера); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьОписаниеСервиса", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ВыполнитьЗапросКСервису() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ВыполнитьЗапросКСервису(ПараметрыЗапроса, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ТекущиеНастройки = ПодготовитьНастройкиПользователя(ПараметрыЗапроса.НастройкиПользователя, ПараметрыОперации); + ПараметрыЗапроса.НастройкиПользователя = ТекущиеНастройки; + + ПараметрыВызова.Вставить("ПараметрыЗапроса", ПараметрыЗапроса); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ВыполнитьЗапросКСервису", ПараметрыВызова); + +КонецФункции + +// См. СервисКриптографииDSS.НайтиСертификат +Функция НайтиСертификат(ОписаниеСертификата, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ОписаниеСертификата", ОписаниеСертификата); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.НайтиСертификат", ПараметрыВызова); + +КонецФункции + +// См. СервисКриптографииDSS.СостояниеУчетнойЗаписи +Функция СостояниеУчетнойЗаписи(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ТекущиеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВызова.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СостояниеУчетнойЗаписи", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSSКлиент.ПодготовитьТранзакцию() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПодготовитьТранзакцию(НастройкиПользователя, ПараметрыВыполнения, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + Если ПараметрыВыполнения.Свойство("ДанныеДокумента") Тогда + + ПодготовленныеДанные = ТрансформироватьДанныеДокумента(ПараметрыВыполнения.ДанныеДокумента, ПараметрыОперации, ПараметрыВызова); + ПараметрыВыполнения.ДанныеДокумента = ПодготовленныеДанные; + + КонецЕсли; + + ТекущиеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + + ПараметрыВызова.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыВызова.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПодготовитьТранзакцию", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПолучитьЗаписиАудита() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьЗаписиАудита(НастройкиПользователя, Фильтры, НачальнаяПозиция = Неопределено, КонечнаяПозиция = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("Фильтры", Фильтры); + ПараметрыВызова.Вставить("НачальнаяПозиция", НачальнаяПозиция); + ПараметрыВызова.Вставить("КонечнаяПозиция", КонечнаяПозиция); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьЗаписиАудита", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ЗагрузитьДокумент() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ЗагрузитьДокумент(НастройкиПользователя, ДанныеДокумента, ПараметрыДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыВызова.Вставить("ПараметрыДокумента", ПараметрыДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ЗагрузитьДокумент", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ЗагрузитьПакетДокументов() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ЗагрузитьПакетДокументов(НастройкиПользователя, ПараметрыДокументов, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ПараметрыДокументов", ПараметрыДокументов); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ЗагрузитьПакетДокументов", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ИнформацияОДокументеПоИдентификатору() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ИнформацияОДокументеПоИдентификатору(НастройкиПользователя, ИдентификаторДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторДокумента", ИдентификаторДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ИнформацияОДокументеПоИдентификатору", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ИнформацияОДокументеПоХешу() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ИнформацияОДокументеПоХешу(НастройкиПользователя, ХешДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ХешДокумента", ХешДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ИнформацияОДокументеПоХешу", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПолучитьОбработанныйДокумент() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьОбработанныйДокумент(НастройкиПользователя, ИдентификаторДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторДокумента", ИдентификаторДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьОбработанныйДокумент", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ИзменитьИнформациюОДокументе() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ИзменитьИнформациюОДокументе(НастройкиПользователя, ИдентификаторДокумента, ПараметрыДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторДокумента", ИдентификаторДокумента); + ПараметрыВызова.Вставить("ПараметрыДокумента", ПараметрыДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ИзменитьИнформациюОДокументе", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПривязатьДокумент() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПривязатьДокумент(НастройкиПользователя, ИдентификаторДокумента, ИдентификаторРодительскогоДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторДокумента", ИдентификаторДокумента); + ПараметрыВызова.Вставить("ИдентификаторРодительскогоДокумента", ИдентификаторРодительскогоДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПривязатьДокумент", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.СконвертироватьДокумент() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СконвертироватьДокумент(НастройкиПользователя, ИдентификаторДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторДокумента", ИдентификаторДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СконвертироватьДокумент", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПолучитьИнформациюДокументаКонвертации() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьИнформациюДокументаКонвертации(НастройкиПользователя, ИдентификаторДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторДокумента", ИдентификаторДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьИнформациюДокументаКонвертации", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.УдалитьДокумент() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция УдалитьДокумент(НастройкиПользователя, ИдентификаторДокумента, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторДокумента", ИдентификаторДокумента); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.УдалитьДокумент", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.СоздатьЗакрытыйКлюч() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СоздатьЗакрытыйКлюч(НастройкиПользователя, ИдентификаторАлгоритмаКлюча, ПараметрыКлюча, ПинКод, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторАлгоритмаКлюча", ИдентификаторАлгоритмаКлюча); + ПараметрыВызова.Вставить("ПараметрыКлюча", ПараметрыКлюча); + ПараметрыВызова.Вставить("ПинКод", ПинКод); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СоздатьЗакрытыйКлюч", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.УстановитьПараметрЗакрытогоКлюча() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция УстановитьПараметрЗакрытогоКлюча(НастройкиПользователя, ИдентификаторСертификата, ИмяПараметра, ЗначениеПараметра, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("ИмяПараметра", ИмяПараметра); + ПараметрыВызова.Вставить("ЗначениеПараметра", ЗначениеПараметра); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.УстановитьПараметрЗакрытогоКлюча", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПолучитьПараметрЗакрытогоКлюча() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПолучитьПараметрЗакрытогоКлюча(НастройкиПользователя, ИдентификаторСертификата, ИмяПараметра, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("ИмяПараметра", ИмяПараметра); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПолучитьПараметрЗакрытогоКлюча", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ПодписатьАсинхронно() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ПодписатьАсинхронно(НастройкиПользователя, СвойствоПодписи, ИдентификаторСертификата, ПинКод, АсинхронныйРежим, ОбратныйВызов, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("СвойствоПодписи", СвойствоПодписи); + ПараметрыВызова.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыВызова.Вставить("ПинКод", ПинКод); + ПараметрыВызова.Вставить("АсинхронныйРежим", АсинхронныйРежим); + ПараметрыВызова.Вставить("ОбратныйВызов", ОбратныйВызов); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ПодписатьАсинхронно", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.СведенияОбОперации() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция СведенияОбОперации(НастройкиПользователя, ИдентификаторОперации, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторОперации", ИдентификаторОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.СведенияОбОперации", ПараметрыВызова); + +КонецФункции + +// см. СервисКриптографииDSS.ВыполнитьОперацию() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ВыполнитьОперацию(НастройкиПользователя, ИдентификаторОперации, ПараметрыОперации = Неопределено) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова.Вставить("ИдентификаторОперации", ИдентификаторОперации); + ПараметрыВызова.Вставить("НастройкиПользователя", ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации)); + ПараметрыВызова.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("СервисКриптографииDSSСлужебный.ВыполнитьОперацию", ПараметрыВызова); + +КонецФункции + +// См. Обработки.УправлениеПодключениемDSS.ОбменССерверомАктивироватьУчетнуюЗапись() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ОбменССерверомАктивироватьУчетнуюЗапись(ИдентификаторСубъекта, ПодписьПароля, ДанныеПодписи) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ПодписьПароля", ПодписьПароля); + ПараметрыВызова.Вставить("ДанныеПодписи", ДанныеПодписи); + ПараметрыВызова.Вставить("ИдентификаторСубъекта", ИдентификаторСубъекта); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ОбменССерверомАктивироватьУчетнуюЗапись", ПараметрыВызова); + +КонецФункции + +// См. Обработки.УправлениеПодключениемDSS.ОбменССерверомАктивироватьУчетнуюЗапись() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ОбменССерверомАктивироватьКлючПриложенияУчетнойЗаписи(ИдентификаторСубъекта, ПодписьПриложения) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ПодписьПриложения", ПодписьПриложения); + ПараметрыВызова.Вставить("ИдентификаторСубъекта", ИдентификаторСубъекта); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ОбменССерверомАктивироватьКлючПриложенияУчетнойЗаписи", ПараметрыВызова); + +КонецФункции + +// Служебный вызов серверной функции, см. Обработки.УправлениеПодключениемDSS.ОбменССерверомОтправитьКодАктивацииКлюча() +// +// Возвращаемое значение: +// см. ДлительныеОперации.ВыполнитьВФоне +// +Функция ОбменССерверомОтправитьКодАктивацииКлюча(ИдентификаторСубъекта, ПодписьКодаАктивацииПриложения) Экспорт + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ПодписьКодаАктивацииПриложения", ПодписьКодаАктивацииПриложения); + ПараметрыВызова.Вставить("ИдентификаторСубъекта", ИдентификаторСубъекта); + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ОбменССерверомОтправитьКодАктивацииКлюча", ПараметрыВызова); + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ПоследующийВызовСерверныхФункций + +// Проверяет необходимость обновления сессионные данных учетной записи, +// также при возврате обнуляются конфиденциальные данные. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// НовыеНастройки - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +Процедура ОбновитьНастройкиПользователя(НастройкиПользователя, НовыеНастройки, ПараметрыОперации = Неопределено) Экспорт + + Если НастройкиПользователя.Ссылка = НовыеНастройки.Ссылка Тогда + + ПодготовленныеНастройки = ПодготовитьНастройкиПользователя(НовыеНастройки, ПараметрыОперации); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); + СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(НовыеНастройки.Ссылка, ПодготовленныеНастройки, ИсточникНастроек); + НастройкиПользователя = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(ПодготовленныеНастройки); + + КонецЕсли; + +КонецПроцедуры + +// Получает параметры из адрес редиректа +// см. СервисКриптографииDSSСлужебный.ПолучитьПараметрыИзОтвета +// +Функция ПолучитьПараметрыИзОтвета(ДанныеСтраницы) Экспорт + + Возврат СервисКриптографииDSSСлужебный.ПолучитьПараметрыИзОтвета(ДанныеСтраницы); + +КонецФункции + +// Осуществляет подбор настроек авторизованной учетной записи +// Может потребоваться для осуществления операций не требующих строгой конфиденциальности, таких как: +// - проверка подписи +// - проверка сертификата +// - хеширование +// - шифрование данных. +// +// Параметры: +// Отбор - Неопределено, Соответствие - если передана структура, то поля содержат отборы. +// ПараметрыОперации - Неопределено +// - Структура +// +// Возвращаемое значение: +// Структура - Массив из СправочникСсылка.УчетныеЗаписиDSS +// +Функция ПодобратьНастройкиПользователя(Знач Отбор = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + Результат = Новый Массив; + ТаблицаАккаунтов = СервисКриптографииDSSСлужебный.ПолучитьДанныеАккаунтов(); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); + ОбщиеНастройки = СервисКриптографииDSSСлужебный.ПолучитьКонтейнерНастроек(ИсточникНастроек); + + Если Отбор = Неопределено Тогда + Отбор = Новый Соответствие; + КонецЕсли; + + МассивОтобранных = Новый Массив; + + Если ТаблицаАккаунтов.Количество() = 1 Тогда + МассивОтобранных.Добавить(ТаблицаАккаунтов[0].Ссылка); + + Иначе + ПервыйАвторизованный = Неопределено; + ПервыйОтобранный = Неопределено; + + Для каждого СтрокаТаблицы Из ТаблицаАккаунтов Цикл + СтрокаНастройки = ОбщиеНастройки.Пользователи[СтрокаТаблицы.Ссылка]; + Авторизован = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(СтрокаНастройки, "Политика.Заполнено", Ложь); + + Если Авторизован Тогда + ПервыйАвторизованный = СтрокаТаблицы.Ссылка; + КонецЕсли; + + НашлиПользователя = 0; + Для каждого СтрокаОтбора Из Отбор Цикл + ЗначениеПоля = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(СтрокаНастройки, СтрокаОтбора.Ключ); + Если СтрокаОтбора.Значение = "Заполнено" Тогда + Если ЗначениеЗаполнено(ЗначениеПоля) Тогда + НашлиПользователя = НашлиПользователя + 1; + КонецЕсли; + ИначеЕсли ЗначениеПоля = СтрокаОтбора.Значение Тогда + НашлиПользователя = НашлиПользователя + 1; + КонецЕсли; + КонецЦикла; + + Если НашлиПользователя = Отбор.Количество() Тогда + Если Авторизован Тогда + ПервыйОтобранный = СтрокаТаблицы.Ссылка; + КонецЕсли; + МассивОтобранных.Добавить(СтрокаТаблицы.Ссылка); + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Если ПервыйОтобранный <> Неопределено Тогда + Результат.Добавить(ПервыйОтобранный); + ИначеЕсли МассивОтобранных.Количество() = 1 Тогда + Результат.Добавить(МассивОтобранных[0]); + ИначеЕсли МассивОтобранных.Количество() > 1 Тогда + Результат = МассивОтобранных; + ИначеЕсли Отбор.Количество() = 0 И ПервыйАвторизованный <> Неопределено Тогда + Результат.Добавить(ПервыйАвторизованный); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Инициализирует параметры сеанса учетной записи. +// Востребована в случае смены аутентификационных данных: логин, пароль и прочее. +// +// Параметры: +// НастройкиПользователя - СправочникСсылка.УчетныеЗаписиDSS +// - Структура - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПараметрыОперации - Структура, ФиксированнаяСтруктура - позволяет указать дополнительные параметры операции. +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция СброситьПараметрыСеансаУчетнойЗаписи(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + Если ТипЗнч(НастройкиПользователя) <> Тип("Структура") Тогда + КлючНастроек = НастройкиПользователя; + Иначе + КлючНастроек = СервисКриптографииDSSКлиентСервер.КлючНастроекПользователя(НастройкиПользователя); + КонецЕсли; + + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); + СервисКриптографииDSSСлужебный.ОбновитьНастройкиПользователя(КлючНастроек, ИсточникНастроек); + Результат = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(КлючНастроек, ИсточникНастроек); + Результат = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(Результат); + + Возврат Результат; + +КонецФункции + +// Формирует описание ошибки на основе ключевого слова +// см. СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки() +// +// Возвращаемое значение: +// Строка +// +Функция ПолучитьОписаниеОшибки(РезультатОперации, ТипОшибки, ТекстОшибки = "") Экспорт + + Возврат СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(РезультатОперации, ТипОшибки, ТекстОшибки); + +КонецФункции + +// Возвращает список доступных способов вторичной авторизации - для подтверждения операций +// см. СервисКриптографииDSS.СписокВторичнойАвторизации() +// +// Возвращаемое значение: +// Массив из ПеречислениеСсылка.СпособыАвторизацииDSS +// +Функция СписокВторичнойАвторизации(СервисПодписи = Неопределено) Экспорт + + Если СервисПодписи = Неопределено Тогда + Результат = СервисКриптографииDSS.СписокВторичнойАвторизации(Справочники.ЭкземплярыСервераDSS.ПустаяСсылка()); + Иначе + Результат = СервисКриптографииDSS.СписокВторичнойАвторизации(СервисПодписи); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Получает список учетных записей для пакетной работы с сообщениями +// см. СервисКриптографииDSSСлужебный.ПолучитьУчетныеЗаписи() +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи +// +Функция ПолучитьУчетныеЗаписи() Экспорт + + Возврат СервисКриптографииDSSСлужебный.ПолучитьУчетныеЗаписи(); + +КонецФункции + +// Получает идентификатор сертификата по отпечатку +// см. СервисКриптографииDSSСлужебный.ПолучитьСертификатПоСерийномуНомеру(). +// +// Возвращаемое значение: +// Структура - см. подробнее СервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоСерийномуНомеру. +// +Функция ПолучитьСертификатПоСерийномуНомеру(СерийныйНомер) Экспорт + + ДанныеСертификата = СервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоСерийномуНомеру(СерийныйНомер); + + Возврат ДанныеСертификата; + +КонецФункции + +// Получает список удостоверяющих центров из сессионных данных пользователя +// см. СервисКриптографииDSSСлужебный.ПолучитьИнформациюУдостоверяющихЦентров() +// +// Возвращаемое значение: +// Структура - см. подробнее СервисКриптографииDSSСлужебный.ПолучитьИнформациюУдостоверяющихЦентров. +// +Функция ПолучитьИнформациюУдостоверяющихЦентров(НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + Возврат СервисКриптографииDSS.ПолучитьИнформациюУдостоверяющихЦентров(НастройкиПользователя, ПараметрыОперации); + +КонецФункции + +// Делает запись в журнал регистрации, обычно при возникновении ошибки +// см. СервисКриптографииDSSСлужебный.ЗаписатьОшибкуВЖурналРегистрации() +// +Процедура ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ПараметрыВызова = Неопределено) Экспорт + + СервисКриптографииDSSСлужебный.ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ПараметрыВызова); + +КонецПроцедуры + +// Служит для сохранения конфиденциальных данных в безопасном хранилище +// см. СервисКриптографииDSSСлужебный.СохранитьДанныеБезопасногоХранилища() +// +Процедура СохранитьЗакрытыеДанные(ИдентификаторПользователя, Значение, ИмяЗначения = Неопределено) Экспорт + + СервисКриптографииDSSСлужебный.СохранитьЗакрытыеДанные(ИдентификаторПользователя, Значение, ИмяЗначения); + +КонецПроцедуры + +// Служит для сохранения конфиденциальных данных сертификатов в безопасном хранилище +// см. СервисКриптографииDSSСлужебный.СохранитьПинКодСертификата() +// +Процедура СохранитьПинКодСертификата(ИдентификаторПользователя, ОтпечатокСертификата, ПинКод) Экспорт + + СервисКриптографииDSSСлужебный.СохранитьПинКодСертификата(ИдентификаторПользователя, ОтпечатокСертификата, ПинКод); + +КонецПроцедуры + +// Проверяет результат авторизации пользователя с ожидаемой учетной записью +// см. СервисКриптографииDSSСлужебный.ПроверитьМаркерДоступа() +// +// Возвращаемое значение: +// Структура - см. подробнее СервисКриптографииDSSКлиентСервер.ОтветСервисаПоУмолчанию() +// +Функция ПроверитьМаркерДоступа(НастройкиПользователя, РезультатЗапроса, ПараметрыОперации = Неопределено) Экспорт + + ПодготовленныеНастройки = ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации); + Результат = СервисКриптографииDSS.ПроверитьМаркерДоступа(ПодготовленныеНастройки, РезультатЗапроса); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); + СервисКриптографииDSSСлужебный.УстановитьНастройкиПользователя(ПодготовленныеНастройки.Ссылка, ПодготовленныеНастройки, ИсточникНастроек); + + НастройкиПользователя = СервисКриптографииDSSСлужебный.ЗакрытьНастройкиПользователя(ПодготовленныеНастройки); + + Возврат Результат; + +КонецФункции + +// Формирует структуру для цикла подтверждения криптографической операции +// см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// +// Возвращаемое значение: +// Структура - СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); +// +Функция ДанныеВторичнойАвторизацииПоУмолчанию() Экспорт + + Возврат СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); + +КонецФункции + +// Функция-обертка, служит для получения значения полей объекта. +// см ОбщегоНазначения.ЗначенияРеквизитовОбъекта. +// +// Возвращаемое значение: +// см. ОбщегоНазначения.ЗначенияРеквизитовОбъекта +// +Функция ЗначенияРеквизитовОбъекта(СсылкаОбъекта, Реквизиты) Экспорт + + Результат = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаОбъекта, Реквизиты); + Возврат Результат; + +КонецФункции + +// Получает все используемые учетные записи облачной подписи. +// Подробнее в СервисКриптографииDSSСлужебный.ПолучитьВсеУчетныеЗаписи. +// +// Возвращаемое значение: +// Массив - элементы из ссылок справочника УчетныеЗаписиDSS +// +Функция ПолучитьВсеУчетныеЗаписи() Экспорт + + Результат = Новый Массив; + ВсеЗаписи = СервисКриптографииDSSСлужебный.ПолучитьВсеУчетныеЗаписи(); + + Для Каждого СтрокаТаблицы Из ВсеЗаписи Цикл + Результат.Добавить(СтрокаТаблицы.Ссылка); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Формирует настройки учетной записи по логину (без ссылки на справочник). +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ДополнитьНастройкиПользователя(СерверПодписи, ЛогинУчетнойЗаписи) Экспорт + + Если ТипЗнч(СерверПодписи) = СервисКриптографииDSSКлиентСервер.ПолучитьТипСервераОблачнойПодписи() Тогда + ВсеСерверы = СервисКриптографииDSSСлужебный.ПолучитьВсеСерверы(Новый Структура("Ссылка", СерверПодписи)); + Если ВсеСерверы.Количество() > 0 Тогда + ДанныеСервера = Новый Структура(); + ТекущаяСтрока = ВсеСерверы[0]; + Для Каждого СтрокаКолонки Из ВсеСерверы.Колонки Цикл + ДанныеСервера.Вставить(СтрокаКолонки.Имя, ТекущаяСтрока[СтрокаКолонки.Имя]); + КонецЦикла; + КонецЕсли; + Иначе + ДанныеСервера = СерверПодписи; + КонецЕсли; + + Результат = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + СервисКриптографииDSSСлужебный.ДополнитьНастройкиПользователя(Результат, ДанныеСервера, ЛогинУчетнойЗаписи); + + Возврат Результат; + +КонецФункции + +// Создает элементы справочников или обновляет их, по представленным данным +// см. Обработки.УправлениеПодключениемDSS.СоздатьУчетнуюЗаписьОблачнойПодписи +// +Функция СоздатьУчетнуюЗаписьОблачнойПодписи(ДанныеСервера, ЛогинУчетнойЗаписи) Экспорт + + Результат = Обработки.УправлениеПодключениемDSS.СоздатьУчетнуюЗаписьОблачнойПодписи( + ДанныеСервера, ЛогинУчетнойЗаписи, "", Истина); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ВспомогательныеПроцедурыИФункции + +// Служит для трансформации данных документа переданных в параметрах вызова. +// Если данные документа переданы как адрес в временном хранилище, то в фоновое задание нужно передать их как двоичные данные. +// При этом если нужно вернуть результат как адрес во временном хранилище, резервируются такие адреса. +// +Функция ТрансформироватьДанныеДокумента(ДанныеДокумента, ПараметрыОперации = Неопределено, ПараметрыВызова = Неопределено) + + Результат = ДанныеДокумента; + + ЭтоТранзакция = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ПараметрыОперации, "Транзакция", Ложь); + ТрансформироватьРезультат = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ПараметрыОперации, "ТрансформироватьРезультат"); + Если ТрансформироватьРезультат = Неопределено Тогда + ТрансформироватьРезультат = Новый Структура(); + ТрансформироватьРезультат.Вставить("ТипРезультата", "Неопределено"); + ТрансформироватьРезультат.Вставить("АдресаВременногоХранилища", Новый Массив); + КонецЕсли; + + ТипРезультата = ТрансформироватьРезультат.ТипРезультата; + МассивАдресов = Новый Массив; + + Если ТипЗнч(ДанныеДокумента) = Тип("Массив") Тогда + Для Счетчик = 1 По ДанныеДокумента.Количество() Цикл + СтрокаМассива = ДанныеДокумента[Счетчик - 1]; + ЕстьКонтент = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(СтрокаМассива, "Содержание"); + Если ЕстьКонтент <> Неопределено Тогда + ДанныеСтроки = ЕстьКонтент; + Иначе + ДанныеСтроки = СтрокаМассива; + КонецЕсли; + + Если ТипРезультата = "Неопределено" Тогда + ТипРезультата = СервисКриптографииDSSКлиентСервер.ПолучитьТипДанныхДокумента(ДанныеСтроки); + КонецЕсли; + + НуженАдрес = ТипРезультата = "АдресХранилища"; + АнализДанных = ПроверитьНаВременноеХранилище(ДанныеСтроки, ЭтоТранзакция, НуженАдрес); + + Если ЕстьКонтент <> Неопределено Тогда + СтрокаМассива.Содержание = АнализДанных.Результат; + Иначе + ДанныеДокумента[Счетчик - 1] = АнализДанных.Результат; + КонецЕсли; + МассивАдресов.Добавить(АнализДанных.НовыйАдрес); + КонецЦикла; + ТрансформироватьРезультат.ТипРезультата = ТипРезультата; + + ИначеЕсли ТипЗнч(ТипРезультата) = Тип("Массив") Тогда + Для Счетчик = 1 По ТипРезультата.Количество() Цикл + НуженАдрес = ТипРезультата[Счетчик - 1] = "АдресХранилища"; + АнализДанных = ПроверитьНаВременноеХранилище(Неопределено, ЭтоТранзакция, НуженАдрес); + Результат = АнализДанных.Результат; + МассивАдресов.Добавить(АнализДанных.НовыйАдрес); + КонецЦикла; + + Иначе + Если ТипРезультата = "Неопределено" Тогда + ТипРезультата = СервисКриптографииDSSКлиентСервер.ПолучитьТипДанныхДокумента(ДанныеДокумента); + ТрансформироватьРезультат.ТипРезультата = ТипРезультата; + КонецЕсли; + НуженАдрес = ТипРезультата = "АдресХранилища"; + АнализДанных = ПроверитьНаВременноеХранилище(ДанныеДокумента, ЭтоТранзакция, НуженАдрес); + Результат = АнализДанных.Результат; + МассивАдресов.Добавить(АнализДанных.НовыйАдрес); + + КонецЕсли; + + Если ПараметрыВызова <> Неопределено Тогда + //@skip-warning + ТрансформироватьРезультат.Вставить("АдресаВременногоХранилища", МассивАдресов); + ПараметрыВызова.Вставить("ТрансформироватьРезультат", ТрансформироватьРезультат); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция, необходима для обратной трансформации данных в случае необходимости +// см. ТрансформироватьДанныеДокумента +// +Функция ПроверитьНаВременноеХранилище(ДанныеДокумента, ЭтоТранзакция = Ложь, ПолучитьАдрес = Ложь) + + Результат = Новый Структура("Результат, НовыйАдрес", ДанныеДокумента, Неопределено); + + Если ТипЗнч(ДанныеДокумента) = Тип("Строка") + И ЭтоАдресВременногоХранилища(ДанныеДокумента) Тогда + Результат.НовыйАдрес = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + Если НЕ ЭтоТранзакция Тогда + Результат.Результат = ПолучитьИзВременногоХранилища(ДанныеДокумента); + КонецЕсли; + ИначеЕсли ПолучитьАдрес Тогда + Результат.НовыйАдрес = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ИначеЕсли ЭтоТранзакция Тогда + Результат.Результат = Неопределено; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция для передачи значения пин-кода в вызовы сервиса облачной подписи. +// Если ПинКод = Неопределено, то осуществляется попытка получения данных из сессионных данных. +// +// Параметры: +// ИдентификаторСертификата - Строка, Число, Структура - см. СервисКриптографииDSSКлиентСервер.НайтиСертификат +// ПинКод - Неопределено, Строка - значение пин-код +// ТекущиеНастройки - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +// Возвращаемое значение: +// Строка - значение пин-код, должен быть в закрытом виде +// +Функция ПроверитьПинКодСертификата(ИдентификаторСертификата, ПинКод, ТекущиеНастройки) + + Результат = ПинКод; + ПолучитьЗначение = Ложь; + + Если ТипЗнч(ПинКод) = Тип("Структура") И ПинКод.Состояние = 2 Тогда + ПолучитьЗначение = Истина; + ИначеЕсли ПинКод = Неопределено Тогда + ПолучитьЗначение = Истина; + КонецЕсли; + + Если ПолучитьЗначение Тогда + ОписаниеСертификата = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ТекущиеНастройки, ИдентификаторСертификата); + Результат = ОписаниеСертификата.ПинКод; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция, для подготовки структуры сессионных данных учетной записи для передачи в фоновое задание +// Восстанавливает конфиденциальные данные, т.к. без них невозможен вызов сервиса +// Также проверяет актуальность версий сессионных данных. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// - СправочникСсылка.УчетныеЗаписиDSS +// ПараметрыОперации - Неопределено +// - Структура +// +// Возвращаемое значение: +// см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ПодготовитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации = Неопределено) + + ТекущиеНастройки = СервисКриптографииDSSСлужебный.СкопироватьСтруктуру(НастройкиПользователя); + ИсточникНастроек = СервисКриптографииDSSСлужебный.ПолучитьИсточникНастроек(ПараметрыОперации); + + Если ТипЗнч(НастройкиПользователя) <> Тип("Структура") Тогда + СохраненныеНастройки = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(НастройкиПользователя, ИсточникНастроек); + ТекущиеНастройки = СохраненныеНастройки; + Иначе + КлючНастроек = СервисКриптографииDSSКлиентСервер.КлючНастроекПользователя(НастройкиПользователя); + СохраненныеНастройки = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(КлючНастроек, ИсточникНастроек); + КонецЕсли; + + Если СохраненныеНастройки = Неопределено Тогда + Результат = ТекущиеНастройки; + + ИначеЕсли ТекущиеНастройки.ВерсияНастройки < СохраненныеНастройки.ВерсияНастройки Тогда + Результат = СохраненныеНастройки; + + ИначеЕсли ТекущиеНастройки.ВерсияНастройки = СохраненныеНастройки.ВерсияНастройки Тогда + ТокенАвторизации = ТекущиеНастройки.ТокенАвторизации; + + ТекущиеНастройки.Пароль = ПроверитьКонфиденциальноеЗначение(ТекущиеНастройки.Пароль, СохраненныеНастройки.Пароль); + ТекущиеНастройки.ПарольСертификата = ПроверитьКонфиденциальноеЗначение(ТекущиеНастройки.ПарольСертификата, СохраненныеНастройки.ПарольСертификата); + ТокенАвторизации.Токен = ПроверитьКонфиденциальноеЗначение(ТокенАвторизации.Токен, СохраненныеНастройки.ТокенАвторизации.Токен, 0); + ТокенАвторизации.ТокенОбновления = ПроверитьКонфиденциальноеЗначение(ТокенАвторизации.ТокенОбновления, СохраненныеНастройки.ТокенАвторизации.ТокенОбновления, 0); + + Для каждого СтрокаКлюча Из ТекущиеНастройки.Сертификаты Цикл + НашлиСертификат = СохраненныеНастройки.Сертификаты[СтрокаКлюча.Ключ]; + Если НашлиСертификат <> Неопределено Тогда + СтрокаКлюча.Значение.ПинКод = ПроверитьКонфиденциальноеЗначение(СтрокаКлюча.Значение.ПинКод, НашлиСертификат.ПинКод); + КонецЕсли; + КонецЦикла; + Результат = ТекущиеНастройки; + + Иначе + Результат = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Проверки входящих данных. +// +// Параметры: +// ТекущееЗначение - Структура +// - Строка +// - Неопределено +// СохраненноеЗначение - Структура +// - Строка +// - Неопределено +// Состояние - Число +// +// Возвращаемое значение: +// Структура +// +Функция ПроверитьКонфиденциальноеЗначение(ТекущееЗначение, СохраненноеЗначение, Состояние = 1) + + НужноПреобразовать = ТипЗнч(СохраненноеЗначение) = Тип("Строка"); + + Если ТипЗнч(ТекущееЗначение) = Тип("Структура") Тогда + Результат = ТекущееЗначение; + + Если ТекущееЗначение.Состояние = 2 Тогда + Результат = СохраненноеЗначение; + Иначе + НужноПреобразовать = Ложь; + КонецЕсли; + + ИначеЕсли ТекущееЗначение = Неопределено Тогда + Результат = СохраненноеЗначение; + + КонецЕсли; + + Если НужноПреобразовать Тогда + Результат = СервисКриптографииDSSКлиентСервер.ОбъектПароля(Результат, Состояние); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная функция, для подготовки данных документа получаемых из БД +// +// Параметры: +// ОписаниеДанных - Структура: +// * Ссылка - СправочникСсылка, ДокументСсылка - данные для позиционирования на элементе с данными +// * Реквизит - Строка - имя реквизита с типом "ХранилищеЗначения" +// +// Возвращаемое значение: +// - Неопределено +// - ДвоичныеДанные +// +Функция ПолучитьДанныеБазыПоСсылке(ОписаниеДанных) Экспорт + + СсылкаБД = ОписаниеДанных.Ссылка; + ДанныеДокумента = Неопределено; + ДанныеРеквизита = Неопределено; + + Если ЗначениеЗаполнено(СсылкаБД) Тогда + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(СсылкаБД)) Тогда + ДанныеРеквизита = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаБД, ОписаниеДанных.Реквизит); + КонецЕсли; + КонецЕсли; + + Если ТипЗнч(ДанныеРеквизита) = Тип("ХранилищеЗначения") Тогда + ДанныеДокумента = ДанныеРеквизита.Получить(); + КонецЕсли; + + Если ТипЗнч(ДанныеДокумента) <> Тип("ДвоичныеДанные") Тогда + ЗаписатьОшибкуВЖурналРегистрации( + НСтр("ru = 'Объект содержит некорректные данные'"), ОписаниеДанных); + КонецЕсли; + + Возврат ДанныеДокумента; + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/СервисКриптографииDSSСлужебныйВызовСервера.mdo b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/СервисКриптографииDSSСлужебныйВызовСервера.mdo new file mode 100644 index 000000000..77eaf9386 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйВызовСервера/СервисКриптографииDSSСлужебныйВызовСервера.mdo @@ -0,0 +1,10 @@ + + + СервисКриптографииDSSСлужебныйВызовСервера + + ru + Сервис криптографии DSS служебный вызов сервера + + true + true + diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/Module.bsl new file mode 100644 index 000000000..70fe8a438 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/Module.bsl @@ -0,0 +1,7702 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Клиентские процедуры и функции общего назначения: +// - модуль предназначен для организации работы сервиса на стороне клиента +// +//////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +// Практически во всех вызовах базовых операций сервера DSS предусмотрена возможность передать уточняющие настройки через +// структуру "ПараметрыОперации". Для каждого вида операции предусмотрен свой набор настроек, +// но есть ряд параметров, которые являются общими для всех видов операций. +// +// 1. Через механизм "ПараметрыОперации" предусмотрена возможность подмены базовых форм, на указанные в параметрах +// Механизм подмены форм. Для его задействования необходимо передать ключ, как идентификатор формы и значение полный +// путь к "своей" форме. При открытии формы также передаются параметры операции, как поле "ПараметрыОперации" +// Обрабатываемые ключи форм: +// - ФормаВывестиОшибку +// - ФормаВводПароля +// - ФормаВводПинКода +// - ФормаВебАутентификация +// - ФормаНовыйЗапросНаСертификат +// - ФормаСменаПинКода +// - ФормаСписокСертификатов +// - ФормаСостояниеУчетнойЗаписи +// - ФормаСвойствоСертификата +// - ФормаВыборТекущейУчетнойЗаписи +// - ФормаФормаУчетнойЗаписи +// - ФормаФормаЭкземпляраСервераDSS +// - ФормаВыборЭкземпляровСервераDSS +// - ФормаПроверкаСервиса +// - ФормаВыборСервисаИзОписания +// - ФормаПроверкаСервиса +// +// 2. Механизм трансформации данных. +// Логика возврата обработанных данных следующая: данные возвращаются с тем же типом, с каким вызывались. +// Если документ передали как "ДвоичныеДанные", то и результат будет имеет тот же тип. Предусмотрено три типов передачи +// данных: +// - "ДвоичныеДанные" +// - "АдресХранилища" +// - "Base64" - строка в Base64 +// Но т.к. для взаимодействия клиентских вызовов с сервером используется асинхронные вызовы через фоновые задания, то +// в случае передачи данных в виде адреса временного хранилища, требуется предварительное получение данных из хранилища +// в двоичном (строчном) виде. При возврате обработанных данных они снова помещаются во временное хранилище +// (другой адрес), т.е. происходит неявная трансформация. Но также подобный механизм можно задействовать для изменения +// логики работы возврата результата, через поле "ТрансформироватьРезультат" +// - ТрансформироватьРезультат - Неопределено, Структура - +// если передана структура, то у него должно быть поле "ТипРезультата" с вышеописанными вариантами +// +// 3. Контроль дублирования запуска одной и той же операции. +// Если в интерфейсе пользователя не предусмотрена возможность блокировки повторного нажатия кнопок, полей ввода и +// прочих элементов, то возможна ситуация, когда будет запущено несколько асинхронных сеансов для выполнения одной +// логической операции. Одна из возможностей этого не допустить, таким операциям присваивать идентификаторы, тогда +// при создании фоновых операций будет контролироваться дублирование идентификаторов +// - ИдентификаторОперации - Строка - произвольное уникальное обозначение, обычно уникальный идентификатор формы +// +// 4. Отображение ошибок пользователю средствами базового АПИ. +// - ОтобразитьОшибку - Булево, если Истина, то будет отображаться базовая форма с ошибкой +// +// 5. Отображение окна ожидания при выполнении асинхронной операции. +// - ОжидатьВыполнения - Форма, Булево - если передано это поле, то будет отображено окно ожидания. Если оно имеет +// тип Форма, то она будет установлена как владелец формы ожидания. +// +// 6. Указание режима нужного открытия формы, например режимы "Блокировка владельца" или "Независимый". По умолчанию +// формы открываются как заложено в конфигураторе. Но можно изменить подобный сценарий, передав поле +// - РежимОткрытияОкна - РежимОткрытияОкнаФормы - нужный тип режима открытия формы +// +// 7. Для ряда операций предусмотрено использование механизма псевдонимов, т.е. в структуре ответа будут присутствовать +// поля с именами которые указали при вызове, иначе стандартные поля ответа предусмотренные изначально. +// В структуру ПараметровОперации необходимо добавить поле "Псевдонимы" со значением структуры, где +// Ключ - стандартное имя +// Значение - альтернативное имя поля. +// Также, если в псевдонимах будет передаваться поле "ИнформацияОбОшибке", для него будет сформирован объект ИнформацияОбОшибке +// +// 8. Многие операции сопровождаются интерактивными формами, для отображения дополнительных пояснений на этих формах +// предусмотрено поле "ПояснениеОперации" с типом строка +// +// 9. Часть ошибок возникающих при работе, таких "Не правильный пароль", "Не правильный пин-код" и прочее, обрабатывает сама. +// Если такое поведение не требуется, то нужно передать параметр: +// - ОбработкаОшибок - Булево, если Ложь, то происходит прекращение выполнения цикла криптооперации +// +// 10. В подсистеме предусмотрена возможность выбора места хранения сессионных данных пользователей сервиса. +// Сессионные данные позволяют кешировать данные о политике настроек учетной записи на сервере, маркер безопасности и прочее. +// По-умолчанию для хранения сессионных данных используется параметр сеанса, но также есть возможность хранить их в регистре +// "БезопасноеХранилищеДанных" +// - ИсточникНастроек - Строка - допустимо два варианта определенны в функциях +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекПараметрыСеанса() - по-умолчанию +// СервисКриптографииDSSКлиентСервер.ИсточникНастроекХранилище() +// +// 11. Предусмотрено регулирование режима выполнения операций в синхронном режиме или фоновом режиме. +// По-умолчанию синхронный режим не применяется для ВебКлиентов. Для изменения режима по-умолчанию, нужно передать параметр: +// - СинхронныйРежим - Булево +// + +#Область АутентификацияПоЛогину + +// Запускает цикл аутентификации по логину и паролю +// Данный вариант возможно использовать, если в настройках DSS включен режим: +// "Методы первичной аутентификации: Аутентификация по паролю" +// +// Шаги цикла авторизации: +// 1. подготовка параметров цикла +// 2. при наличии ранее введенного пароля, запуск задания аутентификации (4) +// 3. ожидание ввода пароля пользователя +// 4. запуск задания аутентификации +// 5. проверка успешности ввода, если пароль неправильный, то цикл запускает заново (3) +// 6. сохранение нового токена для сеанса, возврат в случае успеха новых настроек пользователя. +// +Процедура АутентификацияПоЛогину(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + + ПараметрыВызова = Новый Структура(); + ПараметрыВызова.Вставить("ВидОперации", НСтр("ru = 'Авторизация по логину'", КодЯзыка())); + ПараметрыВызова.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыВызова.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыВызова.Вставить("ПараметрыОперации", ВходящиеПараметры); + ПараметрыВызова.Вставить("Сохранить", Ложь); + ПараметрыВызова.Вставить("Пароль", СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3)); + ПараметрыВызова.Вставить("РежимСохранения", ?(СвойствоСтруктуры(ВходящиеПараметры, "СохранитьПароль", Ложь), + "Обязательно", "Опционально")); + + ПарольПользователя = СвойствоСтруктуры(ВходящиеПараметры, "ПарольПользователя"); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыВызова) Тогда + Если НЕ ЗначениеЗаполнено(ПарольПользователя) Тогда + ПарольПользователя = НастройкиПользователя.Пароль; + КонецЕсли; + + Если НЕ ТребуетсяВводКонфиденциальныхДанных(ПарольПользователя) + И ПараметрыВызова.РежимСохранения <> "Обязательно" Тогда + РезультатВвода = ОтветСервисаПоУмолчанию(); + РезультатВвода.Вставить("Результат", ПарольПользователя); + РезультатВвода.Вставить("Сохранить", Ложь); + АутентификацияПоЛогинуПолучениеПароля(РезультатВвода, ПараметрыВызова); + Иначе + АутентификацияПоЛогинуЗапросПароля(Неопределено, ПараметрыВызова); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоЛогину. +Процедура АутентификацияПоЛогинуЗапросПароля(РезультатВыбора, ВходящийКонтекст) Экспорт + + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияПоЛогинуПолучениеПароля", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ОткрытьФормуВводПароля( + ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + "Пароль", + ВходящийКонтекст.РежимСохранения, + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоЛогину. +Процедура АутентификацияПоЛогинуПолучениеПароля(РезультатВыбора, ВходящийКонтекст) Экспорт + + Если РезультатВыбора.Выполнено Тогда + ВходящийКонтекст.Вставить("Сохранить", РезультатВыбора.Сохранить); + ВходящийКонтекст.Вставить("Пароль", РезультатВыбора.Результат); + ВходящийКонтекст.НастройкиПользователя.Пароль = РезультатВыбора.Результат; + + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияПоЛогинуПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ДлительнаяОперация = СервисКриптографииDSSСлужебныйВызовСервера.АутентификацияПоЛогину(ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + ДлительнаяОперация, + ВходящийКонтекст.ПараметрыОперации); + Иначе + АутентификацияПоЛогинуРезультат(РезультатВыбора, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоЛогину. +Процедура АутентификацияПоЛогинуПослеВыполнения(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + Если ВходящийКонтекст.Сохранить Тогда + СохранитьЗакрытыеДанные(НастройкиПользователя.УникальныйИдентификатор, ВходящийКонтекст.Пароль, "Пароль"); + КонецЕсли; + Иначе + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + НастройкиПользователя.Пароль = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + ИзменитьСчетчикПопыток(НастройкиПользователя, РезультатВыполнения.Выполнено); + РезультатВыполнения.Вставить("НастройкиПользователя", НастройкиПользователя); + + Если СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) + И НЕ НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияПоЛогинуЗапросПароля", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОтобразитьОшибкуПользователю(ОповещениеСледующее, РезультатВыполнения.Ошибка, , ВходящийКонтекст.ПараметрыОперации); + Иначе + АутентификацияПоЛогинуРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоЛогину. +Процедура АутентификацияПоЛогинуРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область АутентификацияПоСертификату + +// Запускает цикл авторизации по сертификату авторизации. +// На данный момент работает только сертификат с закрытым ключом выпущенный с использованием алгоритма RSA и +// экспортированный в файл PFX, доступ к которому запрашивается пароль +// Данный вариант возможно использовать, если в настройках DSS включен режим: +// "Методы первичной аутентификации: Аутентификация по сертификату" +// +// Шаги цикла: +// 1. подготовка параметров цикла авторизации +// 2. при наличии ранее введенного пароля, запуск задания аутентификации (4) +// 3. ожидание ввода пароля пользователя +// 4. запуск задания аутентификации +// 5. проверка успешности ввода, если пароль неправильный, то цикл запускает заново (3) +// 6. сохранение нового токена для сеанса, возврат в случае успеха новых настроек пользователя. +// +Процедура АутентификацияПоСертификату(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + + ПараметрыВызова = Новый Структура(); + ПараметрыВызова.Вставить("ВидОперации", НСтр("ru = 'Авторизация по сертификату'", КодЯзыка())); + ПараметрыВызова.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыВызова.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыВызова.Вставить("ПараметрыОперации", ВходящиеПараметры); + ПараметрыВызова.Вставить("Сохранить", Ложь); + ПараметрыВызова.Вставить("Пароль", СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3)); + ПараметрыВызова.Вставить("РежимСохранения", ?(СвойствоСтруктуры(ВходящиеПараметры, "СохранитьПароль", Ложь), + "Обязательно", "Опционально")); + + ПарольПользователя = СвойствоСтруктуры(ВходящиеПараметры, "ПарольПользователя"); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыВызова) Тогда + Если НЕ ЗначениеЗаполнено(ПарольПользователя) Тогда + ПарольПользователя = НастройкиПользователя.ПарольСертификата; + КонецЕсли; + + Если НЕ ТребуетсяВводКонфиденциальныхДанных(ПарольПользователя) + И ПараметрыВызова.РежимСохранения <> "Обязательно" Тогда + РезультатВвода = ОтветСервисаПоУмолчанию(); + РезультатВвода.Вставить("Сохранить", Ложь); + РезультатВвода.Вставить("Результат", ПарольПользователя); + АутентификацияПоСертификатуПолучениеПинКода(РезультатВвода, ПараметрыВызова); + Иначе + АутентификацияПоСертификатуЗапросПинКода(Неопределено, ПараметрыВызова); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоСертификату. +Процедура АутентификацияПоСертификатуЗапросПинКода(РезультатВыбора, ВходящийКонтекст) Экспорт + + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияПоСертификатуПолучениеПинКода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ОткрытьФормуВводПароля( + ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + "ПинКод", + ВходящийКонтекст.РежимСохранения, + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоСертификату. +Процедура АутентификацияПоСертификатуПолучениеПинКода(РезультатВыбора, ВходящийКонтекст) Экспорт + + Если РезультатВыбора.Выполнено Тогда + СертификатАвторизации = СвойствоСтруктуры(РезультатВыбора, "СертификатАвторизации"); + + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + Если СертификатАвторизации <> Неопределено Тогда + ПараметрыОперации.Вставить("СертификатАвторизации", СертификатАвторизации); + КонецЕсли; + + ВходящийКонтекст.Вставить("Сохранить", РезультатВыбора.Сохранить); + ВходящийКонтекст.Вставить("Пароль", РезультатВыбора.Результат); + ВходящийКонтекст.НастройкиПользователя.ПарольСертификата = РезультатВыбора.Результат; + + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияПоСертификатуПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.АутентификацияПоСертификату(ВходящийКонтекст.НастройкиПользователя, ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + АутентификацияПоСертификатуРезультат(РезультатВыбора, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоСертификату. +Процедура АутентификацияПоСертификатуПослеВыполнения(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + Если ВходящийКонтекст.Сохранить Тогда + СохранитьЗакрытыеДанные(НастройкиПользователя.УникальныйИдентификатор, ВходящийКонтекст.Пароль, "ПарольСертификата"); + КонецЕсли; + Иначе + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + НастройкиПользователя.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + ИзменитьСчетчикПопыток(НастройкиПользователя, РезультатВыполнения.Выполнено); + + Если СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) + И НЕ НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияПоСертификатуЗапросПинКода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОтобразитьОшибкуПользователю(ОповещениеСледующее, РезультатВыполнения.Ошибка, , ВходящийКонтекст.ПараметрыОперации); + Иначе + РезультатВыполнения.МаркерОбновлен = Истина; + РезультатВыполнения.Вставить("НастройкиПользователя", НастройкиПользователя); + АутентификацияПоСертификатуРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияПоСертификату. +Процедура АутентификацияПоСертификатуРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область АутентификацияДвухФакторная + +// Запускает цикл двухфакторной аутентификации (с подтверждением) +// Данный вариант возможно использовать, если в настройках DSS включены режимы: +// "Методы первичной аутентификации: Аутентификация по паролю" +// "Подтверждение операций: Выпуск маркера", +// иначе произойдет обычная авторизация по логину и паролю или выдаст ошибку +// +// Шаги цикла: +// 1. подготовка параметров цикла авторизации +// 2. при наличии ранее введенного пароля, запуск задания аутентификации (4) +// 3. ожидание ввода пароля пользователя +// 4. запуск вложенного процесса подтверждения +// 5. проверка успешности ввода, если пароль неправильный, то цикл запускает заново (3) +// 6. сохранение нового токена для сеанса +// 7. обновления политик учетной записи +// 8. возврат в случае успеха новых настроек пользователя. +// +Процедура АутентификацияДвухФакторная(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + + ПараметрыВызова = Новый Структура(); + ПараметрыВызова.Вставить("ВидОперации", НСтр("ru = 'Авторизация двух-факторная'", КодЯзыка())); + ПараметрыВызова.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыВызова.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыВызова.Вставить("ПараметрыОперации", ВходящиеПараметры); + ПараметрыВызова.Вставить("Сохранить", Ложь); + ПараметрыВызова.Вставить("Пароль", СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3)); + ПараметрыВызова.Вставить("РежимСохранения", ?(СвойствоСтруктуры(ВходящиеПараметры, "СохранитьПароль", Ложь), + "Обязательно", "Опционально")); + + ПарольПользователя = СвойствоСтруктуры(ВходящиеПараметры, "ПарольПользователя"); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыВызова) Тогда + Если НЕ ЗначениеЗаполнено(ПарольПользователя) Тогда + ПарольПользователя = НастройкиПользователя.Пароль; + КонецЕсли; + + Если НЕ ТребуетсяВводКонфиденциальныхДанных(ПарольПользователя) + И ПараметрыВызова.РежимСохранения <> "Обязательно" Тогда + РезультатВвода = ОтветСервисаПоУмолчанию(); + РезультатВвода.Вставить("Результат", ПарольПользователя); + РезультатВвода.Вставить("Сохранить", Ложь); + АутентификацияДвухФакторнаяПолучениеПароля(РезультатВвода, ПараметрыВызова); + Иначе + АутентификацияДвухФакторнаяЗапросПароля(Неопределено, ПараметрыВызова); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияДвухФакторная. +Процедура АутентификацияДвухФакторнаяЗапросПароля(РезультатВызова, ВходящийКонтекст) Экспорт + + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияДвухФакторнаяПолучениеПароля", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПояснениеОперации = НСтр("ru = 'Введите пароль для авторизации.'", КодЯзыка()); + ВходящийКонтекст.ПараметрыОперации.Вставить("ПояснениеОперации", ПояснениеОперации); + + ОткрытьФормуВводПароля( + ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + "Пароль", + ВходящийКонтекст.РежимСохранения, + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры АутентификацияДвухФакторная. +Процедура АутентификацияДвухФакторнаяПолучениеПароля(РезультатВызова, ВходящийКонтекст) Экспорт + + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияДвухФакторнаяПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + Если РезультатВызова.Выполнено Тогда + ВходящийКонтекст.Вставить("Сохранить", РезультатВызова.Сохранить); + ВходящийКонтекст.Вставить("Пароль", РезультатВызова.Результат); + ВходящийКонтекст.НастройкиПользователя.Пароль = РезультатВызова.Результат; + + ПараметрыПодтверждения = Новый Структура(); + ПараметрыПодтверждения.Вставить("ИдентификаторТранзакции", ""); + ПараметрыПодтверждения.Вставить("ТипПодтверждения", "Аутентификация"); + ПараметрыПодтверждения.Вставить("ЗаголовокФормы", НСтр("ru = 'Подтвердите аутентификацию'", КодЯзыка())); + + ПодтвердитьОперацию(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ПараметрыПодтверждения); + + Иначе + АутентификацияДвухФакторнаяРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияДвухФакторная. +Процедура АутентификацияДвухФакторнаяПослеВыполнения(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + ПродолжитьАвторизацию = Ложь; + + Если РезультатВыполнения.Выполнено = Истина Тогда + НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + РезультатВыполнения.МаркерОбновлен = Истина; + Если ВходящийКонтекст.Сохранить Тогда + СохранитьЗакрытыеДанные(НастройкиПользователя.УникальныйИдентификатор, ВходящийКонтекст.Пароль, "Пароль"); + КонецЕсли; + + Если НЕ НастройкиПользователя.Политика.Заполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияДвухФакторнаяПослеОбновленияПолитики", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + ПодключитьФормуОжидания(ПараметрыОперации, Истина); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьПолитикуПользователя( + ВходящийКонтекст.НастройкиПользователя, + ПараметрыОперации), + ПараметрыОперации); + ПродолжитьАвторизацию = Истина; + КонецЕсли; + + Иначе + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + + КонецЕсли; + ИзменитьСчетчикПопыток(НастройкиПользователя, РезультатВыполнения.Выполнено); + + Если СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) + И НЕ НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияДвухФакторнаяЗапросПароля", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОтобразитьОшибкуПользователю(ОповещениеСледующее, РезультатВыполнения.Ошибка, , ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли НЕ ПродолжитьАвторизацию Тогда + РезультатВыполнения.МаркерОбновлен = Истина; + РезультатВыполнения.Вставить("НастройкиПользователя", НастройкиПользователя); + АутентификацияДвухФакторнаяРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияДвухФакторная. +Процедура АутентификацияДвухФакторнаяПослеОбновленияПолитики(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + РезультатВыполнения.МаркерОбновлен = Истина; + НовыеНастройки = РезультатВыполнения.НастройкиПользователя; + ПроверитьТокенНаОбновление(РезультатВыполнения, ВходящийКонтекст.НастройкиПользователя); + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьНастройкиПользователя(ВходящийКонтекст.НастройкиПользователя, НовыеНастройки); + КонецЕсли; + + АутентификацияДвухФакторнаяРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры АутентификацияДвухФакторная. +Процедура АутентификацияДвухФакторнаяРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область АутентификацияЧерезВебФорму + +// Запускает цикл авторизации через web-форму +// Данный вариант возможно использовать, если в настройках DSS включен режим: +// "Методы первичной аутентификации: Аутентификация по паролю" или +// "Методы первичной аутентификации: Только идентификация" +// +// Шаги цикла: +// 1. подготовка параметров цикла авторизации +// 2. открытие и ожидание ввода в web-форме +// 3. получение результата аутентификации в форме +// 4. сохранение нового токена для сеанса, возврат в случае успеха новых настроек пользователя. +// +Процедура АутентификацияЧерезВебФорму(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыВызова = Новый Структура(); + ПараметрыВызова.Вставить("ВидОперации", НСтр("ru = 'Авторизация интерактивная'", КодЯзыка())); + ПараметрыВызова.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыВызова.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыВызова.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыВызова) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АутентификацияЧерезВебФормуПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыВызова); + + ОткрытьФормуВебАутентификации(НастройкиПользователя, ОповещениеСледующее, ПараметрыВызова.ПараметрыОперации); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АутентификацияЧерезВебФорму. +Процедура АутентификацияЧерезВебФормуПослеВыполнения(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + НастройкиПользователя = РезультатВызова.НастройкиПользователя; + ИзменитьСчетчикПопыток(НастройкиПользователя, Истина); + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьНастройкиПользователя( + НастройкиПользователя, + НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации); + РезультатВызова.МаркерОбновлен = Истина; + РезультатВызова.Вставить("НастройкиПользователя", НастройкиПользователя); + Иначе + ИзменитьСчетчикПопыток(ВходящийКонтекст.НастройкиПользователя, Ложь); + КонецЕсли; + + АутентификацияЧерезВебФормуРезультат(РезультатВызова, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры АутентификацияЧерезВебФорму. +Процедура АутентификацияЧерезВебФормуРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПроверкаВыбранногоПользователя + +// Запускает цикл проверки выбранной учетной записи +// +// Шаги цикла: +// 1. подготовка параметров цикла проверки +// 2. если учетная запись не передана в параметрах вызова, то пользователю предлагается самостоятельно выбрать +// 3. возврат в случае успеха настроек выбранного пользователя. +// +Процедура ПроверкаВыбранногоПользователя(ОповещениеОЗавершении, НастройкиПользователя, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Проверка выбранного пользователя'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + СписокУчетныхЗаписей = СвойствоСтруктуры(ПараметрыОперации, "СписокУчетныхЗаписей", Новый Массив); + ПоказатьСписок = СвойствоСтруктуры(ПараметрыОперации, "ПоказатьСписок", Ложь); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + ВыбранПользователь = Неопределено; + Если СписокУчетныхЗаписей.Количество() = 1 Тогда + ВыбранПользователь = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(СписокУчетныхЗаписей[0], ПараметрыОперации); + ПараметрыЦикла.НастройкиПользователя = ВыбранПользователь; + ИначеЕсли НастройкиПользователя = Неопределено + ИЛИ НЕ ЗначениеЗаполнено(НастройкиПользователя.Логин) Тогда + СписокУчетныхЗаписей = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьВсеУчетныеЗаписи(); + Если СписокУчетныхЗаписей.Количество() = 1 И НЕ ПоказатьСписок Тогда + ВыбранПользователь = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(СписокУчетныхЗаписей[0], ПараметрыОперации); + ПараметрыЦикла.НастройкиПользователя = ВыбранПользователь; + КонецЕсли; + Иначе + ВыбранПользователь = НастройкиПользователя; + КонецЕсли; + + Если ВыбранПользователь = Неопределено Тогда + ПроверкаВыбранногоПользователяВыборИзСписка(ПараметрыЦикла); + Иначе + ПроверкаВыбранногоПользователяРезультат(ОтветСервисаПоУмолчанию(), ПараметрыЦикла); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверкаВыбранногоПользователя. +Процедура ПроверкаВыбранногоПользователяВыборИзСписка(ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверкаВыбранногоПользователяПослеВыбора", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ОткрытьФормуВыбораУчетнойЗаписи(ОповещениеСледующее, ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ПроверкаВыбранногоПользователя. +Процедура ПроверкаВыбранногоПользователяПослеВыбора(РезультатВыбора, ВходящийКонтекст) Экспорт + + Если РезультатВыбора.Выполнено Тогда + ВходящийКонтекст.НастройкиПользователя = РезультатВыбора.Результат; + КонецЕсли; + + ПроверкаВыбранногоПользователяРезультат(РезультатВыбора, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ПроверкаВыбранногоПользователя. +Процедура ПроверкаВыбранногоПользователяРезультат(РезультатВыполнения, ВходящийКонтекст) + + Если РезультатВыполнения.Выполнено Тогда + РезультатВыполнения.Вставить("Результат", ВходящийКонтекст.НастройкиПользователя); + КонецЕсли; + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +#Область ПроверкаАутентификацииПользователя + +// Продолжение процедуры ПроверкаАутентификацииПользователяПослеВыбора. +Функция ТокенАвторизацииУстарел(НастройкиПользователя) + + Результат = Неопределено; + + Если НЕ ТребуетсяВводКонфиденциальныхДанных(НастройкиПользователя.ТокенАвторизации.Токен) Тогда + ДатаСеанса = ДатаСеанса(); + Если НЕ ТребуетсяВводКонфиденциальныхДанных(НастройкиПользователя.ТокенАвторизации.ТокенОбновления) Тогда + Результат = Ложь; + ИначеЕсли НастройкиПользователя.ТокенАвторизации.СрокДействия > ДатаСеанса Тогда + Результат = Ложь; + Иначе + Результат = Истина; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Запускает цикл проверки валидности токена подключения для учетной записи +// Служебный цикл, в основном предназначен для запуска из других циклов +// +// Шаги цикла: +// 1. подготовка параметров цикла проверки +// 2. выбор учетной записи в случае необходимости +// 3. сохранение нового токена для сеанса, возврат в случае успеха новых настроек пользователя, +// если после выбора аутентификация прошла успешно. +// +Процедура ПроверкаАутентификацииПользователя(ОповещениеОЗавершении, ВходящийКонтекст, ЭтоОшибка = Ложь, Принудительно = Ложь) Экспорт + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + + Если ВходящийКонтекст.Свойство("ПараметрыОперации") Тогда + ВходящиеПараметры = ПроверитьПараметрыОперации(ВходящийКонтекст.ПараметрыОперации); + Иначе + ВходящиеПараметры = ПроверитьПараметрыОперации(Неопределено); + КонецЕсли; + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Проверка авторизации пользователя'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ВходящийКонтекст", ВходящийКонтекст); + ПараметрыЦикла.Вставить("Принудительно", Принудительно); + ПараметрыЦикла.Вставить("ЭтоОшибка", ЭтоОшибка); + ПараметрыЦикла.Вставить("ПараметрыОперации", ВходящиеПараметры); + + Если ИспользованиеОблачнойПодписиВозможно(ВходящийКонтекст) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверкаАутентификацииПользователяПослеВыбора", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаВыбранногоПользователя(ОповещениеСледующее, НастройкиПользователя, ВходящиеПараметры); + КонецЕсли; + +КонецПроцедуры + +// Служит для максимизации процесса выбора подходящей учетной записи без интерактивного выбора +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения - указывает процедуру для получения результата операции. +// ВходящийКонтекст - Структура +// Отбор - Соответствие - поиск подходящей учетной записи +// +Процедура ПроверкаАутентификацииПользователяСОтбором(ОповещениеОЗавершении, ВходящийКонтекст, Отбор) + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + + Если ВходящийКонтекст.Свойство("ПараметрыОперации") Тогда + ВходящиеПараметры = ПроверитьПараметрыОперации(ВходящийКонтекст.ПараметрыОперации); + Иначе + ВходящиеПараметры = ПроверитьПараметрыОперации(Неопределено); + КонецЕсли; + + НашлиНастройки = Новый Массив; + Если НастройкиПользователя = Неопределено Тогда + ВсеНастройки = СервисКриптографииDSSСлужебныйВызовСервера.ПодобратьНастройкиПользователя(Отбор, ВходящиеПараметры); + Если ВсеНастройки.Количество() = 1 Тогда + НастройкиПользователя = СервисКриптографииDSSКлиент.ПолучитьНастройкиПользователя(ВсеНастройки[0], ВходящиеПараметры); + ИначеЕсли ВсеНастройки.Количество() > 0 Тогда + НашлиНастройки = ВсеНастройки; + КонецЕсли; + КонецЕсли; + + ВходящиеПараметры.Вставить("СписокУчетныхЗаписей", НашлиНастройки); + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Проверка авторизации пользователя'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ВходящийКонтекст", ВходящийКонтекст); + ПараметрыЦикла.Вставить("ПараметрыОперации", ВходящиеПараметры); + ПараметрыЦикла.Вставить("Принудительно", Ложь); + ПараметрыЦикла.Вставить("ЭтоОшибка", Ложь); + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверкаАутентификацииПользователяПослеВыбора", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаВыбранногоПользователя(ОповещениеСледующее, НастройкиПользователя, ВходящиеПараметры); + +КонецПроцедуры + +// Продолжение процедуры ПроверкаАутентификацииПользователя. +Процедура ПроверкаАутентификацииПользователяПослеВыбора(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + НастройкиПользователя = РезультатВызова.Результат; + ВходящийКонтекст.ВходящийКонтекст.НастройкиПользователя = НастройкиПользователя; + ВходящийКонтекст.НастройкиПользователя = НастройкиПользователя; + ВидАутентификации = НастройкиПользователя.ПервичнаяАутентификация; + ПарольПользователя = СвойствоСтруктуры(ВходящийКонтекст.ПараметрыОперации, "ПарольПользователя"); + + ВызватьДиалог = Ложь; + ВызватьФоновоеЗадание = Ложь; + ЭтоОшибка = ВходящийКонтекст.ЭтоОшибка; + Принудительно = ВходящийКонтекст.Принудительно; + ТокенУстарел = ТокенАвторизацииУстарел(НастройкиПользователя); + + Если ПарольПользователя <> Неопределено Тогда + ТекущийПароль = ПарольПользователя; + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации") Тогда + ТекущийПароль = НастройкиПользователя.ПарольСертификата; + Иначе + ТекущийПароль = НастройкиПользователя.Пароль; + КонецЕсли; + + ПустойПароль = ТребуетсяВводКонфиденциальныхДанных(ТекущийПароль); + + Если Принудительно Тогда + ВызватьФоновоеЗадание = Истина; + Если ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") Тогда + ВызватьДиалог = Истина; + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_КодАвторизации") Тогда + ВызватьДиалог = Истина; + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации") Тогда + ВызватьДиалог = ПустойПароль; + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_УчетныеДанные") Тогда + ВызватьДиалог = ПустойПароль; + КонецЕсли; + Иначе + Если ТокенУстарел = Неопределено Тогда + ВызватьФоновоеЗадание = Истина; + КонецЕсли; + + Если ТокенУстарел <> Ложь ИЛИ ЭтоОшибка Тогда + Если ЭтоОшибка Тогда + НастройкиПользователя.Пароль = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + НастройкиПользователя.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + + Если ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") Тогда + КлючДействия = СервисКриптографииDSSКлиентСервер.СвойствоВыполняемойОперации(НастройкиПользователя, "ВыпускМаркера"); + ВызватьДиалог = ПустойПароль ИЛИ ЭтоОшибка ИЛИ КлючДействия.Подтверждать; + ВызватьФоновоеЗадание = НЕ ВызватьДиалог; + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_КодАвторизации") Тогда + ВызватьДиалог = Истина; + ВызватьФоновоеЗадание = Ложь; + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации") Тогда + ВызватьДиалог = ПустойПароль ИЛИ ЭтоОшибка; + ВызватьФоновоеЗадание = НЕ ВызватьДиалог; + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_УчетныеДанные") Тогда + ВызватьДиалог = ПустойПароль ИЛИ ЭтоОшибка; + ВызватьФоновоеЗадание = НЕ ВызватьДиалог; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ВызватьДиалог Тогда + ПроверкаАутентификацииПользователяОткрытьФорму(Неопределено, ВходящийКонтекст); + ИначеЕсли ВызватьФоновоеЗадание Тогда + ПроверкаАутентификацииПользователяФоновымЗаданием(Неопределено, ВходящийКонтекст); + Иначе + РезультатВызова = ОтветСервисаПоУмолчанию(); + РезультатВызова.Вставить("НастройкиПользователя", НастройкиПользователя); + ПроверкаАутентификацииПользователяРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + + Иначе + ПроверкаАутентификацииПользователяРезультат(РезультатВызова, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверкаАутентификацииПользователя. +Процедура ПроверкаАутентификацииПользователяФоновымЗаданием(РезультатВызова, ВходящийКонтекст) + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ВидАутентификации = НастройкиПользователя.ПервичнаяАутентификация; + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверкаАутентификацииПользователяПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + Если ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации") Тогда + НоваяОперация = СервисКриптографииDSSСлужебныйВызовСервера.АутентификацияПоСертификату(НастройкиПользователя); + Иначе + НоваяОперация = СервисКриптографииDSSСлужебныйВызовСервера.АутентификацияПоЛогину(НастройкиПользователя); + КонецЕсли; + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, НоваяОперация, ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ПроверкаАутентификацииПользователя. +Процедура ПроверкаАутентификацииПользователяОткрытьФорму(РезультатВызова, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверкаАутентификацииПользователяРезультат", ЭтотОбъект); + ОписаниеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ВидАутентификации = НастройкиПользователя.ПервичнаяАутентификация; + ПараметрыОперации = ПроверитьПараметрыОперации(ВходящийКонтекст.ПараметрыОперации); + ДатаСеанса = ДатаСеанса(); + Авторизован = СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса); + + Если НЕ Авторизован Тогда + ПодключитьФормуОжидания(ПараметрыОперации, Истина); + КонецЕсли; + + Если ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") Тогда + АутентификацияДвухФакторная(НастройкиПользователя, ОписаниеСледующее, ПараметрыОперации); + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_КодАвторизации") Тогда + АутентификацияЧерезВебФорму(НастройкиПользователя, ОписаниеСледующее, ПараметрыОперации); + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации") Тогда + АутентификацияПоСертификату(НастройкиПользователя, ОписаниеСледующее, ПараметрыОперации); + ИначеЕсли ВидАутентификации = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_УчетныеДанные") Тогда + АутентификацияПоЛогину(НастройкиПользователя, ОписаниеСледующее, ПараметрыОперации); + Иначе + ОтветПользователю = ОтветСервисаПоУмолчанию(Ложь); + СформироватьОтказАутентификации(ОтветПользователю); + ПроверкаАутентификацииПользователяРезультат(ОтветПользователю, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверкаАутентификацииПользователя. +Процедура ПроверкаАутентификацииПользователяПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + РезультатВыполнения.МаркерОбновлен = Истина; + ПроверитьТокенНаОбновление(РезультатВыполнения, ВходящийКонтекст.НастройкиПользователя); + КонецЕсли; + + ПроверкаАутентификацииПользователяРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ПроверкаАутентификацииПользователя. +Процедура ПроверкаАутентификацииПользователяРезультат(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +#Область ПодтверждениеПроизвольнойОперации + +// Запускает цикл для процесса произвольного подтверждения +// Данный вариант возможно использовать, если в настройках DSS используется хотя бы один +// вариант вторичного подтверждения +// +// Шаги цикла подтверждения: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. разветвление, если в настройках указан шаблон, то пункт 6, иначе будет запущено фиктивное подписание +// 4. поиск подходящего сертификата (не требующий ввода пин-кода) +// 5. запуск вложенного процесса создания транзакции +// 6. запуск вложенного процесса подтверждения +// 7. ожидание результата транзакции (для фиктивного подписания) +// 8. проверка успешности окончания операции, если пароль неправильный, то цикл запускает заново (3) +// 9. сохранение нового токена для сеанса, возврат в случае успеха новых настроек пользователя. +// +Процедура ПодтверждениеПроизвольнойОперации(НастройкиПользователя, ОповещениеОЗавершении, СодержаниеОперации = "", СпособПодтверждения = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + КлючДействия = КлючДействияОперации("ПодписьДокумента", НастройкиПользователя); + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Подтверждение произвольной операции'", КодЯзыка())); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("СодержаниеОперации", СодержаниеОперации); + ПараметрыЦикла.Вставить("ШаблонПодтверждения", НастройкиПользователя.ШаблонПодтверждения); + ПараметрыЦикла.Вставить("КодОперации", КлючДействия.КодОперации); + ПараметрыЦикла.Вставить("СпособПодтверждения", СпособПодтверждения); + ПараметрыЦикла.Вставить("ЕстьШаблон", ЗначениеЗаполнено(НастройкиПользователя.ШаблонПодтверждения)); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииНачало", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПодтверждениеПроизвольнойОперации. +Процедура ПодтверждениеПроизвольнойОперацииНачало(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + Если ВходящийКонтекст.ЕстьШаблон Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииОжидать", ЭтотОбъект); + Иначе + // Делаем через подписание произвольной информации, при этом должны быть зарегистрированы сертификаты + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииСертификат", ЭтотОбъект); + КонецЕсли; + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервисаПоУмолчанию()); + Иначе + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодтверждениеПроизвольнойОперации. +Процедура ПодтверждениеПроизвольнойОперацииСертификат(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, "Любой"); + + Если НЕ ЗначениеЗаполнено(ТекущийСертификат.Отпечаток) Тогда + ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(ОтветСервиса, "СертификатыНеОбнаружены"); + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + ВходящийКонтекст.Вставить("Сертификат", ТекущийСертификат); + ПодтверждениеПроизвольнойОперацииСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииНачало", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + + Иначе + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодтверждениеПроизвольнойОперации. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * Сертификат - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура ПодтверждениеПроизвольнойОперацииСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииОжидать", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + СвойствоПодписи = Новый Структура(); + СвойствоПодписи.Вставить("SignatureType", "CMS"); + СвойствоПодписи.Вставить("Hash", "False"); + СвойствоПодписи.Вставить("DocumentInfo", ВходящийКонтекст.СодержаниеОперации); + СвойствоПодписи.Вставить("DocumentType", "txt"); + СвойствоПодписи.Вставить("CertificateID", ВходящийКонтекст.Сертификат.Идентификатор); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.СоздатьТранзакцию( + ВходящийКонтекст.НастройкиПользователя, + СвойствоПодписи, + ВходящийКонтекст.КодОперации, + ПолучитьДвоичныеДанныеИзСтроки(ВходящийКонтекст.СодержаниеОперации)), + ВходящийКонтекст.ПараметрыОперации); + + Иначе + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПодтверждениеПроизвольнойОперации. +Процедура ПодтверждениеПроизвольнойОперацииОжидать(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПроверитьТокенНаОбновление(РезультатВыполнения, ВходящийКонтекст.НастройкиПользователя); + + Если ВходящийКонтекст.ЕстьШаблон Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииПослеВыполнения", ЭтотОбъект); + Иначе + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииФоновымЗаданием", ЭтотОбъект); + КонецЕсли; + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ИдТранзакции = Неопределено; + РезультатВыполнения.Свойство("Результат", ИдТранзакции); + + ПараметрыПодтверждения = Новый Структура(); + ПараметрыПодтверждения.Вставить("ИдентификаторТранзакции", ИдТранзакции); + ПараметрыПодтверждения.Вставить("ТипПодтверждения", "ПроизвольнаяОперация"); + ПараметрыПодтверждения.Вставить("ЗаголовокФормы", ВходящийКонтекст.СодержаниеОперации); + ПараметрыПодтверждения.Вставить("ШаблонПодтверждения", ВходящийКонтекст.ШаблонПодтверждения); + ПараметрыПодтверждения.Вставить("СпособПодтверждения", ВходящийКонтекст.СпособПодтверждения); + + ПодтвердитьОперацию(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ПараметрыПодтверждения, + ВходящийКонтекст.ПараметрыОперации); + + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииСоздатьТранзакцию", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + + Иначе + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодтверждениеПроизвольнойОперации. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * Сертификат - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура ПодтверждениеПроизвольнойОперацииФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ВходящийКонтекст.НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + ВходящийКонтекст.ПараметрыОперации.Вставить("Транзакция", Истина); + ВходящийКонтекст.ПараметрыОперации.Вставить("ТипРезультата", "ДвоичныеДанные"); + + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.Подписать( + ВходящийКонтекст.НастройкиПользователя, + Неопределено, + Неопределено, + ВходящийКонтекст.Сертификат.Идентификатор, + ВходящийКонтекст.Сертификат.ПинКод, + Ложь, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ОбработкаОперации, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПодтверждениеПроизвольнойОперации. +Процедура ПодтверждениеПроизвольнойОперацииПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаПинКода(РезультатВыполнения.Ошибка) Тогда // неверный пин-код + ПодтверждениеПроизвольнойОперацииРезультат(ОтветСервисаПоУмолчанию(Истина), ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодтверждениеПроизвольнойОперацииНачало", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПодтверждениеПроизвольнойОперацииРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодтверждениеПроизвольнойОперации. +Процедура ПодтверждениеПроизвольнойОперацииРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область Зашифровать + +// Запускает цикл для процесса шифрования +// +// Шаги цикла шифрования: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск фонового задания для шифрования +// 4. проверка успешности окончания операции +// 5. сохранение нового токена для сеанса, возврат результата шифрования. +// +Процедура Зашифровать(НастройкиПользователя, + ОповещениеОЗавершении, + ДанныеДокумента, + СертификатыПолучателей, + ТипШифрования = "CMS", + ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Зашифрование данных'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("СертификатыПолучателей", СертификатыПолучателей); + ПараметрыЦикла.Вставить("ТипШифрования", ТипШифрования); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ЗашифроватьФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + Если НастройкиПользователя = Неопределено Тогда + ПроверкаАутентификацииПользователяСОтбором(ОповещениеСледующее, ПараметрыЦикла, Неопределено); + Иначе + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Зашифровать. +Процедура ЗашифроватьФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ЗашифроватьПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.Зашифровать( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.СертификатыПолучателей, + ВходящийКонтекст.ТипШифрования, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ЗашифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры Зашифровать. +Процедура ЗашифроватьПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ЗашифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ЗашифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ЗашифроватьФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ЗашифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Зашифровать. +Процедура ЗашифроватьРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область Расшифровать + +// Запускает цикл для процесса расшифровки +// +// Шаги цикла авторизации: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. извлечение серийных номеров из сообщения и поиск идентификатора сертификата +// 4. если предыдущий пункт не получился, то получение сервисом из свойств шифрованных +// данных списка сертификатов учетной записи +// 5. проверка пин-кода для выбранного сертификата +// 6. проверка необходимости подтверждения, если нужно запуск вложенного процесса создания транзакции +// 7. расшифровка данных фоновым заданием +// 8. проверка результат операции, если ошибка авторизации, то цикл повторяется +// 9. сохранение нового токена для сеанса, возврат результата расшифровки. +// +Процедура Расшифровать(НастройкиПользователя, + ОповещениеОЗавершении, + ДанныеДокумента, + ТипШифрования = "CMS", + Сертификат = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ИдентификаторТранзакции = СвойствоСтруктуры(ПараметрыОперации, "ИдентификаторТранзакции", ""); + ПинКод = СвойствоСтруктуры(ПараметрыОперации, "ПинКод"); + ЗапомнитьПинКод = СвойствоСтруктуры(ПараметрыОперации, "ЗапомнитьПинКод", Ложь); + ПодтверждатьПринудительно = СвойствоСтруктуры(ПараметрыОперации, "ПодтверждатьПринудительно", Ложь); + ТипРезультата = СвойствоСтруктуры(ПараметрыОперации, "ТипРезультата", "Неопределено"); + + Если ТипРезультата = "Неопределено" Тогда + ТипРезультата = СервисКриптографииDSSКлиентСервер.ПолучитьТипДанныхДокумента(ДанныеДокумента); + КонецЕсли; + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Расшифрование данных'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("ТипШифрования", ТипШифрования); + ПараметрыЦикла.Вставить("ИнформацияОДокументе", СвойствоСтруктуры(ПараметрыОперации, "ИнформацияОДокументе", "Расшифровка")); + ПараметрыЦикла.Вставить("ТипДокумента", СвойствоСтруктуры(ПараметрыОперации, "ТипДокумента", "txt")); + ПараметрыЦикла.Вставить("Сертификат", Сертификат); + ПараметрыЦикла.Вставить("ИдентификаторТранзакции", ИдентификаторТранзакции); + ПараметрыЦикла.Вставить("ПинКод", ПинКод); + ПараметрыЦикла.Вставить("ЗапомнитьПинКод", ЗапомнитьПинКод); + ПараметрыЦикла.Вставить("ТипРезультата", ТипРезультата); + ПараметрыЦикла.Вставить("ПодтверждатьПринудительно", ПодтверждатьПринудительно); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьПоСерийнымНомерам", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +// Иногда сервис не может разобрать двоичные данные, получаем идентификатор сертификата альтернативным способом, +// также предварительная проверка позволяет не делать лишний запрос к сервису. +// +// Параметры: +// РезультатВызова - Структура +// ВходящийКонтекст - Структура: +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Процедура РасшифроватьПоСерийнымНомерам(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + + Если ВходящийКонтекст.Сертификат = Неопределено Тогда + + ДанныеДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ВходящийКонтекст.ДанныеДокумента, Истина); + СерийныеНомера = СервисКриптографииDSSASNКлиентСервер.ПолучитьСертификатыШифрования(ДанныеДокумента.Документ); + УчетнаяЗапись = ВходящийКонтекст.НастройкиПользователя.Ссылка; + + Для каждого СтрокаМассива Из СерийныеНомера Цикл + НашлиСертификат = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьСертификатПоСерийномуНомеру(СтрокаМассива.СерийныйНомер); + Если НашлиСертификат <> Неопределено И НашлиСертификат.УчетнаяЗапись = УчетнаяЗапись Тогда + ВходящийКонтекст.Сертификат = Новый Структура("Отпечаток", НашлиСертификат.Отпечаток); + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + РасшифроватьПолучитьСертификаты(РезультатВызова, ВходящийКонтекст); + + Иначе + РасшифроватьРезультат(РезультатВызова, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +Процедура РасшифроватьПолучитьСертификаты(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + + Если ВходящийКонтекст.Сертификат = Неопределено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьПроверитьПинКод", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст, "ВидОперации", "ПолучитьСертификатыРасшифрования"); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.СертификатыРасшифрования( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ТипШифрования, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + + Иначе + РезультатВызова = ОтветСервисаПоУмолчанию(Истина); + РезультатВызова.Вставить("Результат", Новый Массив); + НашлиСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, ВходящийКонтекст.Сертификат); + Если НашлиСертификат.Идентификатор <> -1 Тогда + РезультатВызова.Результат.Добавить(НашлиСертификат.Идентификатор); + КонецЕсли; + РасшифроватьПроверитьПинКод(РезультатВызова, ВходящийКонтекст); + + КонецЕсли; + + Иначе + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +// +// Параметры: +// ДлительнаяОперация - Структура +// ВходящийКонтекст - Структура: +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Процедура РасшифроватьПроверитьПинКод(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + СписокСертификатов = НастройкиПользователя.Сертификаты; + + ПриоритетныйСертификат = Неопределено; + Для каждого СтрокаКлюча Из СписокСертификатов Цикл + ТекущийСертификат = СтрокаКлюча.Значение; + НашлиСертификат = РезультатВыполнения.Результат.Найти(ТекущийСертификат.Идентификатор); + Если НашлиСертификат <> Неопределено + И (ПриоритетныйСертификат = Неопределено + ИЛИ НЕ ТекущийСертификат.ТребуетсяПинКод + ИЛИ НЕ ТребуетсяВводКонфиденциальныхДанных(ТекущийСертификат.ПинКод)) Тогда + ПриоритетныйСертификат = ТекущийСертификат; // СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя() + КонецЕсли; + КонецЦикла; + + Если ПриоритетныйСертификат = Неопределено Тогда + ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(ОтветСервиса, "СертификатыНеОбнаружены"); + РасшифроватьРезультат(ОтветСервиса, ВходящийКонтекст); + ИначеЕсли ВходящийКонтекст.ПинКод <> Неопределено Тогда + Если ВходящийКонтекст.ЗапомнитьПинКод Тогда + УстановитьПинКодСертификата(ТекущийСертификат, НастройкиПользователя, ВходящийКонтекст.ПинКод, , , ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + ПриоритетныйСертификат.ПинКод = ВходящийКонтекст.ПинКод; + РезультатВыполнения = ОтветСервисаПоУмолчанию(); + ВходящийКонтекст.Вставить("ОписаниеСертификата", ПриоритетныйСертификат); + ВходящийКонтекст.Вставить("ПредставлениеСертификата", ПриоритетныйСертификат); + РасшифроватьСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + Иначе + ВходящийКонтекст.Вставить("ОписаниеСертификата", ПриоритетныйСертификат); + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьПослеВводаПинКода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПинКодСертификата(НастройкиПользователя, ОповещениеСледующее, ПриоритетныйСертификат.Идентификатор, ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьПолучитьСертификаты", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + + Иначе + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +Процедура РасшифроватьПослеВводаПинКода(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + Если РезультатВыполнения.Результат.ОбновилиПинКод Тогда + ВходящийКонтекст.НастройкиПользователя = РезультатВыполнения.Результат.НастройкиПользователя; + КонецЕсли; + РасшифроватьСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + Иначе + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +// +// Параметры: +// ДлительнаяОперация - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура РасшифроватьСоздатьТранзакцию(ДлительнаяОперация, ВходящийКонтекст) + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + КлючДействия = КлючДействияОперации("Расшифрование", НастройкиПользователя); + ВходящийКонтекст.Вставить("Транзакция", КлючДействия.Подтверждать); + + Если ЗначениеЗаполнено(ВходящийКонтекст.ИдентификаторТранзакции) Тогда + ПодтверждатьОперацию = Ложь; + ВходящийКонтекст.Вставить("Транзакция", Истина); + Иначе + ПодтверждатьОперацию = КлючДействия.Подтверждать ИЛИ ВходящийКонтекст.ПодтверждатьПринудительно; + ВходящийКонтекст.Вставить("Транзакция", ПодтверждатьОперацию); + КонецЕсли; + + Если ПодтверждатьОперацию Тогда + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьФоновымЗаданием", ЭтотОбъект); + СледующееОповещение = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + ПараметрыРасшифрования = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииРасшифрования( + ВходящийКонтекст.ТипШифрования, + ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.ТипДокумента, + ВходящийКонтекст.ИнформацияОДокументе); + + СоздатьТранзакцию(НастройкиПользователя, + СледующееОповещение, + ПараметрыРасшифрования, + КлючДействия.КодОперации, + НСтр("ru = 'Подтвердите расшифровку документа.'", КодЯзыка()), + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ПараметрыОперации); + Иначе + РасшифроватьФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + Иначе + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура РасшифроватьФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВыполнения, ВходящийКонтекст.НастройкиПользователя); + Если РезультатВыполнения.Выполнено Тогда + + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст, "ВидОперации", "Расшифрование"); + + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + ВходящийКонтекст.ПараметрыОперации.Вставить("Транзакция", ВходящийКонтекст.Транзакция); + + Если ВходящийКонтекст.Транзакция И ЗначениеЗаполнено(ВходящийКонтекст.ИдентификаторТранзакции) Тогда + ТрансформацияДанных(ВходящийКонтекст.ПараметрыОперации, ВходящийКонтекст.ТипРезультата); + ИначеЕсли ВходящийКонтекст.Транзакция Тогда + ТрансформацияДанных(ВходящийКонтекст.ПараметрыОперации, РезультатВыполнения.ТрансформироватьРезультат); + КонецЕсли; + + НоваяОперация = СервисКриптографииDSSСлужебныйВызовСервера.Расшифровать( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.ТипШифрования, + ОписаниеСертификата.ПинКод, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, НоваяОперация, ВходящийКонтекст.ПараметрыОперации); + + Иначе + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +Процедура РасшифроватьПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + РезультатВыполнения.Вставить("Сертификат", ВходящийКонтекст.Сертификат); + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + РасшифроватьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +Процедура РасшифроватьРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область РасшифроватьВЦикле + +// Запускает расшифровку перебором всех учетных записей , состоящей из этапов +// +// Шаги цикла авторизации: +// 1. подготовка параметров цикла +// 2. делается попытка извлечь серийные номера сертификатов, если не удается, то второй пункт +// 3. в цикле перебирает учетные записи и запускает вложенный процесс расшифровки +// 4. сохранение нового токена для сеансов, возврат результата шифрования. +// +Процедура РасшифроватьВЦикле(ОповещениеОЗавершении, + ДанныеДокумента, + ТипШифрования = "CMS", + ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Расшифрование данных по учетным записям'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("СчетчикМассива", 0); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("ТипШифрования", ТипШифрования); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ИнформацияОДокументе", СвойствоСтруктуры(ПараметрыОперации, "ИнформацияОДокументе", "Расшифровка")); + ПараметрыЦикла.Вставить("ТипДокумента", СвойствоСтруктуры(ПараметрыОперации, "ТипДокумента", "txt")); + ПараметрыЦикла.Вставить("РасшифровкаПоУчетнымЗаписям", СвойствоСтруктуры(ПараметрыОперации, "РасшифровкаПоУчетнымЗаписям", Ложь)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + РасшифроватьВЦиклеПоСерийнымНомерам(ОтветСервисаПоУмолчанию(Ложь), ПараметрыЦикла); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры РасшифроватьВЦикле. +Процедура РасшифроватьВЦиклеПоСерийнымНомерам(РезультатВызова, ВходящийКонтекст) + + ДанныеДокумента = СервисКриптографииDSSКлиентСервер.ПодготовитьДанныеДокумента(ВходящийКонтекст.ДанныеДокумента, Истина); + СерийныеНомера = СервисКриптографииDSSASNКлиентСервер.ПолучитьСертификатыШифрования(ДанныеДокумента.Документ); + МассивЗаписей = Новый Массив; + + Если СерийныеНомера.Количество() > 0 Тогда + МассивНомеров = Новый Массив; + Для каждого СтрокаМассива Из СерийныеНомера Цикл + МассивНомеров.Добавить(СтрокаМассива.СерийныйНомер); + КонецЦикла; + ДанныеСертификатов = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьСертификатПоСерийномуНомеру(Новый Структура("СерийныйНомер", МассивНомеров)); + + Если ДанныеСертификатов <> Неопределено Тогда + Если ДанныеСертификатов.Количество() = 1 Тогда + ТекущийСертификат = ДанныеСертификатов[0]; + НастройкиПользователя = СервисКриптографииDSSКлиент.ПолучитьНастройкиПользователя(ТекущийСертификат.УчетнаяЗапись, ВходящийКонтекст.ПараметрыОперации); + Расшифровать(НастройкиПользователя, + ВходящийКонтекст.ОповещениеОЗавершении, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ТипШифрования, + ТекущийСертификат, + ВходящийКонтекст.ПараметрыОперации); + Возврат; + ИначеЕсли ДанныеСертификатов.Количество() > 1 Тогда + ВходящийКонтекст.РасшифровкаПоУчетнымЗаписям = Истина; + Для каждого СтрокаМассива Из ДанныеСертификатов Цикл + ДополнитьМассивУчетныхЗаписей(МассивЗаписей, СтрокаМассива.УчетнаяЗапись); + КонецЦикла; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если МассивЗаписей.Количество() = 0 + И ВходящийКонтекст.РасшифровкаПоУчетнымЗаписям Тогда + ВсеНастройки = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьУчетныеЗаписи(); + Для каждого СтрокаМассива Из ВсеНастройки Цикл + ДополнитьМассивУчетныхЗаписей(МассивЗаписей, СтрокаМассива); + КонецЦикла; + КонецЕсли; + + ВходящийКонтекст.Вставить("СписокУчетныхЗаписей", МассивЗаписей); + + РасшифроватьВЦиклеСледующаяУчетнаяЗапись(Неопределено, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры РасшифроватьВЦикле. +Процедура РасшифроватьВЦиклеСледующаяУчетнаяЗапись(РезультатВызова, ВходящийКонтекст) Экспорт + + Счетчик = ВходящийКонтекст.СчетчикМассива; + + Если РезультатВызова <> Неопределено Тогда + ВходящийКонтекст.СписокУчетныхЗаписей[Счетчик - 1].Результат = РезультатВызова; + КонецЕсли; + + СписокУчетныхЗаписей = ВходящийКонтекст.СписокУчетныхЗаписей; + + Если РезультатВызова = Неопределено ИЛИ НЕ РезультатВызова.Выполнено Тогда + + ПродолжитьРаботу = Истина; + Если СписокУчетныхЗаписей.Количество() = 0 Тогда + ПродолжитьРаботу = Ложь; + ИначеЕсли НЕ СписокУчетныхЗаписей.Количество() > Счетчик Тогда + ПродолжитьРаботу = Ложь; + КонецЕсли; + + Если ПродолжитьРаботу Тогда + НастройкиПользователя = СервисКриптографииDSSКлиент.ПолучитьНастройкиПользователя( + СписокУчетныхЗаписей[Счетчик].УчетнаяЗапись, + ВходящийКонтекст.ПараметрыОперации); + ВходящийКонтекст.Вставить("НастройкиПользователя", НастройкиПользователя); + ВходящийКонтекст.СчетчикМассива = Счетчик + 1; + + ОбъектОповещения = Новый ОписаниеОповещения("РасшифроватьВЦиклеСледующаяУчетнаяЗапись", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + Расшифровать(НастройкиПользователя, + ОповещениеСледующее, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ТипШифрования, + , + ВходящийКонтекст.ПараметрыОперации); + + Иначе + + МассивОшибок = Новый Массив; + // соберем все ошибки + Для Каждого СтрокаМассива Из СписокУчетныхЗаписей Цикл + Если МассивОшибок.Количество() = 0 Тогда + МассивОшибок.Добавить(СтрокаМассива.Результат.Ошибка); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ПолучитьКодОшибки(СтрокаМассива.Результат.Ошибка) = "100002" Тогда + МассивОшибок.Вставить(0, СтрокаМассива.Результат.Ошибка); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(СтрокаМассива.Результат.Ошибка) Тогда + МассивОшибок.Вставить(1, СтрокаМассива.Результат.Ошибка); + Иначе + МассивОшибок.Добавить(СтрокаМассива.Результат.Ошибка); + КонецЕсли; + КонецЦикла; + + РезультатСОшибкой = ОтветСервисаПоУмолчанию(Ложь, "РасшифровкаВЦикле"); + Если МассивОшибок.Количество() = 0 И РезультатВызова <> Неопределено Тогда + ПолучитьОписаниеОшибки(РезультатСОшибкой, "РасшифровкаВЦикле", РезультатВызова.Ошибка); + Иначе + РезультатСОшибкой.Ошибка = СтрСоединить(МассивОшибок, Символы.ПС); + КонецЕсли; + + РасшифроватьВЦиклеРезультат(РезультатСОшибкой, ВходящийКонтекст); + КонецЕсли; + Иначе + РасшифроватьВЦиклеРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры РасшифроватьВЦикле. +Процедура РасшифроватьВЦиклеРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +// Продолжение процедуры РасшифроватьВЦикле. +Процедура ДополнитьМассивУчетныхЗаписей(МассивЗаписей, УчетнаяЗапись) + + ЕстьЗапись = Ложь; + Для Каждого СтрокаМассива Из МассивЗаписей Цикл + Если СтрокаМассива.УчетнаяЗапись = УчетнаяЗапись Тогда + ЕстьЗапись = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если НЕ ЕстьЗапись Тогда + НоваяСтрока = Новый Структура("УчетнаяЗапись, Результат", УчетнаяЗапись, ОтветСервисаПоУмолчанию(Ложь)); + МассивЗаписей.Добавить(НоваяСтрока); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ХешированиеДанных + +// Запускает цикл хеширования документа +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск фонового задания для хеширования +// 4. проверка успешности окончания операции +// 5. сохранение нового токена для сеанса, возврат результата хеширования. +// +Процедура ХешированиеДанных(НастройкиПользователя, + ОповещениеОЗавершении, + ДанныеДокумента, + АлгоритмХеширования, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Вычисление значение хеша'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("АлгоритмХеширования", АлгоритмХеширования); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ХешированиеДанныхФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ХешированиеДанных. +Процедура ХешированиеДанныхФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ХешированиеДанныхПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ХешированиеДанных( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.АлгоритмХеширования, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ХешированиеДанныхРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ХешированиеДанных. +Процедура ХешированиеДанныхПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ХешированиеДанныхРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ХешированиеДанныхРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ХешированиеДанныхФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ХешированиеДанныхРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ХешированиеДанных. +Процедура ХешированиеДанныхРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область Подписать + +// Запускает цикл подписи одиночного документа или пакета документов +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. проверка переданного сертификата на наличие в сервисе +// 4. проверка необходимости ввод пин-кода и ввода его, вложенный процесс +// 5. проверка необходимости подтверждения, запуск вложенного процесса транзакции +// 6. подписание данных через фоновое задание +// 7. сохранение нового токена для сеанса, возврат результата подписания. +// +Процедура Подписать(НастройкиПользователя, + ОповещениеОЗавершении, + ДанныеДокумента, + СвойствоПодписи, + Сертификат = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ПакетнаяПодпись = ТипЗнч(ДанныеДокумента) = Тип("Массив"); + ПоточнаяПодпись = СвойствоСтруктуры(ПараметрыОперации, "ПотоковыйРежим", Ложь); + ИдентификаторТранзакции = СвойствоСтруктуры(ПараметрыОперации, "ИдентификаторТранзакции", ""); + ПинКод = СвойствоСтруктуры(ПараметрыОперации, "ПинКод"); + ЗапомнитьПинКод = СвойствоСтруктуры(ПараметрыОперации, "ЗапомнитьПинКод", Ложь); + ПодтверждатьПринудительно = СвойствоСтруктуры(ПараметрыОперации, "ПодтверждатьПринудительно", Ложь); + ПакетнаяОперация = СвойствоСтруктуры(ПараметрыОперации, "ПакетнаяПодпись", Ложь); + ТипРезультата = СвойствоСтруктуры(ПараметрыОперации, "ТипРезультата", "Неопределено"); + + Если ТипРезультата = "Неопределено" Тогда + ТипРезультата = СервисКриптографииDSSКлиентСервер.ПолучитьТипДанныхДокумента(ДанныеДокумента); + КонецЕсли; + + Если ПакетнаяПодпись Тогда + ПоточнаяПодпись = Ложь; + КонецЕсли; + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Подписание данных'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("СвойствоПодписи", СвойствоПодписи); + ПараметрыЦикла.Вставить("Сертификат", Сертификат); + ПараметрыЦикла.Вставить("ПакетнаяПодпись", ПакетнаяПодпись ИЛИ ПакетнаяОперация); + ПараметрыЦикла.Вставить("ПотоковыйРежим", ПоточнаяПодпись); + ПараметрыЦикла.Вставить("ИдентификаторТранзакции", ИдентификаторТранзакции); + ПараметрыЦикла.Вставить("ПинКод", ПинКод); + ПараметрыЦикла.Вставить("ЗапомнитьПинКод", ЗапомнитьПинКод); + ПараметрыЦикла.Вставить("ТипРезультата", ТипРезультата); + ПараметрыЦикла.Вставить("ПодтверждатьПринудительно", ПодтверждатьПринудительно); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ПакетнаяОперация", ПакетнаяОперация); + ПараметрыЦикла.Вставить("ПредставлениеСертификата", ""); + ПараметрыЦикла.Вставить("ЭтоПакет", ПакетнаяПодпись ИЛИ ПакетнаяОперация); + + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьПолучитьСертификат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры Подписать. +Процедура ПодписатьПолучитьСертификат(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + ВходящийКонтекст.НастройкиПользователя = НастройкиПользователя; + + Если НастройкиПользователя.Политика.ТипыПодписей.Найти(ВходящийКонтекст.СвойствоПодписи.SignatureType) = Неопределено Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + "ТипПодписи", + НСтр("ru = 'Тип подписи:'", КодЯзыка()) + " " + + ВходящийКонтекст.СвойствоПодписи.SignatureType); + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + + Иначе + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, ВходящийКонтекст.Сертификат); + + Если НЕ ЗначениеЗаполнено(ТекущийСертификат.Отпечаток) Тогда + РезультатОтвета = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатОтвета, + "certificate_not_found", + НСтр("ru = 'При подписании'", КодЯзыка())); + ПодписатьРезультат(РезультатОтвета, ВходящийКонтекст); + + ИначеЕсли ВходящийКонтекст.ПинКод <> Неопределено Тогда + Если ВходящийКонтекст.ЗапомнитьПинКод Тогда + УстановитьПинКодСертификата(ТекущийСертификат, НастройкиПользователя, ВходящийКонтекст.ПинКод, , , ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + ТекущийСертификат.ПинКод = ВходящийКонтекст.ПинКод; + РезультатВыполнения = ОтветСервисаПоУмолчанию(); + ВходящийКонтекст.Вставить("ОписаниеСертификата", ТекущийСертификат); + ВходящийКонтекст.Вставить("ПредставлениеСертификата", ТекущийСертификат); + ПодписатьСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + + Иначе + ВходящийКонтекст.Вставить("ОписаниеСертификата", ТекущийСертификат); + ВходящийКонтекст.Вставить("ПредставлениеСертификата", ТекущийСертификат); + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьПослеВводаПинКода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПинКодСертификата(ВходящийКонтекст.НастройкиПользователя, ОповещениеСледующее, ТекущийСертификат.Идентификатор, ВходящийКонтекст.ПараметрыОперации); + + КонецЕсли; + КонецЕсли; + + Иначе + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Подписать. +Процедура ПодписатьПослеВводаПинКода(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + Если РезультатВыполнения.Результат.ОбновилиПинКод Тогда + ВходящийКонтекст.НастройкиПользователя = РезультатВыполнения.Результат.НастройкиПользователя; + КонецЕсли; + ПодписатьСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + Иначе + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Подписать. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура ПодписатьСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст) + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + Если ВходящийКонтекст.ПакетнаяПодпись Тогда + КлючДействия = КлючДействияОперации("ПодписьПакета", НастройкиПользователя); + Иначе + КлючДействия = КлючДействияОперации("ПодписьДокумента", НастройкиПользователя); + КонецЕсли; + + Если ЗначениеЗаполнено(ВходящийКонтекст.ИдентификаторТранзакции) Тогда + ПодтверждатьОперацию = Ложь; + ВходящийКонтекст.Вставить("Транзакция", Истина); + Иначе + ПодтверждатьОперацию = КлючДействия.Подтверждать ИЛИ ВходящийКонтекст.ПодтверждатьПринудительно; + ВходящийКонтекст.Вставить("Транзакция", ПодтверждатьОперацию); + КонецЕсли; + + Если ПодтверждатьОперацию Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьФоновымЗаданием", ЭтотОбъект); + СледующееОповещение = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + СвойствоПодписи = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииПодписания(ВходящийКонтекст.СвойствоПодписи, ОписаниеСертификата.Идентификатор); + ПараметрыОперации = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ВходящийКонтекст.ПараметрыОперации); + //@skip-warning + ПараметрыОперации.Вставить("Сертификат", ВходящийКонтекст.ПредставлениеСертификата); + + СоздатьТранзакцию(НастройкиПользователя, + СледующееОповещение, + СвойствоПодписи, + КлючДействия.КодОперации, + НСтр("ru = 'Подтвердите подписание данных'", КодЯзыка()), + ВходящийКонтекст.ДанныеДокумента, + ПараметрыОперации); + Иначе + ПодписатьФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + Иначе + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры Подписать. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура ПодписатьФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ЭтоПакет = ВходящийКонтекст.ЭтоПакет; + ВходящийКонтекст.ПараметрыОперации.Вставить("Транзакция", ВходящийКонтекст.Транзакция); + + Если ВходящийКонтекст.Транзакция И ЗначениеЗаполнено(ВходящийКонтекст.ИдентификаторТранзакции) Тогда + ТрансформацияДанных(ВходящийКонтекст.ПараметрыОперации, ВходящийКонтекст.ТипРезультата); + ИначеЕсли ВходящийКонтекст.Транзакция Тогда + ТрансформацияДанных(ВходящийКонтекст.ПараметрыОперации, РезультатВыполнения.ТрансформироватьРезультат); + КонецЕсли; + + Если ЭтоПакет Тогда + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.ПодписатьПакет( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.СвойствоПодписи, + ВходящийКонтекст.ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.ОписаниеСертификата.ПинКод, + ВходящийКонтекст.ПараметрыОперации); + + Иначе + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.Подписать( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.СвойствоПодписи, + ВходящийКонтекст.ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.ОписаниеСертификата.ПинКод, + ВходящийКонтекст.ПотоковыйРежим, + ВходящийКонтекст.ПараметрыОперации) + КонецЕсли; + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ОбработкаОперации, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры Подписать. +Процедура ПодписатьПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПодписатьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры Подписать. +Процедура ПодписатьРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ПодготовитьТранзакцию + +// Запускает цикл универсальной процедуры начала криптографической операции с сертификатом облачной подписи +// Особенность: отключена интерактивное взаимодействие с пользователем +// +// Шаги цикла фонового задания: +// 1. подготовка параметров цикла +// 2. авторизация, по необходимости +// 3. проверка пин-кода (для шифрования не требуется) +// 4. проверка сертификата и его даты действия +// 5. создание транзакция (только для Подписание, Расшифрование) +// 6. сохранение нового токена для сеанса и идентификатора транзакции. +// +Процедура ПодготовитьТранзакцию(ОповещениеОЗавершении, ПараметрыВыполнения, ПараметрыОперации) Экспорт + + ДополнимПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + ДополнимПараметры.Вставить("ОтобразитьОшибку", Ложь); + ПодключитьФормуОжидания(ДополнимПараметры, Истина); + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Подготовка транзакции'", КодЯзыка())); + ПараметрыЦикла.Вставить("НастройкиПользователя", ПараметрыВыполнения.НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); + ПараметрыЦикла.Вставить("ПараметрыОперации", ДополнимПараметры); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + + Если НЕ ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + Возврат; + КонецЕсли; + + ОбъектОповещения = Новый ОписаниеОповещения("ПодготовитьТранзакциюФоновоеЗадание", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + Если ТребуетсяВводКонфиденциальныхДанных(ПараметрыВыполнения.ПарольПользователя) Тогда + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервисаПоУмолчанию()); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодготовитьТранзакцию. +Процедура ПодготовитьТранзакциюФоновоеЗадание(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + ПроверитьТокенНаОбновление(РезультатВызова, ВходящийКонтекст.НастройкиПользователя); + ОбъектОповещения = Новый ОписаниеОповещения("ПодготовитьТранзакциюПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.ПодготовитьТранзакцию( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыВыполнения, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ОбработкаОперации, ВходящийКонтекст.ПараметрыОперации); + Иначе + ПодготовитьТранзакциюРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодготовитьТранзакцию. +Процедура ПодготовитьТранзакциюПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + ПодготовитьТранзакциюРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ПодготовитьТранзакцию. +Процедура ПодготовитьТранзакциюРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область СоздатьТранзакцию + +// Вспомогательный процесс для операций требующих подтверждения +// Может быть задействован при: +// - подпись +// - расшифровка +// - создание запроса на сертификат +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. создание транзакции фоновым заданием, передачей данных для нее +// 4. запуск вложенного процесса подтверждения операции +// 5. проверка необходимости подтверждения, запуск вложенного процесса транзакции +// 6. сохранение нового токена для сеанса, возврат результата подтверждения. +// +Процедура СоздатьТранзакцию(НастройкиПользователя, + ОповещениеОЗавершении, + ДанныеЗапроса, + КодОперации, + ОписаниеОперации, + ДанныеДокумента = Неопределено, + ПараметрыОперации = Неопределено) + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Создание транзакции:'", КодЯзыка()) + " " + КодОперации); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("ДанныеЗапроса", ДанныеЗапроса); + ПараметрыЦикла.Вставить("КодОперации", КодОперации); + ПараметрыЦикла.Вставить("ОписаниеОперации", ОписаниеОперации); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьТранзакциюФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры СоздатьТранзакцию. +Процедура СоздатьТранзакциюФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьТранзакциюПодтверждениеОперации", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.СоздатьТранзакцию( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеЗапроса, + ВходящийКонтекст.КодОперации, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + СоздатьТранзакциюРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры СоздатьТранзакцию. +Процедура СоздатьТранзакциюПодтверждениеОперации(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ВходящийКонтекст.Вставить("ТрансформироватьРезультат", РезультатВыполнения.ТрансформироватьРезультат); + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьТранзакциюПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ПараметрыПодтверждения = Новый Структура(); + ПараметрыПодтверждения.Вставить("ИдентификаторТранзакции", РезультатВыполнения.Результат); + ПараметрыПодтверждения.Вставить("ЗаголовокФормы", ВходящийКонтекст.ОписаниеОперации); + ПараметрыПодтверждения.Вставить("ТипПодтверждения", "Транзакция"); + + ПодтвердитьОперацию(ВходящийКонтекст.НастройкиПользователя, ОповещениеСледующее, ПараметрыПодтверждения, ВходящийКонтекст.ПараметрыОперации); + + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + СоздатьТранзакциюРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьТранзакциюФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + СоздатьТранзакциюРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьТранзакцию. +Процедура СоздатьТранзакциюПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + РезультатВыполнения.МаркерОбновлен = Истина; + СоздатьТранзакциюРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + СоздатьТранзакциюРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьТранзакциюФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + СоздатьТранзакциюРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьТранзакцию. +Процедура СоздатьТранзакциюРезультат(РезультатВызова, ВходящийКонтекст) + + Если ВходящийКонтекст.Свойство("ТрансформироватьРезультат") Тогда + РезультатВызова.Вставить("ТрансформироватьРезультат", ВходящийКонтекст.ТрансформироватьРезультат); + КонецЕсли; + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПодтвердитьОперацию + +// Вспомогательный цикл для запуска интерактивного процесса подтверждения +// Может вызывается из аутентификации, создании транзакции и произвольного подтверждения +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск вложенного процесса интерактивного подтверждения (в отдельном модуле) +// 5. получение в случае успеха нового токена авторизации +// 6. сохранение нового токена для сеанса, возврат результата подтверждения. +// +Процедура ПодтвердитьОперацию(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыПодтверждения, ПараметрыОперации = Неопределено) + + Заголовок = СвойствоСтруктуры(ПараметрыПодтверждения, "ЗаголовокФормы", + НСтр("ru = 'Подтверждение криптографической операции'", КодЯзыка())); + + ДанныеПодтверждения = СервисКриптографииDSSСлужебныйВызовСервера.ДанныеВторичнойАвторизацииПоУмолчанию(); + + ДанныеПодтверждения.Идентификатор = СвойствоСтруктуры(ПараметрыПодтверждения, "ИдентификаторТранзакции", ""); + ДанныеПодтверждения.ТипПодтверждения = СвойствоСтруктуры(ПараметрыПодтверждения, "ТипПодтверждения", "Транзакция"); + ДанныеПодтверждения.ШаблонПодтверждения = СвойствоСтруктуры(ПараметрыПодтверждения, "ШаблонПодтверждения", ""); + ДанныеПодтверждения.Заголовок = Заголовок; + + МассивСпособов = СвойствоСтруктуры(ПараметрыОперации, "СпособПодтверждения"); + Если МассивСпособов = Неопределено Тогда + МассивСпособов = СервисКриптографииDSSСлужебныйВызовСервера.СписокВторичнойАвторизации(); + КонецЕсли; + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + + ДанныеПодтверждения.ДоступныеМетоды = МассивСпособов; + ДанныеПодтверждения.ВторичнаяАвторизация = НастройкиПользователя.ВторичнаяАвторизация; + ДанныеПодтверждения.ИдентификаторТранзакции = ДанныеПодтверждения.Идентификатор; + ДанныеПодтверждения.Сертификат = СвойствоСтруктуры(ВходящиеПараметры, "Сертификат", Новый Структура); + ДанныеПодтверждения.ДанныеДокументов = СвойствоСтруктуры(ВходящиеПараметры, "ДанныеДокументов"); + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Подтверждение операции'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ПараметрыЦикла.Вставить("ПараметрыОперации", ВходящиеПараметры); + + ОбъектОповещения = Новый ОписаниеОповещения("ПодтвердитьОперациюПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + СервисКриптографииDSSПодтверждениеКлиент.ОтправкаЗапроса(ОповещениеСледующее, НастройкиПользователя, ДанныеПодтверждения, ВходящиеПараметры); + +КонецПроцедуры + +// Продолжение процедуры ПодтвердитьОперацию. +Процедура ПодтвердитьОперациюПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ДанныеПодтверждения = ВходящийКонтекст.ДанныеПодтверждения; + + Если ДанныеПодтверждения.ТипПодтверждения = "Аутентификация" + И СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ПодтвердитьОперациюРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + ОбъектОповещения = Новый ОписаниеОповещения("ПодтвердитьОперациюОтветПользователя", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + СервисКриптографииDSSПодтверждениеКлиент.ОбработатьРезультатЗапроса( + ОповещениеСледующее, + РезультатВыполнения, + НастройкиПользователя, + ДанныеПодтверждения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодтвердитьОперацию. +Процедура ПодтвердитьОперациюОтветПользователя(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + + ДанныеПодтверждения = РезультатВызова.ДанныеПодтверждения; + Если ДанныеПодтверждения.ЭтапЦикла = "Окончание" Тогда + РезультатВызова.МаркерОбновлен = Истина; + ПодтвердитьОперациюРезультат(РезультатВызова, ВходящийКонтекст); + Иначе + ВходящийКонтекст.ДанныеПодтверждения = ДанныеПодтверждения; + ОбъектОповещения = Новый ОписаниеОповещения("ПодтвердитьОперациюПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СервисКриптографииDSSПодтверждениеКлиент.ОтправкаЗапроса(ОповещениеСледующее, + ВходящийКонтекст.НастройкиПользователя, + ДанныеПодтверждения, + ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + Иначе + ПодтвердитьОперациюРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодтвердитьОперацию. +Процедура ПодтвердитьОперациюРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПроверитьПинКодСертификата + +// Вспомогательный процесс для проверки пин-кода сертификата +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение сведений о сертификате по отпечатку +// 4. проверка валидности пин-кода фоновым заданием +// 5. сохранение нового токена для сеанса, возврат результата проверки пин-кода. +// +Процедура ПроверитьПинКодСертификата( + НастройкиПользователя, + ОповещениеОЗавершении, + ИдентификаторСертификата, + ПинКодСертификата, + ПараметрыОперации = Неопределено) + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Проверка пин-кода сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыЦикла.Вставить("ПинКодСертификата", ПинКодСертификата); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьПинКодСертификатаФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПинКодСертификата. +Процедура ПроверитьПинКодСертификатаФоновымЗаданием(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьПинКодСертификатаПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + НоваяОперация = СервисКриптографииDSSСлужебныйВызовСервера.ВалидацияПинКодаСертификата( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторСертификата, + ВходящийКонтекст.ПинКодСертификата, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, НоваяОперация, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ПроверитьПинКодСертификатаРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПинКодСертификата. +Процедура ПроверитьПинКодСертификатаПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + ПроверитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПинКодСертификата. +Процедура ПроверитьПинКодСертификатаРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПинКодСертификата + +// Вспомогательный процесс для ввода, проверки и смены пин-кода к закрытому ключу сертификата +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение сведений о сертификате по отпечатку +// 4. интерактивный ввод пин-кода (если его нет в сеансовых данных) +// 5. проверка валидности пин-кода фоновым заданием +// 6. проверка результата, если успешно то (7), иначе повторный ввод пин-код (4) +// 7. сохранение нового токена для сеанса, возврат результата проверки пин-кода. +// +Процедура ПинКодСертификата( + НастройкиПользователя, + ОповещениеОЗавершении, + ИдентификаторСертификата, + СменаПинКода = Ложь, + ПараметрыОперации = Неопределено) + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Ввод пин-кода сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыЦикла.Вставить("Сохранить", Ложь); + ПараметрыЦикла.Вставить("ИзменилсяПинКод", Ложь); + ПараметрыЦикла.Вставить("ОбновитьНастройки", Ложь); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПинКодСертификатаПолучитьСертификат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПинКодСертификата. +Процедура ПинКодСертификатаПолучитьСертификат(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НашлиСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторСертификата); + + Если НЕ ЗначениеЗаполнено(НашлиСертификат.Отпечаток) Тогда + ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(ОтветСервиса, "СертификатыНеОбнаружены"); + ПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + ВходящийКонтекст.Вставить("ОписаниеСертификата", НашлиСертификат); + ПинКодСертификатаЗапросВвода(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + + Иначе + ПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПинКодСертификата. +// +// Параметры: +// РезультатВызова - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура ПинКодСертификатаЗапросВвода(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ТекущийСертификат = ВходящийКонтекст.ОписаниеСертификата; + + Если ТекущийСертификат.ТребуетсяПинКод Тогда + Если ТребуетсяВводКонфиденциальныхДанных(ТекущийСертификат.ПинКод) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПинКодСертификатаПослеВвода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуВводПинКода( + НастройкиПользователя, + ОповещениеСледующее, + ТекущийСертификат, + ВходящийКонтекст.ПараметрыОперации); + ВходящийКонтекст.ОбновитьНастройки = Истина; + Иначе + ОбъектОповещения = Новый ОписаниеОповещения("ПинКодСертификатаПослеПроверки", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверитьПинКодСертификата(НастройкиПользователя, + ОповещениеСледующее, + ТекущийСертификат.Идентификатор, + ТекущийСертификат.ПинКод, + ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + Иначе + ПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + + Иначе + ПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПинКодСертификата. +// +// Параметры: +// РезультатВызова - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура ПинКодСертификатаПослеВвода(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + Если РезультатВызова.МаркерОбновлен Тогда + НашлиСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторСертификата); + ВходящийКонтекст.Вставить("ОписаниеСертификата", НашлиСертификат); + КонецЕсли; + + ТекущийСертификат = ВходящийКонтекст.ОписаниеСертификата; + ВходящийКонтекст.Вставить("Сохранить", СвойствоСтруктуры(РезультатВызова, "Сохранить", Ложь)); + ВходящийКонтекст.ОписаниеСертификата.ПинКод = РезультатВызова.Результат; + + Если ТекущийСертификат.ТребуетсяПинКод Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПинКодСертификатаПослеПроверки", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверитьПинКодСертификата(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ТекущийСертификат.Идентификатор, + ТекущийСертификат.ПинКод, + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПинКодСертификатаРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + Иначе + ПинКодСертификатаРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПинКодСертификата. +Процедура ПинКодСертификатаПослеПроверки(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + + Если РезультатВыполнения.Выполнено Тогда + ПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаПинКода(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПинКодСертификатаЗапросВвода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОписаниеСертификата.ПинКод = ""; + ОтобразитьОшибкуПользователю(ОповещениеСледующее, РезультатВыполнения.Ошибка, , ВходящийКонтекст.ПараметрыОперации); + + Иначе + ОписаниеСертификата.ПинКод = ""; + УстановитьПинКодСертификата(ОписаниеСертификата, ВходящийКонтекст.НастройкиПользователя, ОписаниеСертификата.ПинКод, ВходящийКонтекст.Сохранить, , ВходящийКонтекст.ПараметрыОперации); + РезультатВыполнения.Вставить("НастройкиПользователя", ВходящийКонтекст.НастройкиПользователя); + ПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПинКодСертификата. +Процедура ПинКодСертификатаРезультат(РезультатВызова, ВходящийКонтекст) + + Если РезультатВызова.Выполнено Тогда + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + Результат = Новый Структура(); + Результат.Вставить("Сохранить", ВходящийКонтекст.Сохранить); + Результат.Вставить("ПинКод", ОписаниеСертификата.ПинКод); + Результат.Вставить("ОбновилиПинКод", ВходящийКонтекст.ОбновитьНастройки); + + Если ВходящийКонтекст.ОбновитьНастройки Тогда + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + УстановитьПинКодСертификата(ОписаниеСертификата, НастройкиПользователя, ОписаниеСертификата.ПинКод, ВходящийКонтекст.Сохранить, , ВходящийКонтекст.ПараметрыОперации); + Результат.Вставить("НастройкиПользователя", НастройкиПользователя); + КонецЕсли; + + РезультатВызова.Вставить("Результат", Результат); + КонецЕсли; + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПолучитьДанныеСертификата + +// Запускает цикл получение основных сведений и содержимого сертификата +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение сведений о сертификате +// 4. проверка результата +// 5. сохранение нового токена для сеанса, возврат результата проверки пин-кода. +// +Процедура ПолучитьДанныеСертификата(НастройкиПользователя, + ОповещениеОЗавершении, + ИдентификаторСертификата, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Получение данных сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьДанныеСертификатаФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьДанныеСертификата. +Процедура ПолучитьДанныеСертификатаФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьДанныеСертификатаПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьДанныеСертификата( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторСертификата, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПолучитьДанныеСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПолучитьДанныеСертификата. +Процедура ПолучитьДанныеСертификатаПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПолучитьДанныеСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПолучитьДанныеСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьДанныеСертификатаФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПолучитьДанныеСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьДанныеСертификата. +Процедура ПолучитьДанныеСертификатаРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПолучитьСвойстваСертификата + +// Запускает цикл получение свойств сертификата сертификата +// Сервер возвращает данные в формате XML, c последующим преобразованием в структура с полями +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение свойств сертификата +// 4. сохранение нового токена для сеанса, возврат результата проверки пин-кода. +// +Процедура ПолучитьСвойстваСертификата(НастройкиПользователя, + ОповещениеОЗавершении, + ИдентификаторСертификата, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Получение сведений сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ИдентификаторСертификата", ИдентификаторСертификата); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьСвойстваСертификатаФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьСвойстваСертификата. +Процедура ПолучитьСвойстваСертификатаФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьСвойстваСертификатаПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьСвойстваСертификата( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторСертификата, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПолучитьСвойстваСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПолучитьСвойстваСертификата. +Процедура ПолучитьСвойстваСертификатаПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПолучитьСвойстваСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПолучитьСвойстваСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьСвойстваСертификатаФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПолучитьСвойстваСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьСвойстваСертификата. +Процедура ПолучитьСвойстваСертификатаРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбновитьДанныеСертификатов + +// Запускает цикл для процесса обновления кеша сертификатов +// +// Шаги цикла шифрования: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск фонового задания для обновления кеша +// 4. проверка успешности окончания операции +// 5. сохранение нового токена для сеанса, возврат результата обновления кеша. +// +Процедура ОбновитьДанныеСертификатов(НастройкиПользователя, + ОповещениеОЗавершении, + ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Обновление кеша сертификатов'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ОбновитьДанныеСертификатовФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ОбновитьДанныеСертификатов. +Процедура ОбновитьДанныеСертификатовФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОбновитьДанныеСертификатовПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьДанныеСертификатов( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ОбновитьДанныеСертификатовРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ОбновитьДанныеСертификатов. +Процедура ОбновитьДанныеСертификатовПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ОбновитьДанныеСертификатовРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ОбновитьДанныеСертификатовРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОбновитьДанныеСертификатовФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ОбновитьДанныеСертификатовРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбновитьДанныеСертификатов. +Процедура ОбновитьДанныеСертификатовРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область СоздатьЗапросНаСертификат + +// Запускает цикл получения запроса на сертификат +// Данная процедура может быть запущена как интерактивно, +// так и в "тихом" режиме, если переданы подготовленные данные для запроса +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. открытие формы для заполнения полей сертификата (по необходимости) +// 4. открытие формы запроса установки пин-кода (по необходимости) +// 5. запуск вложенного процесса подтверждения операции +// 6. проверка необходимости подтверждения, запуск вложенного процесса транзакции +// 7. создание нового запроса на сертификат +// 8. обработка ошибки создания запроса +// 9. сохранение нового токена для сеанса, возврат содержимого запроса на сертификат. +// +Процедура СоздатьЗапросНаСертификат(НастройкиПользователя, + ОповещениеОЗавершении, + ПараметрыОперации) Экспорт + + ГотовыйЗапрос = СвойствоСтруктуры(ПараметрыОперации, "ГотовыйЗапрос", Ложь); + ПоляЗапроса = СвойствоСтруктуры(ПараметрыОперации, "ПоляЗапроса", Новый Структура); + ПодтверждатьПринудительно = СвойствоСтруктуры(ПараметрыОперации, "ПодтверждатьПринудительно", Ложь); + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Создание запроса на сертификат'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ПоляЗапроса", ПоляЗапроса); + ПараметрыЦикла.Вставить("ПодтверждатьПринудительно", ПодтверждатьПринудительно); + + РезультатВызова = ОтветСервисаПоУмолчанию(); + + Если ГотовыйЗапрос Тогда + РезультатВызова.Вставить("Результат", ПоляЗапроса); + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатВводПинКода", ЭтотОбъект); + Иначе + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатЗаполнение", ЭтотОбъект); + КонецЕсли; + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатЗаполнение(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатПослеЗаполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ОткрытьФормуЗапросаНаСертификат(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ВходящийКонтекст.ПоляЗапроса, + ВходящийКонтекст.ПараметрыОперации); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатПослеЗаполнения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ВходящийКонтекст.ПоляЗапроса = РезультатВыполнения.Результат; + СоздатьЗапросНаСертификатВводПинКода(РезультатВыполнения, ВходящийКонтекст); + Иначе + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатВводПинКода(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ПинКод = СвойствоСтруктуры(ВходящийКонтекст.ПоляЗапроса, "ПинКод"); + РежимПинКода = ВходящийКонтекст.НастройкиПользователя.Политика.РежимПинКода <> "Запрещено"; + + Если ПинКод = Неопределено И РежимПинКода Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатПослеВводаПинКода", ЭтотОбъект); + ОбработчикСледующий = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуСменыПароля(ВходящийКонтекст.НастройкиПользователя, ОбработчикСледующий, "Установка", РежимПинКода = "Обязательно", ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ПинКод = Неопределено Тогда + ВходящийКонтекст.ПоляЗапроса.Вставить("ПинКод", ""); + СоздатьЗапросНаСертификатСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + Иначе + СоздатьЗапросНаСертификатСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + + Иначе + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатПослеВводаПинКода(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ВходящийКонтекст.ПоляЗапроса.Вставить("ПинКод", РезультатВыполнения.НовыйПинКод); + СоздатьЗапросНаСертификатСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + Иначе + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатСоздатьТранзакцию(ДлительнаяОперация, ВходящийКонтекст) + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ПодтверждатьПринудительно = ВходящийКонтекст.ПодтверждатьПринудительно; + КлючДействия = КлючДействияОперации("ЗапросНаСертификат", НастройкиПользователя); + ВходящийКонтекст.Вставить("Транзакция", КлючДействия.Подтверждать); + + Если КлючДействия.Подтверждать ИЛИ ПодтверждатьПринудительно Тогда + ПоляЗапроса = ВходящийКонтекст.ПоляЗапроса; + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатФоновымЗаданием", ЭтотОбъект); + СледующееОповещение = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПараметрыОперации = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииЗапросНаСертификат( + ПоляЗапроса.УдостоверяющийЦентр, + ПоляЗапроса.ШаблонСертификата, + ПоляЗапроса.ИмяСертификата); + + СоздатьТранзакцию(НастройкиПользователя, + СледующееОповещение, + ПараметрыОперации, + КлючДействия.КодОперации, + НСтр("ru = 'Подтвердите создание запроса на сертификат.'", КодЯзыка()), + , + ВходящийКонтекст.ПараметрыОперации); + Иначе + СоздатьЗапросНаСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + Иначе + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ВходящийКонтекст.ПараметрыОперации.Вставить("Транзакция", ВходящийКонтекст.Транзакция); + ПоляЗапроса = ВходящийКонтекст.ПоляЗапроса; + + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.СоздатьЗапросНаСертификат( + ВходящийКонтекст.НастройкиПользователя, + ПоляЗапроса.УдостоверяющийЦентр, + ПоляЗапроса.КриптоПровайдер, + ПоляЗапроса.ШаблонСертификата, + ПоляЗапроса.ПоляАтрибутов, + ПоляЗапроса.ПинКод, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ОбработкаОперации, ВходящийКонтекст.ПараметрыОперации); + + Иначе + СоздатьЗапросНаСертификатОшибка(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + СоздатьЗапросНаСертификатОшибка(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатОшибка(РезультатВыполнения, ВходящийКонтекст) + + Если НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаНеобработанныеЗапросы(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатПослеПредупреждения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СписокКоманд = Новый СписокЗначений; + СписокКоманд.Добавить("Просмотреть", НСтр("ru = 'Открыть список'"), Истина); + СписокКоманд.Добавить("Прервать", НСтр("ru = 'Прервать'")); + ВывестиВопрос(ОповещениеСледующее, + НСтр("ru = 'Не удалось создать новый запрос на сертификат, т.к. на сервере обнаружены ранее созданные, но не обработанные запросы на сертификат. + |Просмотреть список ранее созданных запросов?'"), + СписокКоманд, + 30, + НСтр("ru = 'Обнаружены необработанные запросы'"), + ВходящийКонтекст.ПараметрыОперации); + Иначе + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатПослеПредупреждения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено И РезультатВыполнения.Результат = "Просмотреть" Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатОбработка", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + УправлениеЗапросамиНаСертификат( + ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли РезультатВыполнения.Выполнено Тогда + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + СоздатьЗапросНаСертификатРезультат(ОтветВызова, ВходящийКонтекст); + Иначе + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатОбработка(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + Если ТипЗнч(РезультатВыполнения.Результат) = Тип("Число") Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СоздатьЗапросНаСертификатПроверитьПоля", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СервисКриптографииDSSКлиент.ПолучитьЗапросНаСертификат(ОповещениеСледующее, + ВходящийКонтекст.НастройкиПользователя, + РезультатВыполнения.Результат, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли РезультатВыполнения.Результат = Истина Тогда + СоздатьЗапросНаСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + Иначе + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатПроверитьПоля(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("КлючевоеПоле", "OID"); + + ПоляЗапроса = СервисКриптографииDSSASNКлиентСервер.ПолучитьСвойстваЗапросаНаСертификат(РезультатВыполнения.Результат.Содержание, ПараметрыОперации); + ПоляНовые = ВходящийКонтекст.ПоляЗапроса.ПоляАтрибутов; + ВсегоПравильных = ПоляНовые.Количество(); + + Для Каждого СтрокаКлюча Из ПоляНовые Цикл + Если СтрокаКлюча.Ключ = "2.5.4.3" + ИЛИ ВРег(СтрокаКлюча.Значение) = ВРег(ПоляЗапроса.Владелец[СтрокаКлюча.Ключ]) Тогда + ВсегоПравильных = ВсегоПравильных - 1; + КонецЕсли; + КонецЦикла; + + Если ВсегоПравильных > 0 Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь, "ПоляВыбранногоЗапросаНаСертификат") + КонецЕсли; + + КонецЕсли; + + Если НЕ РезультатВыполнения.Выполнено Тогда + СоздатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + СоздатьЗапросНаСертификатПослеВыполнения(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СоздатьЗапросНаСертификат. +Процедура СоздатьЗапросНаСертификатРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область УправлениеЗапросамиНаСертификат + +// Запускает цикл управления (просмотр, удаление, получение) для запросов на сертификат +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение списка запросов в статусе: обрабатывается +// 4. открытие формы со списком запросов +// 5. обработка результата выбора в форме выбора: удаление, выбор +// 6. сохранение нового токена для сеанса, возврат содержимого результата. +// +Процедура УправлениеЗапросамиНаСертификат(НастройкиПользователя, + ОповещениеОЗавершении, + ПараметрыОперации) + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Выбор запроса на сертификат'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("УправлениеЗапросамиНаСертификатСписокЗапросов", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры УправлениеЗапросамиНаСертификат. +Процедура УправлениеЗапросамиНаСертификатСписокЗапросов(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("УправлениеЗапросамиНаСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СервисКриптографииDSSКлиент.СписокЗапросовНаСертификат(ОповещениеСледующее, + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации); + + Иначе + УправлениеЗапросамиНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры УправлениеЗапросамиНаСертификат. +Процедура УправлениеЗапросамиНаСертификатПослеВыполнения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("УправлениеЗапросамиНаСертификатРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуВыбораСертификата(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + "Запросы", + Ложь, + РезультатВыполнения.Результат, + ВходящийКонтекст.ПараметрыОперации); + + Иначе + УправлениеЗапросамиНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры УправлениеЗапросамиНаСертификат. +Процедура УправлениеЗапросамиНаСертификатРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработатьЗапросыНаСертификат + +// Запускает цикл обработки функций для запросов на сертификат +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. выполнение функции на сервере +// 4. сохранение нового токена для сеанса, возврат содержимого результата. +// +Процедура ОбработатьЗапросыНаСертификат(НастройкиПользователя, + ОповещениеОЗавершении, + ВыполняемоеДействие, + ПараметрыВызова = Неопределено, + ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Обработка запроса на сертификат'", КодЯзыка()) + ": " + ВыполняемоеДействие); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ВыполняемоеДействие", ВыполняемоеДействие); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ИдентификаторЗапроса", СвойствоСтруктуры(ПараметрыВызова, "ИдентификаторЗапроса", 0)); + + ОбъектОповещения = Новый ОписаниеОповещения("ОбработатьЗапросыНаСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьЗапросыНаСертификат. +Процедура ОбработатьЗапросыНаСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОбработатьЗапросыНаСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ВыполняемоеДействие = ВходящийКонтекст.ВыполняемоеДействие; + + Если ВыполняемоеДействие = "СписокЗапросовНаСертификат" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.СписокЗапросовНаСертификат( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ПолучитьЗапросНаСертификат" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьЗапросНаСертификат( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "УдалитьЗапросНаСертификат" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.УдалитьЗапросНаСертификат( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторЗапроса, + ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДействияНаСервере, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ОбработатьЗапросыНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьЗапросыНаСертификат. +Процедура ОбработатьЗапросыНаСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ОбработатьЗапросыНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ОбработатьЗапросыНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОбработатьДокументФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ОбработатьЗапросыНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьЗапросыНаСертификат. +Процедура ОбработатьЗапросыНаСертификатРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ПолучитьИнформациюУдостоверяющихЦентров + +// Запускает цикл получения данных об удостоверяющих центрах доступных пользователю +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение списка УЦ из сеансовых настроек пользователя +// 4. сохранение нового токена для сеанса, возврат списка УЦ. +// +Процедура ПолучитьИнформациюУдостоверяющихЦентров(НастройкиПользователя, + ОповещениеОЗавершении, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Получение информации об УЦ'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьИнформациюУдостоверяющихЦентровЗаполнение", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьИнформациюУдостоверяющихЦентров. +Процедура ПолучитьИнформациюУдостоверяющихЦентровЗаполнение(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + + Результат = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьИнформациюУдостоверяющихЦентров( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации); + + РезультатВызова.Вставить("Результат", Результат); + + КонецЕсли; + + ПолучитьИнформациюУдостоверяющихЦентровРезультат(РезультатВызова, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьИнформациюУдостоверяющихЦентров. +Процедура ПолучитьИнформациюУдостоверяющихЦентровРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область УстановитьСертификат + +// Запускает цикл установки сертификата на сервере облачной криптографии +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. установка переданного сертификата фоновым заданием +// 4. сохранение нового токена для сеанса, возврат результата успеха. +// +Процедура УстановитьСертификат(НастройкиПользователя, + ОповещениеОЗавершении, + ДанныеСертификата, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Установка сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеСертификата", ДанныеСертификата); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("УстановитьСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры УстановитьСертификат. +Процедура УстановитьСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("УстановитьСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.УстановитьСертификат( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеСертификата, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + УстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры УстановитьСертификат. +Процедура УстановитьСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + УстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + УстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("УстановитьСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + УстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры УстановитьСертификат. +Процедура УстановитьСертификатРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область НайтиСертификат + +// Запускает цикл поиска сертификат +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение данных сертификата +// 4. создание объекта сертификата платформы +// 5. сохранение нового токена для сеанса, возврат результата успеха. +// +Процедура НайтиСертификат(ОповещениеОЗавершении, ОписаниеСертификата, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("ОписаниеСертификата", ОписаниеСертификата); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("НайтиСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры НайтиСертификат. +Процедура НайтиСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ОбъектОповещения = Новый ОписаниеОповещения("НайтиСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.НайтиСертификат( + ВходящийКонтекст.ОписаниеСертификата, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры НайтиСертификат. +Процедура НайтиСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + НайтиСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры НайтиСертификат. +Процедура НайтиСертификатРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область НазначитьОсновнымСертификат + +// Запускает цикл назначение сертификата основным (по умолчанию) на стороне сервера облачной криптографии +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. проверка и поиск идентификатор сертификата +// 4. установка / снятие переданного ид сертификата основным в фоновом задании +// 5. сохранение нового токена для сеанса, возврат результат успеха. +// +Процедура НазначитьОсновнымСертификат(НастройкиПользователя, + ОповещениеОЗавершении, + Сертификат, + Установить, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Установка основного сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("Сертификат", Сертификат); + ПараметрыЦикла.Вставить("Установить", Установить); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("НазначитьОсновнымСертификатПолучитьСертификат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры НазначитьОсновнымСертификат. +Процедура НазначитьОсновнымСертификатПолучитьСертификат(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ПроверитьТокенНаОбновление(РезультатВыполнения, НастройкиПользователя); + + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, ВходящийКонтекст.Сертификат); + + Если НЕ ЗначениеЗаполнено(ТекущийСертификат.Отпечаток) Тогда + ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(ОтветСервиса, "СертификатыНеОбнаружены"); + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + ВходящийКонтекст.Вставить("ОписаниеСертификата", ТекущийСертификат); + ОбъектОповещения = Новый ОписаниеОповещения("НазначитьОсновнымСертификатРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НазначитьОсновнымСертификатФоновымЗаданием(ОтветСервисаПоУмолчанию(Истина), ВходящийКонтекст); + КонецЕсли; + + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + НазначитьОсновнымСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("НазначитьОсновнымСертификатРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + + Иначе + НазначитьОсновнымСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры НазначитьОсновнымСертификат. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура НазначитьОсновнымСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("НазначитьОсновнымСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.НазначитьОсновнымСертификат( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.Установить, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + НазначитьОсновнымСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры НазначитьОсновнымСертификат. +Процедура НазначитьОсновнымСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НазначитьОсновнымСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + НазначитьОсновнымСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("НазначитьОсновнымСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + НазначитьОсновнымСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры НазначитьОсновнымСертификат. +Процедура НазначитьОсновнымСертификатРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область СменитьПинКодСертификата + +// Запускает цикл смены пин-кода для указанного сертификата +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. получение данных сертификата +// 4. запуск вложенного процесса ввода старого и нового пин-кода, проверка текущего пин-кода +// 5. запуск вложенного процесса подтверждения операции, при необходимости +// 6. запуск фонового задания для смены пин-код +// 7. проверка результата смены пин-кода +// 8. сохранение нового токена для сеанса, возврат результат успеха. +// +Процедура СменитьПинКодСертификата(НастройкиПользователя, + ОповещениеОЗавершении, + Сертификат, + ПараметрыОперации = Неопределено) Экспорт + + Если НастройкиПользователя = Неопределено Тогда + ТекущиеНастройки = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователяПоСертификату(Сертификат, ПараметрыОперации); + Иначе + ТекущиеНастройки = НастройкиПользователя; + КонецЕсли; + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Смена пин-кода сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", ТекущиеНастройки); + ПараметрыЦикла.Вставить("Сертификат", Сертификат); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("СменитьПинКодСертификатаПолучитьСертификат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры СменитьПинКодСертификата. +Процедура СменитьПинКодСертификатаПолучитьСертификат(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ПроверитьТокенНаОбновление(РезультатВыполнения, НастройкиПользователя); + + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, ВходящийКонтекст.Сертификат); + + Если НЕ ЗначениеЗаполнено(ТекущийСертификат.Отпечаток) Тогда + ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(ОтветСервиса, "СертификатыНеОбнаружены"); + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + ВходящийКонтекст.Вставить("ОписаниеСертификата", ТекущийСертификат); + ОбъектОповещения = Новый ОписаниеОповещения("СменитьПинКодСертификатаПослеВвода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуСменыПароля(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ?(ТекущийСертификат.ТребуетсяПинКод, "Смена", "Установка"), + Ложь, + ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СменитьПинКодСертификатаРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + + Иначе + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СменитьПинКодСертификата. +// +// Параметры: +// РезультатВызова - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура СменитьПинКодСертификатаПослеВвода(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + ТекущийСертификат = ВходящийКонтекст.ОписаниеСертификата; + ВходящийКонтекст.Вставить("Сохранить", РезультатВызова.Сохранить); + ВходящийКонтекст.Вставить("СтарыйПинКод", РезультатВызова.Результат); + ВходящийКонтекст.Вставить("НовыйПинКод", РезультатВызова.НовыйПинКод); + + Если ТекущийСертификат.ТребуетсяПинКод Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СменитьПинКодСертификатаПроверкаПинКода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверитьПинКодСертификата(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ВходящийКонтекст.ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.СтарыйПинКод, + ВходящийКонтекст.ПараметрыОперации) + Иначе + СменитьПинКодСертификатаСоздатьТранзакцию(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + Иначе + СменитьПинКодСертификатаРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры СменитьПинКодСертификата. +Процедура СменитьПинКодСертификатаПроверкаПинКода(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + СменитьПинКодСертификатаСоздатьТранзакцию(РезультатВыполнения, ВходящийКонтекст); + + Иначе + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СменитьПинКодСертификата. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура СменитьПинКодСертификатаСоздатьТранзакцию(ДлительнаяОперация, ВходящийКонтекст) + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + КлючДействия = КлючДействияОперации("СменаПинКода", НастройкиПользователя); + ВходящийКонтекст.Вставить("Транзакция", КлючДействия.Подтверждать); + + Если КлючДействия.Подтверждать Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СменитьПинКодСертификатаФоновымЗаданием", ЭтотОбъект); + СледующееОповещение = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + ПараметрыТранзакции = СервисКриптографииDSSКлиентСервер.СвойстваТранзакцииСменыПинКода(ОписаниеСертификата.Идентификатор); + + СоздатьТранзакцию(НастройкиПользователя, + СледующееОповещение, + ПараметрыТранзакции, + КлючДействия.КодОперации, + НСтр("ru = 'Подтвердите смену пин-кода.'", КодЯзыка()), + , + ВходящийКонтекст.ПараметрыОперации); + Иначе + СменитьПинКодСертификатаФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + Иначе + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры СменитьПинКодСертификата. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура СменитьПинКодСертификатаФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СменитьПинКодСертификатаПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + ВходящийКонтекст.ПараметрыОперации.Вставить("Транзакция", ВходящийКонтекст.Транзакция); + Если ОписаниеСертификата.ТребуетсяПинКод Тогда + ВходящийКонтекст.НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + КонецЕсли; + + НоваяОперация = СервисКриптографииDSSСлужебныйВызовСервера.СменитьПинКодСертификата( + ВходящийКонтекст.НастройкиПользователя, + ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.СтарыйПинКод, + ВходящийКонтекст.НовыйПинКод, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, НоваяОперация, ВходящийКонтекст.ПараметрыОперации); + + Иначе + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры СменитьПинКодСертификата. +Процедура СменитьПинКодСертификатаПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + РезультатВыполнения.Вставить("Результат", ВходящийКонтекст.НовыйПинКод); + ОписаниеСертификата = ВходящийКонтекст.ОписаниеСертификата; + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + + ОписаниеСертификата.ПинКод = ВходящийКонтекст.НовыйПинКод; + УстановитьПинКодСертификата(ОписаниеСертификата, НастройкиПользователя, ОписаниеСертификата.ПинКод, ВходящийКонтекст.Сохранить, Истина, ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + СменитьПинКодСертификатаРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры СменитьПинКодСертификата. +Процедура СменитьПинКодСертификатаРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПроверитьСертификат + +// Запускает цикл проверки валидности сертификата +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск фонового задания для проверки сертификата +// 4. проверка результата выполнения +// 5. возврат результат успеха. +// +Процедура ПроверитьСертификат(НастройкиПользователя, ОповещениеОЗавершении, ДанныеСертификата, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Проверка сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеСертификата", ДанныеСертификата); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + Отбор = Новый Соответствие; + Отбор.Вставить("Методы.ПроверкаСертификата", "Заполнено"); + ПроверкаАутентификацииПользователяСОтбором(ОповещениеСледующее, ПараметрыЦикла, Отбор); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьСертификат. +Процедура ПроверитьСертификатФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ПроверитьСертификат( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеСертификата, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПроверитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПроверитьСертификат. +Процедура ПроверитьСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПроверитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПроверитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПроверитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьСертификат. +Процедура ПроверитьСертификатРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ПолучитьСведенияОПодписантах + +// Запускает цикл получения сведений о подписантах данных +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. запуск фонового задания для получения списка подписантов +// 4. проверка результата выполнения +// 5. возврат результат успеха. +// +Процедура ПолучитьСведенияОПодписантах(НастройкиПользователя, ОповещениеОЗавершении, ДанныеДокумента, ТипПодписи, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Получение сведений о подписантах'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("ТипПодписи", ТипПодписи); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьСведенияОПодписантахФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + Отбор = Новый Соответствие; + Отбор.Вставить("Методы.ПроверкаСертификата", "Заполнено"); + ПроверкаАутентификацииПользователяСОтбором(ОповещениеСледующее, ПараметрыЦикла, Отбор); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьСведенияОПодписантах. +Процедура ПолучитьСведенияОПодписантахФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьСведенияОПодписантахПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьСведенияОПодписантах( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ТипПодписи, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПолучитьСведенияОПодписантахРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПолучитьСведенияОПодписантах. +Процедура ПолучитьСведенияОПодписантахПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПолучитьСведенияОПодписантахРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПолучитьСведенияОПодписантахРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПолучитьСведенияОПодписантахРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьСведенияОПодписантах. +Процедура ПолучитьСведенияОПодписантахРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПроверитьПодпись + +// Запускает цикл проверки валидности подписи данных +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. запуск фонового задания для проверки подписи +// 4. проверка результата выполнения +// 5. возврат результат успеха. +// +Процедура ПроверитьПодпись(НастройкиПользователя, + ОповещениеОЗавершении, + ДанныеДокумента, + ИсходныйДокумент, + ТипПодписи, + ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Проверка подписи'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("ТипПодписи", ТипПодписи); + ПараметрыЦикла.Вставить("ИсходныйДокумент", ИсходныйДокумент); + ПараметрыЦикла.Вставить("СвойстваПроверки", СвойствоСтруктуры(ПараметрыОперации, "СвойстваПроверки")); + ПараметрыЦикла.Вставить("Сертификат", СвойствоСтруктуры(ПараметрыОперации, "Сертификат")); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьПодписьФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + Отбор = Новый Соответствие; + Отбор.Вставить("Методы.ПроверкаСертификата", "Заполнено"); + ПроверкаАутентификацииПользователяСОтбором(ОповещениеСледующее, ПараметрыЦикла, Отбор); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодпись. +Процедура ПроверитьПодписьФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьПодписьПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ПроверитьПодпись( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ИсходныйДокумент, + ВходящийКонтекст.ТипПодписи, + ВходящийКонтекст.СвойстваПроверки, + ВходящийКонтекст.Сертификат, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПроверитьПодписьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодпись. +Процедура ПроверитьПодписьПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПроверитьПодписьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПроверитьПодписьРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьПодписьФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПроверитьПодписьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодпись. +Процедура ПроверитьПодписьРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ПолучитьЗаписиАудита + +// Запускает цикл получения записей аудита действий пользователя на сервере +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск фонового задания для получения записей аудита +// 4. проверка успешности окончания операции +// 5. сохранение нового токена для сеанса, возврат массива записей аудита. +// +Процедура ПолучитьЗаписиАудита(НастройкиПользователя, + ОповещениеОЗавершении, + Фильтры, + НачальнаяПозиция, + КонечнаяПозиция, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Получений выборки записей аудита'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("Фильтры", Фильтры); + ПараметрыЦикла.Вставить("НачальнаяПозиция", НачальнаяПозиция); + ПараметрыЦикла.Вставить("КонечнаяПозиция", КонечнаяПозиция); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьЗаписиАудитаФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьЗаписиАудита. +Процедура ПолучитьЗаписиАудитаФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьЗаписиАудитаПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьЗаписиАудита( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.Фильтры, + ВходящийКонтекст.НачальнаяПозиция, + ВходящийКонтекст.КонечнаяПозиция, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПолучитьЗаписиАудитаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьЗаписиАудита. +Процедура ПолучитьЗаписиАудитаПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПолучитьЗаписиАудитаРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПолучитьЗаписиАудитаРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьЗаписиАудитаФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПолучитьЗаписиАудитаРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьЗаписиАудита. +Процедура ПолучитьЗаписиАудитаРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработатьДокумент + +// Универсальный цикл для сервиса обработки документов +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск фонового задания +// 4. проверка успешности окончания операции +// 5. сохранение нового токена для сеанса, возврат результата операции. +// +Процедура ОбработатьДокумент( + НастройкиПользователя, + ОповещениеОЗавершении, + ВыполняемаяОперация, + ПараметрыЗапроса, + ДанныеДокумента, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Обработка документов'", КодЯзыка()) + ": " + ВыполняемаяОперация); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыЗапроса", ПараметрыЗапроса); + ПараметрыЦикла.Вставить("ДанныеДокумента", ДанныеДокумента); + ПараметрыЦикла.Вставить("ВыполняемоеДействие", ВыполняемаяОперация); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ОбработатьДокументФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ОбработатьДокумент. +Процедура ОбработатьДокументФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОбработатьДокументПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ВыполняемоеДействие = ВходящийКонтекст.ВыполняемоеДействие; + + Если ВыполняемоеДействие = "ЗагрузитьДокумент" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ЗагрузитьДокумент( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ЗагрузитьПакетДокументов" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ЗагрузитьПакетДокументов( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ИнформацияОДокументеПоИдентификатору" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ИнформацияОДокументеПоИдентификатору( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ИнформацияОДокументеПоХешу" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ИнформацияОДокументеПоХешу( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ПолучитьОбработанныйДокумент" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьОбработанныйДокумент( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ИзменитьИнформациюОДокументе" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ИзменитьИнформациюОДокументе( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ПривязатьДокумент" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ПривязатьДокумент( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ДанныеДокумента, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "СконвертироватьДокумент" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.СконвертироватьДокумент( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ПолучитьИнформациюДокументаКонвертации" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьИнформациюДокументаКонвертации( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "УдалитьДокумент" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.УдалитьДокумент( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыЗапроса, + ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДействияНаСервере, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ОбработатьДокументРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьДокумент. +Процедура ОбработатьДокументПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ОбработатьДокументРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ОбработатьДокументРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОбработатьДокументФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ОбработатьДокументРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбработатьДокумент. +Процедура ОбработатьДокументРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ОперацияСЗакрытомКлючом + +// Запускает цикл операции с закрытым ключом +// Данная процедура может быть запущена как интерактивно, +// так а в "тихом" режиме, если переданы подготовленные данные для создания +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 4. открытие формы запроса установки пин-кода (по необходимости) +// 7. выполнение основной операции с закрытым ключом +// 8. сохранение нового токена для сеанса, возврат результат операции. +// +Процедура ОперацияСЗакрытомКлючом(НастройкиПользователя, + ОповещениеОЗавершении, + ВыполняемаяОперация, + ПараметрыВыполнения, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Операция с закрытым ключом'", КодЯзыка()) + ": " + ВыполняемаяОперация); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ВыполняемоеДействие", ВыполняемаяОперация); + ПараметрыЦикла.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); + ПараметрыЦикла.Вставить("ПинКод", СвойствоСтруктуры(ПараметрыВыполнения, "ПинКод")); + + ОбъектОповещения = Новый ОписаниеОповещения("ОперацияСЗакрытомКлючомВводПинКода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ОперацияСЗакрытомКлючом. +Процедура ОперацияСЗакрытомКлючомВводПинКода(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ПинКод = ВходящийКонтекст.ПинКод; + РежимПинКода = ВходящийКонтекст.НастройкиПользователя.Политика.РежимПинКода <> "Запрещено"; + ВыполняемоеДействие = ВходящийКонтекст.ВыполняемоеДействие; + + Если ПинКод = Неопределено И РежимПинКода И ВыполняемоеДействие = "СоздатьЗакрытыйКлюч" Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОперацияСЗакрытомКлючомПослеВводаПинКода", ЭтотОбъект); + ОбработчикСледующий = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуСменыПароля(ВходящийКонтекст.НастройкиПользователя, ОбработчикСледующий, "Установка", РежимПинКода = "Обязательно", ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ПинКод = Неопределено Тогда + ВходящийКонтекст.ПинКод = ""; + ОперацияСЗакрытомКлючомФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + Иначе + ОперацияСЗакрытомКлючомФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + + Иначе + ОперацияСЗакрытомКлючомРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОперацияСЗакрытомКлючом. +Процедура ОперацияСЗакрытомКлючомПослеВводаПинКода(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ВходящийКонтекст.ПинКод = РезультатВыполнения.НовыйПинКод; + ОперацияСЗакрытомКлючомФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + Иначе + ОперацияСЗакрытомКлючомРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОперацияСЗакрытомКлючом. +Процедура ОперацияСЗакрытомКлючомФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) + + Если РезультатВыполнения.Выполнено Тогда + + ОбъектОповещения = Новый ОписаниеОповещения("ОперацияСЗакрытомКлючомПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ВыполняемоеДействие = ВходящийКонтекст.ВыполняемоеДействие; + ПараметрыВыполнения = ВходящийКонтекст.ПараметрыВыполнения; + ДействияНаСервере = Неопределено; + + Если ВыполняемоеДействие = "СоздатьЗакрытыйКлюч" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.СоздатьЗакрытыйКлюч( + ВходящийКонтекст.НастройкиПользователя, + ПараметрыВыполнения.ИдентификаторАлгоритмаКлюча, + ПараметрыВыполнения.ПараметрыКлюча, + ВходящийКонтекст.ПинКод, + ВходящийКонтекст.ПараметрыОперации); + Иначе + + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, ПараметрыВыполнения.ИдентификаторСертификата); + + Если НЕ ЗначениеЗаполнено(ТекущийСертификат.Отпечаток) Тогда + РезультатОтвета = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатОтвета, + "certificate_not_found", + НСтр("ru = 'При установке параметра закрытого ключа'", КодЯзыка())); + ОперацияСЗакрытомКлючомРезультат(РезультатОтвета, ВходящийКонтекст); + + ИначеЕсли ВыполняемоеДействие = "УстановитьПараметрЗакрытогоКлюча" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.УстановитьПараметрЗакрытогоКлюча( + ВходящийКонтекст.НастройкиПользователя, + ТекущийСертификат.Идентификатор, + ПараметрыВыполнения.ИмяПараметра, + ПараметрыВыполнения.ЗначениеПараметра, + ВходящийКонтекст.ПараметрыОперации); + + ИначеЕсли ВыполняемоеДействие = "ПолучитьПараметрЗакрытогоКлюча" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьПараметрЗакрытогоКлюча( + ВходящийКонтекст.НастройкиПользователя, + ТекущийСертификат.Идентификатор, + ПараметрыВыполнения.ИмяПараметра, + ВходящийКонтекст.ПараметрыОперации); + + КонецЕсли; + + КонецЕсли; + + Если ДействияНаСервере <> Неопределено Тогда + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДействияНаСервере, ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + Иначе + ОперацияСЗакрытомКлючомРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ОперацияСЗакрытомКлючом. +Процедура ОперацияСЗакрытомКлючомПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ОперацияСЗакрытомКлючомРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ОперацияСЗакрытомКлючомРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ОперацияСЗакрытомКлючомРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОперацияСЗакрытомКлючом. +Процедура ОперацияСЗакрытомКлючомРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПодписатьАсинхронно + +// Цикл для подписи документа в асинхронном режиме +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. проверка и определение сертификата +// 4. проверка пин-кода к сертификату +// 5. запуск фонового задания +// 6. проверка успешности окончания операции +// 7. сохранение нового токена для сеанса, возврат результата операции. +// +Процедура ПодписатьАсинхронно( + НастройкиПользователя, + ОповещениеОЗавершении, + СвойствоПодписи, + Сертификат, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Асинхронная подпись'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("СвойствоПодписи", СвойствоПодписи); + ПараметрыЦикла.Вставить("Сертификат", Сертификат); + ПараметрыЦикла.Вставить("ПинКод", СвойствоСтруктуры(ПараметрыОперации, "ПинКод")); + ПараметрыЦикла.Вставить("АсинхронныйРежим", СвойствоСтруктуры(ПараметрыОперации, "АсинхронныйРежим", Ложь)); + ПараметрыЦикла.Вставить("ОбратныйВызов", СвойствоСтруктуры(ПараметрыОперации, "ОбратныйВызов", "")); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьАсинхронноПолучитьСертификат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ПодписатьАсинхронно. +Процедура ПодписатьАсинхронноПолучитьСертификат(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + НастройкиПользователя = РезультатВыполнения.НастройкиПользователя; + ВходящийКонтекст.НастройкиПользователя = НастройкиПользователя; + + СвойствоПодписи = ВходящийКонтекст.СвойствоПодписи.Signature; + Если НастройкиПользователя.Политика.ТипыПодписей.Найти(СвойствоПодписи.Type) = Неопределено Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + "ТипПодписи", + НСтр("ru = 'Тип подписи:'", КодЯзыка()) + " " + + СвойствоПодписи.Type); + ПодписатьАсинхронноРезультат(РезультатВыполнения, ВходящийКонтекст); + + Иначе + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, ВходящийКонтекст.Сертификат); + + Если НЕ ЗначениеЗаполнено(ТекущийСертификат.Отпечаток) Тогда + РезультатОтвета = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатОтвета, + "certificate_not_found", + НСтр("ru = 'При асинхронном подписании'", КодЯзыка())); + ПодписатьАсинхронноРезультат(РезультатОтвета, ВходящийКонтекст); + + ИначеЕсли ВходящийКонтекст.ПинКод <> Неопределено Тогда + ТекущийСертификат.ПинКод = СервисКриптографииDSSКлиентСервер.ПодготовитьОбъектПароля(ВходящийКонтекст.ПинКод, НастройкиПользователя.АвторизованныйПользователь); + РезультатВыполнения = ОтветСервисаПоУмолчанию(); + ВходящийКонтекст.Вставить("ОписаниеСертификата", ТекущийСертификат); + ВходящийКонтекст.Вставить("ПредставлениеСертификата", ТекущийСертификат); + ПодписатьАсинхронноПослеВводаПинКода(РезультатВыполнения, ВходящийКонтекст); + + Иначе + ВходящийКонтекст.Вставить("ОписаниеСертификата", ТекущийСертификат); + ВходящийКонтекст.Вставить("ПредставлениеСертификата", ТекущийСертификат); + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьАсинхронноПослеВводаПинКода", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПинКодСертификата(ВходящийКонтекст.НастройкиПользователя, ОповещениеСледующее, ТекущийСертификат.Идентификатор, ВходящийКонтекст.ПараметрыОперации); + + КонецЕсли; + КонецЕсли; + + Иначе + ПодписатьАсинхронноРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодписатьАсинхронно. +Процедура ПодписатьАсинхронноПослеВводаПинКода(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + Если РезультатВыполнения.Результат.ОбновилиПинКод Тогда + ВходящийКонтекст.НастройкиПользователя = РезультатВыполнения.Результат.НастройкиПользователя; + КонецЕсли; + ПодписатьАсинхронноФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст); + Иначе + ПодписатьАсинхронноРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодписатьАсинхронно. +// +// Параметры: +// РезультатВыполнения - Структура +// ВходящийКонтекст - Структура: +// * ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// +Процедура ПодписатьАсинхронноФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьАсинхронноПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ПодписатьАсинхронно( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.СвойствоПодписи, + ВходящийКонтекст.ОписаниеСертификата.Идентификатор, + ВходящийКонтекст.ОписаниеСертификата.ПинКод, + ВходящийКонтекст.АсинхронныйРежим, + ВходящийКонтекст.ПараметрыОперации); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДействияНаСервере, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ПодписатьАсинхронноРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодписатьАсинхронно. +Процедура ПодписатьАсинхронноПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ПодписатьАсинхронноРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПодписатьАсинхронноРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПодписатьАсинхронноФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ПодписатьАсинхронноРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПодписатьАсинхронно. +Процедура ПодписатьАсинхронноРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ДанныеОпераций + +// Универсальный цикл для сервиса обработки операций +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя +// 3. запуск фонового задания для получения записей аудита +// 4. проверка успешности окончания операции +// 5. сохранение нового токена для сеанса, возврат результата операции. +// +Процедура ДанныеОпераций( + НастройкиПользователя, + ОповещениеОЗавершении, + ВыполняемаяОперация, + ИдентификаторОперации, + ПараметрыОперации) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Данные операций'", КодЯзыка()) + ": " + ВыполняемаяОперация); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ИдентификаторОперации", ИдентификаторОперации); + ПараметрыЦикла.Вставить("ВыполняемоеДействие", ВыполняемаяОперация); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ДанныеОперацийФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ДанныеОпераций. +Процедура ДанныеОперацийФоновымЗаданием(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ДанныеОперацийПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ВыполняемоеДействие = ВходящийКонтекст.ВыполняемоеДействие; + + Если ВыполняемоеДействие = "СведенияОбОперации" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.СведенияОбОперации( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторОперации, + ВходящийКонтекст.ПараметрыОперации); + ИначеЕсли ВыполняемоеДействие = "ВыполнитьОперацию" Тогда + ДействияНаСервере = СервисКриптографииDSSСлужебныйВызовСервера.ВыполнитьОперацию( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ИдентификаторОперации, + ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДействияНаСервере, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ДанныеОперацийРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ДанныеОпераций. +Процедура ДанныеОперацийПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ДанныеОперацийРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ДанныеОперацийРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВыполнения.Ошибка) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ДанныеОперацийФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст, Истина); + Иначе + ДанныеОперацийРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ДанныеОпераций. +Процедура ДанныеОперацийРезультат(РезультатВызова, ВходящийКонтекст) + + ПодготовленныйРезультат = ПодготовитьПсевдонимыОтвета(РезультатВызова, ВходящийКонтекст.ПараметрыОперации); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область ВыборСертификата + +// Запускает цикл интерактивного выбора сертификата +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. открыть форму выбора сертификата +// 4. возврат результат выбора. +// +Процедура ВыборСертификата(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Выбор сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ПолноеОписаниеСертификата", СвойствоСтруктуры(ПараметрыОперации, "ПолноеОписаниеСертификата", Ложь)); + + ОбъектОповещения = Новый ОписаниеОповещения("ВыборСертификатаВыбор", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ВыборСертификата. +Процедура ВыборСертификатаВыбор(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВыполнения, ВходящийКонтекст.НастройкиПользователя); + ВходящийКонтекст.Вставить("МаркерОбновлен", РезультатВыполнения.МаркерОбновлен); + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ВыборСертификатаРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуВыбораСертификата(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + "Сертификаты", + ВходящийКонтекст.ПолноеОписаниеСертификата, + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПроверитьПодписьРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ВыборСертификата. +Процедура ВыборСертификатаРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВызова.МаркерОбновлен = ВходящийКонтекст.МаркерОбновлен; + Если РезультатВызова.МаркерОбновлен Тогда + РезультатВызова.Вставить("НастройкиПользователя", ВходящийКонтекст.НастройкиПользователя); + КонецЕсли; + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПоказатьСертификат + +// Запускает цикл для получения сведений о сертификате +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. фоновым заданием получает сведения о сертификата +// 4. открыть форму просмотра сведений о сертификате +// 5. возврат результата успеха. +// +Процедура ПоказатьСертификат(НастройкиПользователя, ОповещениеОЗавершении, Сертификат, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Показать сведения сертификата'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении",ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя",НастройкиПользователя); + ПараметрыЦикла.Вставить("Сертификат", Сертификат); + ПараметрыЦикла.Вставить("ПараметрыОперации", ВходящиеПараметры); + ПараметрыЦикла.Вставить("ПоказатьСведениеСервиса", СвойствоСтруктуры(ВходящиеПараметры, "ПоказатьСведениеСервиса", Ложь)); + ПараметрыЦикла.Вставить("ФормаВладелец", СвойствоСтруктуры(ВходящиеПараметры, "ФормаВладелец")); + + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПоказатьСертификат. +Процедура ПоказатьСертификатФоновымЗаданием(РезультатВызова, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВызова, ВходящийКонтекст.НастройкиПользователя); + ВходящийКонтекст.Вставить("МаркерОбновлен", РезультатВызова.МаркерОбновлен); + + Если РезультатВызова.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + Если ВходящийКонтекст.ПоказатьСведениеСервиса Тогда + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьСвойстваСертификата( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.Сертификат); + Иначе + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьДанныеСертификата( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.Сертификат); + КонецЕсли; + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ОбработкаОперации, ВходящийКонтекст.ПараметрыОперации); + Иначе + ПоказатьСертификатРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПоказатьСертификат. +Процедура ПоказатьСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ТекущийСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(ВходящийКонтекст.НастройкиПользователя, ВходящийКонтекст.Сертификат); + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьСертификатРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("СведенияСертификата", ТекущийСертификат); + ПараметрыФормы.Вставить("РежимПросмотра", "Сертификат"); + + Если ВходящийКонтекст.ПоказатьСведениеСервиса Тогда + ПараметрыФормы.Вставить("АдресСертификата", ПоместитьВоВременноеХранилище(РезультатВыполнения.Результат)); + Иначе + ПараметрыФормы.Вставить("АдресСертификата", ПоместитьВоВременноеХранилище(РезультатВыполнения.Результат.Сертификат)); + КонецЕсли; + + ОткрытьФормуСертификата(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ПараметрыФормы, + ВходящийКонтекст.ФормаВладелец, + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПоказатьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПоказатьСертификат. +Процедура ПоказатьСертификатРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПоказатьЗапросНаСертификат + +// Запускает цикл для получения сведений о запросе на сертификат +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. фоновым заданием получает сведения о сертификата +// 4. открыть форму просмотра сведений о сертификате +// 5. возврат результата успеха. +// +Процедура ПоказатьЗапросНаСертификат(НастройкиПользователя, ОповещениеОЗавершении, ЗапросНаСертификат, ПараметрыОперации = Неопределено) Экспорт + + ВходящиеПараметры = ПроверитьПараметрыОперации(ПараметрыОперации); + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Показать сведения запроса на сертификат'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении",ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя",НастройкиПользователя); + ПараметрыЦикла.Вставить("ЗапросНаСертификат", ЗапросНаСертификат); + ПараметрыЦикла.Вставить("ПараметрыОперации", ВходящиеПараметры); + ПараметрыЦикла.Вставить("ФормаВладелец", СвойствоСтруктуры(ВходящиеПараметры, "ФормаВладелец")); + + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьЗапросНаСертификатФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПоказатьЗапросНаСертификат. +Процедура ПоказатьЗапросНаСертификатФоновымЗаданием(РезультатВызова, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВызова, ВходящийКонтекст.НастройкиПользователя); + ВходящийКонтекст.Вставить("МаркерОбновлен", РезультатВызова.МаркерОбновлен); + + Если РезультатВызова.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьЗапросНаСертификатПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + Если ТипЗнч(ВходящийКонтекст.ЗапросНаСертификат) = Тип("Число") Тогда + НачатьЗамерВремени(ВходящийКонтекст); + + ОбработкаОперации = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьЗапросНаСертификат( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ЗапросНаСертификат); + + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ОбработкаОперации, ВходящийКонтекст.ПараметрыОперации); + + Иначе + ОтветСервиса = ОтветСервисаПоУмолчанию(Истина); + ОтветСервиса.Вставить("Результат", ВходящийКонтекст.ЗапросНаСертификат); + ВыполнитьОбработкуОповещения(ОповещениеСледующее, ОтветСервиса); + + КонецЕсли; + + Иначе + ПоказатьЗапросНаСертификатРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПоказатьЗапросНаСертификат. +Процедура ПоказатьЗапросНаСертификатПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + ВходящийКонтекст.ПараметрыОперации.Вставить("ПоказатьСведениеСервиса", Истина); + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьЗапросНаСертификатРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("АдресСертификата", ПоместитьВоВременноеХранилище(РезультатВыполнения.Результат.Содержание)); + ПараметрыФормы.Вставить("РежимПросмотра", "ЗапросНаСертификат"); + + ОткрытьФормуСертификата(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ПараметрыФормы, + ВходящийКонтекст.ФормаВладелец, + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПоказатьЗапросНаСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПоказатьЗапросНаСертификат. +Процедура ПоказатьЗапросНаСертификатРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область СохранитьДанныеВФайл + +// Запускает цикл для сохранения файла на стороне клиента +// Добавлена возможность вызова диалога для пользователя +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. вложенный процесс проверки установки расширения работы с файлами +// 3. открыть диалог выбора файла, по необходимости +// 4. подготовка данных к записи (двоичные данные) +// 5. запись файла, асинхронным методом +// 6. возврат результата операции. +// +Процедура СохранитьДанныеВФайл(ОповещениеОЗавершении, ДанныеФайла, ИмяФайла, ВыборФайла = Ложь, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении",ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыЦикла.Вставить("ИмяФайла", ИмяФайла); + ПараметрыЦикла.Вставить("НуженВыборФайла", ВыборФайла); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'При записи файла'", КодЯзыка()) + ": " + ИмяФайла); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + СохранитьДанныеВФайлПроверитьРасширение(Неопределено, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры СохранитьДанныеВФайл. +Процедура СохранитьДанныеВФайлПроверитьРасширение(РезультатВыполнения, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("СохранитьДанныеВФайлПослеУстановкиРасширения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ТекстСообщения = НСтр("ru = 'Для продолжения работы требуется установить расширение для работы с файлами.'", КодЯзыка()); + + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(ОповещениеСледующее, ТекстСообщения, Ложь); + +КонецПроцедуры + +// Продолжение процедуры СохранитьДанныеВФайл. +Процедура СохранитьДанныеВФайлПослеУстановкиРасширения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения Тогда + Если ВходящийКонтекст.НуженВыборФайла Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СохранитьДанныеВФайлПослеВыбораФайла", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ЭтоРасширение = Лев(ВходящийКонтекст.ИмяФайла, 1) = "."; + ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + Если ЭтоРасширение Тогда + ДиалогВыбора.Расширение = Сред(ВходящийКонтекст.ИмяФайла, 2); + ДиалогВыбора.Фильтр = "(*" + ВходящийКонтекст.ИмяФайла + ")|*" + ВходящийКонтекст.ИмяФайла; + Иначе + ДиалогВыбора.ПолноеИмяФайла = ВходящийКонтекст.ИмяФайла; + КонецЕсли; + ДиалогВыбора.МножественныйВыбор = Ложь; + ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(ОповещениеСледующее, ДиалогВыбора); + Иначе + СохранитьДанныеВФайлПодготовитьДанные(ВходящийКонтекст); + КонецЕсли; + Иначе + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь, "УстановкаРасширенияСФайлами"); + СохранитьДанныеВФайлРезультат(ОтветВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СохранитьДанныеВФайл. +Процедура СохранитьДанныеВФайлПослеВыбораФайла(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения <> Неопределено Тогда + ВходящийКонтекст.ИмяФайла = РезультатВыполнения[0]; + СохранитьДанныеВФайлПодготовитьДанные(ВходящийКонтекст); + Иначе + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + СохранитьДанныеВФайлРезультат(ОтветВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СохранитьДанныеВФайл. +Процедура СохранитьДанныеВФайлПодготовитьДанные(ВходящийКонтекст) + + ДанныеФайла = ВходящийКонтекст.ДанныеФайла; + ТипДанных = ТипЗнч(ВходящийКонтекст.ДанныеФайла); + ЭтоДвоичные = Ложь; + + Если ТипДанных = Тип("Строка") Тогда + Если ЭтоАдресВременногоХранилища(ДанныеФайла) Тогда + ДанныеФайла = ПолучитьИзВременногоХранилища(ДанныеФайла); + ТипДанных = ТипЗнч(ДанныеФайла); + КонецЕсли; + КонецЕсли; + + Если ТипДанных = Тип("ДвоичныеДанные") Тогда + ЭтоДвоичные = Истина; + КонецЕсли; + + Если ТипДанных = Тип("Строка") Тогда + Если СтрНайти(ДанныеФайла, ".") > 0 Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СохранитьДанныеВФайлПриПолученииДвоичныхДанных", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьСозданиеДвоичныхДанныхИзФайла(ОповещениеСледующее, ДанныеФайла); + ЭтоДвоичные = Истина; + Возврат; + Иначе + ДанныеФайла = ПолучитьДвоичныеДанныеИзBase64Строки(ДанныеФайла); + ЭтоДвоичные = Истина; + КонецЕсли; + КонецЕсли; + + Если ЭтоДвоичные Тогда + СохранитьДанныеВФайлПриПолученииДвоичныхДанных(ДанныеФайла, ВходящийКонтекст); + Иначе + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь, "ОшибкаВыполнения"); + СохранитьДанныеВФайлРезультат(ОтветВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СохранитьДанныеВФайл. +Процедура СохранитьДанныеВФайлПриПолученииДвоичныхДанных(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения <> Неопределено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("СохранитьДанныеВФайлПослеЗаписи", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + РезультатВыполнения.НачатьЗапись(ОповещениеСледующее, ВходящийКонтекст.ИмяФайла); + Иначе + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь, "ОшибкаВыполнения"); + СохранитьДанныеВФайлРезультат(ОтветВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры СохранитьДанныеВФайл. +Процедура СохранитьДанныеВФайлПослеЗаписи(ВходящийКонтекст) Экспорт + + ОтветВызова = ОтветСервисаПоУмолчанию(); + ОтветВызова.Вставить("Результат", ВходящийКонтекст.ИмяФайла); + + СохранитьДанныеВФайлРезультат(ОтветВызова, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры СохранитьДанныеВФайл. +Процедура СохранитьДанныеВФайлРезультат(РезультатВыполнения, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +#Область ЗагрузитьДанныеИзФайла + +// Запускает цикл для загрузки данных из файла на стороне клиента +// Добавлена возможность вызова диалога для пользователя +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. вложенный процесс проверки установки расширения работы с файлами +// 3. открыть диалог выбора файла, по необходимости +// 4. получение данных файла, асинхронным методом +// 5. возврат результата операции (адрес хранилища или двоичные данные). +// +Процедура ЗагрузитьДанныеИзФайла(ОповещениеОЗавершении, ИмяФайла, АдресХранилища, ВыборФайла = Ложь, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении",ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("АдресХранилища", АдресХранилища); + ПараметрыЦикла.Вставить("ИмяФайла", ИмяФайла); + ПараметрыЦикла.Вставить("НуженВыборФайла", ВыборФайла); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'При загрузке файла'", КодЯзыка()) + ": " + ИмяФайла); + + ЗагрузитьДанныеИзФайлаПроверитьРасширение(Неопределено, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьДанныеИзФайла. +Процедура ЗагрузитьДанныеИзФайлаПроверитьРасширение(РезультатВыполнения, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеИзФайлаПослеУстановкиРасширения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + + ТекстСообщения = НСтр("ru = 'Для продолжения работы требуется установить расширение для работы с файлами.'", КодЯзыка()); + + ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(ОповещениеСледующее, ТекстСообщения, Ложь); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьДанныеИзФайла. +Процедура ЗагрузитьДанныеИзФайлаПослеУстановкиРасширения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения Тогда + Если ВходящийКонтекст.НуженВыборФайла Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеИзФайлаПослеВыбораФайла", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ЭтоРасширение = Лев(ВходящийКонтекст.ИмяФайла, 1) = "."; + ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + Если ЭтоРасширение Тогда + ДиалогВыбора.Расширение = Сред(ВходящийКонтекст.ИмяФайла, 2); + ДиалогВыбора.Фильтр = "(*" + ВходящийКонтекст.ИмяФайла + ")|*" + ВходящийКонтекст.ИмяФайла; + Иначе + ДиалогВыбора.ПолноеИмяФайла = ВходящийКонтекст.ИмяФайла; + КонецЕсли; + ДиалогВыбора.МножественныйВыбор = Ложь; + ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(ОповещениеСледующее, ДиалогВыбора); + Иначе + ЗагрузитьДанныеИзФайлаПодготовитьДанные(Неопределено, ВходящийКонтекст); + КонецЕсли; + Иначе + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь, "УстановкаРасширенияСФайлами"); + ЗагрузитьДанныеИзФайлаРезультат(ОтветВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьДанныеИзФайла. +Процедура ЗагрузитьДанныеИзФайлаПослеВыбораФайла(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения <> Неопределено Тогда + ВходящийКонтекст.ИмяФайла = РезультатВыполнения[0]; + ЗагрузитьДанныеИзФайлаПодготовитьДанные(Неопределено, ВходящийКонтекст); + Иначе + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + ЗагрузитьДанныеИзФайлаРезультат(ОтветВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьДанныеИзФайла. +Процедура ЗагрузитьДанныеИзФайлаПодготовитьДанные(РезультатВыполнения, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеИзФайлаПослеПолученииДвоичныхДанных", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьСозданиеДвоичныхДанныхИзФайла(ОповещениеСледующее, ВходящийКонтекст.ИмяФайла); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьДанныеИзФайла. +Процедура ЗагрузитьДанныеИзФайлаПослеПолученииДвоичныхДанных(РезультатВыполнения, ВходящийКонтекст) Экспорт + + РезультатВызова = ОтветСервисаПоУмолчанию(); + Если РезультатВыполнения <> Неопределено Тогда + Результат = Новый Структура(); + Результат.Вставить("ИмяФайла", ВходящийКонтекст.ИмяФайла); + Результат.Вставить("ДанныеФайла", ""); + + Если ЗначениеЗаполнено(ВходящийКонтекст.АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(РезультатВыполнения, ВходящийКонтекст.АдресХранилища); + Результат.ДанныеФайла = ВходящийКонтекст.АдресХранилища; + Иначе + Результат.ДанныеФайла = РезультатВыполнения; + КонецЕсли; + РезультатВызова.Вставить("Результат", Результат); + Иначе + РезультатВызова.Выполнено = Ложь; + ПолучитьОписаниеОшибки(РезультатВызова, "ПолучениеФайла"); + КонецЕсли; + + ЗагрузитьДанныеИзФайлаРезультат(РезультатВызова, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ЗагрузитьДанныеИзФайла. +Процедура ЗагрузитьДанныеИзФайлаРезультат(РезультатВыполнения, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +#Область ПоказатьСостояниеУчетнойЗаписи + +// Запускает цикл интерактивного отображения состояние учетной записи +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. открыть форму отображения состояния учетной записи +// 4. возврат результат успеха. +// +Процедура ПоказатьСостояниеУчетнойЗаписи(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Показать состояние учетной записи'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ФорматРезультата", СвойствоСтруктуры(ПараметрыОперации, "ФорматРезультата")); + + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьСостояниеУчетнойЗаписиОтобразить", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПоказатьСостояниеУчетнойЗаписи. +Процедура ПоказатьСостояниеУчетнойЗаписиОтобразить(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВыполнения, ВходящийКонтекст.НастройкиПользователя); + ВходящийКонтекст.Вставить("МаркерОбновлен", РезультатВыполнения.МаркерОбновлен); + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПоказатьСостояниеУчетнойЗаписиРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + Если ВходящийКонтекст.ФорматРезультата = "XML" Тогда + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.СостояниеУчетнойЗаписи( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + + Иначе + ОткрытьФормуСостоянияУчетнойЗаписи(ВходящийКонтекст.НастройкиПользователя, ОповещениеСледующее, ВходящийКонтекст.ПараметрыОперации); + КонецЕсли; + Иначе + ПоказатьСостояниеУчетнойЗаписиРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли + +КонецПроцедуры + +// Продолжение процедуры ПоказатьСостояниеУчетнойЗаписи. +Процедура ПоказатьСостояниеУчетнойЗаписиРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(РезультатВызова, ВходящийКонтекст); + + РезультатВыполнения.МаркерОбновлен = ВходящийКонтекст.МаркерОбновлен; + Если РезультатВыполнения.МаркерОбновлен Тогда + РезультатВызова.Вставить("НастройкиПользователя", ВходящийКонтекст.НастройкиПользователя); + КонецЕсли; + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбновитьПолитикуПользователя + +// Запускает цикл принудительного обновления информации о политике настроек учетной записи +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, принудительная авторизация, вложенный процесс +// 3. запуск фонового получение новых значений политики +// 4. обновления токена авторизации, возврат результат успеха. +// +Процедура ОбновитьПолитикуПользователя(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Обновить политику пользователя'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении",ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя",НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ОбновилиПолитики", НастройкиПользователя = Неопределено); + + ОбъектОповещения = Новый ОписаниеОповещения("ОбновитьПолитикуПользователяФоновымЗаданием", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла, , Истина); + +КонецПроцедуры + +// Продолжение процедуры ОбновитьПолитикуПользователя. +Процедура ОбновитьПолитикуПользователяФоновымЗаданием(РезультатВызова, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВызова, ВходящийКонтекст.НастройкиПользователя); + ВходящийКонтекст.Вставить("МаркерОбновлен", РезультатВызова.МаркерОбновлен); + + Если РезультатВызова.Выполнено + И НЕ ВходящийКонтекст.ОбновилиПолитики Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ОбновитьПолитикуПользователяПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьПолитикуПользователя( + ВходящийКонтекст.НастройкиПользователя, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + Иначе + ОбновитьПолитикуПользователяРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОбновитьПолитикуПользователя. +Процедура ОбновитьПолитикуПользователяПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВыполнения.Выполнено Тогда + НовыеНастройки = РезультатВыполнения.НастройкиПользователя; + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьНастройкиПользователя(ВходящийКонтекст.НастройкиПользователя, НовыеНастройки); + КонецЕсли; + ПроверитьТокенНаОбновление(РезультатВыполнения, ВходящийКонтекст.НастройкиПользователя, Истина); + ОбновитьПолитикуПользователяРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ОбновитьПолитикуПользователя. +Процедура ОбновитьПолитикуПользователяРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ОткрытьСведенияУчетнойЗаписи + +// Запускает цикл открытия формы элемента справочника Учетные записи +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. открыть форму элемента +// 3. возврат результат успеха. +// +Процедура ОткрытьСведенияУчетнойЗаписи(ОповещениеОЗавершении, СсылкаУчетнойЗаписи, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Открыть сведения учетной записи'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("СсылкаУчетнойЗаписи", СсылкаУчетнойЗаписи); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + ОткрытьСведенияУчетнойЗаписиОтобразить(Неопределено, ПараметрыЦикла); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОткрытьСведенияУчетнойЗаписи. +Процедура ОткрытьСведенияУчетнойЗаписиОтобразить(РезультатВыполнения, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ОткрытьСведенияУчетнойЗаписиРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуСведенийУчетнойЗаписи(ОповещениеСледующее, ВходящийКонтекст.СсылкаУчетнойЗаписи, ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ОткрытьСведенияУчетнойЗаписи. +Процедура ОткрытьСведенияУчетнойЗаписиРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + // надо поменять параметры сеанса + Оповестить("ИзменилосьСостояниеУчетнойЗаписи", ВходящийКонтекст.СсылкаУчетнойЗаписи); + КонецЕсли; + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ВывестиОшибку + +// Запускает цикл отображения формы с ошибкой +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. открыть форму ошибки +// 3. возврат результат успеха. +// +Процедура ВывестиОшибку(ОповещениеОЗавершении, ТекстОшибки = "", ЭтоКодОшибки = Ложь, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Вывести ошибку сервиса'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("ТекстОшибки", ТекстОшибки); + ПараметрыЦикла.Вставить("ЭтоКодОшибки", ЭтоКодОшибки); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ВывестиОшибкуОтобразить(ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ВывестиОшибку. +Процедура ВывестиОшибкуОтобразить(ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ВывестиОшибкуРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОтобразитьОшибкуПользователю(ОповещениеСледующее, + ВходящийКонтекст.ТекстОшибки, + ВходящийКонтекст.ЭтоКодОшибки, + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ВывестиОшибку. +Процедура ВывестиОшибкуРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + Если ВходящийКонтекст.ОповещениеОЗавершении <> Неопределено Тогда + Если ВходящийКонтекст.ПараметрыОперации.Количество() > 0 Тогда + ВыполнитьОбработкуОповещения(ВходящийКонтекст.ОповещениеОЗавершении, ВходящийКонтекст.ПараметрыОперации); + Иначе + ВыполнитьОбработкуОповещения(ВходящийКонтекст.ОповещениеОЗавершении, РезультатВызова); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ВывестиИнформацию + +// Запускает цикл отображения формы с ошибкой +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. открыть форму ошибки +// 3. возврат результат успеха. +// +Процедура ВывестиИнформацию(ОповещениеОЗавершении, ТекстСообщения, ТаймаАут = Неопределено, Заголовок = "", ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Вывести информацию пользователю'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("ТекстСообщения", ТекстСообщения); + ПараметрыЦикла.Вставить("ТаймАут", ТаймаАут); + ПараметрыЦикла.Вставить("Заголовок", Заголовок); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ВывестиИнформациюОтобразить(ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ВывестиИнформацию. +Процедура ВывестиИнформациюОтобразить(ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ВывестиИнформациюРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОтобразитьИнформациюПользователю(ОповещениеСледующее, + ВходящийКонтекст.ТекстСообщения, + ВходящийКонтекст.ТаймАут, + ВходящийКонтекст.Заголовок, + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ВывестиИнформацию. +Процедура ВывестиИнформациюРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + Если ВходящийКонтекст.ОповещениеОЗавершении <> Неопределено Тогда + Если ВходящийКонтекст.ПараметрыОперации.Количество() > 0 Тогда + ВыполнитьОбработкуОповещения(ВходящийКонтекст.ОповещениеОЗавершении, ВходящийКонтекст.ПараметрыОперации); + Иначе + ВыполнитьОбработкуОповещения(ВходящийКонтекст.ОповещениеОЗавершении, РезультатВызова); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ВывестиВопрос + +// Запускает цикл отображения формы с ошибкой +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. открыть форму ошибки +// 3. возврат результат успеха. +// +Процедура ВывестиВопрос(ОповещениеОЗавершении, ТекстСообщения, СписокКоманд, ТаймаАут = Неопределено, Заголовок = "", ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Вопрос пользователю'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("ТекстСообщения", ТекстСообщения); + ПараметрыЦикла.Вставить("СписокКоманд", СписокКоманд); + ПараметрыЦикла.Вставить("ТаймАут", ТаймаАут); + ПараметрыЦикла.Вставить("Заголовок", Заголовок); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ВывестиВопросОтобразить(ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ВывестиИнформацию. +Процедура ВывестиВопросОтобразить(ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ВывестиВопросРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОтобразитьВопросПользователю(ОповещениеСледующее, + ВходящийКонтекст.ТекстСообщения, + ВходящийКонтекст.СписокКоманд, + ВходящийКонтекст.ТаймАут, + ВходящийКонтекст.Заголовок, + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ВывестиИнформацию. +Процедура ВывестиВопросРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПолучитьОписаниеСервиса + +// Запускает цикл получения данных сервиса обнаружения +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. запуск фонового задания для получения данных +// 4. возврат результат операции. +// +Процедура ПолучитьОписаниеСервиса(ОповещениеОЗавершении, АдресСервиса = "", ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Получение описание сервиса'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("АдресСервиса", АдресСервиса); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + ПолучитьОписаниеСервисаФоновымЗаданием(Неопределено, ПараметрыЦикла); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьОписаниеСервиса. +Процедура ПолучитьОписаниеСервисаФоновымЗаданием(РезультатВызова, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ПолучитьОписаниеСервисаПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + НачатьЗамерВремени(ВходящийКонтекст); + + ОжидатьЗавершенияВыполненияВФоне( + ОповещениеСледующее, + СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьОписаниеСервиса( + ВходящийКонтекст.АдресСервиса, + ВходящийКонтекст.ПараметрыОперации), + ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьОписаниеСервиса. +Процедура ПолучитьОписаниеСервисаПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + ПолучитьОписаниеСервисаРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьОписаниеСервиса. +Процедура ПолучитьОписаниеСервисаРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ВыбратьНастройкиСервиса + +// Запускает цикл интерактивного выбора настроек подключения к сервису +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. вложенный процесс получения сведений о настройках сервера +// 3. открытие формы выбора настроек +// 4. возврат результат операции. +// +Процедура ВыбратьНастройкиСервиса(ОповещениеОЗавершении, АдресСервиса = "", ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Выбор настроек из описания сервиса'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("АдресСервиса", АдресСервиса); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ВыбратьНастройкиСервисаПослеВыполнения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + ПолучитьОписаниеСервиса(ОповещениеСледующее, + ПараметрыЦикла.АдресСервиса, + ПараметрыЦикла.ПараметрыОперации); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ВыбратьНастройкиСервиса. +Процедура ВыбратьНастройкиСервисаПослеВыполнения(ДлительнаяОперация, ВходящийКонтекст) Экспорт + + РезультатВызова = ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст); + + Если РезультатВызова.Выполнено Тогда + ОписаниеСервиса = РезультатВызова.Результат; + ОбъектОповещения = Новый ОписаниеОповещения("ВыбратьНастройкиСервисаПослеВыбора", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуВыбораНастроекСервиса(ОписаниеСервиса, ОповещениеСледующее, ВходящийКонтекст.ПараметрыОперации); + Иначе + ВходящийКонтекст.ПараметрыОперации.Вставить("ОтобразитьОшибку", Ложь); + ВыбратьНастройкиСервисаРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ВыбратьНастройкиСервиса. +Процедура ВыбратьНастройкиСервисаПослеВыбора(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + АдресЦИ = СтрЗаменить(РезультатВызова.Результат.АдресЦИ, ВходящийКонтекст.АдресСервиса, ""); + АдресСЭП = СтрЗаменить(РезультатВызова.Результат.АдресСЭП, ВходящийКонтекст.АдресСервиса, ""); + + Результат = Новый Структура(); + Результат.Вставить("СервисИдентификации", АдресЦИ); + Результат.Вставить("СервисПодписи", АдресСЭП); + РезультатВызова.Результат = Результат; + КонецЕсли; + + ВыбратьНастройкиСервисаРезультат(РезультатВызова, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ВыбратьНастройкиСервиса. +Процедура ВыбратьНастройкиСервисаРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ПроверитьРаботоспособностьСервиса + +// Запускает цикл интерактивного проверки работоспособности сервиса +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. проверка аутентификации пользователя, вложенный процесс +// 3. открытие формы проверки работоспособности +// 4. возврат результат операции. +// +Процедура ПроверитьРаботоспособностьСервиса(НастройкиПользователя, ОповещениеОЗавершении, СписокОпераций = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Проверка работоспособности сервиса'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("СписокОпераций", СписокОпераций); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьРаботоспособностьПослеВыбора", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьРаботоспособностьСервиса. +Процедура ПроверитьРаботоспособностьПослеВыбора(РезультатВызова, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВызова, ВходящийКонтекст.НастройкиПользователя); + ВходящийКонтекст.Вставить("МаркерОбновлен", РезультатВызова.МаркерОбновлен); + + Если РезультатВызова.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ПроверитьРаботоспособностьРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуПроверкиРаботоспособности(ВходящийКонтекст.НастройкиПользователя, + ОповещениеСледующее, + ВходящийКонтекст.СписокОпераций, + ВходящийКонтекст.ПараметрыОперации); + Иначе + ПроверитьРаботоспособностьРезультат(РезультатВызова, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьРаботоспособностьСервиса. +Процедура ПроверитьРаботоспособностьРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ПроверитьТокенНаОбновление(РезультатВызова, ВходящийКонтекст.НастройкиПользователя); + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ОткрытьСведенияСервера + +// Запускает цикл интерактивного открытия формы справочника Серверы облачной криптографии +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. открытие формы элемента справочника Серверы облачной криптографии +// 3. возврат результат операции. +// +Процедура ОткрытьСведенияСервера(ОповещениеОЗавершении, СсылкаСервера, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Открыть сведения сервера'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("СсылкаСервера", СсылкаСервера); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + ОткрытьСведенияСервераОтобразить(Неопределено, ПараметрыЦикла); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОткрытьСведенияСервера. +Процедура ОткрытьСведенияСервераОтобразить(РезультатВызова, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ОткрытьСведенияСервераРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуСведенийСервера(ОповещениеСледующее, ВходящийКонтекст.СсылкаСервера, ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ОткрытьСведенияСервера. +Процедура ОткрытьСведенияСервераРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ВыборЭкземпляраСервера + +// Запускает цикл интерактивного выбора из списка справочника Серверы облачной криптографии +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. открытие формы списка выбора справочника Серверы облачной криптографии +// 3. возврат результат операции. +// +Процедура ВыборЭкземпляраСервера(ОповещениеОЗавершении, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Выбор экземпляра сервера'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + + Если ИспользованиеОблачнойПодписиВозможно(ПараметрыЦикла) Тогда + ВыборЭкземпляраСервераОтобразить(Неопределено, ПараметрыЦикла); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ВыборЭкземпляраСервера. +Процедура ВыборЭкземпляраСервераОтобразить(РезультатВызова, ВходящийКонтекст) + + ОбъектОповещения = Новый ОписаниеОповещения("ВыборЭкземпляраСервераРезультат", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОткрытьФормуВыбораЭкземпляраСервера(ОповещениеСледующее, ВходящийКонтекст.ПараметрыОперации); + +КонецПроцедуры + +// Продолжение процедуры ВыборЭкземпляраСервера. +Процедура ВыборЭкземпляраСервераРезультат(РезультатВызова, ВходящийКонтекст) Экспорт + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область ДобавлениеПрограммыЭлектроннойПодписи + +Процедура ДобавлениеПрограммыЭлектроннойПодписи(ОповещениеОЗавершении = Неопределено, ПараметрыОперации = Неопределено) Экспорт + + ПараметрыЦикла = Новый Структура(); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + + ОбъектОповещения = Новый ОписаниеОповещения("ДобавлениеПрограммыЭлектроннойПодписиПослеВыбора", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ОткрытьФормуВыборПрограммы(ОповещениеСледующее, ПроверитьПараметрыОперации(ПараметрыОперации)); + +КонецПроцедуры + +Процедура ДобавлениеПрограммыЭлектроннойПодписиПослеВыбора(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено + И ВходящийКонтекст.ОповещениеОЗавершении = Неопределено Тогда + Если РезультатВыполнения.Результат = "ОблачнаяПодпись" Тогда + ПараметрыФормы = ВходящийКонтекст.ПараметрыОперации; + ПараметрыФормы.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + ОткрытьСведенияУчетнойЗаписи(Неопределено, Неопределено, ВходящийКонтекст.ПараметрыОперации); + Иначе + ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.ФормаОбъекта"); + КонецЕсли; + КонецЕсли; + + ДобавлениеПрограммыЭлектроннойПодписиРезультат(РезультатВыполнения, ВходящийКонтекст); + +КонецПроцедуры + +Процедура ДобавлениеПрограммыЭлектроннойПодписиРезультат(РезультатВызова, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова); + +КонецПроцедуры + +#КонецОбласти + +#Область РаботаСФоновымиЗаданиями + +// Только для внутреннего использования. +Процедура ОжидатьЗавершенияВыполненияВФоне(ОповещениеОЗавершении, ДлительнаяОперация, ПараметрыОперации = Неопределено) Экспорт + + Если ДлительнаяОперация.Статус = "Выполняется" Тогда + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено); + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + + ПояснениеОперации = СвойствоСтруктуры(ПараметрыОперации, "ПояснениеОперации", ""); + Если ЗначениеЗаполнено(ПояснениеОперации) Тогда + ПараметрыОжидания.ТекстСообщения = ПояснениеОперации; + КонецЕсли; + + ФормаВладелец = СвойствоСтруктуры(ПараметрыОперации, "ОжидатьВыполнения"); + Если ФормаВладелец = Ложь Тогда + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ИначеЕсли ФормаВладелец <> Неопределено Тогда + ПараметрыОжидания.ВыводитьОкноОжидания = Истина; + ПараметрыОжидания.ФормаВладелец = ?(ФормаВладелец = Истина, Неопределено, ФормаВладелец); + КонецЕсли; + + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); + + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, ДлительнаяОперация); + + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Структура - ОтветСервисаПоУмолчанию +// +Функция ПолучитьРезультатВыполненияВФоне(ДлительнаяОперация, ВходящийКонтекст = Неопределено) Экспорт + + Ответ = ОтветСервисаПоУмолчанию(Ложь); + ЗакончитьЗамерВремени(ВходящийКонтекст); + + ПараметрыОперации = СвойствоСтруктуры(ВходящийКонтекст, "ПараметрыОперации"); + НастройкиПользователя = СвойствоСтруктуры(ВходящийКонтекст, "НастройкиПользователя"); + + Если ДлительнаяОперация = Неопределено Тогда + Ответ.Ошибка = НСтр("ru = 'Работа сервиса облачной криптографии завершилась с ошибкой.'", КодЯзыка()); + ИначеЕсли ДлительнаяОперация.Свойство("Выполнено") Тогда + Ответ = ДлительнаяОперация; + ИначеЕсли ДлительнаяОперация.Статус = "Выполнено" Тогда + Ответ = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьРезультатВыполненияФоновогоЗадания(ДлительнаяОперация.АдресРезультата, ПараметрыОперации); + Иначе + Ответ.Ошибка = НСтр("ru = 'Вызов API сервиса облачной криптографии завершился с ошибкой при выполнении.'", КодЯзыка()) + + ДлительнаяОперация.КраткоеПредставлениеОшибки; + КонецЕсли; + + МаркерОбновлен = СвойствоСтруктуры(Ответ, "МаркерОбновлен"); + + Если НастройкиПользователя <> Неопределено И МаркерОбновлен <> Неопределено Тогда + ПроверитьТокенНаОбновление(Ответ, ВходящийКонтекст.НастройкиПользователя); + КонецЕсли; + + Возврат Ответ; + +КонецФункции + +Процедура ПодключитьФормуОжидания(ПараметрыОперации, НовыйРежим) + + ТекущийРежим = СвойствоСтруктуры(ПараметрыОперации, "ОжидатьВыполнения"); + Если ТекущийРежим = Неопределено Тогда + ПараметрыОперации.Вставить("ОжидатьВыполнения", НовыйРежим); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеДляРаботыОписанийОповещения + +Процедура ОшибкаПриРаботеСервиса(ИнформацияОбОшибке, СтандартнаяОбработка, ВходящийКонтекст) Экспорт + + СтандартнаяОбработка= Ложь; + ОтветВызова = ОтветСервисаПоУмолчанию(Ложь); + + ТекстПользователя = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ТекстЖурнала = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КодОшибки = СервисКриптографииDSSКлиентСервер.ПолучитьКодОшибки(ТекстПользователя); + ВидОперации = СвойствоСтруктуры(ВходящийКонтекст, "ВидОперации"); + + Если ЗначениеЗаполнено(ВидОперации) Тогда + ТекстПользователя = ТекстПользователя + Символы.ПС + НСтр("ru = 'Вид операции:'", КодЯзыка()) + " " + ВидОперации; + КонецЕсли; + + Если ЗначениеЗаполнено(КодОшибки) Тогда + ОтветВызова.Ошибка = ТекстПользователя; + Иначе + ПолучитьОписаниеОшибки(ОтветВызова, "ОшибкаВыполнения", ТекстПользователя); + КонецЕсли; + + НовыйОбъект = СервисКриптографииDSSКлиентСервер.ФильтроватьПараметрыВызова(ВходящийКонтекст); + СервисКриптографииDSSСлужебныйВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ТекстЖурнала, НовыйОбъект); + + ВернутьРезультатВызова(ВходящийКонтекст, ОтветВызова); + +КонецПроцедуры + +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Структура +// +Функция ПодготовитьПараметрыОперации(ПоказатьОшибку = Истина, ТекущаяСтруктура = Неопределено) Экспорт + + Если ТекущаяСтруктура = Неопределено Тогда + Результат = Новый Структура(); + Иначе + Результат = ТекущаяСтруктура; + КонецЕсли; + + Результат.Вставить("ОтобразитьОшибку", ПоказатьОшибку); + Результат.Вставить("ИдентификаторОперации", Неопределено); + Результат.Вставить("ОжидатьВыполнения", Неопределено); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область РаботаСОшибкамиПоСуществу + +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Строка +// +Функция СформироватьОтказАутентификации(РезультатОперации) Экспорт + + Результат = ПолучитьОписаниеОшибки(РезультатОперации, "Отказ"); + + Возврат Результат; + +КонецФункции + +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Строка +// +Функция ПолучитьОписаниеОшибки(РезультатОперации, ИдентификаторОшибки, Дополнение = "") Экспорт + + Результат = СервисКриптографииDSSКлиентСервер.ПолучитьОписаниеОшибки(РезультатОперации, ИдентификаторОшибки, Дополнение); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область РаботаСоСлужебнымиФормами + +// Только для внутреннего использования. +Процедура ОткрытьЗаявлениеНаИзменение(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации = Неопределено) Экспорт + + ОткрытьФормуЗаявленияНаИзменение(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьПодборУчетныхЗаписей(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации = Неопределено) Экспорт + + ОткрытьФормуПодбораУчетныхЗаписей(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ПолучитьПодтверждениеПользователя( + ОповещениеОЗавершении, + ЗаголовокФормы, + ТекстВопроса, + ПараметрыПечати = Неопределено, + ОписаниеПодтверждения = "", + ПараметрыОперации = Неопределено) + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("Заголовок", ЗаголовокФормы); + ПараметрыФормы.Вставить("ЗаголовокПодтверждения", ОписаниеПодтверждения); + ПараметрыФормы.Вставить("ТекстВопроса", ТекстВопроса); + + Если ПараметрыПечати <> Неопределено Тогда + ПараметрыФормы.Вставить("ПараметрыПечати", ПараметрыПечати); + ПараметрыФормы.Вставить("Редактирование", Истина); + КонецЕсли; + + СписокКоманд = Новый СписокЗначений; + СписокКоманд.Добавить("КодВозвратаДиалога.ОК", НСтр("ru = 'Продолжить'"), Истина); + СписокКоманд.Добавить("КодВозвратаДиалога.Отмена", НСтр("ru = 'Отмена'")); + + ПараметрыФормы.Вставить("СписокКоманд", СписокКоманд); + + Если ПараметрыОперации <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыФормы, ПараметрыОперации, Истина); + КонецЕсли; + + ОткрытьФормуПодтверждения(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации); + +КонецПроцедуры + +#КонецОбласти + +#Область АктивироватьИУстановитьСертификат + +// Внимание, для заявлений оформленные через УЦ 1С, не требуется установка сертификата. +// Необходимо обновить список сертификатов, через обновление политики +// +// Разделено на несколько шагов +// 1. Определение списка действий, проверка авторизации пользователя +// 2. Обновление кеша сертификатов +// 3. Расшифровка блока конф. информации при необходимости +// 4. Разбор конфиденциальных данных +// 5. Получение подтверждения от пользователя (отдельная форма) для действий +// 6. Активация ключа авторизации мобильного приложения +// 7. Отправка кода активации ключа мобильного приложения +// 8. Контрольное подписание для активирования пароля, активация пароля, сброс кеша настроек пользователя и повторная авторизация +// 9. Установка сертификата по необходимости (если переданы двоичные данные) +// 10. Проверка отправки расписки +// 11. Завершение цикла. +// +// Разбирает файл настроек заявления полученные от Калуги-Астрал, производит дополнительные действия. +// +// Параметры: +// ОповещениеОЗавершении - ОписаниеОповещения +// ПараметрыВызова - Структура: +// * Сертификат - Строка +// - ДвоичныеДанные +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиDSS +// * ШифрованныйБлок - Строка +// - ДвоичныеДанные +// * Расшифровывать - Булево +// * УстановитьСертификат - Булево +// * Действия - Строка - идентификаторы через запятую +// ПараметрыОперации - Структура +// +Процедура АктивироватьИУстановитьСертификат(ОповещениеОЗавершении, ПараметрыВызова, ПараметрыОперации = Неопределено) Экспорт + + УчетнаяЗапись = ПараметрыВызова.УчетнаяЗапись; + Сертификат = ПараметрыВызова.Сертификат; + ШифрованныйБлок = ПараметрыВызова.ШифрованныйБлок; + Расшифровывать = СвойствоСтруктуры(ПараметрыВызова, "Расшифровывать", Истина); + УстановитьСертификат = СвойствоСтруктуры(ПараметрыВызова, "УстановитьСертификат", Истина); + ДействиеОблачнойПодписи = СвойствоСтруктуры(ПараметрыВызова, "Действия", ""); + Активизировать = СвойствоСтруктуры(ПараметрыВызова, "Активизировать", Ложь); + + НастройкиПользователя = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(УчетнаяЗапись, ПараметрыОперации); + ДанныеСертификата = Неопределено; + ИдентификаторКлючаСертификата = Неопределено; + ОтпечатокСертификата = ""; + + Если ЭтоАдресВременногоХранилища(ШифрованныйБлок) Тогда + ШифрованныйБлок = ПолучитьИзВременногоХранилища(ШифрованныйБлок); + КонецЕсли; + + Если ЭтоАдресВременногоХранилища(Сертификат) Тогда + ДанныеСертификата = ПолучитьИзВременногоХранилища(Сертификат); + ИначеЕсли ТипЗнч(Сертификат) = Тип("Строка") Тогда + НашлиСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, Сертификат).Содержимое; + Если ЗначениеЗаполнено(НашлиСертификат) Тогда + ДанныеСертификата = ПолучитьДвоичныеДанныеИзBase64Строки(НашлиСертификат); + КонецЕсли; + УстановитьСертификат = Ложь; + Иначе + ДанныеСертификата = Сертификат; + КонецЕсли; + + Если ЗначениеЗаполнено(ДанныеСертификата) Тогда + СвойстваСертификата = СервисКриптографииDSSASNКлиентСервер.ПолучитьСвойстваСертификата(ДанныеСертификата); + ИдентификаторКлючаСертификата = СвойстваСертификата.ИдентификаторСубъекта; + ОтпечатокСертификата = СвойстваСертификата.Отпечаток; + Иначе + УстановитьСертификат = Ложь; + КонецЕсли; + + ДействиеОблачнойПодписи = СтрРазделить(ДействиеОблачнойПодписи, ",", Ложь); + + ДействиеАктивироватьПароль = ДействиеОблачнойПодписи.Найти("АктивироватьПароль") <> Неопределено; + ДействиеАктивироватьКлючПриложения = ДействиеОблачнойПодписи.Найти("АктивироватьКлючПриложения") <> Неопределено; + ДействиеПовторныйКлючПриложения = ДействиеОблачнойПодписи.Найти("КлючПриложения") <> Неопределено; + ДействиеПолучитьКодАктивации = ДействиеОблачнойПодписи.Найти("ПолучитьКодАктивации") <> Неопределено; + ДействиеПолучитьРасписку = ДействиеОблачнойПодписи.Найти("ОтправитьРасписку") <> Неопределено; + Расшифровывать = Расшифровывать + И (ДействиеАктивироватьПароль ИЛИ ДействиеАктивироватьКлючПриложения + ИЛИ ДействиеПовторныйКлючПриложения ИЛИ ДействиеПолучитьКодАктивации); + + ВходящийКонтекст = Новый Структура; + ВходящийКонтекст.Вставить("ИдентификаторДокументооборота", Строка(Новый УникальныйИдентификатор)); + ВходящийКонтекст.Вставить("ИдентификаторКлючаСертификата", ИдентификаторКлючаСертификата); + ВходящийКонтекст.Вставить("Активизировать", Активизировать); + ВходящийКонтекст.Вставить("ДанныеБлока", Неопределено); + ВходящийКонтекст.Вставить("УчетнаяЗапись", УчетнаяЗапись); + ВходящийКонтекст.Вставить("НастройкиПользователя", НастройкиПользователя); + ВходящийКонтекст.Вставить("ШифрованныйБлок", ШифрованныйБлок); + ВходящийКонтекст.Вставить("Расшифровывать", Расшифровывать); + ВходящийКонтекст.Вставить("ТипОшибки", "ОбработкаНастроекЗаявления"); + ВходящийКонтекст.Вставить("ОтпечатокСертификата", ОтпечатокСертификата); + ВходящийКонтекст.Вставить("УстановитьСертификат", УстановитьСертификат); + ВходящийКонтекст.Вставить("ДанныеСертификата", ДанныеСертификата); + ВходящийКонтекст.Вставить("Активировать", Ложь); + ВходящийКонтекст.Вставить("ДействиеАктивироватьПароль", ДействиеАктивироватьПароль); + ВходящийКонтекст.Вставить("ДействиеАктивироватьКлючПриложения", ДействиеАктивироватьКлючПриложения); + ВходящийКонтекст.Вставить("ДействиеПовторныйКлючПриложения", ДействиеПовторныйКлючПриложения); + ВходящийКонтекст.Вставить("ДействиеПолучитьКодАктивации", ДействиеПолучитьКодАктивации); + ВходящийКонтекст.Вставить("ДействиеПолучитьРасписку", ДействиеПолучитьРасписку); + ВходящийКонтекст.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ВходящийКонтекст.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + + ПараметрыВызова = Новый Структура; + Если Активизировать Тогда + ВходящийКонтекст.ПараметрыОперации.Вставить("ПарольПользователя", СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля("")); + КонецЕсли; + + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатПослеПроверкиАвторизация", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПослеПроверкиАвторизация(ОтветСервиса, ВходящийКонтекст) Экспорт + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + + Если НЕ ОтветСервиса.Выполнено Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Ошибка авторизации при установке сертификата в контейнер ключа и хранилище сертификатов облачной подписи'", КодЯзыка())); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + Иначе + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатРасшифровать", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СервисКриптографииDSSКлиент.ОбновитьДанныеСертификатов(ОповещениеСледующее, НастройкиПользователя, ПараметрыОперации); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатРасшифровать(ОтветСервиса, ВходящийКонтекст) Экспорт + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ШифрованныйБлок = ВходящийКонтекст.ШифрованныйБлок; + Расшифровывать = ВходящийКонтекст.Расшифровывать; + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + + Если НЕ ОтветСервиса.Выполнено Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + ОтветСервиса.Ошибка); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + Иначе + Если Расшифровывать И ЗначениеЗаполнено(ШифрованныйБлок) Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатПослеРасшифровки", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СервисКриптографииDSSКлиент.Расшифровать(ОповещениеСледующее, НастройкиПользователя, ШифрованныйБлок, , , ПараметрыОперации); + ИначеЕсли Расшифровывать Тогда + ТекстОшибки = НСтр("ru = 'Блок конфиденциальных не заполнен'"); + РезультатВыполнения = ОтветСервисаПоУмолчанию(Истина); + ПолучитьОписаниеОшибки(РезультатВыполнения, ВходящийКонтекст.ТипОшибки, ТекстОшибки); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + АктивироватьИУстановитьСертификатПодтверждениеПользователя(ВходящийКонтекст); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПослеРасшифровки(ОтветСервиса, ВходящийКонтекст) Экспорт + + УчетнаяЗапись = ВходящийКонтекст.УчетнаяЗапись; + ТекстОшибки = ""; + ДанныеБлока = Неопределено; + + Если ОтветСервиса.Выполнено Тогда + КлючПоиска = СервисКриптографииDSSСлужебныйВызовСервера.КлючПоискаУчетнойЗаписи(УчетнаяЗапись); + РезультатВызова = СервисКриптографииDSSСлужебныйВызовСервера.СлужебныеДанныеОблачнойПодписи(ОтветСервиса.Результат, КлючПоиска); + Если НЕ РезультатВызова.Выполнено Тогда + ТекстОшибки = НСтр("ru = 'Блок конфиденциальных данных поврежден'"); + Иначе + ДанныеБлока = РезультатВызова; + КонецЕсли; + Иначе + ТекстОшибки = ОтветСервиса.Ошибка; + КонецЕсли; + + Если ДанныеБлока = Неопределено Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + ТекстОшибки); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + ВходящийКонтекст.ДанныеБлока = ДанныеБлока; + АктивироватьИУстановитьСертификатПодтверждениеПользователя(ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +// +// Параметры: +// ВходящийКонтекст - Структура: +// * НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Процедура АктивироватьИУстановитьСертификатПодтверждениеПользователя(ВходящийКонтекст) + + ДанныеБлока = ВходящийКонтекст.ДанныеБлока; + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатПослеПодтверждения", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ЗаголовокПодтверждения = ""; + ОписаниеДействия = ""; + ПС = Символы.ПС; + + ПараметрыДляПечати = Новый Структура(); + ПараметрыДляПечати.Вставить("Сервер", НастройкиПользователя.Сервер); + ПараметрыДляПечати.Вставить("Логин", НастройкиПользователя.Логин); + + Если ВходящийКонтекст.ДействиеАктивироватьПароль И ВходящийКонтекст.ДействиеАктивироватьКлючПриложения Тогда + ПараметрыДляПечати.Вставить("ДанныеКлюча", ДанныеБлока.НовыйКлючПриложения); + ПараметрыДляПечати.Вставить("Пароль", ДанныеБлока.Пароль); + ЗаголовокПодтверждения = НСтр("ru = 'Подтверждаю получение пароля и QR-кода, содержащий вектора аутентификации.'"); + ОписаниеДействия = НСтр("ru = 'Необходимо завершить настройки для подключения к серверу облачной подписи'") + + НСтр("ru = 'и мобильного приложения.'") + ПС + + " - " + НСтр("ru = 'запомните или сохраните полученный пароль для подключения'") + ПС + + " - " + НСтр("ru = 'отсканируйте в мобильном приложении полученный QR-код'") + ПС + + " - " + НСтр("ru = 'подтвердите получение пароля и QR-кода'") + ПС + + " - " + НСтр("ru = 'введите в мобильном приложении высланный в SMS или по почте код активации'") + ПС + + " - " + НСтр("ru = 'подключитесь к серверу облачной подписи с новым паролем'") + ПС + + " - " + НСтр("ru = 'с помощью мобильного приложения выполните операцию контрольной подписи'"); + ИначеЕсли ВходящийКонтекст.ДействиеАктивироватьПароль Тогда + ПараметрыДляПечати.Вставить("Пароль", ДанныеБлока.Пароль); + ЗаголовокПодтверждения = НСтр("ru = 'Подтверждаю получение пароля.'"); + ОписаниеДействия = НСтр("ru = 'Необходимо завершить настройки для подключения к серверу облачной подписи.'") + ПС + + " - " + НСтр("ru = 'запомните или сохраните полученный пароль для подключения'") + ПС + + " - " + НСтр("ru = 'подтвердите получение пароля'") + ПС + + " - " + НСтр("ru = 'с помощью мобильного приложения выполните операцию контрольной подписи'") + ПС + + " - " + НСтр("ru = 'подключитесь к серверу облачной подписи с новым паролем'"); + ИначеЕсли ВходящийКонтекст.ДействиеАктивироватьКлючПриложения Тогда + ПараметрыДляПечати.Вставить("ДанныеКлюча", ДанныеБлока.НовыйКлючПриложения); + ЗаголовокПодтверждения = НСтр("ru = 'Подтверждаю получение QR-кода, содержащий вектор аутентификации.'"); + ОписаниеДействия = НСтр("ru = 'Необходимо завершить настройки для подключения мобильного приложения.'") + ПС + + " - " + НСтр("ru = 'отсканируйте в мобильном приложении полученный QR-код'") + ПС + + " - " + НСтр("ru = 'подтвердите получение QR-кода'") + ПС + + " - " + НСтр("ru = 'введите в мобильном приложении высланный в SMS или по почте код активации'"); + ИначеЕсли ВходящийКонтекст.ДействиеПовторныйКлючПриложения Тогда + ПараметрыДляПечати.Вставить("ДанныеКлюча", ДанныеБлока.КлючПриложения); + ЗаголовокПодтверждения = НСтр("ru = 'Подтверждаю получение QR-кода, содержащий вектора аутентификации.'"); + ОписаниеДействия = НСтр("ru = 'Необходимо повторно настроить подключение мобильного приложения.'") + ПС + + " - " + НСтр("ru = 'отсканируйте в мобильном приложении полученный QR-код'") + ПС + + " - " + НСтр("ru = 'подтвердите получение QR-кода'") + ПС + + " - " + НСтр("ru = 'введите в мобильном приложении высланный в SMS или по почте код активации'"); + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеДействия) Тогда + ПолучитьПодтверждениеПользователя(ОповещениеСледующее, + НСтр("ru = 'Параметры подключения к облачной подписи'"), + ОписаниеДействия, + ПараметрыДляПечати, + ЗаголовокПодтверждения, + ПараметрыОперации); + Иначе + ВыполнитьОбработкуОповещения(ОповещениеСледующее, КодВозвратаДиалога.ОК); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПослеПодтверждения(ОтветСервиса, ВходящийКонтекст) Экспорт + + ДанныеБлока = ВходящийКонтекст.ДанныеБлока; + + Если ОтветСервиса = КодВозвратаДиалога.ОК Тогда + Если ВходящийКонтекст.ДействиеАктивироватьКлючПриложения Тогда + ДлительнаяОперация = СервисКриптографииDSSСлужебныйВызовСервера.ОбменССерверомАктивироватьКлючПриложенияУчетнойЗаписи(ДанныеБлока.ПодписьПриложения, ВходящийКонтекст.ИдентификаторКлючаСертификата); + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатОтправитьКод", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДлительнаяОперация); + + Иначе + РезультатВыполнения = ОтветСервисаПоУмолчанию(Истина); + АктивироватьИУстановитьСертификатОтправитьКод(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + Иначе + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Пользователь отказался от продолжения настроек заявления'")); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатОтправитьКод(ОтветСервиса, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ВходящийКонтекст); + ДанныеБлока = ВходящийКонтекст.ДанныеБлока; + + Если НЕ РезультатВыполнения.Выполнено Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Не удалось выполнить контрольную подпись'")); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + ИначеЕсли ВходящийКонтекст.ДействиеПолучитьКодАктивации Тогда + ДлительнаяОперация = СервисКриптографииDSSСлужебныйВызовСервера.ОбменССерверомОтправитьКодАктивацииКлюча(ВходящийКонтекст.ИдентификаторКлючаСертификата, ДанныеБлока.ПодписьКодаАктивации); + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатАктивироватьПарольУчетнойЗаписи", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДлительнаяОперация); + Иначе + АктивироватьИУстановитьСертификатАктивироватьПарольУчетнойЗаписи(ОтветСервисаПоУмолчанию(Истина), ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатАктивироватьПарольУчетнойЗаписи(ОтветСервиса, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ВходящийКонтекст); + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ДанныеБлока = ВходящийКонтекст.ДанныеБлока; + ОтпечатокСертификата = ВходящийКонтекст.ОтпечатокСертификата; + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + + Если ОтветСервиса.Выполнено Тогда + Если ВходящийКонтекст.ДействиеАктивироватьПароль Тогда + СвойстваСертификата = Новый Структура("Отпечаток", ОтпечатокСертификата); + ДанныеДляПодписи = ПолучитьДвоичныеДанныеИзСтроки(ДанныеБлока.ПодписьПароля); + + СвойстваПодписи = СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS(Истина, Ложь); + СервисКриптографииDSSКлиентСервер.ПолучитьИнформациюДокументаДляПодписи(СвойстваПодписи, НСтр("ru = 'Контрольная подпись'"), "txt"); + + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("ПодтверждатьПринудительно", Истина); + + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатПослеПодписи", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СервисКриптографииDSSКлиент.Подписать(ОповещениеСледующее, НастройкиПользователя, ДанныеДляПодписи, СвойстваПодписи, СвойстваСертификата, ПараметрыОперации); + + Иначе + АктивироватьИУстановитьСертификатПроверитьСертификат(ОтветСервисаПоУмолчанию(Истина), ВходящийКонтекст); + КонецЕсли; + Иначе + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Не удалось выполнить контрольную подпись'")); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПослеПодписи(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ДанныеБлока = ВходящийКонтекст.ДанныеБлока; + + Если РезультатВыполнения.Выполнено Тогда + ДлительнаяОперация = СервисКриптографииDSSСлужебныйВызовСервера.ОбменССерверомАктивироватьУчетнуюЗапись( + ВходящийКонтекст.ИдентификаторКлючаСертификата, + ДанныеБлока.ПодписьПароля, + РезультатВыполнения.Результат); + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатПослеАктивированияПароля", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледующее, ДлительнаяОперация); + + Иначе + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Не удалось выполнить контрольную подпись'")); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПослеАктивированияПароля(ОтветСервиса, ВходящийКонтекст) Экспорт + + РезультатВыполнения = ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ВходящийКонтекст); + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатПослеПроверкиПароля", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("Принудительно", Истина); + ПараметрыОперации.Вставить("ОжидатьВыполнения", Истина); + ПараметрыОперации.Вставить("ПояснениеОперации", НСтр("ru = 'Авторизуйтесь на сервере облачной подписи с помощью пароля, полученного ранее.'")); + СервисКриптографииDSSКлиент.ПроверкаАутентификацииПользователя(ОповещениеСледующее, НастройкиПользователя, ПараметрыОперации); + + Иначе + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Ошибка при активировании учетной записи'")); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПослеПроверкиПароля(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + АктивироватьИУстановитьСертификатПроверитьСертификат(РезультатВыполнения, ВходящийКонтекст); + Иначе + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Неудачная авторизация с новым паролем'")); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПроверитьСертификат(РезультатВыполнения, ВходящийКонтекст) + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + ОтпечатокСертификата = ВходящийКонтекст.ОтпечатокСертификата; + ДанныеСертификата = ВходящийКонтекст.ДанныеСертификата; + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + УстановитьСертификат = ВходящийКонтекст.УстановитьСертификат; + + Если РезультатВыполнения.Выполнено Тогда + Если УстановитьСертификат Тогда + УстановитьСертификат = НЕ АктивироватьИУстановитьСертификатНайтиСертификат(НастройкиПользователя, ОтпечатокСертификата); + КонецЕсли; + + Если УстановитьСертификат Тогда + ОбъектОповещения = Новый ОписаниеОповещения("АктивироватьИУстановитьСертификатПослеУстановкиСертификата", ЭтотОбъект, ВходящийКонтекст); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + СервисКриптографииDSSКлиент.УстановитьСертификат(ОповещениеСледующее, НастройкиПользователя, ДанныеСертификата, ПараметрыОперации); + Иначе + АктивироватьИУстановитьСертификатПолучитьРасписку(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + + Иначе + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + НСтр("ru = 'Обновление списка сертификатов из хранилища сертификатов облачной подписи'", КодЯзыка())); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Функция АктивироватьИУстановитьСертификатНайтиСертификат(НастройкиПользователя, ОтпечатокСертификата) + + НашлиСертификат = СервисКриптографииDSSКлиентСервер.НайтиСертификат(НастройкиПользователя, ОтпечатокСертификата); + Результат = ЗначениеЗаполнено(НашлиСертификат.Отпечаток); + + Возврат Результат; + +КонецФункции + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатПослеУстановкиСертификата(ОтветСервиса, ВходящийКонтекст) Экспорт + + Если НЕ ОтветСервиса.Выполнено Тогда + РезультатВыполнения = ОтветСервисаПоУмолчанию(Ложь); + ПолучитьОписаниеОшибки(РезультатВыполнения, + ВходящийКонтекст.ТипОшибки, + ОтветСервиса.Ошибка); + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + АктивироватьИУстановитьСертификатПолучитьРасписку(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +Процедура АктивироватьИУстановитьСертификатПолучитьРасписку(РезультатВыполнения, ВходящийКонтекст) + + Если ВходящийКонтекст.ДействиеПолучитьРасписку Тогда + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + Иначе + АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры АктивироватьИУстановитьСертификат. +Процедура АктивироватьИУстановитьСертификатРезультат(РезультатВыполнения, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +#Область ВосстановитьУчетнуюЗапись + +// Запускает цикл восстановления учетной записи облачной подписи +// +// Шаги цикла: +// 1. подготовка параметров цикла +// 2. авторизация по логину +// 3. запуск процесса подтверждения операции (контрольная подпись) +// 4. создание элемента справочника +// 5. возврат результат операции. +// +Процедура ВосстановитьУчетнуюЗапись(ОповещениеОЗавершении, ДанныеСервера, Логин, Пароль, ПараметрыОперации) Экспорт + + НастройкиПользователя = СервисКриптографииDSSСлужебныйВызовСервера.ДополнитьНастройкиПользователя(ДанныеСервера, Логин); + НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_УчетныеДанные"); + Если ЗначениеЗаполнено(Пароль) Тогда + НастройкиПользователя.Пароль = Пароль; + КонецЕсли; + + ПараметрыЦикла = Новый Структура; + ПараметрыЦикла.Вставить("ВидОперации", НСтр("ru = 'Восстановление учетной записи'", КодЯзыка())); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("ДанныеСервера", ДанныеСервера); + ПараметрыЦикла.Вставить("Логин", ОповещениеОЗавершении); + ПараметрыЦикла.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЦикла.Вставить("ПараметрыОперации", ПроверитьПараметрыОперации(ПараметрыОперации)); + ПараметрыЦикла.Вставить("СпособПодтверждения", СвойствоСтруктуры(ПараметрыОперации, "СпособПодтверждения")); + + ОбъектОповещения = Новый ОписаниеОповещения("ВосстановитьУчетнуюЗаписьПослеПроверки", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + ПроверкаАутентификацииПользователя(ОповещениеСледующее, ПараметрыЦикла); + +КонецПроцедуры + +// Продолжение процедуры ВосстановитьУчетнуюЗапись. +Процедура ВосстановитьУчетнуюЗаписьПослеПроверки(РезультатВыполнения, ВходящийКонтекст) Экспорт + + НастройкиПользователя = ВходящийКонтекст.НастройкиПользователя; + СпособПодтверждения = ВходящийКонтекст.СпособПодтверждения; + ПараметрыОперации = ВходящийКонтекст.ПараметрыОперации; + + Если РезультатВыполнения.Выполнено Тогда + ОбъектОповещения = Новый ОписаниеОповещения("ВосстановитьУчетнуюЗаписьПослеПодтверждения", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ВходящийКонтекст); + ПодтверждениеПроизвольнойОперации(НастройкиПользователя, + ОповещениеСледующее, + НСтр("ru = 'Подтвердите создание учетной записи'"), + СпособПодтверждения, + ПараметрыОперации); + Иначе + ВосстановитьУчетнуюЗаписьРезультат(РезультатВыполнения, ВходящийКонтекст); + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ВосстановитьУчетнуюЗапись. +Процедура ВосстановитьУчетнуюЗаписьПослеПодтверждения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + ДанныеСервера = ВходящийКонтекст.ДанныеСервера; + Логин = ВходящийКонтекст.Логин; + + Если РезультатВыполнения.Выполнено Тогда + НоваяУчетнаяЗапись = СервисКриптографииDSSСлужебныйВызовСервера.СоздатьУчетнуюЗаписьОблачнойПодписи(ДанныеСервера, Логин); + Если ЗначениеЗаполнено(НоваяУчетнаяЗапись) Тогда + РезультатОперации = ОтветСервисаПоУмолчанию(); + РезультатОперации.Вставить("Результат", НоваяУчетнаяЗапись); + Иначе + РезультатОперации = ОтветСервисаПоУмолчанию(Ложь); + ЗаголовокОшибки = НСтр("ru = 'Не удалось создать учетную запись облачной подписи'"); + ПолучитьОписаниеОшибки(РезультатОперации, + "СозданиеУчетнойЗаписи", + ЗаголовокОшибки); + + КонецЕсли; + Иначе + РезультатОперации = РезультатВыполнения; + КонецЕсли; + + ВосстановитьУчетнуюЗаписьРезультат(РезультатОперации, ВходящийКонтекст); + +КонецПроцедуры + +// Продолжение процедуры ВосстановитьУчетнуюЗапись. +Процедура ВосстановитьУчетнуюЗаписьРезультат(РезультатВыполнения, ВходящийКонтекст) + + ВернутьРезультатВызова(ВходящийКонтекст, РезультатВыполнения); + +КонецПроцедуры + +#КонецОбласти + +#Область ПрочиеФункции + +// Функция-обертка используется для централизованного управление языком при формировании сообщений пользователю +// +// Возвращаемое значение: +// Строка - текстовый код языка (альфа2) +// +Функция КодЯзыка() Экспорт + + Возврат ОбщегоНазначенияКлиент.КодОсновногоЯзыка(); + +КонецФункции + +// Функция-обертка для разбора веб-адреса сервисов +// +// Параметры: +// АдресURI - Строка +// +// Возвращаемое значение: +// см. ОбщегоНазначенияКлиентСервер.СтруктураURI +// +Функция СтруктураВебАдреса(АдресURI) Экспорт + + Возврат ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресURI); + +КонецФункции + +// Функция-обертка для разбора полей структуры +// +// Параметры: +// Структура - Структура +// Ключ - Строка +// ЗначениеПоУмолчанию - Произвольный +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры +// +Функция СвойствоСтруктуры(Структура, Ключ, ЗначениеПоУмолчанию = Неопределено) Экспорт + + Возврат СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Структура, Ключ, ЗначениеПоУмолчанию); + +КонецФункции + +// Функция-обертка для получения даты и времени сеанса +// +// Возвращаемое значение: +// Дата +// +Функция ДатаСеанса() Экспорт + + Возврат ОбщегоНазначенияКлиент.ДатаСеанса(); + +КонецФункции + +// Процедура для оценки производительности работы с облачной подписью +// +// Параметры: +// ВходящийКонтекст - Структура - должно содержать поле "ВидОперации" +// ПолеСтруктуры - Строка +// ШагОперации - Строка +// +Процедура НачатьЗамерВремени(ВходящийКонтекст, ПолеСтруктуры = "ВидОперации", ШагОперации = "") Экспорт + + // СтандартныеПодсистемы.ОценкаПроизводительности + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + + ВидОперации = СвойствоСтруктуры(ВходящийКонтекст, ПолеСтруктуры); + КлючеваяОперация = "ВыполнениеОперацииОблачнойПодписи"; + + Если ЗначениеЗаполнено(ВидОперации) Тогда + КлючеваяОперация = КлючеваяОперация + " - " + ВидОперации; + КонецЕсли; + + Если ЗначениеЗаполнено(ШагОперации) Тогда + КлючеваяОперация = КлючеваяОперация + " (" + ШагОперации + ")"; + КонецЕсли; + + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + ИдентификаторЗамера = МодульОценкаПроизводительностиКлиент.ЗамерВремени(КлючеваяОперация); + ВходящийКонтекст.Вставить("ИдентификаторЗамера", ИдентификаторЗамера); + + КонецЕсли; + + // Конец СтандартныеПодсистемы.ОценкаПроизводительности + +КонецПроцедуры + +// Процедура для оценки производительности работы с облачной подписью +// +// Параметры: +// ВходящийКонтекст - Структура - должно содержать поле "ВидОперации" +// +Процедура ЗакончитьЗамерВремени(ВходящийКонтекст) Экспорт + + // СтандартныеПодсистемы.ОценкаПроизводительности + Если ВходящийКонтекст = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + + Если ВходящийКонтекст = "Ошибка" Тогда + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + + Иначе + ИдентификаторЗамера = СвойствоСтруктуры(ВходящийКонтекст, "ИдентификаторЗамера"); + + Если ЗначениеЗаполнено(ИдентификаторЗамера) Тогда + ВходящийКонтекст.Удалить("ИдентификаторЗамера"); + МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент"); + МодульОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(ИдентификаторЗамера); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + // Конец СтандартныеПодсистемы.ОценкаПроизводительности + +КонецПроцедуры + +// Процедура для открытия навигационной ссылки в браузере. +// +// Параметры: +// НавигационнаяСсылка - Строка +// ТипОбозревателя - Строка - предпочтительный обозреватель для открытия, нужно передать имя +// +Процедура ОткрытьВБраузере(НавигационнаяСсылка, ТипОбозревателя) Экспорт + + БраузерКлиента = ИмяБраузера(); + ЛюбойБраузер = Истина; + + Если ТипОбозревателя = "MSIE" Тогда + ЛюбойБраузер = НЕ ОбщегоНазначенияКлиент.ЭтоWindowsКлиент(); + КонецЕсли; + + Если НЕ ЛюбойБраузер Тогда + Если ЭтоВебКлиент() И БраузерКлиента = "MSIE" Тогда + ЛюбойБраузер = Истина; + КонецЕсли; + КонецЕсли; + + Если ЛюбойБраузер Тогда + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылка); + Иначе + ФайловаяСистемаКлиент.ЗапуститьПрограмму("rundll32 shell32.dll, ShellExec_RunDLL iexplore " + НавигационнаяСсылка); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеДляОткрытияФормСервиса + +// Только для внутреннего использования. +// Проверяет передаваемые параметры с клиента на сервер, на допустимые типы. +// +// Параметры: +// ПараметрыФормы - Структура +// +// Возвращаемое значение: +// Структура +// +Функция ПодготовитьПараметрыФормы(ПараметрыФормы) Экспорт + + Результат = ПараметрыФормы; + + Если ПараметрыФормы <> Неопределено Тогда + Для каждого СтрокаКлюча Из Результат Цикл + + Если ТипЗнч(СтрокаКлюча.Значение) = Тип("ФормаКлиентскогоПриложения") Тогда + Результат.Вставить(СтрокаКлюча.Ключ, Неопределено); + ИначеЕсли ТипЗнч(СтрокаКлюча.Значение) = Тип("Структура") Тогда + Результат.Вставить(СтрокаКлюча.Ключ, ПодготовитьПараметрыФормы(СтрокаКлюча.Значение)); + КонецЕсли; + + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Только для внутреннего использования. +Функция ОткрытьФормуВзаимодействия(ИдентификаторФормы, ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении, Знач ТолькоПроверить = Ложь) + + Результат = Ложь; + + НоваяФорма = СвойствоСтруктуры(ПараметрыОперации, "Форма" + ИдентификаторФормы); + + Если ЗначениеЗаполнено(НоваяФорма) Тогда + Результат = Истина; + ПодготовленныеПараметры = ПроверитьПараметрыОперации(ПараметрыФормы); + ПодготовленныеПараметры.Вставить("ПараметрыОперации", ПодготовитьПараметрыФормы(ПараметрыОперации)); + ПолноеИмяФормы = НоваяФорма; + ТолькоПроверить = Ложь; + Иначе + ПодготовленныеПараметры = ПодготовитьПараметрыФормы(ПараметрыФормы); + ПолноеИмяФормы = "Обработка.УправлениеПодключениемDSS.Форма." + ИдентификаторФормы; + КонецЕсли; + + РежимОткрытияОкна = СвойствоСтруктуры(ПараметрыОперации, "РежимОткрытияОкна"); + + Если НЕ ТолькоПроверить Тогда + ОткрытьФорму(ПолноеИмяФормы, ПодготовленныеПараметры, , , , , ОбъектОповещенияОбработкиФормы(ОповещениеОЗавершении), РежимОткрытияОкна); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Только для внутреннего использования. +Процедура ОткрытьФормуВводПароля(НастройкиПользователя, + ОповещениеОЗавершении, + РежимВвода, + ВозможноСохранять = Неопределено, + ПараметрыОперации = Неопределено) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВвода", РежимВвода); + ПараметрыФормы.Вставить("ВозможноСохранять", ВозможноСохранять); + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФормы.Вставить("ПояснениеОперации", СвойствоСтруктуры(ПараметрыОперации, "ПояснениеОперации")); + + ОткрытьФормуВзаимодействия("ВводПароля", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуВводПинКода(НастройкиПользователя, ОповещениеОЗавершении, Сертификат, ПараметрыОперации) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Сертификат", Сертификат); + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + + ОткрытьФормуВзаимодействия("ВводПинКода", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуВебАутентификации(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + + ОткрытьФормуВзаимодействия("ВебАутентификация", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуЗапросаНаСертификат(НастройкиПользователя, ОповещениеОЗавершении, ПоляЗапроса, ПараметрыОперации) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФормы.Вставить("ПоляЗапроса", ПоляЗапроса); + + ОткрытьФормуВзаимодействия("НовыйЗапросНаСертификат", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуСменыПароля(НастройкиПользователя, ОповещениеОЗавершении, РежимФормы = "Смена", Обязательно = Ложь, ПараметрыОперации = Неопределено) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимФормы", РежимФормы); + ПараметрыФормы.Вставить("Обязательно", Обязательно); + ПараметрыФормы.Вставить("Обязательно", Обязательно); + ПараметрыФормы.Вставить("ПояснениеОперации", СвойствоСтруктуры(ПараметрыОперации, "ПояснениеОперации")); + + ОткрытьФормуВзаимодействия("СменаПинКода", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуВыбораСертификата(НастройкиПользователя, + ОповещениеОЗавершении, + РежимВыбора, + ПолноеОписание = Ложь, + МассивВыбора = Неопределено, + ПараметрыОперации = Неопределено) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФормы.Вставить("ВыборИзСписка", Истина); + ПараметрыФормы.Вставить("ПолноеОписание", ПолноеОписание); + ПараметрыФормы.Вставить("РежимВыбора", РежимВыбора); + ПараметрыФормы.Вставить("МассивВыбора", МассивВыбора); + + ОткрытьФормуВзаимодействия("СписокСертификатов", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуСостоянияУчетнойЗаписи(НастройкиПользователя, ОповещениеОЗавершении, ПараметрыОперации) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Отбор", Новый Структура("НастройкиПользователя", НастройкиПользователя)); + ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина); + + Если НЕ ОткрытьФормуВзаимодействия("СостояниеУчетнойЗаписиDSS", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении, Истина) Тогда + ОткрытьФорму("Отчет.СостояниеУчетнойЗаписиDSS.Форма", ПараметрыФормы, ПараметрыОперации, ОбъектОповещенияОбработкиФормы(ОповещениеОЗавершении)); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуСертификата(НастройкиПользователя, + ОповещениеОЗавершении, + ПараметрыФормы, + ФормаВладелец = Неопределено, + ПараметрыОперации = Неопределено) + + ПоказатьСведениеСервиса = СвойствоСтруктуры(ПараметрыОперации, "ПоказатьСведениеСервиса", Ложь); + + Если ПоказатьСведениеСервиса Тогда + ИмяФормы = "Обработка.УправлениеПодключениемDSS.Форма.СвойствоСертификата"; + Иначе + ИмяФормы = "ОбщаяФорма.Сертификат"; + КонецЕсли; + + Если НЕ ОткрытьФормуВзаимодействия("ФормаСвойствоСертификата", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении, Истина) Тогда + Если ФормаВладелец = Неопределено Тогда + ОткрытьФорму(ИмяФормы, ПараметрыФормы, , , , , ОбъектОповещенияОбработкиФормы(ОповещениеОЗавершении)); + Иначе + ОткрытьФорму(ИмяФормы, ПараметрыФормы, + ФормаВладелец, , , , ОбъектОповещенияОбработкиФормы(ОповещениеОЗавершении), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуВыбораУчетнойЗаписи(ОповещениеОЗавершении, ПараметрыОперации) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПараметрыОперации", ПараметрыОперации); + + ОткрытьФормуВзаимодействия("ВыборТекущейУчетнойЗаписи", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуСведенийУчетнойЗаписи(ОповещениеОЗавершении, СсылкаУчетнойЗаписи, ПараметрыОперации) + + Если ПараметрыОперации = Неопределено Тогда + ПараметрыФормы = Новый Структура; + Иначе + ПараметрыФормы = ПараметрыОперации; + КонецЕсли; + + Если ЗначениеЗаполнено(СсылкаУчетнойЗаписи) Тогда + ПараметрыФормы.Вставить("Ключ", СсылкаУчетнойЗаписи); + КонецЕсли; + + ОткрытьФормуВзаимодействия("ФормаУчетнойЗаписи", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуСведенийСервера(ОповещениеОЗавершении, СсылкаСервера, ПараметрыОперации) + + Если ПараметрыОперации = Неопределено Тогда + ПараметрыФормы = Новый Структура; + Иначе + ПараметрыФормы = ПараметрыОперации; + КонецЕсли; + + Если ЗначениеЗаполнено(СсылкаСервера) Тогда + ПараметрыФормы.Вставить("Ключ", СсылкаСервера); + КонецЕсли; + + ОткрытьФормуВзаимодействия("ФормаЭкземпляраСервераDSS", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуВыбораЭкземпляраСервера(ОповещениеОЗавершении, ПараметрыОперации) + + Если ПараметрыОперации = Неопределено Тогда + ПараметрыФормы = Новый Структура; + Иначе + ПараметрыФормы = ПараметрыОперации; + КонецЕсли; + + ОткрытьФормуВзаимодействия("ВыборЭкземпляровСервераDSS", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуПроверкиРаботоспособности(НастройкиПользователя, + ОповещениеОЗавершении = Неопределено, + СписокОпераций = Неопределено, + ПараметрыОперации = Неопределено) + + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыФормы.Вставить("СписокОпераций", СписокОпераций); + + ОткрытьФормуВзаимодействия("ПроверкаСервиса", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуВыбораНастроекСервиса(ОписаниеСервиса, + ОповещениеОЗавершении = Неопределено, + ПараметрыОперации = Неопределено) + + ПараметрыФормы = Новый Структура("ОписаниеСервисаОбнаружения", ОписаниеСервиса); + ОткрытьФормуВзаимодействия("ВыборСервисаИзОписания", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуВыборПрограммы(ОповещениеОЗавершении = Неопределено, ПараметрыОперации = Неопределено) + + ПараметрыФормы = Новый Структура(); + ОткрытьФормуВзаимодействия("ВыборПрограммы", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуЗаявленияНаИзменение(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации = Неопределено) + + ОткрытьФормуВзаимодействия("ЗаявлениеНаИзменениеРеквизитовПодключения", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуПодбораУчетныхЗаписей(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации = Неопределено) + + ОткрытьФормуВзаимодействия("ПодборУчетнойЗаписи", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОткрытьФормуПодтверждения(ОповещениеОЗавершении, ПараметрыФормы, ПараметрыОперации = Неопределено) + + ОткрытьФормуВзаимодействия("ПодтверждениеПользователя", ПараметрыФормы, ПараметрыОперации, ОповещениеОЗавершении); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОтобразитьОшибкуПользователю(ОповещениеСледующее, + ТекстОшибки = "", + ЭтоКодОшибки = Ложь, + ПараметрыОперации = Неопределено) + + СервисКриптографииDSSСлужебныйВызовСервера.НачальныеНастройкиФормы("ВывестиИнформацию"); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстСообщения", ТекстОшибки); + ПараметрыФормы.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыФормы.Вставить("ЭтоКодОшибки", ЭтоКодОшибки); + ПараметрыФормы.Вставить("РежимОтображения", "Ошибка"); + + ОткрытьФормуВзаимодействия("ВывестиИнформацию", ПараметрыФормы, ПараметрыОперации, ОповещениеСледующее); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОтобразитьИнформациюПользователю(ОповещениеСледующее, + ТекстСообщения, + ТаймАут = Неопределено, + Заголовок = "", + ПараметрыОперации = Неопределено) + + СервисКриптографииDSSСлужебныйВызовСервера.НачальныеНастройкиФормы("ВывестиИнформацию"); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстСообщения", ТекстСообщения); + ПараметрыФормы.Вставить("ТаймАут", ТаймАут); + ПараметрыФормы.Вставить("Заголовок", Заголовок); + ПараметрыФормы.Вставить("РежимОтображения", "Информация"); + + ОткрытьФормуВзаимодействия("ВывестиИнформацию", ПараметрыФормы, ПараметрыОперации, ОповещениеСледующее); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОтобразитьВопросПользователю(ОповещениеСледующее, + ТекстСообщения, + СписокКоманд, + ТаймАут = Неопределено, + Заголовок = "", + ПараметрыОперации = Неопределено) + + СервисКриптографииDSSСлужебныйВызовСервера.НачальныеНастройкиФормы("ВывестиИнформацию"); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстСообщения", ТекстСообщения); + ПараметрыФормы.Вставить("ТаймАут", ТаймАут); + ПараметрыФормы.Вставить("Заголовок", Заголовок); + ПараметрыФормы.Вставить("РежимОтображения", "Вопрос"); + ПараметрыФормы.Вставить("СписокКоманд", СписокКоманд); + + ОткрытьФормуВзаимодействия("ВывестиИнформацию", ПараметрыФормы, ПараметрыОперации, ОповещениеСледующее); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ПослеЗакрытияФормы(РезультатВыбора, ПараметрыЦикла) Экспорт + + Если РезультатВыбора = Неопределено Тогда + ЗавершениеРаботы = СвойствоСтруктуры(ПараметрыЦикла, "ЗавершениеРаботы", Ложь); + Если ЗавершениеРаботы Тогда + РезультатВыбора = ОтветСервисаПоУмолчанию(Ложь, "ЗавершениеРаботы"); + Иначе + РезультатВыбора = ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + КонецЕсли; + + ОповещениеСледующее = СвойствоСтруктуры(ПараметрыЦикла, "ОповещениеСледующее"); + + Если ОповещениеСледующее <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ОповещениеСледующее, РезультатВыбора); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие) Экспорт + + ПрограммноеЗакрытие = Ложь; + +КонецПроцедуры + +// Только для внутреннего использования. +// +// Параметры: +// ФормаВладелец - ФормаКлиентскогоПриложения - содержит реквизиты: +// * ОписаниеОповещенияОЗакрытии - ОписаниеОповещения +// Отказ - Булево +// ПрограммноеЗакрытие - Булево +// ЗавершениеРаботы - Булево +// +// Возвращаемое значение: +// Булево +// +Функция ПередЗакрытиемФормы(ФормаВладелец, Отказ, ПрограммноеЗакрытие, ЗавершениеРаботы) Экспорт + + ЭтоВебКлиент = ЭтоВебКлиент(); + ЗакрытьФорму = Ложь; + + Если ЗавершениеРаботы ИЛИ ЭтоВебКлиент ИЛИ ПрограммноеЗакрытие Тогда + ЗакрытьФорму = Истина; + КонецЕсли; + + Если ФормаВладелец.ОписаниеОповещенияОЗакрытии = Неопределено Тогда + ЗакрытьФорму = Истина; + ИначеЕсли ФормаВладелец.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры <> Неопределено Тогда + ФормаВладелец.ОписаниеОповещенияОЗакрытии.ДополнительныеПараметры.Вставить("ЗавершениеРаботы", ЗавершениеРаботы); + КонецЕсли; + + Если НЕ ЗакрытьФорму Тогда + ПрограммноеЗакрытие = Истина; + Отказ = Истина; + КонецЕсли; + + Возврат НЕ ЗакрытьФорму; + +КонецФункции + +Функция ОбъектОповещенияОбработкиФормы(ОповещениеОЗавершении) Экспорт + + ПараметрыЦикла = Новый Структура; + ПараметрыЦикла.Вставить("ЗавершениеРаботы", Ложь); + ПараметрыЦикла.Вставить("ОповещениеСледующее", ОповещениеОЗавершении); + + ОбъектОповещения = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект); + ОповещениеСледующее = ОбработчикОповещения(ОбъектОповещения, ПараметрыЦикла); + + Возврат ОповещениеСледующее; + +КонецФункции + +#КонецОбласти + +#Область ВспомогательныеПроцедурыИФункции + +// Функция-обертка. см. СервисКриптографииDSSСлужебныйВызовСервера.СохранитьЗакрытыеДанные +Процедура СохранитьЗакрытыеДанные(ИдентификаторДанных, Значение, ИмяЗначения = "") + + СервисКриптографииDSSСлужебныйВызовСервера.СохранитьЗакрытыеДанные(ИдентификаторДанных, Значение, ИмяЗначения); + Оповестить("СервисКриптографииDSS_ЗаписьЗащищенныхДанных"); + +КонецПроцедуры + +// Служебная для вызова обработки оповещения вызывающей стороны. +// +// Параметры: +// ВходящийКонтекст - Структура: +// * ОповещениеОЗавершении - ОписаниеОповещения +// - Неопределено +// * ПараметрыОперации - Структура - необязательный. +// РезультатВызова - см. ОтветСервисаПоУмолчанию +// ПодготовленныйРезультат - Неопределено +// - Структура +// +Процедура ВернутьРезультатВызова(ВходящийКонтекст, РезультатВызова, ПодготовленныйРезультат = Неопределено) + + Если ПодготовленныйРезультат = Неопределено Тогда + ПодготовленныйРезультат = РезультатВызова; + КонецЕсли; + + ОповещениеОЗавершении = ВходящийКонтекст.ОповещениеОЗавершении; + + Если ОповещениеОЗавершении <> Неопределено + И ТипЗнч(ОповещениеОЗавершении.ДополнительныеПараметры) = Тип("Структура") Тогда + Если РезультатВызова.МаркерОбновлен Тогда + ОповещениеОЗавершении.ДополнительныеПараметры.Вставить("НастройкиПользователя", РезультатВызова.НастройкиПользователя); + КонецЕсли; + КонецЕсли; + + ПоказатьОшибку = Ложь; + Если ОповещениеОЗавершении = Неопределено Тогда + ПоказатьОшибку = Истина; + ИначеЕсли ВходящийКонтекст.Свойство("ПараметрыОперации") Тогда + Если НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) Тогда + ПоказатьОшибку = Ложь; + Иначе + ПоказатьОшибку = СвойствоСтруктуры(ВходящийКонтекст.ПараметрыОперации, "ОтобразитьОшибку", Ложь); + КонецЕсли; + КонецЕсли; + + Если ПоказатьОшибку + И НЕ РезультатВызова.Выполнено + И ЗначениеЗаполнено(РезультатВызова.Ошибка) + И НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(РезультатВызова.Ошибка) Тогда + ВывестиОшибку(ОповещениеОЗавершении, РезультатВызова.Ошибка, , ПодготовленныйРезультат); + ИначеЕсли ОповещениеОЗавершении <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, ПодготовленныйРезультат); + КонецЕсли; + +КонецПроцедуры + +// Проверяет и подготавливает параметры операции +// +Функция ПроверитьПараметрыОперации(ПараметрыОперации = Неопределено) + + Результат = Новый Структура; + + Если ТипЗнч(ПараметрыОперации) = Тип("Структура") Тогда + Результат = ПараметрыОперации; + КонецЕсли; + + Возврат ПодготовитьПараметрыФормы(Результат); + +КонецФункции + +// Функция-обертка, служит для формирования нового объекта "ОписаниеОповещения" со встроенной обработкой критических ошибок +// +// Параметры: +// ДанныеОбработчика - Строка +// - ОписаниеОповещения +// ПараметрыВызова - Произвольный +// +// Возвращаемое значение: +// ОписаниеОповещения +// +Функция ОбработчикОповещения(ДанныеОбработчика, ПараметрыВызова = Неопределено) + + Если ТипЗнч(ДанныеОбработчика) = Тип("Строка") Тогда + Результат = Новый ОписаниеОповещения(ДанныеОбработчика, + ЭтотОбъект, + ПараметрыВызова, + "ОшибкаПриРаботеСервиса", + ЭтотОбъект); + Иначе + Результат = Новый ОписаниеОповещения(ДанныеОбработчика.ИмяПроцедуры, + ЭтотОбъект, + ПараметрыВызова, + "ОшибкаПриРаботеСервиса", + ЭтотОбъект); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная процедура проверки обновления маркера доступа в результате вызова сервиса +// +Процедура ПроверитьТокенНаОбновление(РезультатВызова, НастройкиПользователя, ОбновитьВерсию = Ложь) + + НовыеНастройки = Неопределено; + + Если РезультатВызова.МаркерОбновлен Тогда + НовыеНастройки = СвойствоСтруктуры(РезультатВызова, "НастройкиПользователя"); + ИначеЕсли ОбновитьВерсию Тогда + НовыеНастройки = СвойствоСтруктуры(РезультатВызова, "НастройкиПользователя"); + КонецЕсли; + + Если НовыеНастройки <> Неопределено Тогда + КлючТекущий = СервисКриптографииDSSКлиентСервер.КлючНастроекПользователя(НастройкиПользователя); + КлючНовый = СервисКриптографииDSSКлиентСервер.КлючНастроекПользователя(НовыеНастройки); + Если КлючТекущий = КлючНовый Тогда + Если НастройкиПользователя.ВерсияНастройки > НовыеНастройки.ВерсияНастройки Тогда + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьНастройкиПользователя(НастройкиПользователя, НовыеНастройки); + КонецЕсли; + НастройкиПользователя = НовыеНастройки; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Служебная процедура для сохранения пин-кода сертификата +// +// Параметры: +// ОписаниеСертификата - см. СервисКриптографииDSSКлиентСервер.СвойстваСертификатаПользователя +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// ПинКод - Строка +// Сохранить - Булево +// НовыйПинКод - Булево +// ПараметрыОперации - Структура +// +Процедура УстановитьПинКодСертификата(ОписаниеСертификата, НастройкиПользователя, ПинКод, Сохранить = Ложь, НовыйПинКод = Ложь, ПараметрыОперации = Неопределено) + + ОписаниеСертификата.ПинКод = ПинКод; + Если НовыйПинКод Тогда + ОписаниеСертификата.ТребуетсяПинКод = НЕ ТребуетсяВводКонфиденциальныхДанных(ПинКод); + КонецЕсли; + + НастройкиПользователя.Сертификаты.Вставить(ОписаниеСертификата.Отпечаток, ОписаниеСертификата); + ТекущиеНастройки = Новый Структура("Ссылка", НастройкиПользователя.Ссылка); + СервисКриптографииDSSСлужебныйВызовСервера.ОбновитьНастройкиПользователя(ТекущиеНастройки, НастройкиПользователя, ПараметрыОперации); + + Если Сохранить Тогда + СервисКриптографииDSSСлужебныйВызовСервера.СохранитьПинКодСертификата( + НастройкиПользователя.УникальныйИдентификатор, + ОписаниеСертификата.Отпечаток, + ОписаниеСертификата.ПинКод); + КонецЕсли; + + НастройкиПользователя = ТекущиеНастройки; + +КонецПроцедуры + +// Служебная функция формирующая информацию о трансформации данных и ее дополняет ПараметрыОперации +// +Процедура ТрансформацияДанных(ПараметрыОперации, ТипРезультата) + + ТрансформироватьРезультат = СвойствоСтруктуры(ПараметрыОперации, "ТрансформироватьРезультат"); + + Если ТипЗнч(ТипРезультата) = Тип("Структура") Тогда + Если ТрансформироватьРезультат = Неопределено Тогда + ПараметрыОперации.Вставить("ТрансформироватьРезультат", ТрансформироватьРезультат); + КонецЕсли; + Иначе + Если ТрансформироватьРезультат = Неопределено Тогда + ТрансформироватьРезультат = Новый Структура; + ТрансформироватьРезультат.Вставить("ТипРезультата", ТипРезультата); + ПараметрыОперации.Вставить("ТрансформироватьРезультат", ТрансформироватьРезультат); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Функция-обертка. см. СервисКриптографииDSSКлиентСервер.ТребуетсяВводКонфиденциальныхДанных +// +Функция ТребуетсяВводКонфиденциальныхДанных(ТекущиеДанные) + + Возврат СервисКриптографииDSSКлиентСервер.ТребуетсяВводКонфиденциальныхДанных(ТекущиеДанные); + +КонецФункции + +// Функция для контроля вызова функций облачно подписи при включенной функциональной опции +// Если функциональная опции отключена, то возвращается Ложь и вызывается обработка оповещения +// с отрицательным результатом. +// +Функция ИспользованиеОблачнойПодписиВозможно(ВходящийКонтекст) + + Результат = СервисКриптографииDSSКлиент.ИспользоватьСервисОблачнойПодписи(); + + Если НЕ Результат Тогда + ОтветСервиса = ОтветСервисаПоУмолчанию(Ложь); + ПредставлениеОшибки = ПолучитьОписаниеОшибки(ОтветСервиса, "ПодсистемаОтключена"); + ОбработчикВозврата = СвойствоСтруктуры(ВходящийКонтекст, "ОповещениеОЗавершении"); + Если ОбработчикВозврата = Неопределено Тогда + ВызватьИсключение ПредставлениеОшибки; + Иначе + ВернутьРезультатВызова(ВходящийКонтекст, ОтветСервиса); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Служебная получает описание операции из настроек пользователя +// +Функция КлючДействияОперации(ВидОперации, НастройкиПользователя) + + КлючДействия = СервисКриптографииDSSКлиентСервер.СвойствоВыполняемойОперации(НастройкиПользователя, ВидОперации); + + Возврат КлючДействия; + +КонецФункции + +// Служебная трансформирует ответ для потребителя в нужном формате и только с теми полями которые ему нужны. +// +Функция ПодготовитьПсевдонимыОтвета(РезультатВызова, ПараметрыОперации) + + Псевдонимы = СвойствоСтруктуры(ПараметрыОперации, "Псевдонимы"); + + Если Псевдонимы = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Результат = Новый Структура(); + + Для Каждого СтрокаКлюча Из Псевдонимы Цикл + + ЗначениеКлюча = СвойствоСтруктуры(РезультатВызова, СтрокаКлюча.Ключ); + + Если СтрокаКлюча.Значение = "ИнформацияОбОшибке" + И ЗначениеЗаполнено(ЗначениеКлюча) Тогда + Попытка + ВызватьИсключение СокрЛП(ЗначениеКлюча); + Исключение + ЗначениеКлюча = ИнформацияОбОшибке(); + КонецПопытки; + КонецЕсли; + + Результат.Вставить(СтрокаКлюча.Значение, ЗначениеКлюча); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Служебная функций, которая определяет необходимость обработки ошибки. +// +Функция НеОбрабатыватьОшибкиСервиса(ВходящийКонтекст) + + Результат = СвойствоСтруктуры(ВходящийКонтекст.ПараметрыОперации, "ОбработкаОшибок", Истина); + + Возврат НЕ Результат; + +КонецФункции + +// Служебная для проверки запуска клиента в браузере +// +// Возвращаемое значение: +// Булево +// +Функция ЭтоВебКлиент() + +#Если ВебКлиент Тогда + Возврат Истина; +#Иначе + Возврат Ложь; +#КонецЕсли + +КонецФункции + +// Служебная для определения имени браузера с клиентом 1С +// +// Возвращаемое значение: +// Строка +// +Функция ИмяБраузера() + + СисИнфо = Новый СистемнаяИнформация; + + ВебБраузер = СисИнфо.ИнформацияПрограммыПросмотра; + + Если СтрЧислоВхождений(ВРег(ВебБраузер), "MSIE") > 0 + ИЛИ СтрЧислоВхождений(ВРег(ВебБраузер), "TRIDENT") > 0 Тогда + + ВебБраузер = "MSIE"; + + ИначеЕсли СтрЧислоВхождений(ВРег(ВебБраузер), "FIREFOX") > 0 Тогда + + ВебБраузер = "FIREFOX"; + + ИначеЕсли СтрЧислоВхождений(ВРег(ВебБраузер), "CHROME") > 0 Тогда + + ВебБраузер = "CHROME"; + + ИначеЕсли СтрЧислоВхождений(ВРег(ВебБраузер), "SAFARI") > 0 Тогда + + ВебБраузер = "SAFARI"; + + КонецЕсли; + + Возврат ВебБраузер; + +КонецФункции + +// Служебная для регистрации количества подряд неудачных попыток аутентификации +// +Процедура ИзменитьСчетчикПопыток(НастройкиПользователя, Успешно) + + Если Успешно Тогда + НастройкиПользователя.НеудачныхПопыток = 0; + Иначе + НастройкиПользователя.НеудачныхПопыток = НастройкиПользователя.НеудачныхПопыток + 1; + КонецЕсли; + +КонецПроцедуры + +// Формирует стандартный ответ применяемый в подсистеме. +// +// Параметры: +// Выполнено - Булево +// ИдентификаторОшибки - Строка +// +// Возвращаемое значение: +// см. СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию +// +Функция ОтветСервисаПоУмолчанию(Выполнено = Истина, ИдентификаторОшибки = "") + + Возврат СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Выполнено, ИдентификаторОшибки); + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/СервисКриптографииDSSСлужебныйКлиент.mdo b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/СервисКриптографииDSSСлужебныйКлиент.mdo new file mode 100644 index 000000000..96d561890 --- /dev/null +++ b/SSL/src/CommonModules/СервисКриптографииDSSСлужебныйКлиент/СервисКриптографииDSSСлужебныйКлиент.mdo @@ -0,0 +1,10 @@ + + + СервисКриптографииDSSСлужебныйКлиент + + ru + Сервис криптографии DSS служебный клиент + + true + true + diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl index b04b17e45..a29cced64 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl @@ -19,7 +19,7 @@ // 4 - Винительный. // 5 - Творительный. // 6 - Предложный. -// Объект - ОбъектСклонения - ссылка на объект, реквизит которого склоняется. +// Объект - ОпределяемыйТип.ОбъектСклонения - ссылка на объект, реквизит которого склоняется. // Пол - Число - число - пол физического лица, // 1 - мужской, // 2 - женский. @@ -48,7 +48,7 @@ // 4 - Винительный. // 5 - Творительный. // 6 - Предложный. -// Объект - ОбъектСклонения - ссылка на объект, реквизит которого склоняется. +// Объект - ОпределяемыйТип.ОбъектСклонения - ссылка на объект, реквизит которого склоняется. // // Возвращаемое значение: // Строка - результат склонения представления объекта в падеже. @@ -78,8 +78,9 @@ МассивРеквизитов.Добавить(РеквизитСклонения); Форма.ИзменитьРеквизиты(МассивРеквизитов); + ОсновнойРеквизитФормы = Форма[ИмяОсновногоРеквизитаФормы]; // ОпределяемыйТип.ОбъектСклонения - СтруктураСклонения = СклоненияИзРегистра(Представление, Форма[ИмяОсновногоРеквизитаФормы].Ссылка); + СтруктураСклонения = СклоненияИзРегистра(Представление, ОсновнойРеквизитФормы.Ссылка); Если СтруктураСклонения <> Неопределено Тогда Форма.Склонения = Новый ФиксированнаяСтруктура(СтруктураСклонения); КонецЕсли; @@ -149,7 +150,7 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения - форма объекта склонения. // Представление - Строка - строка для склонения. -// Объект - ОбъектСклонения - объект для склонения. +// Объект - ОпределяемыйТип.ОбъектСклонения - объект для склонения. // ЭтоФИО - Булево - признак склонения ФИО. // Пол - Число - пол физического лица (в случае склонения ФИО) // 1 - мужской @@ -285,11 +286,11 @@ // Пол - Число - пол физического лица (в случае склонения ФИО) // 1 - мужской // 2 - женский. -// ПараметрыСклонения +// ПараметрыСклонения - см. СклонениеПредставленийОбъектовКлиентСервер.ПараметрыСклонения // ПоказыватьСообщения - Булево - признак, определяющий нужно ли показывать пользователю сообщения об ошибках. // // Возвращаемое значение: -// Структура, Неопределено: +// Структура: // * Именительный - Строка. // * Родительный - Строка. // * Дательный - Строка @@ -312,93 +313,18 @@ СтандартнаяОбработка = Истина; - ПросклонятьСПомощьюСервисаСклоненияMorpher(СтруктураСклонения, Представление, СтандартнаяОбработка); + ПросклонятьСПомощьюСервисаСклоненияMorpher(СтруктураСклонения, Представление, СтандартнаяОбработка, ПоказыватьСообщения); Если Не СтандартнаяОбработка Тогда Возврат СтруктураСклонения; КонецЕсли; - ОписаниеСтроки = Неопределено; - ЗаполнитьОписаниеСтрокиПоПараметрамСклонения(ОписаниеСтроки, ПараметрыСклонения, "СклонениеПредставленийОбъектов.ДанныеСклонения"); - - ИменаПадежей = ОбщегоНазначения.ВыгрузитьКолонку(СтруктураСклонения, "Ключ"); - ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ИменаПадежей, "Именительный"); - СтруктураСклонения["Именительный"] = Представление; - - Если ПараметрыСклонения.ЭтоФИО Тогда - ОписанияСловФИО = Новый Соответствие; - ПреобразоватьФИОДляСклонения(Представление, ОписанияСловФИО); - КонецЕсли; - - Для Каждого ИмяПадежа Из ИменаПадежей Цикл - Попытка - РезультатСклонения = ПолучитьСклоненияСтроки(Представление, ОписаниеСтроки, "ПД=" + ИмяПадежа)[0]; - Исключение - ЗарегистрироватьОшибкуВстроенногоМетодаСклонения(ИнформацияОбОшибке(), ПоказыватьСообщения); - Возврат Неопределено; - КонецПопытки; - Если ПараметрыСклонения.ЭтоФИО Тогда - ВосстановитьФИОПослеСклонения(РезультатСклонения, ОписанияСловФИО); - КонецЕсли; - СтруктураСклонения[ИмяПадежа] = РезультатСклонения; - КонецЦикла; + ПросклонятьВстроеннымМетодом(СтруктураСклонения, Представление, ПараметрыСклонения, ПоказыватьСообщения); Возврат СтруктураСклонения; КонецФункции -Процедура ЗарегистрироватьОшибкуВстроенногоМетодаСклонения(ИнформацияОбОшибке, ПоказыватьСообщения) - - ПодробноеПредставление = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - ДополнитьПредставлениеПроблемыРекомендацией(ПодробноеПредставление); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Склонение.Получение склонения строки'", ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Предупреждение, , , - ПодробноеПредставление); - - Если Не ПоказыватьСообщения Тогда - Возврат; - КонецЕсли; - - КраткоеПредставление = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ДополнитьПредставлениеПроблемыРекомендацией(КраткоеПредставление); - ВызватьИсключение КраткоеПредставление; - -КонецПроцедуры - -Процедура ДополнитьПредставлениеПроблемыРекомендацией(Представление) - - Если Не ВерсияПлатформыНижеРекомендуемой() Тогда - Возврат; - КонецЕсли; - - Если Не ПустаяСтрока(Представление) Тогда - Представление = Представление + Символы.ПС + Символы.ПС; - КонецЕсли; - - Представление = Представление + - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для корректной работы склонения представлений рекомендуется: - |* или обновить технологическую платформу ""1С:Предприятие"" до версии %1 или более новой, - |* или включить альтернативный сервис склонения Морфер (в разделе Администрирование).'"), - РекомендуемаяВерсия()); - -КонецПроцедуры - -Функция ВерсияПлатформыНижеРекомендуемой() - - СистемнаяИнформация = Новый СистемнаяИнформация(); - ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения; - - Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПлатформы, РекомендуемаяВерсия()) < 0; - -КонецФункции - -Функция РекомендуемаяВерсия() - Возврат "8.3.18.1128"; -КонецФункции - Процедура ЗаписатьВРегистрСклонения(Представление, Объект, Склонения) Если Не Метаданные.ОпределяемыеТипы.ОбъектСклонения.Тип.СодержитТип(ТипЗнч(Объект)) Тогда @@ -426,16 +352,17 @@ КонецПроцедуры -#Область СервисСклонений +#Область СклонениеСервисомMorpher -Процедура ПросклонятьСПомощьюСервисаСклоненияMorpher(СтруктураСклонения, Представление, СтандартнаяОбработка) +Процедура ПросклонятьСПомощьюСервисаСклоненияMorpher( + СтруктураСклонения, Представление, СтандартнаяОбработка, ПоказыватьСообщения = Ложь) ИспользоватьСервисСклонения = Константы.ИспользоватьСервисСклоненияMorpher.Получить(); Если Не ИспользоватьСервисСклонения Тогда Возврат; КонецЕсли; - СклоненияЧерезСервис = СтруктураСклоненияЧерезЗапросКСервису(Представление, Ложь); + СклоненияЧерезСервис = СтруктураСклоненияЧерезЗапросКСервису(Представление, ПоказыватьСообщения); Если СклоненияЧерезСервис = Неопределено Тогда Возврат; КонецЕсли; @@ -587,6 +514,207 @@ #КонецОбласти +#Область СклонениеВстроеннымМетодом + +Процедура ПросклонятьВстроеннымМетодом(СтруктураСклонения, Представление, ПараметрыСклонения, ПоказыватьСообщения) + + ОписаниеСтроки = Неопределено; + ЗаполнитьОписаниеСтрокиПоПараметрамСклонения(ОписаниеСтроки, ПараметрыСклонения, "СклонениеПредставленийОбъектов.ДанныеСклонения"); + + ИменаПадежей = ОбщегоНазначения.ВыгрузитьКолонку(СтруктураСклонения, "Ключ"); + ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ИменаПадежей, "Именительный"); + СтруктураСклонения["Именительный"] = Представление; + + Если ПараметрыСклонения.ЭтоФИО Тогда + ОписанияСловФИО = Новый Соответствие; + ПреобразоватьФИОДляСклонения(Представление, ОписанияСловФИО); + КонецЕсли; + + Для Каждого ИмяПадежа Из ИменаПадежей Цикл + Попытка + РезультатСклонения = ПолучитьСклоненияСтроки(Представление, ОписаниеСтроки, "ПД=" + ИмяПадежа)[0]; + Исключение + ЗарегистрироватьОшибкуВстроенногоМетодаСклонения(ИнформацияОбОшибке(), ПоказыватьСообщения); + СтруктураСклонения = Неопределено; + Возврат; + КонецПопытки; + Если ПараметрыСклонения.ЭтоФИО Тогда + ВосстановитьФИОПослеСклонения(РезультатСклонения, ОписанияСловФИО); + КонецЕсли; + СтруктураСклонения[ИмяПадежа] = РезультатСклонения; + КонецЦикла; +КонецПроцедуры + +Процедура ЗарегистрироватьОшибкуВстроенногоМетодаСклонения(ИнформацияОбОшибке, ПоказыватьСообщения) + + ПодробноеПредставление = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ДополнитьПредставлениеПроблемыРекомендацией(ПодробноеПредставление); + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Склонение.Получение склонения строки'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Предупреждение, , , + ПодробноеПредставление); + + Если Не ПоказыватьСообщения Тогда + Возврат; + КонецЕсли; + + КраткоеПредставление = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ДополнитьПредставлениеПроблемыРекомендацией(КраткоеПредставление); + ВызватьИсключение КраткоеПредставление; + +КонецПроцедуры + +Процедура ЗаполнитьОписаниеСтрокиПоПараметрамСклонения(ОписаниеСтроки, ПараметрыСклонения, ИмяПроцедурыИлиФункции) + + ПроверитьПараметрыСклонения(ПараметрыСклонения, ИмяПроцедурыИлиФункции); + + ПараметрыСтроки = Новый Массив; + ПараметрыСтроки.Добавить("Л=ru_RU"); + + Если ПараметрыСклонения.ЭтоФИО Тогда + Если ПараметрыСклонения.Пол = 1 Тогда + ПараметрыСтроки.Добавить("ПЛ=Мужской"); + КонецЕсли; + Если ПараметрыСклонения.Пол = 2 Тогда + ПараметрыСтроки.Добавить("ПЛ=Женский"); + КонецЕсли; + КонецЕсли; + + ОписаниеСтроки = СтрСоединить(ПараметрыСтроки, ";"); + +КонецПроцедуры + +Процедура ДополнитьПредставлениеПроблемыРекомендацией(Представление) + + Если Не ВерсияПлатформыНижеРекомендуемой() Тогда + Возврат; + КонецЕсли; + + Если Не ПустаяСтрока(Представление) Тогда + Представление = Представление + Символы.ПС + Символы.ПС; + КонецЕсли; + + Представление = Представление + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для корректной работы склонения представлений рекомендуется: + |* или обновить технологическую платформу ""1С:Предприятие"" до версии %1 или более новой, + |* или включить альтернативный сервис склонения Морфер (в разделе Администрирование).'"), + РекомендуемаяВерсия()); + +КонецПроцедуры + +Функция ВерсияПлатформыНижеРекомендуемой() + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения; + + Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПлатформы, РекомендуемаяВерсия()) < 0; + +КонецФункции + +Функция РекомендуемаяВерсия() + Возврат "8.3.18.1128"; +КонецФункции + +Функция ПредставлениеСлова() + + Структура = Новый Структура; + Структура.Вставить("ВариантРегистра"); + Структура.Вставить("Разделители", ""); + Возврат Структура; + +КонецФункции + +Функция ВидыРегистраСлова() + Возврат Новый Структура("ВРег, НРег", "ВРег", "НРег"); +КонецФункции + +Функция ВидРегистраСлова(Слово) + + Если Слово = ВРег(Слово) Тогда + Возврат ВидыРегистраСлова().ВРег; + ИначеЕсли Слово = НРег(Слово) Тогда + Возврат ВидыРегистраСлова().НРег; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +Функция СловоПоВидуРегистра(Слово, ВидРегистра) + + Если ВидРегистра = ВидыРегистраСлова().ВРег Тогда + Возврат ВРег(Слово); + ИначеЕсли ВидРегистра = ВидыРегистраСлова().НРег Тогда + Возврат НРег(Слово); + Иначе + Возврат Слово; + КонецЕсли; + +КонецФункции + +Процедура ПреобразоватьФИОДляСклонения(ФИО, ПредставленияСлов) + + ЧастиФИО = Новый Массив; + + НачалоСлова = 1; + Для Позиция = 1 По СтрДлина(ФИО) Цикл + КодСимвола = КодСимвола(ФИО, Позиция); + Если СтроковыеФункцииКлиентСервер.ЭтоРазделительСлов(КодСимвола) Тогда + Если Позиция <> НачалоСлова Тогда + Слово = Сред(ФИО, НачалоСлова, Позиция - НачалоСлова); + ЧастиФИО.Добавить(ТРег(Слово)); + ОписаниеСлова = ПредставлениеСлова(); + ОписаниеСлова.ВариантРегистра = ВидРегистраСлова(Слово); + ПредставленияСлов.Вставить(ЧастиФИО.ВГраница(), ОписаниеСлова); + КонецЕсли; + Если ОписаниеСлова = Неопределено Тогда + ЧастиФИО.Добавить(""); + ОписаниеСлова = ПредставлениеСлова(); + ПредставленияСлов.Вставить(ЧастиФИО.ВГраница(), ОписаниеСлова); + КонецЕсли; + ОписаниеСлова.Разделители = ОписаниеСлова.Разделители + Символ(КодСимвола); + НачалоСлова = Позиция + 1; + КонецЕсли; + КонецЦикла; + + Если Позиция <> НачалоСлова Тогда + Слово = Сред(ФИО, НачалоСлова, Позиция - НачалоСлова); + ЧастиФИО.Добавить(ТРег(Слово)); + ОписаниеСлова = ПредставлениеСлова(); + ОписаниеСлова.ВариантРегистра = ВидРегистраСлова(Слово); + ПредставленияСлов.Вставить(ЧастиФИО.ВГраница(), ОписаниеСлова); + КонецЕсли; + + ФИО = СтрСоединить(ЧастиФИО, " "); + +КонецПроцедуры + +Процедура ВосстановитьФИОПослеСклонения(ФИО, ПредставленияСлов) + + ЧастиФИО = СтрРазделить(ФИО, " "); + Индекс = 0; + Пока Индекс < ЧастиФИО.Количество() Цикл + ОписаниеСлова = ПредставленияСлов[Индекс]; + Если ОписаниеСлова <> Неопределено Тогда + ЧастиФИО[Индекс] = СловоПоВидуРегистра(ЧастиФИО[Индекс], ОписаниеСлова.ВариантРегистра) + ОписаниеСлова.Разделители; + КонецЕсли; + Индекс = Индекс + 1; + КонецЦикла; + + ФИО = СтрСоединить(ЧастиФИО); + +КонецПроцедуры + +Процедура ПроверитьПараметрыСклонения(ПараметрыСклонения, ИмяПроцедурыИлиФункции) + + ПроверитьПараметрЭтоФИО(ПараметрыСклонения.ЭтоФИО, ИмяПроцедурыИлиФункции); + ПроверитьПараметрПол(ПараметрыСклонения.Пол, ИмяПроцедурыИлиФункции); + +КонецПроцедуры + +#КонецОбласти + Функция СклоненияИзРегистра(Представление, Объект = Неопределено) УстановитьОтключениеБезопасногоРежима(Истина); @@ -680,33 +808,6 @@ КонецФункции -Процедура ЗаполнитьОписаниеСтрокиПоПараметрамСклонения(ОписаниеСтроки, ПараметрыСклонения, ИмяПроцедурыИлиФункции) - - ПроверитьПараметрыСклонения(ПараметрыСклонения, ИмяПроцедурыИлиФункции); - - ПараметрыСтроки = Новый Массив; - ПараметрыСтроки.Добавить("Л=ru_RU"); - - Если ПараметрыСклонения.ЭтоФИО Тогда - Если ПараметрыСклонения.Пол = 1 Тогда - ПараметрыСтроки.Добавить("ПЛ=Мужской"); - КонецЕсли; - Если ПараметрыСклонения.Пол = 2 Тогда - ПараметрыСтроки.Добавить("ПЛ=Женский"); - КонецЕсли; - КонецЕсли; - - ОписаниеСтроки = СтрСоединить(ПараметрыСтроки, ";"); - -КонецПроцедуры - -Процедура ПроверитьПараметрыСклонения(ПараметрыСклонения, ИмяПроцедурыИлиФункции) - - ПроверитьПараметрЭтоФИО(ПараметрыСклонения.ЭтоФИО, ИмяПроцедурыИлиФункции); - ПроверитьПараметрПол(ПараметрыСклонения.Пол, ИмяПроцедурыИлиФункции); - -КонецПроцедуры - Процедура ПроверитьПараметрЭтоФИО(ЭтоФИО, ИмяПроцедурыИлиФункции) ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( @@ -747,94 +848,4 @@ КонецПроцедуры -Функция ПредставлениеСлова() - - Структура = Новый Структура; - Структура.Вставить("ВариантРегистра"); - Структура.Вставить("Разделители", ""); - Возврат Структура; - -КонецФункции - -Функция ВидыРегистраСлова() - Возврат Новый Структура("ВРег, НРег", "ВРег", "НРег"); -КонецФункции - -Функция ВидРегистраСлова(Слово) - - Если Слово = ВРег(Слово) Тогда - Возврат ВидыРегистраСлова().ВРег; - ИначеЕсли Слово = НРег(Слово) Тогда - Возврат ВидыРегистраСлова().НРег; - Иначе - Возврат Неопределено; - КонецЕсли; - -КонецФункции - -Функция СловоПоВидуРегистра(Слово, ВидРегистра) - - Если ВидРегистра = ВидыРегистраСлова().ВРег Тогда - Возврат ВРег(Слово); - ИначеЕсли ВидРегистра = ВидыРегистраСлова().НРег Тогда - Возврат НРег(Слово); - Иначе - Возврат Слово; - КонецЕсли; - -КонецФункции - -Процедура ПреобразоватьФИОДляСклонения(ФИО, ПредставленияСлов) - - ЧастиФИО = Новый Массив; - - НачалоСлова = 1; - Для Позиция = 1 По СтрДлина(ФИО) Цикл - КодСимвола = КодСимвола(ФИО, Позиция); - Если СтроковыеФункцииКлиентСервер.ЭтоРазделительСлов(КодСимвола) Тогда - Если Позиция <> НачалоСлова Тогда - Слово = Сред(ФИО, НачалоСлова, Позиция - НачалоСлова); - ЧастиФИО.Добавить(ТРег(Слово)); - ОписаниеСлова = ПредставлениеСлова(); - ОписаниеСлова.ВариантРегистра = ВидРегистраСлова(Слово); - ПредставленияСлов.Вставить(ЧастиФИО.ВГраница(), ОписаниеСлова); - КонецЕсли; - Если ОписаниеСлова = Неопределено Тогда - ЧастиФИО.Добавить(""); - ОписаниеСлова = ПредставлениеСлова(); - ПредставленияСлов.Вставить(ЧастиФИО.ВГраница(), ОписаниеСлова); - КонецЕсли; - ОписаниеСлова.Разделители = ОписаниеСлова.Разделители + Символ(КодСимвола); - НачалоСлова = Позиция + 1; - КонецЕсли; - КонецЦикла; - - Если Позиция <> НачалоСлова Тогда - Слово = Сред(ФИО, НачалоСлова, Позиция - НачалоСлова); - ЧастиФИО.Добавить(ТРег(Слово)); - ОписаниеСлова = ПредставлениеСлова(); - ОписаниеСлова.ВариантРегистра = ВидРегистраСлова(Слово); - ПредставленияСлов.Вставить(ЧастиФИО.ВГраница(), ОписаниеСлова); - КонецЕсли; - - ФИО = СтрСоединить(ЧастиФИО, " "); - -КонецПроцедуры - -Процедура ВосстановитьФИОПослеСклонения(ФИО, ПредставленияСлов) - - ЧастиФИО = СтрРазделить(ФИО, " "); - Индекс = 0; - Пока Индекс < ЧастиФИО.Количество() Цикл - ОписаниеСлова = ПредставленияСлов[Индекс]; - Если ОписаниеСлова <> Неопределено Тогда - ЧастиФИО[Индекс] = СловоПоВидуРегистра(ЧастиФИО[Индекс], ОписаниеСлова.ВариантРегистра) + ОписаниеСлова.Разделители; - КонецЕсли; - Индекс = Индекс + 1; - КонецЦикла; - - ФИО = СтрСоединить(ЧастиФИО); - -КонецПроцедуры - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl index 0f429209d..a378daf10 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовВызовСервера/Module.bsl @@ -20,9 +20,7 @@ КонецФункции Функция ЕстьПравоДоступаКОбъекту(Ссылка) Экспорт - Возврат СклонениеПредставленийОбъектов.ЕстьПравоДоступаКОбъекту(Ссылка); - КонецФункции #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl index 2d65150f2..a028c3978 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl @@ -130,7 +130,7 @@ ДлительнаяОперация = СклонениеПредставленийОбъектовВызовСервера.ДлительнаяОперацияСклоненияПоПадежам( Форма.УникальныйИдентификатор, Представление, - ПараметрыСклонения, + ПараметрыСклонения, ПоказыватьСообщения); ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Форма); diff --git a/SSL/src/CommonModules/СоединенияИБ/Module.bsl b/SSL/src/CommonModules/СоединенияИБ/Module.bsl index 1df57d34f..fd35efec2 100644 --- a/SSL/src/CommonModules/СоединенияИБ/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБ/Module.bsl @@ -16,22 +16,24 @@ // то устанавливает блокировку сеансов области данных. // // Параметры: -// ТекстСообщения - Строка - текст, который будет частью сообщения об ошибке -// при попытке установки соединения с заблокированной -// информационной базой. +// ТекстСообщения - Строка - текст, который будет частью сообщения об ошибке +// при попытке установки соединения с заблокированной +// информационной базой. // -// КодРазрешения - Строка - строка, которая должна быть добавлена к параметру -// командной строки "/uc" или к параметру строки -// соединения "uc", чтобы установить соединение с -// информационной базой несмотря на блокировку. -// Не применимо для блокировки сеансов области данных. +// КодРазрешения - Строка - строка, которая должна быть добавлена к параметру +// командной строки "/uc" или к параметру строки +// соединения "uc", чтобы установить соединение с +// информационной базой несмотря на блокировку. +// Не применимо для блокировки сеансов области данных. +// ОжиданиеНачалаБлокировки - Число - время отсрочки начала блокировки в минутах. +// ДлительностьБлокировки - Число - время длительности блокировки в минутах. // // Возвращаемое значение: // Булево - Истина, если блокировка установлена успешно. // Ложь, если для выполнения блокировки недостаточно прав. // -Функция УстановитьБлокировкуСоединений(Знач ТекстСообщения = "", - Знач КодРазрешения = "КодРазрешения") Экспорт +Функция УстановитьБлокировкуСоединений(Знач ТекстСообщения = "", Знач КодРазрешения = "КодРазрешения", + Знач ОжиданиеНачалаБлокировки = 0, Знач ДлительностьБлокировки = 0) Экспорт // АПК:142 расширен программный интерфейс с сохранением обратной совместимости. Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда @@ -41,10 +43,16 @@ Блокировка = НовыеПараметрыБлокировкиСоединений(); Блокировка.Установлена = Истина; - Блокировка.Начало = ТекущаяДатаСеанса(); + Блокировка.Начало = ТекущаяДатаСеанса() + ОжиданиеНачалаБлокировки * 60; Блокировка.Сообщение = СформироватьСообщениеБлокировки(ТекстСообщения, КодРазрешения); Блокировка.Эксклюзивная = Пользователи.ЭтоПолноправныйПользователь(, Истина); + + Если ДлительностьБлокировки > 0 Тогда + Блокировка.Конец = Блокировка.Начало + ДлительностьБлокировки * 60; + КонецЕсли; + УстановитьБлокировкуСеансовОбластиДанных(Блокировка); + Возврат Истина; Иначе Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда @@ -53,10 +61,16 @@ Блокировка = Новый БлокировкаСеансов; Блокировка.Установлена = Истина; - Блокировка.Начало = ТекущаяДатаСеанса(); + Блокировка.Начало = ТекущаяДатаСеанса() + ОжиданиеНачалаБлокировки * 60; Блокировка.КодРазрешения = КодРазрешения; Блокировка.Сообщение = СформироватьСообщениеБлокировки(ТекстСообщения, КодРазрешения); + + Если ДлительностьБлокировки > 0 Тогда + Блокировка.Конец = Блокировка.Начало + ДлительностьБлокировки * 60; + КонецЕсли; + УстановитьБлокировкуСеансов(Блокировка); + Возврат Истина; КонецЕсли; @@ -139,7 +153,7 @@ // // Параметры: // ПолучатьСтрокуСоединения - Булево - признак необходимости добавления в возвращаемое значение строки соединения. -// СообщенияДляЖурналаРегистрации - СписокЗначение - если параметр не пустой, то будет выполнена запись событий +// СообщенияДляЖурналаРегистрации - СписокЗначений - если параметр не пустой, то будет выполнена запись событий // из списка в журнал регистрации. // ПортКластера - Число - нестандартный порт кластера серверов. // diff --git a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl index c4b14e8b7..ceb69e11f 100644 --- a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl @@ -20,24 +20,27 @@ // то устанавливает блокировку сеансов области данных. // // Параметры: -// ТекстСообщения - Строка - текст, который будет частью сообщения об ошибке -// при попытке установки соединения с заблокированной -// информационной базой. +// ТекстСообщения - Строка - текст, который будет частью сообщения об ошибке +// при попытке установки соединения с заблокированной +// информационной базой. // -// КодРазрешения - Строка - строка, которая должна быть добавлена к параметру -// командной строки "/uc" или к параметру строки -// соединения "uc", чтобы установить соединение с -// информационной базой несмотря на блокировку. -// Не применимо для блокировки сеансов области данных. +// КодРазрешения - Строка - строка, которая должна быть добавлена к параметру +// командной строки "/uc" или к параметру строки +// соединения "uc", чтобы установить соединение с +// информационной базой несмотря на блокировку. +// Не применимо для блокировки сеансов области данных. +// ОжиданиеНачалаБлокировки - Число - время отсрочки начала блокировки в минутах. +// ДлительностьБлокировки - Число - время длительности блокировки в минутах. // // Возвращаемое значение: // Булево - Истина, если блокировка установлена успешно. // Ложь, если для выполнения блокировки недостаточно прав. // -Функция УстановитьБлокировкуСоединений(ТекстСообщения = "", - КодРазрешения = "КодРазрешения") Экспорт +Функция УстановитьБлокировкуСоединений(ТекстСообщения = "", КодРазрешения = "КодРазрешения", + ОжиданиеНачалаБлокировки = 0, ДлительностьБлокировки = 0) Экспорт // АПК:142 расширен программный интерфейс с сохранением обратной совместимости. - Возврат СоединенияИБ.УстановитьБлокировкуСоединений(ТекстСообщения, КодРазрешения); + Возврат СоединенияИБ.УстановитьБлокировкуСоединений( + ТекстСообщения, КодРазрешения, ОжиданиеНачалаБлокировки, ДлительностьБлокировки); КонецФункции diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl index 62c098c96..8833738c8 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl @@ -36,17 +36,19 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныйПрограммныйИнтерфейс - -// Подключить обработчик ожидания КонтрольРежимаЗавершенияРаботыПользователей или. -// ЗавершитьРаботуПользователей в зависимости от параметра УстановитьБлокировкуСоединений. +// Устанавливает и отключает режим завершения работы пользователей в программе. +// При завершении работы, до наступления момента блокировки, всем активным пользователям +// будет выводиться уведомление о планируемом завершении работы программы и рекомендацией +// сохранить все свои данные. +// Текущий сеанс завершается последним. // -Процедура УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Знач УстановитьБлокировкуСоединений) Экспорт +// Параметры: +// ЗавершитьРаботу - Булево. +// +Процедура УстановитьРежимЗавершенияРаботыПользователей(Знач ЗавершитьРаботу) Экспорт - УстановитьПризнакРаботаПользователейЗавершается(УстановитьБлокировкуСоединений); - Если УстановитьБлокировкуСоединений Тогда + УстановитьПризнакРаботаПользователейЗавершается(ЗавершитьРаботу); + Если ЗавершитьРаботу Тогда // Поскольку блокировка еще не установлена, то при входе в систему // для данного пользователя был подключен обработчик ожидания завершения работы. // Отключаем его. Так как для этого пользователя подключается специализированный обработчик ожидания @@ -63,6 +65,27 @@ КонецПроцедуры +// Позволяет отметить необходимость завершения работы сеанса, включившего блокировку работы +// пользователей в программе. +// +// Параметры: +// Значение - Булево - Истина, если если текущий сеанс завершать не требуется. +// +Процедура УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Значение) Экспорт + + ИмяПараметра = "СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"; + Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда + ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура); + КонецЕсли; + + ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"].Вставить("ЗавершитьВсеСеансыКромеТекущего", Значение); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + // Завершает работу (последнего) сеанса администратора, который инициировал завершение работы пользователей. // Процедура ЗавершитьРаботуЭтогоСеанса(ВыводитьВопрос = Истина) Экспорт @@ -86,22 +109,6 @@ КонецПроцедуры -// Устанавливает значение переменной ЗавершитьВсеСеансыКромеТекущего в значение Значение. -// -// Параметры: -// Значение - Булево - устанавливаемое значение. -// -Процедура УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Значение) Экспорт - - ИмяПараметра = "СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"; - Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - ПараметрыПриложения.Вставить(ИмяПараметра, Новый Структура); - КонецЕсли; - - ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыЗавершенияРаботыПользователей"].Вставить("ЗавершитьВсеСеансыКромеТекущего", Значение); - -КонецПроцедуры - // Устанавливает значение переменной РаботаПользователейЗавершается в значение Значение. // // Параметры: @@ -126,7 +133,7 @@ // Параметры: // ПараметрыЗапуска - Массив - массив строк разделенных символом ";" в параметре запуска, // переданным в конфигурацию с помощью ключа командной строки /C. -// Отказ - Булево - (возвращаемое значение), если установить Истина, +// Отказ - Булево - возвращаемое значение. Если установить Истина, // обработка события ПриНачалеРаботыСистемы будет прервана. // Процедура ПриОбработкеПараметровЗапуска(ПараметрыЗапуска, Отказ) Экспорт @@ -226,7 +233,7 @@ // Переопределяет стандартное предупреждение открытием произвольной формы активных пользователей. // // Параметры: -// ИмяФормы - строка (возвращаемое значение). +// ИмяФормы - Строка - возвращаемое значение. // Процедура ПриОпределенииФормыАктивныхПользователей(ИмяФормы) Экспорт @@ -289,9 +296,10 @@ КонецПроцедуры Процедура ЗаполнитьПараметрыАдминистрированияКластера(ПараметрыЗапуска) - ПараметрыАдминистрирования = СоединенияИБВызовСервера.ПараметрыАдминистрирования(); + ПараметрыАдминистрирования = СоединенияИБВызовСервера.ПараметрыАдминистрирования(); КоличествоПараметров = ПараметрыЗапуска.Количество(); + Если КоличествоПараметров > 1 Тогда ПараметрыАдминистрирования.ИмяАдминистратораКластера = ПараметрыЗапуска[1]; КонецЕсли; @@ -299,6 +307,7 @@ Если КоличествоПараметров > 2 Тогда ПараметрыАдминистрирования.ПарольАдминистратораКластера = ПараметрыЗапуска[2]; КонецЕсли; + СохранитьПараметрыАдминистрирования(ПараметрыАдминистрирования); КонецПроцедуры @@ -418,7 +427,7 @@ // Обработка параметров запуска программы - // ЗапретитьРаботуПользователей и РазрешитьРаботуПользователей. - Если ПараметрыЗапуска.Найти("РазрешитьРаботуПользователей") <> Неопределено Тогда + Если КлючСодержитсяВПараметрахЗапуска(ПараметрыЗапуска, "РазрешитьРаботуПользователей") Тогда Если НЕ СоединенияИБВызовСервера.РазрешитьРаботуПользователей() Тогда ТекстСообщения = НСтр("ru = 'Параметр запуска РазрешитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); @@ -436,19 +445,30 @@ // в клиент-серверном варианте развертывания системы. Их необходимо передавать в случае, // если текущий пользователь не является администратором ИБ. // См. использование в процедуре ЗавершитьРаботуПользователей(). - ИначеЕсли ПараметрыЗапуска.Найти("ЗавершитьРаботуПользователей") <> Неопределено Тогда + ИначеЕсли КлючСодержитсяВПараметрахЗапуска(ПараметрыЗапуска, "ЗавершитьРаботуПользователей") Тогда - Если НЕ СоединенияИБВызовСервера.УстановитьБлокировкуСоединений() Тогда + ДополнительныеПараметры = ДополнительныеПараметрыЗавершенияРаботыПользователей(); + + БлокировкаУстановлена = СоединенияИБВызовСервера.УстановитьБлокировкуСоединений( + ДополнительныеПараметры.ТекстСообщения, + ДополнительныеПараметры.КодРазрешения, + ДополнительныеПараметры.ОжиданиеНачалаБлокировкиМин, + ДополнительныеПараметры.ДлительностьБлокировкиМин); + + Если НЕ БлокировкаУстановлена Тогда ТекстСообщения = НСтр("ru = 'Параметр запуска ЗавершитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); ПоказатьПредупреждение(,ТекстСообщения); Возврат Ложь; КонецЕсли; + ПараметрыЗапускаУточненные = ПараметрыЗапускаУточненные(ПараметрыЗапуска, ДополнительныеПараметры); + // Если выполнен запуск с ключом, то нужно зачитать параметры администрирования кластера. - ЗаполнитьПараметрыАдминистрированияКластера(ПараметрыЗапуска); + ЗаполнитьПараметрыАдминистрированияКластера(ПараметрыЗапускаУточненные); ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60); ЗавершитьРаботуПользователей(); + Возврат Ложь; // Продолжить запуск программы. КонецЕсли; @@ -467,4 +487,234 @@ КонецФункции +#Область ДополнительныеПараметрыЗавершенияРаботыПользователей + +// Извлекает параметры блокировки сеанса из параметра запуска. +// +// Возвращаемое значение: +// Структура: +// * ИмяАдминистратораКластера - Строка - имя администратор кластера серверов 1С. +// * ПарольАдминистратораКластера - Строка - пароль администратор кластера серверов 1С. +// * ТекстСообщения - Строка - текст, который будет частью сообщения об ошибке +// при попытке установки соединения с заблокированной +// информационной базой. +// * КодРазрешения - Строка - строка, которая должна быть добавлена к параметру +// командной строки "/uc" или к параметру строки +// соединения "uc", чтобы установить соединение с +// информационной базой несмотря на блокировку. +// Не применимо для блокировки сеансов области данных. +// * ОжиданиеНачалаБлокировкиМин - Число - время отсрочки начала блокировки в минутах. +// * ДлительностьБлокировкиМин - Число - время длительности блокировки в минутах. +// +Функция ДополнительныеПараметрыЗавершенияРаботыПользователей() + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ИмяАдминистратораКластера", ""); + ДополнительныеПараметры.Вставить("ПарольАдминистратораКластера", ""); + ДополнительныеПараметры.Вставить("ТекстСообщения", ""); + ДополнительныеПараметры.Вставить("КодРазрешения", "КодРазрешения"); + ДополнительныеПараметры.Вставить("ОжиданиеНачалаБлокировкиМин", 0); + ДополнительныеПараметры.Вставить("ДлительностьБлокировкиМин", 0); + + ДополнительныеПараметрыИзвлеченные = ДополнительныеПараметрыЗавершенияРаботыПользователейИзвлеченные(); + + Для Каждого Параметр Из ДополнительныеПараметры Цикл + + ЗначениеПараметра = Неопределено; + + Если ДополнительныеПараметрыИзвлеченные.Свойство(Параметр.Ключ, ЗначениеПараметра) + И ЗначениеЗаполнено(ЗначениеПараметра) Тогда + + ДополнительныеПараметры[Параметр.Ключ] = ЗначениеПараметра; + КонецЕсли; + + КонецЦикла; + + Возврат ДополнительныеПараметры; + +КонецФункции + +Функция ДополнительныеПараметрыЗавершенияРаботыПользователейИзвлеченные() + + ДополнительныеПараметры = Новый Структура; + + ПараметрЗавершенияРаботыПользователей = ПараметрЗавершенияРаботыПользователей(); + + Если Не ЗначениеЗаполнено(ПараметрЗавершенияРаботыПользователей) Тогда + Возврат ДополнительныеПараметры; + КонецЕсли; + + НачальныйНомер = СтрНайти(ПараметрЗавершенияРаботыПользователей, "ЗавершитьРаботуПользователей") + + СтрДлина("ЗавершитьРаботуПользователей"); + + ДополнительныеПараметрыСтрокой = СокрЛП(Сред(ПараметрЗавершенияРаботыПользователей, НачальныйНомер)); + СоставДополнительныхПараметров = СтрРазделить(ДополнительныеПараметрыСтрокой, ","); + ПредыдущийПараметр = Неопределено; + + Для Каждого Параметр Из СоставДополнительныхПараметров Цикл + + ОписаниеПараметра = СтрРазделить(Параметр, "="); + + Если ОписаниеПараметра.Количество() <> 2 Тогда + + Если ПредыдущийПараметр <> Неопределено + И ЗначениеЗаполнено(ОписаниеПараметра[0]) Тогда + + ЗначениеПараметра = ДополнительныеПараметры[ПредыдущийПараметр] + "," + ОписаниеПараметра[0]; + ДополнительныеПараметры.Вставить(ПредыдущийПараметр, ЗначениеПараметра); + + КонецЕсли; + + Продолжить; + + КонецЕсли; + + ДополнительныеПараметры.Вставить(СокрЛП(ОписаниеПараметра[0]), СокрЛП(ОписаниеПараметра[1])); + ПредыдущийПараметр = СокрЛП(ОписаниеПараметра[0]); + + КонецЦикла; + + Возврат ДополнительныеПараметрыЗавершенияРаботыПользователейНормализованные(ДополнительныеПараметры); + +КонецФункции + +Функция ПараметрЗавершенияРаботыПользователей() + + СоставПараметровЗапуска = СтрРазделить(ПараметрЗапуска, ";", Ложь); + + Для Каждого Параметр Из СоставПараметровЗапуска Цикл + + Если СтрНачинаетсяС(СокрЛП(Параметр), "ЗавершитьРаботуПользователей") Тогда + Возврат Параметр; + КонецЕсли; + + КонецЦикла; + + Возврат ""; + +КонецФункции + +Функция ДополнительныеПараметрыЗавершенияРаботыПользователейНормализованные(ДополнительныеПараметры) + + ДополнительныеПараметрыНормализованные = Новый Структура; + + КлючиДополнительныхПараметров = КлючиДополнительныхПараметровЗавершенияРаботыПользователей(); + + Для Каждого ДополнительныйПараметр Из ДополнительныеПараметры Цикл + + Для Каждого КлючДополнительногоПараметра Из КлючиДополнительныхПараметров Цикл + + Если СтрНачинаетсяС(ДополнительныйПараметр.Ключ, КлючДополнительногоПараметра.Ключ) Тогда + + ДополнительныеПараметрыНормализованные.Вставить( + КлючДополнительногоПараметра.Значение, ДополнительныйПараметр.Значение); + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + ОтформатироватьДополнительныеПараметрыЗавершенияРаботыПользователей(ДополнительныеПараметрыНормализованные); + + Возврат ДополнительныеПараметрыНормализованные; + +КонецФункции + +Функция КлючиДополнительныхПараметровЗавершенияРаботыПользователей() + + КлючиДополнительныхПараметров = Новый Соответствие; + КлючиДополнительныхПараметров.Вставить("Имя", "ИмяАдминистратораКластера"); + КлючиДополнительныхПараметров.Вставить("Пароль", "ПарольАдминистратораКластера"); + КлючиДополнительныхПараметров.Вставить("Сообщение", "ТекстСообщения"); + КлючиДополнительныхПараметров.Вставить("Код", "КодРазрешения"); + КлючиДополнительныхПараметров.Вставить("Ожидание", "ОжиданиеНачалаБлокировкиМин"); + КлючиДополнительныхПараметров.Вставить("Длительность", "ДлительностьБлокировкиМин"); + + Возврат КлючиДополнительныхПараметров; + +КонецФункции + +Процедура ОтформатироватьДополнительныеПараметрыЗавершенияРаботыПользователей(ДополнительныеПараметры) + + ПараметрыПодлежащиеФорматированию = Новый Массив; + ПараметрыПодлежащиеФорматированию.Добавить("ОжиданиеНачалаБлокировкиМин"); + ПараметрыПодлежащиеФорматированию.Добавить("ДлительностьБлокировкиМин"); + + ОписаниеЧисла = Новый ОписаниеТипов("Число"); + + Для Каждого Параметр Из ПараметрыПодлежащиеФорматированию Цикл + + ЗначениеПараметра = Неопределено; + + Если Не ДополнительныеПараметры.Свойство(Параметр, ЗначениеПараметра) Тогда + Продолжить; + КонецЕсли; + + ДоступныеСимволы = Новый Массив; + + КоличествоСимволов = СтрДлина(ЗначениеПараметра); + + Для НомерСимвола = 1 По КоличествоСимволов Цикл + + Символ = Сред(ЗначениеПараметра, НомерСимвола, 1); + + Если СтрНайти("0123456789", Символ) > 0 Тогда + ДоступныеСимволы.Добавить(Символ); + КонецЕсли; + + КонецЦикла; + + ЗначениеПараметраНормализованное = СтрСоединить(ДоступныеСимволы); + + Если ЗначениеЗаполнено(ЗначениеПараметраНормализованное) Тогда + ДополнительныеПараметры[Параметр] = ОписаниеЧисла.ПривестиЗначение(ЗначениеПараметраНормализованное); + Иначе + ДополнительныеПараметры[Параметр] = 0; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +Функция КлючСодержитсяВПараметрахЗапуска(ПараметрыЗапуска, Ключ) + + Для Каждого Параметр Из ПараметрыЗапуска Цикл + + Если СтрНачинаетсяС(СокрЛП(Параметр), Ключ) Тогда + Возврат Истина; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ПараметрыЗапускаУточненные(ПараметрыЗапуска, ДополнительныеПараметры) + + ИмяАдминистратораКластера = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + ДополнительныеПараметры, "ИмяАдминистратораКластера"); + + Если Не ЗначениеЗаполнено(ИмяАдминистратораКластера) Тогда + Возврат ПараметрыЗапуска; + КонецЕсли; + + ПараметрыЗапускаУточненные = Новый Массив; + ПараметрыЗапускаУточненные.Добавить(ПараметрыЗапуска[0]); + ПараметрыЗапускаУточненные.Добавить(ИмяАдминистратораКластера); + + ПарольАдминистратораКластера = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + ДополнительныеПараметры, "ПарольАдминистратораКластера"); + + Если ЗначениеЗаполнено(ПарольАдминистратораКластера) Тогда + ПараметрыЗапускаУточненные.Добавить(ПарольАдминистратораКластера); + КонецЕсли; + + Возврат ПараметрыЗапускаУточненные; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl b/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl index c0ddd9a15..ed9a0c72c 100644 --- a/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl +++ b/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl @@ -234,6 +234,23 @@ КонецФункции +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ВидКоманд - СтрокаТаблицыЗначений: см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд.ВидыПодключаемыхКоманд +// СведенияОПодменюПоУмолчанию - СтрокаТаблицыЗначений: +// * Подменю - ГруппаФормы +// * ВыведеноКоманд - Число +// * ЕстьКомандыСУсловиямиВидимости - Булево +// * ЕстьКомандыБезУсловийВидимости - Булево +// * Группы - Структура: +// ** Обычное - ГруппаФормы +// ** Важное - ГруппаФормы +// ** СмТакже - ГруппаФормы +// * ГруппаПоУмолчанию - ГруппаФормы +// * ПоследняяКоманда - КомандаФормы +// * КомандыСУсловиямиВидимости - Массив +// ПараметрыРазмещения - см. ПодключаемыеКоманды.ПараметрыРазмещения +// Процедура ПриВыводеКоманд(Форма, ВидКоманд, СведенияОПодменюПоУмолчанию, ПараметрыРазмещения) Экспорт Если ВидКоманд.Имя <> "СозданиеНаОсновании" Тогда @@ -248,7 +265,7 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения -// ДинамическоеПодменюСозданияНаОсновании - см. ПодключаемыеКоманды.ЗарегистрироватьПодменю +// ДинамическоеПодменюСозданияНаОсновании - см. ПриВыводеКоманд.СведенияОПодменюПоУмолчанию // Процедура СкрытьСтандартноеПодменюВводаНаОсновании(Форма, ДинамическоеПодменюСозданияНаОсновании) diff --git a/SSL/src/CommonModules/СозданиеНаОснованииПереопределяемый/Module.bsl b/SSL/src/CommonModules/СозданиеНаОснованииПереопределяемый/Module.bsl index b617a9742..34eabe165 100644 --- a/SSL/src/CommonModules/СозданиеНаОснованииПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СозданиеНаОснованииПереопределяемый/Module.bsl @@ -94,8 +94,8 @@ // * Обработчик - Строка - описание процедуры, обрабатывающей основное действие команды. // Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется когда процедура размещена в общем модуле. // Формат "<ИмяПроцедуры>" используется в следующих случаях: -// - если ИмяФормы заполнено то в модуле указанной формы ожидается клиентская процедура. -// - если ИмяФормы не заполнено то в модуле менеджера этого объекта ожидается серверная процедура. +// 1) если ИмяФормы заполнено то в модуле указанной формы ожидается клиентская процедура. +// 2) если ИмяФормы не заполнено то в модуле менеджера этого объекта ожидается серверная процедура. // * ДополнительныеПараметры - ФиксированнаяСтруктура - необязательный. Параметры обработчика, указанного в Обработчик. // // Параметры - Структура - сведения о контексте исполнения: diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl index 2c3af1286..427a1d09b 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl @@ -17,12 +17,10 @@ КонецПроцедуры -// Продолжает завершение в режиме интерактивного взаимодействия с пользователем -// после установки Отказ = Истина. -// -Процедура ОбработчикОжиданияИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы() Экспорт +// Продолжает запуск в режиме интерактивного взаимодействия с пользователем. +Процедура ОбработчикОжиданияНачатьИнтерактивнуюОбработкуПередНачаломРаботыСистемы() Экспорт - СтандартныеПодсистемыКлиент.НачатьИнтерактивнуюОбработкуПередЗавершениемРаботыСистемы(); + СтандартныеПодсистемыКлиент.НачатьИнтерактивнуюОбработкуПередНачаломРаботыСистемы(); КонецПроцедуры @@ -33,6 +31,15 @@ КонецПроцедуры +// Продолжает завершение в режиме интерактивного взаимодействия с пользователем +// после установки Отказ = Истина. +// +Процедура ОбработчикОжиданияИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы() Экспорт + + СтандартныеПодсистемыКлиент.НачатьИнтерактивнуюОбработкуПередЗавершениемРаботыСистемы(); + +КонецПроцедуры + // Вызывается после запуска конфигурации, открывает окно информации. Процедура ПоказатьИнформациюПослеЗапуска() Экспорт МодульИнформацияПриЗапускеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнформацияПриЗапускеКлиент"); diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl index 1a90cfb09..223f4dde2 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl @@ -225,10 +225,10 @@ // ОповещениеЗавершения - ОписаниеОповещения - не задается при вызове из обработчика ПередНачаломРаботыСистемы // модулей управляемого и обычного приложения. В других случаях, после запуска будет вызвано // оповещение с параметром типа Структура со свойствами: -// - Отказ - Булево - Ложь, если запуск выполнен успешно, или Истина, если вход в программу не +// > Отказ - Булево - Ложь, если запуск выполнен успешно, или Истина, если вход в программу не // выполнен; -// - Перезапустить - Булево - если требуется перезапуск программы; -// - ДополнительныеПараметрыКоманднойСтроки - Строка - для перезапуска. +// > Перезапустить - Булево - если требуется перезапуск программы; +// > ДополнительныеПараметрыКоманднойСтроки - Строка - для перезапуска. // Процедура ПередНачаломРаботыСистемы(Знач ОповещениеЗавершения = Неопределено) Экспорт @@ -319,10 +319,10 @@ // ОповещениеЗавершения - ОписаниеОповещения - не задается при вызове из обработчика ПриНачалеРаботыСистемы // модулей управляемого и обычного приложения. В других случаях, после запуска будет вызвано // оповещение с параметром типа Структура со свойствами: -// - Отказ - Булево - Ложь, если запуск выполнен успешно, или Истина, если вход в программу не +// > Отказ - Булево - Ложь, если запуск выполнен успешно, или Истина, если вход в программу не // выполнен; -// - Перезапустить - Булево - если требуется перезапуск программы; -// - ДополнительныеПараметрыКоманднойСтроки - Строка - для перезапуска. +// > Перезапустить - Булево - если требуется перезапуск программы; +// > ДополнительныеПараметрыКоманднойСтроки - Строка - для перезапуска. // // НепрерывноеВыполнение - Булево - только для внутреннего использования. // Для перехода из обработчика ПередНачаломРаботыСистемы @@ -549,6 +549,7 @@ Если ПараметрыКлиента = Неопределено Тогда // Заполнение постоянных параметров клиента. СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыКлиента = ПараметрыПриложения[ИмяГлобальногоПараметра]; КонецЕсли; Если ИмяПараметра = Неопределено Тогда @@ -986,44 +987,46 @@ // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. Процедура ДействияПередНачаломРаботыСистемыВМодуляхИнтеграционнойПроцедуры(Неопределен, Контекст) Экспорт - Параметры = ПараметрыОбработкиПередНачаломРаботыСистемы(); - - Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда - ДействияПередНачаломРаботыСистемыВПереопределяемойПроцедуре(Неопределено, Неопределено); - Возврат; - КонецЕсли; - - ОписаниеМодуля = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; - Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; - - Попытка - Если ТипЗнч(ОписаниеМодуля) <> Тип("Структура") Тогда - ТекущийМодуль = ОписаниеМодуля; - ТекущийМодуль.ПередНачаломРаботыСистемы(Параметры); - Иначе - ТекущийМодуль = ОписаниеМодуля.Модуль; - Если ОписаниеМодуля.Номер = 2 Тогда - ТекущийМодуль.ПередНачаломРаботыСистемы2(Параметры); - ИначеЕсли ОписаниеМодуля.Номер = 3 Тогда - ТекущийМодуль.ПередНачаломРаботыСистемы3(Параметры); - ИначеЕсли ОписаниеМодуля.Номер = 4 Тогда - ТекущийМодуль.ПередНачаломРаботыСистемы4(Параметры); - ИначеЕсли ОписаниеМодуля.Номер = 5 Тогда - ТекущийМодуль.ПередНачаломРаботыСистемы5(Параметры); - КонецЕсли; + Пока Истина Цикл + + Параметры = ПараметрыОбработкиПередНачаломРаботыСистемы(); + + Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПередНачаломРаботыСистемыВПереопределяемойПроцедуре(Неопределено, Неопределено); + Возврат; КонецЕсли; - Исключение - ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + ОписаниеМодуля = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; + + Попытка + Если ТипЗнч(ОписаниеМодуля) <> Тип("Структура") Тогда + ТекущийМодуль = ОписаниеМодуля; + ТекущийМодуль.ПередНачаломРаботыСистемы(Параметры); + Иначе + ТекущийМодуль = ОписаниеМодуля.Модуль; + Если ОписаниеМодуля.Номер = 2 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы2(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 3 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы3(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 4 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы4(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 5 Тогда + ТекущийМодуль.ПередНачаломРаботыСистемы5(Параметры); + КонецЕсли; + КонецЕсли; + Исключение + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке(), Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + КонецЦикла; КонецПроцедуры @@ -1066,30 +1069,32 @@ // Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. Процедура ДействияПередНачаломРаботыСистемыВМодуляхПереопределяемойПроцедуры(Неопределен, Контекст) Экспорт - Параметры = ПараметрыОбработкиПередНачаломРаботыСистемы(); - - Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда - ДействияПередНачаломРаботыСистемыПослеВсехПроцедур(Неопределено, Неопределено); - Возврат; - КонецЕсли; - - ТекущийМодуль = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; - Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; - - Попытка - ТекущийМодуль.ПередНачаломРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке()); - КонецПопытки; - Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + Пока Истина Цикл + + Параметры = ПараметрыОбработкиПередНачаломРаботыСистемы(); + + Если Не ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПередНачаломРаботыСистемыПослеВсехПроцедур(Неопределено, Неопределено); + Возврат; + КонецЕсли; + + ТекущийМодуль = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; + + Попытка + ТекущийМодуль.ПередНачаломРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПередНачаломРаботыСистемы(Параметры, ИнформацияОбОшибке()); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + КонецЦикла; КонецПроцедуры @@ -1218,42 +1223,43 @@ // Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. Процедура ДействияПриНачалеРаботыСистемыВМодуляхИнтеграционнойПроцедуры(Неопределен, Контекст) Экспорт - Параметры = ПараметрыОбработкиПриНачалеРаботыСистемы(); - - Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда - ДействияПриНачалеРаботыСистемыВПереопределяемойПроцедуре(Неопределено, Неопределено); - Возврат; - КонецЕсли; - - ОписаниеМодуля = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; - Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; - - Попытка - Если ТипЗнч(ОписаниеМодуля) <> Тип("Структура") Тогда - ТекущийМодуль = ОписаниеМодуля; - ТекущийМодуль.ПриНачалеРаботыСистемы(Параметры); - Иначе - ТекущийМодуль = ОписаниеМодуля.Модуль; - Если ОписаниеМодуля.Номер = 2 Тогда - ТекущийМодуль.ПриНачалеРаботыСистемы2(Параметры); - ИначеЕсли ОписаниеМодуля.Номер = 3 Тогда - ТекущийМодуль.ПриНачалеРаботыСистемы3(Параметры); - ИначеЕсли ОписаниеМодуля.Номер = 4 Тогда - ТекущийМодуль.ПриНачалеРаботыСистемы4(Параметры); - КонецЕсли; + Пока Истина Цикл + Параметры = ПараметрыОбработкиПриНачалеРаботыСистемы(); + + Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; КонецЕсли; - Исключение - ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); - КонецПопытки; - Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПриНачалеРаботыСистемыВПереопределяемойПроцедуре(Неопределено, Неопределено); + Возврат; + КонецЕсли; + + ОписаниеМодуля = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; + + Попытка + Если ТипЗнч(ОписаниеМодуля) <> Тип("Структура") Тогда + ТекущийМодуль = ОписаниеМодуля; + ТекущийМодуль.ПриНачалеРаботыСистемы(Параметры); + Иначе + ТекущийМодуль = ОписаниеМодуля.Модуль; + Если ОписаниеМодуля.Номер = 2 Тогда + ТекущийМодуль.ПриНачалеРаботыСистемы2(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 3 Тогда + ТекущийМодуль.ПриНачалеРаботыСистемы3(Параметры); + ИначеЕсли ОписаниеМодуля.Номер = 4 Тогда + ТекущийМодуль.ПриНачалеРаботыСистемы4(Параметры); + КонецЕсли; + КонецЕсли; + Исключение + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + КонецЦикла; КонецПроцедуры @@ -1290,30 +1296,32 @@ // Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. Процедура ДействияПриНачалеРаботыСистемыВМодуляхПереопределяемойПроцедуры(Неопределен, Контекст) Экспорт - Параметры = ПараметрыОбработкиПриНачалеРаботыСистемы(); - - Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда - ДействияПриНачалеРаботыСистемыПослеВсехПроцедур(Неопределено, Неопределено); - Возврат; - КонецЕсли; - - ТекущийМодуль = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; - Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; - - Попытка - ТекущийМодуль.ПриНачалеРаботыСистемы(Параметры); - Исключение - ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); - КонецПопытки; - Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда - Возврат; - КонецЕсли; - - ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + Пока Истина Цикл + + Параметры = ПараметрыОбработкиПриНачалеРаботыСистемы(); + + Если Не ПродолжитьДействияПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Если Параметры.ИндексТекущегоМодуля >= Параметры.ДобавленныеМодули.Количество() Тогда + ДействияПриНачалеРаботыСистемыПослеВсехПроцедур(Неопределено, Неопределено); + Возврат; + КонецЕсли; + + ТекущийМодуль = Параметры.ДобавленныеМодули[Параметры.ИндексТекущегоМодуля]; + Параметры.ИндексТекущегоМодуля = Параметры.ИндексТекущегоМодуля + 1; + + Попытка + ТекущийМодуль.ПриНачалеРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриНачалеРаботыСистемы(Параметры, ИнформацияОбОшибке()); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + КонецЦикла; КонецПроцедуры @@ -2463,27 +2471,38 @@ Функция ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() - ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; + ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; // Структура - Если НЕ ПараметрыПриЗапускеПрограммы.Свойство("ПараметрыОбработки") Тогда + Если Не ПараметрыПриЗапускеПрограммы.Свойство("ПараметрыОбработки") Тогда Возврат Ложь; КонецЕсли; Параметры = ПараметрыПриЗапускеПрограммы.ПараметрыОбработки; - - Если Параметры.ИнтерактивнаяОбработка <> Неопределено Тогда - Параметры.НепрерывноеВыполнение = Ложь; - ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; - Параметры.ИнтерактивнаяОбработка = Неопределено; - ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); - ПараметрыПриЗапускеПрограммы.Удалить("ПараметрыОбработки"); - Возврат Истина; + Если Параметры.ИнтерактивнаяОбработка = Неопределено Тогда + Возврат Ложь; КонецЕсли; - Возврат Ложь; + ПодключитьОбработчикОжидания("ОбработчикОжиданияНачатьИнтерактивнуюОбработкуПередНачаломРаботыСистемы", 0.1, Истина); + Параметры.НепрерывноеВыполнение = Ложь; + + Возврат Истина; КонецФункции +Процедура НачатьИнтерактивнуюОбработкуПередНачаломРаботыСистемы() Экспорт + + ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; // Структура + + Параметры = ПараметрыПриЗапускеПрограммы.ПараметрыОбработки; + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + Параметры.ИнтерактивнаяОбработка = Неопределено; + + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + + ПараметрыПриЗапускеПрограммы.Удалить("ПараметрыОбработки"); + +КонецПроцедуры + Функция ИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы(Параметры) Если Параметры.ИнтерактивнаяОбработка = Неопределено Тогда @@ -2734,4 +2753,4 @@ Текст, БиблиотекаКартинок.Предупреждение32, СтатусОповещенияПользователя.Важное); КонецПроцедуры -#КонецОбласти \ No newline at end of file +#КонецОбласти diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl index d0c0ecaa5..e123cab8f 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl @@ -97,7 +97,8 @@ Если Не СтандартныеПодсистемыКлиент.ЗапускПрограммыЗавершен() Тогда ВызватьИсключение НСтр("ru = 'Ошибка порядка запуска программы. - |Перед получением параметров работы клиента запуск программы должен быть завершен.'"); + |Перед получением параметров работы клиента запуск программы должен быть завершен. + |Пока запуск не завершен следует использовать параметры работы клиента при запуске.'"); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl index 73f47c70b..d1b2fb01b 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl @@ -567,10 +567,10 @@ // ПолноеИмяОбъектаМетаданных - Строка - например, "Справочник.ВидыНоменклатуры", // Поддерживаются только таблицы // с предопределенными элементами: -// * Справочники, -// * Планы видов характеристик, -// * Планы счетов, -// * Планы видов расчета. +// > Справочники, +// > Планы видов характеристик, +// > Планы счетов, +// > Планы видов расчета. // // Возвращаемое значение: // ФиксированноеСоответствие из КлючИЗначение: diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl index b4e67bcff..0443d2e6f 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl @@ -684,10 +684,10 @@ // // Значение - Произвольный - значение, которое можно поместить в хранилище значения. // -// ЕстьИзменения - Булево - (возвращаемое значение). Устанавливается Истина, +// ЕстьИзменения - Булево - возвращаемое значение. Устанавливается Истина, // если старое и новое значения параметра не совпадают. // -// СтароеЗначение - Произвольный - (возвращаемое значение) до обновления. +// СтароеЗначение - Произвольный - возвращаемое значение. До обновления. // Процедура ОбновитьПараметрРаботыПрограммы(ИмяПараметра, Значение, ЕстьИзменения = Ложь, СтароеЗначение = Неопределено) Экспорт @@ -718,7 +718,8 @@ // Добавить изменения параметра работы программы при переходе на текущую версию метаданных конфигурации. // В дальнейшем изменения используются для условного добавления обязательных обработчиков обновления. // При начальном заполнении ИБ или неразделенных данных добавление изменений пропускается. -// +// +// Параметры: // ИмяПараметра - Строка - не более 128 символов. Например, // "СтандартныеПодсистемы.ВариантыОтчетов.ОтчетыСНастройками". // @@ -1786,6 +1787,22 @@ КонецФункции +// Параметры: +// Заголовки - Соответствие - см. в синтакс-помощнике описание параметра Заголовки объекта HTTPОтвет. +// +// Возвращаемое значение: +// Соответствие +// +Функция HTTPЗаголовкиВНижнийРегистр(Заголовки) Экспорт + + Результат = Новый Соответствие; + Для каждого Заголовок Из Заголовки Цикл + Результат.Вставить(НРег(Заголовок.Ключ), Заголовок.Значение); + КонецЦикла; + Возврат Результат; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/СтроковыеФункции/Module.bsl b/SSL/src/CommonModules/СтроковыеФункции/Module.bsl index 8e07510d8..d04a2a764 100644 --- a/SSL/src/CommonModules/СтроковыеФункции/Module.bsl +++ b/SSL/src/CommonModules/СтроковыеФункции/Module.bsl @@ -88,17 +88,8 @@ // Функция ПредставлениеПериодаВТексте(ДатаНачала, ДатаОкончания, ФорматнаяСтрока = "", СЗаглавнойБуквы = Ложь) Экспорт - Если ДатаНачала > ДатаОкончания Тогда - Возврат ""; - КонецЕсли; - - ПредставлениеПериода = НРег(ПредставлениеПериода(ДатаНачала, ДатаОкончания, ФорматнаяСтрока)); - - Если СЗаглавнойБуквы Тогда - ПредставлениеПериода = ВРег(Сред(ПредставлениеПериода, 1, 1)) + Сред(ПредставлениеПериода, 2); - КонецЕсли; - - Возврат ПредставлениеПериода; + Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредставлениеПериодаВТексте( + ДатаНачала, ДатаОкончания, ФорматнаяСтрока, СЗаглавнойБуквы); КонецФункции diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиент/Module.bsl b/SSL/src/CommonModules/СтроковыеФункцииКлиент/Module.bsl index d1800194c..a3aad4d57 100644 --- a/SSL/src/CommonModules/СтроковыеФункцииКлиент/Module.bsl +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиент/Module.bsl @@ -69,5 +69,29 @@ КонецФункции +// Возвращает представление периода в нижнем регистре или с заглавной буквы, +// если с него начинается фраза (предложение). +// Например, если требуется вывести представление периода в заголовке отчета +// в формате "Продажи за [ДатаНачала] - [ДатаОкончания]", то ожидается, что +// результат будет выглядеть так: "Продажи за февраль 2020 г. - март 2020 г.". +// Т.е. - строчно, т.к. "февраль 2020 г. - март 2020 г." не является началом предложения. +// +// Параметры: +// ДатаНачала - Дата - начало периода. +// ДатаОкончания - Дата - конец периода. +// ФорматнаяСтрока - Строка - определяет способ форматирования периода. +// СЗаглавнойБуквы - Булево - Истина, если с представления периода начинается предложение. +// По умолчанию - Ложь. +// +// Возвращаемое значение: +// Строка - представление периода в требуемом формате и регистре. +// +Функция ПредставлениеПериодаВТексте(ДатаНачала, ДатаОкончания, ФорматнаяСтрока = "", СЗаглавнойБуквы = Ложь) Экспорт + + Возврат ОбщегоНазначенияСлужебныйКлиентСервер.ПредставлениеПериодаВТексте( + ДатаНачала, ДатаОкончания, ФорматнаяСтрока, СЗаглавнойБуквы); + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl index bf73b11f0..e61e224bc 100644 --- a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -17,9 +17,9 @@ // Разделитель - Строка - разделитель строк текста, минимум 1 символ. // ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. // Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: -// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки +// > для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки // включаются в результат; -// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в +// > если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в // случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а // при других разделителях результатом функции будет пустой массив. // СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок. @@ -178,7 +178,15 @@ // Параметры: // ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", // например "%1 пошел в %2"); -// Параметр - Строка - значение подставляемого параметра. +// Параметр1 - Строка - значение подставляемого параметра. +// Параметр2 - Строка +// Параметр3 - Строка +// Параметр4 - Строка +// Параметр5 - Строка +// Параметр6 - Строка +// Параметр7 - Строка +// Параметр8 - Строка +// Параметр9 - Строка // // Возвращаемое значение: // Строка - текстовая строка с подставленными параметрами. @@ -379,7 +387,7 @@ // // Возвращаемое значение: // Булево - Истина, если строка содержит только латинские (или допустимые) символы; -// - Ложь, если строка содержит иные символы. +// Ложь, если строка содержит иные символы. // Функция ТолькоЛатиницаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт @@ -1031,10 +1039,10 @@ // Параметры: // Шаблон - Строка - строка, содержит перечисленные через точку с запятой 6 форм строки // для каждой категории числительного: -// - %1 обозначает позицию числа; +// %1 обозначает позицию числа; // Число - Число - число, которое будет подставлено в строку вместо параметра "%1". // Вид - ВидЧисловогоЗначения - определяет вид числового значения, для которого формируется представление. -// - количественное (по умолчанию) или Порядковое. +// Количественное (по умолчанию) или Порядковое. // ФорматнаяСтрока - Строка - строка параметров форматирования. См. аналогичный параметр в СтрокаСЧислом. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl index 6986cc7c1..edd81f259 100644 --- a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl @@ -112,14 +112,15 @@ // Получает представление документа для печати. // // Параметры: -// Выборка - КоллекцияДанных - структура или выборка из результатов запроса -// в которой содержатся дополнительные реквизиты, на основании -// которых можно сформировать переопределенное представление -// документа для вывода в отчет "Структура подчиненности". +// Выборка - ВыборкаИзРезультатаЗапроса - структура или выборка из результатов запроса +// в которой содержатся дополнительные реквизиты, на основании +// которых можно сформировать переопределенное представление +// документа для вывода в отчет "Структура подчиненности". // // Возвращаемое значение: -// Строка,Неопределено - переопределенное представление документа, или Неопределено, -// если для данного типа документов такое не задано. +// - Строка +// - Неопределено - переопределенное представление документа, или Неопределено, +// если для данного типа документов такое не задано. // Функция ПредставлениеОбъектаДляВыводаВОтчет(Выборка) Экспорт diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl index 1cdd263ae..6134f3082 100644 --- a/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl @@ -23,6 +23,10 @@ КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту +// +// Параметры: +// ВидыПодключаемыхКоманд - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд.ВидыПодключаемыхКоманд +// Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт Вид = ВидыПодключаемыхКоманд.Добавить(); diff --git a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl index 2a51daf6b..d14258658 100644 --- a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl @@ -24,12 +24,12 @@ //КонецПроцедуры // // Параметры: -// Обработчики - Массив - модули менеджеров или общие модули, +// ТекущиеДела - Массив - модули менеджеров или общие модули, // например: Документы.ЗаказПокупателя, ТекущиеДелаПоПродажам. // Пример: -// Обработчики.Добавить(Документы.ЗаказПокупателя); +// ТекущиеДела.Добавить(Документы.ЗаказПокупателя); // -Процедура ПриОпределенииОбработчиковТекущихДел(Обработчики) Экспорт +Процедура ПриОпределенииОбработчиковТекущихДел(ТекущиеДела) Экспорт diff --git a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl index 4192d5507..87159e92f 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl @@ -286,7 +286,8 @@ ОтключенныеОбъекты.Вставить(Дело.ОбъектВладелецДел, Новый Массив); ОтключенныеОбъекты[Дело.ОбъектВладелецДел].Добавить(Дело.Идентификатор); Иначе - ОтключенныеОбъекты[Дело.ОбъектВладелецДел].Добавить(Дело.Идентификатор); + ОтключенныеДела = ОтключенныеОбъекты[Дело.ОбъектВладелецДел]; // Массив. + ОтключенныеДела.Добавить(Дело.Идентификатор); КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl index 9174b7b44..f14ea64cc 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl @@ -114,8 +114,8 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма с динамическим списком -// НастройкиОтображенияПомеченныхОбъектов - ТаблицаФормы - элемент формы динамического списка. -// - см. НастройкиОтображенияПомеченныхОбъектов +// НастройкиОтображенияПомеченныхОбъектов - см. НастройкиОтображенияПомеченныхОбъектов +// - ТаблицаФормы - элемент формы динамического списка. // // Пример: // // Для настройки одного списка diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl index 5ab9724cd..7236e6642 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl @@ -22,9 +22,9 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.УдалениеПомеченных; Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьУдалениеПомеченныхОбъектов; Зависимость.ВключатьПриВключенииФункциональнойОпции = Ложь; @@ -182,7 +182,6 @@ // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Типы.Добавить(Метаданные.РегистрыСведений.НеудаленныеОбъекты); Типы.Добавить(Метаданные.РегистрыСведений.УдаляемыеОбъекты); Типы.Добавить(Метаданные.Константы.ПроверятьИспользованиеУдаляемыхОбъектов); @@ -1448,6 +1447,11 @@ МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); ЭтоТехническийОбъект = МодульРаботаСФайламиСлужебный.ЭтоТехническийОбъект(ПолноеИмяОбъекта); КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + ЭтоТехническийОбъект = МодульОбменДаннымиСервер.ЭтоТехническийОбъект(ПолноеИмяОбъекта); + КонецЕсли; Возврат ЭтоТехническийОбъект Или ПолноеИмяОбъекта = ВРег("Справочник.ИдентификаторыОбъектовМетаданных") Или ПолноеИмяОбъекта = ВРег("Справочник.ИдентификаторыОбъектовРасширений") Или ПолноеИмяОбъекта = ВРег( diff --git a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl index 578d88b32..a3bcab76a 100644 --- a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl @@ -664,10 +664,7 @@ // - БизнесПроцессОбъект // - ЗадачаОбъект // - ПланОбменаОбъект - проверяемый объект. -// - РегистрСведенийМенеджерЗаписи -// - РегистрНакопленияМенеджерЗаписи -// - РегистрБухгалтерииМенеджерЗаписи -// - РегистрРасчетаМенеджерЗаписи - менеджер проверяемой записи. +// - РегистрСведенийМенеджерЗаписи - менеджер проверяемой записи. // - РегистрСведенийНаборЗаписей // - РегистрНакопленияНаборЗаписей // - РегистрБухгалтерииНаборЗаписей @@ -698,10 +695,7 @@ // - БизнесПроцессОбъект // - ЗадачаОбъект // - ПланОбменаОбъект - проверяемый объект. -// - РегистрСведенийМенеджерЗаписи -// - РегистрНакопленияМенеджерЗаписи -// - РегистрБухгалтерииМенеджерЗаписи -// - РегистрРасчетаМенеджерЗаписи - менеджер проверяемой записи. +// - РегистрСведенийМенеджерЗаписи - менеджер проверяемой записи. // // ПараметрыЗаписи - Структура - стандартный параметр, передаваемый в обработчик события. // @@ -1001,7 +995,7 @@ | ГДЕ | ТаблицыГруппДоступа.Таблица = &ИдентификаторЗначенийДоступа | И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка - | И ТаблицыГруппДоступа.Изменение = ИСТИНА) + | И ТаблицыГруппДоступа.ПравоИзменение = ИСТИНА) | И ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА @@ -1543,56 +1537,6 @@ КонецПроцедуры -// Обработчик подписок ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей* на событие ПередЗаписью -// вызывает заполнение значений доступа табличной части объекта НаборыЗначенийДоступа, -// когда для ограничения доступа к самому объекту используется шаблон #ПоНаборамЗначений. -// Возможен случай использования подсистемы Управление доступом, когда -// указанной подписки не существует, если для указанной цели наборы не применяются. -// -// Параметры: -// Источник - СправочникОбъект -// - ДокументОбъект -// - ПланВидовХарактеристикОбъект -// - ПланСчетовОбъект -// - ПланВидовРасчетаОбъект -// - БизнесПроцессОбъект -// - ЗадачаОбъект -// - ПланОбменаОбъект - объект данных, передаваемый в подписку на событие ПередЗаписью. -// -// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. -// -// РежимЗаписи - Булево - параметр, передаваемый в подписку на событие ПередЗаписью, -// когда тип параметра Источник - ДокументОбъект. -// -// РежимПроведения - Булево - параметр, передаваемый в подписку на событие ПередЗаписью, -// когда тип параметра Источник - ДокументОбъект. -// -Процедура ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Источник, Отказ = Неопределено, РежимЗаписи = Неопределено, РежимПроведения = Неопределено) Экспорт - - // Проверка ОбменДанными.Загрузка пропускается только в тех случаях, - // когда дополнительно установлено свойство ЗаписатьНаборыЗначенийДоступа. - // В этом случае при записи ведущего объекта для корректной работы его RLS выполняется программная - // запись подчиненного объекта для обновления служебной табличной части НаборыЗначенийДоступа. - Если Источник.ОбменДанными.Загрузка - И НЕ Источник.ДополнительныеСвойства.Свойство("ЗаписатьНаборыЗначенийДоступа") Тогда - Возврат; - КонецЕсли; - - Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда - Возврат; - КонецЕсли; - - Если НЕ ( ПривилегированныйРежим() - И Источник.ДополнительныеСвойства.Свойство( - "НаборыЗначенийДоступаТабличнойЧастиЗаполнены")) Тогда - - Таблица = УправлениеДоступомСлужебный.ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Источник); - УправлениеДоступомСлужебный.ПодготовитьНаборыЗначенийДоступаКЗаписи(Неопределено, Таблица, Ложь); - Источник.НаборыЗначенийДоступа.Загрузить(Таблица); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции, используемые в переопределяемом модуле. @@ -1600,8 +1544,9 @@ // // Возвращаемое значение: // Структура: -// * Имя - Строка - ИмяПредопределенныхДанных - используется для привязки -// поставляемых данных к предопределенному элементу. +// * Имя - Строка - может использоваться в программном интерфейсе, +// например, в процедуре ВключитьПрофильПользователю. +// * Родитель - Строка - имя папки профилей, в которую входит профиль. // * Идентификатор - Строка - строка уникального идентификатора поставляемого // профиля, которая используется для поиска в базе данных. // Чтобы получить идентификатор, нужно создать профиль в режиме 1С:Предприятие и @@ -1674,6 +1619,7 @@ НовоеОписание = Новый Структура; НовоеОписание.Вставить("Имя", ""); + НовоеОписание.Вставить("Родитель", ""); НовоеОписание.Вставить("Идентификатор", ""); НовоеОписание.Вставить("Наименование", ""); НовоеОписание.Вставить("Описание", ""); @@ -1686,6 +1632,40 @@ КонецФункции +// Возвращает структуру для удобства описания поставляемых папок профилей (групп элементов). +// +// Возвращаемое значение: +// Структура: +// * Имя - Строка - используется в поле Родитель для профиля и папки профилей. +// * Родитель - Строка - имя другой папки профилей, в которую входит эта папка. +// * Идентификатор - Строка - строка уникального идентификатора поставляемой папки +// профиля, которая используется для поиска в базе данных. +// Чтобы получить идентификатор, нужно создать папку профилей в режиме 1С:Предприятие и +// получить уникальный идентификатор ссылки. Не следует указывать идентификаторы, +// полученные произвольным способом, т.к. это может нарушить уникальность ссылок. +// * Наименование - Строка - наименование поставляемой папки профилей. +// +// Пример: +// // Папка профилей "Дополнительные профили". +// ОписаниеПапки = УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа(); +// ОписаниеПапки.Имя = "ДополнительныеПрофили"; +// ОписаниеПапки.Идентификатор = ""; +// ОписаниеПапки.Наименование = НСтр("ru = 'Дополнительные профили'", ОбщегоНазначения.КодОсновногоЯзыка()); +// // ... +// ОписанияПрофилей.Добавить(ОписаниеПрофиля); +// +Функция НовоеОписаниеПапкиПрофилейГруппДоступа() Экспорт + + НовоеОписание = Новый Структура; + НовоеОписание.Вставить("Имя", ""); + НовоеОписание.Вставить("Родитель", ""); + НовоеОписание.Вставить("Идентификатор", ""); + НовоеОписание.Вставить("Наименование", ""); + + Возврат НовоеОписание; + +КонецФункции + // Добавляет дополнительные типы в процедуре ПриЗаполненииВидовДоступа // общего модуля УправлениеДоступомПереопределяемый. // @@ -1775,35 +1755,45 @@ ДеревоПрофилей = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + Для Каждого СтрокаПрофиля Из ДеревоПрофилей.Строки Цикл + ЭлементБлокировки.УстановитьЗначение("Ссылка", СтрокаПрофиля.Профиль); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ПрофильОбъект = СтрокаПрофиля.Профиль.ПолучитьОбъект(); + РолиПрофиля = ПрофильОбъект.Роли; - ПрофильОбъект = СтрокаПрофиля.Профиль.ПолучитьОбъект(); - РолиПрофиля = ПрофильОбъект.Роли; - - Для Каждого СтрокаРоли Из СтрокаПрофиля.Строки Цикл - - // Удаление заменяемой роли из профиля. - Отбор = Новый Структура("Роль", СтрокаРоли.Роль); - НайденныеСтроки = РолиПрофиля.НайтиСтроки(Отбор); - Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл - РолиПрофиля.Удалить(НайденнаяСтрока); + Для Каждого СтрокаРоли Из СтрокаПрофиля.Строки Цикл + + // Удаление заменяемой роли из профиля. + Отбор = Новый Структура("Роль", СтрокаРоли.Роль); + НайденныеСтроки = РолиПрофиля.НайтиСтроки(Отбор); + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + РолиПрофиля.Удалить(НайденнаяСтрока); + КонецЦикла; + + // Добавление новых ролей в профиль вместо заменяемой роли. + ДобавляемыеРоли = ЗаменяемыеСсылкиРолей.Получить(СтрокаРоли.Роль); + + Для Каждого ДобавляемаяРоль Из ДобавляемыеРоли Цикл + Отбор = Новый Структура; + Отбор.Вставить("Роль", ДобавляемаяРоль); + Если РолиПрофиля.НайтиСтроки(Отбор).Количество() = 0 Тогда + НоваяСтрока = РолиПрофиля.Добавить(); + НоваяСтрока.Роль = ДобавляемаяРоль; + КонецЕсли; + КонецЦикла; КонецЦикла; - // Добавление новых ролей в профиль вместо заменяемой роли. - ДобавляемыеРоли = ЗаменяемыеСсылкиРолей.Получить(СтрокаРоли.Роль); - - Для Каждого ДобавляемаяРоль Из ДобавляемыеРоли Цикл - Отбор = Новый Структура; - Отбор.Вставить("Роль", ДобавляемаяРоль); - Если РолиПрофиля.НайтиСтроки(Отбор).Количество() = 0 Тогда - НоваяСтрока = РолиПрофиля.Добавить(); - НоваяСтрока.Роль = ДобавляемаяРоль; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПрофильОбъект); - + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПрофильОбъект); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; Справочники.ПрофилиГруппДоступа.ОбновитьВспомогательныеДанныеПрофилей( @@ -1811,15 +1801,16 @@ КонецПроцедуры -// Возвращает ссылку на поставляемый профиль по идентификатору. +// Возвращает ссылку на поставляемый профиль или папку профилей по идентификатору. // // Параметры: -// Идентификатор - Строка - имя или уникальный идентификатор поставляемого профиля, как указано -// в процедуре ПриЗаполненииВидовДоступа общего модуля УправлениеДоступомПереопределяемый. +// Идентификатор - Строка - имя или уникальный идентификатор поставляемого профиля или папки профилей, +// как указано в процедуре ПриЗаполненииПоставляемыхПрофилейГруппДоступа +// общего модуля УправлениеДоступомПереопределяемый. // // Возвращаемое значение: -// СправочникСсылка.ПрофилиГруппДоступа - если поставляемый профиль найден в справочнике. -// Неопределено - если поставляемый профиль не существует в справочнике. +// СправочникСсылка.ПрофилиГруппДоступа - если поставляемый профиль или папка профилей найдена в справочнике. +// Неопределено - если поставляемый профиль или папка профилей не существует в справочнике. // Функция ПоставляемыйПрофильПоИдентификатору(Идентификатор) Экспорт @@ -1827,6 +1818,28 @@ КонецФункции +// Возвращает ссылку на стандартный поставляемый профиль Администратор. +// +// Возвращаемое значение: +// СправочникСсылка.ПрофилиГруппДоступа +// +Функция ПрофильАдминистратор() Экспорт + + Возврат Справочники.ПрофилиГруппДоступа.ПрофильАдминистратор(); + +КонецФункции + +// Возвращает ссылку на стандартную поставляемую группу доступа Администраторы. +// +// Возвращаемое значение: +// СправочникСсылка.ГруппыДоступа +// +Функция ГруппаДоступаАдминистраторы() Экспорт + + Возврат Справочники.ГруппыДоступа.ГруппаДоступаАдминистраторы(); + +КонецФункции + // Возвращает пустую таблицу для заполнения и // передачи в процедуру ЗаменитьПраваВНастройкахПравОбъектов. // @@ -2060,10 +2073,7 @@ // Процедура ОбновитьРазрешенныеЗначенияПриИзмененииИспользованияВидовДоступа() Экспорт - РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра(); - - УправлениеДоступомСлужебный.ЗапланироватьОбновлениеПараметровОграниченияДоступа( - "ОбновитьРазрешенныеЗначенияПриИзмененииИспользованияВидовДоступа"); + РегистрыСведений.ИспользуемыеВидыДоступа.ОбновитьДанныеРегистра(); КонецПроцедуры @@ -2085,8 +2095,8 @@ // Возможно вызывать программно, например при обновлении информационной базы. // // Параметры: -// КоличествоДанных - Число - (возвращаемое значение) содержит количество -// объектов данных, для которых было выполнено заполнение. +// КоличествоДанных - Число - возвращаемое значение. Количество объектов данных, +// для которых было выполнено заполнение. // Процедура ЗаполнениеДанныхДляОграниченияДоступа(КоличествоДанных = 0) Экспорт @@ -2210,6 +2220,27 @@ КонецЕсли; КонецЕсли; + Если Не Стандартное И Не Полное Тогда + Если ОтключениеОбновления.ВложенныеОтключения.Количество() > 0 Тогда + ВложенныеОтключения = Новый Массив(ОтключениеОбновления.ВложенныеОтключения); + Стандартное = ВложенныеОтключения[0].Стандартное; + Полное = ВложенныеОтключения[0].Полное; + ВложенныеОтключения.Удалить(0); + ОтключениеОбновления.ВложенныеОтключения = Новый ФиксированныйМассив(ВложенныеОтключения); + КонецЕсли; + ИначеЕсли ОтключениеОбновления.Стандартное Или ОтключениеОбновления.Полное Тогда + Если ОтключениеОбновления.Полное Тогда + Стандартное = Ложь; + Полное = Истина; + КонецЕсли; + ВложенноеОтключение = Новый Структура; + ВложенноеОтключение.Вставить("Стандартное", ОтключениеОбновления.Стандартное); + ВложенноеОтключение.Вставить("Полное", ОтключениеОбновления.Полное); + ВложенныеОтключения = Новый Массив(ОтключениеОбновления.ВложенныеОтключения); + ВложенныеОтключения.Добавить(Новый ФиксированнаяСтруктура(ВложенноеОтключение)); + ОтключениеОбновления.ВложенныеОтключения = Новый ФиксированныйМассив(ВложенныеОтключения); + КонецЕсли; + ОтключениеОбновления.Стандартное = Стандартное; ОтключениеОбновления.Полное = Полное; @@ -3059,7 +3090,7 @@ ТекущийПрофиль = Профиль; Иначе ТекущийПрофиль = Справочники.ПрофилиГруппДоступа.ПоставляемыйПрофильПоИдентификатору( - Профиль, Истина); + Профиль, Истина, Истина); КонецЕсли; Если ТекущийПрофиль <> Неопределено Тогда @@ -3076,8 +3107,10 @@ |ГДЕ | &УсловиеОтбора"; Запрос.УстановитьПараметр("Пользователь", Пользователь); - Если ТекущийПрофиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда - УсловиеОтбора = "ГруппыДоступа.Ссылка = Значение(Справочник.ГруппыДоступа.Администраторы)"; + Если ТекущийПрофиль = ПрофильАдминистратор() Тогда + УсловиеОтбора = "ГруппыДоступа.Ссылка = &ГруппаДоступаАдминистраторы"; + Запрос.УстановитьПараметр("ГруппаДоступаАдминистраторы", + ГруппаДоступаАдминистраторы()); Иначе УсловиеОтбора = "ГруппыДоступа.Пользователь = &Пользователь"; Если Включить Или ТекущийПрофиль <> Неопределено Тогда @@ -3116,7 +3149,7 @@ ГруппаДоступаОбъект = Неопределено; КонецЕсли; - Если ПерсональнаяГруппаДоступа = Справочники.ГруппыДоступа.Администраторы Тогда + Если ПерсональнаяГруппаДоступа = ГруппаДоступаАдминистраторы() Тогда ОписаниеПользователя = ГруппаДоступаОбъект.Пользователи.Найти( Пользователь, "Пользователь"); diff --git a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl index 71a05b284..10d058951 100644 --- a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl @@ -106,6 +106,22 @@ // ОписаниеПрофиля.Роли.Добавить("ПросмотрОтчетаКнигаПокупок"); // ОписанияПрофилей.Добавить(ОписаниеПрофиля); // +// ОписаниеПапки = УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа(); +// ОписаниеПапки.Имя = "ДополнительныеПрофили"; +// ОписаниеПапки.Идентификатор = "69a066e7-ce81-11eb-881c-b06ebfbf08c7"; +// ОписаниеПапки.Наименование = НСтр("ru = 'Дополнительные профили'", ОбщегоНазначения.КодОсновногоЯзыка()); +// ОписанияПрофилей.Добавить(ОписаниеПапки); +// +// ОписаниеПрофиля = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(); +// ОписаниеПрофиля.Родитель = "ДополнительныеПрофили"; +// ОписаниеПрофиля.Идентификатор = "70179f20-2315-11e6-9bff-d850e648b60c"; +// ОписаниеПрофиля.Наименование = НСтр("ru = 'Редактирование, отправка по почте, сохранение в файл печатных форм (дополнительно)'", +// ОбщегоНазначения.КодОсновногоЯзыка()); +// ОписаниеПрофиля.Описание = НСтр("ru = 'Дополнительно назначается пользователям, которым должна быть доступна возможность редактирования, +// |перед печатью, отправка по почте и сохранение в файл сформированных печатных форм.'"); +// ОписаниеПрофиля.Роли.Добавить("РедактированиеПечатныхФорм"); +// ОписанияПрофилей.Добавить(ОписаниеПрофиля); +// Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl index c54046ef1..92a0f2934 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl @@ -587,7 +587,7 @@ Функция ОшибкиОграниченийДоступа() Экспорт Ошибки = Новый Массив; - ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(Истина, Ложь); + ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(, Истина, Ложь); Попытка СпискиСОграничением = УправлениеДоступомСлужебныйПовтИсп.СпискиСОграничением(); @@ -635,10 +635,17 @@ // Возвращаемое значение: // Структура: // * ОграниченияВРолях - Структура: -// ** ДляПользователей - Соответствие - со свойствами, как для внешних пользователей (ниже). -// ** ДляВнешнихПользователей - Соответствие из КлючИЗначение: +// ** ДляПользователей - Соответствие из КлючИЗначение: // *** Ключ - Строка - полное имя объекта метаданных (списка). Имя коллекции на английском. -// В форме объекта должна вставка ПриЧтенииНаСервере. +// В форме объекта должна вставка ПриЧтенииНаСервере. +// *** Значение - Структура: +// **** ШаблонДляОбъекта - Булево - если Истина, тогда используется шаблон #ДляОбъекта, +// если Ложь, тогда используется шаблон #ДляРегистра. +// **** Параметры - Массив из Строка - параметры шаблона (для объекта 1, для регистра 6). +// Например, имя поля "Владелец" или опорного поля регистра "Организация". +// ** ДляВнешнихПользователей - Соответствие из КлючИЗначение - как для пользователей выше: +// *** Ключ - Строка - полное имя объекта метаданных (списка). Имя коллекции на английском. +// В форме объекта должна вставка ПриЧтенииНаСервере. // *** Значение - Структура: // **** ШаблонДляОбъекта - Булево - если Истина, тогда используется шаблон #ДляОбъекта, // если Ложь, тогда используется шаблон #ДляРегистра. @@ -652,14 +659,14 @@ // ** Значение - Строка - полное имя соответствующего объекта метаданных. // // * ВладельцыЗначенийКлючейДоступа - Структура - для группы определяемых типов: -// ** Ссылки - Массив - полные имена типов ссылки (имя коллекции на английском). -// ** Документы - Массив - полные имена типов объекта (имя коллекции на английском). -// ** Объекты - Массив - то же, что в предыдущем пункте. -// ** НаборыЗаписей - Массив - то же, что в предыдущем пункте. -// ** НаборыЗаписейРегистраРасчета - Массив - то же, что в предыдущем пункте. +// ** Ссылки - Массив из Строка - полные имена типов ссылки (имя коллекции на английском). +// ** Документы - Массив из Строка - полные имена типов объекта (имя коллекции на английском). +// ** Объекты - Массив из Строка - то же, что в предыдущем пункте. +// ** НаборыЗаписей - Массив из Строка - то же, что в предыдущем пункте. +// ** НаборыЗаписейРегистраРасчета - Массив из Строка - то же, что в предыдущем пункте. // -// * ЗначенияДоступа - Массив - полные имена типов ссылки (имя коллекции на английском). -// Для дополнения определяемого типа ЗначениеДоступа. +// * ЗначенияДоступа - Массив из Строка - полные имена типов ссылки (имя коллекции на английском). +// Для дополнения определяемого типа ЗначениеДоступа. // // * ТипыИзмеренийРегистровКлючей - Соответствие из КлючИЗначение: // Для измерений с именем Поле регистра КлючиДоступаКРегистрам и регистров КлючиДоступаКРегистру<*>: @@ -676,7 +683,7 @@ // *** ПоляРегистровПоТипам - Соответствие из КлючИЗначение: // **** Ключ - Строка - полное имя типа (на английском). // **** Значение - Массив из Строка - полные имена полей, например, -// "РегистрСведений.ДополнительныеСведения.Свойство". +// "РегистрСведений.ДополнительныеСведения.Свойство". // Функция НастройкиВнедрения(ДействующиеПараметры = Неопределено) Экспорт @@ -705,7 +712,7 @@ КонецЦикла; Если ДействующиеПараметры = Неопределено Тогда - ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(Истина); + ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(, Истина); НовыеХранимыеПараметры = ХранимыеПараметрыОграниченияДоступа(ОбщийКонтекст); ДействующиеПараметры = Новый Структура(НовыеХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав.Получить()); КонецЕсли; @@ -883,8 +890,6 @@ ИдентификаторыСписковКлючей = Новый Массив; Если Списки = Неопределено Тогда - ОчиститьКэшЗначенийГруппДоступаДляРасчетаПрав(); - Если ПараметрыПланирования.ВерсииОграниченийСписков = Неопределено Тогда ДействующиеПараметры = ДействующиеПараметрыОграниченияДоступа(Неопределено, Неопределено, Ложь); ВерсииОграниченийСписков = Новый Соответствие(ДействующиеПараметры.ВерсииОграниченийСписков); @@ -1012,7 +1017,8 @@ Иначе ВедущийОбъект = ПараметрыПланирования.ВедущийОбъект; // См. ОписаниеВедущегоОбъекта Если ВедущийОбъект <> Неопределено - И Не ( ВедущийОбъект.Свойство("ПоКлючамДоступа") + И Не ( ВедущийОбъект.Свойство("ПоДаннымКэшаРасчетаПрав") + Или ВедущийОбъект.Свойство("ПоКлючамДоступа") Или ВедущийОбъект.Свойство("ПоЗначениямСГруппами") Или ВедущийОбъект.Свойство("ПоЗначениямПолей") И ТипЗнч(ВедущийОбъект.ПоЗначениямПолей.СоставИзменений) = Тип("ТаблицаЗначений") ) Тогда @@ -1385,7 +1391,7 @@ // Обновляет описание свойств видов доступа в параметрах работы программы. // // Параметры: -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // Процедура ОбновитьОписаниеСвойствВидовДоступа(ЕстьИзменения = Ложь) Экспорт @@ -1509,7 +1515,6 @@ // Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт - Объекты.Добавить(Метаданные.Справочники.ПрофилиГруппДоступа); Объекты.Добавить(Метаданные.Справочники.ГруппыДоступа); КонецПроцедуры @@ -1521,6 +1526,7 @@ ОбновитьВспомогательныеДанныеЭлементовИзмененныхПриЗагрузке(); Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + РегистрыСведений.ИспользуемыеВидыДоступа.ОбновитьДанныеРегистра(); УстановитьОбновлениеДоступа(Истина, Истина); КонецЕсли; @@ -1622,11 +1628,24 @@ | И ПрофилиГруппДоступа.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных"; Выборка = Запрос.Выполнить().Выбрать(); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + Пока Выборка.Следующий() Цикл - ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ТекущийОбъект.ИмяПредопределенныхДанных = ""; - ТекущийОбъект.ИдентификаторПоставляемыхДанных = ""; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ТекущийОбъект); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ТекущийОбъект.ИмяПредопределенныхДанных = ""; + ТекущийОбъект.ИдентификаторПоставляемыхДанных = ""; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ТекущийОбъект); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; ИначеЕсли ТипЗнч(Объект) = Тип("СправочникОбъект.ГруппыДоступа") @@ -1668,10 +1687,23 @@ | И ГруппыДоступа.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных"; Выборка = Запрос.Выполнить().Выбрать(); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + Пока Выборка.Следующий() Цикл - ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ТекущийОбъект.ИмяПредопределенныхДанных = ""; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ТекущийОбъект); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ТекущийОбъект.ИмяПредопределенныхДанных = ""; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ТекущийОбъект); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; КонецЕсли; @@ -1790,7 +1822,8 @@ Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ГруппыЗначенийДоступа") Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа") Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаследованиеНастроекПравОбъектов") - Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НастройкиПравОбъектов") Тогда + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НастройкиПравОбъектов") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ИспользуемыеВидыДоступа") Тогда // Получение данных из автономного рабочего места пропускается, а для соответствия // данных в узлах, текущие данные отправляются обратно в автономное рабочее место. @@ -1883,13 +1916,15 @@ Запрос = Новый Запрос; Запрос.УстановитьПараметр("Пользователь", Администратор); + Запрос.УстановитьПараметр("ГруппаДоступаАдминистраторы", + УправлениеДоступом.ГруппаДоступаАдминистраторы()); Запрос.Текст = "ВЫБРАТЬ | ИСТИНА КАК ЗначениеИстина |ИЗ | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи |ГДЕ - | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) + | ГруппыДоступаПользователи.Ссылка = &ГруппаДоступаАдминистраторы | И ГруппыДоступаПользователи.Пользователь = &Пользователь"; Если Не Запрос.Выполнить().Пустой() Тогда @@ -1902,10 +1937,16 @@ Администратор, Уточнение); - Объект = Справочники.ГруппыДоступа.Администраторы.ПолучитьОбъект(); + ГруппаДоступаАдминистраторы = УправлениеДоступом.ГруппаДоступаАдминистраторы(); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ГруппаДоступаАдминистраторы); НачатьТранзакцию(); Попытка + Блокировка.Заблокировать(); + Объект = ГруппаДоступаАдминистраторы.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, Объект.ВерсияДанных); Если Объект.Пользователи.Найти(Администратор, "Пользователь") = Неопределено Тогда Объект.Пользователи.Добавить().Пользователь = Администратор; @@ -2066,9 +2107,9 @@ КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов. -Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка) Экспорт +Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт - Отчеты["АнализПравДоступа"].ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка); + Отчеты.АнализПравДоступа.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка); КонецПроцедуры @@ -2442,9 +2483,10 @@ Если ИмяПараметра = "ОтключениеОбновленияКлючейДоступа" Тогда Свойства = Новый Структура; - Свойства.Вставить("Стандартное", Ложь); - Свойства.Вставить("Полное", Ложь); - Свойства.Вставить("ИзмененныеСписки", Новый ХранилищеЗначения(Новый Соответствие)); + Свойства.Вставить("Стандартное", Ложь); + Свойства.Вставить("Полное", Ложь); + Свойства.Вставить("ВложенныеОтключения", Новый ФиксированныйМассив(Новый Массив)); + Свойства.Вставить("ИзмененныеСписки", Новый ХранилищеЗначения(Новый Соответствие)); ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа = Новый ФиксированнаяСтруктура(Свойства); УстановленныеПараметры.Добавить("ОтключениеОбновленияКлючейДоступа"); Возврат; @@ -2712,7 +2754,7 @@ // // ПарольПользователяСервиса - Строка - пароль для авторизации в менеджере сервиса. // -// ЕстьИзменения - Булево - (возвращаемое значение) - в этот параметр возвращается +// ЕстьИзменения - Булево - возвращаемое значение. В этот параметр возвращается // значение Истина, если производилась запись, иначе не изменяется. // Процедура ОбновитьРолиПользователей(Знач ОписаниеПользователей = Неопределено, @@ -3195,6 +3237,56 @@ КонецПроцедуры +// Обработчик подписок ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей* на событие ПередЗаписью +// вызывает заполнение значений доступа табличной части объекта НаборыЗначенийДоступа, +// когда для ограничения доступа к самому объекту используется шаблон #ПоНаборамЗначений. +// Возможен случай использования подсистемы Управление доступом, когда +// указанной подписки не существует, если для указанной цели наборы не применяются. +// +// Параметры: +// Источник - СправочникОбъект +// - ДокументОбъект +// - ПланВидовХарактеристикОбъект +// - ПланСчетовОбъект +// - ПланВидовРасчетаОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланОбменаОбъект - объект данных, передаваемый в подписку на событие ПередЗаписью. +// +// Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. +// +// РежимЗаписи - Булево - параметр, передаваемый в подписку на событие ПередЗаписью, +// когда тип параметра Источник - ДокументОбъект. +// +// РежимПроведения - Булево - параметр, передаваемый в подписку на событие ПередЗаписью, +// когда тип параметра Источник - ДокументОбъект. +// +Процедура ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей(Источник, Отказ = Неопределено, РежимЗаписи = Неопределено, РежимПроведения = Неопределено) Экспорт + + // Проверка ОбменДанными.Загрузка пропускается только в тех случаях, + // когда дополнительно установлено свойство ЗаписатьНаборыЗначенийДоступа. + // В этом случае при записи ведущего объекта для корректной работы его RLS выполняется программная + // запись подчиненного объекта для обновления служебной табличной части НаборыЗначенийДоступа. + Если Источник.ОбменДанными.Загрузка + И НЕ Источник.ДополнительныеСвойства.Свойство("ЗаписатьНаборыЗначенийДоступа") Тогда + Возврат; + КонецЕсли; + + Если СтандартныеПодсистемыСервер.ЭтоИдентификаторОбъектаМетаданных(Источник) Тогда + Возврат; + КонецЕсли; + + Если НЕ ( ПривилегированныйРежим() + И Источник.ДополнительныеСвойства.Свойство( + "НаборыЗначенийДоступаТабличнойЧастиЗаполнены")) Тогда + + Таблица = ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Источник); + ПодготовитьНаборыЗначенийДоступаКЗаписи(Неопределено, Таблица, Ложь); + Источник.НаборыЗначенийДоступа.Загрузить(Таблица); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики регламентных заданий. @@ -3458,23 +3550,28 @@ Возврат Ложь; КонецЕсли; - Используется = Ложь; - СвойстваВидаДоступа = СвойстваВидаДоступа(ВидДоступа); Если СвойстваВидаДоступа = Неопределено Тогда - Возврат Используется; + Возврат Ложь; КонецЕсли; - Если СвойстваВидаДоступа.Имя = "ВнешниеПользователи" - Или СвойстваВидаДоступа.Имя = "Пользователи" Тогда - // Эти виды доступа не могут быть отключены по функциональным опциям. - Возврат Истина; - КонецЕсли; + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТипЗначенийДоступа", СвойстваВидаДоступа.Ссылка); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.ИспользуемыеВидыДоступа КАК ИспользуемыеВидыДоступа + |ГДЕ + | ИспользуемыеВидыДоступа.ТипЗначенийДоступа = &ТипЗначенийДоступа"; - Используется = Истина; + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); - ИнтеграцияПодсистемБСП.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); - УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); + Используется = Не Запрос.Выполнить().Пустой(); + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); Возврат Используется; @@ -3518,11 +3615,12 @@ // // Параметры: // Объект - ОпределяемыйТип.ВладелецСОграничениемПоНаборамЗначенийДоступаОбъект +// - ОпределяемыйТип.ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент // // Возвращаемое значение: // см. УправлениеДоступом.ТаблицаНаборыЗначенийДоступа // -Функция ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Объект) Экспорт +Функция ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Объект) ТипЗначенияОбъект = ТипЗнч(Объект); @@ -3691,8 +3789,9 @@ УстановитьПривилегированныйРежим(Истина); + РегистрыСведений.ИспользуемыеВидыДоступа.ОбновитьДанныеРегистра(); + Если ОграничениеДоступаНаУровнеЗаписейВключено Тогда - ЗаписьЖурналаРегистрации( НСтр("ru = 'Управление доступом.Заполнение данных для ограничения доступа'", ОбщегоНазначения.КодОсновногоЯзыка()), @@ -3705,9 +3804,20 @@ УстановитьЗаполнениеДанныхДляОграниченияДоступа(Истина); КонецЕсли; - ОбновитьПараметрыСеанса(); + Если ОграничиватьДоступНаУровнеЗаписейУниверсально(Истина) Тогда + + ЗапланироватьОбновлениеПараметровОграниченияДоступа( + "ПриИзмененииОграниченияДоступаНаУровнеЗаписей"); + + ПараметрыПланирования = ПараметрыПланированияОбновленияДоступа(); + ПараметрыПланирования.ЭтоПродолжениеОбновления = Истина; + ПараметрыПланирования.Описание = "ОграничиватьДоступНаУровнеЗаписейПриЗаписи"; + ЗапланироватьОбновлениеДоступа(, ПараметрыПланирования); + + УстановитьОбновлениеДоступа(Истина); + КонецЕсли; - УправлениеДоступом.ОбновитьРазрешенныеЗначенияПриИзмененииИспользованияВидовДоступа(); + ОбновитьПараметрыСеанса(); КонецПроцедуры @@ -3718,7 +3828,7 @@ // которые не зависят от содержания объекта или заполняются для нового объекта. // // Форма должна содержать реквизиты, указанные ниже. -// Реквизиты отмеченные символом * заполняются автоматически, но их нужно создать в форме. +// Реквизиты отмеченные символом & заполняются автоматически, но их нужно создать в форме. // Реквизиты отмеченные символом # должны быть созданы в форме, если // в форме будет создан реквизит ТекущаяГруппаДоступа (см. ниже). // Реквизиты отмеченные символом @ будут созданы автоматически. @@ -3731,18 +3841,18 @@ // ВидДоступа - ОпределяемыйТип.ЗначениеДоступа, // Предустановленный - Булево (только для профиля), // ВсеРазрешены - Булево, -// *ВидДоступаПредставление - Строка - представление настройки, -// *ВсеРазрешеныПредставление - Строка - представление настройки, +// &ВидДоступаПредставление - Строка - представление настройки, +// &ВсеРазрешеныПредставление - Строка - представление настройки, // @Используется - Булево. // // ЗначенияДоступа - Таблица с полями: // #ГруппаДоступа - СправочникСсылка.ГруппыДоступа, -// *ВидДоступа - ОпределяемыйТип.ЗначениеДоступа, +// &ВидДоступа - ОпределяемыйТип.ЗначениеДоступа, // ЗначениеДоступа - ОпределяемыйТип.ЗначениеДоступа, -// *НомерСтрокиПоВиду - Число. +// &НомерСтрокиПоВиду - Число. // -// *ИспользоватьВнешнихПользователей - Булево - реквизит будет создан, если нет в форме. -// *НадписьВидДоступа - Строка - представление текущего вида доступа в форме. +// &ИспользоватьВнешнихПользователей - Булево - реквизит будет создан, если нет в форме. +// &НадписьВидДоступа - Строка - представление текущего вида доступа в форме. // @ЭтоПрофильГруппДоступа - Булево. // @ТекущийВидДоступа - ОпределяемыйТип.ЗначениеДоступа. // @ТекущиеТипыВыбираемыхЗначений - СписокЗначений. @@ -3996,7 +4106,7 @@ // ВыполняетсяОбновлениеИнформационнойБазы и ЭтоВызовИзОбработчикаОбновления // общего модуля ОбновлениеИнформационнойБазы. // -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // // ИзмененныеЗаписи - Неопределено - никаких действий, иначе @@ -4215,7 +4325,7 @@ // ВыполняетсяОбновлениеИнформационнойБазы и ЭтоВызовИзОбработчикаОбновления // общего модуля ОбновлениеИнформационнойБазы. // -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // Процедура ОбновитьНаборыЗаписей(Знач Данные, ЕстьИзменения) Экспорт @@ -4441,7 +4551,7 @@ // ВыполняетсяОбновлениеИнформационнойБазы и ЭтоВызовИзОбработчикаОбновления // общего модуля ОбновлениеИнформационнойБазы. // -// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// ЕстьИзменения - Булево - возвращаемое значение. Если производилась запись, // устанавливается Истина, иначе не изменяется. // Процедура ОбновитьРегистрСведений(Знач Данные, ЕстьИзменения = Неопределено) Экспорт @@ -4829,6 +4939,10 @@ КонецЕсли; СсылкаПометитьНаУдаление = Ложь; + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка); + Если ОбщегоНазначения.РазделениеВключено() Тогда СсылкаПометитьНаУдаление = Истина; Иначе @@ -4841,24 +4955,51 @@ СсылкаПометитьНаУдаление = Истина; Иначе // Установка идентификатора поставляемых данных. - ПрофильОбъект = Ссылка.ПолучитьОбъект(); - ПрофильОбъект.ИдентификаторПоставляемыхДанных = УникальныйИдентификаторПрофиля; - ПрофильОбъект.Комментарий = ""; - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ПрофильОбъект = Ссылка.ПолучитьОбъект(); + ПрофильОбъект.ИдентификаторПоставляемыхДанных = УникальныйИдентификаторПрофиля; + ПрофильОбъект.Комментарий = ""; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЕсли; КонецЕсли; КонецЕсли; Если СсылкаПометитьНаУдаление Тогда - ПрофильОбъект = Ссылка.ПолучитьОбъект(); - ПрофильОбъект.ПометкаУдаления = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ПрофильОбъект = Ссылка.ПолучитьОбъект(); + ПрофильОбъект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; ГруппыПрофиля = ГруппыПрофиля(Ссылка, Ложь); Для Каждого СсылкаГруппы Из ГруппыПрофиля Цикл - ГруппаОбъект = СсылкаГруппы.ПолучитьОбъект(); - ГруппаОбъект.ПометкаУдаления = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаОбъект, Ложь); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", СсылкаГруппы); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ГруппаОбъект = СсылкаГруппы.ПолучитьОбъект(); + ГруппаОбъект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаОбъект, Ложь); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; КонецЕсли; @@ -4954,7 +5095,8 @@ Если Не ТребуетсяОбновление Тогда Если УстановитьНовыеПраваРолейРасширений Тогда; СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения( - "СтандартныеПодсистемы.УправлениеДоступом.ПраваРолей", Новый ХранилищеЗначения(ПраваРолейРасширений)); + "СтандартныеПодсистемы.УправлениеДоступом.ПраваРолей", + Новый ХранилищеЗначения(ПраваРолейРасширений)); КонецЕсли; Возврат; КонецЕсли; @@ -4988,10 +5130,12 @@ КонецЕсли; Если УстановитьНовыеПраваРолейРасширений Тогда; СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения( - "СтандартныеПодсистемы.УправлениеДоступом.ПраваРолей", Новый ХранилищеЗначения(ПраваРолейРасширений)); + "СтандартныеПодсистемы.УправлениеДоступом.ПраваРолей", + Новый ХранилищеЗначения(ПраваРолейРасширений)); КонецЕсли; СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения( - "СтандартныеПодсистемы.УправлениеДоступом.ПараметрыОбновленияТаблицГруппДоступа", НовыеПараметрыОбновления, Истина); + "СтандартныеПодсистемы.УправлениеДоступом.ПараметрыОбновленияТаблицГруппДоступа", + НовыеПараметрыОбновления, Истина); РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(, ОбъектыСИзменениемПравДляОбновления); ЗафиксироватьТранзакцию(); Исключение @@ -5167,6 +5311,7 @@ ОписаниеПрофиля = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(); ОписаниеПрофиля.Имя = "ОткрытиеВнешнихОтчетовИОбработок"; + ОписаниеПрофиля.Родитель = "ДополнительныеПрофили"; ОписаниеПрофиля.Идентификатор = ИдентификаторПрофиляОткрытиеВнешнихОтчетовИОбработок(); ОписаниеПрофиля.Наименование = @@ -5334,6 +5479,7 @@ Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ОбновлениеКлючейДоступаКДанным") Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ОбновлениеКлючейДоступаПользователей") Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ПараметрыОграниченияДоступа") + Или ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ИспользуемыеВидыДоступаПоТаблицам") Или ТипЗнч(ЭлементДанных) = Тип("КонстантаМенеджерЗначения.ПервоеОбновлениеДоступаЗавершилось"); КонецФункции @@ -5341,6 +5487,14 @@ // Для процедур ПриПолученииДанныхОтГлавного, ПриПолученииДанныхОтПодчиненного Процедура ПриПолученииДанныхОтГлавногоИлиОтПодчиненного(ЭлементДанных) + Если ТипЗнч(ЭлементДанных) = Тип("КонстантаМенеджерЗначения.ОграничиватьДоступНаУровнеЗаписей") Тогда + Константы.ОграничиватьДоступНаУровнеЗаписей.СоздатьМенеджерЗначения().ЗарегистрироватьИзменениеПриЗагрузке(ЭлементДанных); + КонецЕсли; + + Если ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ИспользуемыеВидыДоступа") Тогда + РегистрыСведений.ИспользуемыеВидыДоступа.ЗарегистрироватьИзменениеПриЗагрузке(ЭлементДанных); + КонецЕсли; + Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда // Роли расширений назначаются независимо во всех РИБ-узлах. Справочники.ПрофилиГруппДоступа.ВосстановитьСоставРолейРасширений(ЭлементДанных); @@ -5400,6 +5554,8 @@ // Для процедур ПослеПолученияДанных, ПослеОбновленияИнформационнойБазы. Процедура ОбновитьВспомогательныеДанныеЭлементовИзмененныхПриЗагрузке() + Константы.ОграничиватьДоступНаУровнеЗаписей.СоздатьМенеджерЗначения().ОбработатьИзменениеЗарегистрированноеПриЗагрузке(); + РегистрыСведений.ИспользуемыеВидыДоступа.ОбработатьИзменениеЗарегистрированноеПриЗагрузке(); Справочники.ПрофилиГруппДоступа.ОбновитьВспомогательныеДанныеПрофилейИзмененныхПриЗагрузке(); Справочники.ГруппыДоступа.ОбновитьВспомогательныеДанныеГруппДоступаИзмененныхПриЗагрузке(); Справочники.ГруппыДоступа.ОбновитьРолиПользователейИзмененныхПриЗагрузке(); @@ -5427,7 +5583,7 @@ ИдентификаторПоставляемогоПрофиля = ПоставляемыйПрофиль; ПоставляемыйПрофиль = Справочники.ПрофилиГруппДоступа.ПоставляемыйПрофильПоИдентификатору( - ИдентификаторПоставляемогоПрофиля); + ИдентификаторПоставляемогоПрофиля,, Истина); Иначе Возврат Ложь; КонецЕсли; @@ -5659,7 +5815,8 @@ Таблица, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина); Иначе ТабличнаяЧастьЗаполняется = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( - "ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей").Получить(ТипЗначенияОбъект) <> Неопределено; + "ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей + |ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов").Получить(ТипЗначенияОбъект) <> Неопределено; Если НЕ ТабличнаяЧастьЗаполняется Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -5815,6 +5972,9 @@ Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ГруппаДоступаАдминистраторы", + УправлениеДоступом.ГруппаДоступаАдминистраторы()); + Запрос.УстановитьПараметр("ПустойИдентификатор", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); @@ -5912,7 +6072,7 @@ |ИЗ | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи - | ПО (ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы)) + | ПО (ГруппыДоступаПользователи.Ссылка = &ГруппаДоступаАдминистраторы) | И ГруппыДоступаПользователи.Пользователь = Пользователи.Ссылка |; | @@ -7786,7 +7946,7 @@ | Справочник.ГруппыДоступа КАК ГруппыДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа | ПО ГруппыДоступа.Профиль = ПрофилиГруппДоступа.Ссылка - | И (ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)) + | И (ГруппыДоступа.Профиль <> &ПрофильАдминистратор) | И (НЕ ГруппыДоступа.ПометкаУдаления) | И (НЕ ПрофилиГруппДоступа.ПометкаУдаления) | И (ИСТИНА В @@ -7827,6 +7987,7 @@ Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ТипЗначенияВидаДоступа", ТипЗначенияВидаДоступа); + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); @@ -8288,7 +8449,7 @@ // Параметры: // ОписаниеДанных - см. УправлениеДоступом.ИзменениеРазрешено.ОписаниеДанных -// Изменение - Булево +// ПравоИзменение - Булево // ВызыватьИсключение - Булево // ПроверитьТолькоСтаруюВерсию - Булево // Пользователь - СправочникСсылка.Пользователи @@ -8298,7 +8459,7 @@ // Возвращаемое значение: // Булево // -Функция ДоступРазрешен(ОписаниеДанных, Изменение, ВызыватьИсключение = Ложь, +Функция ДоступРазрешен(ОписаниеДанных, ПравоИзменение, ВызыватьИсключение = Ложь, ПроверитьТолькоСтаруюВерсию = Ложь, Знач Пользователь = Неопределено) Экспорт УчитыватьПривилегированныйРежим = Истина; @@ -8325,9 +8486,9 @@ |Передано значение: %3 (тип %4).'"), "ОписаниеДанных", ?(ВызыватьИсключение, - ?(Изменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", + ?(ПравоИзменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", "УправлениеДоступом.ПроверитьЧтениеРазрешено"), - ?(Изменение, "УправлениеДоступом.ИзменениеРазрешено", + ?(ПравоИзменение, "УправлениеДоступом.ИзменениеРазрешено", "УправлениеДоступом.ЧтениеРазрешено")), Строка(ОписаниеДанных), Строка(ТипЗнч(ОписаниеДанных))); @@ -8339,9 +8500,9 @@ Если Пользователь <> Неопределено Тогда ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( ?(ВызыватьИсключение, - ?(Изменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", + ?(ПравоИзменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", "УправлениеДоступом.ПроверитьЧтениеРазрешено"), - ?(Изменение, "УправлениеДоступом.ИзменениеРазрешено", + ?(ПравоИзменение, "УправлениеДоступом.ИзменениеРазрешено", "УправлениеДоступом.ЧтениеРазрешено")), "Пользователь", Пользователь, @@ -8354,9 +8515,9 @@ |Передано значение: %4 (тип %5).'"), "Пользователь", ?(ВызыватьИсключение, - ?(Изменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", + ?(ПравоИзменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", "УправлениеДоступом.ПроверитьЧтениеРазрешено"), - ?(Изменение, "УправлениеДоступом.ИзменениеРазрешено", + ?(ПравоИзменение, "УправлениеДоступом.ИзменениеРазрешено", "УправлениеДоступом.ЧтениеРазрешено")), "Неопределено", Строка(Пользователь), @@ -8403,7 +8564,7 @@ ЛюбойОбъект = ОписаниеДанных; // СправочникОбъект - Если Не Изменение Тогда + Если Не ПравоИзменение Тогда ИмяПраваДоступа = "Чтение"; ИначеЕсли ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданных) @@ -8457,7 +8618,7 @@ ОбновитьРазрешенныеНаборыВПараметрахСеанса(); Если ПараметрыОграничения.ОграничениеОтключено - Или Не Изменение + Или Не ПравоИзменение И ПараметрыОграничения.ОграничениеЧтенияОтключено Тогда Возврат Истина; @@ -8473,7 +8634,7 @@ Запрос = Новый Запрос; УстановитьРазрешенныеНаборыВПараметрыЗапроса(Запрос, Пользователь); - Запрос.Текст = ?(Изменение, ПараметрыОграничения.ТекстЗапросаПроверкиПравЧтениеИзменение, + Запрос.Текст = ?(ПравоИзменение, ПараметрыОграничения.ТекстЗапросаПроверкиПравЧтениеИзменение, ПараметрыОграничения.ТекстЗапросаПроверкиПраваЧтение); Если ПараметрыОграничения.ЭтоСсылочныйТип Тогда @@ -8610,7 +8771,7 @@ Возврат ДоступРазрешен; КонецЕсли; - Если Изменение Тогда + Если ПравоИзменение Тогда ПравоЧтения = ДоступРазрешен(ОписаниеДанных, Ложь); Иначе ПравоЧтения = Ложь; @@ -8832,10 +8993,7 @@ Возврат; КонецЕсли; - Если Свойства.ПолеВладельца <> Неопределено - И (Не Свойства.ПолеВладельца.Отключено - Или ЗначениеЗаполнено(ИмяТипаСсылки(ПолноеИмя, ТипыТаблицПоИменам))) Тогда - + Если Свойства.ПолеВладельца <> Неопределено Тогда ПолеВладельца = Свойства.ПолеВладельца; // См. НовоеПолеВладельца ОграничениеВРоли.Параметры.Добавить(ПолеВладельца.Имя); Возврат; @@ -9296,7 +9454,7 @@ КонецЕсли; Запрос.Текст = СтрЗаменить(Запрос.Текст, - "РазрешенныеКлючиДоступа.Изменение", "РазрешенныеКлючиДоступа.Добавление"); + "РазрешенныеКлючиДоступа.ПравоИзменение", "РазрешенныеКлючиДоступа.ПравоДобавление"); КонецПроцедуры @@ -9937,6 +10095,7 @@ // ** СоставИзменений - см. СоставИзмененийТаблицы // * ПоКлючамДоступа - СправочникСсылка.КлючиДоступа // * ПоЗначениямСГруппами - ОпределяемыйТип.ЗначениеДоступа - только значения доступа с группами. +// * ПоДаннымКэшаРасчетаПрав - Строка - наименование данных для кэша расчета прав. // Функция ОписаниеВедущегоОбъекта() @@ -10028,8 +10187,7 @@ СтарыеКомбинации = Новый ТаблицаЗначений; Иначе СтарыеКомбинации = РезультатЗапроса.Выгрузить(); - Если СтрРазделить(Поля, ",").Количество() < СтарыеКомбинации.Количество() Тогда - СтарыеКомбинации = СтарыеКомбинации.Скопировать(, Поля); + Если СтрРазделить(Поля, ",").Количество() < СтарыеКомбинации.Колонки.Количество() Тогда СтарыеКомбинации.Свернуть(Поля); КонецЕсли; КонецЕсли; @@ -10079,6 +10237,12 @@ Возврат; КонецЕсли; + Описание = ?(ПриЗагрузке, + "ЗапланироватьОбновлениеДоступаПриИзмененииУчастниковГруппыДоступаПриЗагрузке", + "ЗапланироватьОбновлениеДоступаПриИзмененииУчастниковГруппыДоступа"); + + ЗапланироватьОбновлениеКэшаРасчетаПрав(Описание, "УчастникиГруппДоступа"); + Запрос = Новый Запрос; Запрос.УстановитьПараметр("ГруппаДоступа", ГруппаДоступа); Запрос.Текст = @@ -10093,9 +10257,6 @@ УстановитьПривилегированныйРежим(Истина); Таблицы = Запрос.Выполнить().Выгрузить(); - Описание = ?(ПриЗагрузке, - "ЗапланироватьОбновлениеДоступаПриИзмененииУчастниковГруппыДоступаПриЗагрузке", - "ЗапланироватьОбновлениеДоступаПриИзмененииУчастниковГруппыДоступа"); ЗапланироватьОбновлениеПользователейКлючейДоступа(Таблицы, Описание, ТипыИзмененныхУчастников.Пользователи, ТипыИзмененныхУчастников.ВнешниеПользователи, Истина); @@ -10114,6 +10275,14 @@ УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); + Описание = ?(ПослеУстановкиПользователяИБ, + "ЗапланироватьОбновлениеДоступаПриКосвенномИзмененииУчастниковГруппыДоступаПослеУстановкиПользователяИБ", + ?(ПриЗагрузке, + "ЗапланироватьОбновлениеДоступаПриКосвенномИзмененииУчастниковГруппыДоступаПриЗагрузке", + "ЗапланироватьОбновлениеДоступаПриКосвенномИзмененииУчастниковГруппыДоступа")); + + ЗапланироватьОбновлениеКэшаРасчетаПрав(Описание, "СоставыГруппПользователей"); + Если ИзмененныеУчастники = Неопределено Тогда ДляПользователей = Истина; ДляВнешнихПользователей = Истина; @@ -10167,11 +10336,6 @@ КонецЕсли; Таблицы = Запрос.Выполнить().Выгрузить(); - Описание = ?(ПослеУстановкиПользователяИБ, - "ЗапланироватьОбновлениеДоступаПриКосвенномИзмененииУчастниковГруппыДоступаПослеУстановкиПользователяИБ", - ?(ПриЗагрузке, - "ЗапланироватьОбновлениеДоступаПриКосвенномИзмененииУчастниковГруппыДоступаПриЗагрузке", - "ЗапланироватьОбновлениеДоступаПриКосвенномИзмененииУчастниковГруппыДоступа")); ЗапланироватьОбновлениеПользователейКлючейДоступа(Таблицы, Описание, ДляПользователей, ДляВнешнихПользователей, Истина); @@ -10186,15 +10350,114 @@ // Для вызова из модуля менеджера регистра ТаблицыГруппДоступа. Процедура ЗапланироватьОбновлениеДоступаПриИзмененииТаблицГруппДоступа(Таблицы) Экспорт - ЗапланироватьОбновлениеПользователейКлючейДоступа(Таблицы, - "ЗапланироватьОбновлениеДоступаПриИзмененииТаблицГруппДоступа", Истина, Истина); + Описание = "ЗапланироватьОбновлениеДоступаПриИзмененииТаблицГруппДоступа"; + ЗапланироватьОбновлениеКэшаРасчетаПрав(Описание, "ТаблицыГруппДоступа"); + + ЗапланироватьОбновлениеПользователейКлючейДоступа(Таблицы, Описание, Истина, Истина); + +КонецПроцедуры + +// Для вызова из модуля объекта и модуля менеджера справочника ПрофилиГруппДоступа. +Процедура ЗапланироватьОбновлениеДоступаПриИзмененииРолейПрофиля(Описание, ИзмененныеРоли) Экспорт + + ЗапланироватьОбновлениеКэшаРасчетаПрав(Описание, "РолиПрофилейГруппДоступа"); + + Если ИзмененныеРоли = Неопределено + Или ИзмененныеРоли.Количество() > 0 Тогда + + ЗапланироватьОбновлениеДоступаПриИзмененииРолей(Описание, ИзмененныеРоли); + КонецЕсли; + +КонецПроцедуры + +// Для вызова из модуля объекта и модуля менеджера справочника ГруппыДоступа. +Процедура ЗапланироватьОбновлениеДоступаПриИзмененииПрофиляГруппыДоступа(Описание, ИзмененныеРоли, ПрофильИзменен) Экспорт + + Если ПрофильИзменен Тогда + ЗапланироватьОбновлениеКэшаРасчетаПрав(Описание, "ГруппыДоступаПрофилей"); + КонецЕсли; + + Если ИзмененныеРоли = Неопределено + Или ИзмененныеРоли.Количество() > 0 Тогда + + ЗапланироватьОбновлениеДоступаПриИзмененииРолей(Описание, ИзмененныеРоли); + КонецЕсли; + +КонецПроцедуры + +// Для процедур ЗапланироватьОбновлениеДоступаПриИзмененииРолейПрофиля и +// ЗапланироватьОбновлениеДоступаПриИзмененииПрофиляГруппыДоступа. +// +Процедура ЗапланироватьОбновлениеДоступаПриИзмененииРолей(Описание, ИзмененныеРоли) + + ДействующиеПараметры = ДействующиеПараметрыОграниченияДоступа(Неопределено, Неопределено, Ложь); + Если Не ЗначениеЗаполнено(ДействующиеПараметры.ВедущиеРоли) Тогда + Возврат; + КонецЕсли; + + Если ИзмененныеРоли <> Неопределено Тогда + МетаданныеРолей = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИзмененныеРоли, Ложь); + ИменаРолей = Новый Соответствие; + Для Каждого КлючИЗначение Из МетаданныеРолей Цикл + Если ТипЗнч(КлючИЗначение.Значение) = Тип("ОбъектМетаданных") Тогда + ИменаРолей.Вставить(КлючИЗначение.Значение.Имя, Истина); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + СпискиДляПользователей = Новый Массив; + СпискиДляВнешнихПользователей = Новый Массив; + ДобавленныеСпискиДляПользователей = Новый Соответствие; + ДобавленныеСпискиДляВнешнихПользователей = Новый Соответствие; + + Для Каждого ОписаниеВедущейРоли Из ДействующиеПараметры.ВедущиеРоли Цикл + Если ИзмененныеРоли <> Неопределено + И ИменаРолей.Получить(ОписаниеВедущейРоли.Ключ) = Неопределено Тогда + Продолжить; + КонецЕсли; + ДобавитьСпискиВедущейРолиДляОбновленияПрав(СпискиДляПользователей, + ОписаниеВедущейРоли.Значение.ДляПользователей, ДобавленныеСпискиДляПользователей); + ДобавитьСпискиВедущейРолиДляОбновленияПрав(СпискиДляВнешнихПользователей, + ОписаниеВедущейРоли.Значение.ДляВнешнихПользователей, ДобавленныеСпискиДляВнешнихПользователей); + КонецЦикла; + + ПараметрыПланирования = ПараметрыПланированияОбновленияДоступа(Ложь); + ПараметрыПланирования.КлючиДоступаКДанным = Ложь; + ПараметрыПланирования.Описание = Описание; + + ПараметрыПланирования.ДляВнешнихПользователей = Ложь; + ЗапланироватьОбновлениеДоступа(СпискиДляПользователей, ПараметрыПланирования); + + ПараметрыПланирования.ДляПользователей = Ложь; + ПараметрыПланирования.ДляВнешнихПользователей = Истина; + ЗапланироватьОбновлениеДоступа(СпискиДляВнешнихПользователей, ПараметрыПланирования); + +КонецПроцедуры + +// Для процедуры ЗапланироватьОбновлениеДоступаПриИзмененииРолей. +Процедура ДобавитьСпискиВедущейРолиДляОбновленияПрав(Списки, СпискиВедущейРоли, ДобавленныеСписки) + + Если Не ЗначениеЗаполнено(СпискиВедущейРоли) Тогда + Возврат; + КонецЕсли; + + Для Каждого ОписаниеСписка Из СпискиВедущейРоли Цикл + Если ДобавленныеСписки.Получить(ОписаниеСписка.Ключ) <> Неопределено Тогда + Продолжить; + КонецЕсли; + ДобавленныеСписки.Вставить(ОписаниеСписка.Ключ, Истина); + Списки.Добавить(ОписаниеСписка.Ключ); + КонецЦикла; + КонецПроцедуры // Для вызова из модуля менеджера регистра ЗначенияГруппДоступа. Процедура ЗапланироватьОбновлениеДоступаПриИзмененииРазрешенныхЗначений(ГруппыДоступаИТипыЗначений) Экспорт - ОчиститьКэшЗначенийГруппДоступаДляРасчетаПрав(); + Описание = "ЗапланироватьОбновлениеДоступаПриИзмененииРазрешенныхЗначений"; + + ЗапланироватьОбновлениеКэшаРасчетаПрав(Описание, "ЗначенияГруппДоступа"); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ГруппыДоступаИТипыЗначений", ГруппыДоступаИТипыЗначений); @@ -10221,26 +10484,7 @@ ТаблицыИТипыЗначенийДоступа = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); ЗапланироватьОбновлениеПользователейКлючейДоступа(ТаблицыИТипыЗначенийДоступа.Строки, - "ЗапланироватьОбновлениеДоступаПриИзмененииРазрешенныхЗначений", Истина, Истина); - -КонецПроцедуры - -// Для процедур ЗапланироватьОбновлениеДоступаПриИзмененииРазрешенныхЗначений, -// ЗапланироватьОбновлениеДоступа и вызова из модуля формы ОбновлениеДоступаРучноеУправление. -// -Процедура ОчиститьКэшЗначенийГруппДоступаДляРасчетаПрав() Экспорт - - УстановитьОтключениеБезопасногоРежима(Истина); - УстановитьПривилегированныйРежим(Истина); - - ИмяПараметраВерсии = "СтандартныеПодсистемы.УправлениеДоступом.ЗначенияГруппДоступаВерсия"; - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметраВерсии, Новый УникальныйИдентификатор, Истина); - - ИмяПараметра = "СтандартныеПодсистемы.УправлениеДоступом.ЗначенияГруппДоступа"; - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, Неопределено, Истина); - - УстановитьПривилегированныйРежим(Ложь); - УстановитьОтключениеБезопасногоРежима(Ложь); + Описание, Истина, Истина); КонецПроцедуры @@ -10454,6 +10698,67 @@ КонецПроцедуры +// Для процедур ЗапланироватьОбновлениеДоступаПриИзмененииУчастниковГруппыДоступа, +// ЗапланироватьОбновлениеДоступаПриКосвенномИзмененииУчастниковГруппыДоступа, +// ЗапланироватьОбновлениеДоступаПриИзмененииТаблицГруппДоступа, +// ЗапланироватьОбновлениеДоступаПриИзмененииРазрешенныхЗначений. +// +Процедура ЗапланироватьОбновлениеКэшаРасчетаПрав(Описание, ИмяИзмененныхДанных) + + ПараметрыПланирования = ПараметрыПланированияОбновленияДоступа(Ложь); + ПараметрыПланирования.КлючиДоступаКДанным = Ложь; + ПараметрыПланирования.ДляВнешнихПользователей = Ложь; + ПараметрыПланирования.Описание = Описание; + ПараметрыПланирования.ВедущийОбъект = Новый Структура("ПоДаннымКэшаРасчетаПрав", ИмяИзмененныхДанных); + ЗапланироватьОбновлениеДоступа(СписокДляПланированияОбновленияКэшаРасчетаПрав(), ПараметрыПланирования); + +КонецПроцедуры + +// Для процедур ПодготовитьПланОбновления, ЗапланироватьОбновлениеКэшаРасчетаПрав +// и функции ВерсияДанныхДляКэшаРасчетаПрав. +// +Функция СписокДляПланированияОбновленияКэшаРасчетаПрав() + + Возврат "РегистрСведений.ПараметрыРаботыВерсийРасширений"; + +КонецФункции + +// Возвращаемое значение: +// Структура: +// * ТаблицыГруппДоступа - Строка +// - Неопределено +// * ЗначенияГруппДоступа - Строка +// - Неопределено +// * УчастникиГруппДоступа - Строка +// - Неопределено +// * СоставыГруппПользователей - Строка +// - Неопределено +// * РолиПрофилейГруппДоступа - Строка +// - Неопределено +// * ГруппыДоступаПрофилей - Строка +// - Неопределено +// +Функция НоваяВерсияДанныхДляКэшаРасчетаПрав(Версия = Неопределено) Экспорт + + НоваяВерсияДанных = Новый Структура; + НоваяВерсияДанных.Вставить("ТаблицыГруппДоступа", Версия); + НоваяВерсияДанных.Вставить("ЗначенияГруппДоступа", Версия); + НоваяВерсияДанных.Вставить("УчастникиГруппДоступа", Версия); + НоваяВерсияДанных.Вставить("СоставыГруппПользователей", Версия); + НоваяВерсияДанных.Вставить("РолиПрофилейГруппДоступа", Версия); + НоваяВерсияДанных.Вставить("ГруппыДоступаПрофилей", Версия); + + Возврат НоваяВерсияДанных; + +КонецФункции + +// Для процедуры ОбработатьПланОбновленияКэшаРасчетаПрав. +Функция ИмяПараметраВерсииДанныхДляКэшаРасчетаПрав() + + Возврат "СтандартныеПодсистемы.УправлениеДоступом.ВерсияДанныхДляКэшаРасчетаПрав"; + +КонецФункции + #КонецОбласти #Область ОбновлениеДоступа @@ -10469,8 +10774,8 @@ // считаться незавершенным исполнителем. // // Возвращаемое значение: -// Неопределено - обновление доступа не требуется или запрещено. -// Структура: +// - Неопределено - обновление доступа не требуется или запрещено. +// - Структура: // * УжеВыполняется - Булево - если обновление уже выполняется. // // * ИдентификаторФоновогоЗадания - Неопределено - если обновление не выполняется или @@ -11111,7 +11416,9 @@ // - Неопределено // // Возвращаемое значение: -// ФоновоеЗадание, СеансИнформационнойБазы, Неопределено +// - ФоновоеЗадание +// - СеансИнформационнойБазы +// - Неопределено // Функция ИсполнительОбновленияДоступа(ПоследнееОбновлениеДоступа, ИдентификаторИсключаемогоЗадания = Неопределено) Экспорт @@ -11285,20 +11592,16 @@ КонецЕсли; СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); - ТекущиеИспользуемыеТипыЗначений = ИспользуемыеТипыЗначений(СвойстваВидовДоступа); + ТекущиеИспользуемыеТипыЗначений = ИспользуемыеТипыЗначений(СвойстваВидовДоступа,,, Истина); ИспользуемыеТипыЗначений = ДействующиеПараметры.ИспользуемыеТипыЗначений.Получить(); - Если ТекущиеИспользуемыеТипыЗначений.Количество() <> ИспользуемыеТипыЗначений.Количество() Тогда + Если ТипЗнч(ИспользуемыеТипыЗначений) <> Тип("Структура") + Или Не ИспользуемыеТипыЗначений.Свойство("ХешСумма") + Или ИспользуемыеТипыЗначений.ХешСумма <> ТекущиеИспользуемыеТипыЗначений.ХешСумма Тогда Возврат Истина; КонецЕсли; - Для Каждого КлючИЗначение Из ИспользуемыеТипыЗначений Цикл - Если ТекущиеИспользуемыеТипыЗначений.Получить(КлючИЗначение.Ключ) <> КлючИЗначение.Значение Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - Возврат Ложь; КонецФункции @@ -13389,7 +13692,7 @@ Кэш = Новый Структура; Пока Истина Цикл - Запрос = Контекст.Запрос; // Запрос - + Запрос = Контекст.Запрос; // Запрос Выборка = Запрос.Выполнить().Выбрать(); Если Не Выборка.Следующий() Тогда Прервать; @@ -14562,6 +14865,23 @@ Выгрузка = РезультатЗапроса.Выгрузить(); + Если Выгрузка.Количество() = 1000 Тогда + ПодготовкаЗавершена = Ложь; + КонецЕсли; + + Если ЭтоОбновлениеПрав Тогда + ПланОбновления = СлужебныйНаборЗаписей(РегистрыСведений.ОбновлениеКлючейДоступаПользователей); + Иначе + ПланОбновления = СлужебныйНаборЗаписей(РегистрыСведений.ОбновлениеКлючейДоступаКДанным); + КонецЕсли; + + Если ПараметрыОбновления.Список = СписокДляПланированияОбновленияКэшаРасчетаПрав() Тогда + ОбработатьПланОбновленияКэшаРасчетаПрав(Выгрузка); + ОчиститьЗагруженныеЗаписи(ПланОбновления, Выгрузка); + ПараметрыОбновления.ЕстьЗадания = Ложь; + Возврат; + КонецЕсли; + ПерезапускОбновления = Ложь; ПерезапускОбновленияСНачала = Ложь; СохраняемыеПараметрыЗадания = СохраняемыеПараметрыЗадания(ЭтоОбновлениеПрав, ПараметрыОбновления); @@ -14698,12 +15018,6 @@ Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ ПЕРВЫЕ 1000", "ВЫБРАТЬ ПЕРВЫЕ 1"); // @query-part-1 @query-part-2 ЗаданияУдалены = Ложь; - Если ЭтоОбновлениеПрав Тогда - ПланОбновления = СлужебныйНаборЗаписей(РегистрыСведений.ОбновлениеКлючейДоступаПользователей); - Иначе - ПланОбновления = СлужебныйНаборЗаписей(РегистрыСведений.ОбновлениеКлючейДоступаКДанным); - КонецЕсли; - ПланОбновления.Отбор.Список.Установить(ИдентификаторСписка); ПланОбновления.Отбор.ДляВнешнихПользователей.Установить(ДляВнешнихПользователей); ПланОбновления.Отбор.КлючУникальности.Установить(ПустойИдентификатор); @@ -14741,18 +15055,160 @@ Возврат; КонецЕсли; + ОчиститьЗагруженныеЗаписи(ПланОбновления, Выгрузка) + +КонецПроцедуры + +// Для процедуры ПодготовитьПланОбновления. +Процедура ОчиститьЗагруженныеЗаписи(ПланОбновления, Выгрузка) + ПланОбновления.Очистить(); Для Каждого Строка Из Выгрузка Цикл ПланОбновления.Отбор.КлючУникальности.Установить(Строка.КлючУникальности); ПланОбновления.Записать(); КонецЦикла; - Если Выгрузка.Количество() = 1000 Тогда - ПодготовкаЗавершена = Ложь; +КонецПроцедуры + +// Для процедуры ПодготовитьПланОбновления. +Процедура ОбработатьПланОбновленияКэшаРасчетаПрав(Выгрузка, НоваяВерсияДанныхДляКэша = Неопределено) + + ВерсияДанныхДляКэша = НоваяВерсияДанныхДляКэшаРасчетаПрав(); + + Для Каждого Строка Из Выгрузка Цикл + ПараметрыЗадания = Строка.ПараметрыЗадания.Получить(); + Если ТипЗнч(ПараметрыЗадания) <> Тип("Структура") + Или Не ПараметрыЗадания.Свойство("ТочечноеЗадание") + Или ТипЗнч(ПараметрыЗадания.ТочечноеЗадание) <> Тип("Структура") + Или Не ПараметрыЗадания.ТочечноеЗадание.Свойство("ПоДаннымКэшаРасчетаПрав") Тогда + Продолжить; + КонецЕсли; + ИмяИзмененныхДанных = ПараметрыЗадания.ТочечноеЗадание.ПоДаннымКэшаРасчетаПрав; + ОбработатьЗаданиеОбновленияКэшаРасчетаПрав(ВерсияДанныхДляКэша, + ИмяИзмененныхДанных, Строка.КлючУникальности); + КонецЦикла; + + ИмяПараметра = ИмяПараметраВерсииДанныхДляКэшаРасчетаПрав(); + + Если НоваяВерсияДанныхДляКэша = Неопределено Тогда + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПараметрыРаботыВерсийРасширений"); + ЭлементБлокировки.УстановитьЗначение("ВерсияРасширений", Справочники.ВерсииРасширений.ПустаяСсылка()); + ЭлементБлокировки.УстановитьЗначение("ИмяПараметра", ИмяПараметра); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ТекущееЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина); + НовоеЗначение = НоваяВерсияДанныхДляКэша(ТекущееЗначение, ВерсияДанныхДляКэша); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, НовоеЗначение, Истина); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + Иначе + ТекущееЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина); + НоваяВерсияДанныхДляКэша = НоваяВерсияДанныхДляКэша(ТекущееЗначение, ВерсияДанныхДляКэша, Ложь); КонецЕсли; КонецПроцедуры +// Для процедуры ОбработатьПланОбновленияКэшаРасчетаПрав. +Процедура ОбработатьЗаданиеОбновленияКэшаРасчетаПрав(ВерсияДанныхДляКэша, ИмяИзмененныхДанных, КлючУникальности) + + Если ТипЗнч(ИмяИзмененныхДанных) <> Тип("Строка") + Или Не ВерсияДанныхДляКэша.Свойство(ИмяИзмененныхДанных) Тогда + + Для Каждого КлючИЗначение Из ВерсияДанныхДляКэша Цикл + ВерсияДанныхДляКэша[КлючИЗначение.Ключ] = Строка(Новый УникальныйИдентификатор); + КонецЦикла; + Возврат; + КонецЕсли; + + Если ТипЗнч(ВерсияДанныхДляКэша[ИмяИзмененныхДанных]) = Тип("Строка") Тогда + Возврат; + КонецЕсли; + + Если ВерсияДанныхДляКэша[ИмяИзмененныхДанных] = Неопределено Тогда + ВерсияДанныхДляКэша[ИмяИзмененныхДанных] = Новый ХешированиеДанных(ХешФункция.SHA256); + КонецЕсли; + + ХешированиеДанных = ВерсияДанныхДляКэша[ИмяИзмененныхДанных]; // ХешированиеДанных + ХешированиеДанных.Добавить(Строка(КлючУникальности)); + +КонецПроцедуры + +// Для процедуры ОбработатьПланОбновленияКэшаРасчетаПрав. +Функция НоваяВерсияДанныхДляКэша(ТекущееЗначение, ВерсияДанныхДляКэша, ДляЗаписи = Истина) + + НовоеЗначение = НоваяВерсияДанныхДляКэшаРасчетаПрав(); + + Если ТипЗнч(ТекущееЗначение) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(НовоеЗначение, ТекущееЗначение); + КонецЕсли; + + Для Каждого КлючИЗначение Из ВерсияДанныхДляКэша Цикл + Если КлючИЗначение.Значение = Неопределено Тогда + Продолжить; + КонецЕсли; + Если ТипЗнч(КлючИЗначение.Значение) = Тип("ХешированиеДанных") Тогда + НовоеЗначение[КлючИЗначение.Ключ] = Base64Строка(КлючИЗначение.Значение.ХешСумма); + Иначе + НовоеЗначение[КлючИЗначение.Ключ] = КлючИЗначение.Значение; + КонецЕсли; + КонецЦикла; + + Для Каждого КлючИЗначение Из НовоеЗначение Цикл + Если КлючИЗначение.Значение <> Неопределено Тогда + Продолжить; + КонецЕсли; + НовоеЗначение[КлючИЗначение.Ключ] = ?(ДляЗаписи, + Строка(Новый УникальныйИдентификатор), "00000000-0000-0000-0000-000000000000"); + КонецЦикла; + + Возврат НовоеЗначение; + +КонецФункции + +// Для функции КэшРасчетаПравДляВидаПользователей. +Функция ВерсияДанныхДляКэшаРасчетаПрав() + + ИдентификаторСпискаПланирования = ОбщегоНазначения.ИдентификаторОбъектаМетаданных( + СписокДляПланированияОбновленияКэшаРасчетаПрав()); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Список", ИдентификаторСпискаПланирования); + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1000 + | КлючиУникальности.КлючУникальности КАК КлючУникальности, + | КлючиУникальности.ПараметрыЗадания КАК ПараметрыЗадания + |ИЗ + | РегистрСведений.ОбновлениеКлючейДоступаПользователей КАК КлючиУникальности + |ГДЕ + | КлючиУникальности.Список = &Список + | И КлючиУникальности.ДляВнешнихПользователей = ЛОЖЬ + | + |УПОРЯДОЧИТЬ ПО + | КлючиУникальности.Список, + | КлючиУникальности.ДляВнешнихПользователей, + | КлючиУникальности.КлючУникальности"; + + Если ТранзакцияАктивна() И ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("РегистрСведений.ОбновлениеКлючейДоступаПользователей"); + Блокировка.Заблокировать(); + КонецЕсли; + + Выгрузка = Запрос.Выполнить().Выгрузить(); + + ВерсияДанныхДляКэша = Новый Структура; + ОбработатьПланОбновленияКэшаРасчетаПрав(Выгрузка, ВерсияДанныхДляКэша); + + Возврат ВерсияДанныхДляКэша; + +КонецФункции + // Для процедуры ПодготовитьПланОбновления, ЗаписатьПоследнийОбновленныйЭлемент. // // Возвращаемое значение: @@ -16202,8 +16658,8 @@ |ИЗ | (ВЫБРАТЬ | КлючиДоступаГруппДоступа.КлючДоступа КАК КлючДоступа, - | КлючиДоступаГруппДоступа.Изменение КАК Изменение, - | КлючиДоступаГруппДоступа.Добавление КАК Добавление, + | КлючиДоступаГруппДоступа.ПравоИзменение КАК ПравоИзменение, + | КлючиДоступаГруппДоступа.ПравоДобавление КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -16215,8 +16671,8 @@ | | ВЫБРАТЬ | СтарыеДанные.КлючДоступа, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК СтарыеДанные @@ -16226,8 +16682,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.КлючДоступа, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -16239,15 +16695,15 @@ ТекстЗапросаВыбораПорцииДляОбновления = "ВЫБРАТЬ ПЕРВЫЕ 100 | ВсеСтроки.КлючДоступа КАК КлючДоступа, - | ВсеСтроки.Изменение КАК Изменение, - | ВсеСтроки.Добавление КАК Добавление, + | ВсеСтроки.ПравоИзменение КАК ПравоИзменение, + | ВсеСтроки.ПравоДобавление КАК ПравоДобавление, | ИСТИНА КАК ЭтоПраваНабораГрупп, | СУММА(ВсеСтроки.ВидИзмененияСтроки) КАК ВидИзмененияСтроки |ИЗ | (ВЫБРАТЬ | КлючиДоступаГруппДоступа.КлючДоступа КАК КлючДоступа, - | КлючиДоступаГруппДоступа.Изменение КАК Изменение, - | КлючиДоступаГруппДоступа.Добавление КАК Добавление, + | КлючиДоступаГруппДоступа.ПравоИзменение КАК ПравоИзменение, + | КлючиДоступаГруппДоступа.ПравоДобавление КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -16260,8 +16716,8 @@ | | ВЫБРАТЬ | СтарыеДанные.КлючДоступа, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК СтарыеДанные @@ -16272,8 +16728,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.КлючДоступа, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -16288,8 +16744,8 @@ |ИЗ | (ВЫБРАТЬ | КлючиДоступаГруппДоступа.КлючДоступа КАК КлючДоступа, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Изменение) КАК Изменение, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Добавление) КАК Добавление, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоИзменение) КАК ПравоИзменение, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоДобавление) КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -16307,8 +16763,8 @@ | | ВЫБРАТЬ | СтарыеДанные.КлючДоступа, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК СтарыеДанные @@ -16318,8 +16774,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.КлючДоступа, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -16331,15 +16787,15 @@ ТекстЗапросаВыбораПорцииДляОбновления = "ВЫБРАТЬ ПЕРВЫЕ 100 | ВсеСтроки.КлючДоступа КАК КлючДоступа, - | ВсеСтроки.Изменение КАК Изменение, - | ВсеСтроки.Добавление КАК Добавление, + | ВсеСтроки.ПравоИзменение КАК ПравоИзменение, + | ВсеСтроки.ПравоДобавление КАК ПравоДобавление, | ИСТИНА КАК ЭтоПраваНабораГрупп, | СУММА(ВсеСтроки.ВидИзмененияСтроки) КАК ВидИзмененияСтроки |ИЗ | (ВЫБРАТЬ | КлючиДоступаГруппДоступа.КлючДоступа КАК КлючДоступа, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Изменение) КАК Изменение, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Добавление) КАК Добавление, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоИзменение) КАК ПравоИзменение, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоДобавление) КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -16358,8 +16814,8 @@ | | ВЫБРАТЬ | СтарыеДанные.КлючДоступа, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК СтарыеДанные @@ -16370,8 +16826,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.КлючДоступа, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -16643,7 +17099,7 @@ |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ - | ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | ГруппыДоступа.Профиль <> &ПрофильАдминистратор | И НЕ ГруппыДоступа.ПометкаУдаления | И НЕ ГруппыДоступа.Профиль.ПометкаУдаления | И ИСТИНА В @@ -16683,7 +17139,7 @@ |ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа |ГДЕ - | ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) + | ГруппыДоступа.Профиль <> &ПрофильАдминистратор | И НЕ ГруппыДоступа.ПометкаУдаления | И НЕ ГруппыДоступа.Профиль.ПометкаУдаления | И ИСТИНА В @@ -16801,6 +17257,7 @@ ТекстЗапросаГрупп, ТекстЗапросаНовыхНаборовГрупп, ИмяПоляНабора, ИмяСправочникаГрупп) Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); Запрос.Текст = ТекстЗапросаГрупп; НомераГрупп = Запрос.Выполнить().Выгрузить(); @@ -17265,7 +17722,7 @@ "ВЫБРАТЬ | СуществующиеНаборы.Ссылка КАК СсылкаНабора, | СуществующиеНаборы.Группы.( - | Группа КАК Группа + | Группы.Группа КАК Группа | ) КАК ГруппыНабора |ИЗ | Справочник.НаборыГруппДоступа КАК СуществующиеНаборы @@ -17666,6 +18123,7 @@ // Обновление групп доступа в регистре КлючиДоступаГруппДоступа. ЗапросГрупп = Новый Запрос; ЗапросГрупп.УстановитьПараметр("КлючДоступа", РазрешенныйКлючДоступа); + ЗапросГрупп.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); ЗапросГрупп.Текст = ТекстЗапросаВыбораРазличийГруппДоступаРазрешенногоКлюча(); УстановитьУсловиеОтбораВЗапросе(ЗапросГрупп, ГруппыДоступа, "ГруппыДоступа", "&УсловиеОтбораГруппДоступа1:ГруппыДоступа.Ссылка @@ -17722,20 +18180,20 @@ ТекстЗапроса = "ВЫБРАТЬ | ВсеСтроки.ГруппаДоступа КАК ГруппаДоступа, - | ВсеСтроки.Изменение КАК Изменение, - | ВсеСтроки.Добавление КАК Добавление, + | ВсеСтроки.ПравоИзменение КАК ПравоИзменение, + | ВсеСтроки.ПравоДобавление КАК ПравоДобавление, | СУММА(ВсеСтроки.ВидИзмененияСтроки) КАК ВидИзмененияСтроки |ИЗ | (ВЫБРАТЬ | ГруппыДоступа.Ссылка КАК ГруппаДоступа, - | ИСТИНА КАК Изменение, - | ИСТИНА КАК Добавление, + | ИСТИНА КАК ПравоИзменение, + | ИСТИНА КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | Справочник.ГруппыДоступа КАК ГруппыДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа | ПО ГруппыДоступа.Профиль = ПрофилиГруппДоступа.Ссылка - | И (ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)) + | И (ГруппыДоступа.Профиль <> &ПрофильАдминистратор) | И (НЕ ГруппыДоступа.ПометкаУдаления) | И (НЕ ПрофилиГруппДоступа.ПометкаУдаления) | И (&УсловиеОтбораГруппДоступа1) @@ -17752,8 +18210,8 @@ | | ВЫБРАТЬ | СтарыеДанные.ГруппаДоступа, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК СтарыеДанные @@ -17763,8 +18221,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.ГруппаДоступа, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -18236,12 +18694,14 @@ КлючиЗначенийСтрокКлючей = КлючиЗначенийСтрокОбъектов(РезультатыЗапросаЗначенийКлючей, ?(СтрНачинаетсяС(ТаблицыКлюча[0], "Шапка"), 0, 1), ТаблицыКлюча); + Выборка = РезультатыЗапросаЗначенийКлючей[0].Выбрать(); - Для Каждого ОписаниеКлючаДоступа Из КлючиЗначенийСтрокКлючей Цикл - СтрокаДляХеша = СтрокаДляХешаКлючаДоступа(ОписаниеКлючаДоступа.Значение, ТаблицыКлюча); + Пока Выборка.Следующий() Цикл + ОписаниеКлючейЗначений = КлючиЗначенийСтрокКлючей.Получить(Выборка.ТекущаяСсылка); + СтрокаДляХеша = СтрокаДляХешаКлючаДоступа(ОписаниеКлючейЗначений, ТаблицыКлюча); Свойства = ДанныеСтроковыхКлючейДоступа.Получить(СтрокаДляХеша); Если Свойства <> Неопределено И Свойства.КлючДоступа = Неопределено Тогда - Свойства.КлючДоступа = ОписаниеКлючаДоступа.Ключ; + Свойства.КлючДоступа = Выборка.ТекущаяСсылка; КонецЕсли; КонецЦикла; @@ -18268,8 +18728,9 @@ Если ПараметрыОбновления.Свойство("МодельОбъектовВПамяти") Тогда ИмяПоляКлюча = ?(ПараметрыОбновления.ДляВнешнихПользователей, "КлючДоступаВнешнихПользователей", "КлючДоступаПользователей"); + КлючиДоступаКОбъектам = ПараметрыОбновления.МодельОбъектовВПамяти.КлючиДоступаКОбъектам; // РегистрСведенийНаборЗаписей Для Каждого ОписаниеКлючаДоступаОбъекта Из ОписаниеКлючейДоступаОбъектов Цикл - НоваяСтрока = ПараметрыОбновления.МодельОбъектовВПамяти.КлючиДоступаКОбъектам.Добавить(); + НоваяСтрока = КлючиДоступаКОбъектам.Добавить(); НоваяСтрока.Объект = ОписаниеКлючаДоступаОбъекта.ТекущаяСсылка; НоваяСтрока[ИмяПоляКлюча] = ОписаниеКлючаДоступаОбъекта.СвойстваКлюча.КлючДоступа; КонецЦикла; @@ -18948,8 +19409,20 @@ ЗаполнитьПраваНаВедущиеКлючиДоступаИВедущиеСписки(РезультатыЗапроса, НомерТаблицы, ПараметрыОбновления); ЗаполнитьПраваПоВладельцамНастроекПрав(РезультатыЗапроса, НомерТаблицы, ПараметрыОбновления); - ЗаполнитьПраваИУчастниковГруппДоступаСписка(ПараметрыОбновления); - ЗаполнитьЗначенияГруппДоступаДляРасчетаПрав(ПараметрыОбновления); + КэшРасчетаПрав = КэшРасчетаПравДляВидаПользователей(ПараметрыОбновления.ДляВнешнихПользователей); + Если Не ПараметрыОбновления.Кэш.Свойство("ПраваРолейФункцииПравоДоступа") + Или КэшРасчетаПрав.РолиПрофилейГруппДоступа = Неопределено Тогда + ПараметрыОбновления.Кэш.Вставить("ПраваРолейФункцииПравоДоступа", Новый Соответствие); + ПараметрыОбновления.Кэш.Вставить("ОбъектыМетаданныхФункцииПравоДоступа", Новый Соответствие); + ПараметрыОбновления.Кэш.Вставить("ПраваПрофилейФункцииПравоДоступа", Новый Соответствие); + КонецЕсли; + + ЗаполнитьПраваГруппДоступаСписка(ПараметрыОбновления, КэшРасчетаПрав); + ЗаполнитьЗначенияГруппДоступаДляРасчетаПрав(ПараметрыОбновления, КэшРасчетаПрав); + ЗаполнитьПользователейГруппПользователей(ПараметрыОбновления, КэшРасчетаПрав); + ЗаполнитьУчастниковГруппДоступаСписка(ПараметрыОбновления, КэшРасчетаПрав); + ЗаполнитьГруппыПользователейКакЗначенияДоступа(ПараметрыОбновления, КэшРасчетаПрав); + ЗаполнитьРолиИГруппыДоступаПрофилей(ПараметрыОбновления, КэшРасчетаПрав); ЗначенияПервойТаблицы = ЗначенияТаблицКлючей.Получить(ПараметрыОбновления.ТаблицыКлюча[0]); ИндексПоследнегоКлюча = ЗначенияПервойТаблицы.Строки.Количество() - 1; @@ -19124,11 +19597,87 @@ КонецПроцедуры // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. -Процедура ЗаполнитьПраваИУчастниковГруппДоступаСписка(ПараметрыОбновления) +// +// Возвращаемое значение: +// Структура: +// * ПраваГруппДоступаСписков - Соответствие +// * ЗначенияГруппДоступа - Соответствие +// - Неопределено +// * УчастникиГруппДоступа - Соответствие +// - Неопределено +// * ПользователиГруппПользователей - Соответствие +// - Неопределено +// * ГруппыПользователейГруппДоступа - Соответствие +// - Неопределено +// * ГруппыПользователейКакЗначенияДоступа - Соответствие +// - Неопределено +// * РолиПрофилейГруппДоступа - ТаблицаЗначений +// - Неопределено +// * ГруппыДоступаПрофилей - ТаблицаЗначений +// - Неопределено +// +Функция КэшРасчетаПравДляВидаПользователей(ДляВнешнихПользователей) Экспорт - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Таблица", ПараметрыОбновления.ИдентификаторСписка); - Запрос.Текст = + КлючДанныхПовторногоИспользования = Строка(ПараметрыСеанса.КлючДанныхПовторногоИспользования); + Кэш = УправлениеДоступомСлужебныйПовтИсп.КэшРасчетаПрав(КлючДанныхПовторногоИспользования); + + ВерсияДанных = ВерсияДанныхДляКэшаРасчетаПрав(); + + Если Кэш.ВерсияДанных.ТаблицыГруппДоступа <> ВерсияДанных.ТаблицыГруппДоступа Тогда + СброситьКэшРасчетаПрав(Кэш, "ПраваГруппДоступаСписков", Истина); + Кэш.ВерсияДанных.ТаблицыГруппДоступа = ВерсияДанных.ТаблицыГруппДоступа; + КонецЕсли; + + Если Кэш.ВерсияДанных.ЗначенияГруппДоступа <> ВерсияДанных.ЗначенияГруппДоступа Тогда + СброситьКэшРасчетаПрав(Кэш, "ЗначенияГруппДоступа"); + СброситьКэшРасчетаПрав(Кэш, "ГруппыПользователейКакЗначенияДоступа"); + Кэш.ВерсияДанных.ЗначенияГруппДоступа = ВерсияДанных.ЗначенияГруппДоступа; + КонецЕсли; + + Если Кэш.ВерсияДанных.УчастникиГруппДоступа <> ВерсияДанных.УчастникиГруппДоступа Тогда + СброситьКэшРасчетаПрав(Кэш, "УчастникиГруппДоступа"); + СброситьКэшРасчетаПрав(Кэш, "ГруппыПользователейГруппДоступа"); + Кэш.ВерсияДанных.УчастникиГруппДоступа = ВерсияДанных.УчастникиГруппДоступа; + КонецЕсли; + + Если Кэш.ВерсияДанных.СоставыГруппПользователей <> ВерсияДанных.СоставыГруппПользователей Тогда + СброситьКэшРасчетаПрав(Кэш, "ПользователиГруппПользователей"); + СброситьКэшРасчетаПрав(Кэш, "УчастникиГруппДоступа"); + СброситьКэшРасчетаПрав(Кэш, "ГруппыПользователейГруппДоступа"); + СброситьКэшРасчетаПрав(Кэш, "ГруппыПользователейКакЗначенияДоступа"); + Кэш.ВерсияДанных.СоставыГруппПользователей = ВерсияДанных.СоставыГруппПользователей; + КонецЕсли; + + Если Кэш.ВерсияДанных.РолиПрофилейГруппДоступа <> ВерсияДанных.РолиПрофилейГруппДоступа Тогда + СброситьКэшРасчетаПрав(Кэш, "РолиПрофилейГруппДоступа"); + СброситьКэшРасчетаПрав(Кэш, "ГруппыДоступаПрофилей"); + Кэш.ВерсияДанных.РолиПрофилейГруппДоступа = ВерсияДанных.РолиПрофилейГруппДоступа; + КонецЕсли; + + Если Кэш.ВерсияДанных.ГруппыДоступаПрофилей <> ВерсияДанных.ГруппыДоступаПрофилей Тогда + СброситьКэшРасчетаПрав(Кэш, "РолиПрофилейГруппДоступа"); + СброситьКэшРасчетаПрав(Кэш, "ГруппыДоступаПрофилей"); + Кэш.ВерсияДанных.ГруппыДоступаПрофилей = ВерсияДанных.ГруппыДоступаПрофилей; + КонецЕсли; + + Возврат Кэш[?(ДляВнешнихПользователей, "ДляВнешнихПользователей", "ДляПользователей")]; + +КонецФункции + +// Для функции КэшРасчетаПравДляВидаПользователей. +Процедура СброситьКэшРасчетаПрав(Кэш, Свойство, НовоеСоответствие = Ложь) + + Кэш.ДляПользователей[Свойство] = ?(НовоеСоответствие, Новый Соответствие, Неопределено); + Кэш.ДляВнешнихПользователей[Свойство] = ?(НовоеСоответствие, Новый Соответствие, Неопределено); + +КонецПроцедуры + +// Для процедур ЗаполнитьПраваГруппДоступаСписка и +// ЗаполнитьУчастниковГруппДоступаСписка. +// +Функция ТекстЗапросаНазначенияПрофилей() + + Возврат "ВЫБРАТЬ | Профили.Ссылка КАК Профиль, | МАКСИМУМ(ВЫБОР @@ -19149,17 +19698,30 @@ | ПО (НазначениеПрофилей.Ссылка = Профили.Ссылка) | |СГРУППИРОВАТЬ ПО - | Профили.Ссылка - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ + | Профили.Ссылка"; + +КонецФункции + +// Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. +Процедура ЗаполнитьПраваГруппДоступаСписка(ПараметрыОбновления, Кэш) + + ИдентификаторСписка = ПараметрыОбновления.ИдентификаторСписка; + ПраваГруппДоступаСписка = Кэш.ПраваГруппДоступаСписков.Получить(ИдентификаторСписка); + Если ПраваГруппДоступаСписка <> Неопределено Тогда + ПараметрыОбновления.Вставить("ПраваГруппДоступаСписка", ПраваГруппДоступаСписка); + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Таблица", ИдентификаторСписка); + Запрос.Текст = + "ВЫБРАТЬ | ТаблицыГруппДоступа.ГруппаДоступа КАК ГруппаДоступа, - | ТаблицыГруппДоступа.Изменение КАК Изменение, - | ТаблицыГруппДоступа.Добавление КАК Добавление, - | ТаблицыГруппДоступа.ЧтениеБезОграничения КАК ЧтениеБезОграничения, - | ТаблицыГруппДоступа.ИзменениеБезОграничения КАК ИзменениеБезОграничения, - | ТаблицыГруппДоступа.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения + | ТаблицыГруппДоступа.ПравоИзменение КАК ПравоИзменение, + | ТаблицыГруппДоступа.ПравоДобавление КАК ПравоДобавление, + | ТаблицыГруппДоступа.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + | ТаблицыГруппДоступа.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + | ТаблицыГруппДоступа.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения |ИЗ | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа @@ -19167,114 +19729,141 @@ | И (ГруппыДоступа.Ссылка = ТаблицыГруппДоступа.ГруппаДоступа) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ НазначениеПрофилей КАК НазначениеПрофилей | ПО (НазначениеПрофилей.Профиль = ГруппыДоступа.Профиль) - | И (НазначениеПрофилей.ДляПользователей) - | И (&УточнениеПланаЗапроса)"; + | И (НазначениеПрофилей.ДляПользователей)"; - ТекстЗапросаУчастников = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ГруппыДоступа.Ссылка КАК Ссылка - |ПОМЕСТИТЬ ГруппыДоступа - |ИЗ - | (ВЫБРАТЬ - | ТаблицыГруппДоступа.ГруппаДоступа КАК Ссылка - | ИЗ - | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа - | ПО (ТаблицыГруппДоступа.Таблица = &Таблица) - | И (ГруппыДоступа.Ссылка = ТаблицыГруппДоступа.ГруппаДоступа) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ НазначениеПрофилей КАК НазначениеПрофилей - | ПО (НазначениеПрофилей.Профиль = ГруппыДоступа.Профиль) - | И (НазначениеПрофилей.ДляПользователей) - | И (&УточнениеПланаЗапроса) - | - | ОБЪЕДИНИТЬ ВСЕ - | - | ВЫБРАТЬ - | ГруппыДоступа.Ссылка - | ИЗ - | Справочник.ГруппыДоступа КАК ГруппыДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ НазначениеПрофилей КАК НазначениеПрофилей - | ПО (НазначениеПрофилей.Профиль = ГруппыДоступа.Профиль) - | И (НазначениеПрофилей.ДляПользователей) - | И (ГруппыДоступа.Ссылка В (&ДополнительныеГруппыДоступа))) КАК ГруппыДоступа - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ГруппыПользователей.Ссылка КАК Ссылка - |ПОМЕСТИТЬ ГруппыПользователей - |ИЗ - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | ПользователиГруппыДоступа.Пользователь КАК Ссылка - | ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ПользователиГруппыДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГруппыДоступа КАК ГруппыДоступа - | ПО (ГруппыДоступа.Ссылка = ПользователиГруппыДоступа.Ссылка) - | И (ТИПЗНАЧЕНИЯ(ПользователиГруппыДоступа.Пользователь) = ТИП(Справочник.ГруппыПользователей)) - | ГДЕ - | &УточнениеПланаЗапроса - | - | ОБЪЕДИНИТЬ ВСЕ - | - | ВЫБРАТЬ - | ГруппыПользователей.Ссылка - | ИЗ - | Справочник.ГруппыПользователей КАК ГруппыПользователей - | ГДЕ - | ГруппыПользователей.Ссылка В(&ДополнительныеГруппыПользователей)) КАК ГруппыПользователей - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ + Если ПараметрыОбновления.ДляВнешнихПользователей Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "НазначениеПрофилей.ДляПользователей", "НазначениеПрофилей.ДляВнешнихПользователей"); + КонецЕсли; + + Запрос.Текст = ТекстЗапросаНазначенияПрофилей() + + ОбщегоНазначения.РазделительПакетаЗапросов() + Запрос.Текст; + + ПраваГруппДоступаСписка = Запрос.Выполнить().Выгрузить(); + Кэш.ПраваГруппДоступаСписков.Вставить(ИдентификаторСписка, ПраваГруппДоступаСписка); + ПараметрыОбновления.Вставить("ПраваГруппДоступаСписка", ПраваГруппДоступаСписка); + +КонецПроцедуры + +// Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. +Процедура ЗаполнитьПользователейГруппПользователей(ПараметрыОбновления, Кэш) + + ПараметрыОбновления.Вставить("ПользователиГруппПользователей", Новый Соответствие); + + Если Не ПараметрыОбновления.РассчитыватьПраваПользователей Тогда + Возврат; + КонецЕсли; + + Если Кэш.ПользователиГруппПользователей <> Неопределено Тогда + ПараметрыОбновления.ПользователиГруппПользователей = Кэш.ПользователиГруппПользователей; + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ | СоставыГруппПользователей.ГруппаПользователей КАК ГруппаПользователей, | СоставыГруппПользователей.Пользователь КАК Пользователь |ИЗ | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГруппыПользователей КАК ГруппыПользователей - | ПО (ГруппыПользователей.Ссылка = СоставыГруппПользователей.ГруппаПользователей) - | И (СоставыГруппПользователей.Используется) | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи | ПО (Пользователи.Ссылка = СоставыГруппПользователей.Пользователь) | И (Пользователи.ИдентификаторПользователяИБ <> &ПустойУникальныйИдентификатор) - | И (&УточнениеПланаЗапроса) + | И (ТИПЗНАЧЕНИЯ(СоставыГруппПользователей.ГруппаПользователей) = ТИП(Справочник.ГруппыПользователей)) + | И (СоставыГруппПользователей.Используется) |ИТОГИ ПО - | ГруппаПользователей - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЗначенияГруппДоступа.ЗначениеДоступа КАК Ссылка - |ПОМЕСТИТЬ ГруппыПользователейКакЗначенияДоступа - |ИЗ - | РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГруппыДоступа КАК ГруппыДоступа - | ПО (ГруппыДоступа.Ссылка = ЗначенияГруппДоступа.ГруппаДоступа) - | И (ТИПЗНАЧЕНИЯ(ЗначенияГруппДоступа.ЗначениеДоступа) = ТИП(Справочник.ГруппыПользователей)) - |ГДЕ - | &УточнениеПланаЗапроса - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ + | ГруппаПользователей"; + + Если ПараметрыОбновления.ДляВнешнихПользователей Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "Справочник.Пользователи", "Справочник.ВнешниеПользователи"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "Справочник.ГруппыПользователей", "Справочник.ГруппыВнешнихПользователей"); + КонецЕсли; + + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + + ПользователиГруппПользователей = ПараметрыОбновления.ПользователиГруппПользователей; + + РезультатЗапроса = Запрос.Выполнить(); + ЗаполнитьПользователейГрупп(ПользователиГруппПользователей, РезультатЗапроса); + + Кэш.ПользователиГруппПользователей = ПользователиГруппПользователей; + +КонецПроцедуры + +// Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. +Процедура ЗаполнитьГруппыПользователейКакЗначенияДоступа(ПараметрыОбновления, Кэш) + + ПараметрыОбновления.Вставить("ГруппыПользователейКакЗначенияДоступа", Новый Соответствие); + + Если Не ПараметрыОбновления.РассчитыватьПраваПользователей Тогда + Возврат; + КонецЕсли; + + Если Кэш.ГруппыПользователейКакЗначенияДоступа <> Неопределено Тогда + ПараметрыОбновления.ГруппыПользователейКакЗначенияДоступа = Кэш.ГруппыПользователейКакЗначенияДоступа; + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ | СоставыГруппПользователей.ГруппаПользователей КАК ГруппаПользователей, | СоставыГруппПользователей.Пользователь КАК Пользователь |ИЗ | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГруппыПользователейКакЗначенияДоступа КАК ГруппыПользователейКакЗначенияДоступа - | ПО (ГруппыПользователейКакЗначенияДоступа.Ссылка = СоставыГруппПользователей.ГруппаПользователей) - | И (&УточнениеПланаЗапроса) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа + | ПО СоставыГруппПользователей.ГруппаПользователей = ЗначенияГруппДоступа.ЗначениеДоступа + | И (ТИПЗНАЧЕНИЯ(СоставыГруппПользователей.ГруппаПользователей) = ТИП(Справочник.ГруппыПользователей)) + | И (ТИПЗНАЧЕНИЯ(ЗначенияГруппДоступа.ЗначениеДоступа) = ТИП(Справочник.ГруппыПользователей)) |ИТОГИ ПО - | ГруппаПользователей - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ГруппаПользователей"; + + Если ПараметрыОбновления.ДляВнешнихПользователей Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "Справочник.ГруппыПользователей", "Справочник.ГруппыВнешнихПользователей"); + КонецЕсли; + + ГруппыПользователейКакЗначенияДоступа = ПараметрыОбновления.ГруппыПользователейКакЗначенияДоступа; + + РезультатЗапроса = Запрос.Выполнить(); + ЗаполнитьПользователейГрупп(ГруппыПользователейКакЗначенияДоступа, РезультатЗапроса); + + Кэш.ГруппыПользователейКакЗначенияДоступа = ГруппыПользователейКакЗначенияДоступа; + +КонецПроцедуры + +// Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. +Процедура ЗаполнитьУчастниковГруппДоступаСписка(ПараметрыОбновления, Кэш) + + ПараметрыОбновления.Вставить("УчастникиГруппДоступа", Новый Соответствие); + ПараметрыОбновления.Вставить("ГруппыПользователейГруппДоступа", Новый Соответствие); + + Если Не ПараметрыОбновления.РассчитыватьПраваПользователей Тогда + Возврат; + КонецЕсли; + + Если Кэш.УчастникиГруппДоступа <> Неопределено Тогда + ПараметрыОбновления.УчастникиГруппДоступа = Кэш.УчастникиГруппДоступа; + ПараметрыОбновления.ГруппыПользователейГруппДоступа = Кэш.ГруппыПользователейГруппДоступа; + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ | ПользователиГруппыДоступа.Ссылка КАК ГруппаДоступа, | ПользователиГруппыДоступа.Пользователь КАК Участник |ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ПользователиГруппыДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГруппыДоступа КАК ГруппыДоступа - | ПО (ГруппыДоступа.Ссылка = ПользователиГруппыДоступа.Ссылка) + | Справочник.ГруппыДоступа КАК ГруппыДоступа + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ НазначениеПрофилей КАК НазначениеПрофилей + | ПО (НазначениеПрофилей.Профиль = ГруппыДоступа.Профиль) + | И (НазначениеПрофилей.ДляПользователей) + | И (НЕ ГруппыДоступа.ПометкаУдаления) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ПользователиГруппыДоступа + | ПО (ПользователиГруппыДоступа.Ссылка = ГруппыДоступа.Ссылка) | И (ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА @@ -19286,143 +19875,60 @@ | И СоставыГруппПользователей.Используется | И Пользователи.Ссылка = СоставыГруппПользователей.Пользователь | И Пользователи.ИдентификаторПользователяИБ <> &ПустойУникальныйИдентификатор)) - | И (&УточнениеПланаЗапроса) |ИТОГИ ПО | ГруппаДоступа"; - Если ПараметрыОбновления.РассчитыватьПраваПользователей Тогда - Если ПараметрыОбновления.ДляВнешнихПользователей Тогда - ТекстЗапросаУчастников = СтрЗаменить(ТекстЗапросаУчастников, - "Справочник.Пользователи", "Справочник.ВнешниеПользователи"); - ТекстЗапросаУчастников = СтрЗаменить(ТекстЗапросаУчастников, - "Справочник.ГруппыПользователей", "Справочник.ГруппыВнешнихПользователей"); - КонецЕсли; - - Запрос.Текст = Запрос.Текст + ОбщегоНазначения.РазделительПакетаЗапросов() + ТекстЗапросаУчастников; - Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", - ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); - - ДополнительныеГруппыДоступа = Новый Массив; - ДополнительныеГруппыПользователей = Новый Массив; - Запрос.УстановитьПараметр("ДополнительныеГруппыДоступа", ДополнительныеГруппыДоступа); - Запрос.УстановитьПараметр("ДополнительныеГруппыПользователей", ДополнительныеГруппыПользователей); - - ДобавленныеГруппыДоступа = Новый Соответствие; - ДобавленныеГруппыПользователей = Новый Соответствие; - ТипГруппыДоступа = ПараметрыОбновления.ТипГруппыДоступа; - ТипГруппыПользователей = ПараметрыОбновления.ТипГруппыПользователей; - - Для Каждого КлючИЗначение Из ПараметрыОбновления.ПраваНаВедущиеКлючиДоступа Цикл - Для Каждого ОписаниеПрав Из КлючИЗначение.Значение Цикл - Если ТипЗнч(ОписаниеПрав.Ключ) = ТипГруппыДоступа Тогда - Если ДобавленныеГруппыДоступа.Получить(ОписаниеПрав.Ключ) <> Неопределено Тогда - ДобавленныеГруппыДоступа.Вставить(ОписаниеПрав.Ключ, Истина); - ДополнительныеГруппыДоступа.Добавить(ОписаниеПрав.Ключ); - КонецЕсли; - ИначеЕсли ТипЗнч(ОписаниеПрав.Ключ) = ТипГруппыПользователей Тогда - Если ДобавленныеГруппыПользователей.Получить(ОписаниеПрав.Ключ) <> Неопределено Тогда - ДобавленныеГруппыПользователей.Вставить(ОписаниеПрав.Ключ, Истина); - ДополнительныеГруппыПользователей.Добавить(ОписаниеПрав.Ключ); - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЦикла; - Для Каждого КлючИЗначение Из ПараметрыОбновления.ПраваПоВладельцамНастроекПрав Цикл - Для Каждого ОписаниеПрав Из КлючИЗначение.Значение Цикл - Если ТипЗнч(ОписаниеПрав.Ключ) = ТипГруппыПользователей Тогда - Если ДобавленныеГруппыПользователей.Получить(ОписаниеПрав.Ключ) <> Неопределено Тогда - ДобавленныеГруппыПользователей.Вставить(ОписаниеПрав.Ключ, Истина); - ДополнительныеГруппыПользователей.Добавить(ОписаниеПрав.Ключ); - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЦикла; - КонецЕсли; - Если ПараметрыОбновления.ДляВнешнихПользователей Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "НазначениеПрофилей.ДляПользователей", "НазначениеПрофилей.ДляВнешнихПользователей"); - КонецЕсли; - УстановитьУточнениеПланаЗапроса(Запрос.Текст); - - РезультатыЗапроса = Запрос.ВыполнитьПакет(); - - Выборка = РезультатыЗапроса[1].Выбрать(); - ПраваГруппДоступаСписка = Новый Соответствие; - - Пока Выборка.Следующий() Цикл - ПраваГруппыДоступа = НовыеПраваГруппыДоступа(Выборка); - ПраваГруппДоступаСписка.Вставить(Выборка.ГруппаДоступа, ПраваГруппыДоступа); - КонецЦикла; - ПараметрыОбновления.Вставить("ПраваГруппДоступаСписка", ПраваГруппДоступаСписка); - - ПараметрыОбновления.Вставить("ПользователиГруппПользователей", Новый Соответствие); - Если ПараметрыОбновления.РассчитыватьПраваПользователей Тогда - ЗаполнитьПользователейГруппПользователей(ПараметрыОбновления.ПользователиГруппПользователей, - РезультатыЗапроса[4]); + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "Справочник.Пользователи", "Справочник.ВнешниеПользователи"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "Справочник.ГруппыПользователей", "Справочник.ГруппыВнешнихПользователей"); КонецЕсли; - ПараметрыОбновления.Вставить("ГруппыПользователейКакЗначенияДоступа", Новый Соответствие); - Если ПараметрыОбновления.РассчитыватьПраваПользователей Тогда - ЗаполнитьПользователейГруппПользователей(ПараметрыОбновления.ГруппыПользователейКакЗначенияДоступа, - РезультатыЗапроса[6]); - КонецЕсли; + Запрос.Текст = ТекстЗапросаНазначенияПрофилей() + + ОбщегоНазначения.РазделительПакетаЗапросов() + Запрос.Текст; - УчастникиГруппДоступа = Новый Соответствие; - ГруппыПользователейГруппДоступа = Новый Соответствие; + Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор", + ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); + + УчастникиГруппДоступа = ПараметрыОбновления.УчастникиГруппДоступа; + ГруппыПользователейГруппДоступа = ПараметрыОбновления.ГруппыПользователейГруппДоступа; ТипГруппыПользователей = ПараметрыОбновления.ТипГруппыПользователей; ПользователиГруппПользователей = ПараметрыОбновления.ПользователиГруппПользователей; - Если ПараметрыОбновления.РассчитыватьПраваПользователей Тогда - Дерево = РезультатыЗапроса[7].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); - Для Каждого Строка Из Дерево.Строки Цикл - УчастникиГруппыДоступа = Новый Соответствие; - ГруппыПользователейГруппыДоступа = Новый Соответствие; - Для Каждого Подстрока Из Строка.Строки Цикл - УчастникиГруппыДоступа.Вставить(Подстрока.Участник, Истина); - Если ТипЗнч(Подстрока.Участник) = ТипГруппыПользователей Тогда - ПользователиГруппы = ПользователиГруппПользователей.Получить(Подстрока.Участник); - Если ПользователиГруппы <> Неопределено Тогда - ГруппыПользователейГруппыДоступа.Вставить(Подстрока.Участник, ПользователиГруппы); - КонецЕсли; + Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); + + Для Каждого Строка Из Дерево.Строки Цикл + УчастникиГруппыДоступа = Новый Соответствие; + ГруппыПользователейГруппыДоступа = Новый Соответствие; + Для Каждого Подстрока Из Строка.Строки Цикл + УчастникиГруппыДоступа.Вставить(Подстрока.Участник, Истина); + Если ТипЗнч(Подстрока.Участник) = ТипГруппыПользователей Тогда + ПользователиГруппы = ПользователиГруппПользователей.Получить(Подстрока.Участник); + Если ПользователиГруппы <> Неопределено Тогда + ГруппыПользователейГруппыДоступа.Вставить(Подстрока.Участник, ПользователиГруппы); КонецЕсли; - КонецЦикла; - Если УчастникиГруппыДоступа.Количество() > 0 Тогда - УчастникиГруппДоступа.Вставить(Строка.ГруппаДоступа, УчастникиГруппыДоступа); - КонецЕсли; - Если ГруппыПользователейГруппыДоступа.Количество() > 0 Тогда - ГруппыПользователейГруппДоступа.Вставить(Строка.ГруппаДоступа, ГруппыПользователейГруппыДоступа); КонецЕсли; КонецЦикла; - КонецЕсли; - ПараметрыОбновления.Вставить("УчастникиГруппДоступа", УчастникиГруппДоступа); - ПараметрыОбновления.Вставить("ГруппыПользователейГруппДоступа", ГруппыПользователейГруппДоступа); + Если УчастникиГруппыДоступа.Количество() > 0 Тогда + УчастникиГруппДоступа.Вставить(Строка.ГруппаДоступа, УчастникиГруппыДоступа); + КонецЕсли; + Если ГруппыПользователейГруппыДоступа.Количество() > 0 Тогда + ГруппыПользователейГруппДоступа.Вставить(Строка.ГруппаДоступа, ГруппыПользователейГруппыДоступа); + КонецЕсли; + КонецЦикла; + + Кэш.УчастникиГруппДоступа = УчастникиГруппДоступа; + Кэш.ГруппыПользователейГруппДоступа = ГруппыПользователейГруппДоступа; КонецПроцедуры -// Возвращаемое значение: -// Структура: -// * Изменение - Булево -// * Добавление - Булево -// * ЧтениеБезОграничения - Булево -// * ИзменениеБезОграничения - Булево -// * ДобавлениеБезОграничения - Булево +// Для процедур ЗаполнитьПользователейГруппПользователей и +// ЗаполнитьГруппыПользователейКакЗначенияДоступа. // -Функция НовыеПраваГруппыДоступа(Выборка) - - ПраваГруппыДоступа = Новый Структура; - ПраваГруппыДоступа.Вставить("Изменение", Выборка.Изменение); - ПраваГруппыДоступа.Вставить("Добавление", Выборка.Добавление); - ПраваГруппыДоступа.Вставить("ЧтениеБезОграничения", Выборка.ЧтениеБезОграничения); - ПраваГруппыДоступа.Вставить("ИзменениеБезОграничения", Выборка.ИзменениеБезОграничения); - ПраваГруппыДоступа.Вставить("ДобавлениеБезОграничения", Выборка.ДобавлениеБезОграничения); - - Возврат ПраваГруппыДоступа; - -КонецФункции - -// Для процедуры ЗаполнитьПраваИУчастниковГруппДоступаСписка. -Процедура ЗаполнитьПользователейГруппПользователей(ПользователиГруппПользователей, РезультатЗапроса) +Процедура ЗаполнитьПользователейГрупп(ПользователиГруппПользователей, РезультатЗапроса) Дерево = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); Для Каждого Строка Из Дерево.Строки Цикл @@ -19436,32 +19942,13 @@ КонецПроцедуры // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. -Процедура ЗаполнитьЗначенияГруппДоступаДляРасчетаПрав(ПараметрыОбновления) +Процедура ЗаполнитьЗначенияГруппДоступаДляРасчетаПрав(ПараметрыОбновления, Кэш) - Если Не ПараметрыОбновления.Кэш.Свойство("ЗначенияГруппДоступаВерсия") Тогда - ПараметрыОбновления.Кэш.Вставить("ЗначенияГруппДоступаВерсия", Новый УникальныйИдентификатор); - КонецЕсли; - - ИмяПараметраВерсии = "СтандартныеПодсистемы.УправлениеДоступом.ЗначенияГруппДоступаВерсия"; - ЗначенияГруппДоступаВерсия = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметраВерсии, Истина); - - Если ПараметрыОбновления.Кэш.ЗначенияГруппДоступаВерсия = ЗначенияГруппДоступаВерсия Тогда - ПараметрыОбновления.Вставить("ЗначенияГруппДоступа", ПараметрыОбновления.Кэш.ЗначенияГруппДоступа); + Если Кэш.ЗначенияГруппДоступа <> Неопределено Тогда + ПараметрыОбновления.Вставить("ЗначенияГруппДоступа", Кэш.ЗначенияГруппДоступа); Возврат; КонецЕсли; - ИмяПараметра = "СтандартныеПодсистемы.УправлениеДоступом.ЗначенияГруппДоступа"; - ЗначенияГруппДоступа = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина); - - Если ЗначенияГруппДоступаВерсия <> Неопределено И ЗначенияГруппДоступа <> Неопределено Тогда - ПараметрыОбновления.Кэш.Вставить("ЗначенияГруппДоступаВерсия", ЗначенияГруппДоступаВерсия); - ПараметрыОбновления.Кэш.Вставить("ЗначенияГруппДоступа", ЗначенияГруппДоступа); - ПараметрыОбновления.Вставить("ЗначенияГруппДоступа", ЗначенияГруппДоступа); - Возврат; - КонецЕсли; - - ЗначенияГруппДоступаВерсия = Новый УникальныйИдентификатор; - Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -19520,36 +20007,101 @@ КонецЦикла; КонецЦикла; - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПараметрыРаботыВерсийРасширений"); - ЭлементБлокировки.УстановитьЗначение("ВерсияРасширений", Справочники.ВерсииРасширений.ПустаяСсылка()); - ЭлементБлокировки.УстановитьЗначение("ИмяПараметра", ИмяПараметра); - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПараметрыРаботыВерсийРасширений"); - ЭлементБлокировки.УстановитьЗначение("ВерсияРасширений", Справочники.ВерсииРасширений.ПустаяСсылка()); - ЭлементБлокировки.УстановитьЗначение("ИмяПараметра", ИмяПараметраВерсии); - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - ТекущиеЗначенияГруппДоступаВерсия = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметраВерсии, Истина); - ТекущиеЗначенияГруппДоступа = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина); - - Если ТекущиеЗначенияГруппДоступаВерсия <> Неопределено И ТекущиеЗначенияГруппДоступа <> Неопределено Тогда - ЗначенияГруппДоступаВерсия = ТекущиеЗначенияГруппДоступаВерсия; - ЗначенияГруппДоступа = ТекущиеЗначенияГруппДоступа; - Иначе - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметраВерсии, ЗначенияГруппДоступаВерсия, Истина); - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, ЗначенияГруппДоступа, Истина); - КонецЕсли; - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - ПараметрыОбновления.Кэш.Вставить("ЗначенияГруппДоступаВерсия", ЗначенияГруппДоступаВерсия); - ПараметрыОбновления.Кэш.Вставить("ЗначенияГруппДоступа", ЗначенияГруппДоступа); ПараметрыОбновления.Вставить("ЗначенияГруппДоступа", ЗначенияГруппДоступа); + Кэш.ЗначенияГруппДоступа = ЗначенияГруппДоступа; + +КонецПроцедуры + +// Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. +Процедура ЗаполнитьРолиИГруппыДоступаПрофилей(ПараметрыОбновления, Кэш) + + ПараметрыОбновления.Вставить("РолиПрофилейГруппДоступа", Новый ТаблицаЗначений); + ПараметрыОбновления.Вставить("ГруппыДоступаПрофилей", Новый ТаблицаЗначений); + + Если Не ПараметрыОбновления.ЕстьФункцияПравоДоступаИлиРольДоступна Тогда + Возврат; + КонецЕсли; + + Если Кэш.РолиПрофилейГруппДоступа <> Неопределено Тогда + ПараметрыОбновления.РолиПрофилейГруппДоступа = Кэш.РолиПрофилейГруппДоступа; + ПараметрыОбновления.ГруппыДоступаПрофилей = Кэш.ГруппыДоступаПрофилей; + Возврат; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Роль КАК Роль + |ИЗ + | НазначениеПрофилей КАК НазначениеПрофилей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + | ПО (РолиПрофилей.Ссылка = НазначениеПрофилей.Профиль) + | И (НазначениеПрофилей.ДляПользователей) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | РолиПрофилей.Ссылка КАК Профиль, + | РолиПрофилей.Роль КАК Роль + |ИЗ + | НазначениеПрофилей КАК НазначениеПрофилей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей + | ПО (РолиПрофилей.Ссылка = НазначениеПрофилей.Профиль) + | И (НазначениеПрофилей.ДляПользователей) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | НазначениеПрофилей.Профиль КАК Профиль, + | ГруппыДоступа.Ссылка КАК ГруппаДоступа + |ИЗ + | НазначениеПрофилей КАК НазначениеПрофилей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа + | ПО НазначениеПрофилей.Профиль = ГруппыДоступа.Профиль + | И (НазначениеПрофилей.ДляПользователей)"; + + Если ПараметрыОбновления.ДляВнешнихПользователей Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "НазначениеПрофилей.ДляПользователей", "НазначениеПрофилей.ДляВнешнихПользователей"); + КонецЕсли; + + Запрос.Текст = ТекстЗапросаНазначенияПрофилей() + + ОбщегоНазначения.РазделительПакетаЗапросов() + Запрос.Текст; + + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + + Роли = РезультатыЗапроса[1].Выгрузить().ВыгрузитьКолонку("Роль"); + ОбъектыМетаданныхРолей = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(Роли, Ложь); + + РолиПрофилейГруппДоступа = РезультатыЗапроса[2].Выгрузить(); + ТипИмениРоли = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.Реквизиты.Имя.Тип; + РолиПрофилейГруппДоступа.Колонки.Добавить("ИмяРоли", ТипИмениРоли); + РолиПрофилейГруппДоступа.Колонки.Добавить("ИмяРолиВерхнийРегистр", ТипИмениРоли); + РолиПрофилейГруппДоступа.Индексы.Добавить("Роль"); + Отбор = Новый Структура("Роль"); + + Для Каждого ОписаниеРоли Из ОбъектыМетаданныхРолей Цикл + Если ТипЗнч(ОписаниеРоли.Значение) <> Тип("ОбъектМетаданных") Тогда + Продолжить; + КонецЕсли; + ИмяРоли = ОписаниеРоли.Значение.Имя; + ИмяРолиВерхнийРегистр = ВРег(ИмяРоли); + Отбор.Роль = ОписаниеРоли.Ключ; + Строки = РолиПрофилейГруппДоступа.НайтиСтроки(Отбор); + Для Каждого Строка Из Строки Цикл + Строка.ИмяРоли = ИмяРоли; + Строка.ИмяРолиВерхнийРегистр = ИмяРолиВерхнийРегистр; + КонецЦикла; + КонецЦикла; + РолиПрофилейГруппДоступа.Индексы.Добавить("Профиль,ИмяРолиВерхнийРегистр"); + + ГруппыДоступаПрофилей = РезультатыЗапроса[3].Выгрузить(); + ГруппыДоступаПрофилей.Индексы.Добавить("ГруппаДоступа"); + + ПараметрыОбновления.РолиПрофилейГруппДоступа = РолиПрофилейГруппДоступа; + ПараметрыОбновления.ГруппыДоступаПрофилей = ГруппыДоступаПрофилей; + Кэш.РолиПрофилейГруппДоступа = РолиПрофилейГруппДоступа; + Кэш.ГруппыДоступаПрофилей = ГруппыДоступаПрофилей; КонецПроцедуры @@ -19594,7 +20146,7 @@ ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); ПоГруппамДоступа = Новый Соответствие; Для Каждого Подстрока Из Строка.Строки Цикл - ПоГруппамДоступа.Вставить(Подстрока.ГруппаДоступа, Подстрока.Изменение); + ПоГруппамДоступа.Вставить(Подстрока.ГруппаДоступа, Подстрока.ПравоИзменение); КонецЦикла; ПраваНаСписок = Новый Структура; ПраваНаСписок.Вставить("ОграничениеЧтенияОтключено", @@ -19615,7 +20167,7 @@ Для Каждого Строка Из Дерево.Строки Цикл ПраваНаВедущийКлюч = Новый Соответствие; Для Каждого Подстрока Из Строка.Строки Цикл - ПраваНаВедущийКлюч.Вставить(Подстрока.ВладелецПрав, Подстрока.Изменение); + ПраваНаВедущийКлюч.Вставить(Подстрока.ВладелецПрав, Подстрока.ПравоИзменение); КонецЦикла; ПраваНаВедущиеКлючиДоступа.Вставить(Строка.КлючДоступа, Новый ФиксированноеСоответствие(ПраваНаВедущийКлюч)); @@ -19634,7 +20186,7 @@ Для Каждого Строка Из Дерево.Строки Цикл ПраваНаВедущийСписок = Новый Соответствие; Для Каждого Подстрока Из Строка.Строки Цикл - ПраваНаВедущийСписок.Вставить(Подстрока.ВладелецПрав, Подстрока.Изменение); + ПраваНаВедущийСписок.Вставить(Подстрока.ВладелецПрав, Подстрока.ПравоИзменение); Если ДобавитьПраваПоТипам Тогда ТипЗначенияСписка = Подстрока.ТипЗначения; КонецЕсли; @@ -19662,7 +20214,7 @@ Для Каждого Строка Из Дерево.Строки Цикл ПраваПоВладельцуНастроекПрав = Новый Соответствие; Для Каждого Подстрока Из Строка.Строки Цикл - ПраваПоВладельцуНастроекПрав.Вставить(Подстрока.ВладелецПрав, Подстрока.Изменение); + ПраваПоВладельцуНастроекПрав.Вставить(Подстрока.ВладелецПрав, Подстрока.ПравоИзменение); КонецЦикла; ПраваПоВладельцамНастроекПрав.Вставить(Строка.ВладелецНастроекПрав, Новый ФиксированноеСоответствие(ПраваПоВладельцуНастроекПрав)); @@ -19683,7 +20235,7 @@ Возврат ПраваНаКлюч; ИначеЕсли ПараметрыОбновления.ИзменениеРазрешеноДляВсехПользователей Тогда ПраваНаКлюч.ДляГрупп.Вставить(ПараметрыОбновления.ПустаяГруппаДоступа, - Новый Структура("Изменение, Добавление", Истина, Истина)); + Новый Структура("ПравоИзменение, ПравоДобавление", Истина, Истина)); Возврат ПраваНаКлюч; КонецЕсли; КонецЕсли; @@ -19709,21 +20261,26 @@ Контекст.Вставить("ТипПользователя", ПараметрыОбновления.ТипПользователя); Контекст.Вставить("ТипГруппыПользователей", ПараметрыОбновления.ТипГруппыПользователей); Контекст.Вставить("ТипыВладельцевНастроекПрав", ПараметрыОбновления.ТипыВладельцевНастроекПрав); + Контекст.Вставить("ПраваРолейФункцииПравоДоступа", ПараметрыОбновления.Кэш.ПраваРолейФункцииПравоДоступа); + Контекст.Вставить("ОбъектыМетаданныхФункцииПравоДоступа", ПараметрыОбновления.Кэш.ОбъектыМетаданныхФункцииПравоДоступа); + Контекст.Вставить("ПраваПрофилейФункцииПравоДоступа", ПараметрыОбновления.Кэш.ПраваПрофилейФункцииПравоДоступа); + Контекст.Вставить("РолиПрофилейГруппДоступа", ПараметрыОбновления.РолиПрофилейГруппДоступа); + Контекст.Вставить("ГруппыДоступаПрофилей", ПараметрыОбновления.ГруппыДоступаПрофилей); ЧтениеРазрешеноДляВсехГруппДоступа = Истина; ИзменениеРазрешеноДляВсехГруппДоступа = Истина; ДобавлениеРазрешеноДляВсехГруппДоступа = Истина; Для Каждого ОписаниеПрав Из ПараметрыОбновления.ПраваГруппДоступаСписка Цикл - ГруппаДоступа = ОписаниеПрав.Ключ; - ПраваГруппыДоступа = ОписаниеПрав.Значение; // См. НовыеПраваГруппыДоступа + ГруппаДоступа = ОписаниеПрав.ГруппаДоступа; + ПраваГруппыДоступа = ОписаниеПрав; // СтрокаТаблицыЗначений Контекст.Вставить("ГруппаДоступа", ГруппаДоступа); Контекст.Вставить("ЗначенияГруппыДоступа", ПараметрыОбновления.ЗначенияГруппДоступа.Получить(ГруппаДоступа)); Если ПараметрыОбновления.ОграничениеЧтенияОтключено - Или ПраваГруппыДоступа.ЧтениеБезОграничения Тогда + Или ПраваГруппыДоступа.ПравоЧтениеБезОграничения Тогда ПравоЧтение = "Истина"; Иначе @@ -19745,12 +20302,12 @@ КонецЕсли; Если ПараметрыОбновления.ОграничениеОтключено - Или ПраваГруппыДоступа.ИзменениеБезОграничения - И ПраваГруппыДоступа.ДобавлениеБезОграничения Тогда + Или ПраваГруппыДоступа.ПравоИзменениеБезОграничения + И ПраваГруппыДоступа.ПравоДобавлениеБезОграничения Тогда ПравоИзменение = "Истина"; - ИначеЕсли Не ПраваГруппыДоступа.Изменение Тогда + ИначеЕсли Не ПраваГруппыДоступа.ПравоИзменение Тогда ПравоИзменение = "Ложь"; ИначеЕсли ПараметрыОбновления.ЕстьОграничениеИзменения Тогда @@ -19758,7 +20315,7 @@ ПараметрыОбновления.СтруктураРасчетаПраваИзменение); ИначеЕсли ПараметрыОбновления.ОграничениеЧтенияОтключено - Или ПраваГруппыДоступа.ЧтениеБезОграничения Тогда + Или ПраваГруппыДоступа.ПравоЧтениеБезОграничения Тогда ПравоИзменение = РассчитанноеУсловиеДляСтрок(Контекст, ПараметрыОбновления.СтруктураРасчетаПраваЧтение); @@ -19766,9 +20323,9 @@ ПравоИзменение = "Истина"; КонецЕсли; - ПравоДобавление = ?(ПраваГруппыДоступа.Добавление, ПравоИзменение, "Ложь"); + ПравоДобавление = ?(ПраваГруппыДоступа.ПравоДобавление, ПравоИзменение, "Ложь"); - Если ПраваГруппыДоступа.ИзменениеБезОграничения Тогда + Если ПраваГруппыДоступа.ПравоИзменениеБезОграничения Тогда ПравоИзменение = "Истина"; КонецЕсли; @@ -19784,7 +20341,7 @@ ПравоЧтение, ПравоИзменение, ПравоДобавление, Контекст); ИначеЕсли Не БезЗаписиПраваЧтение Или ПравоИзменение = "Истина" Или ПравоДобавление = "Истина" Тогда - ПраваНаКлюч.ДляГрупп.Вставить(ГруппаДоступа, Новый Структура("Изменение, Добавление", + ПраваНаКлюч.ДляГрупп.Вставить(ГруппаДоступа, Новый Структура("ПравоИзменение, ПравоДобавление", ПравоИзменение = "Истина", ПравоДобавление = "Истина")); КонецЕсли; КонецЦикла; @@ -19802,16 +20359,16 @@ ПраваНаКлюч = Новый Структура("ДляГрупп, ДляПользователей", Новый Соответствие, Новый Соответствие); ПраваНаКлюч.ДляГрупп.Вставить(ПараметрыОбновления.ПустаяГруппаДоступа, - Новый Структура("Изменение, Добавление", Истина, Истина)); + Новый Структура("ПравоИзменение, ПравоДобавление", Истина, Истина)); Иначе // ЧтениеРазрешеноДляВсехГруппДоступа. ТекущиеПраваНаКлюч = ПраваНаКлюч; ПраваНаКлюч = Новый Структура("ДляГрупп, ДляПользователей", Новый Соответствие, Новый Соответствие); Если Не БезЗаписиПраваЧтение Или ИзменениеРазрешеноДляВсехГруппДоступа Тогда ПраваНаКлюч.ДляГрупп.Вставить(ПараметрыОбновления.ПустаяГруппаДоступа, - Новый Структура("Изменение, Добавление", ИзменениеРазрешеноДляВсехГруппДоступа, Ложь)); + Новый Структура("ПравоИзменение, ПравоДобавление", ИзменениеРазрешеноДляВсехГруппДоступа, Ложь)); КонецЕсли; - ИмяПрава = ?(ИзменениеРазрешеноДляВсехГруппДоступа, "Добавление", "Изменение"); + ИмяПрава = ?(ИзменениеРазрешеноДляВсехГруппДоступа, "ПравоДобавление", "ПравоИзменение"); Для Каждого КлючИЗначение Из ТекущиеПраваНаКлюч.ДляГрупп Цикл Если КлючИЗначение.Значение[ИмяПрава] Тогда ПраваНаКлюч.ДляГрупп.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); @@ -19842,13 +20399,14 @@ Права = НовыеПрава(ПравоИзменение = "Истина", ПравоДобавление = "Истина"); Если ТипЗнч(ПравоЧтение) <> Тип("Соответствие") Тогда - Если Не Контекст.БезЗаписиПраваЧтение Или Права.Изменение Или Права.Добавление Тогда + Если Не Контекст.БезЗаписиПраваЧтение Или Права.ПравоИзменение Или Права.ПравоДобавление Тогда ПраваНаКлюч.ДляГрупп.Вставить(Контекст.ГруппаДоступа, - Новый Структура("Изменение, Добавление", Права.Изменение, Права.Добавление)); + Новый Структура("ПравоИзменение, ПравоДобавление", + Права.ПравоИзменение, Права.ПравоДобавление)); КонецЕсли; Иначе ДобавитьПользователямПраваНаКлючДоступа(ПраваНаКлюч.ДляПользователей, - ПравоЧтение, Права.Изменение, Права.Добавление, Контекст.БезЗаписиПраваЧтение); + ПравоЧтение, Права.ПравоИзменение, Права.ПравоДобавление, Контекст.БезЗаписиПраваЧтение); КонецЕсли; Если ТипЗнч(ПравоИзменение) <> Тип("Соответствие") @@ -19864,31 +20422,31 @@ // Возвращаемое значение: // Структура: -// * Изменение - Булево -// * Добавление - Булево +// * ПравоИзменение - Булево +// * ПравоДобавление - Булево // -Функция НовыеПрава(Изменение, Добавление) +Функция НовыеПрава(ПравоИзменение, ПравоДобавление) - Возврат Новый Структура("Изменение, Добавление", Изменение, Добавление); + Возврат Новый Структура("ПравоИзменение, ПравоДобавление", ПравоИзменение, ПравоДобавление); КонецФункции // Для процедуры ДобавитьПраваПользователейНаКлючДоступа. Процедура ДобавитьПользователямПраваНаКлючДоступа(ПраваНаКлючДляПользователей, - СоставПользователей, Изменение, Добавление, БезЗаписиПраваЧтение) + СоставПользователей, ПравоИзменение, ПравоДобавление, БезЗаписиПраваЧтение) - Если Изменение И Добавление Тогда + Если ПравоИзменение И ПравоДобавление Тогда Для Каждого КлючИЗначение Из СоставПользователей Цикл ПраваНаКлючДляПользователей.Вставить(КлючИЗначение.Ключ, - Новый Структура("Изменение, Добавление", Истина, Истина)); + Новый Структура("ПравоИзменение, ПравоДобавление", Истина, Истина)); КонецЦикла; - ИначеЕсли Не Изменение И Не Добавление Тогда + ИначеЕсли Не ПравоИзменение И Не ПравоДобавление Тогда Если Не БезЗаписиПраваЧтение Тогда Для Каждого КлючИЗначение Из СоставПользователей Цикл Права = ПраваНаКлючДляПользователей.Получить(КлючИЗначение.Ключ); Если Права = Неопределено Тогда - Права = Новый Структура("Изменение, Добавление", Ложь, Ложь); + Права = Новый Структура("ПравоИзменение, ПравоДобавление", Ложь, Ложь); ПраваНаКлючДляПользователей.Вставить(КлючИЗначение.Ключ, Права); КонецЕсли; КонецЦикла; @@ -19897,10 +20455,11 @@ Для Каждого КлючИЗначение Из СоставПользователей Цикл Права = ПраваНаКлючДляПользователей.Получить(КлючИЗначение.Ключ); // См. НовыеПрава Если Права = Неопределено Тогда - Права = Новый Структура("Изменение, Добавление", Изменение, Добавление); + Права = Новый Структура("ПравоИзменение, ПравоДобавление", + ПравоИзменение, ПравоДобавление); Иначе - Права.Изменение = Права.Изменение Или Изменение; - Права.Добавление = Права.Добавление Или Добавление; + Права.ПравоИзменение = Права.ПравоИзменение Или ПравоИзменение; + Права.ПравоДобавление = Права.ПравоДобавление Или ПравоДобавление; КонецЕсли; ПраваНаКлючДляПользователей.Вставить(КлючИЗначение.Ключ, Права); КонецЦикла; @@ -20485,6 +21044,13 @@ КонецЕсли; КонецЕсли; КонецЕсли; + + ИначеЕсли Условие.Узел = "ПравоДоступа" Тогда + Результат = ?(ЕстьПравоДоступаВРоляхПрофиляГруппыДоступа(Условие, Контекст), "Истина", "Ложь"); + + ИначеЕсли Условие.Узел = "РольДоступна" Тогда + Результат = ?(ЕстьРольВПрофилеГруппыДоступа(Условие, Контекст), "Истина", "Ложь"); + Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'При вычислении прав на ключ доступа узел не поддерживается ""%1"".'"), @@ -20594,6 +21160,81 @@ КонецПроцедуры +// Для функции РассчитанноеУсловие. +Функция ЕстьПравоДоступаВРоляхПрофиляГруппыДоступа(Условие, Контекст) + + ПолноеИмя = Условие.ПолноеИмяОбъектаМетаданных; + Описание = Контекст.ОбъектыМетаданныхФункцииПравоДоступа.Получить(ПолноеИмя); + Если Описание = Неопределено Тогда + Описание = Новый Структура("ОбъектМетаданных, ИмяСтандартногоРеквизита"); + Описание.ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмениДляПроверкиПрава( + ПолноеИмя, Описание.ИмяСтандартногоРеквизита); + Контекст.ОбъектыМетаданныхФункцииПравоДоступа.Вставить(ПолноеИмя, Описание); + КонецЕсли; + + СтрокаТаблицы = Контекст.ГруппыДоступаПрофилей.Найти(Контекст.ГруппаДоступа, "ГруппаДоступа"); + Если СтрокаТаблицы = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + ПраваПрофиля = Контекст.ПраваПрофилейФункцииПравоДоступа.Получить(СтрокаТаблицы.Профиль); + Если ПраваПрофиля = Неопределено Тогда + ПраваПрофиля = Новый Соответствие; + Контекст.ПраваПрофилейФункцииПравоДоступа.Вставить(СтрокаТаблицы.Профиль, ПраваПрофиля); + КонецЕсли; + + КлючПраваВРоляхПрофиля = ПолноеИмя + "/" + Условие.ИмяПрава; + ЕстьПравоВРоляхПрофиля = ПраваПрофиля.Получить(КлючПраваВРоляхПрофиля); + Если ТипЗнч(ЕстьПравоВРоляхПрофиля) = Тип("Булево") Тогда + Возврат ЕстьПравоВРоляхПрофиля; + КонецЕсли; + + Отбор = Новый Структура("Профиль", СтрокаТаблицы.Профиль); + РолиПрофиля = Контекст.РолиПрофилейГруппДоступа.НайтиСтроки(Отбор); + Если РолиПрофиля.Количество() = 0 Тогда + Возврат Ложь; + КонецЕсли; + + ЕстьПравоВРоли = Ложь; + Для Каждого ОписаниеРоли Из РолиПрофиля Цикл + КлючПраваРоли = ОписаниеРоли.ИмяРоли + "/" + ПолноеИмя + "/" + Условие.ИмяПрава; + ЕстьПравоВРоли = Контекст.ПраваРолейФункцииПравоДоступа.Получить(КлючПраваРоли); + Если ЕстьПравоВРоли = Неопределено Тогда + ПолноеИмяРоли = "Роль." + ОписаниеРоли.ИмяРоли; + Роль = Контекст.ОбъектыМетаданныхФункцииПравоДоступа.Получить(ПолноеИмяРоли); + Если Роль = Неопределено Тогда + Роль = Метаданные.Роли[ОписаниеРоли.ИмяРоли]; + Контекст.ОбъектыМетаданныхФункцииПравоДоступа.Вставить(ПолноеИмяРоли, Роль); + КонецЕсли; + ЕстьПравоВРоли = ПравоДоступа(Условие.ИмяПрава, Описание.ОбъектМетаданных, Роль, + Описание.ИмяСтандартногоРеквизита); + Контекст.ПраваРолейФункцииПравоДоступа.Вставить(КлючПраваРоли, ЕстьПравоВРоли); + КонецЕсли; + Если ЕстьПравоВРоли Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + ПраваПрофиля.Вставить(КлючПраваВРоляхПрофиля, ЕстьПравоВРоли); + + Возврат ЕстьПравоВРоли; + +КонецФункции + +// Для функции РассчитанноеУсловие. +Функция ЕстьРольВПрофилеГруппыДоступа(Условие, Контекст) + + СтрокаТаблицы = Контекст.ГруппыДоступаПрофилей.Найти(Контекст.ГруппаДоступа, "ГруппаДоступа"); + Если СтрокаТаблицы = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Отбор = Новый Структура("Профиль,ИмяРолиВерхнийРегистр", СтрокаТаблицы.Профиль, ВРег(Условие.ИмяРоли)); + + Возврат Контекст.РолиПрофилейГруппДоступа.НайтиСтроки(Отбор).Количество() > 0; + +КонецФункции + // Для процедуры ОбновитьПраваПорцииКлючейДоступаСписка. Процедура ОбновитьПраваНаКлючДоступаСписка(КлючДоступа, ПраваНаКлюч, ОписаниеНовыхКлючей, ПараметрыОбновления) @@ -20617,8 +21258,8 @@ ЗапросГрупп.Текст = "ВЫБРАТЬ | КлючиДоступаГруппДоступа.ГруппаДоступа КАК ГруппаДоступа, - | КлючиДоступаГруппДоступа.Изменение КАК Изменение, - | КлючиДоступаГруппДоступа.Добавление КАК Добавление + | КлючиДоступаГруппДоступа.ПравоИзменение КАК ПравоИзменение, + | КлючиДоступаГруппДоступа.ПравоДобавление КАК ПравоДобавление |ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа |ГДЕ @@ -20776,14 +21417,14 @@ ТекстЗапроса = "ВЫБРАТЬ | ВсеСтроки.НаборГруппДоступа КАК НаборГруппДоступа, - | ВсеСтроки.Изменение КАК Изменение, - | ВсеСтроки.Добавление КАК Добавление, + | ВсеСтроки.ПравоИзменение КАК ПравоИзменение, + | ВсеСтроки.ПравоДобавление КАК ПравоДобавление, | СУММА(ВсеСтроки.ВидИзмененияСтроки) КАК ВидИзмененияСтроки |ИЗ | (ВЫБРАТЬ | ГруппыВходящиеВНаборы.Ссылка КАК НаборГруппДоступа, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Изменение) КАК Изменение, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Добавление) КАК Добавление, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоИзменение) КАК ПравоИзменение, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоДобавление) КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -20801,8 +21442,8 @@ | | ВЫБРАТЬ | &РазрешенныйПустойНабор, - | КлючиДоступаГруппДоступа.Изменение, - | КлючиДоступаГруппДоступа.Добавление, + | КлючиДоступаГруппДоступа.ПравоИзменение, + | КлючиДоступаГруппДоступа.ПравоДобавление, | 1 | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -20814,8 +21455,8 @@ | | ВЫБРАТЬ | СтарыеДанные.НаборГруппДоступа, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК СтарыеДанные @@ -20824,8 +21465,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.НаборГруппДоступа, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -20845,8 +21486,8 @@ ТекстЗапроса = "ВЫБРАТЬ | КлючиДоступаПользователей.Пользователь КАК Пользователь, - | КлючиДоступаПользователей.Изменение КАК Изменение, - | КлючиДоступаПользователей.Добавление КАК Добавление, + | КлючиДоступаПользователей.ПравоИзменение КАК ПравоИзменение, + | КлючиДоступаПользователей.ПравоДобавление КАК ПравоДобавление, | КлючиДоступаПользователей.ЭтоПраваНабораГрупп КАК ЭтоПраваНабораГрупп |ИЗ | РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаПользователей @@ -20859,15 +21500,15 @@ |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВсеСтроки.Пользователь КАК Пользователь, - | ВсеСтроки.Изменение КАК Изменение, - | ВсеСтроки.Добавление КАК Добавление, + | ВсеСтроки.ПравоИзменение КАК ПравоИзменение, + | ВсеСтроки.ПравоДобавление КАК ПравоДобавление, | ИСТИНА КАК ЭтоПраваНабораГрупп, | СУММА(ВсеСтроки.ВидИзмененияСтроки) КАК ВидИзмененияСтроки |ИЗ | (ВЫБРАТЬ | ГруппыВходящиеВНаборы.Ссылка КАК Пользователь, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Изменение) КАК Изменение, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Добавление) КАК Добавление, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоИзменение) КАК ПравоИзменение, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоДобавление) КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -20885,8 +21526,8 @@ | | ВЫБРАТЬ | СтарыеДанные.Пользователь, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаПользователей КАК СтарыеДанные @@ -20896,8 +21537,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.Пользователь, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -20917,8 +21558,8 @@ ТекстЗапроса = "ВЫБРАТЬ | КлючиДоступаВнешнихПользователей.ВнешнийПользователь КАК ВнешнийПользователь, - | КлючиДоступаВнешнихПользователей.Изменение КАК Изменение, - | КлючиДоступаВнешнихПользователей.Добавление КАК Добавление, + | КлючиДоступаВнешнихПользователей.ПравоИзменение КАК ПравоИзменение, + | КлючиДоступаВнешнихПользователей.ПравоДобавление КАК ПравоДобавление, | КлючиДоступаВнешнихПользователей.ЭтоПраваНабораГрупп КАК ЭтоПраваНабораГрупп |ИЗ | РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаВнешнихПользователей @@ -20931,15 +21572,15 @@ |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВсеСтроки.ВнешнийПользователь КАК ВнешнийПользователь, - | ВсеСтроки.Изменение КАК Изменение, - | ВсеСтроки.Добавление КАК Добавление, + | ВсеСтроки.ПравоИзменение КАК ПравоИзменение, + | ВсеСтроки.ПравоДобавление КАК ПравоДобавление, | ИСТИНА КАК ЭтоПраваНабораГрупп, | СУММА(ВсеСтроки.ВидИзмененияСтроки) КАК ВидИзмененияСтроки |ИЗ | (ВЫБРАТЬ | ГруппыВходящиеВНаборы.Ссылка КАК ВнешнийПользователь, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Изменение) КАК Изменение, - | МАКСИМУМ(КлючиДоступаГруппДоступа.Добавление) КАК Добавление, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоИзменение) КАК ПравоИзменение, + | МАКСИМУМ(КлючиДоступаГруппДоступа.ПравоДобавление) КАК ПравоДобавление, | 1 КАК ВидИзмененияСтроки | ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа @@ -20957,8 +21598,8 @@ | | ВЫБРАТЬ | СтарыеДанные.ВнешнийПользователь, - | СтарыеДанные.Изменение, - | СтарыеДанные.Добавление, + | СтарыеДанные.ПравоИзменение, + | СтарыеДанные.ПравоДобавление, | -1 | ИЗ | РегистрСведений.КлючиДоступаВнешнихПользователей КАК СтарыеДанные @@ -20968,8 +21609,8 @@ | |СГРУППИРОВАТЬ ПО | ВсеСтроки.ВнешнийПользователь, - | ВсеСтроки.Изменение, - | ВсеСтроки.Добавление + | ВсеСтроки.ПравоИзменение, + | ВсеСтроки.ПравоДобавление | |ИМЕЮЩИЕ | СУММА(ВсеСтроки.ВидИзмененияСтроки) <> 0 @@ -21002,10 +21643,13 @@ КлючиЗначенийСтрокКлючей = КлючиЗначенийСтрокОбъектов(РезультатыЗапросаЗначенийКлючей, ?(СтрНачинаетсяС(ТаблицыКлюча[0], "Шапка"), 0, 1), ТаблицыКлюча); - Для Каждого ОписаниеКлючаДоступа Из КлючиЗначенийСтрокКлючей Цикл - СтрокаДляХеша = СтрокаДляХешаКлючаДоступа(ОписаниеКлючаДоступа.Значение, ТаблицыКлюча); + Выборка = РезультатыЗапросаЗначенийКлючей[0].Выбрать(); + + Пока Выборка.Следующий() Цикл + Ссылка = Выборка.ТекущаяСсылка; + ОписаниеКлючейЗначений = КлючиЗначенийСтрокКлючей.Получить(Ссылка); + СтрокаДляХеша = СтрокаДляХешаКлючаДоступа(ОписаниеКлючейЗначений, ТаблицыКлюча); Если ОписаниеНовогоКлюча.СтрокаДляХеша = СтрокаДляХеша Тогда - Ссылка = ОписаниеКлючаДоступа.Ключ; ОписаниеНовогоКлюча.КлючДоступаОбъект = Новый Структура("Ссылка", Ссылка); НеИспользуетсяС = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "НеИспользуетсяС"); Если ЗначениеЗаполнено(НеИспользуетсяС) Тогда @@ -21044,8 +21688,8 @@ Иначе ЕстьИзмененияПравГруппПользователей = Истина; КонецЕсли; - ИначеЕсли Выборка.Изменение = Права.Изменение - И Выборка.Добавление = Права.Добавление Тогда + ИначеЕсли Выборка.ПравоИзменение = Права.ПравоИзменение + И Выборка.ПравоДобавление = Права.ПравоДобавление Тогда ПраваНаКлюч.Вставить(ВладелецПрав, Null); КонецЕсли; КонецЦикла; @@ -21060,9 +21704,9 @@ ВладелецПрав = ОписаниеПрав.Ключ; ЭлементОтбора = НаборЗаписей.Отбор[ИмяПоляВладельцаПрав]; // ЭлементОтбора ЭлементОтбора.Установить(ВладелецПрав); - ОднаЗапись[ИмяПоляВладельцаПрав] = ВладелецПрав; - ОднаЗапись.Изменение = Права.Изменение; - ОднаЗапись.Добавление = Права.Добавление; + ОднаЗапись[ИмяПоляВладельцаПрав] = ВладелецПрав; + ОднаЗапись.ПравоИзменение = Права.ПравоИзменение; + ОднаЗапись.ПравоДобавление = Права.ПравоДобавление; НаборЗаписей.Записать(); Если ТипЗнч(ВладелецПрав) = ТипГруппыДоступа Тогда ЕстьИзмененияПравГруппДоступа = Истина; @@ -21094,8 +21738,8 @@ ЭлементОтбора.Установить(ВладелецПрав); НаборЗаписей.Записать(); ЕстьИзмененияПрав = Истина; - ИначеЕсли Выборка.Изменение = Права.Изменение - И Выборка.Добавление = Права.Добавление + ИначеЕсли Выборка.ПравоИзменение = Права.ПравоИзменение + И Выборка.ПравоДобавление = Права.ПравоДобавление И Выборка.ЭтоПраваНабораГрупп = Ложь Тогда ПраваНаКлюч.Вставить(ВладелецПрав, Null); КонецЕсли; @@ -21112,8 +21756,8 @@ ЭлементОтбора = НаборЗаписей.Отбор[ИмяПоляВладельцаПрав]; // ЭлементОтбора ЭлементОтбора.Установить(ВладелецПрав); ОднаЗапись[ИмяПоляВладельцаПрав] = ВладелецПрав; - ОднаЗапись.Изменение = Права.Изменение; - ОднаЗапись.Добавление = Права.Добавление; + ОднаЗапись.ПравоИзменение = Права.ПравоИзменение; + ОднаЗапись.ПравоДобавление = Права.ПравоДобавление; ОднаЗапись.ЭтоПраваНабораГрупп = Ложь; НаборЗаписей.Записать(); ЕстьИзмененияПрав = Истина; @@ -21263,6 +21907,10 @@ + ОписаниеУказателяВедущегоОбъекта(Указатель, ПараметрыПланирования); КонецЕсли; КонецЕсли; + Если ОписаниеВедущегоОбъекта.Свойство("ПоДаннымКэшаРасчетаПрав") Тогда + ВедущийОбъект = "ПоДаннымКэшаРасчетаПрав" + ": """ + + ОписаниеВедущегоОбъекта.ПоДаннымКэшаРасчетаПрав; + КонецЕсли; КонецЕсли; ЗаписьЖурналаРегистрации( @@ -21362,7 +22010,7 @@ // Параметры: // Списки - Массив // ДобавленныеСписки - Соответствие -// НедоступныеСписки - Массив - (возвращаемое значение) +// НедоступныеСписки - Массив - возвращаемое значение. // Процедура ДобавитьЗависимыеСписки(Списки, ДобавленныеСписки, НедоступныеСписки) Экспорт @@ -21881,7 +22529,7 @@ ДобавляемыеОграниченияСписков = Неопределено, ОбщийКонтекст = Неопределено, ПовторныйВызов = Ложь) Если ОбщийКонтекст = Неопределено Тогда - ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(); + ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(ПолноеИмя); ОбщийКонтекст.Вставить("ОписанияОграничений", Новый Соответствие); КонецЕсли; @@ -21939,7 +22587,8 @@ // * ИспользуемыеТипыЗначений - см. ИспользуемыеТипыЗначений // * СпискиСОграничением - см. УправлениеДоступомСлужебныйПовтИсп.СпискиСОграничением // -Функция ОбщийКонтекстРасчетаПараметровОграничения(ВсеВидыДоступаИспользуются = Неопределено, ЗаполнитьСпискиСОграничением = Истина) +Функция ОбщийКонтекстРасчетаПараметровОграничения(ПолноеИмя = Неопределено, + ВсеВидыДоступаИспользуются = Неопределено, ЗаполнитьСпискиСОграничением = Истина) ТипыПользователя = Новый Массив; ТипыПользователя.Добавить(Тип("СправочникСсылка.Пользователи")); @@ -21953,17 +22602,12 @@ КонецЕсли; СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); + ИспользуемыеТипыЗначений = ИспользуемыеТипыЗначений(СвойстваВидовДоступа, ПолноеИмя, ВсеВидыДоступаИспользуются); Если ТипЗнч(ВсеВидыДоступаИспользуются) = Тип("Булево") Тогда ОграничениеДоступаВключено = ВсеВидыДоступаИспользуются; ВнешниеПользователиВключены = ВсеВидыДоступаИспользуются; - Если ВсеВидыДоступаИспользуются Тогда - ИспользуемыеТипыЗначений = ИспользуемыеТипыЗначений(СвойстваВидовДоступа, Истина); - Иначе - ИспользуемыеТипыЗначений = Новый Соответствие; - КонецЕсли; Иначе ВнешниеПользователиВключены = Константы.ИспользоватьВнешнихПользователей.Получить(); - ИспользуемыеТипыЗначений = ИспользуемыеТипыЗначений(СвойстваВидовДоступа, Ложь); КонецЕсли; ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.ВозможныеПраваДляНастройкиПравОбъектов(); @@ -21988,22 +22632,103 @@ // Для функций ОбщийКонтекстРасчетаПараметровОграничения и ИспользованиеВидовДоступаИзменено. // // Возвращаемое значение: -// Соответствие из КлючИЗначение: -// * Ключ - Тип -// * Значение - Булево - Истина +// Структура: +// * ДляИБ - Соответствие из КлючИЗначение: +// ** Ключ - Тип +// ** Значение - Булево - Истина +// * ПоТаблицам - Соответствие из КлючИЗначение: +// ** Ключ - Строка - полное имя объекта метаданных +// ** Значение - Соответствие из КлючИЗначение: +// *** Ключ - Тип +// *** Значение - Булево - Истина +// * ХешСумма - Строка - контрольная сумма настроек использования ДляИБ и ПоТаблицам. // -Функция ИспользуемыеТипыЗначений(СвойстваВидовДоступа, ВсеВидыДоступаИспользуются = Ложь) +Функция ИспользуемыеТипыЗначений(СвойстваВидовДоступа, ПолноеИмя = Неопределено, ВсеВидыДоступаИспользуются = Неопределено, ТолькоХешСумма = Ложь) - ИспользуемыеТипыЗначений = Новый Соответствие; + ИспользуемыеТипыЗначений = Новый Структура; + ИспользуемыеТипыЗначений.Вставить("ДляИБ", Новый Соответствие); + ИспользуемыеТипыЗначений.Вставить("ПоТаблицам", Новый Соответствие); + ИспользуемыеТипыЗначений.Вставить("ХешСумма", ""); + + Если ВсеВидыДоступаИспользуются = Ложь Тогда + Возврат ИспользуемыеТипыЗначений; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ИспользуемыеВидыДоступа.ТипЗначенийДоступа КАК ТипЗначенийДоступа + |ИЗ + | РегистрСведений.ИспользуемыеВидыДоступа КАК ИспользуемыеВидыДоступа + | + |УПОРЯДОЧИТЬ ПО + | ТипЗначенийДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ИспользуемыеВидыДоступаПоТаблицам.Таблица КАК Таблица, + | ИспользуемыеВидыДоступаПоТаблицам.ТипЗначенийДоступа КАК ТипЗначенийДоступа + |ИЗ + | РегистрСведений.ИспользуемыеВидыДоступаПоТаблицам КАК ИспользуемыеВидыДоступаПоТаблицам + |ГДЕ + | ИспользуемыеВидыДоступаПоТаблицам.Таблица = &Таблица + | + |УПОРЯДОЧИТЬ ПО + | Таблица, + | ТипЗначенийДоступа"; + + Если ВсеВидыДоступаИспользуются <> Истина Тогда + Если ПолноеИмя <> Неопределено Тогда + Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ПолноеИмя, Ложь); + Если Идентификатор <> Null Тогда + Запрос.УстановитьПараметр("Таблица", Идентификатор); + КонецЕсли; + КонецЕсли; + Если ПолноеИмя = Неопределено Или Идентификатор = Null Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "ИспользуемыеВидыДоступаПоТаблицам.Таблица = &Таблица", "ИСТИНА"); + КонецЕсли; + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + Используемые = РезультатыЗапроса[0].Выгрузить(); + ИспользуемыеПоТаблицам = РезультатыЗапроса[1].Выгрузить(); + Если ПолноеИмя = Неопределено Тогда + Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256); + Хеширование.Добавить(СтрокаДанныхДляХеширования(Используемые)); + Хеширование.Добавить(СтрокаДанныхДляХеширования(ИспользуемыеПоТаблицам)); + ИспользуемыеТипыЗначений.ХешСумма = Base64Строка(Хеширование.ХешСумма); + Если ТолькоХешСумма Тогда + Возврат ИспользуемыеТипыЗначений; + КонецЕсли; + КонецЕсли; + Таблицы = ИспользуемыеПоТаблицам.Скопировать(, "Таблица"); + Таблицы.Свернуть("Таблица"); + Идентификаторы = Таблицы.ВыгрузитьКолонку("Таблица"); + ОбъектыМетаданных = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(Идентификаторы, Ложь); + ТекущаяТаблица = Неопределено; + Для Каждого Строка Из ИспользуемыеПоТаблицам Цикл + Если ТекущаяТаблица <> Строка.Таблица Тогда + ОбъектМетаданных = ОбъектыМетаданных.Получить(Строка.Таблица); + Если ОбъектМетаданных = Неопределено Тогда + Продолжить; + КонецЕсли; + ТекущееПолноеИмя = ОбъектМетаданных.ПолноеИмя(); + ТекущаяТаблица = Строка.Таблица; + ТекущиеИспользуемыеТипы = Новый Соответствие; + ИспользуемыеТипыЗначений.ПоТаблицам.Вставить(ТекущееПолноеИмя, ТекущиеИспользуемыеТипы); + КонецЕсли; + ТекущиеИспользуемыеТипы.Вставить(ТипЗнч(Строка.ТипЗначенийДоступа), Истина); + КонецЦикла; + КонецЕсли; Для Каждого СвойстваВидаДоступа Из СвойстваВидовДоступа.Массив Цикл - Если Не ВсеВидыДоступаИспользуются - И Не ВидДоступаИспользуется(СвойстваВидаДоступа.Ссылка) Тогда + Если ВсеВидыДоступаИспользуются <> Истина + И Используемые.Найти(СвойстваВидаДоступа.Ссылка) = Неопределено Тогда Продолжить; КонецЕсли; - ИспользуемыеТипыЗначений.Вставить(СвойстваВидаДоступа.ТипЗначений, Истина); + ИспользуемыеТипыЗначений.ДляИБ.Вставить(СвойстваВидаДоступа.ТипЗначений, Истина); Для Каждого ОписаниеДополнительногоТипа Из СвойстваВидаДоступа.ДополнительныеТипы Цикл - ИспользуемыеТипыЗначений.Вставить(ОписаниеДополнительногоТипа.ТипЗначений, Истина); + ИспользуемыеТипыЗначений.ДляИБ.Вставить(ОписаниеДополнительногоТипа.ТипЗначений, Истина); КонецЦикла; КонецЦикла; @@ -22244,7 +22969,7 @@ ОбщийКонтекст = Неопределено; Попытка - ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(Параметры.ВсеВидыДоступаИспользуются, Ложь); + ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(, Параметры.ВсеВидыДоступаИспользуются, Ложь); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.ОшибкаОписанияОграничения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); @@ -22909,6 +23634,18 @@ КонецФункции // Для функций ДействующиеПараметрыОграниченияДоступа, НоваяВерсияПараметровОграниченияДоступа. +// +// Возвращаемое значение: +// Структура: +// * Версия - Число +// - Неопределено +// * ХешСумма - Строка +// - Неопределено +// * ДатаСоздания - Дата +// - Неопределено +// * ВерсииПараметровШаблонов - ХранилищеЗначения +// - Неопределено +// Функция ОписаниеПоследнейВерсии(ПрочитатьВерсииПараметровШаблонов = Ложь) Запрос = Новый Запрос; @@ -22932,7 +23669,10 @@ Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); - Возврат Выборка; + Результат = Новый Структура("Версия, ХешСумма, ДатаСоздания, ВерсииПараметровШаблонов"); + ЗаполнитьЗначенияСвойств(Результат, Выборка); + + Возврат Результат; КонецФункции @@ -22975,6 +23715,8 @@ Иначе Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПараметрыОграниченияДоступа.ДляШаблоновВСеансахПользователей", "Неопределено"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "ПараметрыОграниченияДоступа.ДляШаблоновВСеансахВнешнихПользователей", "Неопределено"); КонецЕсли; Запрос.УстановитьПараметр("Версия", Версия); @@ -23634,7 +24376,17 @@ // Число нужно увеличивать при внесении изменений в состав параметров кэша // (в том числе при изменении версии шаблонов). - Возврат "22"; + Возврат "24" + ВерсияПеревода(); + +КонецФункции + +Функция ВерсияПеревода() + + Если ВариантВстроенногоЯзыкаРусский() Тогда + Возврат ""; + Иначе + Возврат "/" + Метаданные.Версия; + КонецЕсли; КонецФункции @@ -23647,12 +24399,12 @@ Функция ВерсииШаблоновОграниченияДоступа() Возврат - ",ДляОбъекта8, - |,ДляРегистра8, - |,ПоЗначениям17, - |,ПоЗначениямРасширенный17, - |,ПоЗначениямИНаборамРасширенный17, - |,ПоНаборамЗначений17,"; + ",ДляОбъекта9, + |,ДляРегистра9, + |,ПоЗначениям18, + |,ПоЗначениямРасширенный18, + |,ПоЗначениямИНаборамРасширенный18, + |,ПоНаборамЗначений18,"; КонецФункции @@ -24088,6 +24840,7 @@ КонтекстДляПользователей.Вставить("СпискиСДатой", СпискиСДатой); КонтекстДляПользователей.Вставить("ИдентификаторыСписков", ИдентификаторыСписков); КонтекстДляПользователей.Вставить("ВсеВидыОграниченийПрав", ВсеВидыОграниченийПрав); + КонтекстДляПользователей.Вставить("ВедущиеРоли", Новый Соответствие); ДобавитьХранимыеПараметрыОграниченияДляВидаПользователей(КонтекстДляПользователей); @@ -24104,6 +24857,7 @@ КонтекстДляВнешнихПользователей.Вставить("СпискиСДатой", СпискиСДатой); КонтекстДляВнешнихПользователей.Вставить("ИдентификаторыСписков", ИдентификаторыСписков); КонтекстДляВнешнихПользователей.Вставить("ВсеВидыОграниченийПрав", ВсеВидыОграниченийПрав); + КонтекстДляВнешнихПользователей.Вставить("ВедущиеРоли", Новый Соответствие); ДобавитьХранимыеПараметрыОграниченияДляВидаПользователей(КонтекстДляВнешнихПользователей); @@ -24132,6 +24886,11 @@ КонецЕсли; КонецЦикла; + // Заполнение ведущих ролей для пользователей и внешних пользователей. + ВедущиеРоли = Новый Соответствие; + ДобавитьВедущиеРоли(ВедущиеРоли, "ДляПользователей", КонтекстДляПользователей); + ДобавитьВедущиеРоли(ВедущиеРоли, "ДляВнешнихПользователей", КонтекстДляВнешнихПользователей); + // Расчет версий ограничения доступа. ВерсииОграниченийСписков = Новый Соответствие; Версии = Новый СписокЗначений; @@ -24164,7 +24923,9 @@ ПараметрыЗаписи.ВедущиеСписки = ВедущиеСписки; ПараметрыЗаписи.ДополнительныйКонтекст = ДополнительныйКонтекст; ПараметрыЗаписи.СпискиСДатой = СпискиСДатой; - ПараметрыЗаписи.ИспользуемыеТипыЗначений = Новый ХранилищеЗначения(ОбщийКонтекст.ИспользуемыеТипыЗначений); + ПараметрыЗаписи.ВедущиеРоли = ВедущиеРоли; + ПараметрыЗаписи.ИспользуемыеТипыЗначений = Новый ХранилищеЗначения( + Новый Структура("ХешСумма", ОбщийКонтекст.ИспользуемыеТипыЗначений.ХешСумма)); ПараметрыЗаписи.ВнешниеПользователиВключены = ОбщийКонтекст.ВнешниеПользователиВключены; ПараметрыЗаписи.ОграничениеДоступаВключено = ОбщийКонтекст.ОграничениеДоступаВключено; @@ -24596,6 +25357,17 @@ Для Каждого КлючИЗначение Из СвойстваСписка.Параметры.ВсеВидыОграниченийПрав Цикл Контекст.ВсеВидыОграниченийПрав.Вставить(СвойстваСписка.ПолноеИмя + "." + КлючИЗначение.Ключ, Истина); КонецЦикла; + + Если ЗначениеЗаполнено(СвойстваСписка.Параметры.Контекст.ВедущиеРоли) Тогда + Для Каждого КлючИЗначение Из СвойстваСписка.Параметры.Контекст.ВедущиеРоли Цикл + ЗависимыеСписки = Контекст.ВедущиеРоли.Получить(КлючИЗначение.Ключ); + Если ЗависимыеСписки = Неопределено Тогда + ЗависимыеСписки = Новый Соответствие; + Контекст.ВедущиеРоли.Вставить(КлючИЗначение.Ключ, ЗависимыеСписки); + КонецЕсли; + ЗависимыеСписки.Вставить(СвойстваСписка.ПолноеИмя, Истина); + КонецЦикла; + КонецЕсли; КонецЦикла; КонецПроцедуры @@ -24798,6 +25570,21 @@ КонецФункции +// Для функции ХранимыеПараметрыОграниченияДоступа. +Процедура ДобавитьВедущиеРоли(ВедущиеРоли, ИмяСвойстваВидаПользователей, КонтекстВидаПользователей) + + Для Каждого ОписаниеВедущейРоли Из КонтекстВидаПользователей.ВедущиеРоли Цикл + ИмяРоли = ОписаниеВедущейРоли.Ключ; + ЗависимыеСписки = ВедущиеРоли.Получить(ИмяРоли); + Если ЗависимыеСписки = Неопределено Тогда + ЗависимыеСписки = Новый Структура("ДляПользователей, ДляВнешнихПользователей"); + ВедущиеРоли.Вставить(ИмяРоли, ЗависимыеСписки); + КонецЕсли; + ЗависимыеСписки[ИмяСвойстваВидаПользователей] = + Новый ФиксированноеСоответствие(ОписаниеВедущейРоли.Значение); + КонецЦикла; + +КонецПроцедуры // Для функции ХранимыеПараметрыОграниченияДоступа. Процедура ДобавитьВедущиеСписки(ВедущиеСписки, ИмяСвойстваВидаПользователей, ЗависимыйСписок, @@ -24988,7 +25775,14 @@ Процедура НастроитьПараметрыШаблонов(СвойстваСписка, Контекст) Параметры = СвойстваСписка.Параметры; + ПараметрыШаблонов = Контекст.ПараметрыШаблонов; + Если Параметры.ДоступЗапрещен Тогда + Уточнение = ?(Контекст.ДляВнешнихПользователей + И Не Контекст.ОбщийКонтекст.ВнешниеПользователиВключены, "1", "0"); + ПараметрыШаблонов.СпискиСОграничениемЧерезКлючиДоступаГруппДоступа = + ПараметрыШаблонов.СпискиСОграничениемЧерезКлючиДоступаГруппДоступа + + СвойстваСписка.ПолноеИмя + ";" + Уточнение + Символы.ПС; Возврат; КонецЕсли; @@ -25010,8 +25804,6 @@ Контекст.ВерсииПараметровШаблонов.Вставить(КлючТаблицы, Версии); КонецЕсли; - ПараметрыШаблонов = Контекст.ПараметрыШаблонов; - Если Параметры.ОграничениеЧтенияОтключено Тогда ПараметрыШаблонов.СпискиСОтключеннымОграничениемЧтения = ПараметрыШаблонов.СпискиСОтключеннымОграничениемЧтения @@ -25024,9 +25816,7 @@ Если Параметры.ИспользуетсяОграничениеПоВладельцу Или Параметры.ЭтоСсылочныйТип Тогда - СвойстваОграничения = СвойстваОграниченияСписка(СвойстваСписка.ПолноеИмя, - Контекст.ДополнительныйКонтекст); - ПолеВладельца = СвойстваОграничения.ПолеВладельца; // См. НовоеПолеВладельца + ПолеВладельца = Параметры.ПолеВладельца; // См. НовоеПолеВладельца Если ПолеВладельца <> Неопределено Тогда Поля = ":" + ПолеВладельца.Имя; Если Не Параметры.ИспользуетсяОграничениеПоВладельцу Тогда @@ -25126,12 +25916,14 @@ ХранимыеТекущиеВерсии = НоваяСтруктураХранимыхВерсийПараметровШаблонов(); ТекущиеСвойстваОграниченияСписковДляПользователей = Новый Соответствие; ТекущиеСвойстваОграниченияСписковДляВнешнихПользователей = Новый Соответствие; + ВерсииПараметровШаблоновПолучены = Ложь; Если ТипЗнч(ОписаниеВерсии.ВерсииПараметровШаблонов) = Тип("ХранилищеЗначения") Тогда СодержимоеХранилища = ОписаниеВерсии.ВерсииПараметровШаблонов.Получить(); Если ЗначениеЗаполнено(СодержимоеХранилища) Тогда ХранимыеТекущиеВерсии = СтруктураХранимыхВерсийПараметровШаблонов(СодержимоеХранилища); Если ХранимыеТекущиеВерсии.ВерсияСтруктурыВерсий = ВерсияСтруктурыВерсийПараметровШаблонов() Тогда + ВерсииПараметровШаблоновПолучены = Истина; ТекущиеСвойстваОграниченияСписковДляПользователей = Неопределено; ТекущиеСвойстваОграниченияСписковДляВнешнихПользователей = Неопределено; Иначе @@ -25152,6 +25944,9 @@ КонецЕсли; КонецЕсли; КонецЕсли; + Если Не ВерсииПараметровШаблоновПолучены Тогда + ОписаниеВерсии.ХешСумма = "#" + ОписаниеВерсии.ХешСумма; + КонецЕсли; Если ПараметрыЗаписи.Свойство("СтрокиВерсии") Тогда СтрокиВерсии = ПараметрыЗаписи.СтрокиВерсии; @@ -25237,6 +26032,12 @@ КонецФункции // Для процедуры ЗаполнитьПараметрыДляШаблонов. +// +// Параметры: +// Параметры - см. НоваяСтруктураДляЗаполненияПараметровШаблонов +// ХранилищеДляШаблоновВСеансах - ХранилищеЗначения - обновляемое значение +// СпискиСОграничениемПоПолям - Строка - возвращаемое значение +// Процедура ЗаполнитьПараметрыДляШаблоновДляВидаПользователей(Параметры, ХранилищеДляШаблоновВСеансах, СпискиСОграничениемПоПолям) @@ -25808,7 +26609,7 @@ // ** Значение - Булево - Истина // * ВнешниеПользователиВключены - Булево // * ОграничениеДоступаВключено - Булево -// * ИспользуемыеТипыЗначений - ХранилищеЗначения - соответствие из Тип и Истина. +// * ИспользуемыеТипыЗначений - ХранилищеЗначения - смотри функцию ИспользуемыеТипыЗначений. // Функция НоваяСтруктураХранимыхПараметровЗаписи() @@ -25818,6 +26619,7 @@ ХранимыеПараметрыЗаписи.Вставить("ВедущиеСписки", Новый Соответствие); ХранимыеПараметрыЗаписи.Вставить("ДополнительныйКонтекст", Новый Структура); ХранимыеПараметрыЗаписи.Вставить("СпискиСДатой", Новый Соответствие); + ХранимыеПараметрыЗаписи.Вставить("ВедущиеРоли", Новый Соответствие); ХранимыеПараметрыЗаписи.Вставить("ВнешниеПользователиВключены", Ложь); ХранимыеПараметрыЗаписи.Вставить("ОграничениеДоступаВключено", Ложь); ХранимыеПараметрыЗаписи.Вставить("ИспользуемыеТипыЗначений", Новый ХранилищеЗначения(Новый Соответствие)); @@ -26151,9 +26953,10 @@ // Когда ЕстьЗависимыеСпискиБезЗаписиКлючейДоступа = Истина, // тогда показывает наличие права Изменение в одной из ролей // БазовыеПрава* или БазовыеПраваВнешнихПользователей*. -// * ЕстьВедущиеКлючиДоступа - Булево - признак наличия ведущих ключей доступа в ограничении. -// * ЕстьВедущиеСпискиПоПравам - Булево - признак наличия ведущих списков по правам в ограничении. -// * ТипыВладельцевНастроекПрав - ФиксированноеСоответствие - типы владельцев настроек прав, используемые +// * ЕстьВедущиеКлючиДоступа - Булево - признак наличия ведущих ключей доступа в ограничении. +// * ЕстьВедущиеСпискиПоПравам - Булево - признак наличия ведущих списков по правам в ограничении. +// * ЕстьФункцияПравоДоступаИлиРольДоступна - Булево - признак наличия перечисленных функций в ограничении. +// * ТипыВладельцевНастроекПрав - ФиксированноеСоответствие - типы владельцев настроек прав, используемые // при расчете прав на ключи доступа (см. ПоТипамСсылок). // * ИдентификаторТаблицыНастроекПрав - СправочникСсылка.ИдентификаторыОбъектовМетаданных - идентификатор // списка, если для него используются отдельные настройки прав @@ -26199,6 +27002,7 @@ Результат.Вставить("ИзменениеРазрешеноДляВсехПользователей", Ложь); Результат.Вставить("ЕстьВедущиеКлючиДоступа", Ложь); Результат.Вставить("ЕстьВедущиеСпискиПоПравам", Ложь); + Результат.Вставить("ЕстьФункцияПравоДоступаИлиРольДоступна", Ложь); Результат.Вставить("ТипыВладельцевНастроекПрав", ОбщийКонтекст.ТипыВладельцевНастроекПрав); Результат.Вставить("ИдентификаторТаблицыНастроекПрав", Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка()); Результат.Вставить("ЕстьВладельцыНастроекПрав", Ложь); @@ -26254,6 +27058,7 @@ Контекст.Вставить("СписокСПериодом", Результат.СписокСПериодом); Контекст.Вставить("ИмяКоллекцииТипа", ИмяКоллекцииТипа); Контекст.Вставить("СвойстваВерсии", Новый Массив); + Контекст.Вставить("ВедущиеРоли", Новый Соответствие); ДобавитьСвойствоВерсии(Контекст, Контекст, "Список"); ДобавитьСвойствоВерсии(Контекст, Контекст, "ДляВнешнихПользователей"); @@ -26309,9 +27114,17 @@ Результат.ИмяОтдельногоРегистраКлючей = Контекст.ИмяОтдельногоРегистраКлючей; КонецЕсли; + ЗаполнитьНаличиеОграниченияПоПравам(Контекст, Результат, Ложь); + ЗаполнитьОграничениеПоОбъектуВладельцуДоУпрощения(Результат, Контекст); + ЗаполнитьСвойстваПолей(Контекст); - Если ДляВнешнихПользователей И Не ОбщийКонтекст.ВнешниеПользователиВключены Тогда + Результат.ЕстьФункцияПравоДоступаИлиРольДоступна = Контекст.ЕстьФункцияПравоДоступаИлиРольДоступна; + + Если ДляВнешнихПользователей И Не ОбщийКонтекст.ВнешниеПользователиВключены + Или ЭтоБезусловноеОграничение(Контекст, Результат) Тогда + + Результат.ДоступЗапрещен = Истина; Возврат Результат; КонецЕсли; @@ -26319,8 +27132,8 @@ Результат.ОграничениеОтключено = Истина; Результат.ОграничениеЧтенияОтключено = Истина; - ЗаполнитьНаличиеОграниченияПоПравам(Контекст, Результат); - ЗаполнитьОграничениеПоОбъектуВладельцу(Результат, Контекст); + ЗаполнитьНаличиеОграниченияПоПравам(Контекст, Результат, Истина); + ЗаполнитьОграничениеПоОбъектуВладельцуПослеУпрощения(Результат, Контекст); ЗаполнитьНаличиеВедущихКлючейИСписковИВладельцевНастроекПрав(Результат, Контекст); УдалитьПоляНеиспользуемыхВидовДоступа(Результат, Контекст); ЗаполнитьНаличиеОграниченияПоВидуДоступаПользователи(Результат, Контекст); @@ -26366,6 +27179,7 @@ Контекст.СтруктураОграничения.ОграничениеИзменения, Контекст); Контекст.Удалить("ИмяПрава"); + ДобавитьСвойствоВерсииВедущиеРоли(Контекст); Если Результат.ИспользуетсяОграничениеПоВладельцу Тогда Контекст.ВедущиеСпискиПоЗначениямПолей = ОписаниеВедущихСписковПоЗначениямПолей(); @@ -26430,6 +27244,7 @@ // * ВедущиеСпискиПоКлючамДоступа - см. ОписаниеВедущихСписковПоПолюСсылка // * ВедущиеСпискиПоЗначениямСГруппами - см. ОписаниеВедущихСписковПоПолюСсылка // * ЕстьПроверкаАвторизованногоПользователя - Булево +// * ЕстьФункцияПравоДоступаИлиРольДоступна - Булево // * НеиспользуемыеТипыЗначенийДоступа - Массив из Тип // * ВсеВидыОграниченийПрав - Соответствие // * ЕстьОграничениеПоПользователям - Булево @@ -26461,6 +27276,9 @@ // ** Ключ - Строка - имя таблицы ключа (ИмяГруппыПолейКлючаДоступа) // ** Значение - Массив из Строка - имя реквизита таблицы ключа (ИмяРеквизитаГруппыПолейКлючаДоступа) // * СтруктураРасчетаПраваСвойстваВерсии - Массив из Строка +// * ВедущиеРоли - Соответствие из КлючИЗначение: +// ** Ключ - Строка - имя роли +// ** Значение - Булево - значение Истина. // // Свойства из ОбщийКонтекст: // * СвойстваВидовДоступа - см. ХранимоеОписаниеСвойствВидовДоступа @@ -26574,6 +27392,23 @@ КонецФункции +// Для процедуры ПараметрыОграниченияПоСтруктуреОграничения. +Процедура ДобавитьСвойствоВерсииВедущиеРоли(Контекст) + + Если Не ЗначениеЗаполнено(Контекст.ВедущиеРоли) Тогда + Возврат; + КонецЕсли; + + СписокЗначений = Новый СписокЗначений; + Для Каждого КлючИЗначение Из Контекст.ВедущиеРоли Цикл + СписокЗначений.Добавить(КлючИЗначение.Ключ); + КонецЦикла; + СписокЗначений.СортироватьПоПредставлению(); + + ДобавитьЭлементВерсии(Контекст, "ВедущиеРоли", СписокЗначений.ВыгрузитьЗначения()); + +КонецПроцедуры + // Для процедуры УдалитьПоляНеиспользуемыхВидовДоступа и функции ГруппыДополнительныхТаблиц. Процедура ДобавитьСвойстваВерсии(Контекст, Структура, ИменаПолей = "") @@ -26807,7 +27642,23 @@ // Контекст - см. КонтекстПараметровПоСтруктуреОграничения // Результат - см. ПараметрыОграниченияПоСтруктуреОграничения // -Процедура ЗаполнитьНаличиеОграниченияПоПравам(Контекст, Результат) +Функция ЭтоБезусловноеОграничение(Контекст, Результат) + + СтруктураОграничения = Контекст.СтруктураОграничения; + + Возврат ЗначениеЗаполнено(СтруктураОграничения.ОграничениеЧтения) + И СтруктураОграничения.ОграничениеЧтения.Узел = "Константа" + И СтруктураОграничения.ОграничениеЧтения.Значение = Ложь; + +КонецФункции + +// Для функции ПараметрыОграниченияДоступа. +// +// Параметры: +// Контекст - см. КонтекстПараметровПоСтруктуреОграничения +// Результат - см. ПараметрыОграниченияПоСтруктуреОграничения +// +Процедура ЗаполнитьНаличиеОграниченияПоПравам(Контекст, Результат, ПослеУпрощения) СтруктураОграничения = Контекст.СтруктураОграничения; @@ -26821,8 +27672,10 @@ И ( СтруктураОграничения.ОграничениеИзменения.Узел <> "Константа" Или СтруктураОграничения.ОграничениеИзменения.Значение <> Истина); - ДобавитьСвойствоВерсии(Контекст, Результат, "ЕстьОграничениеЧтения"); - ДобавитьСвойствоВерсии(Контекст, Результат, "ЕстьОграничениеИзменения"); + Если ПослеУпрощения Тогда + ДобавитьСвойствоВерсии(Контекст, Результат, "ЕстьОграничениеЧтения"); + ДобавитьСвойствоВерсии(Контекст, Результат, "ЕстьОграничениеИзменения"); + КонецЕсли; КонецПроцедуры @@ -26832,7 +27685,7 @@ // Результат - см. ПараметрыОграниченияПоСтруктуреОграничения // Контекст - см. КонтекстПараметровПоСтруктуреОграничения // -Процедура ЗаполнитьОграничениеПоОбъектуВладельцу(Результат, Контекст) +Процедура ЗаполнитьОграничениеПоОбъектуВладельцуДоУпрощения(Результат, Контекст) НастройкаПоВладельцу = Контекст.СпискиСОграничениемПоВладельцу.Получить(Контекст.Список); ПолеВладельца = НовоеПолеВладельца(); @@ -26840,7 +27693,6 @@ ТребуетсяОграничениеПоВладельцу = Ложь; Если ТипЗнч(НастройкаПоВладельцу) = Тип("Булево") Тогда ТребуетсяОграничениеПоВладельцу = НастройкаПоВладельцу; - ПолеВладельца.Отключено = Не НастройкаПоВладельцу; КонецЕсли; Результат.ТребуетсяОграничениеПоВладельцу = ТребуетсяОграничениеПоВладельцу; @@ -26852,8 +27704,11 @@ Если Результат.ЕстьОграничениеЧтения Тогда - Если ОграничениеЧтения.Узел <> "ЧтениеОбъектаРазрешено" Тогда - Если ТребуетсяОграничениеПоВладельцу Тогда + Если ТребуетсяОграничениеПоВладельцу Или Не Контекст.ЭтоСсылочныйТип Тогда + Если ОграничениеЧтения.Узел <> "ЧтениеОбъектаРазрешено" Тогда + Если Не ТребуетсяОграничениеПоВладельцу Тогда + Возврат; + КонецЕсли; Если ЗначениеЗаполнено(ОграничениеИзменения) Тогда ШаблонОшибки = НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", @@ -26870,144 +27725,117 @@ Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; КонецЕсли; ВызватьИсключение ТекстОшибки; - Иначе + КонецЕсли; + Иначе + ОграничениеЧтения = ВозможноеОграничениеПоОбъектуВладельцу(ОграничениеЧтения, Ложь, Контекст); + Если ОграничениеЧтения = Неопределено Тогда Возврат; КонецЕсли; КонецЕсли; - Если Не ФункцияБезУточненийТиповСПолемБезВложений(ОграничениеЧтения) Тогда - Если ТребуетсяОграничениеПоВладельцу Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", - |но параметры функции ""ЧтениеОбъектаРазрешено"" не представлены - |только одним параметром - полем владельцем без других параметров.'"), - ИмяПризнакаОптимизации); - ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); - Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда - Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + Если ЗначениеЗаполнено(ОграничениеЧтения) Тогда + Если Не ФункцияБезУточненийТиповСПолемБезВложений(ОграничениеЧтения) Тогда + Если ТребуетсяОграничениеПоВладельцу Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", + |но параметры функции ""ЧтениеОбъектаРазрешено"" не представлены + |только одним параметром - полем владельцем без других параметров.'"), + ИмяПризнакаОптимизации); + ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); + Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда + Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + КонецЕсли; + ВызватьИсключение ТекстОшибки; + Иначе + Возврат; КонецЕсли; - ВызватьИсключение ТекстОшибки; - Иначе - Возврат; КонецЕсли; + ОграничениеЧтенияПоле = ОграничениеЧтения.Поле; // См. ОписаниеУзла + ПолеВладельца.Имя = ОграничениеЧтенияПоле.Имя; КонецЕсли; - ОграничениеЧтенияПоле = ОграничениеЧтения.Поле; // См. ОписаниеУзла - ПолеВладельца.Имя = ОграничениеЧтенияПоле.Имя; КонецЕсли; Если Результат.ЕстьОграничениеИзменения Тогда - Если ОграничениеИзменения.Узел <> "ЧтениеОбъектаРазрешено" - И ОграничениеИзменения.Узел <> "ИзменениеОбъектаРазрешено" Тогда + Если ТребуетсяОграничениеПоВладельцу Или Не Контекст.ЭтоСсылочныйТип Тогда - Если ТребуетсяОграничениеПоВладельцу Тогда + Если ОграничениеИзменения.Узел <> "ЧтениеОбъектаРазрешено" + И ОграничениеИзменения.Узел <> "ИзменениеОбъектаРазрешено" Тогда + + Если Не ТребуетсяОграничениеПоВладельцу Тогда + Возврат; + КонецЕсли; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", |но указанное ограничение изменения не представлено одной функцией - |""ЧтениеОбъектаРазрешено"" или ""ИзменениеОбъектаРазрешено"".'"), - ИмяПризнакаОптимизации); + |""%2"" или ""%3"".'"), + ИмяПризнакаОптимизации, "ЧтениеОбъектаРазрешено", "ИзменениеОбъектаРазрешено"); ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; КонецЕсли; ВызватьИсключение ТекстОшибки; - Иначе + КонецЕсли; + Иначе + ОграничениеИзменения = ВозможноеОграничениеПоОбъектуВладельцу(ОграничениеИзменения, Истина, Контекст); + Если ОграничениеИзменения = Неопределено Тогда Возврат; КонецЕсли; КонецЕсли; - Если Не ФункцияБезУточненийТиповСПолемБезВложений(ОграничениеИзменения) Тогда - Если ТребуетсяОграничениеПоВладельцу Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", - |но параметры функции ""%2"" не представлены - |только одним параметром - полем владельцем без других параметров.'"), - ИмяПризнакаОптимизации, - ОграничениеИзменения.Узел); - ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); - Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда - Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + Если ЗначениеЗаполнено(ОграничениеИзменения) Тогда + Если Не ФункцияБезУточненийТиповСПолемБезВложений(ОграничениеИзменения) Тогда + Если ТребуетсяОграничениеПоВладельцу Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", + |но параметры функции ""%2"" не представлены + |только одним параметром - полем владельцем без других параметров.'"), + ИмяПризнакаОптимизации, + ОграничениеИзменения.Узел); + ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); + Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда + Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + КонецЕсли; + ВызватьИсключение ТекстОшибки; + Иначе + Возврат; КонецЕсли; - ВызватьИсключение ТекстОшибки; - Иначе - Возврат; КонецЕсли; - КонецЕсли; - - ОграничениеИзмененияПоле = ОграничениеИзменения.Поле; // См. ОписаниеУзла - Если ПолеВладельца.Имя = "" Тогда - ПолеВладельца.Имя = ОграничениеИзмененияПоле.Имя; + ОграничениеИзмененияПоле = ОграничениеИзменения.Поле; // См. ОписаниеУзла - ИначеЕсли ПолеВладельца.Имя <> ОграничениеИзмененияПоле.Имя Тогда - Если ТребуетсяОграничениеПоВладельцу Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", - |но поле владельца не совпадает в ограничениях чтения и изменения.'"), - ИмяПризнакаОптимизации, - ОграничениеИзменения.Узел); - ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); - Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда - Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + Если ПолеВладельца.Имя = "" Тогда + ПолеВладельца.Имя = ОграничениеИзмененияПоле.Имя; + + ИначеЕсли ПолеВладельца.Имя <> ОграничениеИзмененияПоле.Имя Тогда + Если ТребуетсяОграничениеПоВладельцу Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", + |но поле владельца не совпадает в ограничениях чтения и изменения.'"), + ИмяПризнакаОптимизации, + ОграничениеИзменения.Узел); + ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); + Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда + Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + КонецЕсли; + ВызватьИсключение ТекстОшибки; + Иначе + Возврат; КонецЕсли; - ВызватьИсключение ТекстОшибки; - Иначе - Возврат; КонецЕсли; + ПолеВладельца.ИзменениеКакЧтение = + ОграничениеИзменения.Узел <> "ИзменениеОбъектаРазрешено"; + Иначе + ПолеВладельца.ИзменениеКакЧтение = Истина; КонецЕсли; - ПолеВладельца.ИзменениеКакЧтение = - ОграничениеИзменения.Узел <> "ИзменениеОбъектаРазрешено"; Иначе ПолеВладельца.ИзменениеКакЧтение = Истина; КонецЕсли; - СвойстваПолей = Контекст.СвойстваПолей; - - Если СвойстваПолей.Количество() <> 1 Тогда - Если ТребуетсяОграничениеПоВладельцу И СвойстваПолей.Количество() <> 0 Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", - |но количество полей, используемых в ограничении, более одного.'"), - ИмяПризнакаОптимизации); - ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); - Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда - Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; - КонецЕсли; - ВызватьИсключение ТекстОшибки; - Иначе - Возврат; - КонецЕсли; - КонецЕсли; - - СвойстваПоля = СвойстваПолей[0]; - - ТипИОМ = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных"); - ТипИОР = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений"); - - КоличествоТиповИдентификаторовВКонечномПоле = 0; - Если СвойстваПоля.ТипКонечногоПоля.СодержитТип(ТипИОМ) Тогда - КоличествоТиповИдентификаторовВКонечномПоле = 1; - КонецЕсли; - Если СвойстваПоля.ТипКонечногоПоля.СодержитТип(ТипИОР) Тогда - КоличествоТиповИдентификаторовВКонечномПоле = КоличествоТиповИдентификаторовВКонечномПоле + 1; - КонецЕсли; - - Если СвойстваПоля.ТипКонечногоПоля.Типы().Количество() - КоличествоТиповИдентификаторовВКонечномПоле - <> СвойстваПоля.ТипыСохраненияКлючейДоступа.Количество() Тогда - - НекорректныеТипы = Новый Массив; - Для Каждого Тип Из СвойстваПоля.ТипКонечногоПоля.Типы() Цикл - Если СвойстваПоля.ТипыСохраненияКлючейДоступа.Найти(Тип) <> Неопределено - Или Тип = ТипИОМ - Или Тип = ТипИОР Тогда - Продолжить; - КонецЕсли; - НекорректныеТипы.Добавить(ИмяТипаНаЯзыкеЗапросов(Тип)); - КонецЦикла; + Если Не ЗначениеЗаполнено(ПолеВладельца.Имя) Тогда Если ТребуетсяОграничениеПоВладельцу Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", - |но для следующих таблиц невозможно записать ключи доступа: - |%2'"), - ИмяПризнакаОптимизации, - СтрСоединить(НекорректныеТипы, Символы.ПС)); + |но указанное ограничение не содержит ни одной из функций + |""%2"", ""%3"".'"), + ИмяПризнакаОптимизации, "ЧтениеОбъектаРазрешено", "ИзменениеОбъектаРазрешено"); ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; @@ -27020,8 +27848,210 @@ Результат.ПолеВладельца = ПолеВладельца; + Если Не Контекст.ЭтоСсылочныйТип Тогда + Результат.ТребуетсяОграничениеПоВладельцу = Истина; + КонецЕсли; + +КонецПроцедуры + +// Для процедуры ЗаполнитьОграничениеПоОбъектуВладельцуДоУпрощения. +Функция ВозможноеОграничениеПоОбъектуВладельцу(Условие, ЭтоОграничениеИзменения, Контекст) + + Если Не ЗначениеЗаполнено(Условие) Тогда + Возврат Новый Структура; + КонецЕсли; + + Если Условие.Узел = "Поле" + Или Условие.Узел = "ЕстьNull" + Или Условие.Узел = "=" + Или Условие.Узел = "<>" + Или Условие.Узел = "В" + Или Условие.Узел = "Константа" + Или Условие.Узел = "ЗначениеРазрешено" Тогда + + Возврат Новый Структура; + + ИначеЕсли Условие.Узел = "ЭтоАвторизованныйПользователь" + Или Условие.Узел = "ЧтениеСпискаРазрешено" + Или Условие.Узел = "ИзменениеСпискаРазрешено" + Или Условие.Узел = "ПравоДоступа" + Или Условие.Узел = "РольДоступна" Тогда + + Возврат Неопределено; + + ИначеЕсли Условие.Узел = "И" + Или Условие.Узел = "Или" Тогда + + НайденноеОграничение = Новый Структура; + Для Каждого Аргумент Из Условие.Аргументы Цикл + Если Не ОбработаноВозможноеОграничениеПоОбъектуВладельцу(Аргумент, + ЭтоОграничениеИзменения, НайденноеОграничение, Контекст) Тогда + Возврат Неопределено; + КонецЕсли; + КонецЦикла; + Возврат НайденноеОграничение; + + ИначеЕсли Условие.Узел = "Не" + Или Условие.Узел = "ДляВсехСтрок" + Или Условие.Узел = "ДляОднойИзСтрок" Тогда + + Возврат ВозможноеОграничениеПоОбъектуВладельцу(Условие.Аргумент, + ЭтоОграничениеИзменения, Контекст); + + ИначеЕсли Условие.Узел = "Выбор" Тогда + НайденноеОграничение = Новый Структура; + Для Каждого Когда Из Условие.Когда Цикл + Если Не ОбработаноВозможноеОграничениеПоОбъектуВладельцу(Когда.Значение, + ЭтоОграничениеИзменения, НайденноеОграничение, Контекст) Тогда + Возврат Неопределено; + КонецЕсли; + КонецЦикла; + Если Не ОбработаноВозможноеОграничениеПоОбъектуВладельцу(Условие.Иначе, + ЭтоОграничениеИзменения, НайденноеОграничение, Контекст) Тогда + Возврат Неопределено; + КонецЕсли; + Возврат НайденноеОграничение; + + ИначеЕсли Условие.Узел = "ЧтениеОбъектаРазрешено" + Или Условие.Узел = "ИзменениеОбъектаРазрешено" И ЭтоОграничениеИзменения Тогда + + Возврат Условие; + КонецЕсли; + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При заполнении возможного ограничения по объекту владельцу + |для списка ""%1"" + |узел не поддерживается ""%2"".'"), + Контекст.Список, + Условие.Узел); + + ВызватьИсключение ТекстОшибки; + +КонецФункции + +// Для функции ВозможноеОграничениеПоОбъектуВладельцу. +Функция ОбработаноВозможноеОграничениеПоОбъектуВладельцу(Условие, + ЭтоОграничениеИзменения, НайденноеОграничение, Контекст) + + ВложенноеОграничение = ВозможноеОграничениеПоОбъектуВладельцу(Условие, + ЭтоОграничениеИзменения, Контекст); + + Если ВложенноеОграничение = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если ЗначениеЗаполнено(ВложенноеОграничение) Тогда + Если ЗначениеЗаполнено(НайденноеОграничение) Тогда + Возврат Ложь; + КонецЕсли; + НайденноеОграничение = ВложенноеОграничение; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Для функции ПараметрыОграниченияДоступа. +// +// Параметры: +// Результат - см. ПараметрыОграниченияПоСтруктуреОграничения +// Контекст - см. КонтекстПараметровПоСтруктуреОграничения +// +Процедура ЗаполнитьОграничениеПоОбъектуВладельцуПослеУпрощения(Результат, Контекст) + + ПолеВладельца = Результат.ПолеВладельца; + Если ПолеВладельца = Неопределено Тогда + Возврат; + КонецЕсли; + ТребуетсяОграничениеПоВладельцу = Результат.ТребуетсяОграничениеПоВладельцу; + + НастройкаПоВладельцу = Контекст.СпискиСОграничениемПоВладельцу.Получить(Контекст.Список); + Если ТипЗнч(НастройкаПоВладельцу) = Тип("Булево") Тогда + ПолеВладельца.Отключено = Не НастройкаПоВладельцу; + Иначе + ПолеВладельца.Отключено = Ложь; + КонецЕсли; + + ОграничениеЧтения = Контекст.СтруктураОграничения.ОграничениеЧтения; + ОграничениеИзменения = Контекст.СтруктураОграничения.ОграничениеИзменения; + + ИмяПризнакаОптимизации = ?(Контекст.ДляВнешнихПользователей, + "ПоВладельцуБезЗаписиКлючейДоступаДляВнешнихПользователей", "ПоВладельцуБезЗаписиКлючейДоступа"); + + Если Не Результат.ЕстьОграничениеЧтения + И Не Результат.ЕстьОграничениеИзменения + Или Результат.ЕстьОграничениеЧтения + И ОграничениеЧтения.Узел <> "ЧтениеОбъектаРазрешено" + Или Результат.ЕстьОграничениеИзменения + И ОграничениеИзменения.Узел <> "ЧтениеОбъектаРазрешено" + И ОграничениеИзменения.Узел <> "ИзменениеОбъектаРазрешено" Тогда + + ПолеВладельца.Отключено = Истина; + Иначе + СвойстваПолей = Контекст.СвойстваПолей; + + Если СвойстваПолей.Количество() <> 1 Тогда + Если ТребуетсяОграничениеПоВладельцу И СвойстваПолей.Количество() <> 0 Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", + |но количество полей, используемых в ограничении, не равно одному.'"), + ИмяПризнакаОптимизации); + ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); + Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда + Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + КонецЕсли; + ВызватьИсключение ТекстОшибки; + Иначе + ПолеВладельца.Отключено = Истина; + КонецЕсли; + Иначе + СвойстваПоля = СвойстваПолей[0]; + + ТипИОМ = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных"); + ТипИОР = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений"); + + КоличествоТиповИдентификаторовВКонечномПоле = 0; + Если СвойстваПоля.ТипКонечногоПоля.СодержитТип(ТипИОМ) Тогда + КоличествоТиповИдентификаторовВКонечномПоле = 1; + КонецЕсли; + Если СвойстваПоля.ТипКонечногоПоля.СодержитТип(ТипИОР) Тогда + КоличествоТиповИдентификаторовВКонечномПоле = КоличествоТиповИдентификаторовВКонечномПоле + 1; + КонецЕсли; + + Если СвойстваПоля.ТипКонечногоПоля.Типы().Количество() - КоличествоТиповИдентификаторовВКонечномПоле + <> СвойстваПоля.ТипыСохраненияКлючейДоступа.Количество() Тогда + + НекорректныеТипы = Новый Массив; + Для Каждого Тип Из СвойстваПоля.ТипКонечногоПоля.Типы() Цикл + Если СвойстваПоля.ТипыСохраненияКлючейДоступа.Найти(Тип) <> Неопределено + Или Тип = ТипИОМ + Или Тип = ТипИОР Тогда + Продолжить; + КонецЕсли; + НекорректныеТипы.Добавить(ИмяТипаНаЯзыкеЗапросов(Тип)); + КонецЦикла; + Если ТребуетсяОграничениеПоВладельцу Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Установлен признак оптимизации ограничения ""%1"", + |но для следующих таблиц невозможно записать ключи доступа: + |%2'"), + ИмяПризнакаОптимизации, + СтрСоединить(НекорректныеТипы, Символы.ПС)); + ТекстОшибки = ТекстОшибкиСЗаголовком(ТекстОшибки, Контекст); + Если Контекст.Свойство("ОшибкаПриВызовеИсключения") Тогда + Контекст.ОшибкаПриВызовеИсключения.Текст = ТекстОшибки; + КонецЕсли; + ВызватьИсключение ТекстОшибки; + Иначе + ПолеВладельца.Отключено = Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + ДобавитьСвойствоВерсии(Контекст, ПолеВладельца, "ИзменениеКакЧтение"); ДобавитьСвойствоВерсии(Контекст, ПолеВладельца, "Имя"); + ДобавитьСвойствоВерсии(Контекст, ПолеВладельца, "Отключено"); КонецПроцедуры @@ -27033,7 +28063,7 @@ // Функция НовоеПолеВладельца() - Возврат Новый Структура("Имя, ИзменениеКакЧтение, Отключено", "", Ложь, Ложь); + Возврат Новый Структура("Имя, ИзменениеКакЧтение, Отключено", "", Ложь, Истина); КонецФункции @@ -27133,6 +28163,7 @@ Если Не Результат.ЕстьВедущиеКлючиДоступа И Не Результат.ЕстьВедущиеСпискиПоПравам И Не Результат.ЕстьВладельцыНастроекПрав + И Не Результат.ЕстьФункцияПравоДоступаИлиРольДоступна И Не Контекст.ЕстьПроверкаАвторизованногоПользователя И Результат.ИспользуемыеТипыЗначенийДоступа.Количество() = 0 И Контекст.НеиспользуемыеТипыЗначенийДоступа.Количество() > 0 Тогда @@ -27534,6 +28565,21 @@ УсловиеРасчета = Новый Структура("Узел, Значение", Условие.Узел, Условие.Значение); ДобавитьСвойствоВерсииСтруктурыРасчета(Контекст, "Значение", Условие.Значение); СвойстваПоля = Null; + + ИначеЕсли Условие.Узел = "ПравоДоступа" Тогда + УсловиеРасчета = Новый Структура("Узел, ИмяПрава, ПолноеИмяОбъектаМетаданных", + Условие.Узел, Условие.ИмяПрава, Условие.ПолноеИмяОбъектаМетаданных); + ДобавитьЗависимостьОтРолей(Контекст, УсловиеРасчета); + ДобавитьСвойствоВерсииСтруктурыРасчета(Контекст, "ИмяПрава", Условие.ИмяПрава); + ДобавитьСвойствоВерсииСтруктурыРасчета(Контекст, "ПолноеИмяОбъектаМетаданных", + Условие.ПолноеИмяОбъектаМетаданных); + СвойстваПоля = Null; + + ИначеЕсли Условие.Узел = "РольДоступна" Тогда + УсловиеРасчета = Новый Структура("Узел, ИмяРоли", Условие.Узел, Условие.ИмяРоли); + ДобавитьЗависимостьОтРолей(Контекст, УсловиеРасчета); + ДобавитьСвойствоВерсииСтруктурыРасчета(Контекст, "ИмяРоли", Условие.ИмяРоли); + СвойстваПоля = Null; Иначе ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'При заполнении структуры расчета права %1 на ключи доступа @@ -27564,7 +28610,8 @@ УсловиеРасчета.Вставить("ТребуемыеРеквизитыТабличныхЧастейКлюча", Контекст.ТребуемыеРеквизитыТабличныхЧастейКлюча); - ДобавитьЭлементВерсии(Контекст, "СтруктураРасчетаПрава" + Контекст.ИмяПрава, + ДобавитьЭлементВерсии(Контекст, ?(Контекст.ИмяПрава = "Чтение", + "СтруктураРасчетаПраваЧтение", "СтруктураРасчетаПраваИзменение"), Контекст.СтруктураРасчетаПраваСвойстваВерсии); Контекст.Удалить("СтруктураРасчетаПраваСвойстваВерсии"); @@ -27601,6 +28648,27 @@ КонецПроцедуры +// Для процедуры ЗаполнитьСтруктуруРасчетаПрава. +Процедура ДобавитьЗависимостьОтРолей(Контекст, УсловиеРасчета) + + Если УсловиеРасчета.Свойство("ИмяРоли") Тогда + Роль = Метаданные.Роли.Найти(УсловиеРасчета.ИмяРоли); + Контекст.ВедущиеРоли.Вставить(Роль.Имя, Истина); + Возврат; + КонецЕсли; + + ИмяСтандартногоРеквизита = Неопределено; + ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмениДляПроверкиПрава( + УсловиеРасчета.ПолноеИмяОбъектаМетаданных, ИмяСтандартногоРеквизита); + + Для Каждого Роль Из Метаданные.Роли Цикл + Если ПравоДоступа(УсловиеРасчета.ИмяПрава, ОбъектМетаданных, Роль, ИмяСтандартногоРеквизита) Тогда + Контекст.ВедущиеРоли.Вставить(Роль.Имя, Истина); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + // Для процедур ЗаполнитьСтруктуруРасчетаПрава, УсловиеРасчетаПоле. Процедура ДобавитьСвойствоВерсииСтруктурыРасчета(Контекст, Имя, Значение); @@ -27905,6 +28973,10 @@ // Для функций СвойстваПоля, ТекстУсловияСоединения. Процедура ДобавитьПолеТаблицыОбъекта(Контекст, УзелПоле, СвойстваПоля = Неопределено, ДополнительнаяТаблица = Неопределено, ТабличнаяЧасть = "") + Если Не Контекст.ЭтоСсылочныйТип Тогда + Возврат; + КонецЕсли; + ИмяТаблицыОбъекта = Контекст.Список; Если ЗначениеЗаполнено(УзелПоле.Псевдоним) @@ -28024,6 +29096,10 @@ // Для процедур УдалитьПоляНеиспользуемыхВидовДоступа, ГруппыДополнительныхТаблиц. Процедура УстановитьИспользованиеПоляТаблицыОбъекта(Контекст, СвойстваПоля = Неопределено, ДополнительнаяТаблица = Неопределено) + Если Не Контекст.ЭтоСсылочныйТип Тогда + Возврат; + КонецЕсли; + ПоляТаблицОбъекта = Контекст.ПоляТаблицОбъекта; Если СвойстваПоля <> Неопределено Тогда @@ -28074,6 +29150,13 @@ Процедура ЗавершитьПодготовкуПолейТаблицОбъекта(Контекст) ПоляТаблицОбъекта = Контекст.ПоляТаблицОбъекта; + + Если Не Контекст.ЭтоСсылочныйТип Тогда + ПоляТаблицОбъекта.Удалить("ПоСвойствамПолей"); + ПоляТаблицОбъекта.Удалить("ПоДополнительнымТаблицам"); + Возврат; + КонецЕсли; + ПолноеИмяОсновнойТаблицы = СтрЗаменить(Контекст.Список, ".", "_"); ТипСсылки = Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве( Тип(ИмяТипаСсылки(Контекст.Список, Контекст.СтруктураОграничения.ВнутренниеДанные.ТипыТаблицПоИменам)))); @@ -28206,6 +29289,7 @@ Контекст.Вставить("ОставшиесяПоляПослеУпрощения", Новый Соответствие); Контекст.Вставить("ИсходнаяСтруктураОграничения", Контекст.СтруктураОграничения); + Контекст.Вставить("ЕстьФункцияПравоДоступаИлиРольДоступна", Ложь); СтруктураОграничения = Новый Структура(Новый ФиксированнаяСтруктура(Контекст.СтруктураОграничения)); // см. СтруктураОграничения Контекст.Вставить("ИмяПрава", "Чтение"); @@ -28325,7 +29409,8 @@ КонецЕсли; КонецЦикла; Если ЕстьБезусловныйРезультат Или Аргументы.Количество() = 0 Тогда - Условие = Новый Структура("Узел, Значение", "Константа", БезусловныйРезультат); + Условие = Новый Структура("Узел, Значение", "Константа", + ?(ЕстьБезусловныйРезультат, БезусловныйРезультат, Истина)); ИначеЕсли Аргументы.Количество() = 1 Тогда Условие = Аргументы[0]; Иначе @@ -28444,6 +29529,11 @@ Контекст.ОставшиесяПоляПослеУпрощения.Вставить(Условие.Поле, Новый Массив); + ИначеЕсли Условие.Узел = "ПравоДоступа" + Или Условие.Узел = "РольДоступна" Тогда + + Контекст.ЕстьФункцияПравоДоступаИлиРольДоступна = Истина; + ИначеЕсли Условие.Узел <> "Константа" И Условие.Узел <> "Значение" И Условие.Узел <> "Тип" Тогда @@ -28520,7 +29610,7 @@ Продолжить; КонецЕсли; - Если Контекст.ИспользуемыеТипыЗначений.Получить(СвойстваВидаДоступа.ТипЗначений) = Неопределено Тогда + Если Не ТипЗначенийДоступаИспользуется(Контекст, СвойстваВидаДоступа.ТипЗначений) Тогда Если Контекст.НеиспользуемыеТипыЗначенийДоступа.Найти(СвойстваВидаДоступа.ТипЗначений) = Неопределено Тогда Контекст.НеиспользуемыеТипыЗначенийДоступа.Добавить(СвойстваВидаДоступа.ТипЗначений); КонецЕсли; @@ -28545,6 +29635,19 @@ КонецФункции +// Для функции РезультатФункцииЗначениеРазрешено и процедуры ДобавитьСвойстваТиповПоля. +Функция ТипЗначенийДоступаИспользуется(Контекст, ТипЗначений) + + ИспользуемыеТипыЗначений = Контекст.ИспользуемыеТипыЗначений.ПоТаблицам.Получить(Контекст.Список); + + Если ИспользуемыеТипыЗначений = Неопределено Тогда + ИспользуемыеТипыЗначений = Контекст.ИспользуемыеТипыЗначений.ДляИБ; + КонецЕсли; + + Возврат ИспользуемыеТипыЗначений.Получить(ТипЗначений) <> Неопределено; + +КонецФункции + // Для функции УпрощенноеУсловиеОграничения. Функция РезультатФункцииПравоОбъектаРазрешено(Условие, ТипыКонечногоПоля, Контекст) @@ -29039,7 +30142,7 @@ ДобавитьВидОграниченияПрав(СвойстваВидаДоступа.Имя, Свойства, Контекст); - Если Контекст.ИспользуемыеТипыЗначений.Получить(СвойстваВидаДоступа.ТипЗначений) = Неопределено Тогда + Если Не ТипЗначенийДоступаИспользуется(Контекст, СвойстваВидаДоступа.ТипЗначений) Тогда Свойства.НеиспользуемыеТипыЗначенийДоступа.Добавить(СвойстваВидаДоступа.ТипЗначений); Если ОтключеноКакЛожь Тогда @@ -29083,7 +30186,7 @@ ИмяТипа, ОписаниеПоля, Свойства, Контекст); КонецЕсли; - Если СвойстваВидовДоступа.СОднойГруппойДляЗначенияДоступа.Найти(Тип) = Неопределено Тогда + Если Не СвойстваВидаДоступа.НесколькоГруппЗначений Тогда Продолжить; КонецЕсли; Свойства.НесколькоГруппЗначений = Истина; @@ -29455,14 +30558,9 @@ СоединениеОтбора.Вставить("ТабличнаяЧасть", ДополнительныйКонтекст.СвойстваПоляРодителя.ТабличнаяЧасть); СоединениеОтбора.Вставить("ГруппаТаблиц", ДополнительныйКонтекст.ГруппаТаблиц); СоединенияОтборов.Вставить(ВРег(ИмяПоляДляЗапроса), СоединениеОтбора); - Если ТипЗнч(ДополнительныйКонтекст.ГруппаТаблиц) = Тип("Массив") Тогда - СоединениеОтбора.Вставить("ВсеПоляВУсловииСвоейТаблицы", - ДополнительныйКонтекст.ПсевдонимТаблицыПоля = ДополнительныйКонтекст.ПсевдонимТаблицыУсловия); - КонецЕсли; КонецЕсли; Иначе Если ТипЗнч(ДополнительныйКонтекст.ГруппаТаблиц) = Тип("Массив") Тогда - ВставитьПолеВедущегоСпискаПоЗначениямПолей(ОписаниеПолей.ДляОтбора, ТабличнаяЧасть, Поле, ТипПоля); СоединениеОтбора = СоединенияОтборов.Получить(ВРег(ДополнительныйКонтекст.ПсевдонимТаблицыПоля)); Если СоединениеОтбора = Неопределено Тогда СоединениеОтбора = Новый Структура; @@ -29470,14 +30568,13 @@ СоединениеОтбора.Вставить("ПоляДляОтбора", Новый Массив); СоединениеОтбора.Вставить("ТабличнаяЧасть", Неопределено); СоединениеОтбора.Вставить("ГруппаТаблиц", ДополнительныйКонтекст.ГруппаТаблиц); - СоединениеОтбора.Вставить("ВсеПоляВУсловииСвоейТаблицы", Истина); СоединенияОтборов.Вставить(ВРег(ДополнительныйКонтекст.ПсевдонимТаблицыПоля), СоединениеОтбора); КонецЕсли; - Если СоединениеОтбора.ПоляДляОтбора.Найти(Поле) = Неопределено Тогда + Если СоединениеОтбора.ПоляДляОтбора.Найти(Поле) = Неопределено + И ДополнительныйКонтекст.ПсевдонимТаблицыПоля = ДополнительныйКонтекст.ПсевдонимТаблицыУсловия Тогда + СоединениеОтбора.ПоляДляОтбора.Добавить(Поле); - Если ДополнительныйКонтекст.ПсевдонимТаблицыПоля <> ДополнительныйКонтекст.ПсевдонимТаблицыУсловия Тогда - СоединениеОтбора.ВсеПоляВУсловииСвоейТаблицы = Ложь; - КонецЕсли; + ВставитьПолеВедущегоСпискаПоЗначениямПолей(ОписаниеПолей.ДляОтбора, ТабличнаяЧасть, Поле, ТипПоля); КонецЕсли; КонецЕсли; КонецЕсли; @@ -29643,12 +30740,12 @@ Пока Индекс >= 1 Цикл Индекс = Индекс - 1; ДополнительнаяТаблица = ГруппаТаблиц[Индекс]; - ПервыйПсевдоним = ДополнительнаяТаблица.Псевдоним; - Если Не ПерваяДополнительнаяТаблицаНайдена И ПервыйПсевдоним <> ПсевдонимПолейОтбора Тогда + ТекущийПсевдоним = ДополнительнаяТаблица.Псевдоним; + Если Не ПерваяДополнительнаяТаблицаНайдена И ТекущийПсевдоним <> ПсевдонимПолейОтбора Тогда Продолжить; КонецЕсли; ПерваяДополнительнаяТаблицаНайдена = Истина; - Если ПервыйПсевдоним <> ПсевдонимПолейОтбора + Если ТекущийПсевдоним <> ПсевдонимПолейОтбора И ТребуемыеПсевдонимы.Получить(ДополнительнаяТаблица.Псевдоним) = Неопределено Тогда Продолжить; КонецЕсли; @@ -29667,7 +30764,7 @@ ПерваяТаблица = ОбратнаяГруппаТаблиц[0]; ВсеПервыеПоляЗаменяемые = Истина; - Если ЭтоПолеУсловияСоединения И ПерваяТаблица.ПоляУсловияСоединения.Количество() > 1 Тогда + Если ЭтоПолеУсловияСоединения Тогда Для Каждого ПараПолей Из ПерваяТаблица.ПоляУсловияСоединения Цикл Если СтрНайти(ПараПолей.ПервоеПоле.Поле, ПерваяТаблица.Псевдоним + ".") > 0 И СтрНайти(ПараПолей.ПервоеПоле.Поле, ЗаменяемоеПоле + ".") = 0 Тогда @@ -29687,40 +30784,6 @@ Условие.ПолеИлиПсевдоним, "ТекущиеДанныеДляОтбора"); ПараПолей.ВтороеПоле = Новый Структура("Поле, Псевдоним", "ТекущиеДанныеДляОтбора." + Условие.ПоляДляОтбора, ПсевдонимПолейОтбора); - - ИначеЕсли ТипЗнч(Условие.ГруппаТаблиц) = Тип("Массив") - И Не Условие.ВсеПоляВУсловииСвоейТаблицы Тогда - - ВспомогательнаяТаблица = Новый Структура("Таблица, Псевдоним, ПоляУсловияСоединения", - ПерваяТаблица.Таблица, "ТекущиеДанныеДляОтбора", Новый Массив); - ОбратнаяГруппаТаблиц.Вставить(0, ВспомогательнаяТаблица); - Если ТипЗнч(Условие.ПоляДляОтбора) = Тип("Массив") Тогда - Для Каждого ПолеДляОтбора Из Условие.ПоляДляОтбора Цикл - ПараПолей = Новый Структура("ПервоеПоле, ВтороеПоле"); - ВспомогательнаяТаблица.ПоляУсловияСоединения.Добавить(ПараПолей); - ПараПолей.ПервоеПоле = Новый Структура("Поле, Псевдоним", - Условие.ПолеИлиПсевдоним + "." + ПолеДляОтбора, "ТекущиеДанныеДляОтбора"); - ПараПолей.ВтороеПоле = Новый Структура("Поле, Псевдоним", - "ТекущиеДанныеДляОтбора." + ПолеДляОтбора, ПсевдонимПолейОтбора); - КонецЦикла; - Иначе - ПараПолей = Новый Структура("ПервоеПоле, ВтороеПоле"); - ВспомогательнаяТаблица.ПоляУсловияСоединения.Добавить(ПараПолей); - ПараПолей.ПервоеПоле = Новый Структура("Поле, Псевдоним", - Условие.ПолеИлиПсевдоним, "ТекущиеДанныеДляОтбора"); - ПараПолей.ВтороеПоле = Новый Структура("Поле, Псевдоним", - "ТекущиеДанныеДляОтбора." + Условие.ПоляДляОтбора, ПсевдонимПолейОтбора); - КонецЕсли; - Индекс = ПерваяТаблица.ПоляУсловияСоединения.Количество() - 1; - ИндексВставки = ВспомогательнаяТаблица.ПоляУсловияСоединения.Количество(); - Пока Индекс >= 0 Цикл - ПараПолей = ПерваяТаблица.ПоляУсловияСоединения[Индекс]; - Если ПараПолей.ПервоеПоле.Псевдоним = ПерваяТаблица.Псевдоним Тогда - ПерваяТаблица.ПоляУсловияСоединения.Удалить(Индекс); - ВспомогательнаяТаблица.ПоляУсловияСоединения.Вставить(ИндексВставки, ПараПолей); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; КонецЕсли; ТекстСоединения = @@ -29733,7 +30796,7 @@ Новый Массив(Новый ФиксированныйМассив(ДополнительнаяТаблица.ПоляУсловияСоединения))); КонецЦикла; - ЗаменитьПервоеПоле = Истина; + ПервыеПсевдонимы = Новый Соответствие; Индекс = -1; Для Каждого ДополнительнаяТаблица Из ОбратнаяГруппаТаблиц Цикл Индекс = Индекс + 1; @@ -29741,6 +30804,7 @@ ПервыйПсевдоним = ДополнительнаяТаблица.Псевдоним; ПоляУсловияСоединения = ОставшиесяПсевдонимы.Получить(ПервыйПсевдоним); ОставшиесяПсевдонимы.Удалить(ПервыйПсевдоним); + ПервыеПсевдонимы.Вставить(ПервыйПсевдоним, Истина); Если Индекс >= ОбратнаяГруппаТаблиц.Количество() - 1 Тогда ВторойПсевдоним = "ТекущийСписок"; @@ -29761,7 +30825,7 @@ УсловияСоединения.Добавить(ПараПолей.ПервоеПоле.Поле + " = " + ПараПолей.ВтороеПоле.Поле); - ИначеЕсли ПараПолей.ПервоеПоле.Псевдоним = ПервыйПсевдоним + ИначеЕсли ПервыеПсевдонимы.Получить(ПараПолей.ПервоеПоле.Псевдоним) <> Неопределено И (Не ЗначениеЗаполнено(ПараПолей.ВтороеПоле.Псевдоним) Или ПараПолей.ВтороеПоле.Псевдоним = ВторойПсевдоним) Или ПараПолей.ПервоеПоле.Псевдоним = ВторойПсевдоним @@ -29769,19 +30833,14 @@ ПервоеПоле = ПараПолей.ПервоеПоле.Поле; - Если ПараПолей.ПервоеПоле.Псевдоним = ПервыйПсевдоним - И ЗаменитьПервоеПоле - И ВспомогательнаяТаблица = Неопределено Тогда + Если ПервыеПсевдонимы.Получить(ПараПолей.ПервоеПоле.Псевдоним) <> Неопределено + И ПараПолей.ПервоеПоле.Псевдоним = ПсевдонимПолейОтбора + И ВспомогательнаяТаблица = Неопределено + И СтрНачинаетсяС(ПервоеПоле, ЗаменяемоеПоле) Тогда - Позиция = СтрНайти(ПервоеПоле, ЗаменяемоеПоле); - НачалоПоля = Лев(ПервоеПоле, Позиция - 1); - Если Не СтрНачинаетсяС(ПервоеПоле, ЗаменяемоеПоле) Тогда - ТекстОшибки = НСтр("ru = 'Не удалось подготовить условие соединения запроса данных по зависимостям.'"); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - КонецПоля = Сред(ПервоеПоле, Позиция + СтрДлина(ЗаменяемоеПоле)); - ПервоеПоле = НачалоПоля + "ТекущиеДанныеДляОтбора" - + ?(ЗаменяемоеПоле <> ПервыйПсевдоним, ".Ссылка", "") + КонецПоля; // @query-part-2 + КонецПоля = Сред(ПервоеПоле, СтрДлина(ЗаменяемоеПоле) + 1); + ПервоеПоле = "ТекущиеДанныеДляОтбора" + + ?(ЗаменяемоеПоле <> ПсевдонимПолейОтбора, ".Ссылка", "") + КонецПоля; // @query-part-2 КонецЕсли; Если СтрНачинаетсяС(ПервоеПоле, "ТекущиеДанныеДляОтбора.") Тогда УсловияСоединения.Добавить(ПараПолей.ВтороеПоле.Поле + " = " + ПервоеПоле); @@ -29796,6 +30855,9 @@ КонецЕсли; Иначе ОставшиесяУсловия = ОставшиесяПсевдонимы.Получить(ПараПолей.ПервоеПоле.Псевдоним); + Если ОставшиесяУсловия = Неопределено Тогда + ОставшиесяУсловия = ОставшиесяПсевдонимы.Получить(ПараПолей.ВтороеПоле.Псевдоним); + КонецЕсли; ОставшиесяУсловия.Добавить(ПараПолей); КонецЕсли; КонецЦикла; @@ -29810,7 +30872,6 @@ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ " + ТаблицаИПсевдоним + " | ПО (" + СтрСоединить(УсловияСоединения, ") | И (") + ")"; - ЗаменитьПервоеПоле = Ложь; КонецЦикла; Возврат ТекстСоединения + ДополнительноеУсловие; @@ -31047,7 +32108,7 @@ "ВЫБРАТЬ | ПраваНаСпискиВедущихКлючейДоступа.Таблица КАК Список, | ПраваНаСпискиВедущихКлючейДоступа.ГруппаДоступа КАК ГруппаДоступа, - | ПраваНаСпискиВедущихКлючейДоступа.Изменение КАК Изменение + | ПраваНаСпискиВедущихКлючейДоступа.ПравоИзменение КАК ПравоИзменение |ИЗ | РегистрСведений.ТаблицыГруппДоступа КАК ПраваНаСпискиВедущихКлючейДоступа |ГДЕ @@ -31087,7 +32148,7 @@ "ВЫБРАТЬ | ПраваНаКлючиДоступа.КлючДоступа КАК КлючДоступа, | ПраваНаКлючиДоступа.ГруппаДоступа КАК ВладелецПрав, - | ПраваНаКлючиДоступа.Изменение КАК Изменение + | ПраваНаКлючиДоступа.ПравоИзменение КАК ПравоИзменение |ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК ПраваНаКлючиДоступа |ГДЕ @@ -31101,7 +32162,7 @@ "ВЫБРАТЬ | ПраваНаКлючиДоступа.КлючДоступа КАК КлючДоступа, | ПраваНаКлючиДоступа.ГруппаДоступа КАК ВладелецПрав, - | ПраваНаКлючиДоступа.Изменение КАК Изменение + | ПраваНаКлючиДоступа.ПравоИзменение КАК ПравоИзменение |ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК ПраваНаКлючиДоступа |ГДЕ @@ -31113,7 +32174,7 @@ |ВЫБРАТЬ | ПраваНаКлючиДоступа.КлючДоступа, | ПраваНаКлючиДоступа.Пользователь.Пользователь, - | ПраваНаКлючиДоступа.Изменение + | ПраваНаКлючиДоступа.ПравоИзменение |ИЗ | РегистрСведений.КлючиДоступаПользователей КАК ПраваНаКлючиДоступа |ГДЕ @@ -31127,7 +32188,7 @@ "ВЫБРАТЬ | ПраваНаКлючиДоступа.КлючДоступа КАК КлючДоступа, | ПраваНаКлючиДоступа.ГруппаДоступа КАК ВладелецПрав, - | ПраваНаКлючиДоступа.Изменение КАК Изменение + | ПраваНаКлючиДоступа.ПравоИзменение КАК ПравоИзменение |ИЗ | РегистрСведений.КлючиДоступаГруппДоступа КАК ПраваНаКлючиДоступа |ГДЕ @@ -31139,7 +32200,7 @@ |ВЫБРАТЬ | ПраваНаКлючиДоступа.КлючДоступа, | ПраваНаКлючиДоступа.ВнешнийПользователь.Пользователь, - | ПраваНаКлючиДоступа.Изменение + | ПраваНаКлючиДоступа.ПравоИзменение |ИЗ | РегистрСведений.КлючиДоступаВнешнихПользователей КАК ПраваНаКлючиДоступа |ГДЕ @@ -31170,7 +32231,7 @@ | ПраваНаСписки.Таблица КАК Список, | ТИПЗНАЧЕНИЯ(ПраваНаСписки.Таблица.ЗначениеПустойСсылки) КАК ТипЗначения, | ПраваНаСписки.ГруппаДоступа КАК ВладелецПрав, - | ПраваНаСписки.Изменение КАК Изменение + | ПраваНаСписки.ПравоИзменение КАК ПравоИзменение |ИЗ | РегистрСведений.ТаблицыГруппДоступа КАК ПраваНаСписки |ГДЕ @@ -31183,7 +32244,7 @@ "ВЫБРАТЬ | ПраваНаСписки.Таблица КАК Список, | ПраваНаСписки.ГруппаДоступа КАК ВладелецПрав, - | ПраваНаСписки.Изменение КАК Изменение + | ПраваНаСписки.ПравоИзменение КАК ПравоИзменение |ИЗ | РегистрСведений.ТаблицыГруппДоступа КАК ПраваНаСписки |ГДЕ @@ -31389,12 +32450,12 @@ |ВЫБРАТЬ | НастройкиПрав.Объект КАК ВладелецНастроекПрав, | НастройкиПрав.Пользователь КАК ВладелецПрав, - | МАКСИМУМ(НастройкиПрав.Изменение) КАК Изменение + | МАКСИМУМ(НастройкиПрав.ПравоИзменение) КАК ПравоИзменение |ИЗ | (ВЫБРАТЬ | НастройкиПравЧтения.Объект КАК Объект, | НастройкиПравЧтения.Пользователь КАК Пользователь, - | ЛОЖЬ КАК Изменение + | ЛОЖЬ КАК ПравоИзменение | ИЗ | НастройкиПравЧтения КАК НастройкиПравЧтения | @@ -31505,7 +32566,7 @@ | И &УточнениеПланаЗапроса | |ИНДЕКСИРОВАТЬ ПО - | КлючДоступа" + | КлючДоступа"; // @query-part Иначе ТекстЗапросаИспользуемых = "ВЫБРАТЬ РАЗЛИЧНЫЕ @@ -31594,7 +32655,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей | И РазрешенныеКлючиДоступа.ВнешнийПользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппПользователей) - | И РазрешенныеКлючиДоступа.Изменение) + | И РазрешенныеКлючиДоступа.ПравоИзменение) | ИЛИ ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА @@ -31603,7 +32664,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей | И РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа) - | И РазрешенныеКлючиДоступа.Изменение))"; + | И РазрешенныеКлючиДоступа.ПравоИзменение))"; Иначе ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 @@ -31620,7 +32681,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей | И РазрешенныеКлючиДоступа.Пользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппПользователей) - | И РазрешенныеКлючиДоступа.Изменение) + | И РазрешенныеКлючиДоступа.ПравоИзменение) | ИЛИ ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА @@ -31629,7 +32690,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей | И РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа) - | И РазрешенныеКлючиДоступа.Изменение))"; + | И РазрешенныеКлючиДоступа.ПравоИзменение))"; КонецЕсли; Иначе Если Контекст.ДляВнешнихПользователей Тогда @@ -31642,7 +32703,7 @@ | ПО (КлючиДоступаКОбъектам.Объект = &Объект) | И (РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаВнешнихПользователей) | И (РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа)) - | И (РазрешенныеКлючиДоступа.Изменение)"; + | И (РазрешенныеКлючиДоступа.ПравоИзменение)"; Иначе ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 @@ -31653,7 +32714,7 @@ | ПО (КлючиДоступаКОбъектам.Объект = &Объект) | И (РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКОбъектам.КлючДоступаПользователей) | И (РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа)) - | И (РазрешенныеКлючиДоступа.Изменение)"; + | И (РазрешенныеКлючиДоступа.ПравоИзменение)"; КонецЕсли; КонецЕсли; КонецЕсли; @@ -31758,7 +32819,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа | И РазрешенныеКлючиДоступа.ВнешнийПользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппПользователей) - | И РазрешенныеКлючиДоступа.Изменение) + | И РазрешенныеКлючиДоступа.ПравоИзменение) | ИЛИ ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА @@ -31767,7 +32828,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа | И РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа) - | И РазрешенныеКлючиДоступа.Изменение))"; + | И РазрешенныеКлючиДоступа.ПравоИзменение))"; Иначе ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 @@ -31785,7 +32846,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа | И РазрешенныеКлючиДоступа.Пользователь В (&РазрешенныйПользователь, &РазрешенныйНаборГруппПользователей) - | И РазрешенныеКлючиДоступа.Изменение) + | И РазрешенныеКлючиДоступа.ПравоИзменение) | ИЛИ ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА @@ -31794,7 +32855,7 @@ | ГДЕ | РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа | И РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа) - | И РазрешенныеКлючиДоступа.Изменение))"; + | И РазрешенныеКлючиДоступа.ПравоИзменение))"; КонецЕсли; Иначе ТекстЗапроса = @@ -31807,7 +32868,7 @@ | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) | И (РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа) | И (РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа)) - | И (РазрешенныеКлючиДоступа.Изменение)"; + | И (РазрешенныеКлючиДоступа.ПравоИзменение)"; КонецЕсли; УточнитьРегистрКлючейИУсловиеСоединения(ТекстЗапроса, Результат, Контекст); @@ -31872,7 +32933,7 @@ Если Не Результат.ОграничениеЧтенияОтключено Тогда Результат.ТекстЗапросаПроверкиПраваЧтение = СтрЗаменить(ТекстЗапроса, - "РазрешенныеКлючиДоступа.Изменение", "Истина"); + "РазрешенныеКлючиДоступа.ПравоИзменение", "Истина"); КонецЕсли; Если Результат.ИспользуетсяОграничениеПоВладельцу @@ -32133,7 +33194,8 @@ Процедура ДобавитьПроверкуТабличнойЧастиКлюча(Контекст, НомерТабличнойЧастиКлюча) ТаблицыПоГруппам = Контекст.ГруппыДополнительныхТаблиц.ТаблицыПоГруппам; - ГруппаДополнительныхТаблиц = ТаблицыПоГруппам.Получить(НомерТабличнойЧастиКлюча); + ГруппаДополнительныхТаблиц = ТаблицыПоГруппам.Получить(НомерТабличнойЧастиКлюча + - (Контекст.КоличествоТабличныхЧастейКлюча - ТаблицыПоГруппам.Количество())); ИмяТабличнойЧастиКлюча = "ТабличнаяЧасть" + НомерТабличнойЧастиКлюча; ГруппаПолей = Контекст.ГруппыПолей.Получить(ИмяТабличнойЧастиКлюча); @@ -32147,14 +33209,19 @@ Если ГруппаДополнительныхТаблиц = Неопределено Тогда ПсевдонимТабличнойЧастиОбъекта = Контекст.ПсевдонимыТабличныхЧастейОбъекта.Получить(НомерТабличнойЧастиКлюча); - ИмяТабличнойЧастиОбъекта = СтрЗаменить(ПсевдонимТабличнойЧастиОбъекта, "ТекущийСписок", ""); - СоединенияИПоля = СоединенияИПоляПоТаблицам.Получить(ПсевдонимТабличнойЧастиОбъекта); - // @query-part-1 @query-part-2 - Соединения = Соединения + " - |ЛЕВОЕ СОЕДИНЕНИЕ &ТекущийСписок." + ИмяТабличнойЧастиОбъекта + " КАК " + ПсевдонимТабличнойЧастиОбъекта + " - |ПО " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка = ТекущийСписок.Ссылка" // @query-part-1 - + СоединенияИПоля.Соединения; - Условие = ПсевдонимТабличнойЧастиОбъекта + ".Ссылка #ПроверкаNULL"; + Если ПсевдонимТабличнойЧастиОбъекта = Неопределено Тогда + СоединенияИПоля = СоединенияИПоляПоТаблицам.Получить("ТекущийСписок"); + Условие = "ИСТИНА"; + Иначе + ИмяТабличнойЧастиОбъекта = СтрЗаменить(ПсевдонимТабличнойЧастиОбъекта, "ТекущийСписок", ""); + СоединенияИПоля = СоединенияИПоляПоТаблицам.Получить(ПсевдонимТабличнойЧастиОбъекта); + // @query-part-1 @query-part-2 + Соединения = Соединения + " + |ЛЕВОЕ СОЕДИНЕНИЕ &ТекущийСписок." + ИмяТабличнойЧастиОбъекта + " КАК " + ПсевдонимТабличнойЧастиОбъекта + " + |ПО " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка = ТекущийСписок.Ссылка"; // @query-part-1 + Условие = ПсевдонимТабличнойЧастиОбъекта + ".Ссылка #ПроверкаNULL"; + КонецЕсли; + Соединения = Соединения + СоединенияИПоля.Соединения; Поля = СоединенияИПоля.Поля; Иначе Для Каждого ДополнительнаяТаблица Из ГруппаДополнительныхТаблиц Цикл @@ -32217,11 +33284,22 @@ |ПО (ТабличнаяЧасть?.Ссылка = #КлючиДоступаКДанным.#КлючДоступаПользователей)"; // @query-part-1 Если ГруппаДополнительныхТаблиц = Неопределено Тогда - Соединения = Соединения + " - |ЛЕВОЕ СОЕДИНЕНИЕ &ТекущийСписок." + ИмяТабличнойЧастиОбъекта + " КАК " + ПсевдонимТабличнойЧастиОбъекта // @query-part-1 @query-part-2 - + ТекстСОтступом(СоединенияИПоля.Соединения, " ") + " - |ПО " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка = ТекущийСписок.Ссылка" // @query-part-1 - + ТекстСОтступом(СоединенияИПоля.Поля, " "); + Если ИмяТабличнойЧастиОбъекта = Неопределено Тогда + ПсевдонимПромежуточнойТаблицы = "ПромежуточнаяТаблица" + НомерТабличнойЧастиКлюча; + Соединения = Соединения + " + |ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ + | ИСТИНА КАК ЗначениеИстина) КАК " + ПсевдонимПромежуточнойТаблицы // @query-part-1 @query-part-2 + + ТекстСОтступом(СоединенияИПоля.Соединения, " ") + " + |ПО ИСТИНА" // @query-part-1 + + ТекстСОтступом(СоединенияИПоля.Поля, " "); + ИсходноеУсловие = ПсевдонимПромежуточнойТаблицы + ".ЗначениеИстина #ПроверкаNULL"; + Иначе + Соединения = Соединения + " + |ЛЕВОЕ СОЕДИНЕНИЕ &ТекущийСписок." + ИмяТабличнойЧастиОбъекта + " КАК " + ПсевдонимТабличнойЧастиОбъекта // @query-part-1 @query-part-2 + + ТекстСОтступом(СоединенияИПоля.Соединения, " ") + " + |ПО " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка = ТекущийСписок.Ссылка" // @query-part-1 + + ТекстСОтступом(СоединенияИПоля.Поля, " "); + КонецЕсли; Иначе ДополнительнаяТаблица = ГруппаДополнительныхТаблиц[0]; СоединенияИПоля = СоединенияИПоляПоТаблицам.Получить(ДополнительнаяТаблица.Псевдоним); @@ -32595,7 +33673,8 @@ Процедура ДобавитьЗаполнениеТабличнойЧастиКлюча(Контекст, НомерТабличнойЧастиКлюча) ТаблицыПоГруппам = Контекст.ГруппыДополнительныхТаблиц.ТаблицыПоГруппам; - ГруппаДополнительныхТаблиц = ТаблицыПоГруппам.Получить(НомерТабличнойЧастиКлюча); + ГруппаДополнительныхТаблиц = ТаблицыПоГруппам.Получить(НомерТабличнойЧастиКлюча + - (Контекст.КоличествоТабличныхЧастейКлюча - ТаблицыПоГруппам.Количество())); ИмяТабличнойЧастиКлюча = "ТабличнаяЧасть" + НомерТабличнойЧастиКлюча; ГруппаПолей = Контекст.ГруппыПолей.Получить(ИмяТабличнойЧастиКлюча); @@ -32608,25 +33687,45 @@ // Выбор значений из объектов для поиска и создания ключей доступа. Если ГруппаДополнительныхТаблиц = Неопределено Тогда ПсевдонимТабличнойЧастиОбъекта = Контекст.ПсевдонимыТабличныхЧастейОбъекта.Получить(НомерТабличнойЧастиКлюча); - ИмяТабличнойЧастиОбъекта = СтрЗаменить(ПсевдонимТабличнойЧастиОбъекта, "ТекущийСписок", ""); - СоединенияИПоля = СоединенияИПоляПоТаблицам.Получить(ПсевдонимТабличнойЧастиОбъекта); + Если ПсевдонимТабличнойЧастиОбъекта = Неопределено Тогда + СоединенияИПоля = СоединенияИПоляПоТаблицам.Получить("ТекущийСписок"); + Иначе + СоединенияИПоля = СоединенияИПоляПоТаблицам.Получить(ПсевдонимТабличнойЧастиОбъекта); + КонецЕсли; ПоляВыбора = ТекстСОтступом(СоединенияИПоля.Поля, " "); Соединения = ТекстСОтступом(СоединенияИПоля.Соединения, " "); ПоляУпорядочения = СоединенияИПоля.ПоляУпорядочения; Реквизиты = СоединенияИПоля.Реквизиты; - ТекстЗапроса = // @query-part-1 - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка КАК ТекущаяСсылка" + ПоляВыбора + " - |ИЗ - | &ТекущийСписок." + ИмяТабличнойЧастиОбъекта + " КАК " + ПсевдонимТабличнойЧастиОбъекта + Соединения + " - |ГДЕ - | " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка В (&СсылкиНаОбъекты) - | - |УПОРЯДОЧИТЬ ПО - | ТекущаяСсылка" // @query-part-1 - + ПоляУпорядочения + " - |ИТОГИ ПО - | ТекущаяСсылка"; // @query-part-1 + Если ПсевдонимТабличнойЧастиОбъекта = Неопределено Тогда + ТекстЗапроса = // @query-part-1 + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТекущийСписок.Ссылка КАК ТекущаяСсылка" + ПоляВыбора + " + |ИЗ + | &ТекущийСписок КАК ТекущийСписок" + Соединения + " + |ГДЕ + | ТекущийСписок.Ссылка В (&СсылкиНаОбъекты) + | + |УПОРЯДОЧИТЬ ПО + | ТекущаяСсылка" // @query-part-1 + + ПоляУпорядочения + " + |ИТОГИ ПО + | ТекущаяСсылка"; // @query-part-1 + Иначе + ИмяТабличнойЧастиОбъекта = СтрЗаменить(ПсевдонимТабличнойЧастиОбъекта, "ТекущийСписок", ""); + ТекстЗапроса = // @query-part-1 + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка КАК ТекущаяСсылка" + ПоляВыбора + " + |ИЗ + | &ТекущийСписок." + ИмяТабличнойЧастиОбъекта + " КАК " + ПсевдонимТабличнойЧастиОбъекта + Соединения + " + |ГДЕ + | " + ПсевдонимТабличнойЧастиОбъекта + ".Ссылка В (&СсылкиНаОбъекты) + | + |УПОРЯДОЧИТЬ ПО + | ТекущаяСсылка" // @query-part-1 + + ПоляУпорядочения + " + |ИТОГИ ПО + | ТекущаяСсылка"; // @query-part-1 + КонецЕсли; Иначе ПоляВыбора = ""; Соединения = ""; @@ -34319,6 +35418,10 @@ "ForAtLeastOneRow", "Функция", Ложь); ДобавитьСловоЯзыка(Слова, "ЭтоАвторизованныйПользователь", // @Non-NLS "IsAuthorizedUser", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ПравоДоступа", // @Non-NLS + "AccessRight", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "РольДоступна", // @Non-NLS + "IsInRole", "Функция", Ложь); ДобавитьСловоЯзыка(Слова, "ПустаяСсылка", // @Non-NLS "EmptyRef", "ЗначениеСравнения"); @@ -35044,7 +36147,8 @@ // "ЗначениеРазрешено", "ЭтоАвторизованныйПользователь", // "ЧтениеОбъектаРазрешено", "ИзменениеОбъектаРазрешено", // "ЧтениеСпискаРазрешено", "ИзменениеСпискаРазрешено", -// "ДляВсехСтрок", "ДляОднойИзСтрок". +// "ДляВсехСтрок", "ДляОднойИзСтрок", +// "ПравоДоступа", "РольДоступна". // // Свойства узла Поле. // * Имя - Строка - имя поля, например, "Организация" или "ОсновнаяОрганизация". @@ -35483,6 +36587,8 @@ ВсеУзлы.Вставить("ИзменениеСпискаРазрешено", Истина); ВсеУзлы.Вставить("ДляВсехСтрок", Истина); ВсеУзлы.Вставить("ДляОднойИзСтрок", Истина); + ВсеУзлы.Вставить("ПравоДоступа", Истина); + ВсеУзлы.Вставить("РольДоступна", Истина); МассивУзлов = СтрРазделить(Список, ",", Ложь); Узлы = Новый Соответствие; @@ -36458,6 +37564,12 @@ ИначеЕсли Строка.Уточнение = "Выразить" Тогда НовоеОписание = ОписаниеУзлаПолеИзФункцииВыразить(Контекст.Строка, Контекст); + ИначеЕсли Строка.Уточнение = "ПравоДоступа" Тогда + РазобратьПараметрыФункцииПравоДоступа(Строка, НовоеОписание, Контекст); + + ИначеЕсли Строка.Уточнение = "РольДоступна" Тогда + РазобратьПараметрыФункцииРольДоступна(Строка, НовоеОписание, Контекст); + ИначеЕсли Не Строка.ЭтоРезерв Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не определена обработка функции ""%1""'"), Строка.Уточнение); @@ -36728,6 +37840,96 @@ КонецПроцедуры +// Для процедуры РазобратьФункцию. +Процедура РазобратьПараметрыФункцииРольДоступна(Строка, НовоеОписание, Контекст) + + НовоеОписание.Вставить("ИмяРоли", Неопределено); + + СоставПараметров = ПараметрыРазделенныеЗапятыми(Строка); + + Если СоставПараметров.Количество() = 0 Тогда + Возврат; // Ошибка отсутствия параметров уже установлена в функции ФункцииСВыражениямиВСкобках. + КонецЕсли; + + Параметр = СоставПараметров[0]; + Если Параметр.Строки[0].Вид = "Имя" Тогда + НовоеОписание.ИмяРоли = Параметр.Строки[0].Символы; + + ПроверитьИмяРоли(НовоеОписание.ИмяРоли, Параметр.Строки[0]); + Иначе + УстановитьОшибкуВСтроке(Параметр.Строки[0], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В функции ""%1"" можно указать только имя роли'"), Строка.Символы)); + КонецЕсли; + + Если Параметр.Строки.Количество() > 1 Тогда + УстановитьОшибкуВСтроке(Параметр.Строки[1], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У функции ""%1"" может быть только один параметр'"), Строка.Символы)); + КонецЕсли; + + Если СоставПараметров.Количество() > 1 Тогда + УстановитьОшибкуВСтроке(СоставПараметров[1].Строки[0], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У функции ""%1"" может быть только один параметр'"), Строка.Символы)); + КонецЕсли; + +КонецПроцедуры + +// Для процедуры РазобратьФункцию. +Процедура РазобратьПараметрыФункцииПравоДоступа(Строка, НовоеОписание, Контекст) + + НовоеОписание.Вставить("ИмяПрава", Неопределено); + НовоеОписание.Вставить("ПолноеИмяОбъектаМетаданных", Неопределено); + + СоставПараметров = ПараметрыРазделенныеЗапятыми(Строка); + + Если СоставПараметров.Количество() = 0 Тогда + Возврат; // Ошибка отсутствия параметров уже установлена в функции ФункцииСВыражениямиВСкобках. + КонецЕсли; + + ПервыйПараметр = СоставПараметров[0]; + Если ПервыйПараметр.Строки[0].Вид = "Имя" Тогда + НовоеОписание.ИмяПрава = ПервыйПараметр.Строки[0].Символы; + Иначе + УстановитьОшибкуВСтроке(ПервыйПараметр.Строки[0], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В функции ""%1"" в первом параметре можно указать только имя права'"), Строка.Символы)); + КонецЕсли; + + Если ПервыйПараметр.Строки.Количество() > 1 Тогда + УстановитьОшибкуВСтроке(ПервыйПараметр.Строки[1], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Перед параметром ""%1"" функции ""%2"" не указана запятая'"), + ПервыйПараметр.Строки[1].Символы, + Строка.Символы)); + КонецЕсли; + + Если СоставПараметров.Количество() < 2 Тогда + УстановитьОшибкуВСтроке(ПервыйПараметр.КонечнаяСтрока, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У функции ""%1"" должно быть два параметра'"), Строка.Символы)); + Возврат; + КонецЕсли; + + ВторойПараметр = СоставПараметров[1]; + Если ВторойПараметр.Строки[0].Вид = "Имя" Тогда + НовоеОписание.ПолноеИмяОбъектаМетаданных = ВторойПараметр.Строки[0].Символы; + + ПроверитьИмяПраваОбъектаМетаданных(НовоеОписание.ИмяПрава, ПервыйПараметр.Строки[0], + НовоеОписание.ПолноеИмяОбъектаМетаданных, ВторойПараметр.Строки[0]); + Иначе + УстановитьОшибкуВСтроке(ВторойПараметр.Строки[0], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В функции ""%1"" во втором параметре можно указать только полное имя объекта метаданных'"), + Строка.Символы)); + КонецЕсли; + + Если ВторойПараметр.Строки.Количество() > 1 Тогда + УстановитьОшибкуВСтроке(ВторойПараметр.Строки[1], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У функции ""%1"" может быть только два параметра'"), Строка.Символы)); + КонецЕсли; + + Если СоставПараметров.Количество() > 2 Тогда + УстановитьОшибкуВСтроке(СоставПараметров[2].Строки[0], СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'У функции ""%1"" может быть только два параметра'"), Строка.Символы)); + КонецЕсли; + +КонецПроцедуры + // Для процедуры РазобратьФункцию. Процедура РазобратьПараметрыФункцииТипЗначения(Контекст, НовоеОписание) @@ -37880,6 +39082,137 @@ КонецПроцедуры +// Для процедуры РазобратьПараметрыФункцииРольДоступна. +Процедура ПроверитьИмяРоли(ИмяРоли, Источник) + + Если ЗначениеЗаполнено(Источник.ТекстОшибки) Тогда + Возврат; + КонецЕсли; + + Если СтрНайти(ИмяРоли, ".") > 0 Тогда + УстановитьОшибкуВСтроке(Источник, + НСтр("ru = 'В имени роли не должно быть точек'")); + Возврат; + КонецЕсли; + + Если Метаданные.Роли.Найти(ИмяРоли) = Неопределено Тогда + УстановитьОшибкуВСтроке(Источник, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Роль ""%1"" отсутствует в метаданных'"), ИмяРоли)); + Возврат; + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьИмяПраваОбъектаМетаданных(ИмяПрава, ИсточникПрава, ИмяОбъекта, ИсточникОбъекта) + + Если ЗначениеЗаполнено(ИсточникПрава.ТекстОшибки) + Или ИсточникОбъекта <> Неопределено + И ЗначениеЗаполнено(ИсточникОбъекта.ТекстОшибки) Тогда + Возврат; + КонецЕсли; + + Если СтрНайти(ИмяПрава, ".") > 0 Тогда + УстановитьОшибкуВСтроке(ИсточникПрава, + НСтр("ru = 'В имени права не должно быть точек'")); + Возврат; + КонецЕсли; + + ИмяСтандартногоРеквизита = Неопределено; + ОбъектМетаданных = ОбъектМетаданныхПоПолномуИмениДляПроверкиПрава(ИмяОбъекта, ИмяСтандартногоРеквизита); + Если ОбъектМетаданных = Неопределено Тогда + УстановитьОшибкуВСтроке(ИсточникОбъекта, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект метаданных ""%1"" не существует'"), ИмяОбъекта)); + Возврат; + КонецЕсли; + + ТекстОшибки = ""; + Попытка + ПравоДоступа(ИмяПрава, ОбъектМетаданных, , ИмяСтандартногоРеквизита); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + КонецПопытки; + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + УстановитьОшибкуВСтроке(ИсточникПрава, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось проверить право ""%1"" объекта метаданных ""%2"" по причине: + |%3'"), ИмяПрава, ИмяОбъекта, ТекстОшибки)); + Возврат; + КонецЕсли; + +КонецПроцедуры + +// Для процедуры ПроверитьИмяПраваОбъектаМетаданных +Функция ОбъектМетаданныхПоПолномуИмениДляПроверкиПрава(ПолноеИмя, ИмяСтандартногоРеквизита = Неопределено) + + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмя); + Если ОбъектМетаданных <> Неопределено Тогда + Возврат ОбъектМетаданных; + КонецЕсли; + + ЧастиИмени = СтрРазделить(ПолноеИмя, "."); + Если ЧастиИмени.Количество() < 4 Тогда + Возврат Неопределено; + КонецЕсли; + + ИмяОсновногоОбъектаМетаданных = ЧастиИмени[0] + "." + ЧастиИмени[1]; + ОсновнойОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОсновногоОбъектаМетаданных); + Если ОсновнойОбъектМетаданных = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если ВРег(ЧастиИмени[2]) = ВРег("СтандартнаяТабличнаяЧасть") // @Non-NLS + Или ВРег(ЧастиИмени[2]) = ВРег("StandardTabularSection") Тогда + + Свойства = Новый Структура("СтандартныеТабличныеЧасти"); + ЗаполнитьЗначенияСвойств(Свойства, ОсновнойОбъектМетаданных); + Если Свойства.СтандартныеТабличныеЧасти = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + ИмяСтандартнойТабличнойЧасти = ЧастиИмени[3]; + Для Каждого СтандартнаяТабличнаяЧасть Из Свойства.СтандартныеТабличныеЧасти Цикл + Если ВРег(СтандартнаяТабличнаяЧасть.Имя) = ВРег(ИмяСтандартнойТабличнойЧасти) Тогда + СтандартныеРеквизиты = СтандартнаяТабличнаяЧасть.СтандартныеРеквизиты; + Прервать; + КонецЕсли; + КонецЦикла; + Если СтандартныеРеквизиты = Неопределено + Или ЧастиИмени.Количество() <> 6 Тогда + Возврат Неопределено; + КонецЕсли; + ЧастиИмени.Удалить(0); + ЧастиИмени.Удалить(0); + ВладелецСтандартныхРеквизитов = СтандартнаяТабличнаяЧасть; + Иначе + ВладелецСтандартныхРеквизитов = ОсновнойОбъектМетаданных; + КонецЕсли; + + Если ВРег(ЧастиИмени[2]) <> ВРег("СтандартныйРеквизит") // @Non-NLS + И ВРег(ЧастиИмени[2]) <> ВРег("StandardAttribute") Тогда + Возврат Неопределено; + КонецЕсли; + + Свойства = Новый Структура("СтандартныеРеквизиты"); + ЗаполнитьЗначенияСвойств(Свойства, ВладелецСтандартныхРеквизитов); + Если Свойства.СтандартныеРеквизиты = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + ИмяСтандартногоРеквизита = ЧастиИмени[3]; + СтандартныеРеквизиты = Свойства.СтандартныеРеквизиты; // ОписанияСтандартныхРеквизитов + + Для Каждого СтандартныйРеквизит Из СтандартныеРеквизиты Цикл + Если ВРег(СтандартныйРеквизит.Имя) = ВРег(ИмяСтандартногоРеквизита) Тогда + Если ЗначениеЗаполнено(ИмяСтандартнойТабличнойЧасти) Тогда + ИмяСтандартногоРеквизита = ИмяСтандартнойТабличнойЧасти + "." + ИмяСтандартногоРеквизита; + КонецЕсли; + Возврат ОсновнойОбъектМетаданных; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + // Для процедур ОтметитьНекорректныеАргументыИЗапрещенныеУзлы, ВыделитьПсевдонимПоля, // ДобавитьТипыВидовДоступаПользователиИВнешниеПользователиДляПроверкиОтсутствия. // @@ -38955,17 +40288,22 @@ Процедура ОбновитьПрогрессВФоне(Контекст, АдресРезультата) Экспорт - Попытка - ОбновитьПрогресс(Контекст); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке) Тогда - ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - Иначе - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); - КонецЕсли; - Контекст.Вставить("ТекстОшибки", ТекстОшибки); - КонецПопытки; + Если Контекст.Свойство("Версия") И Контекст.Версия = 1 Тогда + Попытка + ОбновитьПрогресс(Контекст); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке) Тогда + ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Иначе + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецЕсли; + Контекст.Вставить("ТекстОшибки", ТекстОшибки); + КонецПопытки; + Иначе + Контекст.Вставить("ТекстОшибки", + НСтр("ru = 'Версия программы обновлена, требуется перезапустить клиентский сеанс.'")); + КонецЕсли; ПоместитьВоВременноеХранилище(Контекст, АдресРезультата); @@ -40086,8 +41424,19 @@ ЗаполнитьДолиКоличествоЭлементовСсылочногоТипа(ДолиКоличестваЭлементов, ПоследнийОбновленныйЭлемент, Строка.ИмяТаблицы); Иначе - СвойстваОграничения = Контекст.ДействующиеПараметры.ДополнительныйКонтекст[?(ДляВнешнихПользователей, - "ДляВнешнихПользователей", "ДляПользователей")].СвойстваОграниченияСписков.Получить(Строка.ИмяТаблицы); + ДополнительныйКонтекст = Контекст.ДействующиеПараметры.ДополнительныйКонтекст[?(ДляВнешнихПользователей, + "ДляВнешнихПользователей", "ДляПользователей")]; + СвойстваОграничения = ДополнительныйКонтекст.СвойстваОграниченияСписков.Получить(Строка.ИмяТаблицы); + + Если СвойстваОграничения <> Неопределено Тогда + ИспользуемыеВариантыДоступа = ДополнительныйКонтекст.ОсновныеВариантыДоступа.Получить(Строка.ИмяТаблицы); + Если ИспользуемыеВариантыДоступа = Неопределено Тогда + СвойстваОграничения = Неопределено; + Иначе + СвойстваОграничения = Новый Структура(СвойстваОграничения); + СвойстваОграничения.Вставить("ВариантДоступа", ИспользуемыеВариантыДоступа[0].ВариантДоступа); + КонецЕсли; + КонецЕсли; ЗаполнитьДолиКоличестваЭлементовРегистра(ДолиКоличестваЭлементов, ПоследнийОбновленныйЭлемент, СвойстваОграничения); @@ -40316,7 +41665,9 @@ ИначеЕсли Элемент.ВидКлючаДанных = "УстаревшиеЭлементы" Тогда - Если ЗначениеЗаполнено(СвойстваОграничения.ИмяОтдельногоРегистраКлючей) Тогда + Если СвойстваОграничения <> Неопределено + И ЗначениеЗаполнено(СвойстваОграничения.ИмяОтдельногоРегистраКлючей) Тогда + ДолиКоличестваЭлементов.Обработанных = 0.90; ДолиКоличестваЭлементов.Оставшихся = 0.09; Иначе diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl index 0bb205fe7..e3a2d2c45 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl @@ -18,7 +18,7 @@ // Процедура УстановитьПринадлежностьПользователяКГруппеАдминистраторы(Знач ПользовательОбластиДанных, Знач ДоступРазрешен) Экспорт - ГруппаАдминистраторы = Справочники.ГруппыДоступа.Администраторы; + ГруппаАдминистраторы = УправлениеДоступом.ГруппаДоступаАдминистраторы(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl index 0cd1cfa52..8bcb65a32 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl @@ -142,10 +142,9 @@ Для НомерСтроки = 1 По СтрЧислоСтрок(ИменаПодписок) Цикл - НачалоИмени = СтрПолучитьСтроку(ИменаПодписок, НомерСтроки); - ИмяПодписки = Подписка.Имя; + ИмяПодписки = СтрПолучитьСтроку(ИменаПодписок, НомерСтроки); - Если ВРег(Лев(ИмяПодписки, СтрДлина(НачалоИмени))) = ВРег(НачалоИмени) Тогда + Если ВРег(Подписка.Имя) = ВРег(ИмяПодписки) Тогда Для каждого Тип Из Подписка.Источник.Типы() Цикл Если Тип = Тип("СправочникОбъект.ИдентификаторыОбъектовМетаданных") Тогда @@ -466,6 +465,30 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * ДляПользователей - см. УправлениеДоступомСлужебный.КэшРасчетаПравДляВидаПользователей +// * ДляВнешнихПользователей - см. УправлениеДоступомСлужебный.КэшРасчетаПравДляВидаПользователей +// * ВерсияДанных - см. УправлениеДоступомСлужебный.НоваяВерсияДанныхДляКэшаРасчетаПрав +// +Функция КэшРасчетаПрав(КлючДанныхПовторногоИспользования) Экспорт + + Свойства = "ПраваГруппДоступаСписков, ЗначенияГруппДоступа, ПользователиГруппПользователей, + |УчастникиГруппДоступа, ГруппыПользователейГруппДоступа, ГруппыПользователейКакЗначенияДоступа, + |РолиПрофилейГруппДоступа, ГруппыДоступаПрофилей"; + + ВерсияДанных = УправлениеДоступомСлужебный.НоваяВерсияДанныхДляКэшаРасчетаПрав( + Строка(Новый УникальныйИдентификатор)); + + Хранилище = Новый Структура; + Хранилище.Вставить("ДляПользователей", Новый Структура(Свойства, Новый Соответствие)); + Хранилище.Вставить("ДляВнешнихПользователей", Новый Структура(Свойства, Новый Соответствие)); + Хранилище.Вставить("ВерсияДанных", ВерсияДанных); + + Возврат Хранилище; + +КонецФункции + Функция КэшИзмененныхСписковПриОтключенномОбновленииКлючейДоступа() Экспорт Возврат ПараметрыСеанса.ОтключениеОбновленияКлючейДоступа.ИзмененныеСписки.Получить(); diff --git a/SSL/src/CommonModules/УправлениеКолонтитулами/Module.bsl b/SSL/src/CommonModules/УправлениеКолонтитулами/Module.bsl index f937f00b9..13b8603c0 100644 --- a/SSL/src/CommonModules/УправлениеКолонтитулами/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКолонтитулами/Module.bsl @@ -58,9 +58,10 @@ // Устанавливает значения параметров НазваниеОтчета и Пользователь в строке шаблона. // -// Шаблон - Строка - настройка колонтитула с еще не установленными значениями параметров. -// НазваниеОтчета - Строка - значение параметра, которое будет подставлено в шаблон. -// Пользователь - СправочникСсылка.Пользователи - значение параметра, которое будет подставлено в шаблон. +// Параметры: +// Шаблон - Строка - настройка колонтитула с еще не установленными значениями параметров. +// НазваниеОтчета - Строка - значение параметра, которое будет подставлено в шаблон. +// Пользователь - СправочникСсылка.Пользователи - значение параметра, которое будет подставлено в шаблон. // // Возвращаемое значение: // Строка - настройка колонтитула с установленными значениями шаблона. diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl index e6edf00eb..ceaa59a43 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl @@ -18,7 +18,7 @@ // Отбор - см. ОтборКонтактнойИнформации. // // Возвращаемое значение: -// ТаблицаЗначений - контактная информация объектов: +// ТаблицаЗначений: // * Объект - ЛюбаяСсылка - владелец контактной информации. // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. // * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. @@ -32,7 +32,7 @@ Функция КонтактнаяИнформация(Источник, Отбор) Экспорт КонтактнаяИнформацияОбъекты = Новый Массив; // Массив из СправочникОбъект - КонтактнаяИнформацияСсылки = Новый Массив; // Массив из ОпределяемыйТип.ВладелецКонтактнойИнформации + КонтактнаяИнформацияСсылки = Новый Массив; Если ТипЗнч(Источник) = Тип("Массив") Тогда СсылкиИлиОбъекты = Источник; @@ -224,7 +224,7 @@ // дате будет вызвано исключение. // // Возвращаемое значение: -// ТаблицаЗначений - таблица с контактной информацией объектов содержащая колонки: +// ТаблицаЗначений: // * Объект - ЛюбаяСсылка - владелец контактной информации. // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. // * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. @@ -263,8 +263,9 @@ // использовать функцию ПредставлениеКонтактнойИнформацииОбъекта. // // Параметры: -// СсылкаИлиОбъект - ЛюбаяСсылка -// - Объект - ссылка или объект-владелец контактной информации (организация, +// СсылкаИлиОбъект - ОпределяемыйТип.ВладелецКонтактнойИнформации +// - СправочникОбъект +// - ДокументОбъект - ссылка или объект-владелец контактной информации (организация, // контрагент, партнер и т.д.). // ВидИлиТипКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - отбор по виду контактной информации. // - ПеречислениеСсылка.ТипыКонтактнойИнформации - отбор по типу контактной информации. @@ -276,7 +277,7 @@ // Для получения представления рекомендуется использовать функцию ПредставлениеКонтактнойИнформацииОбъекта. // // Возвращаемое значение: -// ТаблицаЗначений - таблица с контактной информацией объекта содержащая колонки: +// ТаблицаЗначений: // * Объект - ЛюбаяСсылка - владелец контактной информации. // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. // * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. @@ -386,7 +387,7 @@ // По умолчанию - Ложь; // // Возвращаемое значение: -// Строка - сформированное представление контактной информации. +// Строка // Функция ПредставлениеКонтактнойИнформацииОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации, Разделитель = ",", Дата = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт @@ -695,7 +696,7 @@ // или Адрес (для адресов содержащих поля с национальной спецификой). // Если передана строка во внутреннем формате JSON, то возвращаемое значение будет // полностью совпадать с ней. -// - см. УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу. +// - Структура - см. УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу // см. РаботаСАдресами.ПоляАдреса (для адресов содержащих поля с национальной спецификой), // см. РаботаСАдресамиКлиентСервер.СтруктураКонтактнойИнформацииПоТипу // (для других типов контактной информации содержащих поля с национальной спецификой). @@ -756,8 +757,8 @@ // Если передана ссылка, то после конвертирования хотя бы одной строки контактной информации владелец будет записан. // // Параметры: -// СсылкаИлиОбъект - ОпределяемыеТипы.ВладелецКонтактнойИнформации - ссылка на объект с контактной информацией. -// - СправочникОбъекта +// СсылкаИлиОбъект - ОпределяемыйТип.ВладелецКонтактнойИнформации - ссылка на объект с контактной информацией. +// - СправочникОбъект // - ДокументОбъект - объект-владелец контактной информации (организация, // контрагент, партнер и т.д.). // @@ -810,7 +811,7 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаКонтактнойИнформации", ПолноеИмяТабличнойЧасти); Если ТипЗнч(РазмерПорции) = Тип("Число") Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗЛИЧНЫЕ", "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ " + Формат(РазмерПорции,"ЧРГ=' '; ЧГ=0")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗЛИЧНЫЕ", "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ " + Формат(РазмерПорции,"ЧРГ=' '; ЧГ=0")); // @query-part-1, @query-part-2 КонецЕсли; Запрос.Текст = ТекстЗапроса; @@ -876,11 +877,11 @@ // Возвращает представление контактной информации (адреса, телефона, электронной почты и т.п.). // // Параметры: -// КонтактнаяИнформация - Строка - строка JSON или XML контактной информации соответствующая XDTO пакетам -// КонтактнаяИнформация или Адрес +// КонтактнаяИнформация - Строка - строка JSON или XML контактной информации +// соответствующая XDTO пакетам КонтактнаяИнформация или Адрес. // - ОбъектXDTO - XDTO-объект КонтактнаяИнформация или Адрес. // - Структура - см. РаботаСАдресами.СведенияОбАдресе -// - см. УправлениеКонтактнойИнформацией.СведенияОТелефоне +// - Структура - см. УправлениеКонтактнойИнформацией.СведенияОТелефоне // ВидКонтактнойИнформации - Структура - дополнительные параметры, влияющие на формирование представления адреса: // * ВключатьСтрануВПредставление - Булево - в представление будет включена страна адреса; // * ФорматАдреса - Строка - устарело. Варианты: "ФИАС" или "КЛАДР". @@ -1079,7 +1080,7 @@ // Сравнивает два экземпляра контактной информации. // // Параметры: -// Данные1 - ОбъектXTDO - объект с контактной информацией. +// Данные1 - ОбъектXDTO - объект с контактной информацией. // - Строка - контактная информация в формате XML. // - Структура - описание контактной информацию. Ожидаются поля: // * ЗначенияПолей - Строка @@ -1094,9 +1095,9 @@ // - ПеречислениеСсылка.ТипыКонтактнойИнформации // - Структура - // используется в том случае, если не удалось вычислить тип из ЗначенияПолей. -// Данные2 - ОбъектXTDO +// Данные2 - ОбъектXDTO // - Строка -// - Структура - аналогично Данные1. +// - Структура - смотри описание параметра Данные1. // // Возвращаемое значение: // ТаблицаЗначений: - таблица отличающихся полей со следующими колонками: @@ -1150,8 +1151,6 @@ Запрос = Новый Запрос(); ТекстЗапросаПодготовкаДанных = ""; - СтрокаРАЗРЕШЕННЫЕ = " РАЗРЕШЕННЫЕ "; // @Query-part-1 - СтрокаВременнойТаблицы = "ПОМЕСТИТЬ ВТКонтактнаяИнформация"; Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл @@ -1162,6 +1161,7 @@ МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ); ИмяТаблицы = МетаданныеОбъекта.Имя; + Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда ТекстЗапросаПодготовкаДанных = ТекстЗапросаПодготовкаДанных + "ВЫБРАТЬ РАЗРЕШЕННЫЕ @@ -1186,18 +1186,13 @@ КонецЦикла; ТекстЗапроса = ""; + ЭтоПервыйЗапрос = Истина; Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл ТекстЗапроса = ТекстЗапроса + ?(НЕ ПустаяСтрока(ТекстЗапроса), Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС, ""); МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ); ИмяТаблицы = МетаданныеОбъекта.Имя; ЕстьИдентификаторСтрокиТабличнойЧасти = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ИдентификаторСтрокиТабличнойЧасти") <> Неопределено; - ТекстЗапросаИдентификаторСтрокиТабличнойЧасти = ""; - Если ЕстьИдентификаторСтрокиТабличнойЧасти Тогда - ТекстЗапросаИдентификаторСтрокиТабличнойЧасти = "КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК ИдентификаторСтрокиТабличнойЧасти"; - Иначе - ТекстЗапросаИдентификаторСтрокиТабличнойЧасти = "0 КАК ИдентификаторСтрокиТабличнойЧасти"; - КонецЕсли; Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда Если ТипЗнч(Дата) <> Тип("Дата") Тогда @@ -1216,7 +1211,7 @@ УсловияОтбора = " ГДЕ " + УсловияОтбора; КонецЕсли; - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + " + ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ | КонтактнаяИнформация.Ссылка КАК Объект, | КонтактнаяИнформация.Вид КАК Вид, | КонтактнаяИнформация.Тип КАК Тип, @@ -1225,16 +1220,18 @@ | КонтактнаяИнформация.Представление КАК Представление, | КонтактнаяИнформация.Значение, | КонтактнаяИнформация.ЗначенияПолей, - | " + ТекстЗапросаИдентификаторСтрокиТабличнойЧасти + " - | " + СтрокаВременнойТаблицы + " + | 0 КАК ИдентификаторСтрокиТабличнойЧасти |ИЗ - | СрезКонтактнойИнформации" + ИмяТаблицы + " КАК СрезКонтактнойИнформации - | ЛЕВОЕ СОЕДИНЕНИЕ " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация + | &СрезКонтактнойИнформации КАК СрезКонтактнойИнформации + | ЛЕВОЕ СОЕДИНЕНИЕ &КонтактнаяИнформация КАК КонтактнаяИнформация | ПО СрезКонтактнойИнформации.Вид = КонтактнаяИнформация.Вид | И СрезКонтактнойИнформации.ДействуетС = КонтактнаяИнформация.ДействуетС | И СрезКонтактнойИнформации.Объект = КонтактнаяИнформация.Ссылка " + УсловияОтбора; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&СрезКонтактнойИнформации", "СрезКонтактнойИнформации" + ИмяТаблицы); + Иначе - ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + " + ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ | КонтактнаяИнформация.Ссылка КАК Объект, | КонтактнаяИнформация.Вид КАК Вид, | КонтактнаяИнформация.Тип КАК Тип, @@ -1243,25 +1240,42 @@ | КонтактнаяИнформация.Представление КАК Представление, | КонтактнаяИнформация.Значение, | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей, - | " + ТекстЗапросаИдентификаторСтрокиТабличнойЧасти + " - | " + СтрокаВременнойТаблицы + " + | 0 КАК ИдентификаторСтрокиТабличнойЧасти |ИЗ - | " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация + | &КонтактнаяИнформация КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) | И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка) - | И КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ") + | И КонтактнаяИнформация.Ссылка В (&МассивОбъектовИмяТаблицы) | И &УсловиеГдеТипКонтактнойИнформации | И &УсловиеГдеВидКонтактнойИнформации |"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеГдеТипКонтактнойИнформации", ?(ТипыКонтактнойИнформации = Неопределено, "ИСТИНА", "КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)")); // @query-part-2 ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеГдеВидКонтактнойИнформации", ?(ВидыКонтактнойИнформации = Неопределено, "ИСТИНА", "КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)")); // @query-part-2 - + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&МассивОбъектовИмяТаблицы", "&МассивОбъектов" + ИмяТаблицы); + + КонецЕсли; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&КонтактнаяИнформация" , МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация"); // @Query-part-1, @Query-part-2 + + Если ЭтоПервыйЗапрос Тогда + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ" , "ВЫБРАТЬ РАЗРЕШЕННЫЕ"); // @Query-part-1, @Query-part-2 + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЗ" , "ПОМЕСТИТЬ ВТКонтактнаяИнформация + |ИЗ"); // @Query-part-1, @Query-part-2 + + ЭтоПервыйЗапрос = Ложь; + + КонецЕсли; + + Если ЕстьИдентификаторСтрокиТабличнойЧасти Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти", + "КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК ИдентификаторСтрокиТабличнойЧасти"); // @Query-part-1, @Query-part-2 КонецЕсли; - СтрокаРАЗРЕШЕННЫЕ =""; - СтрокаВременнойТаблицы = ""; Запрос.УстановитьПараметр("МассивОбъектов" + ИмяТаблицы, ОбъектСКонтактнойИнформацией.Значение); КонецЦикла; @@ -2523,7 +2537,7 @@ // Имя - Строка - уникальное имя вида контактной информации. // // Возвращаемое значение: -// СправочникСсылка.ВидыКонтактнойИнформации - ссылка на элемент справочника виды контактной информации. +// СправочникСсылка.ВидыКонтактнойИнформации // Функция ВидКонтактнойИнформацииПоИмени(Имя) Экспорт @@ -2679,8 +2693,8 @@ // // Параметры: // Параметры - Структура - свойства вида контактной информации: -// * Имя - имя предопределенного вида контактной информации; -// * Наименование - наименование вида контактной информации; +// * Имя - Строка - имя предопределенного вида контактной информации; +// * Наименование - Строка - наименование вида контактной информации; // * Вид - СправочникСсылка.ВидыКонтактнойИнформации // - Строка - ссылка на вид контактной информации или // идентификатор предопределенного элемента. @@ -2720,31 +2734,30 @@ // информации по нажатию на которую, открывается форма соответствующего // типа КИ. Свойство применимо только для контактной информации с типом: // Адрес, Телефон, Факс, ВебСтраница. Значение по умолчанию - Ложь. -// * НастройкиПроверки - Структура -// - Неопределено - настройки проверки вида контактной информации. -// Для типа Адрес - Структура, содержащая поля: -// * ТолькоНациональныйАдрес - Булево - Истина, если возможен ввод только российских адресов. -// * ПроверятьКорректность - Булево - Истина, если требуется запрещать пользователю записывать -// некорректные адреса. -// * ЗапрещатьВводНекорректного - Булево - устарел. Все переданные значения игнорируются. -// Для запрета пользователю записывать некорректные адреса -// следует использовать параметр ПроверятьКорректность. -// * СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при -// вводе (только если ТолькоНациональныйАдрес = Истина). -// * ВключатьСтрануВПредставление - Булево - Истина, если требуется включать наименование страны в -// представление адреса. -// Для типа АдресЭлектроннойПочты - Структура, содержащая поля: -// * ПроверятьКорректность - Булево - Истина, если требуется запрещать пользователю записывать -// некорректный адрес электронной почты. -// * ЗапрещатьВводНекорректного - Булево - устарел. Все переданные значения игнорируются. -// Для запрета пользователю записывать некорректные адреса -// следует использовать параметр ПроверятьКорректность. -// Для типа Телефон и Факс - Структура, содержащая поля: -// * ТелефонCДобавочнымНомером - Булево - если Истина, то телефон/факс содержит добавочный номер. -// * ВводитьНомерПоМаске - Булево - Истина, если требуется ввод телефона по маске. -// * МаскаНомераТелефон - Строка - содержит посимвольную строку маски интерактивного ввода текста в поле. -// Формат маски соответствует платформенной маске для поля ввода. -// Для остальных типов или для задания настроек по умолчанию используется Неопределено. +// * НастройкиПроверки - Неопределено - для типов Другое, ВебСтраница, Skype. +// - Структура - состав полей зависит от типа контактной информации: +// ** ТолькоНациональныйАдрес - Булево - для типа Адрес. Если Истина, если возможен ввод только российских адресов. +// ** ПроверятьКорректность - Булево - для типа Адрес. Если Истина, если требуется запрещать пользователю записывать +// некорректные адреса. +// ** СкрыватьНеактуальныеАдреса - Булево - для типа Адрес. Если Истина, если не требуется показывать +// неактуальные адреса при +// вводе (только если ТолькоНациональныйАдрес = Истина). +// ** ВключатьСтрануВПредставление - Булево - для типа Адрес. Если Истина, если требуется включать наименование +// страны в представление адреса. +// ** ПроверятьКорректность - Булево - для типа АдресЭлектроннойПочты .Если Истина, если требуется запрещать +// пользователю записывать некорректный адрес электронной почты. +// ** ТелефонCДобавочнымНомером - Булево - для типа Телефон или Факс. Если Истина, то телефон/факс содержит +// добавочный номер. +// ** ВводитьНомерПоМаске - Булево - для типа Телефон или Факс. Если Истина, если требуется ввод телефона по маске. +// ** МаскаНомераТелефон - Строка - для типа Телефон или Факс. Содержит посимвольную строку маски +// интерактивного ввода текста в поле. Формат маски соответствует +// платформенной маске для поля ввода. +// ** ЗапрещатьВводНекорректного - Булево - устарел. Все переданные значения игнорируются. +// для типа Адрес. Для запрета пользователю записывать некорректные адреса +// следует использовать параметр ПроверятьКорректность. +// ** ЗапрещатьВводНекорректного - Булево - устарел. Все переданные значения игнорируются. +// Для типа АдресЭлектроннойПочты. Для запрета пользователю записывать +// некорректные адреса следует использовать параметр ПроверятьКорректность. // Процедура УстановитьСвойстваВидаКонтактнойИнформации(Параметры) Экспорт @@ -2946,29 +2959,23 @@ // информации по нажатию на которую, открывается форма соответствующего // типа КИ. Свойство применимо только для контактной информации с типом - // Адрес, Телефон, Факс, ВебСтраница. Значение по умолчанию - Ложь. -// * НастройкиПроверки - Структура -// - Неопределено - настройки проверки вида контактной информации: -// -// Для типа Адрес -// ** ТолькоНациональныйАдрес - Булево - если Истина, то разрешается ввод только национальных адресов. -// Изменение страны у адреса не допускается. -// ** ПроверятьКорректность - Булево - если Истина, то для национальных адресов доступен ввод -// только адресов с разбивкой по полям проходящих проверку по -// ФИАС. Допускается ввод адресов других стран в свободной -// форме, если свойство ТолькоНациональныйАдрес = Ложь. -// Значение по умолчанию - Ложь. -// ** ВключатьСтрануВПредставление - Булево - если Истина, то Наименование страны всегда добавляется в -// представление адреса, даже когда другие поля адреса пустые. -// Значение по умолчанию - Ложь -// ** УказыватьОКТМО - Булево - признак возможности ручного ввода кода ОКМТО в форме ввода адреса. -// Для типа АдресЭлектроннойПочты -// ** ПроверятьКорректность - Булево - если Истина, то запрещается пользователю ввод -// некорректный адрес электронной почты. -// Значение по умолчанию - Ложь. -// Для типа Телефон -// ** ТелефонCДобавочнымНомером - Булево - если Истина, то в форме ввода телефона доступен ввод -// добавочного номера. Значение по умолчанию - Истина. -// Для остальных типов по умолчанию - Неопределено. +// * НастройкиПроверки - Неопределено - для типов Другое, ВебСтраница, Skype. +// - Структура - настройки проверки вида контактной информации: +// ** ТолькоНациональныйАдрес - Булево - для типа Адрес. Если Истина, то разрешается ввод только национальных адресов. +// Изменение страны у адреса не допускается. +// ** ПроверятьКорректность - Булево - для типа Адрес. Если Истина, то для национальных адресов доступен ввод +// только адресов с разбивкой по полям проходящих проверку по ФИАС. +// Допускается ввод адресов других стран в свободной форме, +// если свойство ТолькоНациональныйАдрес = Ложь. +// Значение по умолчанию - Ложь. +// ** ВключатьСтрануВПредставление - Булево - для типа Адрес. если Истина, то Наименование страны всегда +// добавляется в представление адреса, даже когда другие поля адреса пустые. +// Значение по умолчанию - Ложь. +// ** УказыватьОКТМО - Булево - для типа Адрес. признак возможности ручного ввода кода ОКМТО в форме ввода адреса. +// ** ПроверятьКорректность - Булево - для типа АдресЭлектроннойПочты. Если Истина, то запрещается пользователю ввод +// некорректный адрес электронной почты. Значение по умолчанию - Ложь. +// ** ТелефонCДобавочнымНомером - Булево - для типа Телефон и Факс. Если Истина, то в форме ввода телефона +// доступен ввод добавочного номера. Значение по умолчанию - Истина. // Функция ПараметрыВидаКонтактнойИнформации(ТипИлиВидКонтактнойИнформации = Неопределено) Экспорт @@ -3043,7 +3050,8 @@ // используемое для вывода ее в динамических списках и отчетах. // // Параметры: -// Объект - ОбъектСсылка - ссылка на объект конфигурации, содержащий табличную часть контактная информация. +// Объект -ОпределяемыйТип.ВладелецКонтактнойИнформации - ссылка на объект конфигурации, содержащий табличную часть +// контактная информация. // Процедура ОбновитьКонтактнуюИнформациюДляСписков(Объект = Неопределено) Экспорт @@ -3167,11 +3175,27 @@ РезультатЗапроса = Запрос.Выполнить().Выбрать(); Количество = РезультатЗапроса.Количество(); Если Количество > 0 Тогда - Пока РезультатЗапроса.Следующий() Цикл - Объект = РезультатЗапроса.Ссылка.ПолучитьОбъект(); - ОбновитьКонтактнуюИнформациюДляСписков(Объект); - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - КонецЦикла; + + Блокировка = Новый БлокировкаДанных(); + Блокировка.Добавить(ПолноеИмяОбъектаСВидомДляСписка); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + Пока РезультатЗапроса.Следующий() Цикл + Объект = РезультатЗапроса.Ссылка.ПолучитьОбъект(); + ОбновитьКонтактнуюИнформациюДляСписков(Объект); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + Если Количество < 1000 Тогда ОбъектыСВидомДляСписка.Удалить(0); КонецЕсли; @@ -3208,28 +3232,43 @@ ВидыКонтактнойИнформации = Запрос.Выполнить().Выгрузить(); ВидыКонтактнойИнформации.Индексы.Добавить("ИмяПредопределенногоВида"); - Для каждого Вид Из ВидыКонтактнойИнформации Цикл + Блокировка = Новый БлокировкаДанных(); + Блокировка.Добавить("Справочник.ВидыКонтактнойИнформации"); + + НачатьТранзакцию(); + Попытка - Если Не Вид.Предопределенный Или Не СтрНачинаетсяС(НРег(Вид.ИмяПредопределенныхДанных), "удалить") Тогда - Продолжить; - КонецЕсли; + Блокировка.Заблокировать(); - ИмяПредопределенногоВида = Сред(Вид.ИмяПредопределенныхДанных, СтрДлина("удалить") + 1); - Если ВидыКонтактнойИнформации.Найти(ИмяПредопределенногоВида, "ИмяПредопределенногоВида") <> Неопределено Тогда - Продолжить; - КонецЕсли; + Для каждого Вид Из ВидыКонтактнойИнформации Цикл + + Если Не Вид.Предопределенный Или Не СтрНачинаетсяС(НРег(Вид.ИмяПредопределенныхДанных), "удалить") Тогда + Продолжить; + КонецЕсли; + + ИмяПредопределенногоВида = Сред(Вид.ИмяПредопределенныхДанных, СтрДлина("удалить") + 1); + Если ВидыКонтактнойИнформации.Найти(ИмяПредопределенногоВида, "ИмяПредопределенногоВида") <> Неопределено Тогда + Продолжить; + КонецЕсли; + + ОбъектВидКИ = Вид.ВидКИ.ПолучитьОбъект(); + Если Не ОбъектВидКИ.ЭтоГруппа Тогда + ОбъектВидКИ.ИмяГруппы = Сред(Вид.Группа, СтрДлина("удалить") + 1); + КонецЕсли; + + ОбъектВидКИ.ИмяПредопределенногоВида = ИмяПредопределенногоВида; + ОбъектВидКИ.ИмяПредопределенныхДанных = ""; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОбъектВидКИ); + + КонецЦикла; + ЗафиксироватьТранзакцию(); - ОбъектВидКИ = Вид.ВидКИ.ПолучитьОбъект(); - Если Не ОбъектВидКИ.ЭтоГруппа Тогда - ОбъектВидКИ.ИмяГруппы = Сред(Вид.Группа, СтрДлина("удалить") + 1); - КонецЕсли; + Исключение - ОбъектВидКИ.ИмяПредопределенногоВида = ИмяПредопределенногоВида; - ОбъектВидКИ.ИмяПредопределенныхДанных = ""; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОбъектВидКИ); + ОтменитьТранзакцию(); + ВызватьИсключение; - КонецЦикла; - + КонецПопытки; КонецПроцедуры @@ -3270,8 +3309,9 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения - передаваемая форма. // Элементы - Соответствие из КлючИЗначение - список видов контактной информации, для которых устанавливается доступ: -// ** Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. -// ** Значение - Булево - если ЛОЖЬ, то элемент доступен только для просмотра. +// * Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. +// * Значение - Булево - если ЛОЖЬ, то элемент доступен только для просмотра. +// ИмяЭлементаДляРазмещения - Строка - имя группы, где размещена контактная информация. // Процедура УстановитьДоступностьЭлементовКонтактнойИнформации(Форма, Элементы, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") Экспорт Для каждого Элемент Из Элементы Цикл @@ -3486,7 +3526,8 @@ // Форма - ФормаКлиентскогоПриложения // ДобавляемыеРеквизиты - Массив из РеквизитФормы // ИмяОбъекта - Строка -// ИсключаемыеВиды - Неопределено, Массив +// ИсключаемыеВиды - Массив +// - Неопределено // КонтактнаяИнформация - КоллекцияСтрокДереваЗначений: // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. // * ИмяПредопределенногоВида - Строка @@ -3513,7 +3554,8 @@ // * ИмяРеквизита - Строка. // * ПометкаУдаления - Булево. // * Комментарий - Строка. -// ОтложеннаяИнициализация - Булево, Массив +// ОтложеннаяИнициализация - Булево +// - Массив // ОбработкаНавигационнойСсылки - Булево // Процедура СоздатьРеквизитыКонтактнойИнформации(Знач Форма, Знач ДобавляемыеРеквизиты, Знач ИмяОбъекта, Знач ИсключаемыеВиды, @@ -5388,6 +5430,13 @@ КонецФункции // Получение глубокого свойства объекта. +// +// Параметры: +// ОбъектXTDO - ОбъектXDTO +// XPath -Строка +// +// Возвращаемое значение: +// ОбъектXDTO // Функция ПолучитьXDTOРеквизитОбъекта(ОбъектXTDO, XPath) Экспорт @@ -5689,9 +5738,8 @@ // Если "ПолеВводаИДиалог", то доступен ввод в поле и в форме соответствующего типа КИ. // * ХранитьИсториюИзменений - Булево - признак возможности хранения истории контактной информации. // Хранение истории допускается, если признак ВидРедактирования = "Диалог". -// Свойство применимо если табличная часть -// КонтактнаяИнформация содержит реквизит ДействуетС. Значение по умолчанию -// - Ложь. +// Свойство применимо если табличная часть КонтактнаяИнформация +// содержит реквизит ДействуетС. Значение по умолчанию - Ложь. // * ОбязательноеЗаполнение - Булево - если Истина, то требуется обязательный ввод значения в поле контактной // информации. Значение по умолчанию - Ложь. // * РазрешитьВводНесколькихЗначений - Булево - признак возможности ввода нескольких значений для данного вида. @@ -5710,28 +5758,23 @@ // информации по нажатию на которую, открывается форма соответствующего // типа КИ. Свойство применимо только для контактной информации с типом: // Адрес, Телефон, Факс, ВебСтраница. Значение по умолчанию - Ложь. -// * НастройкиПроверки - Структура -// - Неопределено - настройки проверки вида контактной информации. Состав полей -// зависит от типа контактной информации. Для типа Адрес - Структура, содержащая поля: -// * ТолькоНациональныйАдрес - Булево - если Истина, то разрешается ввод только национальных +// * НастройкиПроверки - Неопределено - для типов Другое, ВебСтраница, Skype +// - Структура - состав полей зависит от типа контактной информации: +// ** ТолькоНациональныйАдрес- Булево - для типа Адрес. Если Истина, то разрешается ввод только национальных // адресов. Изменение страны у адреса не допускается. -// * ПроверятьКорректность - Булево - если Истина, то для национальных адресов доступен ввод -// только адресов с разбивкой по полям проходящих проверку по -// ФИАС. Допускается ввод адресов других стран в свободной -// форме, если свойство ТолькоНациональныйАдрес = Ложь. -// Значение по умолчанию - Ложь. -// * ВключатьСтрануВПредставление - Булево - если Истина, то Наименование страны всегда добавляется в -// представление адреса, даже когда другие поля адреса пустые. -// Значение по умолчанию - Ложь -// * УказыватьОКТМО - Булево - признак возможности ручного ввода кода ОКМТО в форме ввода адреса. -// Для типа АдресЭлектроннойПочты - Структура, содержащая поля: -// * ПроверятьКорректность - Булево - если Истина, то запрещается пользователю ввод -// некорректный адрес электронной почты. -// Значение по умолчанию - Ложь. -// Для типа Телефон - Структура, содержащая поля: -// * ТелефонCДобавочнымНомером - Булево - если Истина, то в форме ввода телефона доступен ввод -// добавочного номера. Значение по умолчанию - Истина. -// Для остальных типов по умолчанию - Неопределено. +// ** ПроверятьКорректность - Булево - для типа Адрес. Если Истина, то для национальных адресов доступен ввод +// только адресов с разбивкой по полям проходящих проверку по ФИАС. +// Допускается ввод адресов других стран в свободной форме, +// если свойство ТолькоНациональныйАдрес = Ложь. +// Значение по умолчанию - Ложь. +// ** ВключатьСтрануВПредставление - Булево - для типа Адрес. если Истина, то Наименование страны всегда +// добавляется в представление адреса, даже когда другие поля адреса пустые. +// Значение по умолчанию - Ложь. +// ** УказыватьОКТМО - Булево - для типа Адрес. признак возможности ручного ввода кода ОКМТО в форме ввода адреса. +// ** ПроверятьКорректность - Булево - для типа АдресЭлектроннойПочты. Если Истина, то запрещается пользователю ввод +// некорректный адрес электронной почты. Значение по умолчанию - Ложь. +// ** ТелефонCДобавочнымНомером - Булево - для типа Телефон или Факс. Если Истина, то в форме ввода телефона +// доступен ввод добавочного номера. Значение по умолчанию - Истина. // Функция ОписаниеПараметровКонтактнойИнформации(Знач ТипКонтактнойИнформации) diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl index bd28a835e..d556fdddb 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl @@ -232,7 +232,7 @@ // // Параметры: // ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - вид редактируемой контактной информации. -// - см. УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации +// - Структура - см. УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации // Значение - Строка - сериализованное значение полей контактной информации в формате JSON или XML. // Представление - Строка - представление контактной информации. // Комментарий - Строка - комментарий контактной информации. @@ -1012,9 +1012,9 @@ КонецЕсли; Если ЗначениеЗаполнено(НайденнаяСтрока.Маска) Тогда - ЭлементыФормы = Форма.Элементы[ИмяРеквизита]; + ЭлементыФормы = Форма.Элементы[ИмяРеквизита]; // ПолеВвода Если ЭлементыФормы.Вид = ВидПоляФормы.ПолеВвода Тогда - Форма.Элементы[ИмяРеквизита].Маска = НайденнаяСтрока.Маска; + ЭлементыФормы.Маска = НайденнаяСтрока.Маска; КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl index 7b357bdf5..98d231b64 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl @@ -388,10 +388,10 @@ КонецЕсли; Если ЭтоРегион Тогда - Возврат Наименование + " " + ТипАдресногоОбъекта; + Возврат СокрЛП(Наименование + " " + ТипАдресногоОбъекта); КонецЕсли; - Возврат ТипАдресногоОбъекта + " "+ Наименование; + Возврат СокрЛП(ТипАдресногоОбъекта + " "+ Наименование); КонецФункции @@ -433,7 +433,7 @@ // Разделяет текст, разделенный запятыми. // // Параметры: -// Текст - Срока - разделяемый текст. +// Текст - Строка - разделяемый текст. // ВыделятьСокращения - Булево - опциональный параметр режима работы. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl index 79c126e9f..9f851a269 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl @@ -20,10 +20,10 @@ Результат = ""; ПолноеИмя = Ссылка.Метаданные().ПолноеИмя(); - Если СтрНачинаетсяС(ПолноеИмя , НСтр("ru = 'Справочник'")) Тогда - ИмяГруппыКонтактнойИнформации = НСтр("ru = 'Справочник'") + Ссылка.Метаданные().Имя; - ИначеЕсли СтрНачинаетсяС(ПолноеИмя , НСтр("ru = 'Документ'")) Тогда - ИмяГруппыКонтактнойИнформации = НСтр("ru = 'Документ'") + Ссылка.Метаданные().Имя; + Если СтрНачинаетсяС(ПолноеИмя, "Справочник") Тогда + ИмяГруппыКонтактнойИнформации = "Справочник" + Ссылка.Метаданные().Имя; + ИначеЕсли СтрНачинаетсяС(ПолноеИмя, "Документ") Тогда + ИмяГруппыКонтактнойИнформации = "Документ" + Ссылка.Метаданные().Имя; КонецЕсли; Запрос = Новый Запрос; @@ -106,6 +106,126 @@ КонецФункции + +// Ищет контакты с адресами электронной почты. +// +// Параметры: +// СтрокаПоиска - Строка - текст поиска +// ОписанияКонтактов - Массив из см. НовоеОписаниеКонтакта +// Возвращаемое значение: +// ТаблицаЗначений: +// * Контакт - ОпределяемыйТип.КонтактВзаимодействия - найденный контакт. +// * Наименование - Строка - наименование контакта. +// * НаименованиеВладельца - Строка - наименование владельца контакта. +// * Представление - Строка - адрес электронной почты. +// +// +Функция НайтиКонтактыСАдресамиЭлектроннойПочты(СтрокаПоиска, ОписанияКонтактов) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 20 + | СправочникКонтакт.Ссылка КАК Контакт, + | ПРЕДСТАВЛЕНИЕ(СправочникКонтакт.Ссылка) КАК Наименование, + | """" КАК НаименованиеВладельца, + | ТаблицаКонтактнаяИнформация.АдресЭП КАК Представление + |ИЗ + | Справочник.Пользователи КАК СправочникКонтакт + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация + | ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка) + | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)) + | И (ТаблицаКонтактнаяИнформация.АдресЭП <> """") + |ГДЕ + | НЕ СправочникКонтакт.ПометкаУдаления + | И (СправочникКонтакт.Наименование ПОДОБНО &ВведеннаяСтрока + | ИЛИ ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока + | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока + | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока)"; + + Для каждого ОписаниеКонтакта Из ОписанияКонтактов Цикл + + Если ОписаниеКонтакта.Имя = "Пользователи" Тогда + Продолжить; // пропускаем + КонецЕсли; + + УсловиеПолейВводаПоСтроке = ""; + МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОписаниеКонтакта.Тип); + СписокПолей = МетаданныеОбъекта.ВводПоСтроке; // СписокПолей + Для Каждого Поле Из СписокПолей Цикл + ПолеСтроковогоТипа = Ложь; + Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(МетаданныеОбъекта.СтандартныеРеквизиты, Поле.Имя) Тогда + Если МетаданныеОбъекта.СтандартныеРеквизиты[Поле.Имя].Тип.Типы()[0] = Тип("Строка") Тогда + ПолеСтроковогоТипа = Истина; + КонецЕсли; + ИначеЕсли ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(МетаданныеОбъекта.Реквизиты, Поле.Имя) Тогда + Если МетаданныеОбъекта.Реквизиты[Поле.Имя].Тип.Типы()[0] = Тип("Строка") Тогда + ПолеСтроковогоТипа = Истина; + КонецЕсли; + КонецЕсли; + Если ПолеСтроковогоТипа Тогда + УсловиеПолейВводаПоСтроке = УсловиеПолейВводаПоСтроке + " ИЛИ СправочникКонтакт." + Поле.Имя + " ПОДОБНО &ВведеннаяСтрока"; + КонецЕсли; + КонецЦикла; + + ТекстЗапроса = ТекстЗапроса + " + |ОБЪЕДИНИТЬ ВСЕ + |"; + + ТекстЗапроса = ТекстЗапроса + " + |ВЫБРАТЬ ПЕРВЫЕ 20 + | СправочникКонтакт.Ссылка КАК Контакт, + | &ПолеНаименование КАК Наименование, + | &ПолеНаименованиеВладельца КАК НаименованиеВладельца, + | ТаблицаКонтактнаяИнформация.АдресЭП КАК Представление + |ИЗ + | &ТаблицаСправочник КАК СправочникКонтакт + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИмяТаблицаКонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация + | ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка) + | И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты) И (ТаблицаКонтактнаяИнформация.АдресЭП <> """")) + |ГДЕ + | НЕ СправочникКонтакт.ПометкаУдаления + | И (ТаблицаКонтактнаяИнформация.АдресЭП ПОДОБНО &ВведеннаяСтрока + | ИЛИ ТаблицаКонтактнаяИнформация.ДоменноеИмяСервера ПОДОБНО &ВведеннаяСтрока + | ИЛИ ТаблицаКонтактнаяИнформация.Представление ПОДОБНО &ВведеннаяСтрока + | И &УсловиеПолейВводаПоСтроке) + |"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименованиеВладельца" , ?(ОписаниеКонтакта.ЕстьВладелец, "ПРЕДСТАВЛЕНИЕ(СправочникКонтакт.Владелец)", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеНаименование" , "СправочникКонтакт." + ОписаниеКонтакта.ИмяРеквизитаПредставлениеКонтакта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочник" ,"Справочник." + ОписаниеКонтакта.Имя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяТаблицаКонтактнаяИнформация" ,"Справочник." + ОписаниеКонтакта.Имя + ".КонтактнаяИнформация"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПолейВводаПоСтроке" , УсловиеПолейВводаПоСтроке); + + КонецЦикла; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ВведеннаяСтрока", "%" + СтрокаПоиска + "%"); + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + + +// Новое описание контакта с адресами электронной почты для поиска. +// +// Возвращаемое значение: +// Структура: +// * Тип - Тип - тип ссылки контакта. +// * Имя - Строка - имя типа контакта , как оно определено в метаданных. +// * ЕстьВладелец - Булево - признак того, что у контакта есть владелец. +// * ИмяРеквизитаПредставлениеКонтакта - Строка - имя реквизита контакта, из которого будет получено +// представление контакта. Если не указано, то используется +// стандартный реквизит Наименование. +// +Функция НовоеОписаниеКонтакта() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Тип", ""); + Результат.Вставить("Имя", ""); + Результат.Вставить("ЕстьВладелец", Ложь); + Результат.Вставить("ИмяРеквизитаПредставлениеКонтакта", "Наименование"); + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. @@ -150,11 +270,6 @@ // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Обработчик = Обработчики.Добавить(); - Обработчик.Процедура = "УправлениеКонтактнойИнформациейСлужебный.ЗаполнитьНаименованияВидовКонтактнойИнформацииПользователя"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.НачальноеЗаполнение = Истина; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.2.3.34"; Обработчик.Процедура = "УправлениеКонтактнойИнформациейСлужебный.ОбновитьСуществующиеСтраныМира"; @@ -189,6 +304,13 @@ Обработчик.Комментарий = НСтр("ru = 'Обновление видов контактной информации. |До завершения обработки виды контактной информации в документах в ряде случаев будут отображаться некорректно.'"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + НоваяСтрока = Обработчик.ПриоритетыВыполнения.Добавить(); + НоваяСтрока.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + НоваяСтрока.Порядок = "До"; + КонецЕсли; + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "3.1.3.148"; Обработчик.Идентификатор = Новый УникальныйИдентификатор("dfc6a0fa-7c7b-4096-9d04-2c67d5eb17a4"); @@ -227,6 +349,7 @@ Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.СтраныМира); + Объекты.Добавить(Метаданные.Справочники.ВидыКонтактнойИнформации); КонецПроцедуры @@ -818,11 +941,28 @@ РезультатЗапроса = Запрос.Выполнить().Выбрать(); - Пока РезультатЗапроса.Следующий() Цикл - ВидКонтактнойИнформации = РезультатЗапроса.Ссылка.ПолучитьОбъект(); - ВидКонтактнойИнформации.ТелефонCДобавочнымНомером = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ВидКонтактнойИнформации); - КонецЦикла; + Блокировка = Новый БлокировкаДанных(); + Блокировка.Добавить("Справочник.ВидыКонтактнойИнформации"); + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + Пока РезультатЗапроса.Следующий() Цикл + ВидКонтактнойИнформации = РезультатЗапроса.Ссылка.ПолучитьОбъект(); + ВидКонтактнойИнформации.ТелефонCДобавочнымНомером = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ВидКонтактнойИнформации); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; КонецПроцедуры @@ -839,33 +979,33 @@ Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл + Блокировка = Новый БлокировкаДанных(); + Блокировка.Добавить("Справочник.ВидыКонтактнойИнформации"); + + НачатьТранзакцию(); + Попытка - Если СтрНачинаетсяС(ВРег(Выборка.ИмяПредопределенныхДанных), "УДАЛИТЬ") Тогда - Продолжить; - КонецЕсли; + Блокировка.Заблокировать(); - ВидКонтактнойИнформацииОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ВидКонтактнойИнформацииОбъект.Используется = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ВидКонтактнойИнформацииОбъект); + Пока Выборка.Следующий() Цикл + + Если СтрНачинаетсяС(ВРег(Выборка.ИмяПредопределенныхДанных), "УДАЛИТЬ") Тогда + Продолжить; + КонецЕсли; + + ВидКонтактнойИнформацииОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ВидКонтактнойИнформацииОбъект.Используется = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ВидКонтактнойИнформацииОбъект); + + КонецЦикла; + ЗафиксироватьТранзакцию(); - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаполнитьНаименованияВидовКонтактнойИнформацииПользователя() Экспорт - - ПараметрыГруппы = Справочники.ВидыКонтактнойИнформации.СправочникПользователи.ПолучитьОбъект(); - ПараметрыГруппы.Наименование = НСтр("ru = 'Контактная информация справочника ""Пользователи""'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПараметрыГруппы); - - ПараметрыВида = Справочники.ВидыКонтактнойИнформации.EmailПользователя.ПолучитьОбъект(); - ПараметрыВида.Наименование = НСтр("ru = 'Электронная почта'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПараметрыВида); - - ПараметрыВида = Справочники.ВидыКонтактнойИнформации.ТелефонПользователя.ПолучитьОбъект(); - ПараметрыВида.Наименование = НСтр("ru = 'Телефон'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПараметрыВида); + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; КонецПроцедуры @@ -1826,59 +1966,76 @@ ОбъектыСКолонкойВидДляСписка = ОбъектыСодержащиеВидДляСписка(); Для каждого ОбъектСсылка Из ОбъектыСКолонкойВидДляСписка Цикл - Объект = ОбъектСсылка.ПолучитьОбъект(); - КонтактнаяИнформация = Объект.КонтактнаяИнформация; - Отбор = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.ПустаяСсылка()); - СтрокиДляУдаления = КонтактнаяИнформация.НайтиСтроки(Отбор); - Для каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл - КонтактнаяИнформация.Удалить(СтрокаДляУдаления); - КонецЦикла; + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(Метаданные.НайтиПоТипу(ТипЗнч(ОбъектСсылка)).ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ОбъектСсылка); - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | КонтактнаяИнформация.Представление КАК Представление, - | КонтактнаяИнформация.Вид КАК Вид - |ПОМЕСТИТЬ КонтактнаяИнформация - |ИЗ - | &КонтактнаяИнформация КАК КонтактнаяИнформация - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | КонтактнаяИнформация.Представление КАК Представление, - | КонтактнаяИнформация.Вид КАК Вид, - | КОЛИЧЕСТВО(КонтактнаяИнформация.Вид) КАК Количество - |ИЗ - | КонтактнаяИнформация КАК КонтактнаяИнформация - | - |СГРУППИРОВАТЬ ПО - | КонтактнаяИнформация.Вид, - | КонтактнаяИнформация.Представление ИТОГИ ПО Вид"; + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); - Запрос.УстановитьПараметр("КонтактнаяИнформация", КонтактнаяИнформация); - РезультатЗапроса = Запрос.Выполнить(); - ВыборкаВид = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Объект = ОбъектСсылка.ПолучитьОбъект(); + КонтактнаяИнформация = Объект.КонтактнаяИнформация; + + Отбор = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.ПустаяСсылка()); + СтрокиДляУдаления = КонтактнаяИнформация.НайтиСтроки(Отбор); + Для каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл + КонтактнаяИнформация.Удалить(СтрокаДляУдаления); + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КонтактнаяИнформация.Представление КАК Представление, + | КонтактнаяИнформация.Вид КАК Вид + |ПОМЕСТИТЬ КонтактнаяИнформация + |ИЗ + | &КонтактнаяИнформация КАК КонтактнаяИнформация + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КонтактнаяИнформация.Представление КАК Представление, + | КонтактнаяИнформация.Вид КАК Вид, + | КОЛИЧЕСТВО(КонтактнаяИнформация.Вид) КАК Количество + |ИЗ + | КонтактнаяИнформация КАК КонтактнаяИнформация + | + |СГРУППИРОВАТЬ ПО + | КонтактнаяИнформация.Вид, + | КонтактнаяИнформация.Представление ИТОГИ ПО Вид"; + + Запрос.УстановитьПараметр("КонтактнаяИнформация", КонтактнаяИнформация); + РезультатЗапроса = Запрос.Выполнить(); + ВыборкаВид = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + Пока ВыборкаВид.Следующий() Цикл + ВыборкаДетальныеЗаписи = ВыборкаВид.Выбрать(); + Если ВыборкаВид.Количество = 1 Тогда + СтрокаТаблиц = КонтактнаяИнформация.Найти(ВыборкаВид.Вид, "Вид"); + СтрокаТаблиц.ВидДляСписка = ВыборкаВид.Вид; + ИначеЕсли ВыборкаВид.Количество > 1 Тогда + СтрокаТаблиц = КонтактнаяИнформация.Добавить(); + СтрокаТаблиц.ВидДляСписка = ВыборкаВид.Вид; + Разделитель = ""; + Представление = ""; + Пока ВыборкаДетальныеЗаписи.Следующий() Цикл + Представление = Представление +Разделитель + ВыборкаДетальныеЗаписи.Представление; + Разделитель = ", "; + КонецЦикла; + СтрокаТаблиц.Представление = Представление; + КонецЕсли; + КонецЦикла; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; - Пока ВыборкаВид.Следующий() Цикл - ВыборкаДетальныеЗаписи = ВыборкаВид.Выбрать(); - Если ВыборкаВид.Количество = 1 Тогда - СтрокаТаблиц = КонтактнаяИнформация.Найти(ВыборкаВид.Вид, "Вид"); - СтрокаТаблиц.ВидДляСписка = ВыборкаВид.Вид; - ИначеЕсли ВыборкаВид.Количество > 1 Тогда - СтрокаТаблиц = КонтактнаяИнформация.Добавить(); - СтрокаТаблиц.ВидДляСписка = ВыборкаВид.Вид; - Разделитель = ""; - Представление = ""; - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - Представление = Представление +Разделитель + ВыборкаДетальныеЗаписи.Представление; - Разделитель = ", "; - КонецЦикла; - СтрокаТаблиц.Представление = Представление; - КонецЕсли; - КонецЦикла; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); КонецЦикла; КонецПроцедуры @@ -1954,7 +2111,7 @@ // // Параметры: // ВидКонтактнойИнформации - ДанныеФормыСтруктура -// - СправочникСсылка.ВидыКонтактнойИнформации: +// - СправочникОбъект.ВидыКонтактнойИнформации: // * Наименование - Строка // // Возвращаемое значение: @@ -3399,7 +3556,7 @@ Если Не Формат9Запятых Тогда ПространствоИмен = ПространствоИмен(); - Состав = XDTOКонтактнаяИнформация.Состав; // см. XDTOПакет.КонтактнаяИнформация.Адрес + Состав = XDTOКонтактнаяИнформация.Состав; Если Состав = Неопределено Тогда Возврат Результат; diff --git a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl index 7f5375b1b..5d926e702 100644 --- a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl @@ -600,6 +600,7 @@ МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); ОписаниеПрофиля = МодульУправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа();; + ОписаниеПрофиля.Родитель = "ДополнительныеПрофили"; ОписаниеПрофиля.Идентификатор = "70179f20-2315-11e6-9bff-d850e648b60c"; ОписаниеПрофиля.Наименование = НСтр("ru = 'Редактирование, отправка по почте, сохранение в файл печатных форм (дополнительно)'", ОбщегоНазначения.КодОсновногоЯзыка()); @@ -699,8 +700,7 @@ // символом подчеркивания. Примеры: "en", "en_US", "en_GB", "ru", "ru_RU". // // Возвращаемое значение: -// ТабличныйДокумент - для макета типа MXL. -// ДвоичныеДанные - для макетов офисных документов. +// ТабличныйДокумент, ДвоичныеДанные - макет. // Функция МакетПечатнойФормы(ПутьКМакету, Знач КодЯзыка = Неопределено) Экспорт @@ -996,8 +996,9 @@ // Возвращаемое значение: // Структура - настройки записи табличного документа в файл: // * ФорматыСохранения - Массив - коллекция значений типа ТипФайлаТабличногоДокумента, -// либо значений типа ТипФайлаТабличногоДокумента, преобразованных в строку; -// * УпаковатьВАрхив - Булево - если установить значение Истина, будет создан один файл архива с файлами указанных форматов; +// либо значений типа ТипФайлаТабличногоДокумента, преобразованных в строку. +// По умолчанию сохранение выполняется в формате PDF. +// * УпаковатьВАрхив - Булево - если установить значение Истина, будет создан один файл архива с файлами указанных форматов. // * ПереводитьИменаФайловВТранслит - Булево - если установить Истина, то имена полученных файлов будут на латинице. // * ПодписьИПечать - Булево - если установить Истина и сохраняемый табличный документ поддерживает размещение // подписей и печатей, то в записанных файлах будут размещены подписи и печати. @@ -1325,58 +1326,58 @@ // "Стандарты финансовых операций. Символы двумерного штрихового кода для осуществления платежей физических лиц". // ДанныеДокумента должны содержать информацию в полях, описанных ниже. // Обязательные поля структуры: -// * ТекстПолучателя - наименование получателя платежа - макс. 160 символов; -// * НомерСчетаПолучателя - номер счета получателя платежа - макс. 20 символов; -// * НаименованиеБанкаПолучателя - наименование банка получателя платежа - макс. 45 символов; -// * БИКБанкаПолучателя - БИК - макс. 9 символов; -// * СчетБанкаПолучателя - номер к/с банка получателя платежа - макс. 20 символов; +// * ТекстПолучателя - Строка - наименование получателя платежа, макс. 160 символов; +// * НомерСчетаПолучателя - Строка - номер счета получателя платежа, макс. 20 символов; +// * НаименованиеБанкаПолучателя - Строка - наименование банка получателя платежа, макс. 45 символов; +// * БИКБанкаПолучателя - Строка - макс. 9 символов; +// * СчетБанкаПолучателя - Строка - номер к/с банка получателя платежа, макс. 20 символов; // Дополнительные поля структуры: -// * СуммаЧислом - сумма платежа, в рублях - макс. 16 символов. -// * НазначениеПлатежа - наименование платежа (назначение) - макс. 210 символов; -// * ИННПолучателя - ИНН получателя платежа - макс. 12 символов; -// * ИННПлательщика - ИНН плательщика - макс. 12 символов; -// * СтатусСоставителя - статус составителя платежного документа - макс. 2 символа; -// * КПППолучателя - КПП получателя платежа - макс. 9 символов. -// * КодБК - КБК - макс. 20 символов; -// * КодОКТМО - ОКТМО - макс. 11 символов; -// * ПоказательОснования - основание налогового платежа - макс. 2 символа; -// * ПоказательПериода - налоговый период - макс. 10 символов; -// * ПоказательНомера - номер документа - макс. 15 символов; -// * ПоказательДаты - дата документа - макс. 10 символов. -// * ПоказательТипа - тип платежа - макс. 2 символа. -// Прочие дополнительные поля: -// * ФамилияПлательщика - фамилия плательщика. -// * ИмяПлательщика - имя плательщика. -// * ОтчествоПлательщика - отчество плательщика. -// * АдресПлательщика - адрес плательщика. -// * ЛицевойСчетБюджетногоПолучателя - лицевой счет бюджетного получателя. -// * ИндексПлатежногоДокумента - индекс платежного документа. -// * СНИЛС - № лицевого счета в системе персонифицированного учета в ПФР - СНИЛС. -// * НомерДоговора - номер договора. -// * НомерЛицевогоСчетаПлательщика - номер лицевого счета плательщика в организации (в системе учета ПУ). -// * НомерКвартиры - номер квартиры. -// * НомерТелефона - номер телефона. -// * ВидПлательщика - вид ДУЛ плательщика. -// * НомерПлательщик - номер ДУЛ плательщика. -// * ФИОРебенка - ФИО ребенка/учащегося. -// * ДатаРождения - дата рождения. -// * СрокПлатежа - срок платежа/дата выставления счета. -// * ПериодОплаты - период оплаты. -// * ВидПлатежа - вид платежа. -// * КодУслуги - код услуги/название прибора учета. -// * НомерПрибораУчета - номер прибора учета. -// * ПоказаниеПрибораУчета - показание прибора учета. -// * НомерИзвещения - номер извещения, начисления, счета. -// * ДатаИзвещения - дата извещения/начисления/счета/постановления (для ГИБДД). -// * НомерУчреждения - номер учреждения (образовательного, медицинского). -// * НомерГруппы - номер группы детсада/класса школы. -// * ФИОПреподавателя - ФИО преподавателя, специалиста, оказывающего услугу. -// * СуммаСтраховки - сумма страховки/дополнительной услуги/Сумма пени (в копейках). -// * НомерПостановления - номер постановления (для ГИБДД). -// * НомерИсполнительногоПроизводства - номер исполнительного производства. -// * КодВидаПлатежа - код вида платежа (например, для платежей в адрес Росреестра). -// * ИдентификаторНачисления - уникальный идентификатор начисления. -// * ТехническийКод - технический код, рекомендуемый для заполнения поставщиком услуг. +// * СуммаЧислом - Строка - сумма платежа, в рублях, макс. 16 символов. +// * НазначениеПлатежа - Строка - наименование платежа (назначение), макс. 210 символов; +// * ИННПолучателя - Строка - ИНН получателя платежа, макс. 12 символов; +// * ИННПлательщика - Строка - ИНН плательщика, макс. 12 символов; +// * СтатусСоставителя - Строка - статус составителя платежного документа, макс. 2 символа; +// * КПППолучателя - Строка - КПП получателя платежа, макс. 9 символов. +// * КодБК - Строка - КБК, макс. 20 символов; +// * КодОКТМО - Строка - ОКТМО, макс. 11 символов; +// * ПоказательОснования - Строка - основание налогового платежа, макс. 2 символа; +// * ПоказательПериода - Строка - налоговый период, макс. 10 символов; +// * ПоказательНомера - Строка - номер документа, макс. 15 символов; +// * ПоказательДаты - Строка - дата документа, макс. 10 символов. +// * ПоказательТипа - Строка - тип платежа, макс. 2 символа. +// Прочие дополнительные поля: +// * ФамилияПлательщика - Строка - фамилия плательщика. +// * ИмяПлательщика - Строка - имя плательщика. +// * ОтчествоПлательщика - Строка - отчество плательщика. +// * АдресПлательщика - Строка - адрес плательщика. +// * ЛицевойСчетБюджетногоПолучателя - Строка - лицевой счет бюджетного получателя. +// * ИндексПлатежногоДокумента - Строка - индекс платежного документа. +// * СНИЛС - Строка - № лицевого счета в системе персонифицированного учета в ПФР - СНИЛС. +// * НомерДоговора - Строка - номер договора. +// * НомерЛицевогоСчетаПлательщика - Строка - номер лицевого счета плательщика в организации (в системе учета ПУ). +// * НомерКвартиры - Строка - номер квартиры. +// * НомерТелефона - Строка - номер телефона. +// * ВидПлательщика - Строка - вид ДУЛ плательщика. +// * НомерПлательщик - Строка - номер ДУЛ плательщика. +// * ФИОРебенка - Строка - ФИО ребенка/учащегося. +// * ДатаРождения - Строка - дата рождения. +// * СрокПлатежа - Строка - срок платежа/дата выставления счета. +// * ПериодОплаты - Строка - период оплаты. +// * ВидПлатежа - Строка - вид платежа. +// * КодУслуги - Строка - код услуги/название прибора учета. +// * НомерПрибораУчета - Строка - номер прибора учета. +// * ПоказаниеПрибораУчета - Строка - показание прибора учета. +// * НомерИзвещения - Строка - номер извещения, начисления, счета. +// * ДатаИзвещения - Строка - дата извещения/начисления/счета/постановления (для ГИБДД). +// * НомерУчреждения - Строка - номер учреждения (образовательного, медицинского). +// * НомерГруппы - Строка - номер группы детсада/класса школы. +// * ФИОПреподавателя - Строка - ФИО преподавателя, специалиста, оказывающего услугу. +// * СуммаСтраховки - Строка - сумма страховки/дополнительной услуги/Сумма пени (в копейках). +// * НомерПостановления - Строка - номер постановления (для ГИБДД). +// * НомерИсполнительногоПроизводства - Строка - номер исполнительного производства. +// * КодВидаПлатежа - Строка - код вида платежа (например, для платежей в адрес Росреестра). +// * ИдентификаторНачисления - Строка - уникальный идентификатор начисления. +// * ТехническийКод - Строка - технический код, рекомендуемый для заполнения поставщиком услуг. // Может использоваться принимающей организацией для вызова соответствующей // обрабатывающей ИТ-системы. // Перечень значений кода представлен ниже. @@ -1552,7 +1553,10 @@ // Возвращает список поставляемых команд печати объекта. // // Параметры: -// Объект - СправочникСсылка.ИдентификаторыОбъектовМетаданных; +// Объект - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// +// Возвращаемое значение: +// см. СоздатьКоллекциюКомандПечати // Функция СтандартныеКомандыПечатиОбъекта(Объект) Экспорт @@ -2779,7 +2783,7 @@ Если ЗначениеЗаполнено(НазваниеПечатнойФормы) Тогда Возврат НазваниеПечатнойФормы; КонецЕсли; - Возврат ПолучитьИмяВременногоФайла(); + Возврат НСтр("ru = 'Документ'"); КонецЕсли; Если ТипЗнч(ИмяФайлаПечатнойФормы) = Тип("Соответствие") Тогда @@ -2973,6 +2977,10 @@ // Процедура ВыполнитьКомандуПечатиВФайл(КомандаПечати, НастройкиСохранения, СписокОбъектов, Результат) + Если Не ЗначениеЗаполнено(НастройкиСохранения.ФорматыСохранения) Тогда + НастройкиСохранения.ФорматыСохранения.Добавить(СтандартныеПодсистемыСервер.ТипФайлаТабличногоДокументаPDF()); + КонецЕсли; + ДанныеПечати = Неопределено; Если КомандаПечати.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" Тогда Источник = КомандаПечати.ДополнительныеПараметры.Ссылка; @@ -3110,6 +3118,9 @@ КонецФункции +// Возвращаемое значение: +// ТабличныйДокумент, ДвоичныеДанные - макет. +// Функция НайтиМакет(ПутьКМакету, КодЯзыка, ТолькоПоставляемый = Ложь) ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl index 8c3f5c394..80a5ae62c 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl @@ -172,7 +172,9 @@ КонецПроцедуры // Устанавливает свойство видимости у приложения MS Word. -// Handler - ссылка на печатную форму. +// +// Параметры: +// Handler - Структура - ссылка на печатную форму. // Процедура ПоказатьДокументMSWord(Знач Handler) Экспорт @@ -262,10 +264,8 @@ // Добавляет нижний колонтитул в печатную форму из макета. // Параметры: -// ПечатнаяФорма - ссылка на печатную форму. -// ОбластьHandler - ссылка на область в макете. -// Параметры - список параметров для замены на значения. -// ДанныеОбъекта - данные объекта для заполнения. +// ПечатнаяФорма - Структура - ссылка на печатную форму. +// ОбластьHandler - COMОбъект - ссылка на область в макете. // Процедура ДобавитьНижнийКолонтитул(Знач ПечатнаяФорма, Знач ОбластьHandler) Экспорт @@ -350,7 +350,10 @@ // ПереходНаСледСтроку - Булево - требуется ли вставлять разрыв после вывода области. // // Возвращаемое значение: -// КоординатыОбласти +// Структура: +// * Document - COMОбъект +// * Start - Число +// * End - Число // Функция ПрисоединитьОбласть(Знач ПечатнаяФорма, Знач ОбластьHandler, @@ -388,8 +391,8 @@ // Применяется при выводе данных списка (маркированного или нумерованного). // // Параметры: -// ОбластьПечатнойФормы - ссылка на область в печатной форме. -// ДанныеОбъекта - ДанныеОбъекта. +// ОбластьПечатнойФормы - COMОбъект - ссылка на область в печатной форме. +// ДанныеОбъекта - Структура. // Процедура ЗаполнитьПараметры(Знач ОбластьПечатнойФормы, Знач ДанныеОбъекта = Неопределено) Экспорт @@ -412,10 +415,10 @@ // Применяется при выводе данных списка (маркированного или нумерованного). // // Параметры: -// ПечатнаяФорма - ссылка на печатную форму. -// ОбластьHandler - ссылка на область в макете. +// ПечатнаяФорма - Структура - ссылка на печатную форму. +// ОбластьHandler - COMОбъект - ссылка на область в макете. // Параметры - Строка - перечень параметров, которые требуется заменить. -// ДанныеОбъекта - ДанныеОбъекта +// ДанныеОбъекта - Массив из Структура // ПереходНаСледСтроку - Булево - требуется ли вставлять разрыв после вывода области. // Процедура ПрисоединитьИЗаполнитьНабор(Знач ПечатнаяФорма, @@ -452,10 +455,10 @@ // Применяется при выводе строки таблицы. // // Параметры: -// ПечатнаяФорма - ссылка на печатную форму. -// ОбластьHandler - ссылка на область в макете. +// ПечатнаяФорма - Структура - ссылка на печатную форму. +// ОбластьHandler - COMОбъект - ссылка на область в макете. // ИмяТаблицы - наименование таблицы (для доступа к данным). -// ДанныеОбъекта - ДанныеОбъекта +// ДанныеОбъекта - Структура // ПереходНаСледСтроку - Булево - требуется ли вставлять разрыв после вывода области. // Процедура ПрисоединитьИЗаполнитьОбластьТаблицы(Знач ПечатнаяФорма, @@ -636,7 +639,7 @@ Selection.Delete(); ИначеЕсли ЭтоАдресВременногоХранилища(СтрокаЗамены) Тогда Selection.Delete(); - ВременныйКаталог = КаталогВременныхФайлов(); + ВременныйКаталог = УправлениеПечатьюСлужебныйКлиент.СоздатьВременныйКаталог("MSWord"); #Если ВебКлиент Тогда ИмяВременногоФайла = ВременныйКаталог + Строка(Новый УникальныйИдентификатор) + ".tmp"; #Иначе diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl index e28150ccd..fe250d38f 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl @@ -174,7 +174,9 @@ КонецПроцедуры // Устанавливает свойство видимости у приложения OO Writer. -// Handler - ссылка на печатную форму. +// +// Параметры: +// Handler - Структура - ссылка на печатную форму. // Процедура ПоказатьДокументOOWriter(Знач Handler) Экспорт @@ -317,7 +319,8 @@ СтрокаЗамены = КлючЗначение.Значение; Если ЭтоАдресВременногоХранилища(СтрокаЗамены) Тогда #Если ВебКлиент Тогда - ИмяВременногоФайла = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор) + ".tmp"; + ИмяВременногоФайла = УправлениеПечатьюСлужебныйКлиент.СоздатьВременныйКаталог("OOWriter") + + Строка(Новый УникальныйИдентификатор) + ".tmp"; #Иначе ИмяВременногоФайла = ПолучитьИмяВременногоФайла("tmp"); #КонецЕсли diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl index 212f37f11..9dd5020ba 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl @@ -304,6 +304,125 @@ Возврат Результат; КонецФункции +// Используется для улучшения документирующих комментариев. Не предназначена для использования в других целях. +// +// Возвращаемое значение: +// Структура: +// * Форма - ФормаКлиентскогоПриложения - форма, в которой выполняется печать. +// * ОбъектыПечати - Массив из ЛюбаяСсылка - объекты, по которым необходимо сформировать печатные формы. +// * Идентификатор - Строка - идентификатор команды печати, по которому менеджер печати определяет печатную +// форму, которую необходимо сформировать. +// Например, "СчетЗаказ". +// +// Для печати нескольких печатных форм можно указывать одновременно несколько их +// идентификаторов (строкой, через запятую либо массивом строк), например: +// "СчетЗаказ,ГарантийноеПисьмо". +// +// Если необходимо задать количество копий печати для печатной формы, то ее +// идентификатор нужно продублировать столько раз, сколько копий необходимо +// сформировать. При этом следует учитывать, что порядок следования печатных +// форм в комплекте будет соответствовать порядку идентификаторов печатных форм, +// указанных в этом параметре. Например (2 счета на оплату + 1 гарантийное письмо): +// "СчетЗаказ,СчетЗаказ,ГарантийноеПисьмо". +// +// Идентификатор печатной формы может содержать в себе и альтернативный менеджер +// печати, если он отличается от указанного в параметре МенеджерПечати, +// например: "СчетЗаказ,Обработка.ПечатнаяФорма.ГарантийноеПисьмо". +// +// В этом примере ГарантийноеПисьмо формируется в менеджере печати +// Обработка.ПечатнаяФорма, а СчетЗаказ - в менеджере печати, указанном в +// параметре МенеджерПечати. +// +// - Массив - список идентификаторов команд печати. +// +// * МенеджерПечати - Строка - (необязательный) имя объекта, в модуле менеджера которого располагается +// процедура Печать, формирующая табличные документы для этой команды. +// Значение по умолчанию - имя модуля менеджера объекта. +// Например, "Документ.СчетНаОплатуПокупателю". +// +// * Обработчик - Строка - (необязательный) клиентский обработчик команды, в который необходимо передать +// управление вместо стандартного обработчика команды Печать. Используется, +// например, когда печатная форма формируется на клиенте. +// Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется, когда процедура размещена +// в общем модуле. +// Формат "<ИмяПроцедуры>" используется, когда процедура размещена +// в модуле основной формы отчета или обработки, указанной в МенеджерПечати. +// Например, +// КомандаПечати.Обработчик = "_ДемоСтандартныеПодсистемыКлиент.ПечатьСчетовНаОплатуПокупателю"; +// Пример обработчика в модуле формы: +// // Формирует печатную форму <представление печатной формы>. +// // +// // Параметры: +// // ПараметрыПечати - Структура - сведения о печатной форме. +// // * ОбъектыПечати - Массив - массив ссылок выбранных объектов. +// // * Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана +// // команда печати. +// // * ДополнительныеПараметры - Структура - дополнительные параметры печати. +// // Прочие ключи структуры соответствуют колонкам таблицы КомандыПечати, +// // подробнее см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати. +// // +// &НаКлиенте +// Функция <ИмяФункции>(ПараметрыПечати) Экспорт +// // Обработчик печати. +// КонецФункции +// Следует иметь в виду, что обработчик вызывается при помощи метода Вычислить, +// поэтому в качестве обработчика может выступать только функция. +// При этом возвращаемое значение функции никак в дальнейшем не используется подсистемой. +// +// * СразуНаПринтер - Булево - (необязательный) Признак необходимости печати документов без предварительного +// просмотра, сразу на принтер. Если параметр не указан, то при выборе команды +// печати открывается форма предварительного просмотра «Печать документов». +// +// * ФорматСохранения - ТипФайлаТабличногоДокумента - (необязательный) Применяется для быстрого сохранения печатной +// формы (без дополнительных действий) в различные форматы, отличные от mxl. +// Если параметр не указан, то формируется обычный mxl. +// Например, ТипФайлаТабличногоДокумента.PDF. +// +// При выборе команды печати сразу открывается сформированный в формате pdf +// документ. +// +// * ЗаголовокФормы - Строка - (необязательный) Произвольная строка, переопределяющая стандартных заголовок +// формы "Печать документов". +// Например, "Настраиваемый комплект". +// +// * ПереопределитьПользовательскиеНастройкиКоличества - Булево - (необязательный) Признак необходимости отключения в +// форме ПечатьДокументов механизма сохранения/восстановления выбранного +// пользователем количества экземпляров на печать. Если параметр не указан, то +// механизм сохранения/восстановления настроек будет работать при открытии формы. +// ПечатьДокументов. +// +// * ДополнитьКомплектВнешнимиПечатнымиФормами - Булево - (необязательный) Признак необходимости дополнить комплект +// документов всеми подключенными к объекту внешними печатными формами +// (подсистема ДополнительныеОтчетыИОбработки). Если параметр не указан, внешние +// печатные формы не добавляются в комплект. +// * ФиксированныйКомплект - Булево - (необязательный) Признак необходимости блокировки от изменения пользователем +// состава комплекта документов. Если параметр не указан, то пользователь сможет +// исключать отдельные печатные формы из комплекта в форме ПечатьДокументов, а +// также изменять их количество. +// +// * ДополнительныеПараметры - Структура - (необязательный) произвольные параметры для передачи в менеджер печати. +// +// +Функция ОписаниеПараметровПечати() Экспорт + + Результат = Новый Структура; + Результат.Вставить("Форма"); + Результат.Вставить("ОбъектыПечати"); + Результат.Вставить("Идентификатор"); + Результат.Вставить("МенеджерПечати"); + Результат.Вставить("Обработчик"); + Результат.Вставить("СразуНаПринтер"); + Результат.Вставить("ФорматСохранения"); + Результат.Вставить("ЗаголовокФормы"); + Результат.Вставить("ПереопределитьПользовательскиеНастройкиКоличества"); + Результат.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами"); + Результат.Вставить("ФиксированныйКомплект"); + Результат.Вставить("ДополнительныеПараметры"); + + Возврат Результат; + +КонецФункции + #Область УстаревшиеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// @@ -804,121 +923,4 @@ КонецПроцедуры -// Возвращаемое значение: -// Структура: -// * Форма - ФормаКлиентскогоПриложения - форма, в которой выполняется печать. -// * ОбъектыПечати - Массив из ЛюбаяСсылка - объекты, по которым необходимо сформировать печатные формы. -// * Идентификатор - Строка - идентификатор команды печати, по которому менеджер печати определяет печатную -// форму, которую необходимо сформировать. -// Например, "СчетЗаказ". -// -// Для печати нескольких печатных форм можно указывать одновременно несколько их -// идентификаторов (строкой, через запятую либо массивом строк), например: -// "СчетЗаказ,ГарантийноеПисьмо". -// -// Если необходимо задать количество копий печати для печатной формы, то ее -// идентификатор нужно продублировать столько раз, сколько копий необходимо -// сформировать. При этом следует учитывать, что порядок следования печатных -// форм в комплекте будет соответствовать порядку идентификаторов печатных форм, -// указанных в этом параметре. Например (2 счета на оплату + 1 гарантийное письмо): -// "СчетЗаказ,СчетЗаказ,ГарантийноеПисьмо". -// -// Идентификатор печатной формы может содержать в себе и альтернативный менеджер -// печати, если он отличается от указанного в параметре МенеджерПечати, -// например: "СчетЗаказ,Обработка.ПечатнаяФорма.ГарантийноеПисьмо". -// -// В этом примере ГарантийноеПисьмо формируется в менеджере печати -// Обработка.ПечатнаяФорма, а СчетЗаказ - в менеджере печати, указанном в -// параметре МенеджерПечати. -// -// - Массив - список идентификаторов команд печати. -// -// * МенеджерПечати - Строка - (необязательный) имя объекта, в модуле менеджера которого располагается -// процедура Печать, формирующая табличные документы для этой команды. -// Значение по умолчанию - имя модуля менеджера объекта. -// Например, "Документ.СчетНаОплатуПокупателю". -// -// * Обработчик - Строка - (необязательный) клиентский обработчик команды, в который необходимо передать -// управление вместо стандартного обработчика команды Печать. Используется, -// например, когда печатная форма формируется на клиенте. -// Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется, когда процедура размещена -// в общем модуле. -// Формат "<ИмяПроцедуры>" используется, когда процедура размещена -// в модуле основной формы отчета или обработки, указанной в МенеджерПечати. -// Например, -// КомандаПечати.Обработчик = "_ДемоСтандартныеПодсистемыКлиент.ПечатьСчетовНаОплатуПокупателю"; -// Пример обработчика в модуле формы: -// // Формирует печатную форму <представление печатной формы>. -// // -// // Параметры: -// // ПараметрыПечати - Структура - сведения о печатной форме. -// // * ОбъектыПечати - Массив - массив ссылок выбранных объектов. -// // * Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана -// // команда печати. -// // * ДополнительныеПараметры - Структура - дополнительные параметры печати. -// // Прочие ключи структуры соответствуют колонкам таблицы КомандыПечати, -// // подробнее см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати. -// // -// &НаКлиенте -// Функция <ИмяФункции>(ПараметрыПечати) Экспорт -// // Обработчик печати. -// КонецФункции -// Следует иметь в виду, что обработчик вызывается при помощи метода Вычислить, -// поэтому в качестве обработчика может выступать только функция. -// При этом возвращаемое значение функции никак в дальнейшем не используется подсистемой. -// -// * СразуНаПринтер - Булево - (необязательный) Признак необходимости печати документов без предварительного -// просмотра, сразу на принтер. Если параметр не указан, то при выборе команды -// печати открывается форма предварительного просмотра «Печать документов». -// -// * ФорматСохранения - ТипФайлаТабличногоДокумента - (необязательный) Применяется для быстрого сохранения печатной -// формы (без дополнительных действий) в различные форматы, отличные от mxl. -// Если параметр не указан, то формируется обычный mxl. -// Например, ТипФайлаТабличногоДокумента.PDF. -// -// При выборе команды печати сразу открывается сформированный в формате pdf -// документ. -// -// * ЗаголовокФормы - Строка - (необязательный) Произвольная строка, переопределяющая стандартных заголовок -// формы "Печать документов". -// Например, "Настраиваемый комплект". -// -// * ПереопределитьПользовательскиеНастройкиКоличества - Булево - (необязательный) Признак необходимости отключения в -// форме ПечатьДокументов механизма сохранения/восстановления выбранного -// пользователем количества экземпляров на печать. Если параметр не указан, то -// механизм сохранения/восстановления настроек будет работать при открытии формы. -// ПечатьДокументов. -// -// * ДополнитьКомплектВнешнимиПечатнымиФормами - Булево - (необязательный) Признак необходимости дополнить комплект -// документов всеми подключенными к объекту внешними печатными формами -// (подсистема ДополнительныеОтчетыИОбработки). Если параметр не указан, внешние -// печатные формы не добавляются в комплект. -// * ФиксированныйКомплект - Булево - (необязательный) Признак необходимости блокировки от изменения пользователем -// состава комплекта документов. Если параметр не указан, то пользователь сможет -// исключать отдельные печатные формы из комплекта в форме ПечатьДокументов, а -// также изменять их количество. -// -// * ДополнительныеПараметры - Структура - (необязательный) произвольные параметры для передачи в менеджер печати. -// -// -Функция ОписаниеПараметровПечати() Экспорт - - Результат = Новый Структура; - Результат.Вставить("Форма"); - Результат.Вставить("ОбъектыПечати"); - Результат.Вставить("Идентификатор"); - Результат.Вставить("МенеджерПечати"); - Результат.Вставить("Обработчик"); - Результат.Вставить("СразуНаПринтер"); - Результат.Вставить("ФорматСохранения"); - Результат.Вставить("ЗаголовокФормы"); - Результат.Вставить("ПереопределитьПользовательскиеНастройкиКоличества"); - Результат.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами"); - Результат.Вставить("ФиксированныйКомплект"); - Результат.Вставить("ДополнительныеПараметры"); - - Возврат Результат; - -КонецФункции - #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl index 9de8c7ce9..4ebfd4e2b 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl @@ -66,7 +66,7 @@ // // Параметры: // НастройкиСписка - Структура - модификаторы списка команд печати: -// * МенеджерКомандПечати - МенеджерОбъекта - менеджер объекта, в котором формируется список команд печати; +// * МенеджерКомандПечати - ОбщийМодуль - менеджер объекта, в котором формируется список команд печати; // * АвтоматическоеЗаполнение - Булево - заполнять команды печати из объектов, входящих в состав журнала. // Если установлено значение Ложь, то список команд печати журнала будет // заполнен вызовом метода ДобавитьКомандыПечати из модуля менеджера журнала. @@ -85,6 +85,7 @@ // Позволяет выполнить постобработку печатных форм при их формировании. // Например, можно вставить в печатную форму дату формирования. // Вызывается после завершения процедуры Печать менеджера печати объекта, имеет те же параметры. +// Не вызывается при вызове УправлениеПечатьюКлиент.ПечатьДокументов. // // Параметры: // МассивОбъектов - Массив из ЛюбаяСсылка - список объектов, для которых была выполняется команда печати; diff --git a/SSL/src/CommonModules/УправлениеПечатьюРФ/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюРФ/Module.bsl index 3c217d868..0b3cfbdce 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюРФ/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюРФ/Module.bsl @@ -17,58 +17,58 @@ // "СТАНДАРТЫ ФИНАНСОВЫХ ОПЕРАЦИЙ Символы двумерного штрихового кода для осуществления платежей физических лиц". // ДанныеДокумента должны содержать информацию в полях, описанных ниже. // Обязательные поля структуры: -// * ТекстПолучателя - наименование получателя платежа - Макс. 160 символов; -// * НомерСчетаПолучателя - номер счета получателя платежа - Макс. 20 символов; -// * НаименованиеБанкаПолучателя - наименование банка получателя платежа - Макс. 45 символов; -// * БИКБанкаПолучателя - БИК - макс. 9 символов; -// * СчетБанкаПолучателя - номер к/с банка получателя платежа - Макс. 20 символов; +// * ТекстПолучателя - Строка - наименование получателя платежа, макс. 160 символов; +// * НомерСчетаПолучателя - Строка - номер счета получателя платежа, макс. 20 символов; +// * НаименованиеБанкаПолучателя - Строка - наименование банка получателя платежа, макс. 45 символов; +// * БИКБанкаПолучателя - Строка - макс. 9 символов; +// * СчетБанкаПолучателя - Строка - номер к/с банка получателя платежа, макс. 20 символов; // Дополнительные поля структуры: -// * СуммаЧислом - сумма платежа, в рублях - Макс. 16 символов. -// * НазначениеПлатежа - наименование платежа (назначение) - Макс. 210 символов; -// * ИННПолучателя - ИНН получателя платежа - Макс. 12 символов; -// * ИННПлательщика - ИНН плательщика - Макс. 12 символов; -// * СтатусСоставителя - статус составителя платежного документа - Макс. 2 символа; -// * КПППолучателя - КПП получателя платежа - Макс. 9 символов. -// * КодБК - КБК - макс. 20 символов; -// * КодОКТМО - код КодОКТМО - Макс. 11 символов; -// * ПоказательОснования - основание налогового платежа - Макс. 2 символа; -// * ПоказательПериода - налоговый период - Макс. 10 символов; -// * ПоказательНомера - номер документа - Макс. 15 символов; -// * ПоказательДаты - дата документа - Макс. 10 символ. -// * ПоказательТипа - тип платежа - Макс. 2 символа. +// * СуммаЧислом - Строка - сумма платежа, в рублях, макс. 16 символов. +// * НазначениеПлатежа - Строка - наименование платежа (назначение), макс. 210 символов; +// * ИННПолучателя - Строка - ИНН получателя платежа, макс. 12 символов; +// * ИННПлательщика - Строка - ИНН плательщика, макс. 12 символов; +// * СтатусСоставителя - Строка - статус составителя платежного документа, макс. 2 символа; +// * КПППолучателя - Строка - КПП получателя платежа, макс. 9 символов. +// * КодБК - Строка - макс. 20 символов; +// * КодОКТМО - Строка - код ОКТМО, макс. 11 символов; +// * ПоказательОснования - Строка - основание налогового платежа, макс. 2 символа; +// * ПоказательПериода - Строка - налоговый период, макс. 10 символов; +// * ПоказательНомера - Строка - номер документа, макс. 15 символов; +// * ПоказательДаты - Строка - дата документа, макс. 10 символ. +// * ПоказательТипа - Строка - тип платежа, макс. 2 символа. // Прочие дополнительные поля. -// * ФамилияПлательщика - фамилия плательщика. -// * ИмяПлательщика - имя плательщика. -// * ОтчествоПлательщика - отчество плательщика. -// * АдресПлательщика - адрес плательщика. -// * ЛицевойСчетБюджетногоПолучателя - лицевой счет бюджетного получателя. -// * ИндексПлатежногоДокумента - индекс платежного документа. -// * СНИЛС - № лицевого счета в системе персонифицированного учета в ПФР - СНИЛС. -// * НомерДоговора - номер договора. -// * НомерЛицевогоСчетаПлательщика - номер лицевого счета плательщика в организации (в системе учета ПУ). -// * НомерКвартиры - номер квартиры. -// * НомерТелефона - номер телефона. -// * ВидПлательщика - вид ДУЛ плательщика. -// * НомерПлательщик - номер ДУЛ плательщика. -// * ФИОРебенка - Ф.И.О. ребенка/учащегося. -// * ДатаРождения - дата рождения. -// * СрокПлатежа - срок платежа/дата выставления счета. -// * ПериодОплаты - период оплаты. -// * ВидПлатежа - вид платежа. -// * КодУслуги - код услуги/название прибора учета. -// * НомерПрибораУчета - номер прибора учета. -// * ПоказаниеПрибораУчета - показание прибора учета. -// * НомерИзвещения - номер извещения, начисления, счета. -// * ДатаИзвещения - дата извещения/начисления/счета/постановления (для ГИБДД). -// * НомерУчреждения - номер учреждения (образовательного, медицинского). -// * НомерГруппы - номер группы детсада/класса школы. -// * ФИОПреподавателя - ФИО преподавателя, специалиста, оказывающего услугу. -// * СуммаСтраховки - сумма страховки/дополнительной услуги/Сумма пени (в копейках). -// * НомерПостановления - номер постановления (для ГИБДД). -// * НомерИсполнительногоПроизводства - номер исполнительного производства. -// * КодВидаПлатежа - код вида платежа (например, для платежей в адрес Росреестра). -// * ИдентификаторНачисления - уникальный идентификатор начисления. -// * ТехническийКод - технический код, рекомендуемый для заполнения поставщиком услуг. +// * ФамилияПлательщика - Строка - фамилия плательщика. +// * ИмяПлательщика - Строка - имя плательщика. +// * ОтчествоПлательщика - Строка - отчество плательщика. +// * АдресПлательщика - Строка - адрес плательщика. +// * ЛицевойСчетБюджетногоПолучателя - Строка - лицевой счет бюджетного получателя. +// * ИндексПлатежногоДокумента - Строка - индекс платежного документа. +// * СНИЛС - Строка - № лицевого счета в системе персонифицированного учета в ПФР - СНИЛС. +// * НомерДоговора - Строка - номер договора. +// * НомерЛицевогоСчетаПлательщика - Строка - номер лицевого счета плательщика в организации (в системе учета ПУ). +// * НомерКвартиры - Строка - номер квартиры. +// * НомерТелефона - Строка - номер телефона. +// * ВидПлательщика - Строка - вид ДУЛ плательщика. +// * НомерПлательщик - Строка - номер ДУЛ плательщика. +// * ФИОРебенка - Строка - Ф.И.О. ребенка/учащегося. +// * ДатаРождения - Строка - дата рождения. +// * СрокПлатежа - Строка - срок платежа/дата выставления счета. +// * ПериодОплаты - Строка - период оплаты. +// * ВидПлатежа - Строка - вид платежа. +// * КодУслуги - Строка - код услуги/название прибора учета. +// * НомерПрибораУчета - Строка - номер прибора учета. +// * ПоказаниеПрибораУчета - Строка - показание прибора учета. +// * НомерИзвещения - Строка - номер извещения, начисления, счета. +// * ДатаИзвещения - Строка - дата извещения/начисления/счета/постановления (для ГИБДД). +// * НомерУчреждения - Строка - номер учреждения (образовательного, медицинского). +// * НомерГруппы - Строка - номер группы детсада/класса школы. +// * ФИОПреподавателя - Строка - ФИО преподавателя, специалиста, оказывающего услугу. +// * СуммаСтраховки - Строка - сумма страховки/дополнительной услуги/Сумма пени (в копейках). +// * НомерПостановления - Строка - номер постановления (для ГИБДД). +// * НомерИсполнительногоПроизводства - Строка - номер исполнительного производства. +// * КодВидаПлатежа - Строка - код вида платежа (например, для платежей в адрес Росреестра). +// * ИдентификаторНачисления - Строка - уникальный идентификатор начисления. +// * ТехническийКод - Строка - технический код, рекомендуемый для заполнения поставщиком услуг. // Может использоваться принимающей организацией для вызова соответствующей // обрабатывающей ИТ-системы. // Перечень значений кода представлен ниже. diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl index 7f680b1e8..fe5a333fb 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl @@ -3053,12 +3053,11 @@ КонецПроцедуры -// ЗаписатьСобытияВЖурналРегистрации // Параметры: -// * ИмяСобытия - Строка - имя записываемого события. -// * ПредставлениеУровня - Строка - представление значений коллекции УровеньЖурналаРегистрации. -// Доступные значения: "Информация", "Ошибка", "Предупреждение", "Примечание". -// * Комментарий - Строка - комментарий события. +// ИмяСобытия - Строка - имя записываемого события. +// ПредставлениеУровня - Строка - представление значений коллекции УровеньЖурналаРегистрации. +// Доступные значения: "Информация", "Ошибка", "Предупреждение", "Примечание". +// Комментарий - Строка - комментарий события. // Процедура ЗаписатьСобытияВЖурналРегистрации(ИмяСобытия, ПредставлениеУровня, Комментарий) diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl index 68298b0b3..9a85aa9f7 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl @@ -100,10 +100,12 @@ ОписаниеКоманды.Вставить("Форма", Форма); ИмяОбработчика = ОписаниеКоманды.Обработчик; Если СтрЧислоВхождений(ИмяОбработчика, ".") = 0 И ЭтоОтчетИлиОбработка(ОписаниеКоманды.МенеджерПечати) Тогда - ОсновнаяФорма = ПолучитьФорму(ОписаниеКоманды.МенеджерПечати + ".Форма", , Форма, Истина); // АПК: + //@skip-warning + ОсновнаяФорма = ПолучитьФорму(ОписаниеКоманды.МенеджерПечати + ".Форма", , Форма, Истина); ИмяОбработчика = "ОсновнаяФорма." + ИмяОбработчика; КонецЕсли; Обработчик = ИмяОбработчика + "(ОписаниеКоманды)"; + //@skip-warning Результат = Вычислить(Обработчик); Возврат; КонецЕсли; diff --git a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl index c3375b7b5..54dde161c 100644 --- a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl @@ -368,7 +368,7 @@ // Функция НаборСвойствПоИмени(ИмяНабора) Экспорт ПредопределенныеНаборыСвойств = УправлениеСвойствамиПовтИсп.ПредопределенныеНаборыСвойств(); - Набор = ПредопределенныеНаборыСвойств.Получить(ИмяНабора); + Набор = ПредопределенныеНаборыСвойств.Получить(ИмяНабора); // см. Справочники.НаборыДополнительныхРеквизитовИСведений.СвойстваНабора Если Набор = Неопределено Тогда Возврат Неопределено; Иначе @@ -827,7 +827,8 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения - уже настроена в процедуре ПриСозданииНаСервере. // Объект - Неопределено - взять объект из реквизита формы "Объект". -// - Объект - СправочникОбъект, ДокументОбъект, ..., ДанныеФормыСтруктура (по типу объекта). +// - СправочникОбъект, ДокументОбъект, ДанныеФормыСтруктура - объект со свойствами или +// реквизит формы, содержащий объект. // Процедура ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект = Неопределено) Экспорт @@ -877,7 +878,7 @@ // // Параметры: // ВладелецСвойств - ЛюбаяСсылка - например: СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... -// - Объект - например: СправочникОбъект.Номенклатура, ДокументОбъект.ЗаказПокупателя, ... +// - СправочникОбъект, ДокументОбъект - любой объект со свойствами. // - ДанныеФормыСтруктура - коллекция по типу объекта владельца свойств. // ПолучатьДопРеквизиты - Булево - в результат включать дополнительные реквизиты. // ПолучатьДопСведения - Булево - в результат включать дополнительные сведения. @@ -940,6 +941,8 @@ КонецФункции +// АПК:142-выкл Проектное решение + // Возвращает значения дополнительных свойств объектов. // // Параметры: @@ -948,10 +951,9 @@ // ДокументСсылка.ЗаказПокупателя, ... // ПолучатьДопРеквизиты - Булево - в результат включать дополнительные реквизиты. По умолчанию Истина. // ПолучатьДопСведения - Булево - в результат включать дополнительные сведения. По умолчанию Истина. -// Свойства - Массив - свойства: -// * ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - значения +// Свойства - Массив из ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - значения // которых следует получить. -// * Строка - уникальное имя дополнительного свойства. +// - Массив из Строка - уникальное имя дополнительного свойства. // - Неопределено - по умолчанию, получить значения всех свойств владельца. // КодЯзыка - Строка - код языка, на котором будет получено представление значения свойства. // Если не указано - берется текущий язык. @@ -1066,6 +1068,8 @@ Возврат ?(РезультатСТекстовымиСтроками <> Неопределено, РезультатСТекстовымиСтроками, Результат); КонецФункции +// АПК:142-вкл + // Возвращает значение дополнительного свойства объекта. // // Параметры: @@ -1353,14 +1357,26 @@ ВыборкаНаборов = ЗапросНаборов.Выполнить().Выбрать(); Пока ВыборкаНаборов.Следующий() Цикл - Наименование = УправлениеСвойствамиСлужебный.НаименованиеПредопределенногоНабора( - ВыборкаНаборов.Ссылка); - - Если ВыборкаНаборов.Наименование <> Наименование Тогда - Объект = ВыборкаНаборов.Ссылка.ПолучитьОбъект(); - Объект.Наименование = Наименование; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - КонецЕсли; + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаНаборов.Ссылка); + Блокировка.Заблокировать(); + + Наименование = УправлениеСвойствамиСлужебный.НаименованиеПредопределенногоНабора( + ВыборкаНаборов.Ссылка); + + Если ВыборкаНаборов.Наименование <> Наименование Тогда + Объект = ВыборкаНаборов.Ссылка.ПолучитьОбъект(); + Объект.Наименование = Наименование; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; ЗапросСвойств = Новый Запрос; @@ -1384,10 +1400,24 @@ ВыборкаСвойств = ЗапросСвойств.Выполнить().Выбрать(); Пока ВыборкаСвойств.Следующий() Цикл - Объект = ВыборкаСвойств.Ссылка.ПолучитьОбъект(); // ПланВидовХарактеристикОбъект.ДополнительныеРеквизитыИСведения - Объект.Наименование = Объект.Заголовок; - Объект.ПометкаУдаления = ВыборкаСвойств.ПометкаУдаленияНабора; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаСвойств.Ссылка); + Блокировка.Заблокировать(); + + Объект = ВыборкаСвойств.Ссылка.ПолучитьОбъект(); // ПланВидовХарактеристикОбъект.ДополнительныеРеквизитыИСведения + Объект.Наименование = Объект.Заголовок; + Объект.ПометкаУдаления = ВыборкаСвойств.ПометкаУдаленияНабора; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЦикла; КонецПроцедуры @@ -1409,18 +1439,37 @@ Если НаборСвойств = Неопределено Тогда НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений[ИмяНабораСвойств]; КонецЕсли; - НаборСвойствОбъект = НаборСвойств.ПолучитьОбъект(); - Для Каждого Параметр Из Параметры Цикл - Если НаборСвойствОбъект[Параметр.Ключ] = Параметр.Значение Тогда - Продолжить; - КонецЕсли; - ЗаписатьОбъект = Истина; - КонецЦикла; - Если ЗаписатьОбъект Тогда - ЗаполнитьЗначенияСвойств(НаборСвойствОбъект, Параметры); - ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборСвойствОбъект); - КонецЕсли; + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", НаборСвойств); + Блокировка.Заблокировать(); + + НаборСвойствОбъект = НаборСвойств.ПолучитьОбъект(); + Если НаборСвойствОбъект = Неопределено Тогда + ОтменитьТранзакцию(); + Возврат; + КонецЕсли; + + Для Каждого Параметр Из Параметры Цикл + Если НаборСвойствОбъект[Параметр.Ключ] = Параметр.Значение Тогда + Продолжить; + КонецЕсли; + ЗаписатьОбъект = Истина; + КонецЦикла; + + Если ЗаписатьОбъект Тогда + ЗаполнитьЗначенияСвойств(НаборСвойствОбъект, Параметры); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборСвойствОбъект); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -1449,8 +1498,7 @@ // ВладелецСвойств - ЛюбаяСсылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... // ПолучатьДопРеквизиты - Булево - в результат включать дополнительные реквизиты. // ПолучатьДопСведения - Булево - в результат включать дополнительные сведения. -// МассивСвойств - Массив - свойства: -// * ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - значения +// МассивСвойств - Массив из ПланВидовХарактеристикСсылка - дополнительные реквизиты, значения // которых следует получить. // - Неопределено - получить значения всех свойств владельца. // Возвращаемое значение: @@ -1477,8 +1525,7 @@ // ПолучатьДопСведения - Булево - в результат включать дополнительные сведения. // // Возвращаемое значение: -// Массив - значения: -// * ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - если есть. +// Массив из ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - если есть. // Функция ПолучитьСписокСвойств(ВладелецСвойств, ПолучатьДопРеквизиты = Истина, ПолучатьДопСведения = Истина) Экспорт Возврат СвойстваОбъекта(ВладелецСвойств, ПолучатьДопРеквизиты, ПолучатьДопСведения); @@ -1491,8 +1538,7 @@ // которого нужно получить перечисляемые значения. // // Возвращаемое значение: -// Массив - значения: -// * СправочникСсылка.ЗначенияСвойствОбъектов, СправочникСсылка.ЗначенияСвойствОбъектовИерархия - значения +// Массив из СправочникСсылка.ЗначенияСвойствОбъектов, СправочникСсылка.ЗначенияСвойствОбъектовИерархия - значения // свойства, если есть. // Функция ПолучитьСписокЗначенийСвойств(Свойство) Экспорт diff --git a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl index ff73b237f..11030dcb2 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl @@ -1884,9 +1884,22 @@ Пока Выборка.Следующий() Цикл - НаборОбъект = Выборка.Ссылка.ПолучитьОбъект(); - НаборОбъект.Используется = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборОбъект); + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + Блокировка.Заблокировать(); + + НаборОбъект = Выборка.Ссылка.ПолучитьОбъект(); + НаборОбъект.Используется = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборОбъект); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl index d77400631..3692abc5d 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl @@ -373,9 +373,10 @@ // // Параметры: // ПараметрыОбработкиОшибки - см. ПараметрыОбработкиОшибкиОтправки -// ПараметрыПисьма - Структура - параметры отправляемого письма. +// ОшибочныеПолучатели - Массив +// // Возвращаемое значение: -// Результат - Структура: +// Структура: // * ТекстСообщения - Строка - текст сообщения об ошибке // * ПисьмоОтправлено - Булево - признак того, что письмо было отправлено // @@ -2899,7 +2900,6 @@ Функция ИмяПредопределеннойПапкиПоТипу(ТипПредопределеннойПапки) - ИмяПредопределеннойПапки = ""; Если ТипПредопределеннойПапки = Перечисления.ТипыПредопределенныхПапокПисем.Входящие Тогда @@ -2920,6 +2920,7 @@ КонецФункции +// АПК:1391-выкл Для обработчика обновления по заполнению реквизита ТипПредопределеннойПапки. Функция ТипПредопределеннойПапкиПоИмени(ИмяПредопределеннойПапки) Экспорт ТипПредопределеннойПапки = Перечисления.ТипыПредопределенныхПапокПисем.ПустаяСсылка(); @@ -2941,6 +2942,7 @@ Возврат ТипПредопределеннойПапки; КонецФункции +// АПК:1391-вкл // Возвращает важность Интернет почтового сообщения в зависимости от переданного значения // перечисления ВариантыВажностиВзаимодействия. diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl index b385f3b39..70348ccf4 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтойКлиент/Module.bsl @@ -47,9 +47,10 @@ // Возвращает массив, содержащий структуры с информацией о контактах взаимодействия // или участниках предмета взаимодействия. +// // Параметры: -// ТаблицаКонтактов - Документ.ТабличнаяЧасть - содержащая описания и ссылки на контакты взаимодействия -// или участников предмета взаимодействия. +// ТаблицаКонтактов - ДанныеФормыКоллекция - содержащая описания и ссылки на контакты взаимодействия +// или участников предмета взаимодействия. // Функция ТаблицуКонтактовВМассив(ТаблицаКонтактов) Экспорт @@ -66,8 +67,9 @@ КонецФункции // Выполнить получение почты по всем доступным учетным записям. +// // Параметры: -// ЭлементСписок - ЭлементФормы - элемент формы, который необходимо обновить, после получения писем. +// ЭлементСписок - ПолеФормы - элемент формы, который необходимо обновить, после получения писем. // Процедура ОтправитьЗагрузитьПочтуПользователя(УникальныйИдентификатор, Форма, ЭлементСписок = Неопределено, ВыводитьПрогресс = Истина) Экспорт diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl index 1d8aaa0be..93d416a47 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl @@ -620,7 +620,6 @@ // // Параметры: // ДанныеЗаписи - Массив из см. УстановитьНовоеСостояниеОригиналаМассив.ДанныеЗаписи. -// - см. УстановитьНовоеСостояниеОригиналаМассивСтруктура.ДанныеЗаписи. // ИмяСостояния - Строка - устанавливаемое состояние. // Изменено - Булево - Истина, если состояние оригинала документа не повторяется и было записано. // @@ -671,7 +670,7 @@ Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда Изменено = Истина; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, - ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне); + ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне,ПрошлаяЗапись.Сотрудник); КонецЕсли; КонецЦикла; КонецЕсли; @@ -684,20 +683,41 @@ Если ПроверкаЗаписьСостоянияОригинала.Количество()> 0 Тогда ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(Запись.ПервичныйДокумент); ПроверкаЗаписьСостоянияОригинала.Прочитать(); - Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл - Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, - Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне); - Если СостояниеПечатныхФормОдинаково(Запись.Ссылка,ИмяСостояния) Тогда + ТЧ = ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Ссылка); + Если ТЧ <> "" Тогда + Для Каждого Сотрудник Из Запись.Ссылка[ТЧ] Цикл + Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл + Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, + Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне,Сотрудник.Сотрудник); + Если СостояниеПечатныхФормОдинаково(Запись.Ссылка,ИмяСостояния) Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); + Иначе + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + Иначе + Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл + Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); - Иначе - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе); - КонецЕсли; - КонецЕсли; - КонецЦикла; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, + Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне); + Если СостояниеПечатныхФормОдинаково(Запись.Ссылка,ИмяСостояния) Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); + Иначе + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Иначе Изменено = Истина; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); @@ -723,23 +743,28 @@ ПроверкаЗаписьСостоянияОригинала.Отбор.Владелец.Установить(ДанныеЗаписи.Ссылка); ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Истина); ПроверкаЗаписьСостоянияОригинала.Прочитать(); - Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда - Если СокрЛП(ПроверкаЗаписьСостоянияОригинала[0].Состояние) <> ИмяСостояния Тогда - - ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Ложь); - ПроверкаЗаписьСостоянияОригинала.Прочитать(); - - Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда + Если ПроверкаЗаписьСостоянияОригинала.Количество()> 0 Тогда + ТЧ = ТабличнаяЧастьМногосотрудниковаДокумента(ДанныеЗаписи.Ссылка); + Если ТЧ <> "" Тогда + Для Каждого Сотрудник Из ДанныеЗаписи.Ссылка[ТЧ] Цикл Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда Изменено = Истина; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(ДанныеЗаписи.Ссылка, - ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне); + ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне,Сотрудник.Сотрудник); КонецЕсли; КонецЦикла; - КонецЕсли; - + КонецЦикла; + Иначе + Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл + Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(ДанныеЗаписи.Ссылка, + ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне); + КонецЕсли; + КонецЦикла; КонецЕсли; + КонецЕсли; Изменено = Истина; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(ДанныеЗаписи.Ссылка,ИмяСостояния); @@ -755,18 +780,15 @@ СписокВыбораСостоянийОригинала = Форма.СписокВыбораСостоянийОригинала; СписокВыбораСостоянийОригинала.Очистить(); - ПредставлениеСостояния = Новый Структура; Для каждого Состояние Из СостоянияОригиналов Цикл - ПредставлениеСостояния.Вставить("Состояние",Состояние.Наименование); - Представление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(НСтр("ru='[Состояние]'"), ПредставлениеСостояния); Если Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен Тогда - СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Представление,,БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен); + СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Состояние.Наименование,,БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен); ИначеЕсли Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана Тогда - СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Представление,,БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналНеПолучен); + СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Состояние.Наименование,,БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналНеПолучен); Иначе - СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Представление); + СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Состояние.Наименование); КонецЕсли; КонецЦикла; @@ -817,21 +839,23 @@ Запрос = Новый Запрос; Запрос.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ - | СостоянияОригиналовПервичныхДокументов.Владелец КАК Владелец, - | СостоянияОригиналовПервичныхДокументов.ПервичныйДокумент КАК ПервичныйДокумент, - | СостоянияОригиналовПервичныхДокументов.ОбщееСостояние КАК ОбщееСостояние, - | СостоянияОригиналовПервичныхДокументов.ФормаИзвне КАК ФормаИзвне - |ИЗ - | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов - |ГДЕ - | СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка - | И СостоянияОригиналовПервичныхДокументов.ОбщееСостояние" ; + | СостоянияОригиналовПервичныхДокументов.Владелец КАК Владелец, + | СостоянияОригиналовПервичныхДокументов.ПервичныйДокумент КАК ПервичныйДокумент, + | СостоянияОригиналовПервичныхДокументов.ОбщееСостояние КАК ОбщееСостояние, + | СостоянияОригиналовПервичныхДокументов.ФормаИзвне КАК ФормаИзвне, + | СостоянияОригиналовПервичныхДокументов.Сотрудник КАК Сотрудник + |ИЗ + | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов + |ГДЕ + | СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка + | И СостоянияОригиналовПервичныхДокументов.ОбщееСостояние" ; + Запрос.УстановитьПараметр("Ссылка",ДокументСсылка); Выборка = Запрос.Выполнить().Выгрузить(); Для Каждого Ключ Из Выборка Цикл - ПередаваемыеПараметры = Новый Структура("Владелец, ПервичныйДокумент, ОбщееСостояние, ФормаИзвне"); + ПередаваемыеПараметры = Новый Структура("Владелец, ПервичныйДокумент, ОбщееСостояние, ФормаИзвне, Сотрудник"); ЗаполнитьЗначенияСвойств(ПередаваемыеПараметры,Ключ); ПараметрыМассив = Новый Массив; @@ -868,6 +892,30 @@ КонецФункции +// Проверяет является ли документ по ссылке многосотрудниковым документом и возвращает наименование табличной части, в +// которой хранятся сотрудники. +// +// Параметры: +// ДокументСсылка - ДокументСсылка - ссылка на документ, который необходимо проверить. +// +// Возвращаемое значение: +// Строка - наименование табличной части документа, в которой хранятся сотрудники. Пустая, если это не +// многосотрудниковый документ. +// +Функция ТабличнаяЧастьМногосотрудниковаДокумента(ДокументСсылка) Экспорт + + СписокОбъектов = Новый Соответствие(); + ТЧ=""; + УчетОригиналовПервичныхДокументовПереопределяемый.ПриОпределенииМногосотрудниковыхДокументов(СписокОбъектов); + ТипДокумента = ОбщегоНазначения.ИмяТаблицыПоСсылке(ДокументСсылка); + Если СписокОбъектов[ТипДокумента] <> Неопределено Тогда + ТЧ = СписокОбъектов[ТипДокумента]; + КонецЕсли; + + Возврат ТЧ; + +КонецФункции + // Возвращает массив с описанием типов подключенных к подсистеме объектов. // // Возвращаемое значение: @@ -1124,22 +1172,22 @@ СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка); - СостояниеОригинала.Наименование = НСтр("ru='Форма напечатана'"); - СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что печатная форма только печаталась.'"); + СостояниеОригинала.Наименование = НСтр("ru='Форма напечатана'", ОбщегоНазначения.КодОсновногоЯзыка()); + СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что печатная форма только печаталась.'", ОбщегоНазначения.КодОсновногоЯзыка()); СостояниеОригинала.РеквизитДопУпорядочивания = 1; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала); СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка); - СостояниеОригинала.Наименование = НСтр("ru='Оригиналы не все'"); - СостояниеОригинала.Описание = НСтр("ru='Общее состояние для документа, у которого оригиналы печатных форм находятся в разных состояниях.'"); + СостояниеОригинала.Наименование = НСтр("ru='Оригиналы не все'", ОбщегоНазначения.КодОсновногоЯзыка()); + СостояниеОригинала.Описание = НСтр("ru='Общее состояние для документа, у которого оригиналы печатных форм находятся в разных состояниях.'", ОбщегоНазначения.КодОсновногоЯзыка()); СостояниеОригинала.РеквизитДопУпорядочивания = 99998; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала); СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка); - СостояниеОригинала.Наименование = НСтр("ru='Оригинал получен'"); - СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что подписанный оригинал печатной формы есть в наличии.'"); + СостояниеОригинала.Наименование = НСтр("ru='Оригинал получен'", ОбщегоНазначения.КодОсновногоЯзыка()); + СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что подписанный оригинал печатной формы есть в наличии.'", ОбщегоНазначения.КодОсновногоЯзыка()); СостояниеОригинала.РеквизитДопУпорядочивания = 99999; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала); @@ -1160,4 +1208,63 @@ КонецФункции +// Переопределяет списки значений объектов печати и их макетов +// +// Параметры: +// ОбъектыПечати - СписокЗначений - список ссылок на объекты печати. +// СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм. +// +Процедура ПриОпределенииСпискаПечатныхФорм(ОбъектыПечати, СписокПечати) Экспорт + + ТаблицаУчетаОригиналов = ТаблицаУчетаОригиналов(); + Если ТаблицаУчетаОригиналов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ИменаМакетов = Новый Массив; + Для Каждого Макет Из СписокПечати Цикл + ИменаМакетов.Добавить(Макет.Значение); + КонецЦикла; + + МетаданныеСоответствие = Новый Соответствие(); + Для Каждого ОбъектПечати Из ОбъектыПечати Цикл + МетаданныеСоответствие.Вставить(ОбъектПечати.Значение.Метаданные()); + КонецЦикла; + ОбъектыМетаданных = ОбщегоНазначения.ВыгрузитьКолонку(МетаданныеСоответствие, "Ключ"); + + МакетыУдалить = Новый Массив; + Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл + НайденныеСтроки = ТаблицаУчетаОригиналов.НайтиСтроки(Новый Структура("ОбъектМетаданных", ОбъектМетаданных)); + Если НайденныеСтроки.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + МакетыОставить = ОбщегоНазначения.ВыгрузитьКолонку(НайденныеСтроки, "Идентификатор"); + Для Каждого Макет Из ИменаМакетов Цикл + Если МакетыОставить.Найти(Макет) = Неопределено Тогда + МакетыУдалить.Добавить(Макет); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Для Каждого Макет Из МакетыУдалить Цикл + НайденныйМакет = СписокПечати.НайтиПоЗначению(Макет); + Если НайденныйМакет <> Неопределено Тогда + СписокПечати.Удалить(НайденныйМакет); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ТаблицаУчетаОригиналов() + + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("ОбъектМетаданных", Новый ОписаниеТипов("ОбъектМетаданных")); + Таблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); + + УчетОригиналовПервичныхДокументовПереопределяемый.ЗаполнитьТаблицуУчетаОригиналов(Таблица); + + Возврат Таблица; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl index d064f7be4..1ad126a85 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl @@ -13,11 +13,16 @@ // Параметры: // ОбъектыПечати - СписокЗначений - список ссылок на объекты печати. // СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм. +// Записано - Булево - признак того, что состояние документа записано в регистр. // -Процедура ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати) Экспорт +Процедура ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати, Записано = Ложь) Экспорт Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетОригиналовПервичныхДокументов") И Не Пользователи.ЭтоСеансВнешнегоПользователя() Тогда - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостоянияОригиналовДокументаПослеПечатиФормы(ОбъектыПечати, СписокПечати); + УчетОригиналовПервичныхДокументов.ПриОпределенииСпискаПечатныхФорм(ОбъектыПечати, СписокПечати); + Если СписокПечати.Количество() = 0 Тогда + Возврат; + КонецЕсли; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостоянияОригиналовДокументаПослеПечатиФормы(ОбъектыПечати, СписокПечати, Записано); КонецЕсли; КонецПроцедуры @@ -68,7 +73,7 @@ // Структура - основные сведения о общем состоянии оригинала: // * Ссылка - ДокументСсылка - ссылка на документ; // * СостояниеОригиналаПервичногоДокумента - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - текущее -// состояние оригинала документа; +// состояние оригинала документа. // Функция СведенияОСостоянииОригиналаПоСсылке(ДокументСсылка) Экспорт @@ -77,8 +82,10 @@ КонецФункции // Заполняет выпадающий список выбора состояний на форме. -// -// СписокВыбораСостоянийОригинала - СписокЗначений - состояния оригинала, разрешенные пользователям, и используемые при смене состояния оригинала. +// +// Параметры: +// СписокВыбораСостоянийОригинала - СписокЗначений - состояния оригинала, разрешенные пользователям, и используемые при +// смене состояния оригинала. // Процедура ЗаполнитьСписокВыбораСостоянийОригинала(СписокВыбораСостоянийОригинала) Экспорт diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl index b715bc5d8..a69c9292f 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl @@ -323,11 +323,15 @@ // Параметры: // ОбъектыПечати - СписокЗначений - список ссылок на объекты печати. // СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм. +// Записано - Булево - признак того, что состояние документа записано в регистр. // -Процедура ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати) Экспорт +Процедура ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати, Записано = Ложь) Экспорт - УчетОригиналовПервичныхДокументовВызовСервера.ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати,СписокПечати); - + УчетОригиналовПервичныхДокументовВызовСервера.ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати, Записано); + Если СписокПечати.Количество() = 0 Или Записано = Ложь Тогда + Возврат; + КонецЕсли; + Оповестить("ИзменениеСостоянияОригиналаПервичногоДокумента"); Если ОбъектыПечати.Количество() > 1 Тогда diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl index b076b2f29..1a2806fa7 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl @@ -17,6 +17,40 @@ +КонецПроцедуры + +// Определяет многосотрудниковые объекты конфигурации, для которых отслеживание состояний будет в разрезе сотрудников +// +// Параметры: +// СписокОбъектов - Соответствие из КлючИЗначение: +// * Ключ - ОбъектМетаданных. +// * Значение - Строка - наименование табличной части, в которой хранятся сотрудники. +// +Процедура ПриОпределенииМногосотрудниковыхДокументов(СписокОбъектов) Экспорт + + + +КонецПроцедуры + +// Заполняет таблицу значений учета оригиналов +// Если тело процедуры оставить пустым - состояния будут отслеживаться по всем печатным формам подключенных объектов. +// Если в таблицу значений добавить объекты, подключенные к подсистеме учета оригиналов, и их печатные формы, +// то состояния будут отслеживаться только по ним. +// +// Параметры: +// ТаблицаУчетаОригиналов - ТаблицаЗначений - коллекция объектов и макетов по которым требуется вести учет оригиналов: +// * ОбъектМетаданных - ОбъектМетаданных. +// * Идентификатор - Строка - идентификатор макета. +// +// Пример: +// НоваяСтрока = ТаблицаУчетаОригиналов.Добавить(); +// НоваяСтрока.ОбъектМетаданных = Метаданные.Документы._ДемоРеализацияТоваров; +// НоваяСтрока.Идентификатор = "РасходнаяНакладная"; +// +Процедура ЗаполнитьТаблицуУчетаОригиналов(ТаблицаУчетаОригиналов) Экспорт + + + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ФайловаяСистема/Module.bsl b/SSL/src/CommonModules/ФайловаяСистема/Module.bsl index c9a161b0b..764c3636a 100644 --- a/SSL/src/CommonModules/ФайловаяСистема/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистема/Module.bsl @@ -192,7 +192,7 @@ // АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией - СтрокаКоманды = ОбщегоНазначенияСлужебныйКлиентСервер.БезопаснаяСтрокаКоманды(КомандаЗапуска); + СтрокаКоманды = ОбщегоНазначенияСлужебный.БезопаснаяСтрокаКоманды(КомандаЗапуска); Если ПараметрыЗапускаПрограммы = Неопределено Тогда ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы(); diff --git a/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl b/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl index c1e39553a..0ce88f9e2 100644 --- a/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl @@ -434,9 +434,9 @@ // Параметры: // НавигационнаяСсылка - Строка - ссылка, которую требуется открыть. // Оповещение - ОписаниеОповещения - оповещение о результате открытия. -// если оповещение не задано, в случае ошибки будет показано предупреждение. -// - ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии. -// - ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. +// Если оповещение не задано, в случае ошибки будет показано предупреждение. +// ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии. +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. // // Пример: // ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("e1cib/navigationpoint/startpage"); // начальная страница. @@ -514,7 +514,7 @@ // * ТекущийКаталог - Строка - задает текущий каталог запускаемого приложения. // * Оповещение - ОписаниеОповещения - оповещение о результате завершения запущенного приложения, // если оповещение не задано в случае ошибки будет показано предупреждение. Параметры обработчика завершения: -// - Результат - Структура - результат работы программы: +// Результат - Структура - результат работы программы: // -- ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии. // -- ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. // -- КодВозврата - Число - код возврата программы. @@ -522,7 +522,7 @@ // В веб-клиенте всегда принимает значение "". // -- ПотокОшибок - Строка - ошибки исполнения программы, направленные в поток stderr. // В веб-клиенте всегда принимает значение "". -// - ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения. +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения: // * ДождатьсяЗавершения - Булево - Истина, дожидаться завершения запущенного приложения перед продолжением работы. // * ПолучитьПотокВывода - Булево - Ложь - результат, направленный в поток stdout, // если не указан ДождатьсяЗавершения - игнорируется. @@ -536,9 +536,9 @@ // В MacOS игнорируется. // * ВыполнитьСНаивысшимиПравами - Булево - Истина, если требуется запустить программу на исполнение // с повышением привилегий системы: -// - Windows: запрос UAC; -// - Linux: исполнение с командой pkexec; -// - macOS, веб-клиент и мобильный клиент: будет возвращен Результат.ОписаниеОшибки. +// Windows: запрос UAC; +// Linux: исполнение с командой pkexec; +// macOS, веб-клиент и мобильный клиент: будет возвращен Результат.ОписаниеОшибки. // Функция ПараметрыЗапускаПрограммы() Экспорт @@ -648,9 +648,9 @@ // Параметры: // ОбработчикЗавершения - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана после // закрытия диалога выбора со следующими параметрами: -// - ПутьККаталогу - Строка - полный путь к каталогу. Если не установлено расширение для работы с 1С:Предприятием +// -- ПутьККаталогу - Строка - полный путь к каталогу. Если не установлено расширение для работы с 1С:Предприятием // или пользователь отказался от выбора, возвращает пустую строку. -// - ДополнительныеПараметры - значение, которое было указано при создании объекта ОписаниеОповещения. +// -- ДополнительныеПараметры - значение, которое было указано при создании объекта ОписаниеОповещения. // Заголовок - Строка - заголовок диалога выбора каталога. // Каталог - Строка - начальное значение каталога, предлагаемое по умолчанию. // @@ -696,8 +696,8 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате получения со следующими параметрами. -// - ИмяКаталога - Строка - путь к созданному каталогу. -// - ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// -- ИмяКаталога - Строка - путь к созданному каталогу. +// -- ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. // Расширение - Строка - суффикс в имени каталога, который поможет идентифицировать каталог при анализе. // Процедура СоздатьВременныйКаталог(Знач Оповещение, Расширение = "") Экспорт @@ -719,8 +719,8 @@ // Параметры: // ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, которая будет вызвана после закрытия // формы со следующими параметрами: -// - РасширениеПодключено - Булево - Истина, если расширение было подключено. -// - ДополнительныеПараметры - Произвольный - параметры, заданные в ОписаниеОповещенияОЗакрытии. +// -- РасширениеПодключено - Булево - Истина, если расширение было подключено. +// -- ДополнительныеПараметры - Произвольный - параметры, заданные в ОписаниеОповещенияОЗакрытии. // ТекстПредложения - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию. // ВозможноПродолжениеБезУстановки - Булево - если Истина, будет показана кнопка ПродолжитьБезУстановки, // если Ложь, будет показана кнопка Отмена. diff --git a/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl index cd25e6138..8d72deec1 100644 --- a/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиент/Module.bsl @@ -1057,8 +1057,10 @@ Возврат; КонецЕсли; - // В веб клиенте под macOS расширение не доступно. - Если ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() Тогда + // В веб клиенте под macOS расширение доступно только в браузере Chrome + // при версии платформы больше 8.3.16. + Если ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() + И НЕ ДоступноРасширениеРаботыСФайлами() Тогда ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияЗавершение); Возврат; КонецЕсли; @@ -1120,6 +1122,14 @@ КонецФункции +Функция ДоступноРасширениеРаботыСФайлами() + + СистемнаяИнформация = Новый СистемнаяИнформация; + Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения,"8.3.16.0") + И СтрНайти(СистемнаяИнформация.ИнформацияПрограммыПросмотра, "Chrome") > 0; + +КонецФункции + #КонецОбласти #Область ВременныеФайлы diff --git a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl index 63aef7f9d..cbed0ddd3 100644 --- a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl @@ -70,7 +70,7 @@ // Параметры - Структура - необходимые параметры, значения которых необходимо получить. // Функция УстановитьПараметрыЦентраМониторингаВнешнийВызов(НовыеПараметры) Экспорт - УстановитьПараметрыЦентраМониторинга(НовыеПараметры); + Возврат УстановитьПараметрыЦентраМониторинга(НовыеПараметры); КонецФункции Функция ЗапускОтправкиОзнакомительногоПакета() Экспорт @@ -85,12 +85,12 @@ // Обработчики событий подсистем конфигурации. // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СборИОтправкаСтатистики; Зависимость.РаботаетСВнешнимиРесурсами = Истина; - Зависимость = Зависимости.Добавить(); + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СборИОтправкаОтчетовОбОшибках; Зависимость.РаботаетСВнешнимиРесурсами = Истина; КонецПроцедуры @@ -1383,7 +1383,7 @@ Результат.Заголовки.Вставить(Параметр.Ключ, Параметр.Значение); КонецЦикла; - HTTPЗаголовки = ЗаголовкиВНижнийРегистр(Ответ.Заголовки); + HTTPЗаголовки = HTTPЗаголовкиВНижнийРегистр(Ответ.Заголовки); Если HTTPЗаголовки["content-type"] <> Неопределено Тогда ТипСодержимого = HTTPЗаголовки["content-type"]; Если СтрНайти(ТипСодержимого, "text/plain") > 0 Тогда @@ -1404,10 +1404,10 @@ Возврат Результат; КонецФункции -Функция ЗаголовкиВНижнийРегистр(Заголовки) +Функция HTTPЗаголовкиВНижнийРегистр(Заголовки) Результат = Новый Соответствие; - Для каждого Заголовок из Заголовки Цикл + Для каждого Заголовок Из Заголовки Цикл Результат.Вставить(НРег(Заголовок.Ключ), Заголовок.Значение); КонецЦикла; Возврат Результат; @@ -1653,12 +1653,6 @@ НомерПакетаДляОтправки = Формат(Пакет.НомерПакета, "ЧН=0; ЧГ=0"); Идентификатор = Строка(Параметры.ИдентификаторИнформационнойБазы); - Если Параметры.ЗащищенноеСоединение Тогда - ТипСоединения = "https"; - Иначе - ТипСоединения = "http"; - КонецЕсли; - АдресРесурса = Параметры.АдресРесурса; Если Прав(АдресРесурса, 1) <> "/" Тогда АдресРесурса = АдресРесурса + "/"; @@ -2311,7 +2305,7 @@ Возврат КаталогДампов; КонецФункции -Функция СоздатьСекциюСбораДампов(Файл, ЧтениеXML, КаталогДампов, ТипДампа) +Процедура СоздатьСекциюСбораДампов(Файл, ЧтениеXML, КаталогДампов, ТипДампа) Идентификатор = "80af5716-b134-4b1c-a38d-4658d1ac4196"; @@ -2362,18 +2356,19 @@ КаталогДампов.Путь = Неопределено; КаталогДампов.ОписаниеОшибки = НСтр("ru = 'Ошибка записи файла настроек технологического журнала. Регистрация дампов не возможна.'"); - Возврат КаталогДампов; КонецПопытки; КонецЕсли; КонецЕсли; -КонецФункции +КонецПроцедуры // Генерирует путь к каталогу дампов. // Каталог дампов очищается автоматически методом РегистрацияДампов. +// // Параметры: // ПутьКаталога - Строка - путь к каталогу, в котором хранится файл настроек технологического журнала. +// // Возвращаемое значение: -// КаталогДампов - Строка - путь к каталогу, в котором будут храниться минидампы. +// Строка // Функция СоздатьФайлНастроекСбораДампов(ПутьКаталога, ТипДампа) ИмяФайлаНастроек = "logcfg.xml"; @@ -2776,8 +2771,8 @@ Функция РазделениеПоОбластямДанныхВключено() Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда - ОбщийМодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - РазделениеПоОбластямДанныхВключено = ОбщийМодульРаботаВМоделиСервиса.РазделениеВключено(); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + РазделениеПоОбластямДанныхВключено = МодульРаботаВМоделиСервиса.РазделениеВключено(); Иначе РазделениеПоОбластямДанныхВключено = Ложь; КонецЕсли; diff --git a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl index c3eb449e9..3b292fb9e 100644 --- a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl @@ -73,10 +73,11 @@ // // Параметры: // Реквизиты - ДеревоЗначений - заполняемый список реквизитов. -// Макет - Макет - макет СКД. +// Макет - СхемаКомпоновкиДанных - макет СКД. // Процедура СформироватьСписокРеквизитовПоСКД(Реквизиты, Макет) Экспорт ШаблоныСообщенийСлужебный.РеквизитыПоСКД(Реквизиты, Макет); + КонецПроцедуры // Заполняет список реквизитов шаблона сообщений на основании макета СКД. diff --git a/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl index f6d7f2ddc..8aabd22b8 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийКлиент/Module.bsl @@ -23,8 +23,9 @@ // * Результат - Булево - если Истина, то сообщение было создано. // * ПараметрыСообщения - Структура // - Неопределено - значение, которое было передано в параметре ПараметрыСообщения. -// ВладелецШаблона - ОпределяемыйТип.ВладелецШаблона - владелец шаблонов. Если не указан, то в окне выбора -// шаблона выводятся все доступные шаблоны для указанного предмета ПредметСообщения. +// ВладелецШаблона - ОпределяемыйТип.ВладелецШаблонаСообщения - владелец шаблонов. Если не указан, то в +// окне выбора шаблона выводятся все доступные шаблоны для указанного +// предмета ПредметСообщения. // ПараметрыСообщения - Структура - дополнительная информация для формирования сообщения, // которая передается в свойство ПараметрыСообщения параметра ПараметрыШаблона // процедуры ШаблоныСообщенийПереопределяемый.ПриФормированииСообщения. @@ -46,7 +47,7 @@ // ВидСообщения - Строка - "Письмо" для электронного письма и "СообщениеSMS" для сообщений SMS. // ПредметШаблона - ЛюбаяСсылка // - Строка - ссылка на объект, являющийся предметом, или его полное имя. -// ВладелецШаблона - ОпределяемыйТип.ВладелецШаблона - владелец шаблонов. Если не указан, то в окне выбора шаблона +// ВладелецШаблона - ОпределяемыйТип.ВладелецШаблонаСообщения - владелец шаблонов. Если не указан, то в окне выбора шаблона // выводятся все доступные шаблоны для указанного предмета ПредметСообщения. // Процедура ВыбратьШаблон(Оповещение, ВидСообщения = "Письмо", ПредметШаблона = Неопределено, ВладелецШаблона = Неопределено) Экспорт @@ -149,11 +150,11 @@ // * Результат - Структура - если Истина, то сообщение было создано. // * ПараметрыСообщения - Структура // - Неопределено - значение, которое было передано в параметре ПараметрыСообщения. -// ВладелецШаблона - ОпределяемыйТип.ВладелецШаблона - владелец шаблонов. Если не указан, то в окне выбора -// шаблона выводятся все доступные шаблоны для указанного предмета ПредметСообщения. -// ПараметрыСообщения - Структура - дополнительная информация для формирования сообщения, -// которая передается в свойство ПараметрыСообщения параметра ПараметрыШаблона -// процедуры ШаблоныСообщенийПереопределяемый.ПриФормированииСообщения. +// ВладелецШаблона - ОпределяемыйТип.ВладелецШаблонаСообщения - владелец шаблонов. Если не указан, то в окне выбора +// шаблона выводятся все доступные шаблоны для указанного предмета ПредметСообщения. +// ПараметрыСообщения - Структура - дополнительная информация для формирования сообщения, +// которая передается в свойство ПараметрыСообщения параметра ПараметрыШаблона +// процедуры ШаблоныСообщенийПереопределяемый.ПриФормированииСообщения. // Процедура ПодготовитьСообщениеПоШаблону(ПредметСообщения, ВидСообщения, ОписаниеОповещенияОЗакрытии = Неопределено, ВладелецШаблона = Неопределено, ПараметрыСообщения = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl index 4b6de90c6..8dce847a5 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl @@ -315,6 +315,7 @@ Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; Обработчик.Комментарий = НСтр("ru = 'Обновление шаблонов сообщений. |До завершения обработки формирование писем и сообщений SMS на основании шаблонов будет недоступно.'"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); @@ -322,6 +323,17 @@ Приоритет.Порядок = "После"; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + + Если Обработчик.ПриоритетыВыполнения = Неопределено Тогда + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + КонецЕсли; + + Приоритет = Обработчик.ПриоритетыВыполнения.Добавить(); + Приоритет.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Приоритет.Порядок = "До"; + КонецЕсли; + КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. @@ -2291,6 +2303,10 @@ ЗначенияСвойств = ЗначенияРеквизитовСвойств(Предмет); КонтактнаяИнформацияОбъектов = ЗначенияРеквизитовКонтактнойИнформации(Предмет); + Если ТипЗнч(ПараметрыТекстаСообщения) <> Тип("Соответствие") Тогда + Возврат; + КонецЕсли; + Для каждого ПараметрОснования Из ПараметрыТекстаСообщения Цикл Если СтрНачинаетсяС(ПараметрОснования.Ключ, "~Свойство") Тогда @@ -2751,7 +2767,7 @@ ПараметрыПисьма.Вставить("УдалятьФайлыПослеОтправки", Ложь); Если Сообщение.Получатель = Неопределено ИЛИ Сообщение.Получатель.Количество() = 0 Тогда - ПараметрыПисьма.Вставить("Получатель", ""); + ПараметрыПисьма.Вставить("Получатель", Неопределено); Иначе ПараметрыПисьма.Вставить("Получатель", Сообщение.Получатель); КонецЕсли; diff --git a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl index 1b6e1033a..e8aea83a7 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl @@ -56,8 +56,8 @@ // Получает подписи объекта и возвращает их. // // Параметры: -// Объект - ЛюбаяСсылка - ссылка на подписанный объект. -// Объект должен иметь реквизит ПодписанЭП. +// Объект - ОпределяемыйТип.ПодписанныйОбъект - ссылка на подписанный объект. +// Объект должен иметь реквизит ПодписанЭП. // // Возвращаемое значение: // Массив - массив описанных ниже структур. @@ -141,9 +141,10 @@ // Устанавливает реквизиту ПодписанЭП значение Истина. // // Параметры: -// Объект - ЛюбаяСсылка - по ссылке будет получен объект, заблокирован, изменен, записан. -// Объект должен иметь реквизит ПодписанЭП. -// - Объект - объект будет изменен без блокировки и без записи. +// Объект - ОпределяемыйТип.ПодписанныйОбъект - по ссылке будет получен объект, +// заблокирован, изменен, записан. Объект должен иметь реквизит ПодписанЭП. +// Либо передать сразу объект указанного выше типа, тогда он +// будет изменен без блокировки и без записи. // // СвойстваПодписи - Массив - массив описанных ниже структур или адресов структур. // - Строка - адрес временного хранилища, содержащий описанную ниже структуру. @@ -179,7 +180,7 @@ // для блокировки объекта перед записью с учетом того, что подписание // выполняется на клиенте и за время подписания объект мог быть изменен. // -// ЗаписанныйОбъект - Объект - объект, который был получен и записан, если передавалась ссылка. +// ЗаписанныйОбъект - Произвольный - объект, который был получен и записан, если передавалась ссылка. // Процедура ДобавитьПодпись(Объект, Знач СвойстваПодписи, ИдентификаторФормы = Неопределено, ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт @@ -268,7 +269,8 @@ // Обновляет подпись объекта. // // Параметры: -// Объект - ЛюбаяСсылка - ссылка на подписанный объект, для которого требуется обновить подпись. +// Объект - ОпределяемыйТип.ПодписанныйОбъект - ссылка на подписанный объект, +// для которого требуется обновить подпись. // // СвойстваПодписи - Строка - адрес временного хранилища, содержащий описанную ниже структуру. // - Структура - развернутое описание подписи: @@ -336,13 +338,10 @@ // Удаляет подпись объекта и записывает его. // // Параметры: -// Объект - ЛюбаяСсылка - по ссылке будет получен объект, заблокирован, изменен, записан. -// Объект должен иметь реквизит ПодписанЭП. -// - СправочникОбъект - объект будет изменен без блокировки и без записи. -// - ДокументОбъект -// - ПланВидовХарактеристикОбъект -// - ПланСчетовОбъект -// - ПланВидовРасчетаОбъект +// Объект - ОпределяемыйТип.ПодписанныйОбъект - по ссылке будет получен объект, +// заблокирован, изменен, записан. Объект должен иметь реквизит ПодписанЭП. +// Либо передать сразу объект указанного выше типа, тогда он +// будет изменен без блокировки и без записи. // // ПорядковыйНомер - Число - порядковый номер подписи. // - Массив - значения указанного выше типа. @@ -354,7 +353,7 @@ // для блокировки объекта перед записью, с учетом того, что подписание // выполняется на клиенте и за время подписания объект мог быть изменен. // -// ЗаписанныйОбъект - Объект - объект, который был получен и записан, если передавалась ссылка. +// ЗаписанныйОбъект - Произвольный - объект, который был получен и записан, если передавалась ссылка. // Процедура УдалитьПодпись(Объект, ПорядковыйНомер, ИдентификаторФормы = Неопределено, ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт @@ -425,7 +424,7 @@ // Получает массив сертификатов шифрования. // Параметры: -// Объект - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы", "ВерсииФайлов" или "Файлы". +// Объект - ОпределяемыйТип.ПодписанныйОбъект - ссылка на зашифрованный объект. // // Возвращаемое значение: // Массив - массив структур. @@ -479,9 +478,10 @@ // Устанавливает реквизит Зашифрован по наличию сертификатов в регистре сведений СертификатаШифрования. // // Параметры: -// Объект - ЛюбаяСсылка - по ссылке будет получен объект, заблокирован, изменен, записан. -// Объект должен иметь реквизит Зашифрован. -// - Объект - объект будет изменен без блокировки и без записи. +// Объект - ОпределяемыйТип.ПодписанныйОбъект - по ссылке будет получен объект, +// заблокирован, изменен, записан. Объект должен иметь реквизит Зашифрован. +// Либо передать сразу объект указанного выше типа, тогда он +// будет изменен без блокировки и без записи. // // СертификатыШифрования - Строка - адрес временного хранилища, содержащий описанный ниже массив. // - Массив - массив описанных ниже структур: @@ -498,7 +498,7 @@ // для блокировки объекта перед записью, с учетом того, что подписание // выполняется на клиенте и за время подписания объект мог быть изменен. // -// ЗаписанныйОбъект - Объект - объект, который был получен и записан, если передавалась ссылка. +// ЗаписанныйОбъект - Произвольный - объект, который был получен и записан, если передавалась ссылка. // Процедура ЗаписатьСертификатыШифрования(Объект, Знач СертификатыШифрования, ИдентификаторФормы = Неопределено, ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт @@ -643,11 +643,11 @@ // - Структура - с произвольным составом из следующих свойств: // * Наименование - Строка - представление сертификата в списке. // -// * Пользователь - СправочникСсылка.Пользователь - пользователь, которому принадлежит сертификат. +// * Пользователь - СправочникСсылка.Пользователи - пользователь, которому принадлежит сертификат. // Значение используется при получении списка личных сертификатов пользователя // в формах подписания и шифрования данных. // -// * Организация - СправочникСсылка.Организация - организация, к которой относится сертификат. +// * Организация - ОпределяемыйТип.Организация - организация, к которой относится сертификат. // // * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа, которая // требуется для подписания и расшифровки. @@ -816,9 +816,9 @@ // В данном случае переданные штампы будут выведены в конец документа, // если в макете подписываемого табличного документа не определены области // для размещения штампов, которые удовлетворяют следующим условиям: -// - область вывода штампа размером две колонки и семь строк, с +// а) область вывода штампа размером две колонки и семь строк, с // произвольной шириной колонок; -// - имя области задано как ШтампЭП + порядковый номер штампа, +// б) имя области задано как ШтампЭП + порядковый номер штампа, // например: ШтампЭП1 и т.д. // В таком случае штампы будут выведены в заданные области в том // порядке, в котором документ был подписан. @@ -1007,9 +1007,14 @@ // - Строка - полное имя файла, содержащего двоичные данные, // которые были подписаны. // - Структура: -// * ПараметрыXMLDSig - Структура - как возвращает функция ПараметрыXMLDSig общего -// модуля ЭлектроннаяПодпись. -// * КонвертSOAP - Строка - шаблон сообщения . +// * ПараметрыXMLDSig - Структура - как возвращает функция ПараметрыXMLDSig +// общего модуля ЭлектроннаяПодпись. +// * КонвертSOAP - Строка - шаблон сообщения . +// - Структура: +// * ПараметрыCMS - Структура - как возвращает функция ПараметрыCMS +// общего модуля ЭлектроннаяПодпись. +// * Данные - Строка - произвольная строка для подписания, +// - ДвоичныеДанные - двоичные данные для подписания. // // Подпись - ДвоичныеДанные - двоичные данные электронной подписи. // - Строка - адрес временного хранилища, содержащего двоичные данные. @@ -1027,7 +1032,7 @@ // // Возвращаемое значение: // Булево - Истина, если проверка выполнена успешно. -// - Ложь, если не удалось получить менеджер криптографии (когда не указан), +// Ложь, если не удалось получить менеджер криптографии (когда не указан), // или произошла ошибка указанная в параметре ОписаниеОшибки. // Функция ПроверитьПодпись(МенеджерКриптографии, ИсходныеДанные, Подпись, ОписаниеОшибки = Null, НаДату = Неопределено) Экспорт @@ -1193,7 +1198,7 @@ // // Возвращаемое значение: // Булево - Истина, если проверка выполнена успешно, -// - Ложь, если не удалось получить менеджер криптографии (когда не указан). +// Ложь, если не удалось получить менеджер криптографии (когда не указан). // Функция ПроверитьСертификат(МенеджерКриптографии, Сертификат, ОписаниеОшибки = Null, НаДату = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl index 7cd56f4e6..42daeae08 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl @@ -75,8 +75,8 @@ // пользователем. Отбор блокирует возможность выбора других сертификатов // из личного хранилища. // - Структура: -// Организация - ОпределяемыйТип.Организация - содержит ссылку на организацию, по которой -// будет установлен отбор в списке сертификатов пользователя. +// * Организация - ОпределяемыйТип.Организация - содержит ссылку на организацию, +// по которой будет установлен отбор в списке сертификатов пользователя. // * БезПодтверждения - Булево - (необязательный) - пропустить подтверждение пользователя, если // в свойстве ОтборСертификатов только один сертификат и: // а) либо сертификат выпущен с усиленной защитой закрытого ключа; @@ -88,7 +88,7 @@ // подготовки данных после выбора сертификата, которым будут подписаны данные. // В этом обработчике можно заполнить параметр Данные, если он зависит // от сертификата, который в момент вызова уже вставлен в ОписаниеДанных -// как ВыбранныйСертификат (см. ниже). Следует учесть общий подход (см. выше). +// как ВыбранныйСертификат (смотри ниже). Следует учесть общий подход (смотри выше). // * ВыполнятьНаСервере - Неопределено // - Булево - (необязательный) - когда не указан или Неопределено, // тогда выполнение будет определено автоматически: если есть сервер, то сначала @@ -117,39 +117,36 @@ // ошибка, выполнение прекращается без отображения формы операции или с закрытием этой формы, // если она была открыта. // -// Вариант 1: +// Вариант 1. // * Данные - ДвоичныеДанные - данные для подписания. // - Строка - адрес временного хранилища, содержащего двоичные данные. // - ОписаниеОповещения - обработчик получения данных, который возвращает -// их в свойстве Данные (см. выше общий подход). В момент вызова -// в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (см. ниже). +// их в свойстве Данные (смотри выше общий подход). В момент вызова +// в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (смотри ниже). // - Структура: -// * ПараметрыXMLDSig - Структура - как возвращает функция ПараметрыXMLDSig общего -// модуля ЭлектроннаяПодписьКлиент. +// * ПараметрыXMLDSig - см. ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig // * КонвертSOAP - Строка - шаблон сообщения . // - Структура: -// * ПараметрыCMS - Структура - как возвращает функция ПараметрыCMS общего -// модуля ЭлектроннаяПодписьКлиент. +// * ПараметрыCMS - см. ЭлектроннаяПодписьКлиент.ПараметрыCMS // * Данные - Строка - произвольная строка для подписания, // - ДвоичныеДанные - двоичные данные для подписания. // * Объект - ЛюбаяСсылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. // Если не указан, то подпись не требуется добавлять. // - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в -// регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (см. выше). +// регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (смотри выше). // В момент вызова в ОписаниеДанных уже вставлен параметр СвойстваПодписи. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр СвойстваПодписи. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и // блокировки объекта перед добавлением подписи. -// * Представление - ЛюбаяСсылка +// * Представление - ЛюбаяСсылка - (необязательный), если параметр не указан, +// тогда представление вычисляется по значению свойства Объект. // - Строка -// - Структура - (необязательный), если не указан, тогда -// представление вычисляется по значению свойства Объект. -// Структура содержит свойства: -// * Значение - ЛюбаяСсылка -// - ОписаниеОповещения - для открытия. -// * Представление - Строка - представление значения. -// Вариант 2: +// - Структура: +// ** Значение - ЛюбаяСсылка +// - ОписаниеОповещения - для открытия. +// ** Представление - Строка - представление значения. +// Вариант 2. // * НаборДанных - Массив - структуры со свойствами, описанными в Варианте 1. // * ПредставлениеНабора - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)". // В это представление в параметр %1 заполняется количество элементов. @@ -172,37 +169,37 @@ // ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата, например, если не указан параметр Объект и/или Форма. // В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами: -// * Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение +// # Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение // определяется по наличию свойства СвойстваПодписи. Если есть, то шаг выполнен. -// * Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. -// * ПользовательНажалКнопкуПодписать - Булево - если Истина, то пользователь хотя бы раз +// # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. +// # ПользовательНажалКнопкуПодписать - Булево - если Истина, то пользователь хотя бы раз // нажал на кнопку Подписать. Используется для сценариев, когда для продолжения бизнес-процесса // достаточно простой подписи (намерения установить подпись), а установка квалифицированной подписи // является дополнением, которое можно реализовать позднее, если возникли технические проблемы. -// * ВыбранныйСертификат - Структура - содержит свойства сертификата: -// * Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат. -// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. -// * Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. -// * СвойстваПодписи - Строка - адрес временного хранилища, содержащего описанную ниже структуру. +// # ВыбранныйСертификат - Структура - содержит свойства сертификата: +// ## Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат. +// ## Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// ## Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. +// # СвойстваПодписи = Строка - адрес временного хранилища, содержащего описанную ниже структуру. // При передаче параметра НаборДанных, свойство нужно проверять в нем. -// - Структура - развернутое описание подписи: -// * Подпись - ДвоичныеДанные - результат подписания. -// - Строка - подписанный конверт SOAP, если передавался в данных. -// * УстановившийПодпись - СправочникСсылка.Пользователи - пользователь, который +// = Структура - развернутое описание подписи: +// ## Подпись - ДвоичныеДанные - результат подписания. +// - Строка - подписанный конверт SOAP, если передавался в данных. +// ## УстановившийПодпись - СправочникСсылка.Пользователи - пользователь, который // подписал объект информационной базы. -// * Комментарий - Строка - комментарий, если он был введен при подписании. -// * ИмяФайлаПодписи - Строка - пустая строка, т.к. подпись добавлена не из файла. -// * ДатаПодписи - Дата - дата, когда подпись была сделана. Имеет смысл для случая, +// ## Комментарий - Строка - комментарий, если он был введен при подписании. +// ## ИмяФайлаПодписи - Строка - пустая строка, т.к. подпись добавлена не из файла. +// ## ДатаПодписи - Дата - дата, когда подпись была сделана. Имеет смысл для случая, // когда дату невозможно извлечь из данных подписи. Если не // указана или пустая, тогда используется текущая дата сеанса. -// * ДатаПроверкиПодписи - Дата - дата проверки подписи после подписания. -// * ПодписьВерна - Булево - результат проверки подписи после подписания. +// ## ДатаПроверкиПодписи - Дата - дата проверки подписи после подписания. +// ## ПодписьВерна - Булево - результат проверки подписи после подписания. // // Производные свойства: -// * Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, +// ## Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, // который использовался для подписания (содержится в подписи). -// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. -// * КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. +// ## Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// ## КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. // Процедура Подписать(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено) Экспорт @@ -256,20 +253,20 @@ // ОписаниеДанных - Структура: // * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл. // * ПоказатьКомментарий - Булево - (необязательный) - разрешает ввод комментария в форме -// добавления подписей. Если не указан, значит Ложь. +// добавления подписей. Если не указан, значит Ложь. // * Объект - ЛюбаяСсылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. // - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в -// регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (см. выше). -// В момент вызова в ОписаниеДанных уже вставлен параметр Подписи. +// регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (смотри выше). +// В момент вызова в ОписаниеДанных уже вставлен параметр Подписи. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и -// блокировки объекта перед добавлением подписи. +// блокировки объекта перед добавлением подписи. // * Представление - ЛюбаяСсылка // - Строка - (необязательный), если не указан, тогда -// представление вычисляется по значению свойства Объект. +// представление вычисляется по значению свойства Объект. // * Данные - ДвоичныеДанные - (необязательный) - данные для проверки подписи. // - Строка - (необязательный) - адрес временного хранилища, содержащего двоичные данные. -// - ОписаниеОповещения (необязательный) - обработчик получения данных, который -// возвращает их в свойстве Данные (см. выше общий подход). +// - ОписаниеОповещения - (необязательный) - обработчик получения данных, который +// возвращает их в свойстве Данные (смотри выше общий подход). // // Форма - ФормаКлиентскогоПриложения - форма, из которой нужно получить уникальный идентификатор, // который будет использоваться при блокировке объекта. @@ -280,31 +277,31 @@ // ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата - например, если не указан параметр Объект и/или Форма. // В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами: -// * Успех - Булево - Истина, если все прошло успешно. -// * Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. -// * Подписи - Массив - который содержит элементы: -// * СвойстваПодписи - Строка - адрес временного хранилища, содержащего описанную ниже структуру. -// - Структура - развернутое описание подписи: -// * Подпись - ДвоичныеДанные - результат подписания. -// * УстановившийПодпись - СправочникСсылка.Пользователи - пользователь, который -// подписал объект информационной базы. -// * Комментарий - Строка - комментарий, если он был введен при подписании. -// * ИмяФайлаПодписи - Строка - имя файла, из которого добавлена подпись. -// * ДатаПодписи - Дата - дата, когда подпись была сделана. Имеет смысл для случаев, -// когда дату невозможно извлечь из данных подписи. Если не -// указана или пустая, тогда используется текущая дата сеанса. -// * ДатаПроверкиПодписи - Дата - дата проверки подписи после добавления из файла, если -// не указано свойство Данные в параметре ОписаниеДанных, -// возвращает пустую дату. -// * ПодписьВерна - Булево - результат проверки подписи после добавления из файла, если -// не указано свойство Данные в параметре ОписаниеДанных, -// возвращает Ложь. +// # Успех - Булево - Истина, если все прошло успешно. +// # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. +// # Подписи - Массив - который содержит элементы: +// ## СвойстваПодписи = Строка - адрес временного хранилища, содержащего описанную ниже структуру. +// = Структура - развернутое описание подписи +// ### Подпись - ДвоичныеДанные - результат подписания. +// ### УстановившийПодпись - СправочникСсылка.Пользователи - пользователь, который +// подписал объект информационной базы. +// ### Комментарий - Строка - комментарий, если он был введен при подписании. +// ### ИмяФайлаПодписи - Строка - имя файла, из которого добавлена подпись. +// ### ДатаПодписи - Дата - дата, когда подпись была сделана. Имеет смысл для случаев, +// когда дату невозможно извлечь из данных подписи. Если не +// указана или пустая, тогда используется текущая дата сеанса. +// ### ДатаПроверкиПодписи - Дата - дата проверки подписи после добавления из файла, если +// не указано свойство Данные в параметре ОписаниеДанных, +// возвращает пустую дату. +// ### ПодписьВерна - Булево - результат проверки подписи после добавления из файла, если +// не указано свойство Данные в параметре ОписаниеДанных, +// возвращает Ложь. // // Производные свойства: -// * Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, -// который использовался для подписания (содержится в подписи). -// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. -// * КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. +// ### Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, +// который использовался для подписания (содержится в подписи). +// ### Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// ### КомуВыданСертификат - Строка - представление субъекта, полученное из двоичных данных сертификата. // Процедура ДобавитьПодписьИзФайла(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено) Экспорт @@ -382,7 +379,7 @@ // как возвращает процедура ДобавитьПодписьИзФайла. // * Данные - ОписаниеОповещения - обработчик сохранения данных и получения полного имени // файла с путем (после его сохранения), возвращаемое в свойстве ПолноеИмяФайла -// типа Строка для сохранения электронных подписей (см. выше общий подход). +// типа Строка для сохранения электронных подписей (смотри выше общий подход). // Если расширение для работы с файлами не подключено, то нужно вернуть // имя файла без пути. // Если свойство не будет вставлено или заполнено - это считается отказом @@ -390,16 +387,15 @@ // // Для пакетного запроса разрешений у пользователя веб-клиента на сохранение файла данных // и подписей нужно вставить параметр ОбработкаЗапросаРазрешений типа ОписаниеОповещения. -// В процедуру будет передана структура с параметрами: -// * Вызовы - Массив - с описанием вызовов для сохранения подписей. -// * ОбработкаПродолжения - ОписаниеОповещения - оповещение, которое нужно выполнить +// В процедуру будет передана Структура со свойствами +// # Вызовы - Массив - с описанием вызовов для сохранения подписей. +// # ОбработкаПродолжения - ОписаниеОповещения - оповещение, которое нужно выполнить // после запроса разрешений, - параметры процедуры как у // оповещения для метода НачатьЗапросРазрешенияПользователя. // Если разрешение не получено, значит, все отменено. // // ОбработкаРезультата - ОписаниеОповещения - -// В результат передается параметр: -// * Булево - Истина, если все прошло успешно. +// В результат передается параметр типа Булево - Истина, если все прошло успешно. // Процедура СохранитьДанныеВместеСПодписью(ОписаниеДанных, ОбработкаРезультата = Неопределено) Экспорт @@ -413,21 +409,23 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// Булево - Истина, если проверка выполнена успешно. -// Строка - описание ошибки проверки подписи. -// Неопределено - не удалось получить менеджер криптографии (когда не указан). +// = Булево - Истина, если проверка выполнена успешно. +// = Строка - описание ошибки проверки подписи. +// = Неопределено - не удалось получить менеджер криптографии (когда не указан). // ИсходныеДанные - ДвоичныеДанные - двоичные данные, которые были подписаны. // Математическая проверка выполняется на стороне клиента, даже когда // администратор настроил проверку электронных подписей на сервере, // если указан менеджер криптографии или его удалось получить без ошибки. -// Это повышает производительность, а также безопасность, когда проверяется -// подпись в расшифрованном файле (он не будет передан на сервер). +// Это повышает производительность, а также безопасность, когда проверяется подпись +// в расшифрованном файле (он не будет передан на сервер). // - Строка - адрес временного хранилища, содержащего исходные двоичные данные. // - Структура: -// * ПараметрыXMLDSig - Структура - как возвращает функция ПараметрыXMLDSig общего -// модуля ЭлектроннаяПодписьКлиент. -// * КонвертSOAP - Строка - шаблон сообщения . -// +// * ПараметрыXMLDSig - см. ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig. +// * КонвертSOAP - Строка - шаблон сообщения . +// - Структура: +// * ПараметрыCMS - см. ЭлектроннаяПодписьКлиент.ПараметрыCMS +// * Данные - Строка - произвольная строка для подписания, +// - ДвоичныеДанные - двоичные данные для подписания. // Подпись - ДвоичныеДанные - двоичные данные электронной подписи. // - Строка - адрес временного хранилища, содержащего двоичные данные. // - Неопределено - если ИсходныеДанные - конверт SOAP. @@ -494,15 +492,15 @@ // ошибка, выполнение прекращается без отображения формы операции или с закрытием этой формы, // если она была открыта. // -// Вариант 1: +// Вариант 1. // * Данные - ДвоичныеДанные - данные для шифрования. // - Строка - адрес временного хранилища, содержащего двоичные данные. // - ОписаниеОповещения - обработчик получения данных, который возвращает -// их в свойстве Данные (см. выше общий подход). +// их в свойстве Данные (смотри выше общий подход). // * РазмещениеРезультата - Неопределено - (необязательный) - описывает куда поместить зашифрованные данные. // Если не указан или Неопределено, тогда через параметр ОбработкаРезультата. // - ОписаниеОповещения - обработчик сохранения зашифрованных данных. -// Следует учесть общий подход (см. выше). +// Следует учесть общий подход (смотри выше). // В момент вызова в ОписаниеДанных уже вставлен параметр ЗашифрованныеДанные. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр ЗашифрованныеДанные. @@ -510,16 +508,15 @@ // Если не указан, то сертификаты шифрования не требуется добавлять. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и // блокировки объекта перед добавлением сертификатов шифрования. -// * Представление - ЛюбаяСсылка -// - Строка -// - Структура - (необязательный), если не указан, тогда -// представление вычисляется по значению свойства Объект. -// Структура содержит свойства: -// * Значение - ЛюбаяСсылка -// - ОписаниеОповещения - для открытия. -// * Представление - Строка - представление значения. +// * Представление - ЛюбаяСсылка - (необязательный), если параметр не указан, +// тогда представление вычисляется по значению свойства Объект. +// - Строка +// - Структура: +// ** Значение - ЛюбаяСсылка +// - ОписаниеОповещения - для открытия. +// ** Представление - Строка - представление значения. // -// Вариант 2: +// Вариант 2. // * НаборДанных - Массив - структуры со свойствами, описанными в Варианте 1. // * ПредставлениеНабора - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)". // В это представление в параметр %1 заполняется количество элементов. @@ -542,20 +539,20 @@ // ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата, если не указан параметр Форма и/или РазмещениеРезультата. // В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами: -// * Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение +// # Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение // определяется по наличию свойства ЗашифрованныеДанные. Если есть, то шаг выполнен. -// * Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. -// * СертификатыШифрования - Строка - адрес временного хранилища, содержащего массив, описанный ниже. -// - Массив - помещается перед началом шифрования и после этого не изменяется. -// Содержит значения типа Структура со свойствами: -// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. -// * Представление - Строка - сохраненное представление субъекта, -// полученное из двоичных данных сертификата. -// * Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, -// который использовался для шифрования. -// * ЗашифрованныеДанные - ДвоичныеДанные - результат шифрования. +// # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. +// # СертификатыШифрования = Строка - адрес временного хранилища, содержащего массив, описанный ниже. +// = Массив - помещается перед началом шифрования и после этого не изменяется. +// ## Значение - Структура +// ### Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// ### Представление - Строка - сохраненное представление субъекта, +// полученное из двоичных данных сертификата. +// ### Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, +// который использовался для шифрования. +// # ЗашифрованныеДанные = ДвоичныеДанные - результат шифрования. // При передаче параметра НаборДанных свойство нужно проверять в нем. -// - Строка - адрес временного хранилища, содержащего результат шифрования. +// = Строка - адрес временного хранилища, содержащего результат шифрования. // Процедура Зашифровать(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено) Экспорт @@ -625,7 +622,7 @@ // подготовки данных после выбора сертификата, которым будут расшифрованы данные. // В этом обработчике можно заполнить параметр Данные, если необходимо. // В момент вызова в ОписаниеДанных уже вставлен выбранный сертификат, -// как ВыбранныйСертификат (см. ниже). Следует учесть общий подход (см. выше). +// как ВыбранныйСертификат (смотри ниже). Следует учесть общий подход (смотри выше). // * ВыполнятьНаСервере - Неопределено // - Булево - (необязательный) - когда не указан или Неопределено, // тогда выполнение будет определено автоматически: если есть сервер, то сначала @@ -654,16 +651,16 @@ // ошибка, выполнение прекращается без отображения формы операции или с закрытием этой формы, // если она была открыта. // -// Вариант 1: +// Вариант 1. // * Данные - ДвоичныеДанные - данные для расшифровки. // - Строка - адрес временного хранилища, содержащего двоичные данные. // - ОписаниеОповещения - обработчик получения данных, который возвращает -// их в свойстве Данные (см. выше общий подход). В момент вызова -// в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (см. ниже). +// их в свойстве Данные (смотри выше общий подход). В момент вызова +// в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (смотри ниже). // * РазмещениеРезультата - Неопределено - (необязательный) - описывает, куда поместить расшифрованные данные. // Если не указан или Неопределено, тогда через параметр ОбработкаРезультата. // - ОписаниеОповещения - обработчик сохранения расшифрованных данных. -// Следует учесть общий подход (см. выше). +// Следует учесть общий подход (смотри выше). // В момент вызова в ОписаниеДанных уже вставлен параметр РасшифрованныеДанные. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр РасшифрованныеДанные. @@ -671,23 +668,22 @@ // а также очистить записи из регистра сведений СертификатыШифрования // после успешного завершения расшифровки. // Если не указан, то сертификаты не требуется получать из объекта и очищать. -// - Строка - адрес временного хранилища, содержащего массив сертификатов -// шифрования в виде структур со свойствами: -// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. -// * Представление - Строка - сохраненное представление субъекта, -// полученное из двоичных данных сертификата. -// * Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, -// который использовался для шифрования. -// * Представление - ЛюбаяСсылка -// - Строка -// - Структура - (необязательный), если не указан, тогда -// представление вычисляется по значению свойства Объект. -// Структура содержит свойства: -// * Значение - ЛюбаяСсылка -// - ОписаниеОповещения - для открытия. -// * Представление - Строка - представление значения. +// - Строка - адрес временного хранилища, содержащий +// ## Массив из Структура - массив сертификатов шифрования +// ### Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// ### Представление - Строка - сохраненное представление субъекта, +// полученное из двоичных данных сертификата. +// ### Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, +// который использовался для шифрования. +// * Представление - ЛюбаяСсылка - (необязательный), если параметр не указан, +// тогда представление вычисляется по значению свойства Объект. +// - Строка +// - Структура: +// ** Значение - ЛюбаяСсылка +// - ОписаниеОповещения - для открытия. +// ** Представление - Строка - представление значения. // -// Вариант 2: +// Вариант 2. // * НаборДанных - Массив - структуры со свойствами, описанными в Варианте 1. // * ПредставлениеНабора - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)". // В это представление в параметр %1 заполняется количество элементов. @@ -714,16 +710,16 @@ // ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата, если не указан параметр Форма и/или РазмещениеРезультата. // В результат передается входной параметр ОписаниеДанных, который в успешном случае, дополняется свойствами: -// * Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение +// # Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение // определяется по наличию свойства РасшифрованныеДанные. Если есть, то шаг выполнен. -// * Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. -// * ВыбранныйСертификат - Структура - содержит свойства сертификата: -// * Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат. -// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. -// * Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. -// * РасшифрованныеДанные - ДвоичныеДанные - результат расшифровки. +// # Отказ - Булево - Истина, если пользователь отменил операцию интерактивно. +// # ВыбранныйСертификат - Структура - содержит свойства сертификата: +// ## Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат. +// ## Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// ## Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. +// # РасшифрованныеДанные = ДвоичныеДанные - результат расшифровки. // При передаче параметра НаборДанных, свойство нужно проверять в нем. -// - Строка - адрес временного хранилища, содержащего результат расшифровки. +// = Строка - адрес временного хранилища, содержащего результат расшифровки. // Процедура Расшифровать(ОписаниеДанных, Форма = Неопределено, ОбработкаРезультата = Неопределено) Экспорт @@ -788,10 +784,10 @@ // Проверяет действительность сертификата криптографии. // // Параметры: -// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// Булево - Истина, если проверка выполнена успешно. -// Строка - описание ошибки проверки сертификата. -// Неопределено - не удалось получить менеджер криптографии (когда не указан). +// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов +// = Булево - Истина, если проверка выполнена успешно. +// = Строка - описание ошибки проверки сертификата. +// = Неопределено - не удалось получить менеджер криптографии (когда не указан). // // Сертификат - СертификатКриптографии - сертификат. // - ДвоичныеДанные - двоичные данные сертификата. @@ -823,7 +819,7 @@ // * ПроверкаПриВыборе - Булево - если Истина, тогда кнопка Проверить будет называться // "Проверить и продолжить", а кнопка Закрыть будет называться "Отмена". // * ОбработкаРезультата - ОписаниеОповещения - вызывается сразу после проверки, в процедуру -// передается Результат.ПроверкиПройдены (см. ниже) с начальным значением Ложь. +// передается Результат.ПроверкиПройдены (смотри ниже) с начальным значением Ложь. // В режиме ПроверкаПриВыборе, если не установить Истина, // форма не будет закрыта после возврата из процедуры оповещения и // будет показано предупреждение о невозможности продолжения. @@ -832,7 +828,7 @@ // Если режим ПроверкаПриВыборе и установлен параметр ОбработкаРезультата, то // форма не будет открыта, если параметр ПроверкиПройдены установлен Истина. // * ОбработкаЗавершения - ОписаниеОповещения - вызывается при закрытии формы, в качестве результата -// передается Неопределено или значение ПроверкиПройдены (см. ниже). +// передается Неопределено или значение ПроверкиПройдены (смотри ниже). // * КонтекстОперации - Произвольный - если передать контекст, возвращенный процедурами Подписать, // Расшифровать и т.д., пароль, введенный для сертификата, может быть использован, // как если бы он был сохранен на время сеанса. @@ -841,9 +837,8 @@ // содержит контекст предыдущей операции, результаты проверки не будут показаны // пользователю. // * Результат - Неопределено - проверка ни разу не выполнялась. -// - Структура - (возвращаемое значение) - вставляется перед обработкой результата, -// содержит свойства: -// * ПроверкиПройдены - Булево - (возвращаемое значение) устанавливается в процедуре параметра ОбработкаРезультата. +// - Структура - возвращаемое значение. Вставляется перед обработкой результата: +// * ПроверкиПройдены - Булево - возвращаемое значение. Устанавливается в процедуре параметра ОбработкаРезультата. // * ПроверкиНаСервере - Неопределено - проверка не выполнялась на сервере: // - Структура - со свойствами, как в следующем параметре. // * ПроверкиНаКлиенте - Структура: @@ -864,10 +859,11 @@ // - Неопределено - так же, как указано выше. // * Расшифровка - Булево // - Неопределено - так же, как указано выше. -// * <Имя дополнительной проверки> - Булево -// - Неопределено - так же, как указано выше. -// * <Имя дополнительной проверки>Ошибка - Строка - заполняется текстом ошибки, если проверка имеет значение -// Ложь. +// <Имя дополнительной проверки> имя дополнительной проверки, определенной +// в общем модуле ПриСозданииФормыПроверкаСертификата +// с типами, как указано выше. +// <Имя дополнительной проверки>Ошибка имя дополнительной проверки с окончанием Ошибка и +// типом Строка (содержит текст ошибки, если проверка имеет значение Ложь). // // * ПараметрыДополнительныхПроверок - Произвольный - параметры, которые передаются в процедуру // ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый. @@ -885,11 +881,12 @@ // БезВопроса - Булево - если указано Истина, тогда вопроса показано не будет. // Требуется, если пользователь нажал на кнопку Установить расширение. // -// ОбработчикРезультата - ОписаниеОповещения - описание процедуры, принимающей результат выбора в -// первый параметр (РасширениеУстановлено) в виде одного из значений: -// Истина - пользователь подтвердил установку, после установки расширение было успешно подключено. -// Ложь - пользователь подтвердил установку, однако после установки расширение не удалось подключить. -// Неопределено - пользователь отказался от установки. +// ОбработчикРезультата - ОписаниеОповещения - описание процедуры, принимающей результат выбора +// РасширениеУстановлено типов: +// = Булево +// Истина - Пользователь подтвердил установку, после установки расширение было успешно подключено. +// Ложь - Пользователь подтвердил установку, однако после установки расширение не удалось подключить. +// = Неопределено - Пользователь отказался от установки. // // ТекстВопроса - Строка - текст вопроса. // ЗаголовокВопроса - Строка - заголовок вопроса. @@ -961,9 +958,9 @@ // Возвращает дату, извлеченную из двоичных данных подписи, или Неопределено. // // Параметры: -// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значения: -// Дата - успешно извлеченная дата подписи; -// Неопределено - не удалось извлечь дату из данных подписи. +// Оповещение - ОписаниеОповещения - вызывается для передачи возвращаемого значения типов: +// = Дата - успешно извлеченная дата подписи, +// = Неопределено - не удалось извлечь дату из данных подписи. // Подпись - ДвоичныеДанные - данные подписи, из которых нужно извлечь дату. // ПривестиКЧасовомуПоясуСеанса - Булево - привести универсальное время к времени сеанса. // @@ -1060,13 +1057,12 @@ // Сертификат - СертификатКриптографии - для которого нужно вернуть свойства субъекта. // // Возвращаемое значение: -// Структура - со свойствами, состав которых зависит от национальной специфики. -// Пример для Российской Федерации: +// Структура - со свойствами, состав которых зависит от национальной специфики. Пример для Российской Федерации: // * ОбщееИмя - Строка - (64) - извлекается из поля CN. // ЮЛ - в зависимости от типа конечного владельца СКПЭП -// - наименование организации; -// - название автоматизированной системы; -// - другое отображаемое имя по требованиям информационной системы. +// а) наименование организации; +// б) название автоматизированной системы; +// в) другое отображаемое имя по требованиям информационной системы. // ФЛ - ФИО. // - Неопределено - такое свойство сертификата отсутствует. // @@ -1242,19 +1238,19 @@ #Область ЗаписьСертификатаВСправочник -// Инициализирует структуру параметров для добавления сертификата в справочник -// СертификатыКлючейЭлектроннойПодписиИШифрования. -// Для использования в ЭлектроннаяПодписьКлиент.ЗаписатьСертификатВСправочник +// Инициализирует структуру параметров для добавления сертификата +// в справочник СертификатыКлючейЭлектроннойПодписиИШифрования. +// Для использования в процедуре ЗаписатьСертификатВСправочник. // // Возвращаемое значение: // Структура: // * Наименование - Строка - представление сертификата в списке. // Значение по умолчанию - "". -// * Пользователь - СправочникСсылка.Пользователь - пользователь, которому принадлежит сертификат. +// * Пользователь - СправочникСсылка.Пользователи - пользователь, которому принадлежит сертификат. // Значение используется при получении списка личных сертификатов пользователя // в формах подписания и шифрования данных. // Значение по умолчанию - Неопределено. -// * Организация - СправочникСсылка.Организация - организация, к которой относится сертификат. +// * Организация - ОпределяемыйТип.Организация - организация, к которой относится сертификат. // Значение по умолчанию - Неопределено. // * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа, которая // требуется для подписания и расшифровки. @@ -1281,17 +1277,14 @@ // Осуществляет проверку сертификата и, в случае успеха, добавляет новый или обновляет существующий сертификат // в справочнике СертификатыКлючейЭлектроннойПодписиИШифрования. Если проверка не пройдена, показывает // информацию о возникших ошибках. -// Для добавления сертификата на сервере см. ЭлектроннаяПодпись.ЗаписатьСертификатВСправочник. +// Для добавления сертификата на сервере смотри ЭлектроннаяПодпись.ЗаписатьСертификатВСправочник. // // Параметры: -// ОбработчикЗавершения - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана после -// добавления сертификата: -// * Сертификат - Неопределено - при проверке или добавлении сертификата произошла ошибка. -// - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - добавленный -// сертификат. -// * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта -// ОписаниеОповещения. -// Сертификат - ДвоичныеДанные +// ОбработчикЗавершения - ОписаниеОповещения - вызывается после добавления сертификата +// для передачи возвращаемого значения типов: +// = Неопределено - при проверке или добавлении сертификата произошла ошибка. +// = СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - добавленный сертификат. +// Сертификат - ДвоичныеДанные - двоичные данные сертификата. // - Строка - двоичные данные сертификата электронной подписи или // адрес данных во временном хранилище. // ПарольСертификата - Строка - пароль сертификата для проверки операций с закрытым ключом. @@ -1299,7 +1292,7 @@ // выполняемых перед добавлением сертификата. Если параметр принимает значение Истина, // выполняется проверка шифрования и расшифровки, иначе - подписания и проверки подписи. // ДополнительныеПараметры - Неопределено - без дополнительных параметров. -// - см. ЭлектроннаяПодписьКлиент.ПараметрыЗаписиСертификата. +// - см. ПараметрыЗаписиСертификата // Процедура ЗаписатьСертификатВСправочник(ОбработчикЗавершения, Сертификат, @@ -1369,7 +1362,7 @@ // * ВЛичныйСписок - Булево - если параметр принимает значение Истина, то реквизит Пользователь // будет заполнен текущим пользователем, иначе - реквизит не будет заполнен. // Значение по умолчанию - Ложь. -// * Организация - СправочникСсылка.Организация - организация, к которой относится сертификат. +// * Организация - ОпределяемыйТип.Организация - организация, к которой относится сертификат. // Значение по умолчанию - Неопределено. // В случае, когда параметр используется для создания заявления, тогда значение // передается в процедуру ПриЗаполненииРеквизитовОрганизацииВЗаявленииНаСертификат @@ -1404,20 +1397,16 @@ // Интерактивно добавляет сертификат из установленных на компьютере или создает заявление на выпуск сертификата. // // Параметры: -// ОбработчикЗавершения - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана после -// добавления сертификата: -// * Сертификат - Неопределено - при проверке или добавлении сертификата произошла ошибка. -// - Структура: -// ** Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - добавленный сертификат. -// ** Добавлен - Булево - признак того, что сертификат успешно добавлен. Если сертификат добавляется +// ОбработчикЗавершения - ОписаниеОповещения - вызывается после добавления сертификата со значением одного из типов: +// = Неопределено - при проверке или добавлении сертификата произошла ошибка. +// = Структура: +// # Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - добавленный сертификат. +// # Добавлен - Булево - признак того, что сертификат успешно добавлен. Если сертификат добавляется // с помощью заявления на выпуск нового квалифицированного сертификата, признак принимает // значение Ложь пока заявление не будет исполнено и сертификат не будет установлен на // компьютере. -// * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта -// ОписаниеОповещения. // ПараметрыДобавления - Неопределено - без дополнительных параметров. -// - см. ЭлектроннаяПодписьКлиент.ПараметрыДобавленияСертификата. -// Смотри также функцию ДоступностьСозданияЗаявления общего модуля ЭлектроннаяПодпись. +// - см. ЭлектроннаяПодписьКлиент.ПараметрыДобавленияСертификата // // Пример: // 1) Добавление сертификата из установленных в личном хранилище: @@ -1466,9 +1455,9 @@ // Создает и возвращает менеджер криптографии (на клиенте) для указанной программы. // // Параметры: -// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов. -// МенеджерКриптографии - инициализированный менеджер криптографии. -// Строка - описание ошибки при создании менеджера криптографии. +// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: +// = МенеджерКриптографии - инициализированный менеджер криптографии. +// = Строка - описание ошибки при создании менеджера криптографии. // // Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют // операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование, @@ -1508,9 +1497,9 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// СертификатКриптографии - найденный сертификат. -// Неопределено - сертификат не существует в хранилище. -// Строка - текст ошибки создания менеджера криптографии (или другая ошибка). +// = СертификатКриптографии - найденный сертификат. +// = Неопределено - сертификат не существует в хранилище. +// = Строка - текст ошибки создания менеджера криптографии (или другая ошибка). // // Отпечаток - Строка - Base64 кодированный отпечаток сертификата. // ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде. @@ -1531,9 +1520,9 @@ // Только для работы через средства платформы (МенеджерКриптографии). // // Параметры: -// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значение: -// * Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина; -// * Строка - текст ошибки создания менеджера криптографии (или другая ошибка). +// Оповещение - ОписаниеОповещения - вызывается для передачи возвращаемого значения следующих типов: +// = Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина, +// = Строка - текст ошибки создания менеджера криптографии (или другая ошибка). // // ТолькоЛичные - Булево - если Ложь, то к личным сертификатам добавляются сертификаты получателей. // @@ -1549,13 +1538,13 @@ // указан в сертификате или не указан никакой, а также, что заполнена программа для работы с сертификатом. // // Параметры: -// Оповещение - ОписаниеОповещения - оповещение с результатом -// Массив - со значениями Структура со свойствами: -// * Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат. -// * Наименование - Строка - представление сертификата в списке. -// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64. -// * Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. -// * Организация - СправочникСсылка.Организация - организация к которой относится сертификат. +// Оповещение - ОписаниеОповещения - оповещение с результатом типа: +// = Массив Из Структура: +// # Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат. +// # Наименование - Строка - представление сертификата в списке. +// # Отпечаток - Строка - отпечаток сертификата в формате строки Base64. +// # Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. +// # Организация - ОпределяемыйТип.Организация - организация к которой относится сертификат. // Отбор - Неопределено - использовать значения по умолчанию, для свойств структуры, описанных ниже. // - Структура: // * ПроверятьСрокДействия - Булево - если свойства нет, значит Истина. @@ -1589,13 +1578,13 @@ // Только для работы через средства платформы (МенеджерКриптографии). // // Параметры: -// Оповещение - ОписаниеОповещения - оповещение с результатом -// Массив - со значениями Структура со свойствами, как и ЭлектроннаяПодпись.НовоеОписаниеПрограммы, -// а также дополнительными свойствами: -// * Установлена - Булево - если Истина, то установлена либо на клиенте, либо на сервере. -// * РезультатПроверкиНаКлиенте - Строка - если пустая строка, то установлена, иначе описание ошибки. -// * РезультатПроверкиНаСервере - Строка - если пустая строка, то установлена, иначе описание ошибки. -// - Неопределено - проверка не выполнялась. +// Оповещение - ОписаниеОповещения - оповещение с результатом типа: +// = Массив - со значениями Структура со свойствами, как и ЭлектроннаяПодпись.НовоеОписаниеПрограммы, +// а также дополнительными свойствами: +// # Установлена = Булево - если Истина, то установлена либо на клиенте, либо на сервере. +// # РезультатПроверкиНаКлиенте = Строка - если пустая строка, то установлена, иначе описание ошибки. +// # РезультатПроверкиНаСервере = Строка - если пустая строка, то установлена, иначе описание ошибки. +// = Неопределено - проверка не выполнялась. // // ОписаниеПрограмм - Неопределено - проверять только известные программы, которые заполняются процедурой // ЭлектроннаяПодпись.ЗаполнитьСписокПрограмм, если передать пустой массив. @@ -1646,17 +1635,16 @@ // Пароль - Строка - устанавливаемый пароль. Может быть пустой. // - Неопределено - сбросить установленный пароль, если был установлен. // -// ПояснениеПароля - Структура - со свойствами, описывающими пояснение, которое будет написано -// под паролем вместо флажка ЗапомнитьПароль: +// ПояснениеПароля - Структура - со свойствами пояснения под паролем вместо флажка ЗапомнитьПароль: // * ТекстПояснения - Строка - только текст; // * ПояснениеГиперссылка - Булево - если истина, то при нажатии на пояснение, вызывать ОбработкаДействия. // * ТекстПодсказки - Строка // - ФорматированнаяСтрока - текст или текст со ссылками. -// * ОбработкаДействия - ОписаниеОповещения - вызывает процедуру, в которую передается -// структура со свойствами: -// * Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка +// * ОбработкаДействия - ОписаниеОповещения - вызывает процедуру, в которую значение типа: +// = Структура: +// # Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка // на выбранный сертификат; -// * Действие - Строка - "ПояснениеНажатие" или навигационная ссылка подсказки. +// # Действие - Строка - "ПояснениеНажатие" или навигационная ссылка подсказки. // Процедура УстановитьПарольСертификата(СертификатСсылка, Пароль, ПояснениеПароля = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl index 21772b974..e341b8d04 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентПереопределяемый/Module.bsl @@ -33,7 +33,7 @@ // // Параметры: // Параметры - Структура: -// * ОжидатьПродолжения - Булево - (возвращаемое значение) - если Истина, тогда дополнительная проверка +// * ОжидатьПродолжения - Булево - возвращаемое значение. Если Истина, тогда дополнительная проверка // будет выполнятся асинхронно, продолжение возобновится после выполнения оповещения. // Начальное значение Ложь. // * Оповещение - ОписаниеОповещения - обработка, которую нужно вызывать для продолжения @@ -45,9 +45,9 @@ // выполнения проверки. // - Неопределено - если стандартные проверки отключены в процедуре // ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый. -// * ОписаниеОшибки - Строка - (возвращаемое значение) - описание ошибки, полученной при выполнении проверки. +// * ОписаниеОшибки - Строка - возвращаемое значение. Описание ошибки, полученной при выполнении проверки. // Это описание сможет увидеть пользователь при нажатии на картинку результата. -// * ЭтоПредупреждение - Булево - (возвращаемое значение) - вид картинки Ошибка/Предупреждение, +// * ЭтоПредупреждение - Булево - возвращаемое значение. Вид картинки Ошибка/Предупреждение, // начальное значение - Ложь. // * Пароль - Строка - пароль, введенный пользователем. // - Неопределено - если свойство ВводитьПароль установлено в Ложь в процедуре diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl index 1dc781b87..aa71a9e8f 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl @@ -91,9 +91,9 @@ // выполнения проверки. // - Неопределено - если стандартные проверки отключены в процедуре // ПриСозданииФормыПроверкаСертификата общего модуля ЭлектроннаяПодписьПереопределяемый. -// * ОписаниеОшибки - Строка - (возвращаемое значение) - описание ошибки, полученной при выполнении проверки. +// * ОписаниеОшибки - Строка - возвращаемое значение. Описание ошибки, полученной при выполнении проверки. // Это описание сможет увидеть пользователь при нажатии на картинку результата. -// * ЭтоПредупреждение - Булево - (возвращаемое значение) - вид картинки Ошибка/Предупреждение, +// * ЭтоПредупреждение - Булево - возвращаемое значение. Вид картинки Ошибка/Предупреждение, // начальное значение - Ложь. // * Пароль - Строка - пароль, введенный пользователем. // - Неопределено - если свойство ВводитьПароль установлено в Ложь в процедуре diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl index 9e869f052..cf66455b5 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl @@ -369,6 +369,37 @@ #КонецОбласти +#Область ОблачнаяПодпись + +// определяет доступность подсистемы облачной подписи +Функция ИспользоватьСервисОблачнойПодписи() Экспорт + + Результат = Ложь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + Результат = МодульСервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// определяет тип программы облачной подписи +Функция ПолучитьТипОблачнойПодписи() Экспорт + + Результат = Неопределено; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + Результат = Тип("СправочникСсылка.УчетныеЗаписиDSS"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -785,7 +816,15 @@ // Только для внутреннего использования. Процедура ОбновитьСписокСертификатов(Сертификаты, СвойстваСертификатовНаКлиенте, КромеУжеДобавленных, - Личные, Ошибка, БезОтбора, ОтборПоОрганизации = Неопределено) Экспорт + Личные, Ошибка, БезОтбора, ДополнительныеПараметры = Неопределено) Экспорт + + Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда + ОтборПоОрганизации = ДополнительныеПараметры.ОтборПоОрганизации; + ВыполнятьНаСервере = ДополнительныеПараметры.ВыполнятьНаСервере; + Иначе + ОтборПоОрганизации = Неопределено; + ВыполнятьНаСервере = Неопределено; + КонецЕсли; ТаблицаСвойствСертификатов = Новый ТаблицаЗначений; ТаблицаСвойствСертификатов.Колонки.Добавить("Отпечаток", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(255))); @@ -795,6 +834,7 @@ ТаблицаСвойствСертификатов.Колонки.Добавить("НаСервере", Новый ОписаниеТипов("Булево")); ТаблицаСвойствСертификатов.Колонки.Добавить("ЭтоЗаявление", Новый ОписаниеТипов("Булево")); ТаблицаСвойствСертификатов.Колонки.Добавить("ВОблачномСервисе", Новый ОписаниеТипов("Булево")); + ТаблицаСвойствСертификатов.Колонки.Добавить("ТипРазмещения", Новый ОписаниеТипов("Число")); Для Каждого СвойстваСертификата Из СвойстваСертификатовНаКлиенте Цикл НоваяСтрока = ТаблицаСвойствСертификатов.Добавить(); @@ -804,7 +844,8 @@ ТаблицаСвойствСертификатов.Индексы.Добавить("Отпечаток"); - Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда + Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() + И ВыполнятьНаСервере <> Ложь Тогда ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); ПараметрыСоздания.ОписаниеОшибки = Ошибка; @@ -850,6 +891,16 @@ КонецЕсли; + Если ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МассивСертификатов = МодульСервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатов(Ложь); + + ПараметрыДобавленияСвойств = Новый Структура("ОблачнаяПодпись", Истина); + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов, + МассивСертификатов, БезОтбора, ДобавкаВремени(), ТекущаяДатаСеанса(), ПараметрыДобавленияСвойств); + КонецЕсли; + ОбработатьДобавленныеСертификаты(ТаблицаСвойствСертификатов, Не БезОтбора И КромеУжеДобавленных, ОтборПоОрганизации); ТаблицаСвойствСертификатов.Индексы.Добавить("Представление"); @@ -883,6 +934,7 @@ ОбновитьЗначение(Строка.НаСервере, СвойстваСертификата.НаСервере); ОбновитьЗначение(Строка.ЭтоЗаявление, СвойстваСертификата.ЭтоЗаявление); ОбновитьЗначение(Строка.ВОблачномСервисе, СвойстваСертификата.ВОблачномСервисе); + ОбновитьЗначение(Строка.ТипРазмещения, СвойстваСертификата.ТипРазмещения); ОбработанныеСтроки.Вставить(Строка, Истина); Индекс = Индекс + 1; КонецЦикла; @@ -1122,7 +1174,8 @@ КонецЕсли; ЗаполнитьСуществующиеСертификатыПользователя(Форма.СертификатСписокВыбора, - Параметры.ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, Форма.ОтборОтпечатков, Расшифровка); + Параметры.ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, + Форма.ОтборОтпечатков, Расшифровка, Форма.ВыполнятьНаСервере); Сертификат = Неопределено; @@ -1207,7 +1260,8 @@ КонецЕсли; ЗаполнитьСуществующиеСертификатыПользователя(Форма.СертификатСписокВыбора, - ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, Форма.ОтборОтпечатков, Расшифровка); + ОтпечаткиСертификатовНаКлиенте, Форма.ОтборСертификатов, + Форма.ОтборОтпечатков, Расшифровка, Форма.ВыполнятьНаСервере); ЗаполнитьДополнительныеСвойстваСертификата(Форма); @@ -1730,17 +1784,33 @@ Функция ОбъектВнешнейКомпонентыXMLDSig() - ОбъектКомпоненты = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("XMLDSignAddIn", - "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Макет.КомпонентаXMLDSig"); + ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты(); + ОбъектКомпоненты = ОбщегоНазначения.ПодключитьКомпонентуИзМакета(ОписаниеКомпоненты.ИмяОбъекта, + ОписаниеКомпоненты.ПолноеИмяМакета); Если ОбъектКомпоненты = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Не удалось подключить внешнюю компоненту XMLDSig.'"); КонецЕсли; + НастроитьКомпоненту(ОбъектКомпоненты); + Возврат ОбъектКомпоненты; КонецФункции +Процедура НастроитьКомпоненту(ОбъектКомпоненты) + + Попытка + ОбъектКомпоненты.СоответствиеOID = + ЭлектроннаяПодписьСлужебныйКлиентСервер.ИдентификаторыАлгоритмовХешированияИОткрытогоКлюча(); + Исключение + ТекстОшибки = НСтр("ru = 'При установке свойства СоответствиеOID компоненты XMLDSig произошла ошибка:'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + +КонецПроцедуры + // Подписывает сообщение, подставляя в шаблон SOAP данные подписи. // // Параметры: @@ -1781,14 +1851,14 @@ СвойстваКриптопровайдера = СвойстваКриптопровайдера(МенеджерКриптографии); ОбъектКомпоненты.ПутьККриптопровайдеру = СвойстваКриптопровайдера.Путь; - АтрибутSignatureValue = РезультатCMSVerifySign( + Результат = РезультатCMSVerifySign( ОбъектКомпоненты, Подпись, Данные, ПараметрыCMS, СвойстваКриптопровайдера.Тип); - Возврат АтрибутSignatureValue; + Возврат Результат; КонецФункции @@ -1921,17 +1991,36 @@ Функция РезультатCMSVerifySign(ОбъектКомпоненты, Подпись, Данные, ПараметрыCMS, ТипКриптопровайдера) + Сертификат = Null; Попытка - ПодписьВерна = ОбъектКомпоненты.CMSVerifySign(Base64Строка(Подпись), 0, "", ТипКриптопровайдера); + ПодписьВерна = ОбъектКомпоненты.CMSVerifySign(Подпись, + ПараметрыCMS.Открепленная, Данные, ТипКриптопровайдера, Сертификат); Исключение - ВызватьИсключение НСтр("ru = 'Ошибка вызова метода CMSVerifySign компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение НСтр("ru = 'Ошибка вызова метода CMSVerifySign компоненты XMLDSig.'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; Если ПодписьВерна = Неопределено Тогда - ВызватьИсключение НСтр("ru = 'Ошибка вызова метода CMSVerifySign компоненты XMLDSig.'") + Символы.ПС + ОбъектКомпоненты.GetLastError(); + ВызватьИсключение НСтр("ru = 'Ошибка вызова метода CMSVerifySign компоненты XMLDSig.'") + + Символы.ПС + ОбъектКомпоненты.GetLastError(); + + ИначеЕсли Не ПодписьВерна Тогда + ВызватьИсключение НСтр("ru = 'Подпись неверна.'"); + + ИначеЕсли ТипЗнч(Сертификат) <> Тип("ДвоичныеДанные") Тогда + ВызватьИсключение НСтр("ru = 'Подпись верна, но не содержит данных сертификата.'"); КонецЕсли; - Возврат ПодписьВерна; + ДатаПодписания = ЭлектроннаяПодпись.ДатаПодписания(Подпись); + Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда + ДатаПодписания = Неопределено; + КонецЕсли; + + ВозвращаемоеЗначение = Новый Структура; + ВозвращаемоеЗначение.Вставить("Сертификат", Новый СертификатКриптографии(Сертификат)); + ВозвращаемоеЗначение.Вставить("ДатаПодписания", ДатаПодписания); + + Возврат ВозвращаемоеЗначение; КонецФункции @@ -2119,12 +2208,13 @@ // Для процедур НастроитьФормуПодписанияШифрованияРасшифровки, СертификатПриИзмененииНаСервере. Процедура ЗаполнитьСуществующиеСертификатыПользователя(СписокВыбора, ОтпечаткиСертификатовНаКлиенте, - ОтборСертификатов, ОтборОтпечатков, Расшифровка) + ОтборСертификатов, ОтборОтпечатков, Расшифровка, ВыполнятьНаСервере) СписокВыбора.Очистить(); ТекущаяДатаСеанса = ?(Расшифровка И ЗначениеЗаполнено(ОтборОтпечатков), Неопределено, ТекущаяДатаСеанса()); - Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() Тогда + Если ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере() + И ВыполнятьНаСервере <> Ложь Тогда МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов"); @@ -2146,6 +2236,27 @@ ОтпечаткиСертификатовНаКлиенте, МассивСертификатов, ДобавкаВремени(), ТекущаяДатаСеанса); КонецЕсли; + Если ИспользоватьСервисОблачнойПодписи() Тогда + + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + ВсеСертификаты = МодульСервисКриптографииDSSСлужебный.ПолучитьВсеСертификаты(Ложь); + + МассивСертификатов = Новый ТаблицаЗначений; + МассивСертификатов.Колонки.Добавить("Отпечаток"); + МассивСертификатов.Колонки.Добавить("ДатаНачала"); + МассивСертификатов.Колонки.Добавить("ДатаОкончания"); + + Для каждого СтрокаТаблицы Из ВсеСертификаты Цикл + НоваяСтрока = МассивСертификатов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы); + НоваяСтрока.Отпечаток = ПолучитьДвоичныеДанныеИзHexСтроки(СтрокаТаблицы.Отпечаток); + КонецЦикла; + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатов( + ОтпечаткиСертификатовНаКлиенте, МассивСертификатов, ДобавкаВремени(), ТекущаяДатаСеанса()); + + КонецЕсли; + ОтборПоОрганизации = Ложь; Если ТипЗнч(ОтборСертификатов) = Тип("СписокЗначений") Тогда @@ -2207,30 +2318,57 @@ Возврат; КонецЕсли; - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь()); - Запрос.Параметры.Вставить("Отпечатки", ОтпечаткиСертификатовНаКлиенте); - Запрос.Текст = + ТекстЗапроса = "ВЫБРАТЬ | Сертификаты.Ссылка КАК Ссылка, + | Сертификаты.Пользователь КАК Пользователь, | Сертификаты.Наименование КАК Наименование + |ПОМЕСТИТЬ ВсеСертификаты |ИЗ | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты |ГДЕ | Сертификаты.Программа <> ЗНАЧЕНИЕ(Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка) - | И Сертификаты.Пользователь = &Пользователь | И Сертификаты.Отозван = ЛОЖЬ | И Сертификаты.Отпечаток В(&Отпечатки) | И ИСТИНА + |; | - |УПОРЯДОЧИТЬ ПО - | Наименование"; + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВсеСертификаты.Ссылка КАК Ссылка, + | ВсеСертификаты.Наименование КАК Наименование + |ИЗ + | ВсеСертификаты КАК ВсеСертификаты + |ГДЕ + | ВсеСертификаты.Ссылка В + | (ВЫБРАТЬ + | ВсеСертификаты.Ссылка КАК Ссылка + | ИЗ + | ВсеСертификаты КАК ВсеСертификаты + | ГДЕ + | ВсеСертификаты.Пользователь = &Пользователь + | + | ОБЪЕДИНИТЬ ВСЕ + | + | ВЫБРАТЬ + | ВсеСертификаты.Ссылка + | ИЗ + | ВсеСертификаты КАК ВсеСертификаты + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Пользователи КАК СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи + | ПО + | ВсеСертификаты.Ссылка = СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи.Ссылка + | ГДЕ + | СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи.Пользователь = &Пользователь)"; Если ОтборПоОрганизации Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИСТИНА", "Сертификаты.Организация = &Организация"); - Запрос.УстановитьПараметр("Организация", ОтборСертификатов); КонецЕсли; + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь()); + Запрос.УстановитьПараметр("Отпечатки", ОтпечаткиСертификатовНаКлиенте); + Запрос.УстановитьПараметр("Организация", ОтборСертификатов); + Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл СписокВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование); @@ -2263,8 +2401,10 @@ КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; + ЭтоПрограммаОблачногоСервиса = ЗначенияРеквизитов.Программа = ПрограммаОблачногоСервиса(); + Если Форма.БезПодтверждения - И ЗначенияРеквизитов.Программа = ПрограммаОблачногоСервиса() Тогда + И ЭтоПрограммаОблачногоСервиса Тогда Свойства = Новый Структура("ОблачныйПарольПодтвержден", ОблачныйПарольПодтвержден(ДвоичныеДанныеСертификата)); @@ -2276,7 +2416,7 @@ Форма.СертификатОтпечаток = ЗначенияРеквизитов.Отпечаток; Форма.СертификатПрограмма = ЗначенияРеквизитов.Программа; - Форма.ВыполнятьВМоделиСервиса = ЗначенияРеквизитов.Программа.ЭтоПрограммаОблачногоСервиса; + Форма.ВыполнятьВМоделиСервиса = ЭтоПрограммаОблачногоСервиса; Форма.СертификатДействителенДо = ЗначенияРеквизитов.ДействителенДо; Форма.СертификатУсиленнаяЗащитаЗакрытогоКлюча = ЗначенияРеквизитов.УсиленнаяЗащитаЗакрытогоКлюча; diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl index b925ef10d..624530de7 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl @@ -19,6 +19,7 @@ ТаблицаСвойствСертификатов.Колонки.Добавить("НаСервере", Новый ОписаниеТипов("Булево")); ТаблицаСвойствСертификатов.Колонки.Добавить("ЭтоЗаявление", Новый ОписаниеТипов("Булево")); ТаблицаСвойствСертификатов.Колонки.Добавить("ВОблачномСервисе", Новый ОписаниеТипов("Булево")); + ТаблицаСвойствСертификатов.Колонки.Добавить("ТипРазмещения", Новый ОписаниеТипов("Число")); Для Каждого СвойстваСертификата Из СвойстваСертификатовНаКлиенте Цикл НоваяСтрока = ТаблицаСвойствСертификатов.Добавить(); @@ -54,6 +55,16 @@ КонецЕсли; + Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда + МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный"); + МассивСертификатов = МодульСервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатов(Ложь); + + ПараметрыДобавленияСвойств = Новый Структура("ОблачнаяПодпись", Истина); + + ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(ТаблицаСвойствСертификатов, МассивСертификатов, Истина, + ЭлектроннаяПодписьСлужебный.ДобавкаВремени(), ТекущаяДатаСеанса(), ПараметрыДобавленияСвойств); + КонецЕсли; + Возврат ОбработатьЛичныеСертификаты(ТаблицаСвойствСертификатов, Отбор); КонецФункции @@ -493,6 +504,24 @@ КонецФункции +Функция НастроенСервисОблачнойПодписи() Экспорт + + Результат = Ложь; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS"); + Результат = МодульСервисКриптографииDSS.ИспользоватьСервисОблачнойПодписи(); + КонецЕсли; + + Если Результат Тогда + ВсеУчетныеЗаписи = МодульСервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи(); + Результат = ВсеУчетныеЗаписи.Количество() > 0; + КонецЕсли; + + Возврат Результат; + +КонецФункции + #Область ДиагностикаЭлектроннойПодписи Процедура ДобавитьОписаниеДополнительныхДанных(ДополнительныеДанные, ОписаниеФайлов, Сведения) Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl index d2d56bf82..6a5d92997 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl @@ -475,7 +475,7 @@ ИначеЕсли ЭтоАдресВременногоХранилища(Контекст.ДанныеСертификата) Тогда Контекст.АдресСертификата = Контекст.ДанныеСертификата; Иначе - Отпечаток = Контекст.ДанныеСертификата; + Отпечаток = Строка(Контекст.ДанныеСертификата); // Строка КонецЕсли; Если Не Контекст.ОткрытьДанные Тогда @@ -495,7 +495,7 @@ И Ссылка = Неопределено Тогда ПолучитьСертификатПоОтпечатку(Новый ОписаниеОповещения( - "ОткрытьСертификатПослеПоискаСертификата", ЭтотОбъект, Контекст), Отпечаток, Ложь); + "ОткрытьСертификатПослеПоискаСертификата", ЭтотОбъект, Контекст), Отпечаток, Ложь, Неопределено); Иначе ОткрытьСертификатЗавершение(Контекст); КонецЕсли; @@ -506,9 +506,11 @@ Процедура ОткрытьСертификатПослеПоискаСертификата(Результат, Контекст) Экспорт Если ТипЗнч(Результат) = Тип("СертификатКриптографии") Тогда + Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура); Результат.НачатьВыгрузку(Новый ОписаниеОповещения( "ОткрытьСертификатПослеВыгрузкиНайденногоСертификата", ЭтотОбъект, Контекст)); Иначе + Контекст.Вставить("ОшибкаНаКлиенте", Результат); ОткрытьСертификатЗавершение(Контекст); КонецЕсли; @@ -530,6 +532,7 @@ ПараметрыФормы.Вставить("Ссылка", Контекст.Ссылка); ПараметрыФормы.Вставить("АдресСертификата", Контекст.АдресСертификата); ПараметрыФормы.Вставить("Отпечаток", Контекст.Отпечаток); + ПараметрыФормы.Вставить("ОшибкаНаКлиенте", Контекст.ОшибкаНаКлиенте); ОткрытьФорму("ОбщаяФорма.Сертификат", ПараметрыФормы); @@ -692,10 +695,10 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// СертификатКриптографии - найденный сертификат. -// Неопределено - сертификат не существует в хранилище. -// Строка - текст ошибки создания менеджера криптографии (или другая ошибка). -// Структура - описание ошибки в виде структуры. +// = СертификатКриптографии - найденный сертификат. +// = Неопределено - сертификат не существует в хранилище. +// = Строка - текст ошибки создания менеджера криптографии (или другая ошибка). +// = Структура - описание ошибки в виде структуры. // // Отпечаток - Строка - Base64 кодированный отпечаток сертификата. // ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде. @@ -851,9 +854,9 @@ // Получает отпечатки сертификатов пользователя ОС на компьютере. // // Параметры: -// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значение: -// * Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина; -// * Строка - текст ошибки создания менеджера криптографии (или другая ошибка). +// Оповещение - ОписаниеОповещения - вызывается для передачи возвращаемого значения одного из типов: +// = Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина, +// = Строка - текст ошибки создания менеджера криптографии (или другая ошибка). // // ТолькоЛичные - Булево - если Ложь, то к личным сертификатам добавляются сертификаты получателей. // @@ -897,16 +900,16 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// Булево - Истина, если проверка выполнена успешно. -// Строка - описание ошибки проверки подписи. -// Неопределено - не удалось получить менеджер криптографии (когда не указан). +// = Булево - Истина, если проверка выполнена успешно. +// = Строка - описание ошибки проверки подписи. +// = Неопределено - не удалось получить менеджер криптографии (когда не указан). // // ИсходныеДанные - ДвоичныеДанные - двоичные данные, которые были подписаны. // Математическая проверка выполняется на стороне клиента, даже когда // администратор настроил проверку электронных подписей на сервере, // если указан менеджер криптографии или его удалось получить без ошибки. -// Это повышает производительность, а также безопасность когда проверяется -// подпись в расшифрованном файле (он не будет передан на сервер). +// Это повышает производительность, а также безопасность когда проверяется подпись +// в расшифрованном файле (он не будет передан на сервер). // - Строка - адрес временного хранилища, содержащего исходные двоичные данные. // // Подпись - ДвоичныеДанные - двоичные данные электронной подписи. @@ -986,6 +989,9 @@ Если Результат = "СервисКриптографии" Тогда ПроверитьПодписьВМоделиСервиса(Контекст); Возврат; + ИначеЕсли Результат = "ОблачнаяПодпись" Тогда + ПроверитьПодписьОблачнаяПодпись(Контекст); + Возврат; ИначеЕсли ТипЗнч(Результат) = Тип("МенеджерКриптографии") Тогда МенеджерКриптографии = Результат; Иначе @@ -1000,6 +1006,8 @@ Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда ПроверитьПодписьВМоделиСервиса(Контекст); + ИначеЕсли ПроверятьСертификатыОблачнойПодписью() Тогда + ПроверитьПодписьОблачнаяПодпись(Контекст); Иначе ВыполнитьОбработкуОповещения(Контекст.Оповещение, Неопределено); КонецЕсли; @@ -1027,6 +1035,9 @@ Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда // Проверка подписи и сертификата в модели сервиса. ПроверитьПодписьВМоделиСервиса(Контекст); + ИначеЕсли ЭлектроннаяПодписьСлужебныйВызовСервера.НастроенСервисОблачнойПодписи() Тогда + // Проверка подписи в сервисе облачной подписи. + ПроверитьПодписьОблачнаяПодпись(Контекст); Иначе // Проверка подписи и сертификата на сервере. Если ТипЗнч(Контекст.ИсходныеДанные) = Тип("Строка") @@ -1107,6 +1118,7 @@ НачатьИнициализациюСертификатаКриптографииДляПроверкиПодписиCMS( Оповещения, + Контекст.ДанныеПодписи, Контекст.ИсходныеДанные.Данные, Контекст.ИсходныеДанные.ПараметрыCMS, Контекст.МенеджерКриптографии); @@ -1185,7 +1197,11 @@ ДатаПодписания = Контекст.НаДату; КонецЕсли; - ПроверитьСертификат(Контекст.Оповещение, Контекст.Сертификат, Контекст.МенеджерКриптографии, ДатаПодписания); + Если Контекст.МенеджерКриптографии = "ОблачнаяПодпись" Тогда + ПроверитьСертификат(Контекст.Оповещение, Контекст.Сертификат.Сертификат, Контекст.МенеджерКриптографии, ДатаПодписания); + Иначе + ПроверитьСертификат(Контекст.Оповещение, Контекст.Сертификат, Контекст.МенеджерКриптографии, ДатаПодписания); + КонецЕсли; КонецПроцедуры @@ -1193,9 +1209,9 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// Булево - Истина, если проверка выполнена успешно. -// Строка - описание ошибки проверки сертификата. -// Неопределено - не удалось получить менеджер криптографии (когда не указан). +// = Булево - Истина, если проверка выполнена успешно. +// = Строка - описание ошибки проверки сертификата. +// = Неопределено - не удалось получить менеджер криптографии (когда не указан). // // Сертификат - СертификатКриптографии - сертификат. // - ДвоичныеДанные - двоичные данные сертификата. @@ -1353,6 +1369,8 @@ Иначе Если Контекст.МенеджерКриптографии = "СервисКриптографии" Тогда ПроверитьСертификатВМоделиСервиса(Контекст); + ИначеЕсли Контекст.МенеджерКриптографии = "ОблачнаяПодпись" Тогда + ПроверитьСертификатОблачнаяПодпись(Контекст); Иначе ПроверитьСертификатПослеСозданияМенеджераКриптографии(Контекст.МенеджерКриптографии, Контекст); КонецЕсли; @@ -1366,6 +1384,8 @@ Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда ПроверитьСертификатВМоделиСервиса(Контекст); + ИначеЕсли ПроверятьСертификатыОблачнойПодписью() Тогда + ПроверитьСертификатОблачнаяПодпись(Контекст); Иначе Если ТипЗнч(Результат) = Тип("Структура") Тогда Контекст.ОписаниеОшибкиНаКлиенте = Результат; @@ -1398,6 +1418,8 @@ Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда ПроверитьСертификатВМоделиСервиса(Контекст); + ИначеЕсли ПроверятьСертификатыОблачнойПодписью() Тогда + ПроверитьСертификатОблачнаяПодпись(Контекст); Иначе ПроверитьСертификатПослеНеуспешнойПроверки(Контекст); КонецЕсли; @@ -1545,9 +1567,9 @@ // // Параметры: // Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов: -// МенеджерКриптографии - инициализированный менеджер криптографии. -// Строка - описание ошибки при создании менеджера криптографии. -// Структура - см. ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок +// = Строка - описание ошибки при создании менеджера криптографии. +// = Структура - см. ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок +// = МенеджерКриптографии - инициализированный менеджер криптографии. // // Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют // операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование, @@ -2294,8 +2316,15 @@ Контекст.Вставить("СерверныеПараметры", СерверныеПараметры); Контекст.Вставить("ОбработкаЗавершения", ОбработкаЗавершения); - ПолучитьОтпечаткиСертификатовНаКлиенте(Новый ОписаниеОповещения( - "ОткрытьНовуюФормуЗавершение", ЭтотОбъект, Контекст), ВидФормы = "РасшифровкаДанных"); + Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И СерверныеПараметры.Свойство("ВыполнятьНаСервере") + И СерверныеПараметры.ВыполнятьНаСервере = Истина Тогда + + ОткрытьНовуюФормуЗавершение(Новый Массив, Контекст); + Иначе + ПолучитьОтпечаткиСертификатовНаКлиенте(Новый ОписаниеОповещения( + "ОткрытьНовуюФормуЗавершение", ЭтотОбъект, Контекст), ВидФормы = "РасшифровкаДанных"); + КонецЕсли; КонецПроцедуры @@ -2436,8 +2465,19 @@ Контекст.Вставить("ВладелецНовойФормы", ВладелецНовойФормы); Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); - ПолучитьСвойстваСертификатовНаКлиенте(Новый ОписаниеОповещения( - "ВыборСертификатаДляПодписанияИлиРасшифровкиПродолжение", ЭтотОбъект, Контекст), Истина, Ложь); + Если ЭлектроннаяПодписьКлиент.СоздаватьЭлектронныеПодписиНаСервере() + И СерверныеПараметры.Свойство("ВыполнятьНаСервере") + И СерверныеПараметры.ВыполнятьНаСервере = Истина Тогда + + Результат = Новый Структура; + Результат.Вставить("СвойстваСертификатовНаКлиенте", Новый Массив); + Результат.Вставить("ОшибкаПолученияСертификатовНаКлиенте", Новый Структура); + + ВыборСертификатаДляПодписанияИлиРасшифровкиПродолжение(Результат, Контекст); + Иначе + ПолучитьСвойстваСертификатовНаКлиенте(Новый ОписаниеОповещения( + "ВыборСертификатаДляПодписанияИлиРасшифровкиПродолжение", ЭтотОбъект, Контекст), Истина, Ложь); + КонецЕсли; КонецПроцедуры @@ -2564,11 +2604,11 @@ // представление вычисляется по значению свойства Объект. // * Объект - ЛюбаяСсылка - ссылка на объект с табличной частью ЭлектронныеПодписи, // из которой нужно получить список подписей. -// * --// -- - Строка - адрес временного хранилища массива подписей с составом свойств, +// - Строка - адрес временного хранилища массива подписей с составом свойств, // как возвращает процедура ДобавитьПодписьИзФайла. // * Данные - ОписаниеОповещения - обработчик сохранения данных и получения полного имени // файла с путем (после его сохранения), возвращаемое в свойстве ПолноеИмяФайла -// типа Строка для сохранения электронных подписей (см. выше общий подход). +// типа Строка для сохранения электронных подписей (смотри выше общий подход). // Если расширение для работы с файлами не подключено, то нужно вернуть // имя файла без пути. // Если свойство не будет вставлено или заполнено - это считается отказом @@ -2576,16 +2616,15 @@ // // Для пакетного запроса разрешений у пользователя веб-клиента на сохранение файла данных // и подписей, нужно вставить параметр ОбработкаЗапросаРазрешений типа ОписаниеОповещения. -// В процедуру будет передана Структура с параметрами: -// * Вызовы - Массив - с описанием вызовов для сохранения подписей. -// * ОбработкаПродолжения - ОписаниеОповещения - оповещение, которое нужно выполнить -// после запроса разрешений, - параметры процедуры как у -// оповещения для метода НачатьЗапросРазрешенияПользователя. -// Если разрешение не получено, значит все отменено. +// В процедуру будет передана Структура: +// # Вызовы - Массив - с описанием вызовов для сохранения подписей. +// # ОбработкаПродолжения - ОписаниеОповещения - оповещение, которое нужно выполнить +// после запроса разрешений, - параметры процедуры как у +// оповещения для метода НачатьЗапросРазрешенияПользователя. +// Если разрешение не получено, значит все отменено. // -// ОбработкаРезультата - ОписаниеОповещения - -// В результат передается параметр: -// * Булево - Истина, если все прошло успешно. +// ОбработкаРезультата - ОписаниеОповещения - в результат передается параметр: +// Булево - Истина, если все прошло успешно. // Процедура СохранитьДанныеВместеСПодписью(ОписаниеДанных, ОбработкаРезультата = Неопределено) Экспорт @@ -3027,22 +3066,7 @@ КонецПроцедуры -// Показывает диалог установки расширения для работы с электронной подписью и шифрованием. -// -// Параметры: -// БезВопроса - Булево - если указано Истина, тогда вопроса показано не будет. -// Требуется, если пользователь нажал на кнопку Установить расширение. -// -// ОбработчикРезультата - ОписаниеОповещения - описание процедуры, принимающей результат выбора. -// ТекстВопроса - Строка - текст вопроса. -// ЗаголовокВопроса - Строка - заголовок вопроса. -// -// Значение первого параметра, возвращаемого в обработчик вызывающего кода: -// РасширениеУстановлено -// * Истина - Пользователь подтвердил установку, после установки расширение было успешно подключено. -// * Ложь - Пользователь подтвердил установку, однако после установки расширение не удалось подключить. -// * Неопределено - Пользователь отказался от установки. -// +// См. ЭлектроннаяПодписьКлиент.УстановитьРасширение Процедура УстановитьРасширение(БезВопроса, ОбработчикРезультата = Неопределено, ТекстВопроса = "", ЗаголовокВопроса = "") Экспорт Контекст = Новый Структура; @@ -3170,7 +3194,8 @@ Процедура ПродолжитьОткрытиеНачалоПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") - И Не ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + И Не ИспользоватьЭлектроннуюПодписьВМоделиСервиса() + И Не ИспользоватьСервисОблачнойПодписи() Тогда ПоказатьОшибкуОбращенияКПрограмме( НСтр("ru = 'Требуется программа электронной подписи и шифрования'"), @@ -3363,6 +3388,15 @@ Или ДополнительныеПараметры.ПарольВПамяти Или ДополнительныеПараметры.ПриУстановкеПароляИзДругойОперации); + ЗначенияФормы = Новый Структура("ПодтверждениеТипОперации, ДанныеСертификата"); + ЗаполнитьЗначенияСвойств(ЗначенияФормы, Форма); + Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеПараметры, "ПриОткрытии", Ложь) + И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ЗначенияФормы.ДанныеСертификата, "Облачный", Ложь) Тогда + УбратьПароль = ДополнительныеПараметры.ПарольВПамяти; + Элементы.Страницы.Видимость = НЕ УбратьПароль; + ЭлементПароль.Видимость = НЕ УбратьПароль; + КонецЕсли; + КонецПроцедуры // Только для внутреннего использования. @@ -3467,13 +3501,20 @@ ЗаполнитьЗначенияСвойств(Контекст, ПараметрыВыполнения); + СвойстваОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(Контекст.ОписаниеДанных); + ИспользоватьОблачнуюПодпись = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыВыполнения, "ИспользоватьОблачнуюПодпись", Истина); + Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("Операция", Операция); // Подписание, Шифрование, Расшифровка. Контекст.Вставить("НаСторонеКлиента", СторонаВыполнения = "НаСторонеКлиента"); Контекст.Вставить("ОперацияНачалась", Ложь); + Контекст.Вставить("ИспользоватьОблачнуюПодпись", ИспользоватьОблачнуюПодпись); Если Контекст.НаСторонеКлиента Тогда - Если Контекст.Операция = "Шифрование" И ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Если ЗначениеЗаполнено(СвойстваОблачнойПодписи.УчетнаяЗапись) Тогда + Контекст.Вставить("МенеджерКриптографии", "ОблачнаяПодпись"); + ВыполнитьНаСторонеОблачнойПодписи(Контекст); + ИначеЕсли Контекст.Операция = "Шифрование" И ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда Контекст.Вставить("МенеджерКриптографии", "СервисКриптографии"); ВыполнитьНаСторонеВМоделиСервиса(Null, Контекст); ИначеЕсли (Контекст.Операция = "Расшифровка" Или Контекст.Операция = "Подписание") @@ -3503,8 +3544,15 @@ Процедура ВыполнитьНаСторонеПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда - ВыполнитьОбработкуОповещения(Контекст.Оповещение, Новый Структура("Ошибка", Результат)); - Возврат; + Если Контекст.Операция = "Шифрование" + И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "ИспользоватьОблачнуюПодпись", Истина) = Истина + И ШифроватьДанныеОблачнойПодписью() Тогда + Контекст.Вставить("МенеджерКриптографии", "ОблачнаяПодпись"); + ВыполнитьНаСторонеОблачнойПодписи(Контекст); + Иначе + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Новый Структура("Ошибка", Результат)); + Возврат; + КонецЕсли; КонецЕсли; Контекст.Вставить("МенеджерКриптографии", Результат); @@ -3804,7 +3852,10 @@ "ВыполнитьНаСторонеЦиклПослеОперацииНаКлиенте", ЭтотОбъект, Контекст, "ВыполнитьНаСторонеЦиклПослеОшибкиОперацииНаКлиенте", ЭтотОбъект); - Если Контекст.Операция = "Подписание" Тогда + Если МенеджерКриптографии = "ОблачнаяПодпись" Тогда + ВыполнитьОперациюОблачнойПодписи(Оповещение, Контекст, Данные, ПараметрыОперации); + + ИначеЕсли Контекст.Операция = "Подписание" Тогда Если МенеджерКриптографии = "СервисКриптографии" Тогда СертификатДляПодписи = ПолучитьИзВременногоХранилища(Контекст.ОписаниеДанных.ВыбранныйСертификат.Данные); @@ -3929,6 +3980,27 @@ ДвоичныеДанные = ДвоичныеДанные.РасшифрованныеДанные; КонецЕсли; + ИначеЕсли Контекст.Свойство("МенеджерКриптографии") И Контекст.МенеджерКриптографии = "ОблачнаяПодпись" Тогда + + Если Не ДвоичныеДанные.Выполнено Тогда + Если ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "ИспользоватьОблачнуюПодпись", Ложь) Тогда + Контекст.Вставить("ИспользоватьОблачнуюПодпись", Ложь); + ВыполнитьНаСтороне(Контекст.Оповещение, Контекст.Операция, "НаСторонеКлиента", Контекст); + Иначе + ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ДвоичныеДанные.Ошибка); + ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст); + КонецЕсли; + Возврат; + КонецЕсли; + + Если Контекст.Операция = "Подписание" Тогда + ДвоичныеДанные = ДвоичныеДанные.Результат; + ИначеЕсли Контекст.Операция = "Шифрование" Тогда + ДвоичныеДанные = ДвоичныеДанные.Результат; + Иначе + ДвоичныеДанные = ДвоичныеДанные.Результат; + КонецЕсли; + КонецЕсли; ОписаниеОшибки = ""; @@ -3945,17 +4017,21 @@ Контекст.ОперацияНачалась = Истина; Если Контекст.Операция = "Подписание" Тогда - СвойстваПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи(ДвоичныеДанные, - Контекст.СвойстваСертификата, - Контекст.Форма.Комментарий, - ПользователиКлиент.АвторизованныйПользователь()); - - Если Контекст.СертификатВерен <> Неопределено Тогда - СвойстваПодписи.ДатаПодписи = ОбщегоНазначенияКлиент.ДатаСеанса(); - СвойстваПодписи.ДатаПроверкиПодписи = СвойстваПодписи.ДатаПодписи; - СвойстваПодписи.ПодписьВерна = Контекст.СертификатВерен; + Если ТипЗнч(ДвоичныеДанные) = Тип("Массив") Тогда + ВыполнитьНаСторонеЦиклПослеПодписанияПакета(ДвоичныеДанные, Контекст); + Иначе + СвойстваПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи(ДвоичныеДанные, + Контекст.СвойстваСертификата, + Контекст.Форма.Комментарий, + ПользователиКлиент.АвторизованныйПользователь()); + + Если Контекст.СертификатВерен <> Неопределено Тогда + СвойстваПодписи.ДатаПодписи = ОбщегоНазначенияКлиент.ДатаСеанса(); + СвойстваПодписи.ДатаПроверкиПодписи = СвойстваПодписи.ДатаПодписи; + СвойстваПодписи.ПодписьВерна = Контекст.СертификатВерен; + КонецЕсли; + ВыполнитьНаСторонеЦиклПослеПодписания(СвойстваПодписи, Контекст); КонецЕсли; - ВыполнитьНаСторонеЦиклПослеПодписания(СвойстваПодписи, Контекст); ИначеЕсли Контекст.Операция = "Шифрование" Тогда ВыполнитьНаСторонеЦиклПослеШифрования(ДвоичныеДанные, Контекст); @@ -4455,16 +4531,26 @@ КонецПроцедуры // Начинает проверку подписи CMS сообщения. -// -// Параметры: -// ОповещенияПриЗавершении - ОписаниеОповещения - процедура, которая будет вызвана после подписания сообщения. -// КонвертSOAP - Строка - шаблон подписываемого сообщения. -// ДанныеАлгоритмаПодписания - Структура: -// МенеджерКриптографии - МенеджерКриптографии. -// -Процедура НачатьИнициализациюСертификатаКриптографииДляПроверкиПодписиCMS(ОповещенияПриЗавершении, КонвертSOAP, ДанныеАлгоритмаПодписания, МенеджерКриптографии) +Процедура НачатьИнициализациюСертификатаКриптографииДляПроверкиПодписиCMS(ОповещенияПриЗавершении, Подпись, Данные, ПараметрыCMS, МенеджерКриптографии) - ВызватьИсключение НСтр("ru = 'Проверка подписи CMS не поддерживается в компоненте XMLDSig.'"); + Контекст = Новый Структура; + Контекст.Вставить("Режим", "РежимПроверка"); + Контекст.Вставить("ТипПодписи", "CMS"); + Контекст.Вставить("ОповещенияПриЗавершении", ОповещенияПриЗавершении); + Контекст.Вставить("УстанавливатьКомпоненту", Истина); + + Контекст.Вставить("Данные", Данные); + Контекст.Вставить("Подпись", Подпись); + Контекст.Вставить("ПараметрыCMS", ПараметрыCMS); + + Контекст.Вставить("СертификатКриптографии", Неопределено); + Контекст.Вставить("МенеджерКриптографии", МенеджерКриптографии); + + Контекст.Вставить("ТипКриптопровайдера", Неопределено); + Контекст.Вставить("ИмяКриптопровайдера", Неопределено); + Контекст.Вставить("ПутьКриптопровайдера", Неопределено); + + НачатьПроверкуПодписиПослеИнициализацииСертификата(Неопределено, Контекст); КонецПроцедуры @@ -4472,13 +4558,24 @@ Контекст.СертификатКриптографии = СертификатКриптографии; + ПодключитьКомпоненту(Контекст, + ?(Контекст.ТипПодписи = "CMS", + НСтр("ru = 'Для проверки подписи CMS необходима установка компоненты XMLDSig'"), + НСтр("ru = 'Для проверки подписи XML необходима установка компоненты XMLDSig'"))); + +КонецПроцедуры + +Процедура ПодключитьКомпоненту(Контекст, ТекстПояснения) + ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); - ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для подписания XML необходима установка компоненты XMLDSig'"); + ПараметрыПодключения.ТекстПояснения = ТекстПояснения; + + ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты(); ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета( Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект, Контекст), - "XMLDSignAddIn", - "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Макет.КомпонентаXMLDSig", + ОписаниеКомпоненты.ИмяОбъекта, + ОписаниеКомпоненты.ПолноеИмяМакета, ПараметрыПодключения); КонецПроцедуры @@ -4487,8 +4584,7 @@ Если Результат.Подключено Тогда Контекст.Вставить("ОбъектКомпоненты", Результат.ПодключаемыйМодуль); - Контекст.МенеджерКриптографии.НачатьПолучениеИнформацииМодуляКриптографии( - Новый ОписаниеОповещения("ПослеПолученияИнформацииМодуляКриптографии", ЭтотОбъект, Контекст)); + ПослеПодключенияКомпонентыНастроитьКомпоненту(Контекст); Иначе Если ПустаяСтрока(Результат.ОписаниеОшибки) Тогда @@ -4514,6 +4610,32 @@ КонецПроцедуры +Процедура ПослеПодключенияКомпонентыНастроитьКомпоненту(Контекст) + + Контекст.ОбъектКомпоненты.НачатьУстановкуСоответствиеOID(Новый ОписаниеОповещения( + "ПослеПодключенияКомпонентыПослеУстановкиСоответствиеOID", ЭтотОбъект, Контекст, + "ПослеПодключенияКомпонентыПослеОшибкиУстановкиСоответствиеOID", ЭтотОбъект), + ЭлектроннаяПодписьСлужебныйКлиентСервер.ИдентификаторыАлгоритмовХешированияИОткрытогоКлюча()); + +КонецПроцедуры + +Процедура ПослеПодключенияКомпонентыПослеУстановкиСоответствиеOID(Контекст) Экспорт + + Контекст.МенеджерКриптографии.НачатьПолучениеИнформацииМодуляКриптографии( + Новый ОписаниеОповещения("ПослеПолученияИнформацииМодуляКриптографии", ЭтотОбъект, Контекст)); + +КонецПроцедуры + +Процедура ПослеПодключенияКомпонентыПослеОшибкиУстановкиСоответствиеOID(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + + ЗавершитьОперациюСОшибкой(Контекст, + НСтр("ru = 'При установке свойства СоответствиеOID компоненты XMLDSig произошла ошибка:'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + +КонецПроцедуры + // Параметры: // ИнформацияМодуляКриптографии - ИнформацияМодуляКриптографии // Контекст - Структура @@ -4580,9 +4702,8 @@ ИначеЕсли Контекст.ТипПодписи = "CMS" Тогда Если Контекст.Режим = "РежимПроверка" Тогда - ЗавершитьОперациюСОшибкой( - Контекст, - НСтр("ru = 'Проверка подписи CMS не поддерживается в компоненте XMLDSig.'")); + НачатьПроверкуПодписиCMS(Контекст); + ИначеЕсли Контекст.Режим = "РежимПодписание" Тогда НачатьПодписаниеCMS(Контекст); Иначе @@ -4610,14 +4731,8 @@ Контекст.СертификатКриптографииBase64 = СертификатКриптографииBase64; - ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); - ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для подписания XML необходима установка компоненты XMLDSig'"); - - ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета( - Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект, Контекст), - "XMLDSignAddIn", - "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Макет.КомпонентаXMLDSig", - ПараметрыПодключения); + ПодключитьКомпоненту(Контекст, + НСтр("ru = 'Для подписания XML необходима установка компоненты XMLDSig'")); КонецПроцедуры @@ -4627,14 +4742,8 @@ Контекст.СертификатКриптографииBase64 = СертификатКриптографииBase64; - ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); - ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для подписания CMS необходима установка компоненты XMLDSig'"); - - ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета( - Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект, Контекст), - "XMLDSignAddIn", - "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Макет.КомпонентаXMLDSig", - ПараметрыПодключения); + ПодключитьКомпоненту(Контекст, + НСтр("ru = 'Для подписания CMS необходима установка компоненты XMLDSig'")); КонецПроцедуры @@ -4684,6 +4793,64 @@ КонецПроцедуры +Процедура НачатьПроверкуПодписиCMS(Контекст) + + ПараметрыCMSSign = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыКомпонентыCMSSign(Контекст.ПараметрыCMS, Контекст.Данные); + Попытка + + ОписаниеОповещения = Новый ОписаниеОповещения( + "Проверка_ПослеВыполненияCMSVerifySign", ЭтотОбъект, Контекст, + "Проверка_ПослеВыполненияCMSVerifySign_Ошибка", ЭтотОбъект); + + Контекст.ОбъектКомпоненты.НачатьВызовCMSVerifySign( + ОписаниеОповещения, + Контекст.Подпись, + ПараметрыCMSSign.Открепленная, + Контекст.Данные, + Контекст.ТипКриптопровайдера, + Null); + + Исключение + + ЗавершитьОперациюСОшибкой( + Контекст, + НСтр("ru = 'Ошибка вызова метода CMSVerifySign компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + +КонецПроцедуры + +Процедура Проверка_ПослеВыполненияCMSVerifySign_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + + ЗавершитьОперациюСОшибкой( + Контекст, + НСтр("ru = 'Ошибка вызова метода CMSVerifySign компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + +КонецПроцедуры + +Процедура Проверка_ПослеВыполненияCMSVerifySign(ПодписьВерна, Параметры, Контекст) Экспорт + + Если ПодписьВерна <> Истина Тогда + НачатьПолучениеТекстаОшибки(НСтр("ru = 'При выполнении метода CMSVerifySign произошла ошибка:'"), Контекст); + Возврат; + КонецЕсли; + + Если ТипЗнч(Параметры[4]) = Тип("ДвоичныеДанные") Тогда + Контекст.СертификатКриптографии = Параметры[4]; + Иначе + ЗавершитьОперациюСОшибкой( + Контекст, + НСтр("ru = 'Подпись верна, но не содержит данных сертификата.'")); + Возврат; + КонецЕсли; + + ЭлектроннаяПодписьКлиент.ДатаПодписания( + Новый ОписаниеОповещения("Проверка_ПослеВыполненияHash_ПодписываемыйТегПослеПолученияДатыПодписания", ЭтотОбъект, Контекст), Контекст.Подпись); + +КонецПроцедуры + Процедура НачатьПодписаниеXMLDSig(Контекст) ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПроверитьВыбратьАлгоритмПодписи( @@ -4941,7 +5108,7 @@ ЗавершитьОперациюСОшибкой( Контекст, - НСтр("ru = 'Подпись не верна (SignatureValue некорректно).'")); + НСтр("ru = 'Подпись неверна (SignatureValue некорректно).'")); Иначе @@ -5032,7 +5199,7 @@ ЗавершитьОперациюСОшибкой( Контекст, - НСтр("ru = 'Подпись не верна (SignatureValue корректно, отличается DigestValue).'")); + НСтр("ru = 'Подпись неверна (SignatureValue корректно, отличается DigestValue).'")); Иначе @@ -5802,24 +5969,558 @@ #КонецОбласти +#Область ОперацииСОблачнойПодписью + +Процедура ВыполнитьНаСторонеОблачнойПодписи(Контекст) + + ОписаниеДанных = Контекст.ОписаниеДанных; + + Контекст.Вставить("СертификатКриптографии", Null); + + Если Контекст.Операция = "Подписание" Тогда + + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + ВыбранныйСертификат = ОписаниеДанных.ВыбранныйСертификат; + + Отпечаток = Новый Структура(); + Отпечаток.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(ВыбранныйСертификат.Отпечаток)); + Отпечаток.Вставить("ДвоичныеДанные", ПолучитьИзВременногоХранилища(ВыбранныйСертификат.Данные)); + + СвойстваОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных); + НашлиСертификат = МодульСервисКриптографииDSSКлиентСервер.НайтиСертификат(СвойстваОблачнойПодписи.УчетнаяЗапись, Отпечаток); + + Если НашлиСертификат.Идентификатор = -1 Тогда + Ошибка = Новый Структура("ОписаниеОшибки", + ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиПолученияДанных(Контекст.Операция) + Символы.ПС + + НСтр("ru = 'Сертификат отсутствует в сервисе ""Облачная подпись"" (возможно удален).'")); + Контекст.Вставить("ОперацияНачалась", Ложь); + ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст); + Возврат; + КонецЕсли; + + НашлиСертификат.Вставить("ДвоичныеДанные", Отпечаток.ДвоичныеДанные); + + Контекст.Вставить("СвойстваСертификата", НашлиСертификат); + + ИначеЕсли Контекст.Операция = "Шифрование" Тогда + СвойстваСертификатов = ОписаниеДанных.СертификатыШифрования; + Если ТипЗнч(СвойстваСертификатов) = Тип("Строка") Тогда + СвойстваСертификатов = ПолучитьИзВременногоХранилища(СвойстваСертификатов); + КонецЕсли; + + СертификатыШифрования = Новый Массив; + + Для каждого СтрокаМассива Из СвойстваСертификатов Цикл + СертификатыШифрования.Добавить(СтрокаМассива); + КонецЦикла; + + Контекст.Вставить("Индекс", СертификатыШифрования.Количество()); + Контекст.Вставить("СвойстваСертификатов", СвойстваСертификатов); + Контекст.Вставить("СертификатыШифрования", СертификатыШифрования); + + КонецЕсли; + + ВыполнитьНаСторонеЦиклЗапуск(Контекст); + +КонецПроцедуры + +Процедура ВыполнитьОперациюОблачнойПодписи(Оповещение, Контекст, Данные, ПараметрыОперации) + + ОписаниеДанных = Контекст.ОписаниеДанных; + ИндексДанных = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Контекст, "Индекс", 0); + ВыполнитьСразу = Истина; + ТипРезультата = Неопределено; + + Если Контекст.Операция = "Подписание" Тогда + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + ЗначениеПинКода = ?(ЗначениеЗаполнено(Контекст.ЗначениеПароля), Контекст.ЗначениеПароля, Неопределено); + ПинКод = МодульСервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ЗначениеПинКода); + СвойстваОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных); + ДанныеПодтверждения = СвойстваОблачнойПодписи.ДанныеПодтверждения; + ПараметрыОперации.Вставить("ПинКод", ПинКод); + + ИдентификаторТранзакции = Неопределено; + Если ДанныеПодтверждения <> Неопределено Тогда + ИдентификаторТранзакции = ДанныеПодтверждения.ИдентификаторТранзакции; + ПакетнаяОперация = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПакетнаяОперация; + ТипРезультата = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ТипРезультата; + Если ЗначениеЗаполнено(ИдентификаторТранзакции) + И ИндексДанных > 0 + И НЕ ПакетнаяОперация Тогда + ВыполнитьСразу = Ложь; + КонецЕсли; + ПараметрыОперации.Вставить("ИдентификаторТранзакции", ИдентификаторТранзакции); + ПараметрыОперации.Вставить("ПакетнаяПодпись", ПакетнаяОперация); + КонецЕсли; + + Если ВыполнитьСразу Тогда + Если ЗначениеЗаполнено(ИдентификаторТранзакции) Тогда + ПодписатьОблачнаяПодпись(Оповещение, Контекст, Неопределено, ПараметрыОперации, ТипРезультата); + ИначеЕсли СвойстваОблачнойПодписи.ДанныеПакета = Неопределено Тогда + ПодписатьОблачнаяПодпись(Оповещение, Контекст, Данные, ПараметрыОперации, ТипРезультата); + Иначе + ПодписатьОблачнаяПодпись(Оповещение, Контекст, СвойстваОблачнойПодписи.ДанныеПакета, ПараметрыОперации, ТипРезультата); + КонецЕсли; + КонецЕсли; + + ИначеЕсли Контекст.Операция = "Шифрование" Тогда + ШифроватьОблачнаяПодпись(Оповещение, Контекст, Данные, ПараметрыОперации, ТипРезультата); + + ИначеЕсли Контекст.Операция = "Расшифровка" Тогда + ТипРезультата = Неопределено; + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + ЗначениеПинКода = ?(ЗначениеЗаполнено(Контекст.ЗначениеПароля), Контекст.ЗначениеПароля, Неопределено); + ПинКод = МодульСервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(Контекст.ЗначениеПароля); + СвойстваОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных); + ДанныеПодтверждения = СвойстваОблачнойПодписи.ДанныеПодтверждения; + ПараметрыОперации.Вставить("ПинКод", ПинКод); + + Если ДанныеПодтверждения <> Неопределено Тогда + ТипРезультата = ДанныеПодтверждения.ПараметрыВариантаВстроенного.ТипРезультата; + Если ЗначениеЗаполнено(ДанныеПодтверждения.ИдентификаторТранзакции) + И ИндексДанных > 0 Тогда + ВыполнитьСразу = Ложь; + КонецЕсли; + ПараметрыОперации.Вставить("ИдентификаторТранзакции", ДанныеПодтверждения.ИдентификаторТранзакции); + КонецЕсли; + + Если ВыполнитьСразу Тогда + РасшифроватьОблачнаяПодпись(Оповещение, Контекст, Данные, ПараметрыОперации, ТипРезультата); + КонецЕсли; + + КонецЕсли; + + Если НЕ ВыполнитьСразу Тогда + ПараметрыПодтверждения = Новый Структура(); + ПараметрыПодтверждения.Вставить("Оповещение", Оповещение); + ПараметрыПодтверждения.Вставить("Контекст", Контекст); + ПараметрыПодтверждения.Вставить("Данные", Данные); + ПараметрыПодтверждения.Вставить("ПараметрыОперации", ПараметрыОперации); + ПараметрыПодтверждения.Вставить("ТипРезультата", ТипРезультата); + + ОповещениеПриВыполнении = Новый ОписаниеОповещения("ВыполнитьОперациюОблачнойПодписиПослеПодтверждения", ЭтотОбъект, ПараметрыПодтверждения); + УстановитьСвойстваОблачнойПодписи(Контекст.ОписаниеДанных, + Новый Структура("ОповещениеПриПодтверждении", ОповещениеПриВыполнении)); + + МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент"); + МодульСервисКриптографииDSSПодтверждениеКлиент.ВыполнитьНачальнуюОперациюСервиса( + Контекст.Форма, + Контекст.ОписаниеДанных, + Контекст.ЗначениеПароля, + ИндексДанных); + КонецЕсли; + +КонецПроцедуры + +Процедура ВыполнитьОперациюОблачнойПодписиПослеПодтверждения(РезультатВыполнения, ВходящийКонтекст) Экспорт + + Контекст = ВходящийКонтекст.Контекст; + + Если Контекст.Операция = "Подписание" Тогда + ПодписатьОблачнаяПодпись(ВходящийКонтекст.Оповещение, ВходящийКонтекст.Контекст, ВходящийКонтекст.Данные, ВходящийКонтекст.ПараметрыОперации, ВходящийКонтекст.ТипРезультата); + ИначеЕсли Контекст.Операция = "Расшифровка" Тогда + РасшифроватьОблачнаяПодпись(ВходящийКонтекст.Оповещение, ВходящийКонтекст.Контекст, ВходящийКонтекст.Данные, ВходящийКонтекст.ПараметрыОперации, ВходящийКонтекст.ТипРезультата); + КонецЕсли; + +КонецПроцедуры + +Процедура ПодписатьОблачнаяПодпись(Оповещение, Контекст, Данные, ПараметрыОперации, ТипРезультата = Неопределено) + + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + СвойствоПодписи = МодульСервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS(Истина, Ложь); + + Если ТипРезультата <> Неопределено Тогда + ПараметрыОперации.Вставить("ТрансформироватьРезультат", Новый Структура("ТипРезультата", ТипРезультата)); + КонецЕсли; + + СвойстваОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(Контекст.ОписаниеДанных); + + МодульСервисКриптографииDSSКлиент.Подписать( + Оповещение, + СвойстваОблачнойПодписи.УчетнаяЗапись, + Данные, + СвойствоПодписи, + Контекст.СвойстваСертификата, + ПараметрыОперации); + +КонецПроцедуры + +Процедура ШифроватьОблачнаяПодпись(Оповещение, Контекст, Данные, ПараметрыОперации, ТипРезультата = Неопределено) + + Если ТипРезультата <> Неопределено Тогда + ПараметрыОперации.Вставить("ТрансформироватьРезультат", Новый Структура("ТипРезультата", ТипРезультата)); + КонецЕсли; + + СвойстваОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(Контекст.ОписаниеДанных); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.Зашифровать( + Оповещение, + СвойстваОблачнойПодписи.УчетнаяЗапись, + Данные, + Контекст.СертификатыШифрования, + "CMS", + ПараметрыОперации); + +КонецПроцедуры + +Процедура РасшифроватьОблачнаяПодпись(Оповещение, Контекст, Данные, ПараметрыОперации, ТипРезультата = Неопределено) + + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + + Если ТипРезультата <> Неопределено Тогда + ПараметрыОперации.Вставить("ТрансформироватьРезультат", Новый Структура("ТипРезультата", ТипРезультата)); + КонецЕсли; + + Сертификат = Новый Структура("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(Контекст.ОписаниеДанных.ВыбранныйСертификат.Отпечаток)); + СвойстваОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(Контекст.ОписаниеДанных); + + МодульСервисКриптографииDSSКлиент.Расшифровать( + Оповещение, + СвойстваОблачнойПодписи.УчетнаяЗапись, + Данные, + "CMS", + Сертификат, + ПараметрыОперации); + +КонецПроцедуры + +Процедура ВыполнитьНаСторонеЦиклПослеПодписанияПакета(МассивПодписей, Контекст) + + ОшибкаНаКлиенте = Неопределено; + + Для Счетчик = 0 По МассивПодписей.Количество() - 1 Цикл + + ДвоичныеДанные = МассивПодписей[Счетчик]; + + СвойстваПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи(ДвоичныеДанные, + Контекст.СвойстваСертификата, + Контекст.Форма.Комментарий, + ПользователиКлиент.АвторизованныйПользователь()); + + Если Контекст.СертификатВерен <> Неопределено Тогда + СвойстваПодписи.ДатаПодписи = ОбщегоНазначенияКлиент.ДатаСеанса(); + СвойстваПодписи.ДатаПроверкиПодписи = СвойстваПодписи.ДатаПодписи; + СвойстваПодписи.ПодписьВерна = Контекст.СертификатВерен; + КонецЕсли; + + ЭлементДанных = Контекст.ОписаниеДанных.НаборДанных[Счетчик]; + ЭлементДанных.Вставить("СвойстваПодписи", СвойстваПодписи); + + Если Не ЭлементДанных.Свойство("Объект") Тогда + ЭлектроннаяПодписьСлужебныйВызовСервера.ЗарегистрироватьПодписаниеДанныхВЖурнале( + СвойстваТекущегоЭлементаДанных(Контекст, СвойстваПодписи)); + Продолжить; + КонецЕсли; + + Если ТипЗнч(ЭлементДанных.Объект) <> Тип("ОписаниеОповещения") Тогда + ВерсияОбъекта = Неопределено; + ЭлементДанных.Свойство("ВерсияОбъекта", ВерсияОбъекта); + ПредставлениеОшибки = ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьПодпись( + ЭлементДанных.Объект, СвойстваПодписи, Контекст.ИдентификаторФормы, ВерсияОбъекта); + Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда + ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ПредставлениеОшибки); + ЭлементДанных.Удалить("СвойстваПодписи"); + Продолжить; + КонецЕсли; + ОповеститьОбИзменении(ЭлементДанных.Объект); + + Иначе // сделать отдельную ветку для возврата в цикл по счетчику + ЭлектроннаяПодписьСлужебныйВызовСервера.ЗарегистрироватьПодписаниеДанныхВЖурнале( + СвойстваТекущегоЭлементаДанных(Контекст, СвойстваПодписи)); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОписаниеДанных", Контекст.ОписаниеДанных); + ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения( + "ВыполнитьНаСторонеЦиклПослеЗаписиПодписи", ЭтотОбъект, Контекст)); + + Попытка + ВыполнитьОбработкуОповещения(ЭлементДанных.Объект, ПараметрыВыполнения); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + + КонецЕсли; + + КонецЦикла; + + Если ОшибкаНаКлиенте <> Неопределено Тогда + ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст); + Иначе + Контекст.Индекс = 0; + ВыполнитьНаСторонеПослеЦикла(Неопределено, Контекст); + КонецЕсли; + +КонецПроцедуры + +Функция ПроверятьСертификатыОблачнойПодписью() + + Результат = ИспользоватьСервисОблачнойПодписи() + И ЭлектроннаяПодписьСлужебныйВызовСервера.НастроенСервисОблачнойПодписи(); + Результат = Ложь; + + Возврат Результат; + +КонецФункции + +Функция ШифроватьДанныеОблачнойПодписью() + + Результат = ИспользоватьСервисОблачнойПодписи() + И ЭлектроннаяПодписьСлужебныйВызовСервера.НастроенСервисОблачнойПодписи(); + Результат = Ложь; + + Возврат Результат; + +КонецФункции + +// Продолжение процедуры ПроверитьСертификат. +Процедура ПроверитьСертификатОблачнаяПодпись(Контекст) + + Если ТипЗнч(Контекст.Сертификат) = Тип("СертификатКриптографии") Тогда + Контекст.Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения( + "ПроверитьСертификатОблачнаяПодписьПослеВыгрузкиСертификата", ЭтотОбъект, Контекст)); + ИначеЕсли ТипЗнч(Контекст.Сертификат) = Тип("Структура") Тогда + ПроверитьСертификатОблачнаяПодписьПослеВыгрузкиСертификата(Контекст.Сертификат.Сертификат, Контекст); + Иначе + ПроверитьСертификатОблачнаяПодписьПослеВыгрузкиСертификата(Контекст.Сертификат, Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьСертификат. +Процедура ПроверитьСертификатОблачнаяПодписьПослеВыгрузкиСертификата(Сертификат, Контекст) Экспорт + + Если ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда + ДанныеСертификата = Сертификат; + Иначе + ДанныеСертификата = ПолучитьИзВременногоХранилища(Сертификат); + КонецЕсли; + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ПроверитьСертификат( + Новый ОписаниеОповещения("ПроверитьСертификатПослеПроверкиОблачнаяПодпись", ЭтотОбъект, Контекст), + Неопределено, + ДанныеСертификата); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьСертификат. +Процедура ПроверитьСертификатПослеПроверкиОблачнаяПодпись(РезультатВызова, Контекст) Экспорт + + Если Не РезультатВызова.Выполнено Тогда + Контекст.ОписаниеОшибкиНаСервере = КраткоеПредставлениеОшибки(РезультатВызова.Ошибка); + Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + ПроверитьСертификатВМоделиСервиса(Контекст); + Иначе + ПроверитьСертификатПослеНеуспешнойПроверки(Контекст); + КонецЕсли; + Возврат; + КонецЕсли; + + Если Не РезультатВызова.Результат Тогда + Контекст.ОписаниеОшибкиНаСервере = ТекстОшибкиОблачнаяПодписьСертификатНедействителен(); + ПроверитьСертификатПослеНеуспешнойПроверки(Контекст); + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодпись. +Процедура ПроверитьПодписьОблачнаяПодпись(Контекст) + + Если Не ЭлектроннаяПодписьКлиент.ПроверятьЭлектронныеПодписиНаСервере() Тогда + + Если ТипЗнч(Контекст.ИсходныеДанные) = Тип("Строка") + И ЭтоАдресВременногоХранилища(Контекст.ИсходныеДанные) Тогда + Контекст.ИсходныеДанные = ПолучитьИзВременногоХранилища(Контекст.ИсходныеДанные); + КонецЕсли; + + Контекст.Вставить("ПроверитьСертификатНаКлиенте"); + + ПроверитьПодписьНаКлиентеОблачнаяПодпись(Контекст); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодпись. +Процедура ПроверитьПодписьНаКлиентеОблачнаяПодпись(Контекст) + + Подпись = Контекст.Подпись; + ИсходныеДанные = Контекст.ИсходныеДанные; + + Если ТипЗнч(Подпись) = Тип("Строка") И ЭтоАдресВременногоХранилища(Подпись) Тогда + Подпись = ПолучитьИзВременногоХранилища(Подпись); + КонецЕсли; + + Если ТипЗнч(ИсходныеДанные) = Тип("Строка") И ЭтоАдресВременногоХранилища(ИсходныеДанные) Тогда + ИсходныеДанные = ПолучитьИзВременногоХранилища(ИсходныеДанные); + КонецЕсли; + + Контекст.Вставить("ДанныеПодписи", Подпись); + Контекст.Вставить("МенеджерКриптографии", "ОблачнаяПодпись"); + + ОбработчикСледующий = Новый ОписаниеОповещения( + "ПроверитьПодписьНаКлиентеПослеПроверкиПодписиОблачнаяПодпись", ЭтотОбъект, Контекст, + "ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи", ЭтотОбъект); + + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + МодульСервисКриптографииDSSКлиент.ПроверитьПодпись( + ОбработчикСледующий, + Неопределено, + Контекст.ДанныеПодписи, + ИсходныеДанные, + "CMS"); + +КонецПроцедуры + +// Продолжение процедуры ПроверитьПодпись. +Процедура ПроверитьПодписьНаКлиентеПослеПроверкиПодписиОблачнаяПодпись(РезультатВызова, Контекст) Экспорт + + Если Не РезультатВызова.Выполнено Тогда + Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + ПроверитьПодписьВМоделиСервиса(Контекст); + Иначе + ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи(РезультатВызова.Ошибка, Ложь, Контекст); + КонецЕсли; + Возврат; + КонецЕсли; + + Если Не РезультатВызова.Результат Тогда + ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи( + ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиСервисаПодписьНедействительна(), + Ложь, Контекст); + Возврат; + КонецЕсли; + + Сертификаты = РезультатВызова.Сертификаты; + Попытка + Если Сертификаты.Количество() = 1 Тогда + Сертификат = Сертификаты[0]; + ИначеЕсли Сертификаты.Количество() > 1 Тогда + Сертификат = ЭлектроннаяПодписьСлужебныйВызовСервера.СертификатыПоПорядкуДоКорневого(Сертификаты)[0]; + КонецЕсли; + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи(ИнформацияОбОшибке, Ложь, Контекст); + Возврат; + КонецПопытки; + + ПроверитьПодписьНаКлиентеПослеПроверкиПодписи(Сертификат, Контекст); + +КонецПроцедуры + +Функция ИспользоватьСервисОблачнойПодписи() Экспорт + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); + Возврат МодульСервисКриптографииDSSКлиент.ИспользоватьСервисОблачнойПодписи(); + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция ПолучитьТипОблачнойПодписи() Экспорт + + Результат = Неопределено; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиентСервер"); + Результат = МодульСервисКриптографииDSSКлиентСервер.ПолучитьТипОблачнойПодписи(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ЭтоОперацияОблачнойПодписи(КонтекстФормы) Экспорт + + Результат = Ложь; + + РеквизитыФормы = Новый Структура("ДанныеСертификата", Неопределено); + ЗаполнитьЗначенияСвойств(РеквизитыФормы, КонтекстФормы); + Если ТипЗнч(РеквизитыФормы.ДанныеСертификата) = Тип("Структура") Тогда + ДанныеСертификата = КонтекстФормы.ДанныеСертификата; + Результат = ДанныеСертификата.Облачный; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Процедура СброситьПарольВПамяти(СертификатСсылка) Экспорт + + ФормаПередачаПараметров().СброситьПарольСертификата(СертификатСсылка); + +КонецПроцедуры + +Функция УстановитьСвойстваОблачнойПодписи(ОписаниеДанных, НовыеЗначения) Экспорт + + ДанныеОблачнойПодписи = ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных); + + ЗаполнитьЗначенияСвойств(ДанныеОблачнойПодписи, НовыеЗначения); + + Возврат ДанныеОблачнойПодписи; + +КонецФункции + +Функция ПолучитьСвойстваОблачнойПодписи(ОписаниеДанных) Экспорт + + ИмяКлюча = "СвойстваОблачнойПодписи"; + ДанныеОблачнойПодписи = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ОписаниеДанных, ИмяКлюча); + + Если ДанныеОблачнойПодписи = Неопределено Тогда + Результат = Новый Структура(); + Результат.Вставить("УчетнаяЗапись", Неопределено); + Результат.Вставить("ОповещениеПриПодтверждении", Неопределено); + Результат.Вставить("ДанныеПакета", Неопределено); + Результат.Вставить("ДанныеПодтверждения", Неопределено); + ОписаниеДанных.Вставить(ИмяКлюча, Результат); + Иначе + Результат = ДанныеОблачнойПодписи; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Процедура ПолучитьДанныеДляОблачнойПодписи(Оповещение, Форма, ОписаниеДанных, ИсточникДанных, ДляСтороныКлиента) Экспорт + + ПолучитьДанныеИзОписанияДанных(Оповещение, Форма, ОписаниеДанных, ИсточникДанных, ДляСтороныКлиента); + +КонецПроцедуры + +Функция ТекстОшибкиОблачнаяПодписьСертификатНедействителен() + + Возврат НСтр("ru = 'Сервис облачной подписи сообщил, что сертификат недействителен.'"); + +КонецФункции + +#КонецОбласти + #Область ДиагностикаЭлектроннойПодписи // Формирует архив, содержащий техническую информацию, и предлагает сохранить его на диск. // // Параметры: // Причина - Строка - причина сбора технической информации. -// ОбработчикЗавершения - ОписаниеОповещения -// - Неопределено - содержит описание процедуры, -// которая будет вызвана после сохранения архива на диск со следующими параметрами: -// * АрхивСохранен - Булево - результат сохранения архива на диск. -// * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта -// ОписаниеОповещения. -// ДополнительныеФайлы - Структура -// - Массив - дополнительные данные, которые необходимо поместить -// в архив, или массив таких данных. Поля структуры: -// * Имя - Строка - имя файла с расширением. -// * Данные - ДвоичныеДанные -// - Строка - данные файла или адрес данных во временном хранилище. +// ОбработчикЗавершения - Неопределено +// - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана +// после сохранения архива на диск со следующими параметрами: +// АрхивСохранен - Булево - результат сохранения архива на диск. +// ДополнительныеПараметры - Произвольный - значение, которое было указано +// при создании объекта ОписаниеОповещения. +// ДополнительныеФайлы - Структура - дополнительные данные, которые необходимо поместить в архив: +// * Имя - Строка - имя файла с расширением. +// * Данные - ДвоичныеДанные +// - Строка - данные файла или адрес данных во временном хранилище. +// - Массив - массив указанных выше структур. // Процедура СформироватьТехническуюИнформацию(Причина, ОбработчикЗавершения = Неопределено, diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl index 810d249a1..28792d01e 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl @@ -172,9 +172,9 @@ // ПутиКПрограммамНаСерверахLinux - Строка // // Возвращаемое значение: -// Неопределено // Структура: // * ПутьКПрограмме - Строка +// Неопределено // Функция МенеджерКриптографииСвойстваПрограммы(ОписаниеПрограммы, ЭтоLinux, Ошибки, ЭтоСервер, ОписаниеПути) Экспорт @@ -758,6 +758,8 @@ ТолькоОтпечатки = Ложь; ВОблачномСервисе = Ложь; + ОблачнаяПодпись = Ложь; + Если Параметры <> Неопределено Тогда Если Параметры.Свойство("ТолькоОтпечатки") Тогда ТолькоОтпечатки = Параметры.ТолькоОтпечатки; @@ -765,6 +767,9 @@ Если Параметры.Свойство("ВОблачномСервисе") Тогда ВОблачномСервисе = Параметры.ВОблачномСервисе; КонецЕсли; + Если Параметры.Свойство("ОблачнаяПодпись") Тогда + ОблачнаяПодпись = Параметры.ОблачнаяПодпись; + КонецЕсли; КонецЕсли; Если ТолькоОтпечатки Тогда @@ -794,7 +799,15 @@ Продолжить; КонецЕсли; + ТипРазмещения = 1; Если НаСервере Тогда + Если ОблачнаяПодпись Тогда + ТипРазмещения = 3; + ИначеЕсли ВОблачномСервисе Тогда + ТипРазмещения = 4; + Иначе + ТипРазмещения = 2; + КонецЕсли; Строка = Таблица.Найти(Отпечаток, "Отпечаток"); Если Строка <> Неопределено Тогда Если ВОблачномСервисе Тогда @@ -809,11 +822,14 @@ СвойстваСертификата.Вставить("Представление", ПредставлениеСертификата(ТекущийСертификат, ДобавкаВремени)); СвойстваСертификата.Вставить("КемВыдан", ПредставлениеИздателя(ТекущийСертификат)); + СвойстваСертификата.Вставить("ТипРазмещения", ТипРазмещения); Если ТипЗнч(Таблица) = Тип("Массив") Тогда Таблица.Добавить(СвойстваСертификата); Иначе - Если ВОблачномСервисе Тогда + Если ОблачнаяПодпись Тогда + СвойстваСертификата.Вставить("НаСервере", Ложь); + ИначеЕсли ВОблачномСервисе Тогда СвойстваСертификата.Вставить("ВОблачномСервисе", Истина); ИначеЕсли НаСервере Тогда СвойстваСертификата.Вставить("НаСервере", Истина); @@ -1281,6 +1297,37 @@ КонецФункции +// Описание подключения внешней компоненты (XMLDSIG). +// +// Возвращаемое значение: +// Структура: +// ПолноеИмяМакета - Строка +// ИмяОбъекта - Строка +// +Функция ОписаниеКомпоненты() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("ИмяОбъекта", "XMLDSignAddIn"); + Параметры.Вставить("ПолноеИмяМакета", + "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Макет.КомпонентаXMLDSig"); + + Возврат Параметры; + +КонецФункции + +Функция ИдентификаторыАлгоритмовХешированияИОткрытогоКлюча() Экспорт + + Идентификаторы = Новый Массив; + + Наборы = НаборыАлгоритмовДляСозданияПодписи(); + Для Каждого Набор Из Наборы Цикл + Идентификаторы.Добавить("<" + Набор.ИдентификаторАлгоритмаОткрытогоКлюча + "> <" + Набор.ИдентификаторАлгоритмаХеширования + ">"); + КонецЦикла; + + Возврат СтрСоединить(Идентификаторы, Символы.ПС) + Символы.ПС; + +КонецФункции + // См. ЭлектроннаяПодписьКлиент.ПараметрыXMLDSig. Функция ПараметрыXMLDSig() Экспорт @@ -1716,6 +1763,22 @@ КонецФункции +// Только для внутреннего использования. +Функция РазмещениеСертификата(ТипРазмещения) Экспорт + + Результат = "Локальный"; + ОбщееРазмещение = (ТипРазмещения - 1) % 4; + + Если ОбщееРазмещение = 2 Тогда + Результат = "ОблачнаяПодпись"; + ИначеЕсли ОбщееРазмещение = 3 Тогда + Результат = "ПодписьВМоделиСервиса"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + #Область АлгоритмыПодписи Функция АлгоритмСформированнойПодписи(ДанныеПодписи, ВключаяOID = Ложь, ТолькоOID = Ложь) Экспорт diff --git a/SSL/src/CommonPictures/АнимацияПодтверждения/Picture.gif b/SSL/src/CommonPictures/АнимацияПодтверждения/Picture.gif new file mode 100644 index 000000000..3939edb98 Binary files /dev/null and b/SSL/src/CommonPictures/АнимацияПодтверждения/Picture.gif differ diff --git a/SSL/src/CommonPictures/АнимацияПодтверждения/АнимацияПодтверждения.mdo b/SSL/src/CommonPictures/АнимацияПодтверждения/АнимацияПодтверждения.mdo new file mode 100644 index 000000000..d81bedcd4 --- /dev/null +++ b/SSL/src/CommonPictures/АнимацияПодтверждения/АнимацияПодтверждения.mdo @@ -0,0 +1,8 @@ + + + АнимацияПодтверждения + + ru + Анимация подтверждения + + diff --git a/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/Picture.png b/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/Picture.png new file mode 100644 index 000000000..0fd72b59b Binary files /dev/null and b/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/Picture.png differ diff --git a/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/ВидимостьПароляЗакрыто.mdo b/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/ВидимостьПароляЗакрыто.mdo new file mode 100644 index 000000000..4303f8236 --- /dev/null +++ b/SSL/src/CommonPictures/ВидимостьПароляЗакрыто/ВидимостьПароляЗакрыто.mdo @@ -0,0 +1,8 @@ + + + ВидимостьПароляЗакрыто + + ru + Видимость пароля закрыто + + diff --git a/SSL/src/CommonPictures/ВидимостьПароляОткрыто/Picture.png b/SSL/src/CommonPictures/ВидимостьПароляОткрыто/Picture.png new file mode 100644 index 000000000..d583a4d0e Binary files /dev/null and b/SSL/src/CommonPictures/ВидимостьПароляОткрыто/Picture.png differ diff --git a/SSL/src/CommonPictures/ВидимостьПароляОткрыто/ВидимостьПароляОткрыто.mdo b/SSL/src/CommonPictures/ВидимостьПароляОткрыто/ВидимостьПароляОткрыто.mdo new file mode 100644 index 000000000..2f54e691f --- /dev/null +++ b/SSL/src/CommonPictures/ВидимостьПароляОткрыто/ВидимостьПароляОткрыто.mdo @@ -0,0 +1,8 @@ + + + ВидимостьПароляОткрыто + + ru + Видимость пароля открыто + + diff --git a/SSL/src/CommonPictures/Закрепить/Picture.zip b/SSL/src/CommonPictures/Закрепить/Picture.zip index df34f4265..d9214ccd0 100644 Binary files a/SSL/src/CommonPictures/Закрепить/Picture.zip and b/SSL/src/CommonPictures/Закрепить/Picture.zip differ diff --git a/SSL/src/CommonPictures/ЗакрытыйКлюч/Picture.png b/SSL/src/CommonPictures/ЗакрытыйКлюч/Picture.png new file mode 100644 index 000000000..c5a760286 Binary files /dev/null and b/SSL/src/CommonPictures/ЗакрытыйКлюч/Picture.png differ diff --git a/SSL/src/CommonPictures/ЗакрытыйКлюч/ЗакрытыйКлюч.mdo b/SSL/src/CommonPictures/ЗакрытыйКлюч/ЗакрытыйКлюч.mdo new file mode 100644 index 000000000..2974147fb --- /dev/null +++ b/SSL/src/CommonPictures/ЗакрытыйКлюч/ЗакрытыйКлюч.mdo @@ -0,0 +1,8 @@ + + + ЗакрытыйКлюч + + ru + Закрытый ключ + + diff --git a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png index b1c673812..f0d2515f9 100644 Binary files a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png and b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png differ diff --git a/SSL/src/CommonPictures/Открепить/Picture.zip b/SSL/src/CommonPictures/Открепить/Picture.zip index ab5bc5b80..4c14a8eda 100644 Binary files a/SSL/src/CommonPictures/Открепить/Picture.zip and b/SSL/src/CommonPictures/Открепить/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыТиповДанных/Picture.zip b/SSL/src/CommonPictures/ПиктограммыТиповДанных/Picture.zip new file mode 100644 index 000000000..f29d25243 Binary files /dev/null and b/SSL/src/CommonPictures/ПиктограммыТиповДанных/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПиктограммыТиповДанных/ПиктограммыТиповДанных.mdo b/SSL/src/CommonPictures/ПиктограммыТиповДанных/ПиктограммыТиповДанных.mdo new file mode 100644 index 000000000..2769c3e72 --- /dev/null +++ b/SSL/src/CommonPictures/ПиктограммыТиповДанных/ПиктограммыТиповДанных.mdo @@ -0,0 +1,8 @@ + + + ПиктограммыТиповДанных + + ru + Пиктограммы типов данных + + diff --git a/SSL/src/CommonPictures/ПодписьОблако/Picture.zip b/SSL/src/CommonPictures/ПодписьОблако/Picture.zip new file mode 100644 index 000000000..7a363d07f Binary files /dev/null and b/SSL/src/CommonPictures/ПодписьОблако/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПодписьОблако/ПодписьОблако.mdo b/SSL/src/CommonPictures/ПодписьОблако/ПодписьОблако.mdo new file mode 100644 index 000000000..1deb5e4ef --- /dev/null +++ b/SSL/src/CommonPictures/ПодписьОблако/ПодписьОблако.mdo @@ -0,0 +1,8 @@ + + + ПодписьОблако + + ru + Подпись облако + + diff --git a/SSL/src/CommonPictures/ПодписьСервиса/Picture.zip b/SSL/src/CommonPictures/ПодписьСервиса/Picture.zip new file mode 100644 index 000000000..96603b9c0 Binary files /dev/null and b/SSL/src/CommonPictures/ПодписьСервиса/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПодписьСервиса/ПодписьСервиса.mdo b/SSL/src/CommonPictures/ПодписьСервиса/ПодписьСервиса.mdo new file mode 100644 index 000000000..0a436fad9 --- /dev/null +++ b/SSL/src/CommonPictures/ПодписьСервиса/ПодписьСервиса.mdo @@ -0,0 +1,8 @@ + + + ПодписьСервиса + + ru + Подпись сервиса + + diff --git a/SSL/src/CommonPictures/ПроверитьФормулу/Picture.zip b/SSL/src/CommonPictures/ПроверитьФормулу/Picture.zip new file mode 100644 index 000000000..d6294472b Binary files /dev/null and b/SSL/src/CommonPictures/ПроверитьФормулу/Picture.zip differ diff --git a/SSL/src/CommonPictures/ПроверитьФормулу/ПроверитьФормулу.mdo b/SSL/src/CommonPictures/ПроверитьФормулу/ПроверитьФормулу.mdo new file mode 100644 index 000000000..84fa5f887 --- /dev/null +++ b/SSL/src/CommonPictures/ПроверитьФормулу/ПроверитьФормулу.mdo @@ -0,0 +1,8 @@ + + + ПроверитьФормулу + + ru + Проверить формулу + + diff --git a/SSL/src/CommonPictures/РазделительШагов/Picture.png b/SSL/src/CommonPictures/РазделительШагов/Picture.png new file mode 100644 index 000000000..424fae550 Binary files /dev/null and b/SSL/src/CommonPictures/РазделительШагов/Picture.png differ diff --git a/SSL/src/CommonPictures/РазделительШагов/РазделительШагов.mdo b/SSL/src/CommonPictures/РазделительШагов/РазделительШагов.mdo new file mode 100644 index 000000000..5605ac84d --- /dev/null +++ b/SSL/src/CommonPictures/РазделительШагов/РазделительШагов.mdo @@ -0,0 +1,8 @@ + + + РазделительШагов + + ru + Разделитель шагов + + diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхНедоступна/Picture.png b/SSL/src/CommonPictures/СинхронизацияДанныхНедоступна/Picture.png new file mode 100644 index 000000000..146854f62 Binary files /dev/null and b/SSL/src/CommonPictures/СинхронизацияДанныхНедоступна/Picture.png differ diff --git a/SSL/src/CommonPictures/СинхронизацияДанныхНедоступна/СинхронизацияДанныхНедоступна.mdo b/SSL/src/CommonPictures/СинхронизацияДанныхНедоступна/СинхронизацияДанныхНедоступна.mdo new file mode 100644 index 000000000..39c0220b6 --- /dev/null +++ b/SSL/src/CommonPictures/СинхронизацияДанныхНедоступна/СинхронизацияДанныхНедоступна.mdo @@ -0,0 +1,12 @@ + + + СинхронизацияДанныхНедоступна + + ru + Синхронизация данных недоступна + + + en + Restore + + diff --git a/SSL/src/CommonPictures/Скачать/Picture.svg b/SSL/src/CommonPictures/Скачать/Picture.svg new file mode 100644 index 000000000..073698125 --- /dev/null +++ b/SSL/src/CommonPictures/Скачать/Picture.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/SSL/src/CommonPictures/Скачать/Скачать.mdo b/SSL/src/CommonPictures/Скачать/Скачать.mdo new file mode 100644 index 000000000..1bc0454cf --- /dev/null +++ b/SSL/src/CommonPictures/Скачать/Скачать.mdo @@ -0,0 +1,8 @@ + + + Скачать + + ru + Скачать + + diff --git a/SSL/src/CommonPictures/СохранитьКак/Picture.svg b/SSL/src/CommonPictures/СохранитьКак/Picture.svg new file mode 100644 index 000000000..629d75855 --- /dev/null +++ b/SSL/src/CommonPictures/СохранитьКак/Picture.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SSL/src/CommonPictures/СохранитьКак/СохранитьКак.mdo b/SSL/src/CommonPictures/СохранитьКак/СохранитьКак.mdo new file mode 100644 index 000000000..90c9a790c --- /dev/null +++ b/SSL/src/CommonPictures/СохранитьКак/СохранитьКак.mdo @@ -0,0 +1,8 @@ + + + СохранитьКак + + ru + Сохранить как + + diff --git a/SSL/src/CommonPictures/ТипГиперссылка/Picture.zip b/SSL/src/CommonPictures/ТипГиперссылка/Picture.zip new file mode 100644 index 000000000..e2d0802ac Binary files /dev/null and b/SSL/src/CommonPictures/ТипГиперссылка/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипГиперссылка/ТипГиперссылка.mdo b/SSL/src/CommonPictures/ТипГиперссылка/ТипГиперссылка.mdo new file mode 100644 index 000000000..74ed40d37 --- /dev/null +++ b/SSL/src/CommonPictures/ТипГиперссылка/ТипГиперссылка.mdo @@ -0,0 +1,8 @@ + + + ТипГиперссылка + + ru + Тип гиперссылка + + diff --git a/SSL/src/CommonPictures/ТипКартинка/Picture.zip b/SSL/src/CommonPictures/ТипКартинка/Picture.zip new file mode 100644 index 000000000..3fde80766 Binary files /dev/null and b/SSL/src/CommonPictures/ТипКартинка/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипКартинка/ТипКартинка.mdo b/SSL/src/CommonPictures/ТипКартинка/ТипКартинка.mdo new file mode 100644 index 000000000..a8b352fbf --- /dev/null +++ b/SSL/src/CommonPictures/ТипКартинка/ТипКартинка.mdo @@ -0,0 +1,8 @@ + + + ТипКартинка + + ru + Тип картинка + + diff --git a/SSL/src/CommonPictures/ТипНеопределено/Picture.zip b/SSL/src/CommonPictures/ТипНеопределено/Picture.zip new file mode 100644 index 000000000..c86a6bafc Binary files /dev/null and b/SSL/src/CommonPictures/ТипНеопределено/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипНеопределено/ТипНеопределено.mdo b/SSL/src/CommonPictures/ТипНеопределено/ТипНеопределено.mdo new file mode 100644 index 000000000..1d192f812 --- /dev/null +++ b/SSL/src/CommonPictures/ТипНеопределено/ТипНеопределено.mdo @@ -0,0 +1,8 @@ + + + ТипНеопределено + + ru + Тип неопределено + + diff --git a/SSL/src/CommonPictures/ТипПапка/Picture.zip b/SSL/src/CommonPictures/ТипПапка/Picture.zip new file mode 100644 index 000000000..83d7a7c93 Binary files /dev/null and b/SSL/src/CommonPictures/ТипПапка/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипПапка/ТипПапка.mdo b/SSL/src/CommonPictures/ТипПапка/ТипПапка.mdo new file mode 100644 index 000000000..da79b437b --- /dev/null +++ b/SSL/src/CommonPictures/ТипПапка/ТипПапка.mdo @@ -0,0 +1,8 @@ + + + ТипПапка + + ru + Тип папка + + diff --git a/SSL/src/CommonPictures/ТипСоставной/Picture.zip b/SSL/src/CommonPictures/ТипСоставнойДополнительный/Picture.zip similarity index 100% rename from SSL/src/CommonPictures/ТипСоставной/Picture.zip rename to SSL/src/CommonPictures/ТипСоставнойДополнительный/Picture.zip diff --git a/SSL/src/CommonPictures/ТипСоставной/ТипСоставной.mdo b/SSL/src/CommonPictures/ТипСоставнойДополнительный/ТипСоставнойДополнительный.mdo similarity index 61% rename from SSL/src/CommonPictures/ТипСоставной/ТипСоставной.mdo rename to SSL/src/CommonPictures/ТипСоставнойДополнительный/ТипСоставнойДополнительный.mdo index efe377a5c..2499f2a1a 100644 --- a/SSL/src/CommonPictures/ТипСоставной/ТипСоставной.mdo +++ b/SSL/src/CommonPictures/ТипСоставнойДополнительный/ТипСоставнойДополнительный.mdo @@ -1,8 +1,8 @@ - ТипСоставной + ТипСоставнойДополнительный ru - Тип составной + Тип составной дополнительный diff --git a/SSL/src/CommonPictures/ТипСоставнойОсновной/Picture.zip b/SSL/src/CommonPictures/ТипСоставнойОсновной/Picture.zip new file mode 100644 index 000000000..d100e59f0 Binary files /dev/null and b/SSL/src/CommonPictures/ТипСоставнойОсновной/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипСоставнойОсновной/ТипСоставнойОсновной.mdo b/SSL/src/CommonPictures/ТипСоставнойОсновной/ТипСоставнойОсновной.mdo new file mode 100644 index 000000000..3d8477e5f --- /dev/null +++ b/SSL/src/CommonPictures/ТипСоставнойОсновной/ТипСоставнойОсновной.mdo @@ -0,0 +1,8 @@ + + + ТипСоставнойОсновной + + ru + Тип составной основной + + diff --git a/SSL/src/CommonPictures/ТипСсылка/Picture.zip b/SSL/src/CommonPictures/ТипСсылка/Picture.zip index e2d0802ac..111f7cb2e 100644 Binary files a/SSL/src/CommonPictures/ТипСсылка/Picture.zip and b/SSL/src/CommonPictures/ТипСсылка/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипыСертификатов/Picture.zip b/SSL/src/CommonPictures/ТипыСертификатов/Picture.zip new file mode 100644 index 000000000..b80888067 Binary files /dev/null and b/SSL/src/CommonPictures/ТипыСертификатов/Picture.zip differ diff --git a/SSL/src/CommonPictures/ТипыСертификатов/ТипыСертификатов.mdo b/SSL/src/CommonPictures/ТипыСертификатов/ТипыСертификатов.mdo new file mode 100644 index 000000000..5ae1f4d9b --- /dev/null +++ b/SSL/src/CommonPictures/ТипыСертификатов/ТипыСертификатов.mdo @@ -0,0 +1,8 @@ + + + ТипыСертификатов + + ru + Типы сертификатов + + diff --git a/SSL/src/CommonPictures/ЭтапыПодтверждения/Picture.png b/SSL/src/CommonPictures/ЭтапыПодтверждения/Picture.png new file mode 100644 index 000000000..8d61eab66 Binary files /dev/null and b/SSL/src/CommonPictures/ЭтапыПодтверждения/Picture.png differ diff --git a/SSL/src/CommonPictures/ЭтапыПодтверждения/ЭтапыПодтверждения.mdo b/SSL/src/CommonPictures/ЭтапыПодтверждения/ЭтапыПодтверждения.mdo new file mode 100644 index 000000000..7cb84b904 --- /dev/null +++ b/SSL/src/CommonPictures/ЭтапыПодтверждения/ЭтапыПодтверждения.mdo @@ -0,0 +1,8 @@ + + + ЭтапыПодтверждения + + ru + Этапы подтверждения + + diff --git a/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/Template.htmldoc b/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/Template.htmldoc new file mode 100644 index 000000000..1621f1d23 --- /dev/null +++ b/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/Template.htmldoc @@ -0,0 +1,4 @@ + + + + diff --git a/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/ru.html b/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/ru.html new file mode 100644 index 000000000..e2620d3ba --- /dev/null +++ b/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/ru.html @@ -0,0 +1,19 @@ + +
      +
      Для исправления ошибки перейдите в периферийную информационную базу. 
      +
      Откройте форму настройками синхронизации. 
      +
      Выберите настройку синхронизацию, которую необходимо исправить.
      +
      В меню Еще выберите Новый код предопределенного узла...
      +

      +
      Ознакомьтесь с информацией на форме и нажмите Установить новый код.
      +

      +
      +
                    
      +
      После этого повторите синхронизацию (или создайте новую настройку обмена).
      +

      +

      +

      +

      + + + \ No newline at end of file diff --git a/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru.mdo b/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru.mdo new file mode 100644 index 000000000..aa12fb067 --- /dev/null +++ b/SSL/src/CommonTemplates/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru/ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru.mdo @@ -0,0 +1,9 @@ + + + ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru + + ru + Инструкция для установки кода для предопределенного узла + + HTMLDocument + diff --git a/SSL/src/Configuration/Configuration.mdo b/SSL/src/Configuration/Configuration.mdo index 1c8b903c4..a9b0eea5f 100644 --- a/SSL/src/Configuration/Configuration.mdo +++ b/SSL/src/Configuration/Configuration.mdo @@ -1,17 +1,17 @@ - + БиблиотекаСтандартныхПодсистем ru Библиотека стандартных подсистем, редакция 3.1 - - - - - - - + + + + + + + ManagedApplication PersonalComputer Russian @@ -19,7 +19,7 @@ Role.АдминистраторСистемы Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок Фирма "1С" - 3.1.4.295 + 3.1.5.110 http://downloads.v8.1c.ru/tmplts/ true @@ -75,6 +75,7 @@ StyleItem.ВидДняПроизводственногоКалендаряРабочийЦвет StyleItem.ВидДняПроизводственногоКалендаряСубботаЦвет StyleItem.ВладелецФайловШрифт + StyleItem.ВыделенныйЗаголовокПодтвержденияШрифт StyleItem.ВыполненнаяЗадача StyleItem.ГиперссылкаЦвет StyleItem.ГруппаВариантовОтчетовВажнаяШрифт @@ -98,6 +99,7 @@ StyleItem.КомандаПомощникаНастройкиСинхронизацииВажнаяШрифт StyleItem.КомандаПомощникаНастройкиСинхронизацииОбычнаяШрифт StyleItem.КонтактнаяИнформацияСРедактированиемВДиалогеЦвет + StyleItem.МелкийЗаголовокПодтвержденияШрифт StyleItem.МоиВариантыОтчетовЦвет StyleItem.НепринятаяВерсия StyleItem.НеПринятыеКИсполнениюЗадачи @@ -107,6 +109,7 @@ StyleItem.ОбразецНастройкиКолонтитуловШрифт StyleItem.ОсновнойЭлементСписка StyleItem.ОшибкаПолнотекстовыйПоискФон + StyleItem.ПодтверждениеОперацииОписаниеЦвет StyleItem.ПользовательВыбранный StyleItem.ПоясняющийОшибкуТекст StyleItem.ПоясняющийТекст @@ -142,6 +145,7 @@ CommonPicture.BotFatherВконтакте CommonPicture.GoogleMaps CommonPicture.Skype + CommonPicture.АнимацияПодтверждения CommonPicture.АрхивАнкета CommonPicture.БыстрыеНастройкиОтчета CommonPicture.БыстрыйДоступ @@ -155,6 +159,8 @@ CommonPicture.ВертикальноеПоложениеНиз CommonPicture.ВертикальноеПоложениеЦентр CommonPicture.Взаимодействия + CommonPicture.ВидимостьПароляЗакрыто + CommonPicture.ВидимостьПароляОткрыто CommonPicture.ВидСравнения CommonPicture.ВидыКонтактнойИнформации CommonPicture.ВидыНавигацииПоВзаимодействиямОтДопРеквизитовСведений @@ -226,6 +232,7 @@ CommonPicture.ЗавершитьРедактированиеМакета CommonPicture.ЗакончитьРедактированиеФайла CommonPicture.Закрепить + CommonPicture.ЗакрытыйКлюч CommonPicture.Заметка CommonPicture.ЗанятьФайл CommonPicture.ЗапланированноеВзаимодействие @@ -335,6 +342,7 @@ CommonPicture.ПиктограммыДоступаКНастройкамОтчета CommonPicture.ПиктограммыНастроекОтчета CommonPicture.ПиктограммыПланОбменаУзел + CommonPicture.ПиктограммыТиповДанных CommonPicture.ПиктограммыЭлементов CommonPicture.ПиктограммыЭлементовСправочникаСостоянияОригиналовПервичныхДокументов CommonPicture.ПодключениеОбсуждений @@ -343,6 +351,8 @@ CommonPicture.ПодписанЗашифрованЗаголовок CommonPicture.ПодписанЗашифрованСостояния CommonPicture.ПодписанЭП + CommonPicture.ПодписьОблако + CommonPicture.ПодписьСервиса CommonPicture.Подсистема CommonPicture.Подчеркивание CommonPicture.Позвонить @@ -365,6 +375,7 @@ CommonPicture.ПриложитьФайл CommonPicture.ПрименитьПравилаОбработкиПисем CommonPicture.ПримечаниеЖурналаРегистрации + CommonPicture.ПроверитьФормулу CommonPicture.ПроверкаСертификатаНеВыполнялась CommonPicture.ПроверкаСертификатаОшибка CommonPicture.ПроверкаСертификатаПредупреждение @@ -376,6 +387,7 @@ CommonPicture.РабочийКаталогПоУмолчанию CommonPicture.РазделАдминистрирование CommonPicture.РазделАдминистрирование48 + CommonPicture.РазделительШагов CommonPicture.РазорватьСоединение CommonPicture.РазрешитьРедактированиеРеквизитовОбъекта CommonPicture.Рассчитать @@ -399,11 +411,13 @@ CommonPicture.СинхронизацияДанныхИнтерактивноеВыполнение CommonPicture.СинхронизацияДанныхКоллизия CommonPicture.СинхронизацияДанныхНастройка + CommonPicture.СинхронизацияДанныхНедоступна CommonPicture.СинхронизацияДанныхНепринятыеПоДате CommonPicture.СинхронизацияДанныхОтключение CommonPicture.СинхронизацияДанныхПодсистема CommonPicture.СинхронизацияДанныхСостояниеСинхронизации CommonPicture.Сканирование + CommonPicture.Скачать CommonPicture.СкопироватьВБуферОбмена CommonPicture.Скрепка CommonPicture.СкрытаяНастройкаОтчета @@ -435,6 +449,7 @@ CommonPicture.СостоянияРасширенийОшибка CommonPicture.СостоянияРасширенийПодключено CommonPicture.СохранитьВариантОтчета + CommonPicture.СохранитьКак CommonPicture.СохранитьФайлКак CommonPicture.СправкаВНачало CommonPicture.СправкаПереходВниз @@ -467,14 +482,19 @@ CommonPicture.Телеграм16х16 CommonPicture.ТелефонныйЗвонок CommonPicture.ТипБулево + CommonPicture.ТипГиперссылка CommonPicture.ТипГруппа CommonPicture.ТипДата CommonPicture.ТипДерево CommonPicture.ТипИдентификатор + CommonPicture.ТипКартинка CommonPicture.ТипКонстанта CommonPicture.ТипМакрос + CommonPicture.ТипНеопределено CommonPicture.ТипОшибка - CommonPicture.ТипСоставной + CommonPicture.ТипПапка + CommonPicture.ТипСоставнойДополнительный + CommonPicture.ТипСоставнойОсновной CommonPicture.ТипСписок CommonPicture.ТипСсылка CommonPicture.ТипСтрока @@ -482,6 +502,7 @@ CommonPicture.ТипФункция CommonPicture.ТипЧисло CommonPicture.ТипыМакетов + CommonPicture.ТипыСертификатов CommonPicture.ТолстаяГраницаВокруг CommonPicture.ТолстаяГраницаСверху CommonPicture.ТолстаяГраницаСнизу @@ -513,6 +534,7 @@ CommonPicture.ЭлектронноеПисьмо CommonPicture.ЭлектронноеПисьмоВходящее CommonPicture.ЭлектронноеПисьмоИсходящее + CommonPicture.ЭтапыПодтверждения CommonPicture.ЯндексКарты SessionParameter.АвторизованныйПользователь SessionParameter.БуферОбмена @@ -547,6 +569,7 @@ SessionParameter.ПараметрыОграниченияДоступа SessionParameter.ПараметрыСеансаСинхронизацииДанных SessionParameter.ПаролиСинхронизацииДанных + SessionParameter.ПодключениеDSS SessionParameter.ПодключенныеРасширения SessionParameter.ПравилаВыборочнойРегистрацииОбъектов SessionParameter.ПравилаРегистрацииОбъектов @@ -601,7 +624,9 @@ Role.ДобавлениеИзменениеПользователей Role.ДобавлениеИзменениеРассылокОтчетов Role.ДобавлениеИзменениеРолейИсполнителей + Role.ДобавлениеИзменениеСерверовОблачнойПодписи Role.ДобавлениеИзменениеСостоянийОригиналовПервичныхДокументов + Role.ДобавлениеИзменениеУчетныхЗаписейОблачнойПодписи Role.ДобавлениеИзменениеУчетныхЗаписейЭлектроннойПочты Role.ДобавлениеИзменениеШаблоновАнкет Role.ДобавлениеИзменениеШаблоновСообщений @@ -641,6 +666,7 @@ Role.ЧтениеВерсийОбъектов Role.ЧтениеВнешнихПользователей Role.ЧтениеГрафиковРаботы + Role.ЧтениеДанныхОблачнойПодписи Role.ЧтениеДополнительныхОтчетовИОбработок Role.ЧтениеДополнительныхСведений Role.ЧтениеЗаданий @@ -653,6 +679,7 @@ Role.ЧтениеСостоянийОригиналовПервичныхДокументов Role.ЧтениеУчетныхЗаписейЭлектроннойПочты Role.ЧтениеШаблоновСообщений + CommonTemplate.ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru CommonTemplate.ИнструкцияКакВыполнитьУстановкуОбновленияВручную CommonTemplate.ИнструкцияПоСозданиюФаксимильнойПодписиИПечати CommonTemplate.КомпонентаTWAIN @@ -690,6 +717,7 @@ CommonModule.БизнесПроцессыИЗадачиСервер CommonModule.БизнесПроцессыИЗадачиСобытия CommonModule.БлокировкаРаботыСВнешнимиРесурсами + CommonModule.БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый CommonModule.ВариантыОтчетов CommonModule.ВариантыОтчетовВызовСервера CommonModule.ВариантыОтчетовКлиент @@ -793,6 +821,10 @@ CommonModule.КалендарныеГрафики CommonModule.КалендарныеГрафикиПереопределяемый CommonModule.КалендарныеГрафикиСлужебный + CommonModule.КонструкторФормул + CommonModule.КонструкторФормулКлиент + CommonModule.КонструкторФормулКлиентСервер + CommonModule.КонструкторФормулСлужебный CommonModule.КонтрольВеденияУчета CommonModule.КонтрольВеденияУчетаВызовСервера CommonModule.КонтрольВеденияУчетаГлобальный @@ -862,6 +894,7 @@ CommonModule.ОбщегоНазначенияКлиентПовтИсп CommonModule.ОбщегоНазначенияКлиентСервер CommonModule.ОбщегоНазначенияПереопределяемый + CommonModule.ОбщегоНазначенияСлужебный CommonModule.ОбщегоНазначенияСлужебныйКлиент CommonModule.ОбщегоНазначенияСлужебныйКлиентСервер CommonModule.ОрганизацииПереопределяемый @@ -992,6 +1025,16 @@ CommonModule.РезервноеКопированиеИБКлиент CommonModule.РезервноеКопированиеИБКлиентПереопределяемый CommonModule.РезервноеКопированиеИБСервер + CommonModule.СервисКриптографииDSS + CommonModule.СервисКриптографииDSSASNКлиентСервер + CommonModule.СервисКриптографииDSSКлиент + CommonModule.СервисКриптографииDSSКлиентСервер + CommonModule.СервисКриптографииDSSПереопределяемый + CommonModule.СервисКриптографииDSSПодтверждениеКлиент + CommonModule.СервисКриптографииDSSПодтверждениеСервер + CommonModule.СервисКриптографииDSSСлужебный + CommonModule.СервисКриптографииDSSСлужебныйВызовСервера + CommonModule.СервисКриптографииDSSСлужебныйКлиент CommonModule.СклонениеПредставленийОбъектов CommonModule.СклонениеПредставленийОбъектовВызовСервера CommonModule.СклонениеПредставленийОбъектовКлиент @@ -1197,7 +1240,7 @@ EventSubscription.ЗаполнитьЗначениеРеквизитаУпорядочивания EventSubscription.ЗаполнитьКонтактнуюИнформацию EventSubscription.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей - EventSubscription.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия + EventSubscription.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов EventSubscription.ЗапретитьИспользованиеУдаляемыхОбъектовВДокументах EventSubscription.ЗапретитьИспользованиеУдаляемыхОбъектовВКонстантах EventSubscription.ЗапретитьИспользованиеУдаляемыхОбъектовВНаборахЗаписей @@ -1228,6 +1271,7 @@ EventSubscription.ОтменитьОтправкуДанныхУзлаВРаспределеннойИнформационнойБазе EventSubscription.ОчиститьИнформациюОбАвтореВерсии EventSubscription.ОчиститьСсылкиНаУзелИнформационнойБазы + EventSubscription.ПередУдалениемПланаОбмена EventSubscription.ПолучениеПолейПредставленияВзаимодействия EventSubscription.ПолучениеПредставленияВзаимодействия EventSubscription.ПолучитьПоляПредставленияБизнесПроцесса @@ -1332,6 +1376,7 @@ FunctionalOption.ИспользоватьПочтовыйКлиент FunctionalOption.ИспользоватьПризнакРассмотрено FunctionalOption.ИспользоватьПрочиеВзаимодействия + FunctionalOption.ИспользоватьСервисОблачнойПодписи FunctionalOption.ИспользоватьСервисПереводаТекста FunctionalOption.ИспользоватьСинхронизациюДанных FunctionalOption.ИспользоватьСинхронизациюДанныхВЛокальномРежиме @@ -1388,6 +1433,7 @@ DefinedType.ВладелецНастроекПравОбъект DefinedType.ВладелецПрисоединенныхФайлов DefinedType.ВладелецПрисоединенныхФайловОбъект + DefinedType.ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент DefinedType.ВладелецСОграничениемПоНаборамЗначенийДоступаОбъект DefinedType.ВладелецФайлов DefinedType.ВладелецШаблонаСообщения @@ -1424,7 +1470,9 @@ DefinedType.ПредметШаблонаСообщения DefinedType.ПрисоединенныйФайл DefinedType.ПрисоединенныйФайлОбъект + DefinedType.ПрограммаЭлектроннойПодписи DefinedType.Респондент + DefinedType.Сотрудник DefinedType.СубъектПерсональныхДанных DefinedType.УточнениеКонтекстаПроверокВеденияУчета DefinedType.ФизическоеЛицо @@ -1453,6 +1501,7 @@ CommonCommand.НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты CommonCommand.НастройкиПодключения CommonCommand.НастройкиСинхронизацииДанных + CommonCommand.НастройкиСинхронизацииДанныхВМоделиСервиса CommonCommand.НачатьИнтервью CommonCommand.Обсуждения CommonCommand.ОтправитьSMS @@ -1471,7 +1520,6 @@ CommonCommand.СведенияОПользователе CommonCommand.СвязанныеДокументы CommonCommand.СвязатьсяСоСпециалистомОнлайнПоддержки - CommonCommand.СинхронизацияДанныхВМоделиСервиса CommonCommand.Синхронизировать CommonCommand.СинхронизироватьСДополнительнымиПараметрами CommonCommand.СкрытьПерсональныеДанныеСубъектов @@ -1510,6 +1558,7 @@ Constant.ДополнительныйЯзык1 Constant.ДополнительныйЯзык2 Constant.ЗаголовокСистемы + Constant.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных Constant.ЗагрузитьСообщениеОбменаДанными Constant.ЗапретитьОтображениеНебезопасногоСодержимогоВПисьмах Constant.ЗапрещатьЗагрузкуФайловПоРасширению @@ -1545,6 +1594,7 @@ Constant.ИспользоватьПрофилиБезопасностиДляДОО Constant.ИспользоватьПрочиеВзаимодействия Constant.ИспользоватьРазделениеПоОбластямДанных + Constant.ИспользоватьСервисОблачнойПодписи Constant.ИспользоватьСервисПереводаТекста Constant.ИспользоватьСервисСклоненияMorpher Constant.ИспользоватьСинхронизациюДанных @@ -1673,6 +1723,7 @@ CommonForm.НастройкиВходаПользователей CommonForm.НастройкиПравОбъектов CommonForm.НастройкиРегистрацииСобытийДоступаКПерсональнымДанным + CommonForm.НастройкиСинхронизацииДанных CommonForm.НастройкиЭлектроннойПодписиИШифрования CommonForm.НовыйПароль CommonForm.ОписаниеИзмененийПрограммы @@ -1703,7 +1754,6 @@ CommonForm.РезультатПроверки CommonForm.СвязанныеДокументы CommonForm.Сертификат - CommonForm.СинхронизацияДанных CommonForm.Склонения CommonForm.СменаПароля CommonForm.СозданиеНачальногоОбразаСФайлами @@ -1772,12 +1822,14 @@ Catalog.СценарииОбменовДанными Catalog.ТелефонныйЗвонокПрисоединенныеФайлы Catalog.ТомаХраненияФайлов + Catalog.УчетныеЗаписиDSS Catalog.УчетныеЗаписиСинхронизацииФайлов Catalog.УчетныеЗаписиЭлектроннойПочты Catalog.Файлы Catalog.ШаблоныАнкет Catalog.ШаблоныСообщений Catalog.ШаблоныСообщенийПрисоединенныеФайлы + Catalog.ЭкземплярыСервераDSS Catalog.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы Catalog.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы Catalog.ЯзыкиПечатныхФорм @@ -1799,6 +1851,8 @@ Enum.ВариантыВерсионированияОбъектов Enum.ВариантыИспользованияВнешнихКомпонент Enum.ВариантыОчисткиФайлов + Enum.ВариантыПериода + Enum.ВариантыПредставленияПериода Enum.ВариантыПубликацииДополнительныхОтчетовИОбработок Enum.ВариантыСжатияTIFF Enum.ВидыДнейПроизводственногоКалендаря @@ -1833,9 +1887,11 @@ Enum.СостоянияДокументаСообщениеSMS Enum.СостоянияЗапросовНаИспользованиеВнешнихРесурсов Enum.СостоянияЗаявленияНаВыпускСертификата + Enum.СостоянияЗаявленияУчетнойЗаписиDSS Enum.СостоянияПроцессовДляЗапуска Enum.СостоянияСообщенияSMS Enum.СостоянияСубъектовДляСкрытия + Enum.СпособыАвторизацииDSS Enum.СпособыВызоваДополнительныхОбработок Enum.СпособыВыполненияПроверки Enum.СпособыЗаполненияГрафикаРаботы @@ -1895,6 +1951,7 @@ Report.СведенияОПользователях Report.СогласияНаОбработкуПерсональныхДанныхДействующие Report.СогласияНаОбработкуПерсональныхДанныхИстекающие + Report.СостояниеУчетнойЗаписиDSS Report.УниверсальныйОтчет DataProcessor.АвтоматическоеИзвлечениеТекстов DataProcessor.АктивныеПользователи @@ -1921,6 +1978,7 @@ DataProcessor.КонвертацияОбъектовXDTO DataProcessor.КонвертацияОбъектовИнформационныхБаз DataProcessor.КонвертацияОбъектовРаспределенныхИнформационныхБаз + DataProcessor.КонструкторФормул DataProcessor.ЛегальностьПолученияОбновлений DataProcessor.НастройкаРазрешенийНаИспользованиеВнешнихРесурсов DataProcessor.НастройкаРезервногоКопированияИБ @@ -1929,6 +1987,7 @@ DataProcessor.НастройкиЦентраМониторинга DataProcessor.НерекомендуемаяВерсияПлатформы DataProcessor.ОписаниеОбработчиковОбновления + DataProcessor.ОтложеннаяЗаписьУзла DataProcessor.ОценкаПроизводительности DataProcessor.ПанельАдминистрированияБСП DataProcessor.ПанельАдминистрированияБСПВМоделиСервиса @@ -1960,6 +2019,7 @@ DataProcessor.УдалениеПомеченныхОбъектов DataProcessor.УниверсальныйОбменДаннымиXML DataProcessor.УправлениеИтогамиИАгрегатами + DataProcessor.УправлениеПодключениемDSS DataProcessor.УстановкаОбновлений InformationRegister.АдресныеОбъекты InformationRegister.БезопасноеХранилищеДанных @@ -2000,6 +2060,8 @@ InformationRegister.ИсполнителиЗадач InformationRegister.ИспользованиеДополнительныхОтчетовИОбработокСервисаВАвтономномРабочемМесте InformationRegister.ИспользованиеПоставляемыхДополнительныхОтчетовИОбработокВОбластяхДанных + InformationRegister.ИспользуемыеВидыДоступа + InformationRegister.ИспользуемыеВидыДоступаПоТаблицам InformationRegister.ИсторияАдресныхОбъектов InformationRegister.КалендарныеГрафики InformationRegister.КлючиДоступаВнешнихПользователей @@ -2079,6 +2141,7 @@ InformationRegister.СведенияОПользователях InformationRegister.СведенияОФайлах InformationRegister.СвязиАдресныхОбъектов + InformationRegister.СертификатыПользователяDSS InformationRegister.СертификатыШифрования InformationRegister.СессииОбменаСообщениямиСистемы InformationRegister.СклоненияПредставленийОбъектов diff --git a/SSL/src/Configuration/ParentConfigurations.bin b/SSL/src/Configuration/ParentConfigurations.bin index 994aa4309..a56b4a5b4 100644 --- a/SSL/src/Configuration/ParentConfigurations.bin +++ b/SSL/src/Configuration/ParentConfigurations.bin @@ -1 +1 @@ -{6,1,1,b337c9ce-d460-11eb-999a-0242ac110002,1,9bed156c-d460-11eb-1199-0242ac110002,"3.1.4.295","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",6276,1,0,57e73280-d460-11eb-7c96-0242ac110002,57e73280-d460-11eb-7c96-0242ac110002,1,0,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,1,0,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,1,0,7795348b-2f52-47f7-bf00-e11e5e795a43,7795348b-2f52-47f7-bf00-e11e5e795a43,1,0,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,1,0,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,1,0,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,1,0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,1,0,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,1,0,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,1,0,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,1,0,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,1,0,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,1,0,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,1,0,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,1,0,5b68d479-7880-44de-84e3-7f578b43f0dc,5b68d479-7880-44de-84e3-7f578b43f0dc,1,0,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,1,0,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,1,0,b4629308-42de-4ce8-8591-cf0c2399a9a2,b4629308-42de-4ce8-8591-cf0c2399a9a2,1,0,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,1,0,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,1,0,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,1,0,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1,0,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,1,0,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,1,0,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,1,0,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,1,0,1983fe34-c984-4659-ba41-0e94504f8989,1983fe34-c984-4659-ba41-0e94504f8989,1,0,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,1,0,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,1,0,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,1,0,08a413ff-bebd-42e5-8ff3-2115746a0844,08a413ff-bebd-42e5-8ff3-2115746a0844,1,0,f24de2ea-fcda-4052-b90f-e9d84314c4f2,f24de2ea-fcda-4052-b90f-e9d84314c4f2,1,0,ff8ae395-c740-4a30-a048-0d57eef6267f,ff8ae395-c740-4a30-a048-0d57eef6267f,1,0,51d06532-f61a-4ed5-afaa-cc4563633e0c,51d06532-f61a-4ed5-afaa-cc4563633e0c,1,0,0e49d980-581b-459f-a4b0-024e8c97e4c0,0e49d980-581b-459f-a4b0-024e8c97e4c0,1,0,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,1,0,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,1,0,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,1,0,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,1,0,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,1,0,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,1,0,839e29b1-a0d2-40fa-9f3e-46e66b943358,839e29b1-a0d2-40fa-9f3e-46e66b943358,1,0,c56d2cc7-630a-441b-b23f-ba78c34849bd,c56d2cc7-630a-441b-b23f-ba78c34849bd,1,0,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,1,0,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,1,0,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,1,0,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,1,0,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,1,0,3cffb795-2a28-4beb-92f4-5813f5994022,3cffb795-2a28-4beb-92f4-5813f5994022,1,0,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,1,0,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,1,0,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,1,0,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,1,0,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,1,0,a379287d-1ce8-460d-a503-910e728e28f1,a379287d-1ce8-460d-a503-910e728e28f1,1,0,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,1,0,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,1,0,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,1,0,4009cb3a-6754-481f-911b-907558cea38a,4009cb3a-6754-481f-911b-907558cea38a,1,0,653a7fd8-91c7-49aa-aa63-45da087e0d0a,653a7fd8-91c7-49aa-aa63-45da087e0d0a,1,0,d7cf3981-cf63-4a21-868b-8175a7704a8f,d7cf3981-cf63-4a21-868b-8175a7704a8f,1,0,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0ae93712-74e8-41c7-8f2d-4dfc8983697d,1,0,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,1,0,64f548c8-c1fc-434e-b3ee-5be367ead1db,64f548c8-c1fc-434e-b3ee-5be367ead1db,1,0,cd592a5d-b184-4558-8a28-7079ccf28b89,cd592a5d-b184-4558-8a28-7079ccf28b89,1,0,2009c673-c1a5-45fc-8da2-a36c435085a6,2009c673-c1a5-45fc-8da2-a36c435085a6,1,0,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,1,0,5d16e042-3889-4851-86f1-bc43bf06ee88,5d16e042-3889-4851-86f1-bc43bf06ee88,1,0,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,1,0,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,1,0,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,1,0,e39ecc8a-ce81-483d-85de-b0488c8b7749,e39ecc8a-ce81-483d-85de-b0488c8b7749,1,0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,1,0,e15c3525-3453-4b62-834e-7c69f9efea51,e15c3525-3453-4b62-834e-7c69f9efea51,1,0,1514eaff-faea-4d82-9465-d0d5292bb31d,1514eaff-faea-4d82-9465-d0d5292bb31d,1,0,6d39c6df-8cd4-47ad-9125-252b37d94575,6d39c6df-8cd4-47ad-9125-252b37d94575,1,0,bc89af7a-1971-4245-8d88-1a5a50c50a8b,bc89af7a-1971-4245-8d88-1a5a50c50a8b,1,0,ad73f3a3-1dad-4920-af41-bda2b947a2f7,ad73f3a3-1dad-4920-af41-bda2b947a2f7,1,0,98b67b5a-3550-4a64-9e07-07fcc9154c73,98b67b5a-3550-4a64-9e07-07fcc9154c73,1,0,ad7c6165-2e44-4808-a77a-526882cf5dea,ad7c6165-2e44-4808-a77a-526882cf5dea,1,0,fa2a9ef2-00a1-44f4-a82c-6c7288dd62dc,fa2a9ef2-00a1-44f4-a82c-6c7288dd62dc,1,0,b7e435a9-6107-4d02-a949-cff793462e31,b7e435a9-6107-4d02-a949-cff793462e31,1,0,f0cda8f5-56f5-423b-8c1c-7113433ebf25,f0cda8f5-56f5-423b-8c1c-7113433ebf25,1,0,1a220e88-428b-4d85-926d-e572bf19997c,1a220e88-428b-4d85-926d-e572bf19997c,1,0,ca0d938b-244e-421f-9fa4-320784b9f416,ca0d938b-244e-421f-9fa4-320784b9f416,1,0,a108b11d-a489-4684-84ea-d5377c7394de,a108b11d-a489-4684-84ea-d5377c7394de,1,0,289a2d84-2477-4177-a6ef-507e2cadeea2,289a2d84-2477-4177-a6ef-507e2cadeea2,1,0,1c877cee-d9b8-48dc-8d79-04d27bb522f7,1c877cee-d9b8-48dc-8d79-04d27bb522f7,1,0,61cd6eab-6bab-4382-986e-4c7fc44f369b,61cd6eab-6bab-4382-986e-4c7fc44f369b,1,0,757b547b-b79c-459a-a64a-eef19a09a38f,757b547b-b79c-459a-a64a-eef19a09a38f,1,0,3d428bdf-c41b-43ac-957e-2943406c832c,3d428bdf-c41b-43ac-957e-2943406c832c,1,0,85cbc0b7-6aa5-455b-abed-7bc659d9ad51,85cbc0b7-6aa5-455b-abed-7bc659d9ad51,1,0,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,1,0,cbbe7903-842c-470e-a2d6-7928df8f13e9,cbbe7903-842c-470e-a2d6-7928df8f13e9,1,0,e02597c4-bf45-4bb6-931d-62d2244f6c58,e02597c4-bf45-4bb6-931d-62d2244f6c58,1,0,75561d71-4b06-40fc-8a46-ed5d33c80dea,75561d71-4b06-40fc-8a46-ed5d33c80dea,1,0,42544966-445d-41b8-b6a0-a52c64758232,42544966-445d-41b8-b6a0-a52c64758232,1,0,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,1,0,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,1,0,5578afd2-5aed-4164-8467-52a66f4773c4,5578afd2-5aed-4164-8467-52a66f4773c4,1,0,9eea8645-1ba7-4faf-9c29-868bf99964dd,9eea8645-1ba7-4faf-9c29-868bf99964dd,1,0,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,1,0,654523be-93d9-4faa-9a35-ce2fede13820,654523be-93d9-4faa-9a35-ce2fede13820,1,0,0c44fdea-7b81-45be-87f5-d64456a9d379,0c44fdea-7b81-45be-87f5-d64456a9d379,1,0,d9bad22e-4049-4371-86a3-1b00ae6215af,d9bad22e-4049-4371-86a3-1b00ae6215af,1,0,d09d6f21-cdd0-485e-bd2c-92092a1aefef,d09d6f21-cdd0-485e-bd2c-92092a1aefef,1,0,2fc92784-d7b0-4209-ba06-e54bed2f160f,2fc92784-d7b0-4209-ba06-e54bed2f160f,1,0,d5a5f53b-9cd5-4036-a379-31680cec3c24,d5a5f53b-9cd5-4036-a379-31680cec3c24,1,0,85e05ed7-25ed-4148-8247-86ff531ec48d,85e05ed7-25ed-4148-8247-86ff531ec48d,1,0,dcd34215-200c-4d3c-828c-4c3cd8b17a81,dcd34215-200c-4d3c-828c-4c3cd8b17a81,1,0,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,1,0,a4e4c91c-fd95-4369-98e3-51ffba79937b,a4e4c91c-fd95-4369-98e3-51ffba79937b,1,0,d343d4e4-d07f-48c3-9db1-774b0d6c1134,d343d4e4-d07f-48c3-9db1-774b0d6c1134,1,0,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,1,0,5797e28d-1318-4728-8b17-bcb78d85349a,5797e28d-1318-4728-8b17-bcb78d85349a,1,0,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,1,0,9f9e6146-17ce-4296-a89f-33dfe4d0468d,9f9e6146-17ce-4296-a89f-33dfe4d0468d,1,0,3cf15377-a5bb-4c37-9780-0dbff8d3d5bb,3cf15377-a5bb-4c37-9780-0dbff8d3d5bb,1,0,3aa020db-a811-4fb9-9ea9-00a3359fbb53,3aa020db-a811-4fb9-9ea9-00a3359fbb53,1,0,968588bb-ee60-4399-955a-3ec4228d3c40,968588bb-ee60-4399-955a-3ec4228d3c40,1,0,23dbb528-7ea8-44ae-a1f2-b7608118666e,23dbb528-7ea8-44ae-a1f2-b7608118666e,1,0,b9627855-6773-4a59-b7d3-f9e2e565cd9e,b9627855-6773-4a59-b7d3-f9e2e565cd9e,1,0,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,1,0,46692974-34aa-45e1-8fec-9b36064073cd,46692974-34aa-45e1-8fec-9b36064073cd,1,0,a6308250-2b1b-40ef-bd20-589d519e3c38,a6308250-2b1b-40ef-bd20-589d519e3c38,1,0,22eafd3b-dc42-4a99-89af-3cd5311dc29f,22eafd3b-dc42-4a99-89af-3cd5311dc29f,1,0,c67f671a-3c83-44f4-9c6a-e06667ac8da6,c67f671a-3c83-44f4-9c6a-e06667ac8da6,1,0,283ce432-3553-4de9-94a2-ca9a590437f5,283ce432-3553-4de9-94a2-ca9a590437f5,1,0,1fbd4cfa-58cb-41ea-920e-a39cfa6ad90c,1fbd4cfa-58cb-41ea-920e-a39cfa6ad90c,1,0,0da019ca-1fc7-4aff-8998-3ddcccf10872,0da019ca-1fc7-4aff-8998-3ddcccf10872,1,0,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,1,0,34b0e268-497d-44d4-b822-84909d0685aa,34b0e268-497d-44d4-b822-84909d0685aa,1,0,8961a859-2203-4678-ae1f-63e2474a787a,8961a859-2203-4678-ae1f-63e2474a787a,1,0,fe63db47-3ece-4518-b6a2-0b6499f60a61,fe63db47-3ece-4518-b6a2-0b6499f60a61,1,0,f6dd250e-75fd-47fc-abcb-79ea19ebd747,f6dd250e-75fd-47fc-abcb-79ea19ebd747,1,0,53c41e6c-89b0-4818-9832-02140373979b,53c41e6c-89b0-4818-9832-02140373979b,1,0,671afc3e-7589-49d8-95a5-1cf195c3b2f8,671afc3e-7589-49d8-95a5-1cf195c3b2f8,1,0,47accdc7-8fa0-4996-9305-c42b6ca12df9,47accdc7-8fa0-4996-9305-c42b6ca12df9,1,0,57e75b31-13b3-46fc-8ec4-7570ab0e9928,57e75b31-13b3-46fc-8ec4-7570ab0e9928,1,0,5abc496c-5745-4220-9fdc-bac092717871,5abc496c-5745-4220-9fdc-bac092717871,1,0,8ad81449-0b75-4775-a841-ca7fc7bf0d43,8ad81449-0b75-4775-a841-ca7fc7bf0d43,1,0,6b29b4b3-df0a-42f7-b89f-809ffbdacf02,6b29b4b3-df0a-42f7-b89f-809ffbdacf02,1,0,43d8dd53-df3e-407e-a3c1-5b893cc1976c,43d8dd53-df3e-407e-a3c1-5b893cc1976c,1,0,7741dfee-c4cc-454d-8e01-99ee82a78b5a,7741dfee-c4cc-454d-8e01-99ee82a78b5a,1,0,61e246f4-fe19-4377-8f69-fd1cb90e3f88,61e246f4-fe19-4377-8f69-fd1cb90e3f88,1,0,05c9e6c3-3e1c-4311-99ac-ec4d59a37205,05c9e6c3-3e1c-4311-99ac-ec4d59a37205,1,0,d437805b-42a9-439d-aef8-abbebe280b69,d437805b-42a9-439d-aef8-abbebe280b69,1,0,b33ccec0-a085-4e91-a26d-c262775d92e8,b33ccec0-a085-4e91-a26d-c262775d92e8,1,0,8adeeac2-d2d0-4d90-b7cb-c7871da477d5,8adeeac2-d2d0-4d90-b7cb-c7871da477d5,1,0,9e082d71-175a-4e80-8cca-6b538d3240eb,9e082d71-175a-4e80-8cca-6b538d3240eb,1,0,b8c4aff0-a36d-4be9-9a5e-b0873d83ff15,b8c4aff0-a36d-4be9-9a5e-b0873d83ff15,1,0,68704139-32bb-4b00-b439-147025d06a35,68704139-32bb-4b00-b439-147025d06a35,1,0,df80f175-7f2b-44f8-90d4-118e2e157356,df80f175-7f2b-44f8-90d4-118e2e157356,1,0,5a88f624-7b7e-43fe-8bc4-ae85d832a855,5a88f624-7b7e-43fe-8bc4-ae85d832a855,1,0,42e39ef7-268f-4053-b4e5-4bceab17d3e4,42e39ef7-268f-4053-b4e5-4bceab17d3e4,1,0,7df36398-7752-4f51-9978-1bcb4bcdd062,7df36398-7752-4f51-9978-1bcb4bcdd062,1,0,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,1,0,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,1,0,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,1,0,fce03f58-7f68-4d7c-a999-687667c1f03d,fce03f58-7f68-4d7c-a999-687667c1f03d,1,0,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,1,0,f4885af5-6ed6-40e8-81a5-0e9537f943d7,f4885af5-6ed6-40e8-81a5-0e9537f943d7,1,0,716302cc-ad47-4823-a81a-4c58857aa0a4,716302cc-ad47-4823-a81a-4c58857aa0a4,1,0,d0f3824e-ddfb-491d-8aea-e4e4806dc3ee,d0f3824e-ddfb-491d-8aea-e4e4806dc3ee,1,0,7cab0151-f86e-4ada-9ec6-e602749e34fc,7cab0151-f86e-4ada-9ec6-e602749e34fc,1,0,d9be359f-c5cb-4f3e-9ccd-61f38c6bbb26,d9be359f-c5cb-4f3e-9ccd-61f38c6bbb26,1,0,15b5979c-755b-480e-b00a-dcc95f62dfeb,15b5979c-755b-480e-b00a-dcc95f62dfeb,1,0,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,1,0,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,1,0,9200527c-b6b9-4962-9440-10449583e1e3,9200527c-b6b9-4962-9440-10449583e1e3,1,0,e8faa1a9-807a-4916-b3c5-76ba2199754c,e8faa1a9-807a-4916-b3c5-76ba2199754c,1,0,99b5c632-61fe-41f5-ac00-ea530633bf28,99b5c632-61fe-41f5-ac00-ea530633bf28,1,0,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,1,0,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,1,0,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,1,0,485911f7-a964-450d-82da-cab020836eb2,485911f7-a964-450d-82da-cab020836eb2,1,0,1960b036-b479-4f4f-80c5-23fc82474082,1960b036-b479-4f4f-80c5-23fc82474082,1,0,7707d7b0-bf30-4362-929a-a5de104266fc,7707d7b0-bf30-4362-929a-a5de104266fc,1,0,0da8a402-ea0f-488a-a087-77990e85a643,0da8a402-ea0f-488a-a087-77990e85a643,1,0,5e7ea635-f307-43cb-9aa7-2c99997b3c2d,5e7ea635-f307-43cb-9aa7-2c99997b3c2d,1,0,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,1,0,cedd0b47-07cb-4dae-86b5-31d396b693c7,cedd0b47-07cb-4dae-86b5-31d396b693c7,1,0,8b4614aa-c769-49f4-a281-a0ffb101abf1,8b4614aa-c769-49f4-a281-a0ffb101abf1,1,0,c08391e1-c4e3-42aa-8738-061031d0cb75,c08391e1-c4e3-42aa-8738-061031d0cb75,1,0,ba06091b-b659-4d29-a971-81335cf4060a,ba06091b-b659-4d29-a971-81335cf4060a,1,0,7c376c72-409e-4b5f-a5b6-85b0a1c23f58,7c376c72-409e-4b5f-a5b6-85b0a1c23f58,1,0,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,1,0,7bbd6fe8-c2fe-4ed2-abd7-2b3fc5b2f410,7bbd6fe8-c2fe-4ed2-abd7-2b3fc5b2f410,1,0,d61fa2fb-a035-469f-9ae1-b78ecd82c83d,d61fa2fb-a035-469f-9ae1-b78ecd82c83d,1,0,bf4c6723-e586-4643-9f03-9e672afea26f,bf4c6723-e586-4643-9f03-9e672afea26f,1,0,4c3a39e3-40ee-423b-91f0-14b60e045b40,4c3a39e3-40ee-423b-91f0-14b60e045b40,1,0,2f2875d7-7598-4ed5-8cc0-a1982ffb5377,2f2875d7-7598-4ed5-8cc0-a1982ffb5377,1,0,23204b0b-bf77-4f7c-9945-e73ad924ebb4,23204b0b-bf77-4f7c-9945-e73ad924ebb4,1,0,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,1,0,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,1,0,a54f2d41-a05e-4878-80c6-81ca2899fa4c,a54f2d41-a05e-4878-80c6-81ca2899fa4c,1,0,23a898d9-5bcb-4744-ab6c-97b17dc98f20,23a898d9-5bcb-4744-ab6c-97b17dc98f20,1,0,c83f7826-0fef-4a9b-8d36-dee5d93c7417,c83f7826-0fef-4a9b-8d36-dee5d93c7417,1,0,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,1,0,f8f56806-ed7e-4059-a0c8-940538c14c98,f8f56806-ed7e-4059-a0c8-940538c14c98,1,0,9ff9f92b-c509-48da-82ce-15b524a895d6,9ff9f92b-c509-48da-82ce-15b524a895d6,1,0,c8bf96c8-f359-4940-8e87-3d190371d6d3,c8bf96c8-f359-4940-8e87-3d190371d6d3,1,0,477f0b81-0eb1-4de1-8cb5-38f1e0823947,477f0b81-0eb1-4de1-8cb5-38f1e0823947,1,0,d914eaa9-ce85-4df7-a545-2d411ef915b0,d914eaa9-ce85-4df7-a545-2d411ef915b0,1,0,41881344-82b7-4904-9ab8-0207d9bcd0a9,41881344-82b7-4904-9ab8-0207d9bcd0a9,1,0,5c542a16-0f95-43be-85cd-bfd49b15f215,5c542a16-0f95-43be-85cd-bfd49b15f215,1,0,ef4d648f-4cac-4df9-9880-2aa13c422d10,ef4d648f-4cac-4df9-9880-2aa13c422d10,1,0,21032fa5-9426-40bd-91e4-ace1e4ceb013,21032fa5-9426-40bd-91e4-ace1e4ceb013,1,0,7185a8f8-48c4-43a9-b31f-102302b8f152,7185a8f8-48c4-43a9-b31f-102302b8f152,1,0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,1,0,27a80757-c0fd-40c7-ad24-4c819c1ba72b,27a80757-c0fd-40c7-ad24-4c819c1ba72b,1,0,c573a29f-4c39-402d-8af4-e0fff80877f8,c573a29f-4c39-402d-8af4-e0fff80877f8,1,0,7fce9e49-e558-4760-9d95-dde6ac6c1e78,7fce9e49-e558-4760-9d95-dde6ac6c1e78,1,0,e5aba4a3-6056-4ef3-827c-d74283175393,e5aba4a3-6056-4ef3-827c-d74283175393,1,0,edc731ba-532f-4fa1-81a8-58beb3b2dfb1,edc731ba-532f-4fa1-81a8-58beb3b2dfb1,1,0,63039e62-7314-42ff-bdc6-c251f38b3827,63039e62-7314-42ff-bdc6-c251f38b3827,1,0,8a4b7aab-b602-4581-8fa4-fab66791f701,8a4b7aab-b602-4581-8fa4-fab66791f701,1,0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,1,0,a2be2d7a-cca0-460f-a915-dadfb9cd588b,a2be2d7a-cca0-460f-a915-dadfb9cd588b,1,0,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,1,0,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,1,0,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,1,0,1f4408f5-460e-431b-9842-bc6875ccf0ae,1f4408f5-460e-431b-9842-bc6875ccf0ae,1,0,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,1,0,7bfc6163-a62f-45e8-9112-40a5d675ba4a,7bfc6163-a62f-45e8-9112-40a5d675ba4a,1,0,542ff510-0245-4a08-80ac-a9941c66ae93,542ff510-0245-4a08-80ac-a9941c66ae93,1,0,03297623-eaa2-4db0-bf1b-ce2076faf20a,03297623-eaa2-4db0-bf1b-ce2076faf20a,1,0,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,1,0,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,1,0,82a3802c-b6d6-4511-bd8b-eeec003afa33,82a3802c-b6d6-4511-bd8b-eeec003afa33,1,0,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,1,0,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,1,0,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,1,0,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,1,0,a755cb43-492d-4069-9b6a-29b92ebb5b0e,a755cb43-492d-4069-9b6a-29b92ebb5b0e,1,0,7f7598e5-ca54-487e-b95c-b18d330b034c,7f7598e5-ca54-487e-b95c-b18d330b034c,1,0,86d09107-f511-4148-b5d9-d97e92addfde,86d09107-f511-4148-b5d9-d97e92addfde,1,0,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,1,0,2120ad01-6bff-48bd-bad8-324e1301b112,2120ad01-6bff-48bd-bad8-324e1301b112,1,0,55b78834-3d90-4858-a6f7-e0368b1d8c41,55b78834-3d90-4858-a6f7-e0368b1d8c41,1,0,059b9a75-f53a-4518-a48a-afc72ab9ee36,059b9a75-f53a-4518-a48a-afc72ab9ee36,1,0,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,1,0,31e95872-97c7-49e3-bd1b-8df4de07014d,31e95872-97c7-49e3-bd1b-8df4de07014d,1,0,8b9be02b-cd1f-4231-a895-6c9be26348c2,8b9be02b-cd1f-4231-a895-6c9be26348c2,1,0,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,1,0,64e03321-33a4-424d-a101-90f1e0da4c2e,64e03321-33a4-424d-a101-90f1e0da4c2e,1,0,fa4f0b33-5253-4a5f-8121-feae3e1968a6,fa4f0b33-5253-4a5f-8121-feae3e1968a6,1,0,e0d21be2-91dc-4a04-9078-49420ddddcd5,e0d21be2-91dc-4a04-9078-49420ddddcd5,1,0,56c97764-7dba-42e0-8ba0-82712aca20e9,56c97764-7dba-42e0-8ba0-82712aca20e9,1,0,a1d80053-ef03-4c00-9fc9-266e61aeaffb,a1d80053-ef03-4c00-9fc9-266e61aeaffb,1,0,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,1,0,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,1,0,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,1,0,7f3c6269-ea41-492f-87b7-7eaaf712762e,7f3c6269-ea41-492f-87b7-7eaaf712762e,1,0,a5d037b0-c666-4179-9d6a-5f48c4a126a8,a5d037b0-c666-4179-9d6a-5f48c4a126a8,1,0,f0850411-4dee-4f1d-baec-7d6c96b10637,f0850411-4dee-4f1d-baec-7d6c96b10637,1,0,12f95031-b81f-4802-b2f3-6f70def90db0,12f95031-b81f-4802-b2f3-6f70def90db0,1,0,5732112a-f31d-41cd-9a7f-312a27395502,5732112a-f31d-41cd-9a7f-312a27395502,1,0,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,1,0,691f9902-6b95-4579-a3d9-3b2b5b548776,691f9902-6b95-4579-a3d9-3b2b5b548776,1,0,c7a8a88f-040a-47a6-8c93-7f3f01544760,c7a8a88f-040a-47a6-8c93-7f3f01544760,1,0,06fc381d-f27a-433c-95c3-e0981e01f22b,06fc381d-f27a-433c-95c3-e0981e01f22b,1,0,6d93ec4f-167a-4804-910b-988ee8aad78e,6d93ec4f-167a-4804-910b-988ee8aad78e,1,0,f646835e-61eb-4ebd-811e-dac5e70bd1b4,f646835e-61eb-4ebd-811e-dac5e70bd1b4,1,0,61b49c4c-3021-4868-834a-9137476ae169,61b49c4c-3021-4868-834a-9137476ae169,1,0,58911911-5192-45fe-87cf-c4a222a521a1,58911911-5192-45fe-87cf-c4a222a521a1,1,0,70067937-9f27-4442-b87b-6c4576ce1b78,70067937-9f27-4442-b87b-6c4576ce1b78,1,0,115d5d06-a2fc-453e-aab5-c869b6d5850b,115d5d06-a2fc-453e-aab5-c869b6d5850b,1,0,d33ca006-d81d-4ef8-8503-7878e81c599f,d33ca006-d81d-4ef8-8503-7878e81c599f,1,0,123bb339-b95e-44c3-b1e9-482dcaa6f297,123bb339-b95e-44c3-b1e9-482dcaa6f297,1,0,f4119605-beb3-46b6-b372-ecdb74f10a33,f4119605-beb3-46b6-b372-ecdb74f10a33,1,0,d2a2e332-a52c-4277-bd19-5ea8ef198469,d2a2e332-a52c-4277-bd19-5ea8ef198469,1,0,e440c594-14bb-4a6e-af53-a4519c7d5548,e440c594-14bb-4a6e-af53-a4519c7d5548,1,0,4165bdaa-8e27-40de-bcdc-0379c34e8868,4165bdaa-8e27-40de-bcdc-0379c34e8868,1,0,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,1,0,82b05859-4c4d-4d5a-a620-cc6aab10f527,82b05859-4c4d-4d5a-a620-cc6aab10f527,1,0,c5871658-94dd-4df4-9a3f-db5d245dd106,c5871658-94dd-4df4-9a3f-db5d245dd106,1,0,a3131bf3-88b1-431c-a01c-be6e26396f91,a3131bf3-88b1-431c-a01c-be6e26396f91,1,0,5c3edcbd-fb62-471c-b75b-f1a759956ebe,5c3edcbd-fb62-471c-b75b-f1a759956ebe,1,0,e606f8eb-952a-4abb-b1ae-4211204bed84,e606f8eb-952a-4abb-b1ae-4211204bed84,1,0,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,1,0,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1,0,b4deaebf-2c21-47d7-9436-10c94c94667c,b4deaebf-2c21-47d7-9436-10c94c94667c,1,0,2a12ce95-3214-4bd2-a0e6-c2af41875821,2a12ce95-3214-4bd2-a0e6-c2af41875821,1,0,bf05548c-babf-402b-b698-9a62e7c69add,bf05548c-babf-402b-b698-9a62e7c69add,1,0,f8295f29-2533-4013-981b-240f017d9f7c,f8295f29-2533-4013-981b-240f017d9f7c,1,0,538b316b-3876-4da6-8b97-ad8ef59de17d,538b316b-3876-4da6-8b97-ad8ef59de17d,1,0,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,1,0,ebc5f182-482b-4dec-9961-ce3a448abd0e,ebc5f182-482b-4dec-9961-ce3a448abd0e,1,0,83e618f5-1bf4-474a-9d65-389f1e4b16c3,83e618f5-1bf4-474a-9d65-389f1e4b16c3,1,0,1357512e-3ed3-455d-bc91-81db3b92f9fe,1357512e-3ed3-455d-bc91-81db3b92f9fe,1,0,82223d0f-41d9-45a6-9612-ae4d8408fa1b,82223d0f-41d9-45a6-9612-ae4d8408fa1b,1,0,3ee058a9-aff5-46f0-8928-8a417e7800d4,3ee058a9-aff5-46f0-8928-8a417e7800d4,1,0,c9a03f19-42bb-4e07-8ce8-1b954e431ada,c9a03f19-42bb-4e07-8ce8-1b954e431ada,1,0,ed4edc6f-048a-40d5-8f61-989895c95cf3,ed4edc6f-048a-40d5-8f61-989895c95cf3,1,0,73cc5fea-597f-4490-9c62-b175fdc38fd3,73cc5fea-597f-4490-9c62-b175fdc38fd3,1,0,c2049ace-3095-4dd7-9cc0-7721118451ad,c2049ace-3095-4dd7-9cc0-7721118451ad,1,0,9ea7a191-38bb-40cc-8025-d34a5ed17c7c,9ea7a191-38bb-40cc-8025-d34a5ed17c7c,1,0,dc17d8b6-d277-43eb-8823-71d440ae1e90,dc17d8b6-d277-43eb-8823-71d440ae1e90,1,0,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,1,0,15111bf5-5bf5-4486-aff0-20ded684b67f,15111bf5-5bf5-4486-aff0-20ded684b67f,1,0,2465986e-7519-4638-9f62-5f692bebeeac,2465986e-7519-4638-9f62-5f692bebeeac,1,0,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,1,0,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,1,0,022f99dd-e1b7-42a7-8141-a8c2e8628901,022f99dd-e1b7-42a7-8141-a8c2e8628901,1,0,cc770616-f6f6-4054-876c-f319b1f8c6cf,cc770616-f6f6-4054-876c-f319b1f8c6cf,1,0,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,1,0,046e6f4f-3d92-4b20-b19f-fca608fa0f11,046e6f4f-3d92-4b20-b19f-fca608fa0f11,1,0,74bea66f-15bf-48de-9ff9-f9c35a8bf5cc,74bea66f-15bf-48de-9ff9-f9c35a8bf5cc,1,0,8486e623-1a54-4ad9-ab44-591b6a559bc3,8486e623-1a54-4ad9-ab44-591b6a559bc3,1,0,dce82d28-9a7b-4d4c-af13-90f459cf4af2,dce82d28-9a7b-4d4c-af13-90f459cf4af2,1,0,cb9f2231-49bb-4b14-a124-8996628afead,cb9f2231-49bb-4b14-a124-8996628afead,1,0,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,1,0,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,1,0,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,1,0,2031ed38-6a8e-4ca7-aa97-449ee36ab7a3,2031ed38-6a8e-4ca7-aa97-449ee36ab7a3,1,0,896de79f-3c34-4436-a4e2-4dd4f45c3e20,896de79f-3c34-4436-a4e2-4dd4f45c3e20,1,0,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,1,0,e6c42b5d-57fd-42ce-a968-653620e797f6,e6c42b5d-57fd-42ce-a968-653620e797f6,1,0,724fb328-fec6-4afe-bc99-0ff0951b184b,724fb328-fec6-4afe-bc99-0ff0951b184b,1,0,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,1,0,f6259a3b-98f5-4649-8fd0-da0a0285f375,f6259a3b-98f5-4649-8fd0-da0a0285f375,1,0,c565bf25-c55e-4324-851a-cec497f5114a,c565bf25-c55e-4324-851a-cec497f5114a,1,0,db6679c4-a647-471a-9f90-40248eb18db9,db6679c4-a647-471a-9f90-40248eb18db9,1,0,455a1ca6-7212-43ac-b5a2-cf85dd2f9c14,455a1ca6-7212-43ac-b5a2-cf85dd2f9c14,1,0,e7c366f7-c8e3-4ffe-bc5e-ca8a4619ec11,e7c366f7-c8e3-4ffe-bc5e-ca8a4619ec11,1,0,2997e4da-d831-48e4-96e2-c29f9d077302,2997e4da-d831-48e4-96e2-c29f9d077302,1,0,30f59002-a23d-4eff-b84f-f280f11b220e,30f59002-a23d-4eff-b84f-f280f11b220e,1,0,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,1,0,5b0e250c-4d2d-4e37-ade1-593854610d3f,5b0e250c-4d2d-4e37-ade1-593854610d3f,1,0,14583452-805e-423d-be9a-e04683c7c46f,14583452-805e-423d-be9a-e04683c7c46f,1,0,148f63d5-23ad-4824-a24c-14d5a54c62d3,148f63d5-23ad-4824-a24c-14d5a54c62d3,1,0,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,1,0,d7376ea8-245a-4342-9a40-c729ca19f966,d7376ea8-245a-4342-9a40-c729ca19f966,1,0,eabfa8b7-fb65-43dd-9308-787f7cce88c9,eabfa8b7-fb65-43dd-9308-787f7cce88c9,1,0,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,1,0,b1e837ff-0edd-4525-b2e2-92cc7990e00e,b1e837ff-0edd-4525-b2e2-92cc7990e00e,1,0,30213cef-b2bc-4e6c-8094-74a61f28b2ed,30213cef-b2bc-4e6c-8094-74a61f28b2ed,1,0,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,1,0,3fc1e50e-b9da-45f7-8e06-57ef6951ca40,3fc1e50e-b9da-45f7-8e06-57ef6951ca40,1,0,66d67f47-ccbb-4d58-aceb-af876f480750,66d67f47-ccbb-4d58-aceb-af876f480750,1,0,71871ca9-095d-4bde-ac80-1371f578cd51,71871ca9-095d-4bde-ac80-1371f578cd51,1,0,6aa8c1d6-9956-4a98-9992-b119ba5ba1c7,6aa8c1d6-9956-4a98-9992-b119ba5ba1c7,1,0,cafbea88-86f0-4a44-98f4-70d1837da452,cafbea88-86f0-4a44-98f4-70d1837da452,1,0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,1,0,ceb286e9-4e7c-49fa-a695-424073e0dffc,ceb286e9-4e7c-49fa-a695-424073e0dffc,1,0,727689c3-c0d8-496f-a47b-4f3243ad8974,727689c3-c0d8-496f-a47b-4f3243ad8974,1,0,ec7b492d-5d38-4f31-90e0-577ad181514e,ec7b492d-5d38-4f31-90e0-577ad181514e,1,0,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,1,0,07288e13-583c-4caf-983a-76c5d2ebf66f,07288e13-583c-4caf-983a-76c5d2ebf66f,1,0,2522fce4-d121-482b-a39d-0c1a842d315e,2522fce4-d121-482b-a39d-0c1a842d315e,1,0,4807629d-8421-4bd9-beb4-5b2940197958,4807629d-8421-4bd9-beb4-5b2940197958,1,0,b8d7bdc9-2778-4f36-a0d9-c43fce15eb3c,b8d7bdc9-2778-4f36-a0d9-c43fce15eb3c,1,0,4bad7c64-131a-42cb-9be7-d61f14f456d0,4bad7c64-131a-42cb-9be7-d61f14f456d0,1,0,d46e141b-7a10-4d65-971f-3a35f2114017,d46e141b-7a10-4d65-971f-3a35f2114017,1,0,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,1,0,766c7fb5-727e-4975-9ea1-3b0df4739620,766c7fb5-727e-4975-9ea1-3b0df4739620,1,0,ba59393c-c499-4999-91d4-b9e34d94db0e,ba59393c-c499-4999-91d4-b9e34d94db0e,1,0,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,1,0,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1,0,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,1,0,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,1,0,913743c3-9529-4c86-b056-93e954df7819,913743c3-9529-4c86-b056-93e954df7819,1,0,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,1,0,3b453f76-ab85-4c65-b008-7f8bf44c9631,3b453f76-ab85-4c65-b008-7f8bf44c9631,1,0,ba5574bd-53ca-413f-a245-272f468a80fb,ba5574bd-53ca-413f-a245-272f468a80fb,1,0,772e7011-0019-4edc-b673-b7151cf4fa6c,772e7011-0019-4edc-b673-b7151cf4fa6c,1,0,21ac47fa-12c2-43e2-9b57-afdf521d3485,21ac47fa-12c2-43e2-9b57-afdf521d3485,1,0,f58bffe7-4a02-4c4e-bfed-7895177a400c,f58bffe7-4a02-4c4e-bfed-7895177a400c,1,0,fe285122-2257-4fb2-ab7e-1683c31db1c6,fe285122-2257-4fb2-ab7e-1683c31db1c6,1,0,0facc6eb-a178-45ee-a6bc-4bf085d80453,0facc6eb-a178-45ee-a6bc-4bf085d80453,1,0,f74eef36-9441-4b6f-b21c-de9643832f9f,f74eef36-9441-4b6f-b21c-de9643832f9f,1,0,8d1c44d7-52f2-4089-9d77-2f03bf051455,8d1c44d7-52f2-4089-9d77-2f03bf051455,1,0,ac2e5217-aaeb-4b6f-b063-538c84f2da06,ac2e5217-aaeb-4b6f-b063-538c84f2da06,1,0,b5e73fbe-499c-4666-a482-0ef399c97c1e,b5e73fbe-499c-4666-a482-0ef399c97c1e,1,0,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,1,0,4ac77dea-3c2b-4566-8857-ba99f7b025c9,4ac77dea-3c2b-4566-8857-ba99f7b025c9,1,0,8e87da88-9fa8-4dd8-b904-622b763239f4,8e87da88-9fa8-4dd8-b904-622b763239f4,1,0,6b5720a8-0bcc-4196-934d-84db9d99ec27,6b5720a8-0bcc-4196-934d-84db9d99ec27,1,0,c0b3e3e9-20bc-42e1-a68f-646a958586d1,c0b3e3e9-20bc-42e1-a68f-646a958586d1,1,0,39496918-7d71-4960-ad8b-0028ae659266,39496918-7d71-4960-ad8b-0028ae659266,1,0,bdf2fd35-2000-45c2-9df6-65031ee0e4af,bdf2fd35-2000-45c2-9df6-65031ee0e4af,1,0,e91118e9-d054-41a1-bfe9-343179718f33,e91118e9-d054-41a1-bfe9-343179718f33,1,0,529cc5b5-835f-4e70-9232-a9649fdc7ae5,529cc5b5-835f-4e70-9232-a9649fdc7ae5,1,0,09fec67d-6e45-428c-b858-9ae20979676c,09fec67d-6e45-428c-b858-9ae20979676c,1,0,4875a235-bcc8-47eb-83e3-a66f0f690b97,4875a235-bcc8-47eb-83e3-a66f0f690b97,1,0,58ffc4d9-d711-4b68-905c-d2ac4f78b547,58ffc4d9-d711-4b68-905c-d2ac4f78b547,1,0,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,1,0,93c347d8-66cb-406c-9ee6-b1962482893f,93c347d8-66cb-406c-9ee6-b1962482893f,1,0,94ab750f-46b4-427c-a7f2-4e94fb9b0678,94ab750f-46b4-427c-a7f2-4e94fb9b0678,1,0,397d9926-31a3-4c03-acb7-74478f9863e1,397d9926-31a3-4c03-acb7-74478f9863e1,1,0,264dd12a-b4c5-44bf-b3c0-ef9225505f76,264dd12a-b4c5-44bf-b3c0-ef9225505f76,1,0,90b8fdf3-3e42-442f-a002-6a28ad0edc99,90b8fdf3-3e42-442f-a002-6a28ad0edc99,1,0,330a176f-5b61-41f5-84bb-b99a9439c2a0,330a176f-5b61-41f5-84bb-b99a9439c2a0,1,0,042245ef-3a30-46fb-b3e3-6599d5426cbd,042245ef-3a30-46fb-b3e3-6599d5426cbd,1,0,d1ba8620-c0c9-4281-afa6-9c9962c338d3,d1ba8620-c0c9-4281-afa6-9c9962c338d3,1,0,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,1,0,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,1,0,4bdc1a18-f184-4f95-bda4-8f5c4b7c3aa1,4bdc1a18-f184-4f95-bda4-8f5c4b7c3aa1,1,0,60200fc6-252f-4eaf-88a2-d2cefa25061f,60200fc6-252f-4eaf-88a2-d2cefa25061f,1,0,0798a128-2f87-4173-99ae-115bb8b3a3b8,0798a128-2f87-4173-99ae-115bb8b3a3b8,1,0,697bd1de-bbef-4362-aa39-71f6008f4bd7,697bd1de-bbef-4362-aa39-71f6008f4bd7,1,0,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,1,0,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,1,0,89574884-bce2-406d-9961-d1656b306eb8,89574884-bce2-406d-9961-d1656b306eb8,1,0,3de28e34-3c1e-4e7f-a720-3418c8c9c496,3de28e34-3c1e-4e7f-a720-3418c8c9c496,1,0,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,1,0,dacb236e-42a5-47e5-b239-ff18ae48e21e,dacb236e-42a5-47e5-b239-ff18ae48e21e,1,0,5cdb6e71-fd20-461a-83db-d59ccdb5b366,5cdb6e71-fd20-461a-83db-d59ccdb5b366,1,0,388b8576-9ba4-460f-b71b-3d644663656a,388b8576-9ba4-460f-b71b-3d644663656a,1,0,d4d38827-fce6-4c39-a4b4-51c7d7edc475,d4d38827-fce6-4c39-a4b4-51c7d7edc475,1,0,2d40609d-b56f-4082-9a6f-8216817ebd24,2d40609d-b56f-4082-9a6f-8216817ebd24,1,0,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,1,0,732b19c8-4f22-4748-a796-71538e46fc2f,732b19c8-4f22-4748-a796-71538e46fc2f,1,0,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,1,0,4b07cdb0-c32e-4751-b317-bee62b43f128,4b07cdb0-c32e-4751-b317-bee62b43f128,1,0,74f02619-7fa8-4c6d-81d6-230156ee45f4,74f02619-7fa8-4c6d-81d6-230156ee45f4,1,0,62ef3558-5ad3-44ab-8578-1acbbfa54135,62ef3558-5ad3-44ab-8578-1acbbfa54135,1,0,a103cca0-8243-40e9-bcdd-97a1cc8a3943,a103cca0-8243-40e9-bcdd-97a1cc8a3943,1,0,c3572d8d-46ff-40bb-800c-2c07f884c219,c3572d8d-46ff-40bb-800c-2c07f884c219,1,0,80fd89d7-160d-4528-9aa0-05b8dac64b4c,80fd89d7-160d-4528-9aa0-05b8dac64b4c,1,0,d1034240-ab06-413a-9828-a5c7dc879680,d1034240-ab06-413a-9828-a5c7dc879680,1,0,b77edd78-2fad-4926-a74f-02f2135356e6,b77edd78-2fad-4926-a74f-02f2135356e6,1,0,57b0b6b2-bbdd-48d2-a52e-e3495e00860e,57b0b6b2-bbdd-48d2-a52e-e3495e00860e,1,0,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,1,0,da551cf6-4f86-4e37-8967-a84c80e1fb13,da551cf6-4f86-4e37-8967-a84c80e1fb13,1,0,4f4916dc-b6fe-4f99-9220-bd7c076408ae,4f4916dc-b6fe-4f99-9220-bd7c076408ae,1,0,857daa3a-0058-4464-9173-13a2926812e2,857daa3a-0058-4464-9173-13a2926812e2,1,0,5fb2c120-fd14-4e78-a35f-c8e9478b3235,5fb2c120-fd14-4e78-a35f-c8e9478b3235,1,0,9d514ce1-f9bd-4018-8107-545cdd372fbd,9d514ce1-f9bd-4018-8107-545cdd372fbd,1,0,fe6b732f-3a33-460f-9686-cffdd5f7d99b,fe6b732f-3a33-460f-9686-cffdd5f7d99b,1,0,06250212-aeb1-4cb8-8785-ea71b1dad848,06250212-aeb1-4cb8-8785-ea71b1dad848,1,0,0c068a61-e5e6-4475-96fa-b7c1d825da42,0c068a61-e5e6-4475-96fa-b7c1d825da42,1,0,1047e34d-397a-42cc-80e6-1be755bd6462,1047e34d-397a-42cc-80e6-1be755bd6462,1,0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1,0,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,1,0,b406b5f9-eeaf-43a0-8930-067554d783c9,b406b5f9-eeaf-43a0-8930-067554d783c9,1,0,47718840-2939-4e30-a72c-a20c88ac4c17,47718840-2939-4e30-a72c-a20c88ac4c17,1,0,58a38994-9fe4-4783-967d-79d1141b90f3,58a38994-9fe4-4783-967d-79d1141b90f3,1,0,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,1,0,7c2e35a8-d05d-4e52-baee-a1e13585c502,7c2e35a8-d05d-4e52-baee-a1e13585c502,1,0,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,1,0,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,1,0,0093680b-c8bc-472d-8b0d-2e6565fc6c22,0093680b-c8bc-472d-8b0d-2e6565fc6c22,1,0,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,1,0,5f4456d6-ff0c-425e-9603-c099492d7a6f,5f4456d6-ff0c-425e-9603-c099492d7a6f,1,0,af7c417e-5c10-4146-bde1-40db86c5806f,af7c417e-5c10-4146-bde1-40db86c5806f,1,0,ab5b0155-a4b1-47a1-ad87-12365dde20c1,ab5b0155-a4b1-47a1-ad87-12365dde20c1,1,0,f551f78a-2f05-4932-ac33-cfa1b077f46f,f551f78a-2f05-4932-ac33-cfa1b077f46f,1,0,a96091a7-d3a5-4893-8440-f360231bf468,a96091a7-d3a5-4893-8440-f360231bf468,1,0,9ce6eef0-5280-4374-9714-474ac571e4e2,9ce6eef0-5280-4374-9714-474ac571e4e2,1,0,6f21c34c-26aa-493d-aa08-2d4366b4064a,6f21c34c-26aa-493d-aa08-2d4366b4064a,1,0,0f55650a-2422-42a9-8258-61df4c17f1ef,0f55650a-2422-42a9-8258-61df4c17f1ef,1,0,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,1,0,3eaece9d-c9be-4b0b-a6f6-a3932274b806,3eaece9d-c9be-4b0b-a6f6-a3932274b806,1,0,5d9427ec-981d-4fb5-878b-8dba0d3a5536,5d9427ec-981d-4fb5-878b-8dba0d3a5536,1,0,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,1,0,a0047712-5769-495d-97af-20d06751a5b4,a0047712-5769-495d-97af-20d06751a5b4,1,0,e729c3c6-16e5-405b-99b1-a88022300c6d,e729c3c6-16e5-405b-99b1-a88022300c6d,1,0,9c089520-8233-42f6-8eee-9839ac708c6f,9c089520-8233-42f6-8eee-9839ac708c6f,1,0,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,1,0,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,1,0,89055896-49dd-4cfd-ab78-8ac3698e12d5,89055896-49dd-4cfd-ab78-8ac3698e12d5,1,0,277ca641-e869-4fcd-8a79-54c451efbbdd,277ca641-e869-4fcd-8a79-54c451efbbdd,1,0,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,1,0,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,1,0,672c4741-6d7b-4d3e-baa7-389bef0625d7,672c4741-6d7b-4d3e-baa7-389bef0625d7,1,0,04398ec0-1c13-43f8-8f5d-7b7619592a4d,04398ec0-1c13-43f8-8f5d-7b7619592a4d,1,0,ce463861-92df-47f2-bd0f-4a2dbf72aacc,ce463861-92df-47f2-bd0f-4a2dbf72aacc,1,0,1220ce92-b964-4fb8-9db0-b4c8c6bdbdf7,1220ce92-b964-4fb8-9db0-b4c8c6bdbdf7,1,0,eca79a64-3d00-4178-b4eb-cf5468622c96,eca79a64-3d00-4178-b4eb-cf5468622c96,1,0,1487d68c-7a2f-48cf-8c80-4074072ed52c,1487d68c-7a2f-48cf-8c80-4074072ed52c,1,0,57502594-74dd-45fe-9234-9a477d5b9741,57502594-74dd-45fe-9234-9a477d5b9741,1,0,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,1,0,d97c6536-fd62-4c9a-b83e-490a29a0721b,d97c6536-fd62-4c9a-b83e-490a29a0721b,1,0,93ec2af7-2ca8-4133-8cc0-31073f9bf216,93ec2af7-2ca8-4133-8cc0-31073f9bf216,1,0,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,1,0,681b27ac-69a5-4c5b-b2c7-285330fe5a4a,681b27ac-69a5-4c5b-b2c7-285330fe5a4a,1,0,6dc4c216-e49f-4833-b45f-6060b67995ef,6dc4c216-e49f-4833-b45f-6060b67995ef,1,0,0753701c-016e-4385-85c0-a485ca50efdc,0753701c-016e-4385-85c0-a485ca50efdc,1,0,24415097-bde5-447a-ac74-bd9bf0eb19fc,24415097-bde5-447a-ac74-bd9bf0eb19fc,1,0,a29d42d6-a448-4940-804d-d1be31da000d,a29d42d6-a448-4940-804d-d1be31da000d,1,0,dd780b76-2a10-40b5-9bcd-7bc8c9b06651,dd780b76-2a10-40b5-9bcd-7bc8c9b06651,1,0,8be6c4a3-d75b-405d-8d98-9baf6f20abb2,8be6c4a3-d75b-405d-8d98-9baf6f20abb2,1,0,c4b01e52-4136-460d-bd82-970177f1e256,c4b01e52-4136-460d-bd82-970177f1e256,1,0,9533784b-311a-4dbe-b73e-7348aabd387e,9533784b-311a-4dbe-b73e-7348aabd387e,1,0,67b04258-04cc-4d85-9bd0-0862a104a5c9,67b04258-04cc-4d85-9bd0-0862a104a5c9,1,0,6ee215f9-20ab-4c48-b2c2-cb1869e8906c,6ee215f9-20ab-4c48-b2c2-cb1869e8906c,1,0,1b401a14-4581-4f24-aaca-5f204f8fcf8b,1b401a14-4581-4f24-aaca-5f204f8fcf8b,1,0,267f7ee6-7b02-4e48-aa1e-145f586edd87,267f7ee6-7b02-4e48-aa1e-145f586edd87,1,0,e1e8ea42-6886-430a-bc59-249259112e6a,e1e8ea42-6886-430a-bc59-249259112e6a,1,0,1e27f3cd-1c9e-4f9f-b2ff-88fb1da37e11,1e27f3cd-1c9e-4f9f-b2ff-88fb1da37e11,1,0,3dcf815c-5c9a-4a78-a42e-7c9ff6faaeb8,3dcf815c-5c9a-4a78-a42e-7c9ff6faaeb8,1,0,1379f050-4f1c-4c41-993e-f7efc71325fb,1379f050-4f1c-4c41-993e-f7efc71325fb,1,0,4655fa12-9169-4d08-bdab-9b3174d0b223,4655fa12-9169-4d08-bdab-9b3174d0b223,1,0,6c07ddfb-8823-4953-9905-9550b847dc3f,6c07ddfb-8823-4953-9905-9550b847dc3f,1,0,2362a8d5-dca2-4527-acc0-63782377f28a,2362a8d5-dca2-4527-acc0-63782377f28a,1,0,dfd6d85c-a734-4458-83b0-87b5949f9c68,dfd6d85c-a734-4458-83b0-87b5949f9c68,1,0,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,1,0,79b6ecf5-8a6b-44a4-9587-5f8764463228,79b6ecf5-8a6b-44a4-9587-5f8764463228,1,0,cd49148c-e385-4b75-a758-a93196e73dba,cd49148c-e385-4b75-a758-a93196e73dba,1,0,ece15c4e-4a4b-421b-9f00-10f698da476b,ece15c4e-4a4b-421b-9f00-10f698da476b,1,0,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,1,0,300ecdd6-144f-48c8-9fd4-6166f1de1047,300ecdd6-144f-48c8-9fd4-6166f1de1047,1,0,b6bbfb59-8249-47af-9394-be262f118811,b6bbfb59-8249-47af-9394-be262f118811,1,0,999df397-a730-4110-b253-59fd5583dab9,999df397-a730-4110-b253-59fd5583dab9,1,0,7f7bf652-0375-4f49-94f1-ebe6a00e4e23,7f7bf652-0375-4f49-94f1-ebe6a00e4e23,1,0,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,1,0,fb63d488-fb91-4d08-8f8c-f4836538216f,fb63d488-fb91-4d08-8f8c-f4836538216f,1,0,b8be6c09-6880-45d3-a2d1-06ad72d069c9,b8be6c09-6880-45d3-a2d1-06ad72d069c9,1,0,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,1,0,148dd521-8754-451b-803b-cbee7c3d3965,148dd521-8754-451b-803b-cbee7c3d3965,1,0,38bc48c7-3938-47be-be3f-844f19561301,38bc48c7-3938-47be-be3f-844f19561301,1,0,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,1,0,147038fb-6154-41f3-aad6-547db27d1e43,147038fb-6154-41f3-aad6-547db27d1e43,1,0,832fa9d3-deab-4c57-b6e2-dee5d24d6100,832fa9d3-deab-4c57-b6e2-dee5d24d6100,1,0,dd4270ef-6b4c-491e-8871-959dbec14c53,dd4270ef-6b4c-491e-8871-959dbec14c53,1,0,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,1,0,9883862f-c0eb-41fe-9374-05c6d72878bc,9883862f-c0eb-41fe-9374-05c6d72878bc,1,0,8ccd9be8-ef26-49b9-8cee-03ae4e500386,8ccd9be8-ef26-49b9-8cee-03ae4e500386,1,0,ddca925c-fdcd-40ce-a504-4fca1758de3f,ddca925c-fdcd-40ce-a504-4fca1758de3f,1,0,9bd92328-8c9c-4882-8956-a1fccf555a64,9bd92328-8c9c-4882-8956-a1fccf555a64,1,0,cafc6b5b-a76a-4b1b-9592-ba440f7bf34f,cafc6b5b-a76a-4b1b-9592-ba440f7bf34f,1,0,f64de21f-5a7c-4a1a-a929-07fc53049f6c,f64de21f-5a7c-4a1a-a929-07fc53049f6c,1,0,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,1,0,ea653eca-f96a-447d-8b09-7a7cb6929ed6,ea653eca-f96a-447d-8b09-7a7cb6929ed6,1,0,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,1,0,5efc4bc4-b711-4620-8d2e-9d947c6cc141,5efc4bc4-b711-4620-8d2e-9d947c6cc141,1,0,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1,0,1328947f-91c3-43f4-a11e-f34893d987b3,1328947f-91c3-43f4-a11e-f34893d987b3,1,0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,1,0,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,1,0,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,1,0,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,1,0,2b72fe1c-afe1-4905-8db2-2bb1baca6295,2b72fe1c-afe1-4905-8db2-2bb1baca6295,1,0,aa8c4a71-3276-4b83-8be2-3528129e58b3,aa8c4a71-3276-4b83-8be2-3528129e58b3,1,0,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,1,0,528d3535-f20f-4d3c-8b7d-482d4d626eb0,528d3535-f20f-4d3c-8b7d-482d4d626eb0,1,0,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,1,0,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,1,0,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,1,0,871a75ef-1987-4695-9916-07439aeedc53,871a75ef-1987-4695-9916-07439aeedc53,1,0,ba64deac-5826-43f2-b88a-2e180da87059,ba64deac-5826-43f2-b88a-2e180da87059,1,0,53ee3eb6-d2d1-4fb3-8a78-1fa4543850a1,53ee3eb6-d2d1-4fb3-8a78-1fa4543850a1,1,0,0072986b-0463-4a39-9851-f9adeda99716,0072986b-0463-4a39-9851-f9adeda99716,1,0,fa44433b-1c44-45a0-9487-47aa092442cf,fa44433b-1c44-45a0-9487-47aa092442cf,1,0,041cecfd-cef2-45d9-90e8-afe0d97d2d95,041cecfd-cef2-45d9-90e8-afe0d97d2d95,1,0,0d4a26fb-7176-43f2-8767-d3e227c7306a,0d4a26fb-7176-43f2-8767-d3e227c7306a,1,0,77de81f0-97c5-4751-9f38-f5785c7c45e0,77de81f0-97c5-4751-9f38-f5785c7c45e0,1,0,933cbafc-5667-4a91-8b1d-dca3d7662522,933cbafc-5667-4a91-8b1d-dca3d7662522,1,0,59acaca9-ed29-4927-bee6-287c91934690,59acaca9-ed29-4927-bee6-287c91934690,1,0,9136814a-89e6-4b0f-8ca1-73e4ef29f534,9136814a-89e6-4b0f-8ca1-73e4ef29f534,1,0,d7e4795a-3431-4f7d-9699-4241611adcf0,d7e4795a-3431-4f7d-9699-4241611adcf0,1,0,ea0a498a-a1cb-4f28-88cb-0bc62971172b,ea0a498a-a1cb-4f28-88cb-0bc62971172b,1,0,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,1,0,d9d14a24-c023-4b69-ad57-30d1474e1232,d9d14a24-c023-4b69-ad57-30d1474e1232,1,0,b6e98aee-4936-491d-8c67-8490e1af2e34,b6e98aee-4936-491d-8c67-8490e1af2e34,1,0,0732ab1c-b49a-49ed-8667-65f4427cc301,0732ab1c-b49a-49ed-8667-65f4427cc301,1,0,b292eb46-df87-43c0-9a37-93c5a22af252,b292eb46-df87-43c0-9a37-93c5a22af252,1,0,0943dd00-1653-4760-a9fe-ebc083ffa660,0943dd00-1653-4760-a9fe-ebc083ffa660,1,0,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,1,0,4fb8564e-2338-4c23-84a4-31f768047ced,4fb8564e-2338-4c23-84a4-31f768047ced,1,0,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,1,0,f93c9a7f-0249-421e-b3d0-55f02d130017,f93c9a7f-0249-421e-b3d0-55f02d130017,1,0,062c507a-9d35-4eb5-bb91-d106a535a503,062c507a-9d35-4eb5-bb91-d106a535a503,1,0,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,1,0,bd727741-ba99-484d-9d7d-2c2ad7ddd1a5,bd727741-ba99-484d-9d7d-2c2ad7ddd1a5,1,0,90327957-5bdc-4949-883c-9eb50f527b3e,90327957-5bdc-4949-883c-9eb50f527b3e,1,0,031980f5-60e8-426a-9907-3afff75a6b05,031980f5-60e8-426a-9907-3afff75a6b05,1,0,1a26f2d5-2465-484c-9311-12d9b3b92ae3,1a26f2d5-2465-484c-9311-12d9b3b92ae3,1,0,fd317d96-380e-4ee7-a25b-401e8521cc7a,fd317d96-380e-4ee7-a25b-401e8521cc7a,1,0,64837ad8-3055-4da3-a39c-0e7db38b6084,64837ad8-3055-4da3-a39c-0e7db38b6084,1,0,695cda1d-b816-4200-9a71-490078a9faa7,695cda1d-b816-4200-9a71-490078a9faa7,1,0,75fc5bea-e239-4de1-ad68-6454876e4b9f,75fc5bea-e239-4de1-ad68-6454876e4b9f,1,0,31ba33d4-5941-4b11-ae99-b15188bfef76,31ba33d4-5941-4b11-ae99-b15188bfef76,1,0,0744e8be-747c-47bb-85f3-58b6f6f9b786,0744e8be-747c-47bb-85f3-58b6f6f9b786,1,0,7142ae5b-ec7b-4a69-9c26-f51e05a4c270,7142ae5b-ec7b-4a69-9c26-f51e05a4c270,1,0,3b380a63-9232-42c2-bfa2-e8fc89448bbd,3b380a63-9232-42c2-bfa2-e8fc89448bbd,1,0,e18b4527-8727-4a10-9e99-a80012debe6c,e18b4527-8727-4a10-9e99-a80012debe6c,1,0,1ed910db-e434-4efd-9b12-c25353a31d5a,1ed910db-e434-4efd-9b12-c25353a31d5a,1,0,10556a26-ea4b-46b4-84d1-175eb13b333f,10556a26-ea4b-46b4-84d1-175eb13b333f,1,0,f1e600b0-55ed-4611-b147-f04d5621796b,f1e600b0-55ed-4611-b147-f04d5621796b,1,0,e3b84128-95e1-45df-84db-5e1791779543,e3b84128-95e1-45df-84db-5e1791779543,1,0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,1,0,101a4eb3-cdda-47af-8c69-615a6920347a,101a4eb3-cdda-47af-8c69-615a6920347a,1,0,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,1,0,e9d95895-8708-4035-89ad-72573b870491,e9d95895-8708-4035-89ad-72573b870491,1,0,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,1,0,f0152598-ffa3-4eb7-811f-906e569373e6,f0152598-ffa3-4eb7-811f-906e569373e6,1,0,f79bada2-838f-4e4f-a017-935cf671a70c,f79bada2-838f-4e4f-a017-935cf671a70c,1,0,312118ff-a2a4-479c-964a-5250cca0cd20,312118ff-a2a4-479c-964a-5250cca0cd20,1,0,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,1,0,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,1,0,8a310493-c06f-46db-b2b5-14d6ed203312,8a310493-c06f-46db-b2b5-14d6ed203312,1,0,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,1,0,b68ec95b-64f3-4a2b-9683-231d50f01eeb,b68ec95b-64f3-4a2b-9683-231d50f01eeb,1,0,89318397-b3a6-4468-985b-ed5cb8ab5cdb,89318397-b3a6-4468-985b-ed5cb8ab5cdb,1,0,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,1,0,4a008342-f72f-4ca1-bad1-64b59b509911,4a008342-f72f-4ca1-bad1-64b59b509911,1,0,4436b2cf-2d71-401f-99fd-012ff0c91fbd,4436b2cf-2d71-401f-99fd-012ff0c91fbd,1,0,cefa1723-a4d4-44c4-bd57-ffa713f9306c,cefa1723-a4d4-44c4-bd57-ffa713f9306c,1,0,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,1,0,5396be45-d7c0-43df-aed4-cad062a02b11,5396be45-d7c0-43df-aed4-cad062a02b11,1,0,017e3da8-e48e-488b-9bbf-4fef1a4f3417,017e3da8-e48e-488b-9bbf-4fef1a4f3417,1,0,de4d37c9-b278-4c0c-bc10-1b63ecd72947,de4d37c9-b278-4c0c-bc10-1b63ecd72947,1,0,aebf163d-d8e8-492a-a973-8cb51982d475,aebf163d-d8e8-492a-a973-8cb51982d475,1,0,5a741cf6-8160-4409-9396-2e6d1e67e6fa,5a741cf6-8160-4409-9396-2e6d1e67e6fa,1,0,4920aabf-6f53-4f91-932a-8ace24631a74,4920aabf-6f53-4f91-932a-8ace24631a74,1,0,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,1,0,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,1,0,d9e98c14-9b07-406b-92c8-bec76165e028,d9e98c14-9b07-406b-92c8-bec76165e028,1,0,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,1,0,bbec9c3d-31dd-484e-ab32-41ef845f1370,bbec9c3d-31dd-484e-ab32-41ef845f1370,1,0,8692ba41-d91d-4af0-8aba-69dd5409d593,8692ba41-d91d-4af0-8aba-69dd5409d593,1,0,68e207e7-8c20-426d-8a0e-c3dd4d683631,68e207e7-8c20-426d-8a0e-c3dd4d683631,1,0,5cc3a29d-aa98-42bf-9800-f584229c8e46,5cc3a29d-aa98-42bf-9800-f584229c8e46,1,0,a95b564a-c895-40f2-b947-ea08462bb2a0,a95b564a-c895-40f2-b947-ea08462bb2a0,1,0,1e015740-5b45-4729-9732-57359a7c602f,1e015740-5b45-4729-9732-57359a7c602f,1,0,db82191f-77bd-44da-8b33-86f01018e25a,db82191f-77bd-44da-8b33-86f01018e25a,1,0,ca63ca2f-703d-4317-8c5d-0650ea638f3f,ca63ca2f-703d-4317-8c5d-0650ea638f3f,1,0,aa2256c7-9847-40a5-9e49-11c508e0d45b,aa2256c7-9847-40a5-9e49-11c508e0d45b,1,0,a04493f4-508c-4047-b0e3-b7d4bde6427b,a04493f4-508c-4047-b0e3-b7d4bde6427b,1,0,6c138ffd-057f-4f7d-af4d-1b1a589a9057,6c138ffd-057f-4f7d-af4d-1b1a589a9057,1,0,418982cd-d403-47cf-a7ef-993a36104947,418982cd-d403-47cf-a7ef-993a36104947,1,0,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,1,0,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,1,0,35eea3b8-d017-442a-b5a0-a1571165b9a9,35eea3b8-d017-442a-b5a0-a1571165b9a9,1,0,7e84901c-cb7f-437c-a135-0902cd47acb6,7e84901c-cb7f-437c-a135-0902cd47acb6,1,0,69530795-5a90-47b0-ae8d-a44b420b51f6,69530795-5a90-47b0-ae8d-a44b420b51f6,1,0,da2b47f5-4109-4f72-a4a5-70be24a6881f,da2b47f5-4109-4f72-a4a5-70be24a6881f,1,0,849f034e-85dc-4515-aae6-240c1e0d46d9,849f034e-85dc-4515-aae6-240c1e0d46d9,1,0,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,1,0,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,1,0,acfa1919-07ce-4464-8552-6b104e284dca,acfa1919-07ce-4464-8552-6b104e284dca,1,0,cd74d617-8ebe-4a7d-b011-38c98d856d8c,cd74d617-8ebe-4a7d-b011-38c98d856d8c,1,0,f4cff4ff-68e9-4072-971e-1b359d3aa980,f4cff4ff-68e9-4072-971e-1b359d3aa980,1,0,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,1,0,fdb012c9-583a-42af-95da-070e75a58078,fdb012c9-583a-42af-95da-070e75a58078,1,0,7d069b11-cddd-463d-97be-3cbeaaf0954c,7d069b11-cddd-463d-97be-3cbeaaf0954c,1,0,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,1,0,5ea4412e-0ce0-4176-917b-37817ed788e1,5ea4412e-0ce0-4176-917b-37817ed788e1,1,0,8242daae-181a-47df-b28e-c1de3fce0359,8242daae-181a-47df-b28e-c1de3fce0359,1,0,8de2c020-0ebe-4374-93d7-d2e19ed82470,8de2c020-0ebe-4374-93d7-d2e19ed82470,1,0,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,1,0,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,1,0,b9004626-915c-44c8-9cb7-25e5b627ee83,b9004626-915c-44c8-9cb7-25e5b627ee83,1,0,1a3eff9b-6598-4e11-9b8f-81249c53abec,1a3eff9b-6598-4e11-9b8f-81249c53abec,1,0,63c6cfad-124d-491a-829d-b298463c95e6,63c6cfad-124d-491a-829d-b298463c95e6,1,0,3da31d2f-24dd-469b-bd3b-073fa3b3d585,3da31d2f-24dd-469b-bd3b-073fa3b3d585,1,0,33b12dd8-7a86-4a51-bd3d-4911ec1ffde4,33b12dd8-7a86-4a51-bd3d-4911ec1ffde4,1,0,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1,0,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1,0,f11ffcfd-3588-4785-b222-cebe80455303,f11ffcfd-3588-4785-b222-cebe80455303,1,0,789a2027-8601-434c-bf47-37696a3966ad,789a2027-8601-434c-bf47-37696a3966ad,1,0,1c7e9baa-7728-4afd-829a-806cee13ecdb,1c7e9baa-7728-4afd-829a-806cee13ecdb,1,0,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,1,0,bfdc6346-db5b-427f-acca-9b48db8fefd0,bfdc6346-db5b-427f-acca-9b48db8fefd0,1,0,1c3f258c-345e-47f6-9e29-98b1222fb348,1c3f258c-345e-47f6-9e29-98b1222fb348,1,0,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,1,0,4c3085e1-2f86-4af4-a392-ab45e30a7152,4c3085e1-2f86-4af4-a392-ab45e30a7152,1,0,35c938f4-065f-47f5-a75b-637ed0080725,35c938f4-065f-47f5-a75b-637ed0080725,1,0,89cc9ae4-e933-4f4a-849f-48ef67b75819,89cc9ae4-e933-4f4a-849f-48ef67b75819,1,0,36e096be-ee28-437a-b8f2-c1e274c150e3,36e096be-ee28-437a-b8f2-c1e274c150e3,1,0,160e9608-7301-4572-af02-6a7cceca1560,160e9608-7301-4572-af02-6a7cceca1560,1,0,4a70416b-6598-4239-be70-2c0c8255388a,4a70416b-6598-4239-be70-2c0c8255388a,1,0,f6b69c2b-e32a-477f-9128-b61d8237290e,f6b69c2b-e32a-477f-9128-b61d8237290e,1,0,e14c0841-226c-4c79-bec9-cfc8d2c3a160,e14c0841-226c-4c79-bec9-cfc8d2c3a160,1,0,d05bbd02-9db3-4830-be9d-7080f3506e01,d05bbd02-9db3-4830-be9d-7080f3506e01,1,0,6f3c5b90-b030-4267-a973-33d12c2c7680,6f3c5b90-b030-4267-a973-33d12c2c7680,1,0,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1,0,7e3283df-05a6-4dc5-a786-056c71bdbf6f,7e3283df-05a6-4dc5-a786-056c71bdbf6f,1,0,c6af8b0f-3767-4198-88e2-f5763cb0294a,c6af8b0f-3767-4198-88e2-f5763cb0294a,1,0,88b879b7-1bb3-4478-b569-35bdb5c56939,88b879b7-1bb3-4478-b569-35bdb5c56939,1,0,7a62d031-c340-4b1e-90af-fff697a2e979,7a62d031-c340-4b1e-90af-fff697a2e979,1,0,18bf6916-83cc-41e5-a35b-1489450ae632,18bf6916-83cc-41e5-a35b-1489450ae632,1,0,ebab97cf-5335-4648-9845-8ca41f79fb49,ebab97cf-5335-4648-9845-8ca41f79fb49,1,0,bb29fa44-6772-4426-a0b8-422115e14288,bb29fa44-6772-4426-a0b8-422115e14288,1,0,ac847dc9-e222-45cf-af4a-6fa863c919a8,ac847dc9-e222-45cf-af4a-6fa863c919a8,1,0,a5cc5ae2-be80-4957-8aca-9e477433dfcc,a5cc5ae2-be80-4957-8aca-9e477433dfcc,1,0,62fa393c-687c-49bf-8a25-81adc04430fb,62fa393c-687c-49bf-8a25-81adc04430fb,1,0,13fcf1e8-730e-436f-b316-6bcb8301f894,13fcf1e8-730e-436f-b316-6bcb8301f894,1,0,fa548f02-82e0-4897-89e8-0618ebf16919,fa548f02-82e0-4897-89e8-0618ebf16919,1,0,8c28a5b0-517f-48fe-9bde-5e611c319413,8c28a5b0-517f-48fe-9bde-5e611c319413,1,0,904e1209-91d8-49b1-b291-364ef728cbbf,904e1209-91d8-49b1-b291-364ef728cbbf,1,0,4a0d7cd7-8e43-4a1f-88b8-ffc376b38f7c,4a0d7cd7-8e43-4a1f-88b8-ffc376b38f7c,1,0,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1,0,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,1,0,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,1,0,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,1,0,23314bcd-2dd4-43f1-9fdb-ae182a48c886,23314bcd-2dd4-43f1-9fdb-ae182a48c886,1,0,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,1,0,9440a132-366f-4fc9-bd72-2544ba2b072a,9440a132-366f-4fc9-bd72-2544ba2b072a,1,0,84282afa-21f5-40db-9386-e6f741c9a06c,84282afa-21f5-40db-9386-e6f741c9a06c,1,0,5b3b3da9-8619-4fbd-b140-3528875cd179,5b3b3da9-8619-4fbd-b140-3528875cd179,1,0,99e5e866-7ac6-4916-ab66-3e2909822c56,99e5e866-7ac6-4916-ab66-3e2909822c56,1,0,03363877-2752-4a03-95f2-d73b732e0bfd,03363877-2752-4a03-95f2-d73b732e0bfd,1,0,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,1,0,78051e10-74ab-44be-adca-e4c93824a386,78051e10-74ab-44be-adca-e4c93824a386,1,0,73629419-83d8-4727-88a9-76c851d104c9,73629419-83d8-4727-88a9-76c851d104c9,1,0,cadb54f0-dcff-4f96-983e-a309fd72f330,cadb54f0-dcff-4f96-983e-a309fd72f330,1,0,a9c3065b-db68-4f59-9235-33f9fbfdaafd,a9c3065b-db68-4f59-9235-33f9fbfdaafd,1,0,3715cf3d-0abc-4711-8ac9-d41f0be7878f,3715cf3d-0abc-4711-8ac9-d41f0be7878f,1,0,8e8d8078-8b32-4c24-b26e-89a92bf60160,8e8d8078-8b32-4c24-b26e-89a92bf60160,1,0,e6af9db4-b93f-422e-846c-e6c5fd33f992,e6af9db4-b93f-422e-846c-e6c5fd33f992,1,0,f96cbb27-7619-41e0-8577-e623ef02dc58,f96cbb27-7619-41e0-8577-e623ef02dc58,1,0,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,1,0,d74dfd31-2016-435b-8652-15fdbca59490,d74dfd31-2016-435b-8652-15fdbca59490,1,0,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,1,0,27651e0e-d560-434b-a49c-f473a5b20c4d,27651e0e-d560-434b-a49c-f473a5b20c4d,1,0,dab1491b-0685-442d-b945-2bfde3f37933,dab1491b-0685-442d-b945-2bfde3f37933,1,0,42107b14-9373-418a-a41d-35c87434c51a,42107b14-9373-418a-a41d-35c87434c51a,1,0,24d8ce8d-e94c-4168-abad-d0ce5e6cbf1b,24d8ce8d-e94c-4168-abad-d0ce5e6cbf1b,1,0,8786575a-eab6-46bf-be3a-167e2d5b41dd,8786575a-eab6-46bf-be3a-167e2d5b41dd,1,0,ce85554b-81ba-4149-a951-d09bdc14fa16,ce85554b-81ba-4149-a951-d09bdc14fa16,1,0,23a1ef35-1469-44ea-8535-fa9c7f535cae,23a1ef35-1469-44ea-8535-fa9c7f535cae,1,0,9ff1c73e-71be-4ea6-97fb-e710d995ee62,9ff1c73e-71be-4ea6-97fb-e710d995ee62,1,0,50f7effb-e051-49dd-8b56-0771dda350cc,50f7effb-e051-49dd-8b56-0771dda350cc,1,0,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,1,0,2558d812-ac0a-49ba-87db-3f661209a3c4,2558d812-ac0a-49ba-87db-3f661209a3c4,1,0,20d712ef-77c1-4374-92e1-f20a3ebc7eab,20d712ef-77c1-4374-92e1-f20a3ebc7eab,1,0,65d23ce8-e326-45ee-86b0-6dcf35797201,65d23ce8-e326-45ee-86b0-6dcf35797201,1,0,a2683c3f-1b21-47d8-951d-7d30cde51efc,a2683c3f-1b21-47d8-951d-7d30cde51efc,1,0,54c77053-1728-4914-a354-73fe8853a0e1,54c77053-1728-4914-a354-73fe8853a0e1,1,0,21136691-078f-4bf7-bddd-f41416a76d86,21136691-078f-4bf7-bddd-f41416a76d86,1,0,9d669d30-a0af-4095-852a-96b4224ee933,9d669d30-a0af-4095-852a-96b4224ee933,1,0,590aba18-7d56-48e3-9454-5f2882a32f80,590aba18-7d56-48e3-9454-5f2882a32f80,1,0,30a121c7-c4f5-45c4-9504-9778ed85d9e3,30a121c7-c4f5-45c4-9504-9778ed85d9e3,1,0,c68e2157-2541-4f80-966a-d68ce603f131,c68e2157-2541-4f80-966a-d68ce603f131,1,0,18363a37-28b0-488b-a7d6-54d3596d2a6d,18363a37-28b0-488b-a7d6-54d3596d2a6d,1,0,e5f401b5-4672-4529-a8dd-6d819f3f269c,e5f401b5-4672-4529-a8dd-6d819f3f269c,1,0,126d5d78-a2b0-4c16-b429-bf8d251280e7,126d5d78-a2b0-4c16-b429-bf8d251280e7,1,0,f8f96dce-913c-4858-bcb7-dcfe3dc2f72e,f8f96dce-913c-4858-bcb7-dcfe3dc2f72e,1,0,70d93c88-c9e9-4b8e-b8f3-ef07c665ab5d,70d93c88-c9e9-4b8e-b8f3-ef07c665ab5d,1,0,12443114-1931-4eb7-968a-7dbe166b7298,12443114-1931-4eb7-968a-7dbe166b7298,1,0,0080c29d-ec54-43a8-aab8-c67e0279b6b7,0080c29d-ec54-43a8-aab8-c67e0279b6b7,1,0,a0271f6e-dc70-4dfe-a395-203e8a89f933,a0271f6e-dc70-4dfe-a395-203e8a89f933,1,0,e5dfee58-f748-48ee-81a3-7c6133f06365,e5dfee58-f748-48ee-81a3-7c6133f06365,1,0,5e52dfe6-5a98-4a32-9429-5f44bf442367,5e52dfe6-5a98-4a32-9429-5f44bf442367,1,0,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,1,0,d065c02e-9991-468a-ae32-b8c29d078d03,d065c02e-9991-468a-ae32-b8c29d078d03,1,0,c509683e-eb13-4e1a-91ed-cd6982ec5001,c509683e-eb13-4e1a-91ed-cd6982ec5001,1,0,88bf6f58-7943-42c4-bc0f-56b991590026,88bf6f58-7943-42c4-bc0f-56b991590026,1,0,9aa0a0cb-9547-4868-9495-b00f3ecd2b3a,9aa0a0cb-9547-4868-9495-b00f3ecd2b3a,1,0,a9e31d90-fe65-47c3-8109-6e1eae862f53,a9e31d90-fe65-47c3-8109-6e1eae862f53,1,0,68500931-89e0-491e-aba8-b013c9e6f8c3,68500931-89e0-491e-aba8-b013c9e6f8c3,1,0,70b79e56-bb71-4f38-93cf-94dda79d9b4c,70b79e56-bb71-4f38-93cf-94dda79d9b4c,1,0,e678bb94-3cb1-4706-8e76-4fada4d5036c,e678bb94-3cb1-4706-8e76-4fada4d5036c,1,0,5c4c9931-3fb0-47a8-9e4f-d552de12b355,5c4c9931-3fb0-47a8-9e4f-d552de12b355,1,0,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,1,0,2a498baf-ec2e-4dda-b568-801bb60db225,2a498baf-ec2e-4dda-b568-801bb60db225,1,0,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,1,0,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,1,0,f987ca28-545b-4540-9e36-b0daa67dc3cb,f987ca28-545b-4540-9e36-b0daa67dc3cb,1,0,70f156d8-9cb4-442d-a36b-7a43d03bcd12,70f156d8-9cb4-442d-a36b-7a43d03bcd12,1,0,35989876-16b1-4b02-9381-444a06a7a21d,35989876-16b1-4b02-9381-444a06a7a21d,1,0,f7608000-1e8a-4ca4-afb7-e04ef547b70a,f7608000-1e8a-4ca4-afb7-e04ef547b70a,1,0,f0a6de82-45ab-4153-bccf-df82fc960aa1,f0a6de82-45ab-4153-bccf-df82fc960aa1,1,0,77adf47b-6015-46fc-9e29-f1c025ea0d81,77adf47b-6015-46fc-9e29-f1c025ea0d81,1,0,26cea519-19d0-4707-be0a-1a43fde6e563,26cea519-19d0-4707-be0a-1a43fde6e563,1,0,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,1,0,7ea3206a-2a16-460d-ad6d-849103f50bdb,7ea3206a-2a16-460d-ad6d-849103f50bdb,1,0,eb35bff2-8467-48fe-bf93-ece2aa40f506,eb35bff2-8467-48fe-bf93-ece2aa40f506,1,0,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,1,0,10302ca9-850c-4561-a774-d099c20b1919,10302ca9-850c-4561-a774-d099c20b1919,1,0,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,1,0,d693bfcf-e117-445b-b0e1-d895bc5227c4,d693bfcf-e117-445b-b0e1-d895bc5227c4,1,0,68cf55da-b29e-4a65-815b-c9cdc8e5888e,68cf55da-b29e-4a65-815b-c9cdc8e5888e,1,0,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,1,0,1041ed81-c1f7-43b2-9087-914865a3076e,1041ed81-c1f7-43b2-9087-914865a3076e,1,0,5d7174d2-42b3-4e12-b705-4209dd73b53b,5d7174d2-42b3-4e12-b705-4209dd73b53b,1,0,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,1,0,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,1,0,0508e7ab-3dd9-42b4-9542-089ce0656bbb,0508e7ab-3dd9-42b4-9542-089ce0656bbb,1,0,cfe59dfd-a509-4f83-b926-b3ff94234a43,cfe59dfd-a509-4f83-b926-b3ff94234a43,1,0,17df1591-61b0-4204-8379-8d1f58445968,17df1591-61b0-4204-8379-8d1f58445968,1,0,9020fa9d-e7de-4574-ab65-db6651b5b610,9020fa9d-e7de-4574-ab65-db6651b5b610,1,0,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,1,0,e83ad33d-27df-4181-afd2-b7f416e6e705,e83ad33d-27df-4181-afd2-b7f416e6e705,1,0,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,1,0,f0438b0a-7916-4de4-a3a8-d43407c3295f,f0438b0a-7916-4de4-a3a8-d43407c3295f,1,0,3309648c-aae6-4684-ae8d-7ed636bc3468,3309648c-aae6-4684-ae8d-7ed636bc3468,1,0,f9aa933e-6684-48de-b802-96c8e61b1fe6,f9aa933e-6684-48de-b802-96c8e61b1fe6,1,0,f41e5a5b-394b-423a-bee5-ed4d1da0be71,f41e5a5b-394b-423a-bee5-ed4d1da0be71,1,0,23db175f-ddfb-4af7-9c0c-232b6adb7daf,23db175f-ddfb-4af7-9c0c-232b6adb7daf,1,0,9de4d430-95ec-4435-b3e8-4fc85778d517,9de4d430-95ec-4435-b3e8-4fc85778d517,1,0,205b8908-fa21-42bd-bff0-fb95e6787f15,205b8908-fa21-42bd-bff0-fb95e6787f15,1,0,4e309f26-35e8-49d9-bbd1-c7884e666dca,4e309f26-35e8-49d9-bbd1-c7884e666dca,1,0,84f05fe4-51d3-49a8-83e7-1cae2028147e,84f05fe4-51d3-49a8-83e7-1cae2028147e,1,0,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,1,0,5320abf1-b09b-4de0-9adf-4cb1da31df6f,5320abf1-b09b-4de0-9adf-4cb1da31df6f,1,0,c382ee3a-d0a8-4ed8-ac88-5558b631f448,c382ee3a-d0a8-4ed8-ac88-5558b631f448,1,0,3916ddbd-9023-42a4-849e-9cda6e591408,3916ddbd-9023-42a4-849e-9cda6e591408,1,0,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,1,0,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,1,0,8e36227c-c0aa-43c4-93ad-e78701248fb1,8e36227c-c0aa-43c4-93ad-e78701248fb1,1,0,f135b60e-6d28-4ba1-acd7-76090f14855d,f135b60e-6d28-4ba1-acd7-76090f14855d,1,0,5b105084-c4ba-4ff6-9196-8b3e3a9991e2,5b105084-c4ba-4ff6-9196-8b3e3a9991e2,1,0,f78ffd16-5bd4-421a-99af-9cf5f126d960,f78ffd16-5bd4-421a-99af-9cf5f126d960,1,0,2bd23dd2-8107-410f-8137-3d022546594b,2bd23dd2-8107-410f-8137-3d022546594b,1,0,3f09badb-70bd-4996-822f-2e2e9524f09d,3f09badb-70bd-4996-822f-2e2e9524f09d,1,0,aca89232-c531-47ca-a82e-e7bfadd56674,aca89232-c531-47ca-a82e-e7bfadd56674,1,0,4b8927df-e124-4bf6-9d70-6e91b4796d90,4b8927df-e124-4bf6-9d70-6e91b4796d90,1,0,871b63a2-c7a6-4343-8d8b-7dda1b0def87,871b63a2-c7a6-4343-8d8b-7dda1b0def87,1,0,52b45b3d-b01b-4aac-8a1e-e256957c39c3,52b45b3d-b01b-4aac-8a1e-e256957c39c3,1,0,fc78d8df-ab27-4544-a65c-73908b9c5425,fc78d8df-ab27-4544-a65c-73908b9c5425,1,0,f8a090d2-b2d1-4ead-a8bf-6325a7552743,f8a090d2-b2d1-4ead-a8bf-6325a7552743,1,0,84f935da-9fe5-44ea-845b-b447b8b0a6f5,84f935da-9fe5-44ea-845b-b447b8b0a6f5,1,0,d0b49fd9-4054-409f-97a0-a0811ba6c1ab,d0b49fd9-4054-409f-97a0-a0811ba6c1ab,1,0,c7130560-3953-496f-b1d0-cae676fcb5a9,c7130560-3953-496f-b1d0-cae676fcb5a9,1,0,b7d5c226-a787-45e5-b46b-c51b145fcf6a,b7d5c226-a787-45e5-b46b-c51b145fcf6a,1,0,8ca63a1d-4593-4f52-8b5e-4feb9f8487ca,8ca63a1d-4593-4f52-8b5e-4feb9f8487ca,1,0,1e4cc0d6-6e5e-4d16-ba44-060912ec292f,1e4cc0d6-6e5e-4d16-ba44-060912ec292f,1,0,e9311a22-56b5-4607-8eaa-52382ed040c3,e9311a22-56b5-4607-8eaa-52382ed040c3,1,0,dc7b8596-b2c0-415f-95d9-c0aaa96c5675,dc7b8596-b2c0-415f-95d9-c0aaa96c5675,1,0,87e6e315-01e0-41eb-8373-0a60635f2f7a,87e6e315-01e0-41eb-8373-0a60635f2f7a,1,0,9b77e99b-b1d3-4368-a671-59e0ebba3f0e,9b77e99b-b1d3-4368-a671-59e0ebba3f0e,1,0,ad847998-6e50-4160-81fc-3b58ad68f202,ad847998-6e50-4160-81fc-3b58ad68f202,1,0,b2b98bcf-41da-4643-a6dc-39e5379b99e5,b2b98bcf-41da-4643-a6dc-39e5379b99e5,1,0,fdd9fb90-f5f0-4c08-9341-4374403bc950,fdd9fb90-f5f0-4c08-9341-4374403bc950,1,0,0e2d814a-cc9d-4f91-910d-bda54779e298,0e2d814a-cc9d-4f91-910d-bda54779e298,1,0,8fdfef8d-502e-4d27-a539-e833048fa1eb,8fdfef8d-502e-4d27-a539-e833048fa1eb,1,0,65530aca-7cf2-4a52-b5be-5dcbc15a049e,65530aca-7cf2-4a52-b5be-5dcbc15a049e,1,0,15eb2c2d-305d-42c0-9aec-936b82114bdb,15eb2c2d-305d-42c0-9aec-936b82114bdb,1,0,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,1,0,cbca7272-2aae-4e21-b3f5-12786f085648,cbca7272-2aae-4e21-b3f5-12786f085648,1,0,7718bd0b-7b8a-4ffc-b228-f05683b5531a,7718bd0b-7b8a-4ffc-b228-f05683b5531a,1,0,0b303d25-e141-431f-828c-1778d3c247f6,0b303d25-e141-431f-828c-1778d3c247f6,1,0,881f53bc-a52e-4312-b09d-3d3f53ddf84b,881f53bc-a52e-4312-b09d-3d3f53ddf84b,1,0,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,1,0,945ae8d2-b74a-41e9-b740-c82acdd40d04,945ae8d2-b74a-41e9-b740-c82acdd40d04,1,0,976533bf-f162-42a1-a47e-6d681ee67b82,976533bf-f162-42a1-a47e-6d681ee67b82,1,0,19bc0dd8-9e6b-4855-bc42-b4e98443163f,19bc0dd8-9e6b-4855-bc42-b4e98443163f,1,0,a61e10af-eaba-4e7a-a641-65d77453a559,a61e10af-eaba-4e7a-a641-65d77453a559,1,0,edf81bbb-905a-474d-959a-db5629a8e104,edf81bbb-905a-474d-959a-db5629a8e104,1,0,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,1,0,e9e242b7-0077-4c47-8f45-df50e7cc90cf,e9e242b7-0077-4c47-8f45-df50e7cc90cf,1,0,820383e1-9b95-4c0f-8464-722f1fe64ad5,820383e1-9b95-4c0f-8464-722f1fe64ad5,1,0,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,1,0,292bfe6b-703e-40cb-856d-abb470e6709f,292bfe6b-703e-40cb-856d-abb470e6709f,1,0,276c42ca-f5e0-4bb4-9b89-a925def35cb1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,1,0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,1,0,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1,0,8811ea1a-1221-47b7-9574-3f36ff15a3cf,8811ea1a-1221-47b7-9574-3f36ff15a3cf,1,0,1d715463-691b-4c01-ae39-57c261f2a6ad,1d715463-691b-4c01-ae39-57c261f2a6ad,1,0,4c3d007f-a62c-4fd9-beda-58dbf08ad188,4c3d007f-a62c-4fd9-beda-58dbf08ad188,1,0,c35373a9-f0b0-4ddb-a985-409ac9c64609,c35373a9-f0b0-4ddb-a985-409ac9c64609,1,0,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,1,0,c1c40916-fee5-46e3-90fc-10e7595866c9,c1c40916-fee5-46e3-90fc-10e7595866c9,1,0,87dad256-122b-4d7e-b249-a2c313a9cf33,87dad256-122b-4d7e-b249-a2c313a9cf33,1,0,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,1,0,f20a04a7-84fa-48e3-8ac5-28176c1fcada,f20a04a7-84fa-48e3-8ac5-28176c1fcada,1,0,b722d6e1-fd6f-4bb4-923d-01764393722d,b722d6e1-fd6f-4bb4-923d-01764393722d,1,0,ac5f945e-2d03-44fb-a8cf-5d786194cefd,ac5f945e-2d03-44fb-a8cf-5d786194cefd,1,0,698ec00f-bf75-420e-81ab-a98808daf3f7,698ec00f-bf75-420e-81ab-a98808daf3f7,1,0,f441907c-d02e-431e-baf4-1854e48a1f50,f441907c-d02e-431e-baf4-1854e48a1f50,1,0,4ad722ca-10fc-4a83-91c9-ef0012685f89,4ad722ca-10fc-4a83-91c9-ef0012685f89,1,0,783dd4ba-a597-45ba-8989-2ed5224d62bc,783dd4ba-a597-45ba-8989-2ed5224d62bc,1,0,3b033d29-0de7-49dd-90bc-f414b28426d7,3b033d29-0de7-49dd-90bc-f414b28426d7,1,0,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,1,0,dad9710a-73ca-4e0d-b98b-75f955d0822d,dad9710a-73ca-4e0d-b98b-75f955d0822d,1,0,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,1,0,2191939f-6f71-47c9-a3d2-57acbf7f411e,2191939f-6f71-47c9-a3d2-57acbf7f411e,1,0,6ddd9c1f-daff-494c-bd6f-741bd40881ab,6ddd9c1f-daff-494c-bd6f-741bd40881ab,1,0,683c1238-5828-4ab9-a89e-7a3b31fc7fa5,683c1238-5828-4ab9-a89e-7a3b31fc7fa5,1,0,7e9c0fa3-128e-4c3f-a1f7-63cb88a1c0b1,7e9c0fa3-128e-4c3f-a1f7-63cb88a1c0b1,1,0,2ca8bca9-813a-4833-8ef0-a5e83f91c10f,2ca8bca9-813a-4833-8ef0-a5e83f91c10f,1,0,59b34b58-6ac9-467e-963b-0cccbf098797,59b34b58-6ac9-467e-963b-0cccbf098797,1,0,313d9858-3995-4a4c-b2b0-15d2350417b4,313d9858-3995-4a4c-b2b0-15d2350417b4,1,0,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,1,0,a2c36563-126d-4c3a-9714-5b7a4903073b,a2c36563-126d-4c3a-9714-5b7a4903073b,1,0,2e4da82c-dddb-4462-b34f-6511cd2a8356,2e4da82c-dddb-4462-b34f-6511cd2a8356,1,0,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,1,0,2976c29f-f482-463d-8f6e-6a632fb50893,2976c29f-f482-463d-8f6e-6a632fb50893,1,0,701964a1-7762-45ee-a9a4-41dd9ce94783,701964a1-7762-45ee-a9a4-41dd9ce94783,1,0,55d1909e-f552-441f-8e14-47d2e604cf6a,55d1909e-f552-441f-8e14-47d2e604cf6a,1,0,eae627db-c52b-4e41-94d1-58db28cd0063,eae627db-c52b-4e41-94d1-58db28cd0063,1,0,514e95b8-2fdd-46f7-89bf-7d1a3d9d6e1b,514e95b8-2fdd-46f7-89bf-7d1a3d9d6e1b,1,0,6ca91336-5ccd-4d0b-9602-53f4925c492d,6ca91336-5ccd-4d0b-9602-53f4925c492d,1,0,d853dd5f-d987-4cdb-82b5-5e40a5a5e449,d853dd5f-d987-4cdb-82b5-5e40a5a5e449,1,0,dc16c546-eecc-49fe-a401-e2e3987faa1f,dc16c546-eecc-49fe-a401-e2e3987faa1f,1,0,47058e36-a281-43a5-a41d-691b3ef32b5b,47058e36-a281-43a5-a41d-691b3ef32b5b,1,0,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,1,0,646def82-bc88-4187-8be0-93938656a20f,646def82-bc88-4187-8be0-93938656a20f,1,0,e620e93c-4382-478f-a700-ad2faa67362b,e620e93c-4382-478f-a700-ad2faa67362b,1,0,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,1,0,9c4e28e8-7257-42ed-9fd8-793a0b8eb945,9c4e28e8-7257-42ed-9fd8-793a0b8eb945,1,0,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,1,0,7f6222c1-1a50-4565-b66b-bcb430674efc,7f6222c1-1a50-4565-b66b-bcb430674efc,1,0,a4a8693b-dc91-4762-92e6-35360c8768db,a4a8693b-dc91-4762-92e6-35360c8768db,1,0,2ae236ec-28a7-44e0-a0ba-be62fe52d817,2ae236ec-28a7-44e0-a0ba-be62fe52d817,1,0,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,1,0,b0fca543-6951-4233-bdf6-58082b22252a,b0fca543-6951-4233-bdf6-58082b22252a,1,0,4929cf90-54c6-412c-b2fa-dc8230fb8f85,4929cf90-54c6-412c-b2fa-dc8230fb8f85,1,0,52ae6431-afb3-4dea-b106-00e11b174ec7,52ae6431-afb3-4dea-b106-00e11b174ec7,1,0,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,1,0,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,1,0,528d96cc-8838-49ea-8d76-ea56747882e0,528d96cc-8838-49ea-8d76-ea56747882e0,1,0,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,1,0,8b83324c-e10e-49d1-99d7-5bc468c25975,8b83324c-e10e-49d1-99d7-5bc468c25975,1,0,ddb75923-27bf-4996-b024-4bc6eb0f59a7,ddb75923-27bf-4996-b024-4bc6eb0f59a7,1,0,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,1,0,ed137e05-1996-411d-9927-45a3d7e3ee3b,ed137e05-1996-411d-9927-45a3d7e3ee3b,1,0,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,1,0,fbebf341-9842-41e1-8e4d-490fa02065ce,fbebf341-9842-41e1-8e4d-490fa02065ce,1,0,3be0acc7-223a-46ec-9ea2-ec99b869fa78,3be0acc7-223a-46ec-9ea2-ec99b869fa78,1,0,067f88f6-ccd2-491e-a466-94345a1f220f,067f88f6-ccd2-491e-a466-94345a1f220f,1,0,517ac144-ecb9-4d14-83ea-01e58f0901fc,517ac144-ecb9-4d14-83ea-01e58f0901fc,1,0,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,1,0,486083d8-33b1-453f-9f05-5ff867e2f4ba,486083d8-33b1-453f-9f05-5ff867e2f4ba,1,0,e4f9d9f6-38d7-4056-a95a-987ad2da2211,e4f9d9f6-38d7-4056-a95a-987ad2da2211,1,0,22c21c2b-4297-43b2-88f0-9555d22f7a14,22c21c2b-4297-43b2-88f0-9555d22f7a14,1,0,734f61c4-5429-4a09-8697-8949ac5e6bd1,734f61c4-5429-4a09-8697-8949ac5e6bd1,1,0,d04e0e2d-0a5f-4866-b0b3-b582915db899,d04e0e2d-0a5f-4866-b0b3-b582915db899,1,0,19649d3f-52aa-4054-bb84-a6a11d212495,19649d3f-52aa-4054-bb84-a6a11d212495,1,0,640d7486-8abd-40aa-a244-2ed899b7225a,640d7486-8abd-40aa-a244-2ed899b7225a,1,0,58321939-f25a-456d-8dee-97e64743dc2e,58321939-f25a-456d-8dee-97e64743dc2e,1,0,416fba62-70c4-4f8c-b10b-56d47b27ca35,416fba62-70c4-4f8c-b10b-56d47b27ca35,1,0,ec48a164-bc30-4e36-a40a-a3cca07aea0d,ec48a164-bc30-4e36-a40a-a3cca07aea0d,1,0,3174d57f-c6a8-44dc-adc1-47e9a54c844d,3174d57f-c6a8-44dc-adc1-47e9a54c844d,1,0,c05f87b4-ec5f-4d14-981f-02ca8ba89863,c05f87b4-ec5f-4d14-981f-02ca8ba89863,1,0,b7736108-89bd-44eb-89c1-8a5a774058f1,b7736108-89bd-44eb-89c1-8a5a774058f1,1,0,e07841ef-8392-4ceb-936d-fd160b3b03cd,e07841ef-8392-4ceb-936d-fd160b3b03cd,1,0,eee66f49-8954-4674-9e02-6bff6c332d30,eee66f49-8954-4674-9e02-6bff6c332d30,1,0,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,1,0,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,1,0,875d1fc1-8172-4e48-8192-035882e1665d,875d1fc1-8172-4e48-8192-035882e1665d,1,0,26132b28-98cc-4690-92ad-139f91839ba2,26132b28-98cc-4690-92ad-139f91839ba2,1,0,e7415ada-dd47-41f5-b4d5-7e77d1adad33,e7415ada-dd47-41f5-b4d5-7e77d1adad33,1,0,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0bd85b79-cc32-4c1d-b629-567a1bdfac56,1,0,79c15db6-6066-4fe5-b30e-3196b6ca3d66,79c15db6-6066-4fe5-b30e-3196b6ca3d66,1,0,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,1,0,ca81e0ea-c428-47f9-aedb-078214104a2f,ca81e0ea-c428-47f9-aedb-078214104a2f,1,0,9518d09c-6996-4439-9278-3c71d5ae8fce,9518d09c-6996-4439-9278-3c71d5ae8fce,1,0,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,1,0,40cefda6-490e-4962-9747-94b823ea4ed7,40cefda6-490e-4962-9747-94b823ea4ed7,1,0,5fbd9a13-012d-4c36-b72c-da3bc4157cff,5fbd9a13-012d-4c36-b72c-da3bc4157cff,1,0,7e8d7d4f-98f7-4c81-94b1-f2d552b1ae5d,7e8d7d4f-98f7-4c81-94b1-f2d552b1ae5d,1,0,6aa6d14f-cd6c-413a-864e-d847d9ce120b,6aa6d14f-cd6c-413a-864e-d847d9ce120b,1,0,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,1,0,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,1,0,35a28677-0653-47f9-82e1-02c4b9266fee,35a28677-0653-47f9-82e1-02c4b9266fee,1,0,461be12a-9f16-4826-978a-436608ca8733,461be12a-9f16-4826-978a-436608ca8733,1,0,9b143299-d300-4b6c-b667-5552fb3bdcde,9b143299-d300-4b6c-b667-5552fb3bdcde,1,0,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,1,0,74973d06-f57d-403e-945c-5cd2f4fc4869,74973d06-f57d-403e-945c-5cd2f4fc4869,1,0,259564b8-172e-4eed-9360-d561ec6dad69,259564b8-172e-4eed-9360-d561ec6dad69,1,0,91c799d7-2b3d-4d1a-87ff-221057a428c6,91c799d7-2b3d-4d1a-87ff-221057a428c6,1,0,5a2d5d8a-afd9-4954-9868-7c82bad00426,5a2d5d8a-afd9-4954-9868-7c82bad00426,1,0,26aea96b-20f8-4e35-b55f-4fe3602e6597,26aea96b-20f8-4e35-b55f-4fe3602e6597,1,0,a3a3a211-e361-4e41-a6f8-d731a366c163,a3a3a211-e361-4e41-a6f8-d731a366c163,1,0,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,1,0,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,1,0,ca01417c-0ffd-4e00-91e8-93cd305be82d,ca01417c-0ffd-4e00-91e8-93cd305be82d,1,0,933ae96b-c69e-4396-bbfb-0daa81e529a4,933ae96b-c69e-4396-bbfb-0daa81e529a4,1,0,e1823be2-b646-4a1a-a9a9-c925a12c0586,e1823be2-b646-4a1a-a9a9-c925a12c0586,1,0,909e56e3-981f-430b-b775-18c70b3549e7,909e56e3-981f-430b-b775-18c70b3549e7,1,0,e613a6aa-82cb-40fd-8f28-0a74fe21e6a6,e613a6aa-82cb-40fd-8f28-0a74fe21e6a6,1,0,b98ca634-25a5-4366-af04-815ba34c8bb2,b98ca634-25a5-4366-af04-815ba34c8bb2,1,0,14d69108-4d26-401a-b7ae-2c86dadf831c,14d69108-4d26-401a-b7ae-2c86dadf831c,1,0,d6251f65-d366-4bc9-a5db-42063fe03594,d6251f65-d366-4bc9-a5db-42063fe03594,1,0,22c60cbc-429f-40d9-bf8b-681b7786c41d,22c60cbc-429f-40d9-bf8b-681b7786c41d,1,0,8d9d2284-e592-44c5-93bb-247037ab6b95,8d9d2284-e592-44c5-93bb-247037ab6b95,1,0,31dd320b-06aa-4314-9914-2c2420f572a1,31dd320b-06aa-4314-9914-2c2420f572a1,1,0,56730848-3bef-4b8c-b449-fe9d09c9c374,56730848-3bef-4b8c-b449-fe9d09c9c374,1,0,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,1,0,91d8c5e4-eaec-4951-9224-16882fda08f6,91d8c5e4-eaec-4951-9224-16882fda08f6,1,0,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,1,0,4654d192-74bf-430f-abee-6f4dc431b182,4654d192-74bf-430f-abee-6f4dc431b182,1,0,c4fe10b6-d025-4736-be23-3113bd7fe7b4,c4fe10b6-d025-4736-be23-3113bd7fe7b4,1,0,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1,0,4678c704-933a-45ef-9d41-89b8f39016bb,4678c704-933a-45ef-9d41-89b8f39016bb,1,0,8ceea1e8-42ce-469f-823a-ceffdbd6b112,8ceea1e8-42ce-469f-823a-ceffdbd6b112,1,0,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,1,0,3f7ee937-d853-47b7-a1f5-d821208e3531,3f7ee937-d853-47b7-a1f5-d821208e3531,1,0,086d69d6-e2fa-45cb-84b6-f8f3e2919160,086d69d6-e2fa-45cb-84b6-f8f3e2919160,1,0,6995ee71-5901-46d9-a5c1-b35d795bda20,6995ee71-5901-46d9-a5c1-b35d795bda20,1,0,543c32a4-ad43-4f60-9b35-77081f841ad9,543c32a4-ad43-4f60-9b35-77081f841ad9,1,0,e93a4293-0497-4f11-b8b9-40300104fb96,e93a4293-0497-4f11-b8b9-40300104fb96,1,0,93531e5d-5dfc-42e8-be52-2e83f37262b0,93531e5d-5dfc-42e8-be52-2e83f37262b0,1,0,61bf78c0-7004-4a74-b362-e979c7316e05,61bf78c0-7004-4a74-b362-e979c7316e05,1,0,c4351896-eff1-4e4d-8823-028d63a9d6bf,c4351896-eff1-4e4d-8823-028d63a9d6bf,1,0,475f83a2-ba5a-4072-94f8-1324b1f198a4,475f83a2-ba5a-4072-94f8-1324b1f198a4,1,0,a9ae364f-b668-4fb4-b976-f227951ffb6b,a9ae364f-b668-4fb4-b976-f227951ffb6b,1,0,63066bee-d428-4e32-a032-f17475056537,63066bee-d428-4e32-a032-f17475056537,1,0,cd7c15c1-c573-46c9-b109-339b8b54c3ee,cd7c15c1-c573-46c9-b109-339b8b54c3ee,1,0,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,1,0,deee8bde-381f-4094-8794-7a06248860dd,deee8bde-381f-4094-8794-7a06248860dd,1,0,8c2a0f6b-492c-4c5a-97c5-da0d07f9d781,8c2a0f6b-492c-4c5a-97c5-da0d07f9d781,1,0,d92cb614-ed09-47db-b70b-d3e533c44c6a,d92cb614-ed09-47db-b70b-d3e533c44c6a,1,0,2757ee75-4b36-4901-bff1-044708754edb,2757ee75-4b36-4901-bff1-044708754edb,1,0,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,1,0,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,1,0,90032ffa-f117-4a34-82f8-cc7e5a22a542,90032ffa-f117-4a34-82f8-cc7e5a22a542,1,0,71144539-6472-4727-8887-0139f6221370,71144539-6472-4727-8887-0139f6221370,1,0,bff07da4-ae19-48a9-806b-14b285d42485,bff07da4-ae19-48a9-806b-14b285d42485,1,0,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,1,0,b0ccc05d-8d39-4f57-8e87-6846014f92ea,b0ccc05d-8d39-4f57-8e87-6846014f92ea,1,0,49e787c9-753a-468a-b8dd-2e970d9a1fed,49e787c9-753a-468a-b8dd-2e970d9a1fed,1,0,e871dea7-1953-4511-90b0-e0957afac4c0,e871dea7-1953-4511-90b0-e0957afac4c0,1,0,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,1,0,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,1,0,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,1,0,d91441cf-d793-4dfa-9225-f0c16818edde,d91441cf-d793-4dfa-9225-f0c16818edde,1,0,8986c155-54be-4b1b-b31a-5c00b88bc40d,8986c155-54be-4b1b-b31a-5c00b88bc40d,1,0,40ae107d-67a8-404c-adf9-1a760bba94ff,40ae107d-67a8-404c-adf9-1a760bba94ff,1,0,42a39785-144c-4d2d-92c6-fd8b345f687b,42a39785-144c-4d2d-92c6-fd8b345f687b,1,0,7172bed5-b12b-4e83-b15d-1d95b63a6272,7172bed5-b12b-4e83-b15d-1d95b63a6272,1,0,25d75a3c-b801-4b1e-aed8-90e667f36c67,25d75a3c-b801-4b1e-aed8-90e667f36c67,1,0,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,1,0,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,1,0,a275802f-937a-49f4-92da-fcdd185a036d,a275802f-937a-49f4-92da-fcdd185a036d,1,0,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,1,0,f2dc9319-ba60-421a-8340-be3e3a291393,f2dc9319-ba60-421a-8340-be3e3a291393,1,0,bf4eb62a-bc74-4845-bad2-58a2a8302a65,bf4eb62a-bc74-4845-bad2-58a2a8302a65,1,0,b66eb190-1c16-4f20-a94f-954bcdf313b8,b66eb190-1c16-4f20-a94f-954bcdf313b8,1,0,49e21b87-beae-4640-a497-ef468da0cbbc,49e21b87-beae-4640-a497-ef468da0cbbc,1,0,08c83b5e-08dd-425d-b024-62af684df926,08c83b5e-08dd-425d-b024-62af684df926,1,0,9e40a2ef-0c96-4455-8ed6-6e09011df3df,9e40a2ef-0c96-4455-8ed6-6e09011df3df,1,0,0de78690-2038-456b-b140-2b2b81f14e44,0de78690-2038-456b-b140-2b2b81f14e44,1,0,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,1,0,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,1,0,b953eafc-20be-4463-8c3e-903184e18402,b953eafc-20be-4463-8c3e-903184e18402,1,0,dcefdde9-645e-43c7-9244-384dadc75439,dcefdde9-645e-43c7-9244-384dadc75439,1,0,fa787228-aed5-4a16-b958-d102b78bf776,fa787228-aed5-4a16-b958-d102b78bf776,1,0,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,1,0,be900d20-c02d-476d-9ede-2bc5303ef6cb,be900d20-c02d-476d-9ede-2bc5303ef6cb,1,0,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,1,0,07b53437-cc8d-4834-a1e0-7007538b6eab,07b53437-cc8d-4834-a1e0-7007538b6eab,1,0,0dbec644-cb98-4368-ab76-5997259cbce7,0dbec644-cb98-4368-ab76-5997259cbce7,1,0,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,1,0,74b1237b-4a46-438d-9756-b564260df99d,74b1237b-4a46-438d-9756-b564260df99d,1,0,19decf0f-c24e-4551-b3d6-8ebd413cba78,19decf0f-c24e-4551-b3d6-8ebd413cba78,1,0,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,1,0,189383a5-0001-4427-9e00-18451e4bfb6e,189383a5-0001-4427-9e00-18451e4bfb6e,1,0,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,1,0,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,1,0,08dbba81-68fb-49ef-8aac-9631fcfa87c6,08dbba81-68fb-49ef-8aac-9631fcfa87c6,1,0,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,1,0,8170a27d-45e9-48b1-860b-c2d9cc5961cd,8170a27d-45e9-48b1-860b-c2d9cc5961cd,1,0,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,1,0,61cc4ec9-81e7-415b-8adf-3a5e61be505f,61cc4ec9-81e7-415b-8adf-3a5e61be505f,1,0,f41d01ec-983a-4b39-9c11-a6d25d08df4f,f41d01ec-983a-4b39-9c11-a6d25d08df4f,1,0,3247e64e-b57e-4c33-8086-7ab93c5b6371,3247e64e-b57e-4c33-8086-7ab93c5b6371,1,0,1ef34700-ce65-4985-b4d6-7133133ef32d,1ef34700-ce65-4985-b4d6-7133133ef32d,1,0,886d99ce-9ea2-4160-8d73-84df7197c030,886d99ce-9ea2-4160-8d73-84df7197c030,1,0,e5dca369-dc9a-4332-a509-f734b8787e13,e5dca369-dc9a-4332-a509-f734b8787e13,1,0,692d289b-8bd2-4b88-a8ea-0389c967df63,692d289b-8bd2-4b88-a8ea-0389c967df63,1,0,722af623-156c-4e63-8b2a-93da760f1559,722af623-156c-4e63-8b2a-93da760f1559,1,0,393074c4-0afc-4232-8101-11a4ea6ed28a,393074c4-0afc-4232-8101-11a4ea6ed28a,1,0,5ff23123-450c-40ae-9b79-c540da53e2a0,5ff23123-450c-40ae-9b79-c540da53e2a0,1,0,639339a1-7de5-4b05-adf3-f60e7edd922c,639339a1-7de5-4b05-adf3-f60e7edd922c,1,0,dea9af9d-13c0-40d4-a9b0-1908e0a58795,dea9af9d-13c0-40d4-a9b0-1908e0a58795,1,0,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,1,0,50ef6fc7-edfc-497b-ae9d-fb676934a631,50ef6fc7-edfc-497b-ae9d-fb676934a631,1,0,6f706d33-6fc6-4311-994f-6887c46f3c3b,6f706d33-6fc6-4311-994f-6887c46f3c3b,1,0,0e1a45b0-d95d-415f-b954-5689610aa393,0e1a45b0-d95d-415f-b954-5689610aa393,1,0,4736b3d3-f696-4bdd-b0e3-0884ea88f623,4736b3d3-f696-4bdd-b0e3-0884ea88f623,1,0,e3ac6312-4397-4012-a3d1-e35071d3fb6b,e3ac6312-4397-4012-a3d1-e35071d3fb6b,1,0,1c32ac14-580d-4ac2-939b-dc5ce64b4f7f,1c32ac14-580d-4ac2-939b-dc5ce64b4f7f,1,0,9162a85e-a385-42b0-b809-da916fce44b7,9162a85e-a385-42b0-b809-da916fce44b7,1,0,f6939587-ff87-4eca-ae52-10e1bd2abfce,f6939587-ff87-4eca-ae52-10e1bd2abfce,1,0,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,1,0,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,1,0,3cb575a9-dc82-45e0-81f0-d651e12246da,3cb575a9-dc82-45e0-81f0-d651e12246da,1,0,01a73950-3e8f-4f56-903f-af0d9574e72e,01a73950-3e8f-4f56-903f-af0d9574e72e,1,0,14bd0844-c829-4325-aa7f-0f417bf955dc,14bd0844-c829-4325-aa7f-0f417bf955dc,1,0,7f1cd658-ca10-49c6-80ef-b8956f3269ea,7f1cd658-ca10-49c6-80ef-b8956f3269ea,1,0,b0d9086f-cef7-47a8-ad62-d85fea28ebda,b0d9086f-cef7-47a8-ad62-d85fea28ebda,1,0,49c010fc-f5cc-45f4-ba46-132e7661c3dd,49c010fc-f5cc-45f4-ba46-132e7661c3dd,1,0,23d137ad-5b37-40a9-9c9f-3a2cecfb5abb,23d137ad-5b37-40a9-9c9f-3a2cecfb5abb,1,0,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,1,0,2c02a558-8d12-44cf-be6b-9c399b9032e5,2c02a558-8d12-44cf-be6b-9c399b9032e5,1,0,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,1,0,aea031ed-44c1-441b-8ed2-3a790c0263ab,aea031ed-44c1-441b-8ed2-3a790c0263ab,1,0,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,1,0,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,1,0,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,1,0,9c267aa6-5f23-49f6-868a-3324ef2845ff,9c267aa6-5f23-49f6-868a-3324ef2845ff,1,0,495eeeee-d7bf-4063-99e2-86daa066451a,495eeeee-d7bf-4063-99e2-86daa066451a,1,0,b6184698-79e4-4c19-9440-092ccd9dabf8,b6184698-79e4-4c19-9440-092ccd9dabf8,1,0,7d01fc0c-378e-421d-ab70-6a418eed5941,7d01fc0c-378e-421d-ab70-6a418eed5941,1,0,6eeb4867-bf9d-48dc-b96b-934a0c293010,6eeb4867-bf9d-48dc-b96b-934a0c293010,1,0,d2816f95-4809-4727-8ab6-8afd375f5a75,d2816f95-4809-4727-8ab6-8afd375f5a75,1,0,1d49b1bb-5f90-46e4-adcf-55ad46442648,1d49b1bb-5f90-46e4-adcf-55ad46442648,1,0,8d4685b7-ba72-4a28-8182-3104e1330567,8d4685b7-ba72-4a28-8182-3104e1330567,1,0,b91b93f0-29ca-452d-97be-7109fb248e22,b91b93f0-29ca-452d-97be-7109fb248e22,1,0,e1803e54-ec5e-4a82-8097-5e2331820991,e1803e54-ec5e-4a82-8097-5e2331820991,1,0,1bcbf91d-cbbc-4c47-86ed-b2cab62ccbe2,1bcbf91d-cbbc-4c47-86ed-b2cab62ccbe2,1,0,27aebf22-27fe-48d4-a6f4-ea4f6a6714bb,27aebf22-27fe-48d4-a6f4-ea4f6a6714bb,1,0,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,1,0,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,1,0,8506dbe9-7066-444b-83b6-fb2d71a336e7,8506dbe9-7066-444b-83b6-fb2d71a336e7,1,0,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,1,0,932656e8-4011-4250-844b-1fd47abda912,932656e8-4011-4250-844b-1fd47abda912,1,0,6686d828-3129-4d44-a8a2-a64657d424cb,6686d828-3129-4d44-a8a2-a64657d424cb,1,0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,1,0,ce235ab9-1dec-459a-9fec-498c262ece56,ce235ab9-1dec-459a-9fec-498c262ece56,1,0,fb7a9f90-15ef-4121-adff-cd40f699182b,fb7a9f90-15ef-4121-adff-cd40f699182b,1,0,0fa52339-2d11-4c81-92b9-aa27d116134d,0fa52339-2d11-4c81-92b9-aa27d116134d,1,0,26135cf4-fbe1-4f72-a1fd-69e85ec008a6,26135cf4-fbe1-4f72-a1fd-69e85ec008a6,1,0,d83b8068-512d-4c10-88b4-f9b3413a3a81,d83b8068-512d-4c10-88b4-f9b3413a3a81,1,0,b3bbcd07-a593-4591-9d7e-9a990c0acb62,b3bbcd07-a593-4591-9d7e-9a990c0acb62,1,0,b96df5bb-d78a-40ed-a62d-2bf796c59c62,b96df5bb-d78a-40ed-a62d-2bf796c59c62,1,0,073890e5-13eb-4c50-9a6e-3e5507b111b7,073890e5-13eb-4c50-9a6e-3e5507b111b7,1,0,34a4d235-dc56-47e5-91b6-0af887ccdf42,34a4d235-dc56-47e5-91b6-0af887ccdf42,1,0,d60e7164-c686-4c50-b831-a4ee4f505c35,d60e7164-c686-4c50-b831-a4ee4f505c35,1,0,e660c8bf-af5f-4525-a56e-68925d2b96fa,e660c8bf-af5f-4525-a56e-68925d2b96fa,1,0,2fad50a6-6a3e-4f87-ab84-907364427a63,2fad50a6-6a3e-4f87-ab84-907364427a63,1,0,e37aa075-143b-44e9-a2e2-77b3e0f76a77,e37aa075-143b-44e9-a2e2-77b3e0f76a77,1,0,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1,0,258736e4-93c0-4a46-8caa-75be42c9f006,258736e4-93c0-4a46-8caa-75be42c9f006,1,0,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,1,0,56d0acf3-c888-4824-a6e4-27d61fa35415,56d0acf3-c888-4824-a6e4-27d61fa35415,1,0,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,1,0,439129dd-ad00-484c-b84a-fb325af979ed,439129dd-ad00-484c-b84a-fb325af979ed,1,0,dcae6376-f44c-421e-87f2-df83413c021e,dcae6376-f44c-421e-87f2-df83413c021e,1,0,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,1,0,151f2d0a-cc43-490d-ad7d-71390703aa72,151f2d0a-cc43-490d-ad7d-71390703aa72,1,0,2a515a4f-683b-4674-b097-62dd2d940c39,2a515a4f-683b-4674-b097-62dd2d940c39,1,0,d14058f5-dfd4-47eb-ae6d-01b7062f5940,d14058f5-dfd4-47eb-ae6d-01b7062f5940,1,0,90f358ae-9c80-40cf-8e8f-aa02d78a2cdb,90f358ae-9c80-40cf-8e8f-aa02d78a2cdb,1,0,1681dd7a-de80-4b8d-9657-c9702a19d653,1681dd7a-de80-4b8d-9657-c9702a19d653,1,0,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,1,0,fdb5b235-1978-4c2a-a03f-02341df00c3c,fdb5b235-1978-4c2a-a03f-02341df00c3c,1,0,9f593f27-8009-40c0-94d6-53f177ce55f4,9f593f27-8009-40c0-94d6-53f177ce55f4,1,0,917f8d67-2c28-4e02-9453-e1ef9297c9a6,917f8d67-2c28-4e02-9453-e1ef9297c9a6,1,0,38637f61-399a-4966-9e64-4751aecffa31,38637f61-399a-4966-9e64-4751aecffa31,1,0,0f38a18b-a36c-45fe-86c1-396634aaa5df,0f38a18b-a36c-45fe-86c1-396634aaa5df,1,0,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,1,0,a81c783d-2dea-4dde-9ca1-7b23d609eb22,a81c783d-2dea-4dde-9ca1-7b23d609eb22,1,0,137ec4ee-5053-47a7-8f5d-f6e63174608f,137ec4ee-5053-47a7-8f5d-f6e63174608f,1,0,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,1,0,4b4f5777-7c36-461e-9d3e-1baaf0497d62,4b4f5777-7c36-461e-9d3e-1baaf0497d62,1,0,8f4d5fc1-5c2c-4202-bb79-a180b03b3267,8f4d5fc1-5c2c-4202-bb79-a180b03b3267,1,0,da881296-fea4-444b-96b2-12cb69d588c7,da881296-fea4-444b-96b2-12cb69d588c7,1,0,03f9d2d0-eae4-4098-a70e-4eb569b11fd9,03f9d2d0-eae4-4098-a70e-4eb569b11fd9,1,0,30031e74-e58a-44a2-98dd-fc8c950831c4,30031e74-e58a-44a2-98dd-fc8c950831c4,1,0,530a3164-4ef1-4b3b-8269-13764ef4bf15,530a3164-4ef1-4b3b-8269-13764ef4bf15,1,0,6df2bb92-558c-4453-9de4-e4176e8f93dc,6df2bb92-558c-4453-9de4-e4176e8f93dc,1,0,3fc019d1-aec8-4835-96c5-3bbf43da0b94,3fc019d1-aec8-4835-96c5-3bbf43da0b94,1,0,5371672a-c8e0-4c12-834e-f23dd885b49a,5371672a-c8e0-4c12-834e-f23dd885b49a,1,0,6417d7c8-6436-4907-98eb-44cd7638f3f1,6417d7c8-6436-4907-98eb-44cd7638f3f1,1,0,1f927f76-5523-4880-9d26-d69a059f2b67,1f927f76-5523-4880-9d26-d69a059f2b67,1,0,27a9c1de-90a9-49f8-8b16-f7ef041ae1de,27a9c1de-90a9-49f8-8b16-f7ef041ae1de,1,0,5c45e96f-e245-4d16-9c47-836505582aef,5c45e96f-e245-4d16-9c47-836505582aef,1,0,2c04d747-c363-4218-92c9-5c83393e928b,2c04d747-c363-4218-92c9-5c83393e928b,1,0,093b8255-7ee5-4463-bd20-542b1d63e799,093b8255-7ee5-4463-bd20-542b1d63e799,1,0,5afb95e0-51a3-4a0f-bea7-e06716421974,5afb95e0-51a3-4a0f-bea7-e06716421974,1,0,2bce3fbe-436b-4a9f-8478-5436d61cd57c,2bce3fbe-436b-4a9f-8478-5436d61cd57c,1,0,ba49877b-6e30-4177-a67c-00e65aa498fb,ba49877b-6e30-4177-a67c-00e65aa498fb,1,0,3d02ca78-c396-4797-909c-e6b910c0ff66,3d02ca78-c396-4797-909c-e6b910c0ff66,1,0,25b39aeb-94c3-4199-9d56-5bd87e325bf2,25b39aeb-94c3-4199-9d56-5bd87e325bf2,1,0,b0b63551-4e83-4201-af9a-b4ab150c43a5,b0b63551-4e83-4201-af9a-b4ab150c43a5,1,0,ca85912b-87b4-481e-9184-017364b4603d,ca85912b-87b4-481e-9184-017364b4603d,1,0,2bd80198-4739-4e8f-9af1-40addc91a05b,2bd80198-4739-4e8f-9af1-40addc91a05b,1,0,80c18959-93f0-46e6-90fd-b564efcaa395,80c18959-93f0-46e6-90fd-b564efcaa395,1,0,c53b9e19-54e4-49b4-ac63-eaeee5c2e040,c53b9e19-54e4-49b4-ac63-eaeee5c2e040,1,0,47afc45d-719e-4740-a8aa-6157c4b1aea8,47afc45d-719e-4740-a8aa-6157c4b1aea8,1,0,2650db63-ca98-4a8a-8c36-165548aa5279,2650db63-ca98-4a8a-8c36-165548aa5279,1,0,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,1,0,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,1,0,e8c5c961-0633-438d-ba50-d2a774f6b167,e8c5c961-0633-438d-ba50-d2a774f6b167,1,0,48b57d1b-5246-4ce8-9e0f-e369e6add55c,48b57d1b-5246-4ce8-9e0f-e369e6add55c,1,0,b6d891e4-15d6-4b40-b474-a8a1d10231e8,b6d891e4-15d6-4b40-b474-a8a1d10231e8,1,0,e60a7341-3995-4d8c-a3c6-a23ea0137754,e60a7341-3995-4d8c-a3c6-a23ea0137754,1,0,a69525c7-27ff-48df-b26b-325ba580a53e,a69525c7-27ff-48df-b26b-325ba580a53e,1,0,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,1,0,8482b31d-0ffa-4a94-9be1-09db8399b70d,8482b31d-0ffa-4a94-9be1-09db8399b70d,1,0,77fe53c2-de9d-4483-97c9-f7d44e137d5e,77fe53c2-de9d-4483-97c9-f7d44e137d5e,1,0,ac7ea771-4b10-4d43-9c0a-9cd36e4c49a4,ac7ea771-4b10-4d43-9c0a-9cd36e4c49a4,1,0,593be64c-6792-46d9-8618-84c50c9ad9e4,593be64c-6792-46d9-8618-84c50c9ad9e4,1,0,208d29cb-040f-4282-b8e8-dda8417b8e92,208d29cb-040f-4282-b8e8-dda8417b8e92,1,0,e57f4619-b5ed-44de-a186-a13a3897731b,e57f4619-b5ed-44de-a186-a13a3897731b,1,0,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,1,0,9935d602-668e-4df9-a338-0f542def878b,9935d602-668e-4df9-a338-0f542def878b,1,0,3913f78f-ce34-4ae3-840a-ccdf06319cbb,3913f78f-ce34-4ae3-840a-ccdf06319cbb,1,0,104cf3e3-2104-4ac2-bdc6-792750a63ea0,104cf3e3-2104-4ac2-bdc6-792750a63ea0,1,0,35dee1ee-ca9e-4b6b-9767-1107283f5a04,35dee1ee-ca9e-4b6b-9767-1107283f5a04,1,0,c86aa97a-5898-4cb2-ae62-598bddf8e99f,c86aa97a-5898-4cb2-ae62-598bddf8e99f,1,0,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,1,0,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,1,0,bb3a9973-67ce-479e-8668-c2f3bb20301e,bb3a9973-67ce-479e-8668-c2f3bb20301e,1,0,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,1,0,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,1,0,37169451-1464-4f24-8ca6-802963ffb636,37169451-1464-4f24-8ca6-802963ffb636,1,0,c3a958b1-590f-4418-a74f-5982b478cf52,c3a958b1-590f-4418-a74f-5982b478cf52,1,0,ef0e618d-0942-460a-ac65-9aca2fed976e,ef0e618d-0942-460a-ac65-9aca2fed976e,1,0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,1,0,2ac8bd69-9fbf-4f15-b58d-397d9e903532,2ac8bd69-9fbf-4f15-b58d-397d9e903532,1,0,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,1,0,5b460b92-2c74-4f59-88b2-18d9aac42c04,5b460b92-2c74-4f59-88b2-18d9aac42c04,1,0,db05d35b-5f53-4c27-ba80-b477b9a98299,db05d35b-5f53-4c27-ba80-b477b9a98299,1,0,fa872ae1-b699-46fe-9d6a-e42e1388752b,fa872ae1-b699-46fe-9d6a-e42e1388752b,1,0,1acf34e6-c428-4130-82f0-5160dfcc0858,1acf34e6-c428-4130-82f0-5160dfcc0858,1,0,57046262-b9ce-4670-9cf5-6db9e58dd0d5,57046262-b9ce-4670-9cf5-6db9e58dd0d5,1,0,a9824176-36d5-4be5-9984-f4312ff48515,a9824176-36d5-4be5-9984-f4312ff48515,1,0,8e980ca0-1627-45e8-bd27-5dd1ac199459,8e980ca0-1627-45e8-bd27-5dd1ac199459,1,0,8b653beb-af9f-4f39-b691-ae14f80b7cd6,8b653beb-af9f-4f39-b691-ae14f80b7cd6,1,0,77559c11-713f-454d-aff4-56649e1350e9,77559c11-713f-454d-aff4-56649e1350e9,1,0,0c965703-c1d0-48b7-80f9-b8d869ff98f5,0c965703-c1d0-48b7-80f9-b8d869ff98f5,1,0,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,1,0,7ba42162-557b-4e34-8aca-0cdee8cb2452,7ba42162-557b-4e34-8aca-0cdee8cb2452,1,0,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,1,0,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,1,0,dd577924-c6cb-4aa9-9db5-366d8958d00f,dd577924-c6cb-4aa9-9db5-366d8958d00f,1,0,8ed8f72e-404a-4be4-a44d-ddebbad5f411,8ed8f72e-404a-4be4-a44d-ddebbad5f411,1,0,e919bc4c-86e6-44f6-be27-5a729b63d042,e919bc4c-86e6-44f6-be27-5a729b63d042,1,0,ec580e4f-1518-4923-a10e-bc1da8688b37,ec580e4f-1518-4923-a10e-bc1da8688b37,1,0,91c3902a-314f-4d40-8bcc-8dd131fed2f4,91c3902a-314f-4d40-8bcc-8dd131fed2f4,1,0,ae2b21c5-9349-49e8-9627-26f05c21f43a,ae2b21c5-9349-49e8-9627-26f05c21f43a,1,0,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,1,0,917a19d7-73db-4247-b892-397598d67879,917a19d7-73db-4247-b892-397598d67879,1,0,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1,0,d8066600-c669-449d-a187-fdd3af8f7afa,d8066600-c669-449d-a187-fdd3af8f7afa,1,0,dadf86a6-c118-4827-b1b9-6cfee731242f,dadf86a6-c118-4827-b1b9-6cfee731242f,1,0,45bf7b20-f048-491a-a989-e50bea13d028,45bf7b20-f048-491a-a989-e50bea13d028,1,0,9ad3b432-5b49-44ee-9d8d-83c36458d927,9ad3b432-5b49-44ee-9d8d-83c36458d927,1,0,a9967bff-53b9-4295-a253-3647d956d3cb,a9967bff-53b9-4295-a253-3647d956d3cb,1,0,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,1,0,b8a31397-8974-44ec-92b0-7cbdc481cf7e,b8a31397-8974-44ec-92b0-7cbdc481cf7e,1,0,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,1,0,fb16c4d5-854c-4525-92be-b21fa2df5b0d,fb16c4d5-854c-4525-92be-b21fa2df5b0d,1,0,5771de21-2086-432b-ad91-de14a39bd5bc,5771de21-2086-432b-ad91-de14a39bd5bc,1,0,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,1,0,ed96fbfa-bda7-405c-9073-d0b6feffedad,ed96fbfa-bda7-405c-9073-d0b6feffedad,1,0,50c724cb-dde1-4313-9492-b1750bd0afc1,50c724cb-dde1-4313-9492-b1750bd0afc1,1,0,12901981-6106-4471-ab3a-e127c2bb4ebd,12901981-6106-4471-ab3a-e127c2bb4ebd,1,0,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,1,0,d5ea5dea-233d-4106-b9ba-f030d4f762ef,d5ea5dea-233d-4106-b9ba-f030d4f762ef,1,0,903af05e-5ac5-46aa-843b-d74f9e417c1d,903af05e-5ac5-46aa-843b-d74f9e417c1d,1,0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,1,0,a344290a-c9be-47a7-95ad-ced1b52a0995,a344290a-c9be-47a7-95ad-ced1b52a0995,1,0,a4e56049-4de9-40a3-8197-a5c84a11f516,a4e56049-4de9-40a3-8197-a5c84a11f516,1,0,339c9220-fd5b-45d3-b300-cdcc8788f87e,339c9220-fd5b-45d3-b300-cdcc8788f87e,1,0,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,1,0,9042a6de-5048-432d-a448-7e21f2d1d24a,9042a6de-5048-432d-a448-7e21f2d1d24a,1,0,350d46bf-114e-48e7-90c6-6708d949f20d,350d46bf-114e-48e7-90c6-6708d949f20d,1,0,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,1,0,aac20ff3-5873-432e-b763-14411e623d41,aac20ff3-5873-432e-b763-14411e623d41,1,0,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,1,0,6df44466-8750-481a-9baf-c924f0d45353,6df44466-8750-481a-9baf-c924f0d45353,1,0,110121eb-a0eb-4662-8911-3dcc3d341a73,110121eb-a0eb-4662-8911-3dcc3d341a73,1,0,f8980c18-6b9c-4e45-919a-22e976d2a846,f8980c18-6b9c-4e45-919a-22e976d2a846,1,0,c946efb7-c67e-49c1-bf56-d3c2d7220acd,c946efb7-c67e-49c1-bf56-d3c2d7220acd,1,0,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,1,0,6b7c9f74-f2b6-463e-acb9-9f82901986cf,6b7c9f74-f2b6-463e-acb9-9f82901986cf,1,0,fc4c1d64-132b-4687-a37d-05000fdb4ba5,fc4c1d64-132b-4687-a37d-05000fdb4ba5,1,0,528777cd-090b-4b70-82f5-56def98c5893,528777cd-090b-4b70-82f5-56def98c5893,1,0,49dbe467-8832-4ede-9a05-494248619aeb,49dbe467-8832-4ede-9a05-494248619aeb,1,0,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,1,0,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,1,0,09c73108-8528-4970-9b7f-fff9eda7816a,09c73108-8528-4970-9b7f-fff9eda7816a,1,0,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,1,0,f568245a-d158-45dc-af92-2d411f12db7b,f568245a-d158-45dc-af92-2d411f12db7b,1,0,0f17cdac-aa17-45e6-b3d0-220b13345390,0f17cdac-aa17-45e6-b3d0-220b13345390,1,0,c675db75-d0c3-4026-b97c-6b23ecbb336a,c675db75-d0c3-4026-b97c-6b23ecbb336a,1,0,469f67fa-98b0-44b0-abd4-cae136c02834,469f67fa-98b0-44b0-abd4-cae136c02834,1,0,16a18458-999c-420e-80df-8fc10855746c,16a18458-999c-420e-80df-8fc10855746c,1,0,b794f222-0fde-439f-97a3-0da74075b415,b794f222-0fde-439f-97a3-0da74075b415,1,0,3a716aad-9b2c-48a7-b802-80732066391b,3a716aad-9b2c-48a7-b802-80732066391b,1,0,480d959f-aac8-4241-875f-78e1c1f32621,480d959f-aac8-4241-875f-78e1c1f32621,1,0,496e5de8-d75c-4536-9993-75374f070b40,496e5de8-d75c-4536-9993-75374f070b40,1,0,b4e610ba-c9c8-4b25-903b-e567dcbc2556,b4e610ba-c9c8-4b25-903b-e567dcbc2556,1,0,48febdbd-a085-4113-8511-ed7ff6be7d3c,48febdbd-a085-4113-8511-ed7ff6be7d3c,1,0,49413232-c0c3-4983-9d10-291a0399281b,49413232-c0c3-4983-9d10-291a0399281b,1,0,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,1,0,b9b076bb-38ab-4a94-8226-41a4d4d7432c,b9b076bb-38ab-4a94-8226-41a4d4d7432c,1,0,e12da8db-4037-473e-ba2b-d0ceb4534dcb,e12da8db-4037-473e-ba2b-d0ceb4534dcb,1,0,789514e5-8ea3-4a5e-88c5-ed89c4135866,789514e5-8ea3-4a5e-88c5-ed89c4135866,1,0,a16768ff-6137-43d8-8784-4805ed83632a,a16768ff-6137-43d8-8784-4805ed83632a,1,0,61971286-9f94-4a27-aa34-e10848adb70a,61971286-9f94-4a27-aa34-e10848adb70a,1,0,1e75d143-3452-496e-a137-6d7f4c4ed019,1e75d143-3452-496e-a137-6d7f4c4ed019,1,0,e0619d14-c658-4eb5-841a-3a029de28be4,e0619d14-c658-4eb5-841a-3a029de28be4,1,0,99a3b660-7875-47f7-9c6c-c552e5673deb,99a3b660-7875-47f7-9c6c-c552e5673deb,1,0,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,1,0,41cbf934-ea54-41df-abf0-09f319d2e67a,41cbf934-ea54-41df-abf0-09f319d2e67a,1,0,47246084-a5f8-4d0f-b4e2-204c1b97483a,47246084-a5f8-4d0f-b4e2-204c1b97483a,1,0,e58233ec-6cfc-4a8b-9929-689fa69cdb07,e58233ec-6cfc-4a8b-9929-689fa69cdb07,1,0,3291a891-a47c-43ca-b088-aecd3867d38c,3291a891-a47c-43ca-b088-aecd3867d38c,1,0,56cde2b4-00f2-49ba-b407-16e241c17fd2,56cde2b4-00f2-49ba-b407-16e241c17fd2,1,0,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,1,0,219ed110-f2a0-41c1-ac5a-02301b248c54,219ed110-f2a0-41c1-ac5a-02301b248c54,1,0,1c722dfd-2b07-4985-9188-17353de24771,1c722dfd-2b07-4985-9188-17353de24771,1,0,1a630496-2cdd-4c89-a1aa-ed20545ad133,1a630496-2cdd-4c89-a1aa-ed20545ad133,1,0,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,1,0,b19cea0e-e57a-4969-8daf-f48d3d16705f,b19cea0e-e57a-4969-8daf-f48d3d16705f,1,0,d4059340-3361-4baa-ae48-ecbfb9800a2e,d4059340-3361-4baa-ae48-ecbfb9800a2e,1,0,f78f6c43-dd90-4117-acf7-ed5b951cb964,f78f6c43-dd90-4117-acf7-ed5b951cb964,1,0,8eebd519-4989-4784-82b8-39d77eebfb17,8eebd519-4989-4784-82b8-39d77eebfb17,1,0,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,1,0,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,1,0,4527877b-5723-4aa5-8705-98174ac9c337,4527877b-5723-4aa5-8705-98174ac9c337,1,0,d6b21e7b-df57-4280-8c95-c269b5316018,d6b21e7b-df57-4280-8c95-c269b5316018,1,0,808c468b-6322-428d-ac6a-ccf2228b05b6,808c468b-6322-428d-ac6a-ccf2228b05b6,1,0,13664bb2-738f-4d18-b382-a7bcf8105a5a,13664bb2-738f-4d18-b382-a7bcf8105a5a,1,0,f3f56abe-9248-4555-bf99-29560eb4f9ee,f3f56abe-9248-4555-bf99-29560eb4f9ee,1,0,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,1,0,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,1,0,3eb43a06-b32d-4904-8489-6264d0207623,3eb43a06-b32d-4904-8489-6264d0207623,1,0,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,1,0,18615fe1-cfee-4888-9c09-88d1c5db39eb,18615fe1-cfee-4888-9c09-88d1c5db39eb,1,0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,1,0,087c83c0-75e7-476b-b7c6-5be55498a190,087c83c0-75e7-476b-b7c6-5be55498a190,1,0,ec5e5413-9e77-4929-83b8-6fee70688b28,ec5e5413-9e77-4929-83b8-6fee70688b28,1,0,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,1,0,8390c864-2b84-4c45-8583-cb4a4ab49168,8390c864-2b84-4c45-8583-cb4a4ab49168,1,0,1b2fefca-fef5-4319-90cc-325444cb63a6,1b2fefca-fef5-4319-90cc-325444cb63a6,1,0,34a128be-8fbb-4dd8-ac23-9f35041feb63,34a128be-8fbb-4dd8-ac23-9f35041feb63,1,0,baa31006-e0d6-496e-a60e-27b3dfd19397,baa31006-e0d6-496e-a60e-27b3dfd19397,1,0,3007d8ff-3942-45ed-bac5-8a6c40ca060c,3007d8ff-3942-45ed-bac5-8a6c40ca060c,1,0,8bfe1474-fd12-4744-a9ab-3383bfe766b3,8bfe1474-fd12-4744-a9ab-3383bfe766b3,1,0,3af97375-f776-4129-9521-b8d65d795db6,3af97375-f776-4129-9521-b8d65d795db6,1,0,0e98801b-a45b-44cb-a341-7e43d723f6ed,0e98801b-a45b-44cb-a341-7e43d723f6ed,1,0,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,1,0,103ac72d-c386-40ea-89d4-35798d064f1a,103ac72d-c386-40ea-89d4-35798d064f1a,1,0,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,1,0,d1fe15e9-8e5c-4819-85cd-24ab31409437,d1fe15e9-8e5c-4819-85cd-24ab31409437,1,0,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,1,0,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,1,0,74f68bda-17b1-4b3c-aa64-b1014300f9b5,74f68bda-17b1-4b3c-aa64-b1014300f9b5,1,0,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,1,0,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,1,0,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,1,0,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,1,0,47ee7d38-9fa9-458d-abee-e11270f79494,47ee7d38-9fa9-458d-abee-e11270f79494,1,0,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,1,0,076daecf-8fcb-496b-9f13-c4faa3a8a722,076daecf-8fcb-496b-9f13-c4faa3a8a722,1,0,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,1,0,296d7725-bdd3-4210-9db9-31de5711ea9b,296d7725-bdd3-4210-9db9-31de5711ea9b,1,0,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,1,0,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1,0,245c2c6c-7b7f-4381-9304-1d7287a215fa,245c2c6c-7b7f-4381-9304-1d7287a215fa,1,0,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,1,0,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,1,0,8bb5be12-98df-4a38-bffe-432fb13d8101,8bb5be12-98df-4a38-bffe-432fb13d8101,1,0,94209023-ce88-401c-9aff-526fb7e43709,94209023-ce88-401c-9aff-526fb7e43709,1,0,22b99094-b52a-4244-ae91-53848d82560b,22b99094-b52a-4244-ae91-53848d82560b,1,0,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,1,0,b0002134-d5c9-4508-9f0e-97f92461b590,b0002134-d5c9-4508-9f0e-97f92461b590,1,0,1506ec71-cb38-4831-a29d-dac2c4deddda,1506ec71-cb38-4831-a29d-dac2c4deddda,1,0,e05fd82b-b77b-4b7f-b300-43653017f341,e05fd82b-b77b-4b7f-b300-43653017f341,1,0,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,1,0,f15a0526-c207-42fe-aed9-438ae0c4a4b8,f15a0526-c207-42fe-aed9-438ae0c4a4b8,1,0,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,1,0,8583cab0-0620-4346-96e0-bcac40981b8a,8583cab0-0620-4346-96e0-bcac40981b8a,1,0,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,1,0,095990b1-187b-400c-941a-275f272239ca,095990b1-187b-400c-941a-275f272239ca,1,0,ba108470-350d-40c3-bb44-9852c2aa8c97,ba108470-350d-40c3-bb44-9852c2aa8c97,1,0,a37c33fa-64b0-4a1b-846a-0a236bad44f8,a37c33fa-64b0-4a1b-846a-0a236bad44f8,1,0,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,1,0,a50f4324-da44-449b-b500-74228b2aa7e0,a50f4324-da44-449b-b500-74228b2aa7e0,1,0,04236716-9c36-4a1d-b4fb-4b8c65644ab4,04236716-9c36-4a1d-b4fb-4b8c65644ab4,1,0,97276702-6686-4ac4-8360-d85369a08b20,97276702-6686-4ac4-8360-d85369a08b20,1,0,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,1,0,068883fe-d7ae-40e7-ad82-864867916daa,068883fe-d7ae-40e7-ad82-864867916daa,1,0,c1b02568-2095-4f83-8543-2402f67dbe3d,c1b02568-2095-4f83-8543-2402f67dbe3d,1,0,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,1,0,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,1,0,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,1,0,aecbd726-6952-49e6-b544-4c5cc764c24c,aecbd726-6952-49e6-b544-4c5cc764c24c,1,0,d335cfbf-bc78-4274-a178-10f60372474a,d335cfbf-bc78-4274-a178-10f60372474a,1,0,0f4411b3-addf-4fcf-8da8-c5140dea356c,0f4411b3-addf-4fcf-8da8-c5140dea356c,1,0,c501f9ab-d01b-4137-8cd0-e66103117c84,c501f9ab-d01b-4137-8cd0-e66103117c84,1,0,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,1,0,66e65355-1424-4c74-801c-faf5357257aa,66e65355-1424-4c74-801c-faf5357257aa,1,0,0a93187b-7ae4-4985-8089-3099dfec2b48,0a93187b-7ae4-4985-8089-3099dfec2b48,1,0,044458f3-ed9b-4afb-ae73-8f9162c032bf,044458f3-ed9b-4afb-ae73-8f9162c032bf,1,0,578f618e-5f4a-4e86-959d-39b59e973936,578f618e-5f4a-4e86-959d-39b59e973936,1,0,f74ede2e-2d28-4224-ba44-773eda7760a4,f74ede2e-2d28-4224-ba44-773eda7760a4,1,0,217df06a-1bdf-4394-b617-ed756ff17bc6,217df06a-1bdf-4394-b617-ed756ff17bc6,1,0,a1572e97-a487-497a-9062-49315e237e0f,a1572e97-a487-497a-9062-49315e237e0f,1,0,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,1,0,3c5d87a0-cfce-464a-b946-64c5a589a376,3c5d87a0-cfce-464a-b946-64c5a589a376,1,0,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,1,0,763de8d1-7f53-41b6-8d97-7da724e9f763,763de8d1-7f53-41b6-8d97-7da724e9f763,1,0,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,1,0,4ad59c75-cca4-4968-82e6-babd72d8b318,4ad59c75-cca4-4968-82e6-babd72d8b318,1,0,c248de15-63a2-48ec-8695-7a5213d4fc9b,c248de15-63a2-48ec-8695-7a5213d4fc9b,1,0,272ff0f9-7266-4c22-be12-fe62682b56a5,272ff0f9-7266-4c22-be12-fe62682b56a5,1,0,9f141dd5-d866-4c25-b58a-a7766a08b4e7,9f141dd5-d866-4c25-b58a-a7766a08b4e7,1,0,0570d846-889d-4cfc-98fb-a1ad0181597f,0570d846-889d-4cfc-98fb-a1ad0181597f,1,0,19e17c58-953f-4917-8b6a-c88808fcca36,19e17c58-953f-4917-8b6a-c88808fcca36,1,0,4804316d-3765-4a83-8438-10e8e82656db,4804316d-3765-4a83-8438-10e8e82656db,1,0,59458556-e343-4215-8e6c-69f924ec4183,59458556-e343-4215-8e6c-69f924ec4183,1,0,dd553dca-7eba-41bf-8939-2c61e170ff65,dd553dca-7eba-41bf-8939-2c61e170ff65,1,0,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,1,0,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,1,0,8099e978-28cc-4ade-ac5a-3785f3a45f70,8099e978-28cc-4ade-ac5a-3785f3a45f70,1,0,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,1,0,fe023ca5-f11a-4b98-99c1-363508e4ea4a,fe023ca5-f11a-4b98-99c1-363508e4ea4a,1,0,6f8d515e-13d9-45f8-9793-3757f5b85f81,6f8d515e-13d9-45f8-9793-3757f5b85f81,1,0,25ec541c-c437-4318-b2a8-5146df6ae080,25ec541c-c437-4318-b2a8-5146df6ae080,1,0,148754ed-3063-40a7-a3c3-8ad105552370,148754ed-3063-40a7-a3c3-8ad105552370,1,0,ab3f0862-c355-4fd7-a2a7-4eb8278de510,ab3f0862-c355-4fd7-a2a7-4eb8278de510,1,0,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,1,0,c12c3f3b-3a96-4e70-b131-8d7bd765095f,c12c3f3b-3a96-4e70-b131-8d7bd765095f,1,0,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,1,0,c563588c-346e-499e-ae33-9ff3cb62e658,c563588c-346e-499e-ae33-9ff3cb62e658,1,0,40dbc001-97b6-4188-8de9-3adac670bac4,40dbc001-97b6-4188-8de9-3adac670bac4,1,0,58589e42-9ff2-4ad4-bd98-a75ab6873625,58589e42-9ff2-4ad4-bd98-a75ab6873625,1,0,92255ded-6c44-43be-b0b1-fd03c2b78c8b,92255ded-6c44-43be-b0b1-fd03c2b78c8b,1,0,dfe6da42-f024-45c5-beea-ceccaf3a5faa,dfe6da42-f024-45c5-beea-ceccaf3a5faa,1,0,08f3e8f1-284c-4059-864a-42499d48596c,08f3e8f1-284c-4059-864a-42499d48596c,1,0,3d715c1b-9a5e-408d-98d6-5345d274144b,3d715c1b-9a5e-408d-98d6-5345d274144b,1,0,3f88bc69-e140-48b6-a2f9-24f6a391bff2,3f88bc69-e140-48b6-a2f9-24f6a391bff2,1,0,65eb5361-074c-451d-a5d8-d16b6ecccf82,65eb5361-074c-451d-a5d8-d16b6ecccf82,1,0,f7c8cab8-c634-4cf3-9183-c15c915231f8,f7c8cab8-c634-4cf3-9183-c15c915231f8,1,0,563a33a6-9eff-4ff1-9eba-dafc235d2ede,563a33a6-9eff-4ff1-9eba-dafc235d2ede,1,0,fbc21f7d-c272-41ea-b048-c5af294ab5ed,fbc21f7d-c272-41ea-b048-c5af294ab5ed,1,0,088c38fa-1c8f-42e7-aa72-5f5dd8cfc1c6,088c38fa-1c8f-42e7-aa72-5f5dd8cfc1c6,1,0,370f97ee-9aed-4a0a-aefc-647d973e6741,370f97ee-9aed-4a0a-aefc-647d973e6741,1,0,c586d28e-a3ec-4201-8ba0-d453bb7c5293,c586d28e-a3ec-4201-8ba0-d453bb7c5293,1,0,d84f12b0-6e01-4646-9abd-51578716433d,d84f12b0-6e01-4646-9abd-51578716433d,1,0,a4458c18-72eb-4fc0-8dc6-fccab93b0898,a4458c18-72eb-4fc0-8dc6-fccab93b0898,1,0,3a0ceb25-60f5-4fec-ab2e-e667939bfe21,3a0ceb25-60f5-4fec-ab2e-e667939bfe21,1,0,27db4549-df2f-4856-b07f-3c9399cdee9c,27db4549-df2f-4856-b07f-3c9399cdee9c,1,0,f667d49a-8077-450f-9442-2ea4fee7b62d,f667d49a-8077-450f-9442-2ea4fee7b62d,1,0,782b1285-9618-4ec9-b817-ce93e2d24d4d,782b1285-9618-4ec9-b817-ce93e2d24d4d,1,0,dd3e202f-6225-4061-a6ab-f29cd314ab08,dd3e202f-6225-4061-a6ab-f29cd314ab08,1,0,483b7600-e46f-4739-94c8-8637c62750a0,483b7600-e46f-4739-94c8-8637c62750a0,1,0,bdcf5f7a-2888-4143-b46d-1bf0dcc16872,bdcf5f7a-2888-4143-b46d-1bf0dcc16872,1,0,bce8a955-0a0e-4771-9763-4f5d319d9848,bce8a955-0a0e-4771-9763-4f5d319d9848,1,0,090c475c-fb33-46a9-a0ed-fb9d7def2ca5,090c475c-fb33-46a9-a0ed-fb9d7def2ca5,1,0,d10c3389-5bf0-4c73-ab92-786eb19d1676,d10c3389-5bf0-4c73-ab92-786eb19d1676,1,0,c824c20d-7503-4a77-81b8-2a68b20eab68,c824c20d-7503-4a77-81b8-2a68b20eab68,1,0,a0db92c6-b39e-41ab-82e3-161e32f67bda,a0db92c6-b39e-41ab-82e3-161e32f67bda,1,0,88f91187-65d3-4684-992d-20ca29d3755a,88f91187-65d3-4684-992d-20ca29d3755a,1,0,da725701-d4fb-40a4-a63b-feaa8559d8cf,da725701-d4fb-40a4-a63b-feaa8559d8cf,1,0,0a44cfc8-0b55-4aed-990f-e97831494a3c,0a44cfc8-0b55-4aed-990f-e97831494a3c,1,0,c9adbe7c-ca6e-4048-a498-9b48f75d9b45,c9adbe7c-ca6e-4048-a498-9b48f75d9b45,1,0,c7cb80d6-13d9-49af-acdd-6d10dffd1e17,c7cb80d6-13d9-49af-acdd-6d10dffd1e17,1,0,9a3f04d7-b956-4e87-ac28-63f7afba1771,9a3f04d7-b956-4e87-ac28-63f7afba1771,1,0,41b23a18-0c4e-455f-b249-2f2eba8119db,41b23a18-0c4e-455f-b249-2f2eba8119db,1,0,ff697cb8-ab88-4634-94e3-c06a401f71ff,ff697cb8-ab88-4634-94e3-c06a401f71ff,1,0,cf98131d-2b1a-4a07-a8dd-72af01934a8b,cf98131d-2b1a-4a07-a8dd-72af01934a8b,1,0,bef1eead-3f8b-48b7-99f3-46ba332fb60d,bef1eead-3f8b-48b7-99f3-46ba332fb60d,1,0,c1b3d4c8-8c53-4452-bec5-9742bb827d8f,c1b3d4c8-8c53-4452-bec5-9742bb827d8f,1,0,b6e1d584-6817-4f06-b5b2-57037a23ce6f,b6e1d584-6817-4f06-b5b2-57037a23ce6f,1,0,1b5d2ded-3f58-4b3e-8678-48191897e408,1b5d2ded-3f58-4b3e-8678-48191897e408,1,0,62fd5457-0cfd-4273-8965-4b5bf9170209,62fd5457-0cfd-4273-8965-4b5bf9170209,1,0,88701798-0c0e-4d33-a68b-3eddfc25d835,88701798-0c0e-4d33-a68b-3eddfc25d835,1,0,c0d704b5-32de-4bb8-9525-f7d1da828ae5,c0d704b5-32de-4bb8-9525-f7d1da828ae5,1,0,b5b5ee06-4de8-4776-98f0-3e8e1b31985a,b5b5ee06-4de8-4776-98f0-3e8e1b31985a,1,0,2f999502-68e5-4823-8f94-aec98b1a1b1d,2f999502-68e5-4823-8f94-aec98b1a1b1d,1,0,2d064409-7f2a-4d2e-9155-6b34e4373e89,2d064409-7f2a-4d2e-9155-6b34e4373e89,1,0,fc51a562-01bb-47c3-bac5-89f78f64a5f3,fc51a562-01bb-47c3-bac5-89f78f64a5f3,1,0,8a33a6cd-f56d-405b-9515-9fc04d30e27a,8a33a6cd-f56d-405b-9515-9fc04d30e27a,1,0,9b199470-723d-4b72-9fdc-2bed2b7bc483,9b199470-723d-4b72-9fdc-2bed2b7bc483,1,0,5bb9aff1-f4ee-4c02-8e3f-f070bfbb8339,5bb9aff1-f4ee-4c02-8e3f-f070bfbb8339,1,0,6a06f9ee-8832-4e9e-aeba-b4cb9573c048,6a06f9ee-8832-4e9e-aeba-b4cb9573c048,1,0,38fa770e-f38d-4fdf-bb7a-56cfe76a8ab2,38fa770e-f38d-4fdf-bb7a-56cfe76a8ab2,1,0,afc4ce2a-60b6-48d0-ada0-2f651d050888,afc4ce2a-60b6-48d0-ada0-2f651d050888,1,0,5f289266-fc3c-4345-b7ab-cf863e2a6ccd,5f289266-fc3c-4345-b7ab-cf863e2a6ccd,1,0,5932f0d8-9012-4382-8c72-b1a5f4fbc937,5932f0d8-9012-4382-8c72-b1a5f4fbc937,1,0,66f1ff23-8fec-4be4-914c-43b7dee1c2a2,66f1ff23-8fec-4be4-914c-43b7dee1c2a2,1,0,56c3471e-459a-46ba-96ea-9f872b3ad54a,56c3471e-459a-46ba-96ea-9f872b3ad54a,1,0,2113195b-1553-4137-9e45-2cc62c72ee47,2113195b-1553-4137-9e45-2cc62c72ee47,1,0,1250f5b1-c766-434c-8d28-69b74a536294,1250f5b1-c766-434c-8d28-69b74a536294,1,0,80bc9b8b-7b17-4dbb-bca6-8465d6b01e0b,80bc9b8b-7b17-4dbb-bca6-8465d6b01e0b,1,0,6327e23d-6070-4b64-81c6-0d1a33eaae93,6327e23d-6070-4b64-81c6-0d1a33eaae93,1,0,4d086a1f-34e0-43f9-9401-d82e55746a9d,4d086a1f-34e0-43f9-9401-d82e55746a9d,1,0,5a4c543a-27d5-423b-a4d0-3952ea2817af,5a4c543a-27d5-423b-a4d0-3952ea2817af,1,0,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,1,0,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,1,0,93aa5247-6823-4f70-9d47-e5a0f409828a,93aa5247-6823-4f70-9d47-e5a0f409828a,1,0,48659b94-ace8-45f4-a043-6b2731ec6925,48659b94-ace8-45f4-a043-6b2731ec6925,1,0,3a8e60f9-19cb-42a6-a448-ad211261d9b8,3a8e60f9-19cb-42a6-a448-ad211261d9b8,1,0,74320602-094a-4645-b2c9-3053377a3ac3,74320602-094a-4645-b2c9-3053377a3ac3,1,0,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,1,0,b066c732-9c5f-4504-894f-96d457b0768f,b066c732-9c5f-4504-894f-96d457b0768f,1,0,9366463d-aa8a-4e89-86d8-c7f746f9551b,9366463d-aa8a-4e89-86d8-c7f746f9551b,1,0,e25da569-d435-45b2-b4e8-fc76d7f1c8df,e25da569-d435-45b2-b4e8-fc76d7f1c8df,1,0,a51a7f57-9c52-4457-819c-13e1b6f886e1,a51a7f57-9c52-4457-819c-13e1b6f886e1,1,0,7d08daba-5e36-4ce3-8a70-17750959b89e,7d08daba-5e36-4ce3-8a70-17750959b89e,1,0,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,1,0,39344a8c-2662-48ff-937b-12951bb268fb,39344a8c-2662-48ff-937b-12951bb268fb,1,0,b577663f-ead2-4b18-a4f6-f7f303e89319,b577663f-ead2-4b18-a4f6-f7f303e89319,1,0,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,1,0,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,1,0,72663843-4010-42ed-989b-0b58bf9f7146,72663843-4010-42ed-989b-0b58bf9f7146,1,0,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,1,0,3adcceea-867e-4b88-a633-4f8d4ccb43c0,3adcceea-867e-4b88-a633-4f8d4ccb43c0,1,0,a132189c-6584-4bb1-9cfd-1415cd83228a,a132189c-6584-4bb1-9cfd-1415cd83228a,1,0,7ba50e13-0a78-4cca-821f-006b1c83b0b0,7ba50e13-0a78-4cca-821f-006b1c83b0b0,1,0,a3670f95-5abe-49ee-8ea5-d7e4438801ba,a3670f95-5abe-49ee-8ea5-d7e4438801ba,1,0,4443dea1-5143-4e76-97a7-c35dbe1665e4,4443dea1-5143-4e76-97a7-c35dbe1665e4,1,0,0d780521-0767-425a-b44d-315d2dc42d04,0d780521-0767-425a-b44d-315d2dc42d04,1,0,c5b1572d-28f5-42f3-b2e0-8b54f091642e,c5b1572d-28f5-42f3-b2e0-8b54f091642e,1,0,0986c1b6-b677-428d-b49f-a93e40e77171,0986c1b6-b677-428d-b49f-a93e40e77171,1,0,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,1,0,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,1,0,b6662b2e-7e93-4eaa-9e4b-b5647285932b,b6662b2e-7e93-4eaa-9e4b-b5647285932b,1,0,4a180f2c-dc54-4591-8f62-f236d1e07799,4a180f2c-dc54-4591-8f62-f236d1e07799,1,0,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,1,0,a9a51e79-4c79-4a43-931b-c0321c1cd65b,a9a51e79-4c79-4a43-931b-c0321c1cd65b,1,0,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,1,0,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,1,0,22f2696e-0ac1-4a74-bca9-987b267b2b59,22f2696e-0ac1-4a74-bca9-987b267b2b59,1,0,d705cacc-3485-46d7-9ff4-48c3c0757c81,d705cacc-3485-46d7-9ff4-48c3c0757c81,1,0,98f043ea-633c-4a03-a56f-efbc9e6ef288,98f043ea-633c-4a03-a56f-efbc9e6ef288,1,0,2033b92a-0750-478a-a12d-cf4f74d0a9da,2033b92a-0750-478a-a12d-cf4f74d0a9da,1,0,92fa2196-d8e5-45f9-9d2e-59d837b163ea,92fa2196-d8e5-45f9-9d2e-59d837b163ea,1,0,25dc2290-e283-4449-81c1-1ce15b58067f,25dc2290-e283-4449-81c1-1ce15b58067f,1,0,c534a865-a17f-41e7-88b9-c6af89c9d202,c534a865-a17f-41e7-88b9-c6af89c9d202,1,0,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,1,0,0127937c-94c0-43fe-9630-cc2ec6904ad8,0127937c-94c0-43fe-9630-cc2ec6904ad8,1,0,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,1,0,8df5b3cd-7788-4198-a530-e88be83f1cdf,8df5b3cd-7788-4198-a530-e88be83f1cdf,1,0,ffaeea66-66d5-4741-a9b5-875afebfce7f,ffaeea66-66d5-4741-a9b5-875afebfce7f,1,0,8f6b6576-1d21-46c1-905c-f1685f0eee7a,8f6b6576-1d21-46c1-905c-f1685f0eee7a,1,0,06827a85-a9d1-472e-8087-906ff94a4adc,06827a85-a9d1-472e-8087-906ff94a4adc,1,0,bb3954de-5eaa-4ec0-931b-a1a9f233c120,bb3954de-5eaa-4ec0-931b-a1a9f233c120,1,0,10689022-cbbb-4134-901f-1e778fac2693,10689022-cbbb-4134-901f-1e778fac2693,1,0,f14e363f-512b-4658-afb5-10c3be5ff870,f14e363f-512b-4658-afb5-10c3be5ff870,1,0,4d211427-4494-45d4-ae84-38235f35eaef,4d211427-4494-45d4-ae84-38235f35eaef,1,0,f7784993-d95c-4652-9894-3cf67aeabeb8,f7784993-d95c-4652-9894-3cf67aeabeb8,1,0,485d8b29-79b1-4798-a742-75546ddb7262,485d8b29-79b1-4798-a742-75546ddb7262,1,0,e248de85-8f76-4471-ab3d-d35514b69b78,e248de85-8f76-4471-ab3d-d35514b69b78,1,0,8928ce42-2b12-402f-8115-98b5655db556,8928ce42-2b12-402f-8115-98b5655db556,1,0,9b62c109-7b52-4803-83e6-a5413cd00984,9b62c109-7b52-4803-83e6-a5413cd00984,1,0,cddb4bb0-22ec-49ae-b332-62d7307b93fe,cddb4bb0-22ec-49ae-b332-62d7307b93fe,1,0,72876709-806e-4406-b9c1-b8117f4d750a,72876709-806e-4406-b9c1-b8117f4d750a,1,0,b1efafef-74cc-4d36-a32c-b472712f11f3,b1efafef-74cc-4d36-a32c-b472712f11f3,1,0,ceb05584-1ecd-4681-8575-c0452f95b685,ceb05584-1ecd-4681-8575-c0452f95b685,1,0,03d08c14-f814-4e12-8f96-020c36cca2bf,03d08c14-f814-4e12-8f96-020c36cca2bf,1,0,a1a7aab6-cf35-42ce-97bb-c112638a2748,a1a7aab6-cf35-42ce-97bb-c112638a2748,1,0,4e36184e-d818-4f38-9257-6d91d9cc85ae,4e36184e-d818-4f38-9257-6d91d9cc85ae,1,0,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,1,0,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,1,0,3893a258-a9c7-441a-b80c-1cc8c3f4735c,3893a258-a9c7-441a-b80c-1cc8c3f4735c,1,0,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,1,0,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,1,0,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,1,0,b9a6b053-2b93-4946-9531-040d3131dcc5,b9a6b053-2b93-4946-9531-040d3131dcc5,1,0,9f36d26e-aa71-44d5-ac27-9aaa643555c3,9f36d26e-aa71-44d5-ac27-9aaa643555c3,1,0,87b8b5d7-d3d6-450a-adb1-5c875257ec80,87b8b5d7-d3d6-450a-adb1-5c875257ec80,1,0,e3640efe-e46c-4588-b251-dda23bf0641d,e3640efe-e46c-4588-b251-dda23bf0641d,1,0,b46b5090-5eb1-4950-9031-8b43f611fa9c,b46b5090-5eb1-4950-9031-8b43f611fa9c,1,0,522a4bff-34d3-46b2-8c66-0b30d881a86e,522a4bff-34d3-46b2-8c66-0b30d881a86e,1,0,3d7908b1-bd82-475e-8488-fafcbe3458ee,3d7908b1-bd82-475e-8488-fafcbe3458ee,1,0,8a6cdb21-4eff-46dc-b928-738199f54581,8a6cdb21-4eff-46dc-b928-738199f54581,1,0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1,0,e9c632b0-7977-4e44-ac56-882617ad7cdc,e9c632b0-7977-4e44-ac56-882617ad7cdc,1,0,e84acba7-7e0f-43e8-a545-6e53d529d5d4,e84acba7-7e0f-43e8-a545-6e53d529d5d4,1,0,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,1,0,0f9c08c2-e7fa-4ea0-a935-f927feb01131,0f9c08c2-e7fa-4ea0-a935-f927feb01131,1,0,6086d53f-f1b2-4126-ab46-64705fe63b87,6086d53f-f1b2-4126-ab46-64705fe63b87,1,0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,1,0,57069b56-f732-41c0-9a75-cbdb1e88556c,57069b56-f732-41c0-9a75-cbdb1e88556c,1,0,cf80ff0d-9add-4fa5-bba2-00d43fce5ed8,cf80ff0d-9add-4fa5-bba2-00d43fce5ed8,1,0,d927f1f0-df5f-44a1-bbfd-152ebf1559dd,d927f1f0-df5f-44a1-bbfd-152ebf1559dd,1,0,7ce7aec1-fa24-4dd7-8754-8124e78521bf,7ce7aec1-fa24-4dd7-8754-8124e78521bf,1,0,8b115575-9d8b-42f8-9ec8-0825a4397c7f,8b115575-9d8b-42f8-9ec8-0825a4397c7f,1,0,40fa5847-28f0-41ff-bfb8-ec33c8626d33,40fa5847-28f0-41ff-bfb8-ec33c8626d33,1,0,6d042890-27b2-4efc-935e-8190bb57c037,6d042890-27b2-4efc-935e-8190bb57c037,1,0,23e79add-7f1c-422a-9df1-8f76ebf805df,23e79add-7f1c-422a-9df1-8f76ebf805df,1,0,9295d88f-0865-440c-a98a-4710c50211be,9295d88f-0865-440c-a98a-4710c50211be,1,0,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,1,0,5299d417-02c6-4f73-9c0c-8c22d267ab99,5299d417-02c6-4f73-9c0c-8c22d267ab99,1,0,38ac9a13-665a-4201-b5cc-687fe4a01130,38ac9a13-665a-4201-b5cc-687fe4a01130,1,0,97c59096-b2dc-45d0-a580-b3018a04f9af,97c59096-b2dc-45d0-a580-b3018a04f9af,1,0,8172256e-f51e-4de0-bd07-3668785f4cb9,8172256e-f51e-4de0-bd07-3668785f4cb9,1,0,5dcd8e28-b058-405a-bac4-defab7d4b789,5dcd8e28-b058-405a-bac4-defab7d4b789,1,0,6fbf63b7-1692-495e-a8ec-bdda182997a3,6fbf63b7-1692-495e-a8ec-bdda182997a3,1,0,4a2c2478-03ad-4521-9356-09ee07fce972,4a2c2478-03ad-4521-9356-09ee07fce972,1,0,077af11c-fd3c-4e87-b169-5f3137464f77,077af11c-fd3c-4e87-b169-5f3137464f77,1,0,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,1,0,da8f7f30-eb80-44db-a451-348306c90cd8,da8f7f30-eb80-44db-a451-348306c90cd8,1,0,879304f7-9507-4fb8-9177-355428d6bba9,879304f7-9507-4fb8-9177-355428d6bba9,1,0,efb50581-cc7e-47ac-bfa2-86da2860bf1d,efb50581-cc7e-47ac-bfa2-86da2860bf1d,1,0,fd07f403-1116-4102-a1bf-35abb03ad493,fd07f403-1116-4102-a1bf-35abb03ad493,1,0,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,1,0,0722315c-9217-4ecf-80ff-d1ee89f84a53,0722315c-9217-4ecf-80ff-d1ee89f84a53,1,0,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,1,0,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,1,0,a2f943a4-05a3-4eb6-9a10-74b6859469a6,a2f943a4-05a3-4eb6-9a10-74b6859469a6,1,0,c172aeaf-b444-47c0-baee-80ccd91fe934,c172aeaf-b444-47c0-baee-80ccd91fe934,1,0,757ea742-8c14-4e0a-a867-432eee5cfc64,757ea742-8c14-4e0a-a867-432eee5cfc64,1,0,b8c36d5a-7966-4978-9225-67502b9c60a4,b8c36d5a-7966-4978-9225-67502b9c60a4,1,0,9847676d-f44d-46a0-83e2-4a43a835caf8,9847676d-f44d-46a0-83e2-4a43a835caf8,1,0,43c18cae-21a9-413b-a350-d5cf826980f0,43c18cae-21a9-413b-a350-d5cf826980f0,1,0,16773cdb-b979-42d5-a2a5-d4b79e8737bd,16773cdb-b979-42d5-a2a5-d4b79e8737bd,1,0,c28a190a-f487-4e99-b8f8-6928268086f8,c28a190a-f487-4e99-b8f8-6928268086f8,1,0,94e02f76-8656-4999-9470-dd996118400c,94e02f76-8656-4999-9470-dd996118400c,1,0,9effd265-3783-44e2-8698-80dd82137546,9effd265-3783-44e2-8698-80dd82137546,1,0,bef52020-98f8-465b-8981-e5f8eed62308,bef52020-98f8-465b-8981-e5f8eed62308,1,0,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,1,0,e731dab7-df9e-48ae-8542-4c0c30666ae9,e731dab7-df9e-48ae-8542-4c0c30666ae9,1,0,f321e378-6d50-4567-8434-813f367d3a65,f321e378-6d50-4567-8434-813f367d3a65,1,0,27246fd8-a8a3-4244-b49a-c0372a812167,27246fd8-a8a3-4244-b49a-c0372a812167,1,0,7d91ff3c-1ec2-41d0-9d38-fa8f8534c55c,7d91ff3c-1ec2-41d0-9d38-fa8f8534c55c,1,0,6da15c1d-e144-472e-9a3a-2797c7df16e4,6da15c1d-e144-472e-9a3a-2797c7df16e4,1,0,350a7b29-4ba3-43c4-b77d-47085f53d760,350a7b29-4ba3-43c4-b77d-47085f53d760,1,0,a151715d-c89e-4e4c-b8fd-d7d6ad71e603,a151715d-c89e-4e4c-b8fd-d7d6ad71e603,1,0,f6d6f1b9-3956-4fdb-bbb0-5d81f083a072,f6d6f1b9-3956-4fdb-bbb0-5d81f083a072,1,0,a5dd4200-0f25-452d-9014-3b1506c31557,a5dd4200-0f25-452d-9014-3b1506c31557,1,0,c48c091c-0d46-4d1f-bc84-72b0537c7ec2,c48c091c-0d46-4d1f-bc84-72b0537c7ec2,1,0,122a94c7-bb89-4f11-b583-b56808c1df47,122a94c7-bb89-4f11-b583-b56808c1df47,1,0,f4371f32-95a5-40f4-bc5e-a5b9a12a86eb,f4371f32-95a5-40f4-bc5e-a5b9a12a86eb,1,0,5f434c45-a5ff-4a07-8662-6a592298c7e9,5f434c45-a5ff-4a07-8662-6a592298c7e9,1,0,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,1,0,bde05768-2dd6-4800-985d-27075f610cca,bde05768-2dd6-4800-985d-27075f610cca,1,0,d18956cf-e449-48cc-a127-01b5dc910ea2,d18956cf-e449-48cc-a127-01b5dc910ea2,1,0,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,1,0,5d338e31-a56b-45f0-8a62-0270ca543f6a,5d338e31-a56b-45f0-8a62-0270ca543f6a,1,0,afd8251f-548b-4bb6-8ad0-4f412bec7cb6,afd8251f-548b-4bb6-8ad0-4f412bec7cb6,1,0,e352fc19-96be-4410-a516-bc58cc234422,e352fc19-96be-4410-a516-bc58cc234422,1,0,9b742da4-1696-4c06-9dfa-dd85c9286c74,9b742da4-1696-4c06-9dfa-dd85c9286c74,1,0,db1062bc-4164-4095-9640-9804c0ebcd0b,db1062bc-4164-4095-9640-9804c0ebcd0b,1,0,c11d967b-1250-4345-90b0-011a96c5ae5e,c11d967b-1250-4345-90b0-011a96c5ae5e,1,0,ea7c61ff-745c-4908-9a94-bba022d12de4,ea7c61ff-745c-4908-9a94-bba022d12de4,1,0,24eed105-f612-4340-ad79-388a7b39b58c,24eed105-f612-4340-ad79-388a7b39b58c,1,0,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,1,0,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,1,0,53caada5-1d53-45dc-9432-90075ddca890,53caada5-1d53-45dc-9432-90075ddca890,1,0,d1472d23-954b-4069-b2d6-df08c6ec0be1,d1472d23-954b-4069-b2d6-df08c6ec0be1,1,0,93fe2ce6-7193-42bc-a966-4653b7989eaa,93fe2ce6-7193-42bc-a966-4653b7989eaa,1,0,65678df4-a323-451f-98ba-305a74fc5805,65678df4-a323-451f-98ba-305a74fc5805,1,0,6a2add61-edb7-4561-bae9-06b3741e7726,6a2add61-edb7-4561-bae9-06b3741e7726,1,0,a7fe0aa5-722c-4a09-889b-ee422421addc,a7fe0aa5-722c-4a09-889b-ee422421addc,1,0,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,1,0,b572b1d0-4404-421c-9950-1cc1342ca5f3,b572b1d0-4404-421c-9950-1cc1342ca5f3,1,0,0c838a31-2b08-447c-b39a-a613cfba526c,0c838a31-2b08-447c-b39a-a613cfba526c,1,0,02082174-7276-4256-b9bb-9872065a01c4,02082174-7276-4256-b9bb-9872065a01c4,1,0,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,1,0,b1230b96-f4c8-4311-bfc0-df33bcc41394,b1230b96-f4c8-4311-bfc0-df33bcc41394,1,0,670c62c1-1a33-4dec-9540-5b4c1fe29074,670c62c1-1a33-4dec-9540-5b4c1fe29074,1,0,cc664d81-d0af-4d25-ae29-64f422e51bf2,cc664d81-d0af-4d25-ae29-64f422e51bf2,1,0,ae3876e2-bd06-415b-9d9a-b77d787be09e,ae3876e2-bd06-415b-9d9a-b77d787be09e,1,0,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,1,0,4718392b-477c-496b-9d28-ddbdaa7a04f2,4718392b-477c-496b-9d28-ddbdaa7a04f2,1,0,879844f0-30b4-47f5-8d2e-5fea29910368,879844f0-30b4-47f5-8d2e-5fea29910368,1,0,303334ba-2785-47fe-a094-84f9dea33be2,303334ba-2785-47fe-a094-84f9dea33be2,1,0,04424730-6992-4a5b-838b-7a7c16dedbd0,04424730-6992-4a5b-838b-7a7c16dedbd0,1,0,1260b5dd-0a74-43df-bdbb-215b253da28e,1260b5dd-0a74-43df-bdbb-215b253da28e,1,0,e37a7cf1-a7b5-4b6e-b818-0915598c8505,e37a7cf1-a7b5-4b6e-b818-0915598c8505,1,0,240bec31-cd59-477b-8459-8e3278da22dc,240bec31-cd59-477b-8459-8e3278da22dc,1,0,f3abaf8e-0230-43db-aaf0-716fc02047eb,f3abaf8e-0230-43db-aaf0-716fc02047eb,1,0,b76c3bd6-924a-4378-acbe-6f17232b201b,b76c3bd6-924a-4378-acbe-6f17232b201b,1,0,e0519f0c-9c99-4f5c-a3a9-27adce45737d,e0519f0c-9c99-4f5c-a3a9-27adce45737d,1,0,554320a0-55dc-4289-bb08-63d405cb4ca5,554320a0-55dc-4289-bb08-63d405cb4ca5,1,0,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,1,0,3b1d0974-6031-4841-b632-aadd4ff13b2c,3b1d0974-6031-4841-b632-aadd4ff13b2c,1,0,0874a3c0-0d16-4172-b467-f0666d5fcaee,0874a3c0-0d16-4172-b467-f0666d5fcaee,1,0,9d358304-3fd0-4ec6-9400-cc498ff2f751,9d358304-3fd0-4ec6-9400-cc498ff2f751,1,0,cc380a19-ab29-4f20-93ad-9a58cd4de56e,cc380a19-ab29-4f20-93ad-9a58cd4de56e,1,0,6a5f7521-270e-476e-88ec-a8cf79ea61a6,6a5f7521-270e-476e-88ec-a8cf79ea61a6,1,0,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,1,0,74067eee-6cd4-4ae3-becc-457ecb51dc9a,74067eee-6cd4-4ae3-becc-457ecb51dc9a,1,0,e54a8786-86a4-48e3-a210-aaae4e5fce8c,e54a8786-86a4-48e3-a210-aaae4e5fce8c,1,0,86c86ea2-d14e-4443-b36c-c1c17c4f768a,86c86ea2-d14e-4443-b36c-c1c17c4f768a,1,0,14512818-58b0-44cc-b00d-d37913c57aad,14512818-58b0-44cc-b00d-d37913c57aad,1,0,57964dd6-4b0b-4590-bc44-de744cc423af,57964dd6-4b0b-4590-bc44-de744cc423af,1,0,f5bb88eb-c239-4ae3-a297-dfbbd679e008,f5bb88eb-c239-4ae3-a297-dfbbd679e008,1,0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,1,0,eaeb5aa8-8edf-4f74-8011-2d476f543bf6,eaeb5aa8-8edf-4f74-8011-2d476f543bf6,1,0,343b979a-97e3-4eac-a314-3bd3eea9c15c,343b979a-97e3-4eac-a314-3bd3eea9c15c,1,0,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,1,0,7adced5f-3a5f-419a-926c-0452aad86c86,7adced5f-3a5f-419a-926c-0452aad86c86,1,0,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,1,0,7433b2a9-f634-4af7-ac85-6aa1280ea239,7433b2a9-f634-4af7-ac85-6aa1280ea239,1,0,9f32e85c-2ed6-41db-b0ec-6d8596940e80,9f32e85c-2ed6-41db-b0ec-6d8596940e80,1,0,f259b6b4-d582-429f-a16f-027a6bcb7438,f259b6b4-d582-429f-a16f-027a6bcb7438,1,0,46e0522b-b88b-43b2-9067-a5359e90994b,46e0522b-b88b-43b2-9067-a5359e90994b,1,0,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,1,0,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,1,0,72d41d01-9c9d-4fbe-8a39-932d82d171ef,72d41d01-9c9d-4fbe-8a39-932d82d171ef,1,0,f4afd271-64de-4a6d-b0ef-f27db4d66d32,f4afd271-64de-4a6d-b0ef-f27db4d66d32,1,0,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,1,0,697d5715-dd04-40be-9b28-539734725158,697d5715-dd04-40be-9b28-539734725158,1,0,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,1,0,d95fcb37-fc65-466d-93e2-489f41683276,d95fcb37-fc65-466d-93e2-489f41683276,1,0,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,1,0,a27a9296-46bb-49a1-8308-db675baa81d0,a27a9296-46bb-49a1-8308-db675baa81d0,1,0,1456f317-360c-4190-b2d1-1be7484369a5,1456f317-360c-4190-b2d1-1be7484369a5,1,0,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,1,0,4867948f-b027-44ae-b78c-a94e00eed52b,4867948f-b027-44ae-b78c-a94e00eed52b,1,0,aa0c32ae-da52-4df9-8b77-99ea31f8df81,aa0c32ae-da52-4df9-8b77-99ea31f8df81,1,0,d7dcd391-3a0e-4aa9-9b53-467a1de67593,d7dcd391-3a0e-4aa9-9b53-467a1de67593,1,0,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,1,0,ef044879-e731-418a-b917-6a685f27c5f4,ef044879-e731-418a-b917-6a685f27c5f4,1,0,618d13d5-fd1f-4b70-ad45-dd6a17a50730,618d13d5-fd1f-4b70-ad45-dd6a17a50730,1,0,0248a6c4-7ce5-4898-bb1d-9ad9509e6795,0248a6c4-7ce5-4898-bb1d-9ad9509e6795,1,0,6a5b9e7f-c368-40d8-812a-64f68ea1ef9d,6a5b9e7f-c368-40d8-812a-64f68ea1ef9d,1,0,58037b76-b548-4f07-bd67-67e552a5c6e5,58037b76-b548-4f07-bd67-67e552a5c6e5,1,0,68f19104-5fa3-4f28-a84b-bf68c3bed49b,68f19104-5fa3-4f28-a84b-bf68c3bed49b,1,0,f88ccd7a-8d15-4b24-addf-da522a0b4a43,f88ccd7a-8d15-4b24-addf-da522a0b4a43,1,0,00e48a23-eb5b-4a29-b36c-218ab9760f23,00e48a23-eb5b-4a29-b36c-218ab9760f23,1,0,331db120-ba88-4eb3-a8ec-10691be82e2d,331db120-ba88-4eb3-a8ec-10691be82e2d,1,0,349378d1-abe3-44de-84a4-d525b08e0474,349378d1-abe3-44de-84a4-d525b08e0474,1,0,1526b18d-7fab-414e-a5b2-377b67ac0b55,1526b18d-7fab-414e-a5b2-377b67ac0b55,1,0,c561fe6b-53ea-435b-a230-1850e2dc1ff5,c561fe6b-53ea-435b-a230-1850e2dc1ff5,1,0,aba7605f-6baf-42a8-b5ad-8f71c780b81f,aba7605f-6baf-42a8-b5ad-8f71c780b81f,1,0,8fc19eca-1a15-4758-af4b-79637e51edfb,8fc19eca-1a15-4758-af4b-79637e51edfb,1,0,4ad1ef06-d8b4-46da-b536-d23c40e85497,4ad1ef06-d8b4-46da-b536-d23c40e85497,1,0,be9144ce-5560-47bb-8c5e-9beefd15bfc3,be9144ce-5560-47bb-8c5e-9beefd15bfc3,1,0,ad09d1e6-5982-4e1c-864e-452ac5b2915a,ad09d1e6-5982-4e1c-864e-452ac5b2915a,1,0,caea53be-d2f7-4109-8017-d2bfdfde8c6f,caea53be-d2f7-4109-8017-d2bfdfde8c6f,1,0,60f30706-9919-4767-a17c-660754b9d542,60f30706-9919-4767-a17c-660754b9d542,1,0,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,1,0,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,1,0,35823167-b658-4563-8d01-b0aab05aa619,35823167-b658-4563-8d01-b0aab05aa619,1,0,9ee03c48-c338-4655-9095-d490231df2a3,9ee03c48-c338-4655-9095-d490231df2a3,1,0,94928ba3-6bbf-4bd3-94cf-9c51b50e005f,94928ba3-6bbf-4bd3-94cf-9c51b50e005f,1,0,3924c17c-6ee3-4406-8023-0a79a242e389,3924c17c-6ee3-4406-8023-0a79a242e389,1,0,84a159ed-bc5f-4497-94d1-94b187b0bffe,84a159ed-bc5f-4497-94d1-94b187b0bffe,1,0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,1,0,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,1,0,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,1,0,f95adb50-fa0b-434c-93dd-b7fd211220b7,f95adb50-fa0b-434c-93dd-b7fd211220b7,1,0,e590825f-10c6-4fdd-98cd-3da01da2ed4f,e590825f-10c6-4fdd-98cd-3da01da2ed4f,1,0,2233ce53-b8a8-4c83-97a2-683c8575462a,2233ce53-b8a8-4c83-97a2-683c8575462a,1,0,b938ff17-e31c-4762-a96f-e1288f746a1d,b938ff17-e31c-4762-a96f-e1288f746a1d,1,0,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,1,0,bd69bf55-dee0-4553-8f90-5fd025c0f773,bd69bf55-dee0-4553-8f90-5fd025c0f773,1,0,2071f210-dc13-43c0-a58e-b982821d6842,2071f210-dc13-43c0-a58e-b982821d6842,1,0,bea697f4-46a8-4698-ac60-64326e442f2b,bea697f4-46a8-4698-ac60-64326e442f2b,1,0,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,1,0,f415296e-fceb-4835-abe9-17bb17a5d5e5,f415296e-fceb-4835-abe9-17bb17a5d5e5,1,0,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,1,0,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,1,0,19056365-9ff1-4733-876e-a7ebdbbe0557,19056365-9ff1-4733-876e-a7ebdbbe0557,1,0,c8679d82-075c-4556-8231-c004d144fe61,c8679d82-075c-4556-8231-c004d144fe61,1,0,5e09dc5e-bbb7-4c38-b609-940c24f63c84,5e09dc5e-bbb7-4c38-b609-940c24f63c84,1,0,017b28eb-8ba9-465e-a748-20eadbeb4ea2,017b28eb-8ba9-465e-a748-20eadbeb4ea2,1,0,c0bb2d66-94c9-4bc6-afd5-534075e8395b,c0bb2d66-94c9-4bc6-afd5-534075e8395b,1,0,db7cc693-1645-4416-a9d9-5a7584cd3bbc,db7cc693-1645-4416-a9d9-5a7584cd3bbc,1,0,c849fb09-7833-49c8-9461-98426dc6c0af,c849fb09-7833-49c8-9461-98426dc6c0af,1,0,6c58fc3a-37f8-44b7-b076-2c10ce09b554,6c58fc3a-37f8-44b7-b076-2c10ce09b554,1,0,245c07a9-98b0-452b-b899-dc8751ab7ce0,245c07a9-98b0-452b-b899-dc8751ab7ce0,1,0,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,1,0,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,1,0,91d7687b-7627-473f-a08d-433f9d385107,91d7687b-7627-473f-a08d-433f9d385107,1,0,2276a1d4-b4d9-4643-8342-36143ce4eb26,2276a1d4-b4d9-4643-8342-36143ce4eb26,1,0,83db1b00-e9e3-41da-8a59-47589dcfd618,83db1b00-e9e3-41da-8a59-47589dcfd618,1,0,91d2d798-1498-4c52-aa7b-99db4b992876,91d2d798-1498-4c52-aa7b-99db4b992876,1,0,e85a03d3-e7c7-4058-992a-515a557d9e52,e85a03d3-e7c7-4058-992a-515a557d9e52,1,0,195ea1f8-3e38-4254-a33d-c87424b8f7dc,195ea1f8-3e38-4254-a33d-c87424b8f7dc,1,0,d3a1d247-8f4a-45af-9861-7e313a100209,d3a1d247-8f4a-45af-9861-7e313a100209,1,0,837f27c1-26d7-4f24-a691-55dd9ed04ec5,837f27c1-26d7-4f24-a691-55dd9ed04ec5,1,0,9e2ddfbb-8d6b-4b82-8a2b-62c2ea990b10,9e2ddfbb-8d6b-4b82-8a2b-62c2ea990b10,1,0,5005655f-22b2-49e6-be4f-b15d768d10b2,5005655f-22b2-49e6-be4f-b15d768d10b2,1,0,208040c8-e98b-4c15-a2ec-38d44bfcfa6c,208040c8-e98b-4c15-a2ec-38d44bfcfa6c,1,0,f6811ee2-769e-488d-9ca0-70f1fe521ca9,f6811ee2-769e-488d-9ca0-70f1fe521ca9,1,0,83385f31-2cdf-44a1-85c3-461e4ad5fd45,83385f31-2cdf-44a1-85c3-461e4ad5fd45,1,0,b55b06db-604e-4fb9-9253-638c747bd8f9,b55b06db-604e-4fb9-9253-638c747bd8f9,1,0,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,1,0,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,1,0,deb69010-80b0-4e28-acc7-8c50e8e6f873,deb69010-80b0-4e28-acc7-8c50e8e6f873,1,0,1a9177fe-6699-42b3-9588-eed9c6008c2d,1a9177fe-6699-42b3-9588-eed9c6008c2d,1,0,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,1,0,ae698468-f42a-4400-aee6-fd849740e634,ae698468-f42a-4400-aee6-fd849740e634,1,0,0b88b50d-6aa1-4364-82bd-1c0c0da93a58,0b88b50d-6aa1-4364-82bd-1c0c0da93a58,1,0,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,1,0,6438435e-97cc-4bd2-98dc-e21cee55bb0f,6438435e-97cc-4bd2-98dc-e21cee55bb0f,1,0,31b93291-a58f-4176-8318-58200e8bc56e,31b93291-a58f-4176-8318-58200e8bc56e,1,0,293be1bc-49cb-4a99-add8-2a3a46829718,293be1bc-49cb-4a99-add8-2a3a46829718,1,0,00579e31-e97d-4d79-ba25-b8d500a17e7f,00579e31-e97d-4d79-ba25-b8d500a17e7f,1,0,5001bea4-c8f9-4950-9eda-d33125e3bb46,5001bea4-c8f9-4950-9eda-d33125e3bb46,1,0,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,1,0,bc2dd611-b589-4519-b274-40db5c66b378,bc2dd611-b589-4519-b274-40db5c66b378,1,0,e815010d-e03d-46e4-b482-c1556902cc26,e815010d-e03d-46e4-b482-c1556902cc26,1,0,d4ab930a-ddaa-4552-afed-2618af822365,d4ab930a-ddaa-4552-afed-2618af822365,1,0,2388e3f4-b23b-488f-9ea5-d9434efca195,2388e3f4-b23b-488f-9ea5-d9434efca195,1,0,dd03e170-4186-495b-ae1c-fc66385d7ccf,dd03e170-4186-495b-ae1c-fc66385d7ccf,1,0,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,1,0,cdef5df6-f3a1-4950-b197-4f375914f885,cdef5df6-f3a1-4950-b197-4f375914f885,1,0,c1caff49-dc4b-4b3e-be47-122ea8b70416,c1caff49-dc4b-4b3e-be47-122ea8b70416,1,0,a1185a4c-7351-48b0-b662-61f61a1ad715,a1185a4c-7351-48b0-b662-61f61a1ad715,1,0,bf5faaef-3a03-40bc-8d3a-644c0874b9ce,bf5faaef-3a03-40bc-8d3a-644c0874b9ce,1,0,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,1,0,71d03545-df45-4c70-aa0d-3b916f2a9041,71d03545-df45-4c70-aa0d-3b916f2a9041,1,0,da9b0d3d-27dd-4a85-b0df-ec2f54d884f6,da9b0d3d-27dd-4a85-b0df-ec2f54d884f6,1,0,28a25822-2306-409a-a7c8-6f7e42bf25e8,28a25822-2306-409a-a7c8-6f7e42bf25e8,1,0,89cb31da-a980-4207-a537-85cd47f08d32,89cb31da-a980-4207-a537-85cd47f08d32,1,0,a45fa0c3-c363-4465-861f-13cedfeb79dd,a45fa0c3-c363-4465-861f-13cedfeb79dd,1,0,a72517c3-8c91-4e40-81ac-83c762789e87,a72517c3-8c91-4e40-81ac-83c762789e87,1,0,0233b335-7e26-4661-9850-8ab09d3178e3,0233b335-7e26-4661-9850-8ab09d3178e3,1,0,d942d536-5d01-4571-b910-abd973996a38,d942d536-5d01-4571-b910-abd973996a38,1,0,b82a7103-b872-49c3-b632-81d5a0051136,b82a7103-b872-49c3-b632-81d5a0051136,1,0,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,1,0,20c2053c-8ebd-4c07-8d95-956b424d047c,20c2053c-8ebd-4c07-8d95-956b424d047c,1,0,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,1,0,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,1,0,bef6081e-f377-41d6-83a1-b0e218a3fb46,bef6081e-f377-41d6-83a1-b0e218a3fb46,1,0,9b67bfd5-ef23-4205-b7ba-9466517e9999,9b67bfd5-ef23-4205-b7ba-9466517e9999,1,0,ea2c4c8e-23cc-4884-812e-1e959da48afc,ea2c4c8e-23cc-4884-812e-1e959da48afc,1,0,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,1,0,63fd620c-59a5-493c-a39e-457fad6fe35f,63fd620c-59a5-493c-a39e-457fad6fe35f,1,0,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,1,0,75ffd0b9-79be-4600-a310-591fddb6d63e,75ffd0b9-79be-4600-a310-591fddb6d63e,1,0,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,1,0,89888993-3b05-475e-ac76-3cd7ced93250,89888993-3b05-475e-ac76-3cd7ced93250,1,0,129f704b-cc63-4a4e-b6a7-9e53de4537a2,129f704b-cc63-4a4e-b6a7-9e53de4537a2,1,0,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,1,0,592f55e1-b004-44ef-878a-6c2016ccbeb0,592f55e1-b004-44ef-878a-6c2016ccbeb0,1,0,19add2bd-eede-4a05-901b-cf8ce49a638f,19add2bd-eede-4a05-901b-cf8ce49a638f,1,0,becf53b6-3fbc-4c70-822f-4a70b0434353,becf53b6-3fbc-4c70-822f-4a70b0434353,1,0,c7f544c6-488e-4178-af0d-d2ae07a8b89a,c7f544c6-488e-4178-af0d-d2ae07a8b89a,1,0,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,1,0,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,1,0,c38d8135-e11f-4860-b370-84ff279b7fbd,c38d8135-e11f-4860-b370-84ff279b7fbd,1,0,ee0798f5-47a8-4118-a25c-cfd3473007c1,ee0798f5-47a8-4118-a25c-cfd3473007c1,1,0,652ee894-047b-4a5a-a500-2d61b4c4a473,652ee894-047b-4a5a-a500-2d61b4c4a473,1,0,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,1,0,33f8cd94-71e7-4703-92c3-22690fbd871a,33f8cd94-71e7-4703-92c3-22690fbd871a,1,0,b6e5de4d-0156-4342-b646-6e6920a4bd3a,b6e5de4d-0156-4342-b646-6e6920a4bd3a,1,0,c03f9972-5a1f-449b-b170-5a958c2b5846,c03f9972-5a1f-449b-b170-5a958c2b5846,1,0,25896075-2484-4879-8310-7f5680d80b48,25896075-2484-4879-8310-7f5680d80b48,1,0,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1,0,9043894d-f89a-459f-a4ea-77fe3633aa91,9043894d-f89a-459f-a4ea-77fe3633aa91,1,0,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,1,0,085cbea9-1df1-4ee9-afb7-da2bf313697e,085cbea9-1df1-4ee9-afb7-da2bf313697e,1,0,09858042-6284-4499-8055-c1b5b783ce5f,09858042-6284-4499-8055-c1b5b783ce5f,1,0,38fc1e6e-7cd3-437b-b429-6655be34cd01,38fc1e6e-7cd3-437b-b429-6655be34cd01,1,0,8c4c7982-36cc-4dc9-b055-9954f61e6365,8c4c7982-36cc-4dc9-b055-9954f61e6365,1,0,ba51c7f5-0074-4c99-a27d-ddfd4bfcc068,ba51c7f5-0074-4c99-a27d-ddfd4bfcc068,1,0,5f3d5a05-a581-462d-96a2-2750ba0e0481,5f3d5a05-a581-462d-96a2-2750ba0e0481,1,0,477ab478-b336-4bac-898f-e20e3a4039b5,477ab478-b336-4bac-898f-e20e3a4039b5,1,0,a4d767a1-d2e6-4e0a-ab35-9207eef54998,a4d767a1-d2e6-4e0a-ab35-9207eef54998,1,0,e50cb13a-151b-45d2-a7b7-d23440ddfa24,e50cb13a-151b-45d2-a7b7-d23440ddfa24,1,0,cc3a7f15-4db6-445e-b282-f44d0460b7d3,cc3a7f15-4db6-445e-b282-f44d0460b7d3,1,0,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,1,0,0d8770aa-fa6e-471c-92c8-b96576927ef0,0d8770aa-fa6e-471c-92c8-b96576927ef0,1,0,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,1,0,e25b2b10-bf08-42db-9642-861efc5e583b,e25b2b10-bf08-42db-9642-861efc5e583b,1,0,b8a32c33-4e15-4c21-baab-64a86d44321b,b8a32c33-4e15-4c21-baab-64a86d44321b,1,0,d7dd9a03-6818-4987-8f39-58e1c906569f,d7dd9a03-6818-4987-8f39-58e1c906569f,1,0,e4216976-2747-4078-81d4-8ffab668c1f7,e4216976-2747-4078-81d4-8ffab668c1f7,1,0,fce028b8-b530-49f0-b6ad-a28d03e19b0f,fce028b8-b530-49f0-b6ad-a28d03e19b0f,1,0,301eea20-0e7f-441e-a531-28b4627dfd93,301eea20-0e7f-441e-a531-28b4627dfd93,1,0,41f87891-ddd5-4e0f-a4f2-8039fb71981b,41f87891-ddd5-4e0f-a4f2-8039fb71981b,1,0,3b9c03bc-8517-498f-8052-e53854fb0753,3b9c03bc-8517-498f-8052-e53854fb0753,1,0,95a71c2e-aa39-42ec-8889-2390a553f146,95a71c2e-aa39-42ec-8889-2390a553f146,1,0,47da49ee-b243-4e78-9c8f-bb26c60e6136,47da49ee-b243-4e78-9c8f-bb26c60e6136,1,0,39bee714-cacd-4d48-97a5-c838660e049a,39bee714-cacd-4d48-97a5-c838660e049a,1,0,6c66ff27-19af-4728-95a8-463fd1c4dcd3,6c66ff27-19af-4728-95a8-463fd1c4dcd3,1,0,9ed2c756-80a1-4559-8494-b7a9b82a4519,9ed2c756-80a1-4559-8494-b7a9b82a4519,1,0,69149ce1-d3f8-4e12-be8f-b328ade60882,69149ce1-d3f8-4e12-be8f-b328ade60882,1,0,ff592ecb-eb08-4554-87bf-1d2935b21d3c,ff592ecb-eb08-4554-87bf-1d2935b21d3c,1,0,d975aef4-8da8-4486-baeb-a99c48cff0ec,d975aef4-8da8-4486-baeb-a99c48cff0ec,1,0,75666bb9-f6d3-4dd6-8220-427a81f23fc9,75666bb9-f6d3-4dd6-8220-427a81f23fc9,1,0,9da27139-0bed-47b0-aef6-246929968502,9da27139-0bed-47b0-aef6-246929968502,1,0,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,1,0,29f2094a-d0d1-425c-8161-45a9ba186e19,29f2094a-d0d1-425c-8161-45a9ba186e19,1,0,893b2dd9-a939-4799-9b78-50d788a5f3ba,893b2dd9-a939-4799-9b78-50d788a5f3ba,1,0,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,1,0,a57f6dc1-59d7-4311-8acd-65ce57a9f386,a57f6dc1-59d7-4311-8acd-65ce57a9f386,1,0,e4842271-4fc0-4e15-afef-876f05af78c0,e4842271-4fc0-4e15-afef-876f05af78c0,1,0,31ee6430-b65d-42fa-859b-c4f1c40686ae,31ee6430-b65d-42fa-859b-c4f1c40686ae,1,0,c59e11f3-6bcb-404a-9d76-1416c12be354,c59e11f3-6bcb-404a-9d76-1416c12be354,1,0,c1a1f12b-3978-4047-956e-a5c7de8371a0,c1a1f12b-3978-4047-956e-a5c7de8371a0,1,0,ac39b903-0c60-417e-a50f-49ed375424f5,ac39b903-0c60-417e-a50f-49ed375424f5,1,0,135d57fe-d420-4bb0-9120-e43fd9b55c16,135d57fe-d420-4bb0-9120-e43fd9b55c16,1,0,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,1,0,387d3bbf-cddd-4506-b14f-89c1f37adbbc,387d3bbf-cddd-4506-b14f-89c1f37adbbc,1,0,16392cf6-dd83-4df0-a54b-6efc29778a89,16392cf6-dd83-4df0-a54b-6efc29778a89,1,0,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,1,0,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,1,0,230722e6-942f-4594-be89-eff59c6572bf,230722e6-942f-4594-be89-eff59c6572bf,1,0,237dab99-ed72-432c-ad01-c6045d74f000,237dab99-ed72-432c-ad01-c6045d74f000,1,0,a1130128-cc48-4555-93a2-99e7f74f77dc,a1130128-cc48-4555-93a2-99e7f74f77dc,1,0,9b4b7424-1af7-4d80-8404-8819fcfeae75,9b4b7424-1af7-4d80-8404-8819fcfeae75,1,0,94e08dcf-3885-4a73-82ab-cb291f1cf95f,94e08dcf-3885-4a73-82ab-cb291f1cf95f,1,0,8947286f-ba4a-44e7-b805-2f096028dc4f,8947286f-ba4a-44e7-b805-2f096028dc4f,1,0,55ce840b-5838-4107-886d-f935b9907bd8,55ce840b-5838-4107-886d-f935b9907bd8,1,0,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,1,0,f1753bda-16db-4b00-a16a-37ddade8403f,f1753bda-16db-4b00-a16a-37ddade8403f,1,0,251ca8fe-09eb-45ca-be8b-0d8faf927009,251ca8fe-09eb-45ca-be8b-0d8faf927009,1,0,e353db15-71c5-4b68-9ffb-9800800a59dc,e353db15-71c5-4b68-9ffb-9800800a59dc,1,0,976d9ba7-d9c7-4a9e-ad5d-53cb5bca8984,976d9ba7-d9c7-4a9e-ad5d-53cb5bca8984,1,0,a1875d63-4303-46f1-bdea-fc529b5891f3,a1875d63-4303-46f1-bdea-fc529b5891f3,1,0,59123b12-6052-4480-9c86-f4de1b5cdc04,59123b12-6052-4480-9c86-f4de1b5cdc04,1,0,19b98b60-deb1-4642-8159-2a11332558e2,19b98b60-deb1-4642-8159-2a11332558e2,1,0,133f181a-fade-4182-826d-904fac780326,133f181a-fade-4182-826d-904fac780326,1,0,a687748a-0b2a-4277-b935-07616d28430d,a687748a-0b2a-4277-b935-07616d28430d,1,0,f60cb71a-f451-426a-aa3a-aa266b8da149,f60cb71a-f451-426a-aa3a-aa266b8da149,1,0,641ebe22-7135-4adb-bbd6-e0c37d246a2d,641ebe22-7135-4adb-bbd6-e0c37d246a2d,1,0,f71ba01e-9f6b-4241-8048-4368c8888756,f71ba01e-9f6b-4241-8048-4368c8888756,1,0,9059defa-047f-4dac-9749-3d0a6a77308a,9059defa-047f-4dac-9749-3d0a6a77308a,1,0,6010c27f-e857-4fc3-be13-1eea51f02ea7,6010c27f-e857-4fc3-be13-1eea51f02ea7,1,0,973609a2-5b5d-45c4-9606-a13d0de1a09b,973609a2-5b5d-45c4-9606-a13d0de1a09b,1,0,6aa814fa-417e-428c-951e-6efd9d0775da,6aa814fa-417e-428c-951e-6efd9d0775da,1,0,a247efe1-8608-4780-9cc8-54e29944475b,a247efe1-8608-4780-9cc8-54e29944475b,1,0,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,1,0,a8f162e9-3f59-41a5-b82f-da20928213c7,a8f162e9-3f59-41a5-b82f-da20928213c7,1,0,ade68dfd-5037-4fd7-b043-9514e3fe6342,ade68dfd-5037-4fd7-b043-9514e3fe6342,1,0,7b008aad-9d05-43e1-8295-62ae58cfff42,7b008aad-9d05-43e1-8295-62ae58cfff42,1,0,fdaf9255-d621-4a98-9530-f618ed440795,fdaf9255-d621-4a98-9530-f618ed440795,1,0,48cefa96-46c7-4870-a096-951dcbae479a,48cefa96-46c7-4870-a096-951dcbae479a,1,0,d74e01cc-941b-4974-8771-0bd2e0d86724,d74e01cc-941b-4974-8771-0bd2e0d86724,1,0,0daac965-2026-4acc-8ba1-3c1f01779257,0daac965-2026-4acc-8ba1-3c1f01779257,1,0,65a331c0-7501-49f6-8027-35b703d11834,65a331c0-7501-49f6-8027-35b703d11834,1,0,5e4ee280-3dd2-4f68-be6c-fb5343438817,5e4ee280-3dd2-4f68-be6c-fb5343438817,1,0,75d1b6df-ede3-4172-987f-fe1551f686ee,75d1b6df-ede3-4172-987f-fe1551f686ee,1,0,c67fab0a-704f-43ae-bd03-4b5b1a880b24,c67fab0a-704f-43ae-bd03-4b5b1a880b24,1,0,c1703a14-61a0-4461-8ad8-7173e2c431fe,c1703a14-61a0-4461-8ad8-7173e2c431fe,1,0,aecf5653-3005-43f2-ab49-40977e70f02b,aecf5653-3005-43f2-ab49-40977e70f02b,1,0,aae09896-3b22-4d7d-9059-e47660f8b88b,aae09896-3b22-4d7d-9059-e47660f8b88b,1,0,845530cd-36fb-44c3-b30a-730985c9ca2d,845530cd-36fb-44c3-b30a-730985c9ca2d,1,0,475f8577-a141-496b-94e1-53215c0dd017,475f8577-a141-496b-94e1-53215c0dd017,1,0,97638762-c01e-4c8f-88e2-b356e517e18f,97638762-c01e-4c8f-88e2-b356e517e18f,1,0,074e34f2-e9be-4bd3-beca-8b916772e2be,074e34f2-e9be-4bd3-beca-8b916772e2be,1,0,28fecf1b-7cab-4087-b66e-2052edb8ce3a,28fecf1b-7cab-4087-b66e-2052edb8ce3a,1,0,6527be82-a665-4f8a-818b-a35b96b3484b,6527be82-a665-4f8a-818b-a35b96b3484b,1,0,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,1,0,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,1,0,c79ba5a5-e6d9-4a3f-ab23-eca876607f7f,c79ba5a5-e6d9-4a3f-ab23-eca876607f7f,1,0,ce5549bd-ba99-4259-86a3-36521bad59f5,ce5549bd-ba99-4259-86a3-36521bad59f5,1,0,f5417147-4d2a-4e49-911b-2bb5eccb8441,f5417147-4d2a-4e49-911b-2bb5eccb8441,1,0,20fbed2b-4393-4de0-a71d-017a336bdac0,20fbed2b-4393-4de0-a71d-017a336bdac0,1,0,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,1,0,fbbb2449-9a07-4229-8ea5-bee0afab5f56,fbbb2449-9a07-4229-8ea5-bee0afab5f56,1,0,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,1,0,3f3f1b41-57a9-4a82-bdfa-89a6653479ab,3f3f1b41-57a9-4a82-bdfa-89a6653479ab,1,0,fd12fbe2-56a2-4c9e-a072-989d826a5ea3,fd12fbe2-56a2-4c9e-a072-989d826a5ea3,1,0,f38b6034-5246-42a7-8f3c-51eaf3e5399c,f38b6034-5246-42a7-8f3c-51eaf3e5399c,1,0,08552af7-3c44-42c6-94c5-63a2316127fc,08552af7-3c44-42c6-94c5-63a2316127fc,1,0,41f6f6d1-b7cf-4477-907b-ce69fc08c799,41f6f6d1-b7cf-4477-907b-ce69fc08c799,1,0,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,1,0,0d124daf-dc52-4391-a2d9-3c43a45c422c,0d124daf-dc52-4391-a2d9-3c43a45c422c,1,0,a300ecc3-8031-4a50-a17d-b08cf3a72139,a300ecc3-8031-4a50-a17d-b08cf3a72139,1,0,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,1,0,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,1,0,98153b59-8cc6-4dc7-b945-99c1146d07da,98153b59-8cc6-4dc7-b945-99c1146d07da,1,0,52f3e20c-1cf7-4284-a083-6539782f4bc3,52f3e20c-1cf7-4284-a083-6539782f4bc3,1,0,657b8663-713c-4a80-81e1-8c0166742a35,657b8663-713c-4a80-81e1-8c0166742a35,1,0,866438d1-1223-4768-9c96-e6cb12f1a4d5,866438d1-1223-4768-9c96-e6cb12f1a4d5,1,0,d416cc2a-425f-4c01-a550-5a755ed78cc8,d416cc2a-425f-4c01-a550-5a755ed78cc8,1,0,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,1,0,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,1,0,a890be6b-f050-4ea4-a388-570948ffd22b,a890be6b-f050-4ea4-a388-570948ffd22b,1,0,9039f720-5728-4918-87d5-8b2d07cabcfd,9039f720-5728-4918-87d5-8b2d07cabcfd,1,0,b00c31d6-4fc6-4189-9f72-f91742ec705f,b00c31d6-4fc6-4189-9f72-f91742ec705f,1,0,1333101b-82e8-41a9-a793-5af5dcd6f68a,1333101b-82e8-41a9-a793-5af5dcd6f68a,1,0,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,1,0,aaaa7d41-3399-41b5-b882-58af38121494,aaaa7d41-3399-41b5-b882-58af38121494,1,0,0f25646a-90f9-4747-a778-7efdaabc284c,0f25646a-90f9-4747-a778-7efdaabc284c,1,0,3705a086-46e6-4090-a52a-535908eea8a5,3705a086-46e6-4090-a52a-535908eea8a5,1,0,9b9cd161-5bee-4433-a0ec-b67deb099b5e,9b9cd161-5bee-4433-a0ec-b67deb099b5e,1,0,ca179cb5-65e1-4a55-bf12-096b926accb0,ca179cb5-65e1-4a55-bf12-096b926accb0,1,0,a6587758-f7af-4f85-81b4-4312c725824e,a6587758-f7af-4f85-81b4-4312c725824e,1,0,5d336d1e-24f9-404a-9671-3bcdc7c48a25,5d336d1e-24f9-404a-9671-3bcdc7c48a25,1,0,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,1,0,63470706-f14b-4733-87c2-d1173f5d7e7a,63470706-f14b-4733-87c2-d1173f5d7e7a,1,0,472ce1c2-9e83-418b-b1ec-e15e126bc919,472ce1c2-9e83-418b-b1ec-e15e126bc919,1,0,9fe30414-8261-4403-a854-f22b61824f69,9fe30414-8261-4403-a854-f22b61824f69,1,0,07bb26ac-bd97-465f-a192-db7fedbb579b,07bb26ac-bd97-465f-a192-db7fedbb579b,1,0,76cdcc51-0e6a-4f9c-a115-1864998c2add,76cdcc51-0e6a-4f9c-a115-1864998c2add,1,0,71c3e5d3-7504-433f-9d48-7c287b2b863b,71c3e5d3-7504-433f-9d48-7c287b2b863b,1,0,0894db61-51f6-4068-9634-e55d95e2a8ac,0894db61-51f6-4068-9634-e55d95e2a8ac,1,0,0d8c215d-1210-47a2-897d-a3257b9f849a,0d8c215d-1210-47a2-897d-a3257b9f849a,1,0,ea2e9a4e-eca1-4a6e-b7a6-8922a11334aa,ea2e9a4e-eca1-4a6e-b7a6-8922a11334aa,1,0,c971e0ba-53b8-4454-92f7-40b0d639058a,c971e0ba-53b8-4454-92f7-40b0d639058a,1,0,9d8496ea-fc0c-410d-994d-7480350d71d3,9d8496ea-fc0c-410d-994d-7480350d71d3,1,0,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,1,0,ed297409-6215-4fd4-b47d-a2247e0343da,ed297409-6215-4fd4-b47d-a2247e0343da,1,0,5b62e0d1-8dba-47db-8dbb-517ad935fa0d,5b62e0d1-8dba-47db-8dbb-517ad935fa0d,1,0,e7a63151-fc1a-4563-8768-26d854ab012b,e7a63151-fc1a-4563-8768-26d854ab012b,1,0,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,1,0,c54f31ce-114b-46d3-b4c6-12c8f07727ca,c54f31ce-114b-46d3-b4c6-12c8f07727ca,1,0,73c7750f-8291-4e19-8551-635cd6b94215,73c7750f-8291-4e19-8551-635cd6b94215,1,0,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,1,0,a1463001-f3d8-4064-95e4-cf49aedc2a8c,a1463001-f3d8-4064-95e4-cf49aedc2a8c,1,0,59855d19-29cd-4efd-a453-b19e574113ef,59855d19-29cd-4efd-a453-b19e574113ef,1,0,249b6436-bd44-4950-b118-7f40f7aaf794,249b6436-bd44-4950-b118-7f40f7aaf794,1,0,65dd4904-0837-4de5-a5e5-601151055d94,65dd4904-0837-4de5-a5e5-601151055d94,1,0,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,1,0,ce6d1259-af90-482b-b19a-405512321bd9,ce6d1259-af90-482b-b19a-405512321bd9,1,0,9b76ded4-814a-4267-99c5-2c8fb05ee352,9b76ded4-814a-4267-99c5-2c8fb05ee352,1,0,df48bfa3-5502-4a61-a79f-1dea043dac36,df48bfa3-5502-4a61-a79f-1dea043dac36,1,0,adee37e6-f087-422f-91b3-681f3d73189c,adee37e6-f087-422f-91b3-681f3d73189c,1,0,eb276904-cad7-4401-bb78-2d13946291f1,eb276904-cad7-4401-bb78-2d13946291f1,1,0,171a64b6-39d2-455f-b304-1c6ea8d85494,171a64b6-39d2-455f-b304-1c6ea8d85494,1,0,79ff04ac-4625-469b-916e-938f04de4dd2,79ff04ac-4625-469b-916e-938f04de4dd2,1,0,c5e9f987-4466-4161-8e36-278b0b3ce056,c5e9f987-4466-4161-8e36-278b0b3ce056,1,0,b6566d54-e821-4a2a-a447-0f533f35de91,b6566d54-e821-4a2a-a447-0f533f35de91,1,0,46568b9a-a765-4037-8a86-b184a570ab37,46568b9a-a765-4037-8a86-b184a570ab37,1,0,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,1,0,547a6dec-6fe8-439d-a8d9-ac2612af20d2,547a6dec-6fe8-439d-a8d9-ac2612af20d2,1,0,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,1,0,1e633034-6dcc-4564-9f40-348c32143314,1e633034-6dcc-4564-9f40-348c32143314,1,0,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,1,0,0b92cced-d818-400c-82b6-7726e912a478,0b92cced-d818-400c-82b6-7726e912a478,1,0,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,1,0,d8621f68-106e-4058-963f-56010491ae2e,d8621f68-106e-4058-963f-56010491ae2e,1,0,4766c40e-6330-4c1d-a64f-0c8c672886a4,4766c40e-6330-4c1d-a64f-0c8c672886a4,1,0,1f3057c2-135f-44b2-9f86-34481fbc5596,1f3057c2-135f-44b2-9f86-34481fbc5596,1,0,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,1,0,f2e2df50-52fc-4e95-909b-80fc91a68f62,f2e2df50-52fc-4e95-909b-80fc91a68f62,1,0,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1,0,7a944c45-9b3d-411f-b2ef-de3c896092bb,7a944c45-9b3d-411f-b2ef-de3c896092bb,1,0,d2762764-b5c0-4aeb-8e89-3371972f22d8,d2762764-b5c0-4aeb-8e89-3371972f22d8,1,0,54f3902b-f29a-4f04-8c9d-68c318fcd076,54f3902b-f29a-4f04-8c9d-68c318fcd076,1,0,573f1753-9194-4aaf-9217-5cac70ff108f,573f1753-9194-4aaf-9217-5cac70ff108f,1,0,323997ca-488d-4d84-aa44-da60b6b4d414,323997ca-488d-4d84-aa44-da60b6b4d414,1,0,50d3e00e-1a83-4bd5-91db-0561560caf42,50d3e00e-1a83-4bd5-91db-0561560caf42,1,0,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1,0,c8ba4901-7f70-4353-b039-d75f1cb3f5b7,c8ba4901-7f70-4353-b039-d75f1cb3f5b7,1,0,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,1,0,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,1,0,44afff59-0590-4929-93b8-7b49735f21b5,44afff59-0590-4929-93b8-7b49735f21b5,1,0,905624ea-b253-413f-b651-1eb2c5a7d52a,905624ea-b253-413f-b651-1eb2c5a7d52a,1,0,b639ed30-3e37-4c65-a39f-00fe735950eb,b639ed30-3e37-4c65-a39f-00fe735950eb,1,0,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,1,0,f137eb0f-bde7-412d-9229-d7a4f9456e6c,f137eb0f-bde7-412d-9229-d7a4f9456e6c,1,0,90880131-8065-4a7e-a0fa-ecff9e27363c,90880131-8065-4a7e-a0fa-ecff9e27363c,1,0,57e9fcea-342c-4089-bd10-befb3faf0dbd,57e9fcea-342c-4089-bd10-befb3faf0dbd,1,0,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,1,0,51a0444d-13c8-45a8-97f6-f3f976964bf8,51a0444d-13c8-45a8-97f6-f3f976964bf8,1,0,9892f922-8745-4164-a200-94b5edc1ea0a,9892f922-8745-4164-a200-94b5edc1ea0a,1,0,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,1,0,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,1,0,2b1619a6-c841-4963-8c51-c1d8d6ba3746,2b1619a6-c841-4963-8c51-c1d8d6ba3746,1,0,eab50f82-4612-47fd-a5c2-9678016a1937,eab50f82-4612-47fd-a5c2-9678016a1937,1,0,2609ba3c-e4de-45b3-86e0-93db39a21eee,2609ba3c-e4de-45b3-86e0-93db39a21eee,1,0,00dcfeab-7ba1-4a50-996e-4fd693dd0514,00dcfeab-7ba1-4a50-996e-4fd693dd0514,1,0,d21971c9-9aa6-448a-ab37-49ad0b0547ec,d21971c9-9aa6-448a-ab37-49ad0b0547ec,1,0,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,1,0,3e4361e9-2baf-407b-9320-b2a265b44e46,3e4361e9-2baf-407b-9320-b2a265b44e46,1,0,a5902ed4-a8f1-460e-aced-0094b2c384a3,a5902ed4-a8f1-460e-aced-0094b2c384a3,1,0,00418e6c-77b2-4753-b9ff-3a8013436f8a,00418e6c-77b2-4753-b9ff-3a8013436f8a,1,0,e2c76c41-4c47-4588-a081-7bd81ac1698b,e2c76c41-4c47-4588-a081-7bd81ac1698b,1,0,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,1,0,26986f8d-d56d-4641-9184-2632d0881cca,26986f8d-d56d-4641-9184-2632d0881cca,1,0,92bec607-7217-42f6-8eb9-ace759672336,92bec607-7217-42f6-8eb9-ace759672336,1,0,144676de-f369-49f1-bb21-d60e073936df,144676de-f369-49f1-bb21-d60e073936df,1,0,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,1,0,4d660fec-4a76-470e-bba9-3d031941b289,4d660fec-4a76-470e-bba9-3d031941b289,1,0,38bf6d3b-5435-4bac-b9fc-23b80afeb760,38bf6d3b-5435-4bac-b9fc-23b80afeb760,1,0,644cf757-bff9-4e2e-b72b-1e736c42d4c3,644cf757-bff9-4e2e-b72b-1e736c42d4c3,1,0,a3c9a7eb-2104-4402-954c-3e12de4a7de3,a3c9a7eb-2104-4402-954c-3e12de4a7de3,1,0,a2a51b70-9570-4f53-9d30-e9a9b099a475,a2a51b70-9570-4f53-9d30-e9a9b099a475,1,0,556a0e57-5b3b-4303-a013-0bd296c506b8,556a0e57-5b3b-4303-a013-0bd296c506b8,1,0,fabbac92-cb98-4087-b3fa-387482ed0d86,fabbac92-cb98-4087-b3fa-387482ed0d86,1,0,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,1,0,fdcbe67c-55fb-444d-bed8-cee956ca3530,fdcbe67c-55fb-444d-bed8-cee956ca3530,1,0,e09534e3-ac6e-42a6-86e8-564acb20089a,e09534e3-ac6e-42a6-86e8-564acb20089a,1,0,5e380276-2a08-435c-927e-a7f56f5a4dbc,5e380276-2a08-435c-927e-a7f56f5a4dbc,1,0,6ff5b3cb-efff-430d-bf0a-957405f116ca,6ff5b3cb-efff-430d-bf0a-957405f116ca,1,0,d06e845a-9f54-40dd-b0df-6988def62017,d06e845a-9f54-40dd-b0df-6988def62017,1,0,63223883-06cf-4d01-be95-5e410cc58a22,63223883-06cf-4d01-be95-5e410cc58a22,1,0,1929139f-dabb-4c40-9423-158093360889,1929139f-dabb-4c40-9423-158093360889,1,0,dad92df4-685b-4260-b35f-4d031262dfea,dad92df4-685b-4260-b35f-4d031262dfea,1,0,4399c19a-ddba-42e9-88b4-c5c28abad237,4399c19a-ddba-42e9-88b4-c5c28abad237,1,0,982315ba-df74-4a31-8929-71d1e5e6f147,982315ba-df74-4a31-8929-71d1e5e6f147,1,0,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,1,0,b8b267e3-75af-4140-b515-d99e8e748e84,b8b267e3-75af-4140-b515-d99e8e748e84,1,0,8014684f-e1f1-4163-9083-459a009c0aac,8014684f-e1f1-4163-9083-459a009c0aac,1,0,ff976027-75e8-475c-abfa-876d36733c13,ff976027-75e8-475c-abfa-876d36733c13,1,0,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,1,0,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,1,0,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,1,0,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,1,0,c0218ef0-4aa1-4ff1-963b-e6ab1001ae9e,c0218ef0-4aa1-4ff1-963b-e6ab1001ae9e,1,0,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,1,0,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,1,0,62d4d073-80df-41e6-a915-43a4f5575206,62d4d073-80df-41e6-a915-43a4f5575206,1,0,145ecede-baae-4725-832a-5387794922ed,145ecede-baae-4725-832a-5387794922ed,1,0,540be4e1-6eae-48e2-a645-8bd0a1259c65,540be4e1-6eae-48e2-a645-8bd0a1259c65,1,0,f772abd3-8ea0-41e9-aaca-c5375778941a,f772abd3-8ea0-41e9-aaca-c5375778941a,1,0,a1e494f8-96a4-41bd-9234-b87e8d8742c5,a1e494f8-96a4-41bd-9234-b87e8d8742c5,1,0,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,1,0,35bc58df-8aff-48dd-83a9-b60b0461f94d,35bc58df-8aff-48dd-83a9-b60b0461f94d,1,0,b322b047-16eb-4500-826a-6dfebb7d997a,b322b047-16eb-4500-826a-6dfebb7d997a,1,0,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,1,0,83ead93b-4ff6-487d-934e-25088944fccc,83ead93b-4ff6-487d-934e-25088944fccc,1,0,764c76cc-0473-4633-868d-02f96aa43c10,764c76cc-0473-4633-868d-02f96aa43c10,1,0,c8da922f-e31e-49b0-b90e-1c060424bde5,c8da922f-e31e-49b0-b90e-1c060424bde5,1,0,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,1,0,eca025d2-4fe9-4542-b9f5-46ae2631256e,eca025d2-4fe9-4542-b9f5-46ae2631256e,1,0,9416a741-5106-454e-b953-81f3d99d5e71,9416a741-5106-454e-b953-81f3d99d5e71,1,0,30f6aedf-946f-400c-822d-5fa375b8fb1d,30f6aedf-946f-400c-822d-5fa375b8fb1d,1,0,46e313f7-54da-4884-89e8-cdba6ae30d30,46e313f7-54da-4884-89e8-cdba6ae30d30,1,0,feb1a5c1-c805-4079-8f05-8a44f51b0b02,feb1a5c1-c805-4079-8f05-8a44f51b0b02,1,0,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,1,0,1f55f330-7c0a-4a29-905f-51d664515bc5,1f55f330-7c0a-4a29-905f-51d664515bc5,1,0,6106e958-354c-4211-992c-3c3819e8828e,6106e958-354c-4211-992c-3c3819e8828e,1,0,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,1,0,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,1,0,2cd04d4c-2619-40c9-adf4-7bb281f045b6,2cd04d4c-2619-40c9-adf4-7bb281f045b6,1,0,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1,0,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,1,0,231d3950-f363-4e63-83cd-8ddb81507c27,231d3950-f363-4e63-83cd-8ddb81507c27,1,0,87429f11-bf95-4013-bf13-da904570f88d,87429f11-bf95-4013-bf13-da904570f88d,1,0,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,1,0,feb41347-62db-41cf-ace0-d8b9de361af3,feb41347-62db-41cf-ace0-d8b9de361af3,1,0,5a088468-4065-4e0c-9b84-1162de8d3fdd,5a088468-4065-4e0c-9b84-1162de8d3fdd,1,0,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,1,0,f3ae1a2c-e0ca-461b-ba5a-76a6423c6325,f3ae1a2c-e0ca-461b-ba5a-76a6423c6325,1,0,b233d29c-3979-4ef6-b7f0-89ca88f65e82,b233d29c-3979-4ef6-b7f0-89ca88f65e82,1,0,684ca876-644e-43f5-b96a-1561fb5b1935,684ca876-644e-43f5-b96a-1561fb5b1935,1,0,5f91b00f-d8fc-4d63-8486-66339357ab22,5f91b00f-d8fc-4d63-8486-66339357ab22,1,0,16d44ab1-4bce-4df8-a215-6ed5173c75a8,16d44ab1-4bce-4df8-a215-6ed5173c75a8,1,0,86a9d7ab-7a96-4c58-8073-ca4b2b99cceb,86a9d7ab-7a96-4c58-8073-ca4b2b99cceb,1,0,1ae1a239-0d88-4467-af33-32bcfe6cf61d,1ae1a239-0d88-4467-af33-32bcfe6cf61d,1,0,375977c1-5745-4e78-a4df-cef966c0ccf8,375977c1-5745-4e78-a4df-cef966c0ccf8,1,0,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,1,0,c3796d85-2a24-43c4-9673-64e56249a1d0,c3796d85-2a24-43c4-9673-64e56249a1d0,1,0,fc1066b5-20d4-4c73-85f8-9889e554d6e1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,1,0,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,1,0,731211c2-ef90-4883-9525-83cd91b742ac,731211c2-ef90-4883-9525-83cd91b742ac,1,0,0adf02da-940a-4bfc-afa5-59605494a169,0adf02da-940a-4bfc-afa5-59605494a169,1,0,8361991a-0f30-4a03-9a4c-90556b744f53,8361991a-0f30-4a03-9a4c-90556b744f53,1,0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,1,0,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,1,0,259cb8f5-9e78-4b2f-941b-ccb4b1112c8b,259cb8f5-9e78-4b2f-941b-ccb4b1112c8b,1,0,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,1,0,73c1a829-0191-486b-97a0-7f333c6f8011,73c1a829-0191-486b-97a0-7f333c6f8011,1,0,db28f23f-a771-46c0-96e8-5e4389b28b8b,db28f23f-a771-46c0-96e8-5e4389b28b8b,1,0,5504f5d1-35d8-4a47-a0e1-003fe00395c1,5504f5d1-35d8-4a47-a0e1-003fe00395c1,1,0,56242b05-d722-4d4a-82d9-517e0e169d0b,56242b05-d722-4d4a-82d9-517e0e169d0b,1,0,f9196766-4ae2-4a73-bed6-4a8838323e02,f9196766-4ae2-4a73-bed6-4a8838323e02,1,0,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,1,0,50a1e3bf-8624-4474-854e-21b89aaf97ed,50a1e3bf-8624-4474-854e-21b89aaf97ed,1,0,503b3eab-b7f1-4ede-8845-3290a834cec7,503b3eab-b7f1-4ede-8845-3290a834cec7,1,0,847b97a3-d0bc-45e2-b06c-932bb22d8eca,847b97a3-d0bc-45e2-b06c-932bb22d8eca,1,0,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,1,0,3116fa60-bc42-4dea-aa03-387896168690,3116fa60-bc42-4dea-aa03-387896168690,1,0,ca797560-8802-4bdc-b21f-7a7fd795beae,ca797560-8802-4bdc-b21f-7a7fd795beae,1,0,3df19dbf-efe7-4e31-99ad-fafb59ec1329,3df19dbf-efe7-4e31-99ad-fafb59ec1329,1,0,baf12d47-fbfe-4563-aa23-26d9f7e83169,baf12d47-fbfe-4563-aa23-26d9f7e83169,1,0,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,1,0,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0ba11486-1972-4434-ab1a-5bb75cc05e9f,1,0,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,1,0,c1c62215-41b8-40bc-a806-1347db5b03e9,c1c62215-41b8-40bc-a806-1347db5b03e9,1,0,a24322f3-c7a5-4b25-bad6-9c75712a3e58,a24322f3-c7a5-4b25-bad6-9c75712a3e58,1,0,679d2b3b-a354-4dec-b49d-ab1163756e3a,679d2b3b-a354-4dec-b49d-ab1163756e3a,1,0,665e96bc-8ec1-4008-b9bd-db95a234b9b8,665e96bc-8ec1-4008-b9bd-db95a234b9b8,1,0,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,1,0,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,1,0,9bf55587-1ffe-42bc-b8e8-3f956956f689,9bf55587-1ffe-42bc-b8e8-3f956956f689,1,0,2f67931e-543f-457e-80fd-78ca754e2e9c,2f67931e-543f-457e-80fd-78ca754e2e9c,1,0,595e5752-36a7-4bba-8a40-26920acae01d,595e5752-36a7-4bba-8a40-26920acae01d,1,0,28801fba-c429-4afa-bdcd-b3ec3ec22fda,28801fba-c429-4afa-bdcd-b3ec3ec22fda,1,0,d1a873ae-d45b-4600-9419-e701dce3da02,d1a873ae-d45b-4600-9419-e701dce3da02,1,0,e3a31f0d-a98f-43c6-bc39-087095ae8c39,e3a31f0d-a98f-43c6-bc39-087095ae8c39,1,0,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,1,0,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,1,0,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,1,0,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,1,0,73d8b319-9bea-4638-a602-23c12f37c227,73d8b319-9bea-4638-a602-23c12f37c227,1,0,a43e9de0-2921-4c58-a5f8-7446258be967,a43e9de0-2921-4c58-a5f8-7446258be967,1,0,307656e3-df7f-46e7-946c-bbd439265c95,307656e3-df7f-46e7-946c-bbd439265c95,1,0,eb3dfdc7-58b8-4b1f-b079-368c262364c9,eb3dfdc7-58b8-4b1f-b079-368c262364c9,1,0,5030a318-f8f7-4ec7-80d6-6eee0772562f,5030a318-f8f7-4ec7-80d6-6eee0772562f,1,0,242e911d-e49c-4b8a-8543-cc2e079220fd,242e911d-e49c-4b8a-8543-cc2e079220fd,1,0,9ea39d31-3775-4fb8-a3f3-202e54354d49,9ea39d31-3775-4fb8-a3f3-202e54354d49,1,0,73044e20-148c-46e9-b5b5-973c91de0d61,73044e20-148c-46e9-b5b5-973c91de0d61,1,0,f8ab477c-8e78-48c0-9f99-27748b109706,f8ab477c-8e78-48c0-9f99-27748b109706,1,0,24cff6c8-6c20-4383-b97c-6afa52738960,24cff6c8-6c20-4383-b97c-6afa52738960,1,0,462e2694-750d-49ef-93ac-17a7779be68d,462e2694-750d-49ef-93ac-17a7779be68d,1,0,c24ff02e-5afc-45df-81cf-64ea2b261c2d,c24ff02e-5afc-45df-81cf-64ea2b261c2d,1,0,2d51aae9-650d-4719-a94d-2609b69a2d36,2d51aae9-650d-4719-a94d-2609b69a2d36,1,0,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,1,0,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,1,0,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,1,0,85639a53-b367-49ce-84f2-4e21d81c489b,85639a53-b367-49ce-84f2-4e21d81c489b,1,0,24b59586-178e-4efc-90ae-529553f3bb6c,24b59586-178e-4efc-90ae-529553f3bb6c,1,0,20e75dd5-222a-4100-aa43-3684991e3f21,20e75dd5-222a-4100-aa43-3684991e3f21,1,0,3c611832-4bc2-4229-a27d-d5dc82f3a498,3c611832-4bc2-4229-a27d-d5dc82f3a498,1,0,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,1,0,5dadc422-1fbd-4918-9db3-09ec72c3404e,5dadc422-1fbd-4918-9db3-09ec72c3404e,1,0,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,1,0,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,1,0,c5478d09-c8d3-4cc6-878e-27656ecc8409,c5478d09-c8d3-4cc6-878e-27656ecc8409,1,0,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,1,0,75974146-5b1a-412c-b7d5-1575704bbdab,75974146-5b1a-412c-b7d5-1575704bbdab,1,0,949f87cb-258c-4b6b-95ee-8a7491a4b64e,949f87cb-258c-4b6b-95ee-8a7491a4b64e,1,0,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,1,0,5c089988-5381-41ed-9f05-f85db46b8d94,5c089988-5381-41ed-9f05-f85db46b8d94,1,0,85a36352-1569-4ce4-aeba-477db524c36d,85a36352-1569-4ce4-aeba-477db524c36d,1,0,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,1,0,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,1,0,dd383422-dddb-4a81-9326-015fd345b5c1,dd383422-dddb-4a81-9326-015fd345b5c1,1,0,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,1,0,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,1,0,aa299fc6-051f-487c-ada4-451e08c4763c,aa299fc6-051f-487c-ada4-451e08c4763c,1,0,782cb93d-36e6-4923-b2b6-75caa3459cd6,782cb93d-36e6-4923-b2b6-75caa3459cd6,1,0,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,1,0,322645d4-e3fb-467b-a55d-d8e74cff2ea3,322645d4-e3fb-467b-a55d-d8e74cff2ea3,1,0,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,1,0,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,1,0,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,1,0,64ff6058-c6f3-4682-b9a1-11ec438fa447,64ff6058-c6f3-4682-b9a1-11ec438fa447,1,0,ced01234-9417-49ce-adf0-8cdd15e6dd7d,ced01234-9417-49ce-adf0-8cdd15e6dd7d,1,0,c1272bfc-196a-4f99-935f-e2516bc138d2,c1272bfc-196a-4f99-935f-e2516bc138d2,1,0,313e0688-745a-4385-b040-7ef8317a0eb7,313e0688-745a-4385-b040-7ef8317a0eb7,1,0,7fe61c5d-30bc-440d-9e40-12ff3b296616,7fe61c5d-30bc-440d-9e40-12ff3b296616,1,0,37c37f15-f84b-456b-aab6-729562dc0908,37c37f15-f84b-456b-aab6-729562dc0908,1,0,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,1,0,996c7873-1cc9-44f6-915b-5c6ed7ef2370,996c7873-1cc9-44f6-915b-5c6ed7ef2370,1,0,8dc08932-0988-4e82-8a5f-385c0694f9ff,8dc08932-0988-4e82-8a5f-385c0694f9ff,1,0,13dee5d8-f165-48de-9ccb-3ef0239f4b27,13dee5d8-f165-48de-9ccb-3ef0239f4b27,1,0,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,1,0,8a13c899-1659-48cf-9aa2-07ca99547b7b,8a13c899-1659-48cf-9aa2-07ca99547b7b,1,0,eb3f959c-94a4-4e77-b9f9-e81954254079,eb3f959c-94a4-4e77-b9f9-e81954254079,1,0,71dfde27-3762-4dd0-9252-6e703ce1b101,71dfde27-3762-4dd0-9252-6e703ce1b101,1,0,d8fc4644-5351-443c-8b5d-5de2c4b855d1,d8fc4644-5351-443c-8b5d-5de2c4b855d1,1,0,0f039952-09d3-49c8-b909-e8333a3fc8f9,0f039952-09d3-49c8-b909-e8333a3fc8f9,1,0,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,1,0,8363bd46-1ea5-44f0-858a-05bc03f6020e,8363bd46-1ea5-44f0-858a-05bc03f6020e,1,0,a321b6db-391b-4c65-8d27-ce486d10055e,a321b6db-391b-4c65-8d27-ce486d10055e,1,0,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,1,0,99387869-f8b1-4269-bd26-e39380d17b69,99387869-f8b1-4269-bd26-e39380d17b69,1,0,4b2acdb9-fefd-4735-9dfd-d7d141967f3c,4b2acdb9-fefd-4735-9dfd-d7d141967f3c,1,0,bc07d643-a044-4882-b95b-2173a197fd0e,bc07d643-a044-4882-b95b-2173a197fd0e,1,0,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,1,0,7974e41d-5af3-4636-b405-c9405d89fb53,7974e41d-5af3-4636-b405-c9405d89fb53,1,0,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,1,0,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,1,0,826c2821-147d-4aaf-910c-acfbdb58a29f,826c2821-147d-4aaf-910c-acfbdb58a29f,1,0,36d6b0e1-5e10-408a-8eb1-09839e57690f,36d6b0e1-5e10-408a-8eb1-09839e57690f,1,0,6423b849-7ca4-4501-8856-445157d7e5df,6423b849-7ca4-4501-8856-445157d7e5df,1,0,0819e2b0-1eb0-41b3-ab89-0974bd926fb6,0819e2b0-1eb0-41b3-ab89-0974bd926fb6,1,0,e814287f-1c13-4f74-9507-d22a62394fd2,e814287f-1c13-4f74-9507-d22a62394fd2,1,0,417ac987-7369-45af-b670-fdffb048f33d,417ac987-7369-45af-b670-fdffb048f33d,1,0,640a5d72-dbc7-421b-afdb-cc3a4622ae04,640a5d72-dbc7-421b-afdb-cc3a4622ae04,1,0,79da84c1-5ac2-4472-8eb9-f0484b9582c2,79da84c1-5ac2-4472-8eb9-f0484b9582c2,1,0,2d0b161b-7d69-4ec4-a483-79bd458cb62c,2d0b161b-7d69-4ec4-a483-79bd458cb62c,1,0,f178bc1b-ebea-4fa9-8861-fe0d91f103e4,f178bc1b-ebea-4fa9-8861-fe0d91f103e4,1,0,e33a9c94-7e98-4b38-ba20-4546a90b2937,e33a9c94-7e98-4b38-ba20-4546a90b2937,1,0,1610e73c-58df-41cc-8349-51b920806821,1610e73c-58df-41cc-8349-51b920806821,1,0,ae37f465-1ee5-4f06-a834-deea9e9e0eb3,ae37f465-1ee5-4f06-a834-deea9e9e0eb3,1,0,c6ccf82f-f130-4037-9e89-1e0365b996a4,c6ccf82f-f130-4037-9e89-1e0365b996a4,1,0,c532963e-0d92-44b9-9cfc-43ed2744ccf9,c532963e-0d92-44b9-9cfc-43ed2744ccf9,1,0,6aff2855-24d4-4f90-b617-53326efdd1bd,6aff2855-24d4-4f90-b617-53326efdd1bd,1,0,0107a9c7-4c85-49c4-918a-925d85d57a0b,0107a9c7-4c85-49c4-918a-925d85d57a0b,1,0,6e1efa55-969b-4c2b-8af2-b11d672db5f0,6e1efa55-969b-4c2b-8af2-b11d672db5f0,1,0,e5b578a1-e33b-4d49-8064-427aa928a844,e5b578a1-e33b-4d49-8064-427aa928a844,1,0,f74e97ad-fef6-4122-a056-86f2d59dfdaf,f74e97ad-fef6-4122-a056-86f2d59dfdaf,1,0,df1ef691-1e86-4a80-8671-53b3d4504bfb,df1ef691-1e86-4a80-8671-53b3d4504bfb,1,0,474b9918-23da-4289-91a9-9115526c9b5d,474b9918-23da-4289-91a9-9115526c9b5d,1,0,1cf7be60-fd84-430d-b1b5-5619c51b8b3f,1cf7be60-fd84-430d-b1b5-5619c51b8b3f,1,0,60aa9d44-5986-490e-8093-f65e194b3607,60aa9d44-5986-490e-8093-f65e194b3607,1,0,a36dee5e-7184-4caf-bf46-3977b165093b,a36dee5e-7184-4caf-bf46-3977b165093b,1,0,aa3c61a7-c905-4b5a-a44d-e2ac5d79158a,aa3c61a7-c905-4b5a-a44d-e2ac5d79158a,1,0,182916b2-972b-4e39-93ba-d45aa7a195f5,182916b2-972b-4e39-93ba-d45aa7a195f5,1,0,2b654a53-7ce8-421f-aaf5-aa1451d91415,2b654a53-7ce8-421f-aaf5-aa1451d91415,1,0,30e55306-ea5c-4ef4-9903-ea030afa3d85,30e55306-ea5c-4ef4-9903-ea030afa3d85,1,0,234c1a72-8349-472a-8373-2a25ce6252f2,234c1a72-8349-472a-8373-2a25ce6252f2,1,0,b1ccb9f7-11ff-4ad2-8806-d64de84662f0,b1ccb9f7-11ff-4ad2-8806-d64de84662f0,1,0,539e0db9-be24-4086-9632-af20553ee50f,539e0db9-be24-4086-9632-af20553ee50f,1,0,862e2759-5311-4c68-8977-86133bcf8c0e,862e2759-5311-4c68-8977-86133bcf8c0e,1,0,b9adeb51-a009-4e83-85f8-bfa1547429d6,b9adeb51-a009-4e83-85f8-bfa1547429d6,1,0,ac9f4c2e-316b-4f96-8fe6-fb5a5a7e48ed,ac9f4c2e-316b-4f96-8fe6-fb5a5a7e48ed,1,0,da808c0e-b1b0-4d46-8c63-2bbe7d0dca9d,da808c0e-b1b0-4d46-8c63-2bbe7d0dca9d,1,0,b848d70a-9d08-4b1a-8df1-17697432516d,b848d70a-9d08-4b1a-8df1-17697432516d,1,0,9a30b92d-0c5b-4e11-a741-2b6efa8ac229,9a30b92d-0c5b-4e11-a741-2b6efa8ac229,1,0,92876c9e-52ff-480d-9878-5766f4f9d12c,92876c9e-52ff-480d-9878-5766f4f9d12c,1,0,b729d739-5249-4765-85ee-fd792bb22911,b729d739-5249-4765-85ee-fd792bb22911,1,0,d65c4485-7bac-4206-9a6c-7156f4bb876d,d65c4485-7bac-4206-9a6c-7156f4bb876d,1,0,d431d1e2-13dc-495c-9de1-b5ec872eceed,d431d1e2-13dc-495c-9de1-b5ec872eceed,1,0,e8bec681-d269-41ba-9184-556cbcc27d74,e8bec681-d269-41ba-9184-556cbcc27d74,1,0,b8aaef91-f72c-4127-a494-771c13694ca4,b8aaef91-f72c-4127-a494-771c13694ca4,1,0,433a114f-3198-4ef6-bbf8-ce9b54fdb736,433a114f-3198-4ef6-bbf8-ce9b54fdb736,1,0,02ac711c-e38e-422e-ac28-ba1b298df9cc,02ac711c-e38e-422e-ac28-ba1b298df9cc,1,0,3e090261-4aa2-4ece-9f77-62df83c890b3,3e090261-4aa2-4ece-9f77-62df83c890b3,1,0,9292034c-24e8-49a7-9b77-7974e117847d,9292034c-24e8-49a7-9b77-7974e117847d,1,0,3327b7d4-62fc-44cc-83b4-c449bfa4e706,3327b7d4-62fc-44cc-83b4-c449bfa4e706,1,0,43ecee25-68eb-48cf-bbaa-aee71052438f,43ecee25-68eb-48cf-bbaa-aee71052438f,1,0,93799f8b-0188-4546-8815-35e733bcc2b1,93799f8b-0188-4546-8815-35e733bcc2b1,1,0,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,1,0,c9ea4e72-5f01-42ae-88e3-52e49757b26f,c9ea4e72-5f01-42ae-88e3-52e49757b26f,1,0,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,1,0,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0f564dbe-6a6e-48df-9718-5cea5d608ee6,1,0,a623fef1-96eb-41ba-93fe-09162698f419,a623fef1-96eb-41ba-93fe-09162698f419,1,0,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,1,0,d8e1f92f-9efa-422d-bb21-43bd1a363cec,d8e1f92f-9efa-422d-bb21-43bd1a363cec,1,0,c1416383-bd7e-4dc4-ad88-d98ac87157fd,c1416383-bd7e-4dc4-ad88-d98ac87157fd,1,0,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,1,0,d5d9976a-4cc0-43f7-afd6-d43cebb07940,d5d9976a-4cc0-43f7-afd6-d43cebb07940,1,0,899f1526-d6bc-42ef-852e-7297a06db9e3,899f1526-d6bc-42ef-852e-7297a06db9e3,1,0,1b4feda1-e555-4b85-b236-b21153a7246f,1b4feda1-e555-4b85-b236-b21153a7246f,1,0,61d3cef4-2c42-417d-a762-a2d2f5a28924,61d3cef4-2c42-417d-a762-a2d2f5a28924,1,0,c694c132-1ddb-4273-818a-d3cca88c082a,c694c132-1ddb-4273-818a-d3cca88c082a,1,0,cd4da06e-c06b-4233-befc-1bc4c4db58e3,cd4da06e-c06b-4233-befc-1bc4c4db58e3,1,0,918a01fe-f753-4a4a-9200-55bbd6edaf5f,918a01fe-f753-4a4a-9200-55bbd6edaf5f,1,0,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,1,0,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,1,0,7ab6acda-6732-4582-8092-d43f9a98a28d,7ab6acda-6732-4582-8092-d43f9a98a28d,1,0,5ab1d405-bfc3-4440-8cdd-3a63013b064d,5ab1d405-bfc3-4440-8cdd-3a63013b064d,1,0,d6704410-6297-481e-a6cb-6d6aa566b4f8,d6704410-6297-481e-a6cb-6d6aa566b4f8,1,0,398937ca-b035-43bd-b0da-8c5153a87cb8,398937ca-b035-43bd-b0da-8c5153a87cb8,1,0,5b441321-bd1e-4c56-8f09-365b05985eed,5b441321-bd1e-4c56-8f09-365b05985eed,1,0,6bcba052-4d81-409d-b1a2-eed6be6fb024,6bcba052-4d81-409d-b1a2-eed6be6fb024,1,0,559f1e66-e8da-437a-aa27-d0e1be6619b6,559f1e66-e8da-437a-aa27-d0e1be6619b6,1,0,704d69cd-d921-4957-a004-43bd7eb4d979,704d69cd-d921-4957-a004-43bd7eb4d979,1,0,f1594682-16ac-408c-8307-a7a8db79b09f,f1594682-16ac-408c-8307-a7a8db79b09f,1,0,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,1,0,4cb814d8-cb1b-4366-b500-e820ad526b0c,4cb814d8-cb1b-4366-b500-e820ad526b0c,1,0,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,1,0,6c43df9f-ca36-415b-afec-302807820d73,6c43df9f-ca36-415b-afec-302807820d73,1,0,c7fb7551-806a-40b2-8879-14cd897b60d8,c7fb7551-806a-40b2-8879-14cd897b60d8,1,0,68337023-d573-4d04-95b6-44f73258c2a4,68337023-d573-4d04-95b6-44f73258c2a4,1,0,7cf39337-b722-486f-8e37-a62239d0ccd2,7cf39337-b722-486f-8e37-a62239d0ccd2,1,0,2571cfaf-d876-4385-a60a-1488aacf7080,2571cfaf-d876-4385-a60a-1488aacf7080,1,0,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,1,0,44398566-3189-4584-8f8a-9deb1d07ce41,44398566-3189-4584-8f8a-9deb1d07ce41,1,0,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,1,0,accfa63a-479d-4996-95bc-cdf5acdf203c,accfa63a-479d-4996-95bc-cdf5acdf203c,1,0,351998e0-8939-4dd4-a833-f4756bcc53b8,351998e0-8939-4dd4-a833-f4756bcc53b8,1,0,093332f5-3eb4-478c-ac95-59dcdc96765a,093332f5-3eb4-478c-ac95-59dcdc96765a,1,0,cd69bad8-524e-4be4-88cc-7732a88b38b8,cd69bad8-524e-4be4-88cc-7732a88b38b8,1,0,0a32248c-6994-4988-90d1-30882bc9da6b,0a32248c-6994-4988-90d1-30882bc9da6b,1,0,b57b53cb-6972-4bda-ae46-96571be1ebec,b57b53cb-6972-4bda-ae46-96571be1ebec,1,0,1a1a9636-fb72-4e4a-af96-5858442b1e61,1a1a9636-fb72-4e4a-af96-5858442b1e61,1,0,bca9cf34-9e11-4014-976a-28c4330b136e,bca9cf34-9e11-4014-976a-28c4330b136e,1,0,65fffe1a-6f36-4f50-975f-4471ad29d3ec,65fffe1a-6f36-4f50-975f-4471ad29d3ec,1,0,8fe5dad5-686a-4631-ae05-2917c33f7d83,8fe5dad5-686a-4631-ae05-2917c33f7d83,1,0,edef86c6-73bf-4e47-b62d-b2b548a732cd,edef86c6-73bf-4e47-b62d-b2b548a732cd,1,0,a1715044-d76f-4238-ba3e-989d04078d83,a1715044-d76f-4238-ba3e-989d04078d83,1,0,e72e59c0-391d-497e-9407-063e0edf573e,e72e59c0-391d-497e-9407-063e0edf573e,1,0,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,1,0,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,1,0,299c47a7-0b30-4f62-8f5c-f087ad6411fb,299c47a7-0b30-4f62-8f5c-f087ad6411fb,1,0,4d4724df-24fb-4c59-9d04-3f984906214a,4d4724df-24fb-4c59-9d04-3f984906214a,1,0,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,1,0,cb9b73ee-8531-48d9-9266-9aaa4336a612,cb9b73ee-8531-48d9-9266-9aaa4336a612,1,0,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,1,0,d042687f-0725-4611-a868-f5b4f6a3a3a8,d042687f-0725-4611-a868-f5b4f6a3a3a8,1,0,bb143340-7fff-49ef-b121-355c96613f78,bb143340-7fff-49ef-b121-355c96613f78,1,0,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,1,0,f2f69644-80dc-4b5e-a208-ed1de131e25e,f2f69644-80dc-4b5e-a208-ed1de131e25e,1,0,73060f72-6d08-47da-aac8-d4d2ed8f871c,73060f72-6d08-47da-aac8-d4d2ed8f871c,1,0,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,1,0,13b27ec3-2be9-4959-92e5-94ba7bb64f03,13b27ec3-2be9-4959-92e5-94ba7bb64f03,1,0,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,1,0,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,1,0,821225ea-1bad-49a6-a422-80d8a09baf13,821225ea-1bad-49a6-a422-80d8a09baf13,1,0,d0106f3a-8490-4277-a278-75c318ec252c,d0106f3a-8490-4277-a278-75c318ec252c,1,0,5035aa55-d557-419a-89e2-10ed0f8d109b,5035aa55-d557-419a-89e2-10ed0f8d109b,1,0,5f93d2af-64ff-41cc-8403-4a0e83160fea,5f93d2af-64ff-41cc-8403-4a0e83160fea,1,0,c12c90e4-7c40-489b-b14b-6b9442016e0f,c12c90e4-7c40-489b-b14b-6b9442016e0f,1,0,6371e288-3502-4d66-9006-b5a36107c0b7,6371e288-3502-4d66-9006-b5a36107c0b7,1,0,245814f7-028c-4c13-98eb-15412e851f81,245814f7-028c-4c13-98eb-15412e851f81,1,0,0132e564-2cd3-4930-8962-1068532f4be4,0132e564-2cd3-4930-8962-1068532f4be4,1,0,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,1,0,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,1,0,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,1,0,7021fca5-d612-43e1-927b-7f822153cf75,7021fca5-d612-43e1-927b-7f822153cf75,1,0,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,1,0,ee0a8d23-660a-492b-a813-b57394acee05,ee0a8d23-660a-492b-a813-b57394acee05,1,0,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,1,0,11c5930d-f882-46bd-9e7b-63e5344f6604,11c5930d-f882-46bd-9e7b-63e5344f6604,1,0,ade21e2e-349f-414b-8f35-6ae3b6a4064d,ade21e2e-349f-414b-8f35-6ae3b6a4064d,1,0,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,1,0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,1,0,83f51efe-e2af-459a-b59f-2c036124ac23,83f51efe-e2af-459a-b59f-2c036124ac23,1,0,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,1,0,b03829e9-ba22-4584-85f0-c36d63f48242,b03829e9-ba22-4584-85f0-c36d63f48242,1,0,084a7c95-a59b-4861-b8b3-b5710a57ac60,084a7c95-a59b-4861-b8b3-b5710a57ac60,1,0,efcea6da-6746-4e00-913a-14cab38b5d84,efcea6da-6746-4e00-913a-14cab38b5d84,1,0,aff367fb-7fca-44d0-adf9-3731f14834f6,aff367fb-7fca-44d0-adf9-3731f14834f6,1,0,a2782760-dd4c-44d2-a785-814d6f610455,a2782760-dd4c-44d2-a785-814d6f610455,1,0,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,1,0,6581ac1f-11ef-42b8-9f3b-590bb7546e63,6581ac1f-11ef-42b8-9f3b-590bb7546e63,1,0,ce952e88-35b7-4506-81ac-d7081e50a650,ce952e88-35b7-4506-81ac-d7081e50a650,1,0,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,1,0,3bf1281f-7570-4633-86b9-3e953a7e6647,3bf1281f-7570-4633-86b9-3e953a7e6647,1,0,715dc289-5b14-4ee0-8716-9c15958b9069,715dc289-5b14-4ee0-8716-9c15958b9069,1,0,92707138-5004-4378-8477-f909166d319d,92707138-5004-4378-8477-f909166d319d,1,0,43661775-43bb-4d9e-bfbb-c46e7d194ca3,43661775-43bb-4d9e-bfbb-c46e7d194ca3,1,0,532637ef-be0d-4f42-9747-a88e17eb3def,532637ef-be0d-4f42-9747-a88e17eb3def,1,0,61127152-3e24-40b4-8a23-5eb6cae568ff,61127152-3e24-40b4-8a23-5eb6cae568ff,1,0,ffd987e3-e8af-4d46-881e-1e312e74dbac,ffd987e3-e8af-4d46-881e-1e312e74dbac,1,0,ad1142ed-183d-47a3-800c-997a3770e11e,ad1142ed-183d-47a3-800c-997a3770e11e,1,0,ebef37c6-4808-4683-93be-036ce19cafd5,ebef37c6-4808-4683-93be-036ce19cafd5,1,0,66364cd4-aaa5-421d-96d6-3c283c14650d,66364cd4-aaa5-421d-96d6-3c283c14650d,1,0,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,1,0,3c54d440-e908-43d6-a5cc-bb64620c82d7,3c54d440-e908-43d6-a5cc-bb64620c82d7,1,0,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,1,0,bf1dd911-8ee1-407b-acae-10c85b74baf3,bf1dd911-8ee1-407b-acae-10c85b74baf3,1,0,e924058f-25c3-4744-a565-836b824991b7,e924058f-25c3-4744-a565-836b824991b7,1,0,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,1,0,518dcd70-4ccf-4866-a94f-7ceec7dd2801,518dcd70-4ccf-4866-a94f-7ceec7dd2801,1,0,f9950ab5-1077-4033-bbbf-53899a1bcf33,f9950ab5-1077-4033-bbbf-53899a1bcf33,1,0,8f16763b-86f0-4ad0-b786-cce7dcb3460e,8f16763b-86f0-4ad0-b786-cce7dcb3460e,1,0,0481bc65-6a32-46b9-ae87-993ba52a29a5,0481bc65-6a32-46b9-ae87-993ba52a29a5,1,0,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,1,0,dbc5f419-63b0-4cbe-90ff-c0101105e46c,dbc5f419-63b0-4cbe-90ff-c0101105e46c,1,0,c708f6e9-b7a0-4046-90f3-83527da7b872,c708f6e9-b7a0-4046-90f3-83527da7b872,1,0,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,1,0,14256e0a-a947-42a3-8e36-47bfbb052a0c,14256e0a-a947-42a3-8e36-47bfbb052a0c,1,0,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1,0,c0dcdb22-6719-4597-a781-bca1370909e5,c0dcdb22-6719-4597-a781-bca1370909e5,1,0,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,1,0,7a34f723-cd14-4949-a40f-7ce579bf0449,7a34f723-cd14-4949-a40f-7ce579bf0449,1,0,5cdc9ac7-bba9-4ed1-845a-607976fc4679,5cdc9ac7-bba9-4ed1-845a-607976fc4679,1,0,86c22871-6d1c-44e0-8ade-ce4bdeb23321,86c22871-6d1c-44e0-8ade-ce4bdeb23321,1,0,da51de81-4d4f-46b5-a308-7b50db6c45a7,da51de81-4d4f-46b5-a308-7b50db6c45a7,1,0,c2a8c2d3-ff13-4a13-acd4-797118c4e767,c2a8c2d3-ff13-4a13-acd4-797118c4e767,1,0,bc6adf75-8666-49f3-9703-b0014dfee123,bc6adf75-8666-49f3-9703-b0014dfee123,1,0,30632f54-b779-4857-a5cc-c53fe8887ee5,30632f54-b779-4857-a5cc-c53fe8887ee5,1,0,087480bb-8c89-4b00-a29b-b7e29926478d,087480bb-8c89-4b00-a29b-b7e29926478d,1,0,685373b7-638a-439a-8cba-703d56e4e404,685373b7-638a-439a-8cba-703d56e4e404,1,0,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,1,0,df22b227-b2c3-4e65-9706-7582f99fe59c,df22b227-b2c3-4e65-9706-7582f99fe59c,1,0,35828c88-f1ec-42e7-b189-78748931ee4a,35828c88-f1ec-42e7-b189-78748931ee4a,1,0,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,1,0,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1,0,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,1,0,921a0a14-8c06-4894-95ce-423000769364,921a0a14-8c06-4894-95ce-423000769364,1,0,3805ee39-a48a-499a-9ef8-9c2a5985404f,3805ee39-a48a-499a-9ef8-9c2a5985404f,1,0,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,1,0,08c2f92c-eb05-49e7-bfc9-4a89607b9864,08c2f92c-eb05-49e7-bfc9-4a89607b9864,1,0,6d751379-89a7-49b5-93e5-578329c63d9c,6d751379-89a7-49b5-93e5-578329c63d9c,1,0,c3f156ef-947e-4ebb-883f-4f099a116063,c3f156ef-947e-4ebb-883f-4f099a116063,1,0,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,1,0,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,1,0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,1,0,e98e9e56-2995-430c-bd3b-f1070aec15a5,e98e9e56-2995-430c-bd3b-f1070aec15a5,1,0,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,1,0,8a7546f4-bfc9-4732-bf60-43a41e2c8753,8a7546f4-bfc9-4732-bf60-43a41e2c8753,1,0,16244165-d5a4-4012-8bb5-7f5fee1111af,16244165-d5a4-4012-8bb5-7f5fee1111af,1,0,290b72ad-004f-46ab-be5e-47557543b965,290b72ad-004f-46ab-be5e-47557543b965,1,0,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,1,0,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,1,0,263bcd20-9878-48d4-aac4-b371ec49d8d6,263bcd20-9878-48d4-aac4-b371ec49d8d6,1,0,da1d8660-2757-4cea-bae0-c2210b9406ae,da1d8660-2757-4cea-bae0-c2210b9406ae,1,0,d60329c6-8f48-481d-82e7-18da355cb09c,d60329c6-8f48-481d-82e7-18da355cb09c,1,0,67a04d72-afea-487a-b629-e4b7dfc1df32,67a04d72-afea-487a-b629-e4b7dfc1df32,1,0,c4b14162-b25b-4099-9ec3-7251848ef08a,c4b14162-b25b-4099-9ec3-7251848ef08a,1,0,8eb5ba97-eb38-4357-8bfc-e9618280800d,8eb5ba97-eb38-4357-8bfc-e9618280800d,1,0,b72f73d5-e274-472b-871b-16af72dab603,b72f73d5-e274-472b-871b-16af72dab603,1,0,b008d184-0b61-460d-9490-89ecc1cd58ba,b008d184-0b61-460d-9490-89ecc1cd58ba,1,0,c8340e2f-6958-4bcd-8e17-499c4adfe60b,c8340e2f-6958-4bcd-8e17-499c4adfe60b,1,0,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,1,0,03f68d82-752c-45d1-bf9a-60ecd21a2c81,03f68d82-752c-45d1-bf9a-60ecd21a2c81,1,0,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,1,0,d4fffc79-2841-49a9-a382-e9e4138984df,d4fffc79-2841-49a9-a382-e9e4138984df,1,0,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,1,0,9f41f903-d316-4189-8dc0-603ea9036c1c,9f41f903-d316-4189-8dc0-603ea9036c1c,1,0,e19e70d6-8707-4dde-ae69-7bd97035ca03,e19e70d6-8707-4dde-ae69-7bd97035ca03,1,0,425b5272-1130-457d-8a05-aee8fad681d9,425b5272-1130-457d-8a05-aee8fad681d9,1,0,8d583436-f2a6-4a33-8137-1376f5754643,8d583436-f2a6-4a33-8137-1376f5754643,1,0,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,1,0,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,1,0,8f09cbed-6f24-461f-9b35-31c64310e74a,8f09cbed-6f24-461f-9b35-31c64310e74a,1,0,2d66502d-77ab-4cc9-9ccf-5433458fae9f,2d66502d-77ab-4cc9-9ccf-5433458fae9f,1,0,cff48da7-3c46-4602-83e8-90c9ea53e107,cff48da7-3c46-4602-83e8-90c9ea53e107,1,0,7155472d-c791-402c-96e1-d25612024c88,7155472d-c791-402c-96e1-d25612024c88,1,0,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,1,0,9005911d-ea81-48b6-bf50-1a328ff4d7be,9005911d-ea81-48b6-bf50-1a328ff4d7be,1,0,7df12006-c0c0-42a6-b852-bdced72c62e3,7df12006-c0c0-42a6-b852-bdced72c62e3,1,0,9c00987d-3c55-40eb-bae8-f36e71e4ef87,9c00987d-3c55-40eb-bae8-f36e71e4ef87,1,0,29273130-5142-48c9-8399-00e5ab4b6203,29273130-5142-48c9-8399-00e5ab4b6203,1,0,9e14cd7e-1293-4008-baf8-88df6a98abf7,9e14cd7e-1293-4008-baf8-88df6a98abf7,1,0,211d226f-dac6-43d5-8720-952da4339e35,211d226f-dac6-43d5-8720-952da4339e35,1,0,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,1,0,98e3aace-52a6-4911-8205-92165adca6de,98e3aace-52a6-4911-8205-92165adca6de,1,0,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,1,0,577e5fea-b792-4c8b-b3b3-a03a14b64b04,577e5fea-b792-4c8b-b3b3-a03a14b64b04,1,0,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,1,0,b18d312b-f9c3-4f37-ac77-d499e949f154,b18d312b-f9c3-4f37-ac77-d499e949f154,1,0,ace2beea-d393-412f-8b71-b845b665e2c4,ace2beea-d393-412f-8b71-b845b665e2c4,1,0,463b8966-a5f9-4a80-82b9-1608a1622e13,463b8966-a5f9-4a80-82b9-1608a1622e13,1,0,f02e807c-6cd3-4a4f-8dad-73bd56ee98ff,f02e807c-6cd3-4a4f-8dad-73bd56ee98ff,1,0,eefd00fe-3241-498f-aeb4-d429a86ab563,eefd00fe-3241-498f-aeb4-d429a86ab563,1,0,802d3489-318f-467d-a9f4-d7c644edac60,802d3489-318f-467d-a9f4-d7c644edac60,1,0,3fd4bc77-2a1b-4750-a54a-4171c8d40027,3fd4bc77-2a1b-4750-a54a-4171c8d40027,1,0,5b27fde9-fa80-48b1-aea1-73e132b9a944,5b27fde9-fa80-48b1-aea1-73e132b9a944,1,0,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,1,0,a747ec6b-f230-49b4-a929-7ed1ba87b078,a747ec6b-f230-49b4-a929-7ed1ba87b078,1,0,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,1,0,01cb357c-af28-4855-afae-45b6df19b344,01cb357c-af28-4855-afae-45b6df19b344,1,0,26e58429-1e08-454a-b4d7-2470390149fb,26e58429-1e08-454a-b4d7-2470390149fb,1,0,daa42bf5-9c32-4913-bc27-38f77ccc1a9f,daa42bf5-9c32-4913-bc27-38f77ccc1a9f,1,0,7620b61a-b0d1-4c71-bc80-72c48e17b96d,7620b61a-b0d1-4c71-bc80-72c48e17b96d,1,0,4802e016-a9e9-47d0-916b-b42194a1f388,4802e016-a9e9-47d0-916b-b42194a1f388,1,0,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,1,0,4062674a-4a81-494d-82bc-4984cd7c7903,4062674a-4a81-494d-82bc-4984cd7c7903,1,0,782a8801-06ca-4d63-bf8b-63d2320766d8,782a8801-06ca-4d63-bf8b-63d2320766d8,1,0,93a73123-d98c-4286-9269-7bfcedd115e8,93a73123-d98c-4286-9269-7bfcedd115e8,1,0,c5985c02-1824-4ce9-b415-1621dd2ee864,c5985c02-1824-4ce9-b415-1621dd2ee864,1,0,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,1,0,e819aaf6-3dfb-492a-8a4a-50a7c6854790,e819aaf6-3dfb-492a-8a4a-50a7c6854790,1,0,62b95ba1-f213-42fb-90f3-a03e8094bc9e,62b95ba1-f213-42fb-90f3-a03e8094bc9e,1,0,619b534d-5605-40d3-9b8c-4443a21d7795,619b534d-5605-40d3-9b8c-4443a21d7795,1,0,a010bbf4-d547-4576-9797-28e3096ffed3,a010bbf4-d547-4576-9797-28e3096ffed3,1,0,a44c3eb2-1054-41ca-82e8-fc35336e7009,a44c3eb2-1054-41ca-82e8-fc35336e7009,1,0,01f67911-4ca7-4668-b970-62c299b98e56,01f67911-4ca7-4668-b970-62c299b98e56,1,0,20c89c94-f77f-4e14-8c97-2a70c1419ce3,20c89c94-f77f-4e14-8c97-2a70c1419ce3,1,0,aa509aa3-dd45-41f3-82c7-59662c2e2c47,aa509aa3-dd45-41f3-82c7-59662c2e2c47,1,0,c4552529-e69e-4c5c-bd66-04b2f7dac281,c4552529-e69e-4c5c-bd66-04b2f7dac281,1,0,381b49ba-793a-4418-9fd4-598844fb72a6,381b49ba-793a-4418-9fd4-598844fb72a6,1,0,1aee302d-df31-49ea-b542-436dc1d79ae1,1aee302d-df31-49ea-b542-436dc1d79ae1,1,0,593509da-d33c-49ff-a62c-a28cbc4651c1,593509da-d33c-49ff-a62c-a28cbc4651c1,1,0,5e346a0b-a322-4565-adb9-70131fb05fa3,5e346a0b-a322-4565-adb9-70131fb05fa3,1,0,9a69c559-194b-4f74-9879-82740260f5f6,9a69c559-194b-4f74-9879-82740260f5f6,1,0,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,1,0,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,1,0,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,1,0,2e19fb7b-270f-4181-b4a1-640280bbbc5c,2e19fb7b-270f-4181-b4a1-640280bbbc5c,1,0,cf69b045-665d-4f6c-827f-5044beacd125,cf69b045-665d-4f6c-827f-5044beacd125,1,0,aa773eef-0c4a-49be-9f5e-9131bc041415,aa773eef-0c4a-49be-9f5e-9131bc041415,1,0,9b31e474-01d4-4c3b-a633-3a2ff3917d62,9b31e474-01d4-4c3b-a633-3a2ff3917d62,1,0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1,0,8d7750e9-899f-4434-8702-44cd02681779,8d7750e9-899f-4434-8702-44cd02681779,1,0,d85244dc-c417-4e69-9aa7-7ad313ecb940,d85244dc-c417-4e69-9aa7-7ad313ecb940,1,0,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,1,0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,1,0,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,1,0,0713de12-87d5-4877-bd8a-2b6466df67df,0713de12-87d5-4877-bd8a-2b6466df67df,1,0,b3f188f4-d83e-4e97-b7d3-fc384b46a80a,b3f188f4-d83e-4e97-b7d3-fc384b46a80a,1,0,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,1,0,c4d7c569-4649-4f98-a048-45f3c5933670,c4d7c569-4649-4f98-a048-45f3c5933670,1,0,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,1,0,ad08b104-01f8-4900-a06c-baa1d55eba84,ad08b104-01f8-4900-a06c-baa1d55eba84,1,0,9352d10d-188f-4074-8dd1-7be5c11525e3,9352d10d-188f-4074-8dd1-7be5c11525e3,1,0,1933634a-6f10-48e7-99f0-60ac338f7832,1933634a-6f10-48e7-99f0-60ac338f7832,1,0,655deec5-c079-4748-8521-b3f10c243394,655deec5-c079-4748-8521-b3f10c243394,1,0,f6d4d818-d54c-4337-82cf-abd5e6dbe770,f6d4d818-d54c-4337-82cf-abd5e6dbe770,1,0,656c447b-291f-4e62-81ac-1c004841aa72,656c447b-291f-4e62-81ac-1c004841aa72,1,0,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,1,0,5ba93404-58ad-4321-9a62-27db828f75f6,5ba93404-58ad-4321-9a62-27db828f75f6,1,0,3da20e86-1d83-4935-b425-a91392dc8f35,3da20e86-1d83-4935-b425-a91392dc8f35,1,0,b56f25d2-72a9-4d80-8998-77ac3097c873,b56f25d2-72a9-4d80-8998-77ac3097c873,1,0,03bd775a-e0a1-4205-82ce-6068e73ad134,03bd775a-e0a1-4205-82ce-6068e73ad134,1,0,40bed47b-7754-4a70-b51a-47385fd46e83,40bed47b-7754-4a70-b51a-47385fd46e83,1,0,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,1,0,1e5a4f93-1ab9-4775-9538-2a1772215d89,1e5a4f93-1ab9-4775-9538-2a1772215d89,1,0,c25db165-0734-4fef-b161-e5164954a616,c25db165-0734-4fef-b161-e5164954a616,1,0,37e3d914-643e-4963-b4a0-7bc6727c0c9b,37e3d914-643e-4963-b4a0-7bc6727c0c9b,1,0,b6902500-3e03-4e83-a077-00500abc00b6,b6902500-3e03-4e83-a077-00500abc00b6,1,0,d253aa54-a447-44aa-bb13-82fd1ce22af4,d253aa54-a447-44aa-bb13-82fd1ce22af4,1,0,8936f114-7a0e-4a4c-8752-ccacab410778,8936f114-7a0e-4a4c-8752-ccacab410778,1,0,55649242-42fd-468f-a1e4-f6cd8871f7a4,55649242-42fd-468f-a1e4-f6cd8871f7a4,1,0,980e0883-cd8f-48c8-896f-ef185650f5c2,980e0883-cd8f-48c8-896f-ef185650f5c2,1,0,06ca1680-e641-499c-94ad-2d5ce5561747,06ca1680-e641-499c-94ad-2d5ce5561747,1,0,35bbf75b-99d0-447b-acb0-a3d2c98bea56,35bbf75b-99d0-447b-acb0-a3d2c98bea56,1,0,c31e34db-41ff-4db3-a4d0-f780f67070f6,c31e34db-41ff-4db3-a4d0-f780f67070f6,1,0,7a014fcb-a4b8-4c1c-b0de-21907a917c25,7a014fcb-a4b8-4c1c-b0de-21907a917c25,1,0,1688ef5d-72df-4bc4-a879-89033d466ad7,1688ef5d-72df-4bc4-a879-89033d466ad7,1,0,d3b09b09-df2d-40e5-86ce-84dab4898231,d3b09b09-df2d-40e5-86ce-84dab4898231,1,0,344cb0de-315d-4d05-93f8-8a1f53208470,344cb0de-315d-4d05-93f8-8a1f53208470,1,0,cd869887-0b0e-43db-8b51-04fe4a1341d5,cd869887-0b0e-43db-8b51-04fe4a1341d5,1,0,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,1,0,a7973409-b18e-4b88-ad50-e2ae89470d8f,a7973409-b18e-4b88-ad50-e2ae89470d8f,1,0,a537875e-492e-4cf2-96e9-e2e97bb206da,a537875e-492e-4cf2-96e9-e2e97bb206da,1,0,cd8fd85f-f02e-4f11-b4b4-40670febfaca,cd8fd85f-f02e-4f11-b4b4-40670febfaca,1,0,3f023afb-c02a-42ee-9afe-0f47ef3fe721,3f023afb-c02a-42ee-9afe-0f47ef3fe721,1,0,d7fe80d3-7fcf-427e-a991-5384f0c3947e,d7fe80d3-7fcf-427e-a991-5384f0c3947e,1,0,085a08f3-9d93-429d-9b1b-9065ab8363f7,085a08f3-9d93-429d-9b1b-9065ab8363f7,1,0,a530c0a1-c1d2-40bb-9d0e-320074dbb684,a530c0a1-c1d2-40bb-9d0e-320074dbb684,1,0,55c63580-16f1-4d6f-a40b-e630f71ebb98,55c63580-16f1-4d6f-a40b-e630f71ebb98,1,0,16939af9-e459-43da-8e0d-5d5891af6e0c,16939af9-e459-43da-8e0d-5d5891af6e0c,1,0,1d736a09-6c8f-433a-bf5b-201996bf4c62,1d736a09-6c8f-433a-bf5b-201996bf4c62,1,0,157988ad-d482-41df-b3e3-f2a0383d7130,157988ad-d482-41df-b3e3-f2a0383d7130,1,0,33af87a9-db69-41da-a33a-0435da2155e3,33af87a9-db69-41da-a33a-0435da2155e3,1,0,c95831b4-7d1d-4a9a-b5d0-caa03c4f4eca,c95831b4-7d1d-4a9a-b5d0-caa03c4f4eca,1,0,81b63f1d-2c65-4efb-8599-8a4d97b612ab,81b63f1d-2c65-4efb-8599-8a4d97b612ab,1,0,4b13a2c6-a6ce-47a0-8d9e-1a5dbe8d4b00,4b13a2c6-a6ce-47a0-8d9e-1a5dbe8d4b00,1,0,d1dde981-615a-461f-b0c5-a85f51003a2c,d1dde981-615a-461f-b0c5-a85f51003a2c,1,0,f5970c48-63d7-4064-bdfc-482b72939347,f5970c48-63d7-4064-bdfc-482b72939347,1,0,5c8039c0-34d8-4443-bd8f-dfe3dc2977a8,5c8039c0-34d8-4443-bd8f-dfe3dc2977a8,1,0,210972af-8687-4526-b288-60e7ee76cd61,210972af-8687-4526-b288-60e7ee76cd61,1,0,335f379a-2974-44ce-a668-e7ffe2ce6263,335f379a-2974-44ce-a668-e7ffe2ce6263,1,0,7edd75a2-9d03-4330-9185-28d0f0d4a2e4,7edd75a2-9d03-4330-9185-28d0f0d4a2e4,1,0,f7cc4f9e-cf9a-41f5-865f-d64108b981a5,f7cc4f9e-cf9a-41f5-865f-d64108b981a5,1,0,b58f8947-344c-4902-832c-d8004da55c34,b58f8947-344c-4902-832c-d8004da55c34,1,0,35cccc1d-3d67-4d39-aa79-2c30a5347587,35cccc1d-3d67-4d39-aa79-2c30a5347587,1,0,b6ee01eb-31ab-4f39-b4ff-37a04e3c7f35,b6ee01eb-31ab-4f39-b4ff-37a04e3c7f35,1,0,0776dfb2-67e0-4e11-9f94-abde790ff7e2,0776dfb2-67e0-4e11-9f94-abde790ff7e2,1,0,9c92b833-7406-48e2-9f59-69d575a3898f,9c92b833-7406-48e2-9f59-69d575a3898f,1,0,0cc5334f-8147-455c-8262-540324415812,0cc5334f-8147-455c-8262-540324415812,1,0,f3c4e6db-7c4e-4027-8bfd-f7854d566fc1,f3c4e6db-7c4e-4027-8bfd-f7854d566fc1,1,0,0eeb2f75-7092-4487-891f-cdbc9aa978cb,0eeb2f75-7092-4487-891f-cdbc9aa978cb,1,0,4ac60443-c7cb-492f-98b4-7e48bf9bfaa6,4ac60443-c7cb-492f-98b4-7e48bf9bfaa6,1,0,22979d50-ea57-4fab-9673-1b537838aead,22979d50-ea57-4fab-9673-1b537838aead,1,0,14676ee5-c247-46c6-a37e-c4362de79bb9,14676ee5-c247-46c6-a37e-c4362de79bb9,1,0,9fa36fe3-814e-4472-94ee-5d9d2b230b24,9fa36fe3-814e-4472-94ee-5d9d2b230b24,1,0,4b59dc62-0352-45a8-b33b-c42f4eea75ee,4b59dc62-0352-45a8-b33b-c42f4eea75ee,1,0,ea8a50ce-f09c-49f7-be58-ff2864e4eaa3,ea8a50ce-f09c-49f7-be58-ff2864e4eaa3,1,0,2020d672-bef4-4b30-885e-7f41364e412b,2020d672-bef4-4b30-885e-7f41364e412b,1,0,c292ddbc-9402-4c43-93d8-f8efafa6456e,c292ddbc-9402-4c43-93d8-f8efafa6456e,1,0,0281cbd6-972d-4632-9a6a-f8791e2534ee,0281cbd6-972d-4632-9a6a-f8791e2534ee,1,0,bae01f18-b6f3-44e4-93c3-ffcb3ef01b98,bae01f18-b6f3-44e4-93c3-ffcb3ef01b98,1,0,98d66bf0-617a-40aa-97bd-896d37a966ab,98d66bf0-617a-40aa-97bd-896d37a966ab,1,0,1847bb2f-8309-4c49-b752-ef7ec16d4230,1847bb2f-8309-4c49-b752-ef7ec16d4230,1,0,ca23f432-e2a3-4385-8cc1-7e9c96f9d7a1,ca23f432-e2a3-4385-8cc1-7e9c96f9d7a1,1,0,e1856045-f394-45b8-9f0c-298812f1f514,e1856045-f394-45b8-9f0c-298812f1f514,1,0,eb175c1d-7fcb-4807-82e3-688639468116,eb175c1d-7fcb-4807-82e3-688639468116,1,0,4ed9c099-700f-409b-bd91-e24719046953,4ed9c099-700f-409b-bd91-e24719046953,1,0,85b935b4-5eec-40cf-9d99-02cb3f599492,85b935b4-5eec-40cf-9d99-02cb3f599492,1,0,5764a412-4a20-4b2e-9905-ce74a9cac3ae,5764a412-4a20-4b2e-9905-ce74a9cac3ae,1,0,c4330791-d8f7-400f-b270-dee567e7a695,c4330791-d8f7-400f-b270-dee567e7a695,1,0,aab8ec4d-51de-4c1a-9794-266c119332d1,aab8ec4d-51de-4c1a-9794-266c119332d1,1,0,77cb6e52-37a9-423c-8260-6998161adcb5,77cb6e52-37a9-423c-8260-6998161adcb5,1,0,d903569d-911d-4277-a26f-afe2bf67eb09,d903569d-911d-4277-a26f-afe2bf67eb09,1,0,b5ac7de5-565f-4637-b267-dde3637e336b,b5ac7de5-565f-4637-b267-dde3637e336b,1,0,d4a6ab09-259f-4476-834c-a2b57cdeac05,d4a6ab09-259f-4476-834c-a2b57cdeac05,1,0,a56ff7f4-2259-455f-b707-b98aacd7d0b2,a56ff7f4-2259-455f-b707-b98aacd7d0b2,1,0,8c9636c3-0a84-4575-b4c7-6d8bb588e1b0,8c9636c3-0a84-4575-b4c7-6d8bb588e1b0,1,0,76e03401-7c07-4037-a464-d7377852de1d,76e03401-7c07-4037-a464-d7377852de1d,1,0,dc8239e8-fddf-411e-b51a-4230b63236cd,dc8239e8-fddf-411e-b51a-4230b63236cd,1,0,3b861376-2864-4de8-ba59-2a2835d7eaf6,3b861376-2864-4de8-ba59-2a2835d7eaf6,1,0,02910dcd-9e66-4239-a421-8067faf59577,02910dcd-9e66-4239-a421-8067faf59577,1,0,76d5a67f-bb11-4937-a66d-cdce28165562,76d5a67f-bb11-4937-a66d-cdce28165562,1,0,b99a23a5-bfbf-46ec-8268-ff89afdfc63a,b99a23a5-bfbf-46ec-8268-ff89afdfc63a,1,0,cdb93924-62ce-4268-9915-e6c67c1b9cb8,cdb93924-62ce-4268-9915-e6c67c1b9cb8,1,0,1139b6c7-7b55-45b4-98cf-ccac3bfaaa6c,1139b6c7-7b55-45b4-98cf-ccac3bfaaa6c,1,0,33c39990-f4fc-4629-83ba-b43b05a40ca6,33c39990-f4fc-4629-83ba-b43b05a40ca6,1,0,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0a136ad9-22ad-4ba7-a31a-40a193b49d26,1,0,208c7b8c-3df9-4441-8ebf-34ffa81572a2,208c7b8c-3df9-4441-8ebf-34ffa81572a2,1,0,8c17fd7c-74d7-496a-a843-42022afb0707,8c17fd7c-74d7-496a-a843-42022afb0707,1,0,091ccac1-9a63-4a89-bb0c-333b274b0c70,091ccac1-9a63-4a89-bb0c-333b274b0c70,1,0,849f00c3-2f18-414c-97f6-32a99173fab9,849f00c3-2f18-414c-97f6-32a99173fab9,1,0,b456d820-8034-4381-960d-66d9f86b0a4b,b456d820-8034-4381-960d-66d9f86b0a4b,1,0,bd55fd03-cf67-4333-a554-98e03d18f780,bd55fd03-cf67-4333-a554-98e03d18f780,1,0,6eac5f7b-0952-4c94-9028-529b14ffcd4f,6eac5f7b-0952-4c94-9028-529b14ffcd4f,1,0,a587cade-4c91-4769-9c6a-a4fb4fe94196,a587cade-4c91-4769-9c6a-a4fb4fe94196,1,0,1a7c774d-5b86-4051-b797-3081e19fa30a,1a7c774d-5b86-4051-b797-3081e19fa30a,1,0,00949768-5833-4fe2-8752-b009d1bceef8,00949768-5833-4fe2-8752-b009d1bceef8,1,0,167455d1-6658-409f-834c-f6ccfe7b25de,167455d1-6658-409f-834c-f6ccfe7b25de,1,0,1300c46e-24d4-45cf-a899-3d26b5cf0b50,1300c46e-24d4-45cf-a899-3d26b5cf0b50,1,0,4cde6fdc-85fa-4c00-896c-51a68f5f10a5,4cde6fdc-85fa-4c00-896c-51a68f5f10a5,1,0,f41de07b-cba3-4bb8-9ec0-64ec59753f84,f41de07b-cba3-4bb8-9ec0-64ec59753f84,1,0,f78a5650-4d6c-4c17-95e0-e95cf8d9ad4b,f78a5650-4d6c-4c17-95e0-e95cf8d9ad4b,1,0,c5b3ca21-8f7b-4933-853c-7d95b17b5631,c5b3ca21-8f7b-4933-853c-7d95b17b5631,1,0,8b0faa1e-09da-4ba4-894e-e86abc5d39df,8b0faa1e-09da-4ba4-894e-e86abc5d39df,1,0,cb50b309-1b6c-400c-9e9e-67204dcccaae,cb50b309-1b6c-400c-9e9e-67204dcccaae,1,0,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,1,0,2a6e1f2b-7378-456b-9657-9e971eaff716,2a6e1f2b-7378-456b-9657-9e971eaff716,1,0,c3cdea20-3055-4b4e-a531-a02d4f3ed294,c3cdea20-3055-4b4e-a531-a02d4f3ed294,1,0,46417026-c44a-4a06-af41-9cf6495a33b4,46417026-c44a-4a06-af41-9cf6495a33b4,1,0,363c15f3-660e-4e19-b3cc-37c5d05e8d22,363c15f3-660e-4e19-b3cc-37c5d05e8d22,1,0,eeb4b6f1-2476-467d-9862-6fe9d3013b2c,eeb4b6f1-2476-467d-9862-6fe9d3013b2c,1,0,59d5cd7d-7f53-4015-89d9-bb8ad89f8c04,59d5cd7d-7f53-4015-89d9-bb8ad89f8c04,1,0,9d7f7dde-fea8-4064-abe2-bb7d04500cb2,9d7f7dde-fea8-4064-abe2-bb7d04500cb2,1,0,3af45dae-f563-4d23-a87a-11b4d9d5d7a7,3af45dae-f563-4d23-a87a-11b4d9d5d7a7,1,0,fe102b7b-b61f-4572-b2d0-c0af11bfb7d7,fe102b7b-b61f-4572-b2d0-c0af11bfb7d7,1,0,2cfa0db8-f0e6-4513-ab19-52dccff302bc,2cfa0db8-f0e6-4513-ab19-52dccff302bc,1,0,b9fece39-6e5d-44c0-af5c-ad13cfb71560,b9fece39-6e5d-44c0-af5c-ad13cfb71560,1,0,a9c30e99-c265-471d-9115-50ac2bb05191,a9c30e99-c265-471d-9115-50ac2bb05191,1,0,d388c9ca-1dbd-45b9-ac33-5ffa8cb11499,d388c9ca-1dbd-45b9-ac33-5ffa8cb11499,1,0,efebb079-b913-4249-b128-e0ffc7ab43dd,efebb079-b913-4249-b128-e0ffc7ab43dd,1,0,52077ee4-fef1-451f-8338-86563ff5cf60,52077ee4-fef1-451f-8338-86563ff5cf60,1,0,8e6780f8-8d0e-47d1-ac26-47bf5d906f61,8e6780f8-8d0e-47d1-ac26-47bf5d906f61,1,0,fd4a26c1-31e0-4216-92e0-1e090ec4f094,fd4a26c1-31e0-4216-92e0-1e090ec4f094,1,0,637148a3-0f54-4d41-91dd-a0aa6e191015,637148a3-0f54-4d41-91dd-a0aa6e191015,1,0,9a86e2fe-a9bc-4f0a-a16e-a97944fe8539,9a86e2fe-a9bc-4f0a-a16e-a97944fe8539,1,0,b6f745d7-1326-494e-b442-e4118955b5db,b6f745d7-1326-494e-b442-e4118955b5db,1,0,86755cbc-efd8-43e7-bba8-975c0a51f38f,86755cbc-efd8-43e7-bba8-975c0a51f38f,1,0,93701593-5ac8-4266-b471-7e9ed35a9c3e,93701593-5ac8-4266-b471-7e9ed35a9c3e,1,0,0fdb864e-ede9-4777-835c-0804968ee544,0fdb864e-ede9-4777-835c-0804968ee544,1,0,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,1,0,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,1,0,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,1,0,5dee9814-fe38-4631-8148-8d6c87ef6f47,5dee9814-fe38-4631-8148-8d6c87ef6f47,1,0,37d17053-5c2b-4972-b6a5-a589f2ddbde6,37d17053-5c2b-4972-b6a5-a589f2ddbde6,1,0,c349968a-3f87-425b-8efb-d847934dee4b,c349968a-3f87-425b-8efb-d847934dee4b,1,0,3bb8dc33-970c-4c58-9036-ce716d963847,3bb8dc33-970c-4c58-9036-ce716d963847,1,0,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,1,0,b3ff39fa-f665-4d01-9a2a-69722e6b1071,b3ff39fa-f665-4d01-9a2a-69722e6b1071,1,0,0abacb0a-ce00-474e-8aec-35685c51ddef,0abacb0a-ce00-474e-8aec-35685c51ddef,1,0,ae407b17-03aa-4268-8603-58d6714dae89,ae407b17-03aa-4268-8603-58d6714dae89,1,0,9a5b9bf4-71b8-41f2-8e23-8c396357f0a5,9a5b9bf4-71b8-41f2-8e23-8c396357f0a5,1,0,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,1,0,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,1,0,5bb6e52c-ac26-4143-8e90-f04f703f823b,5bb6e52c-ac26-4143-8e90-f04f703f823b,1,0,579baaa4-6493-4d99-8744-6399757295c7,579baaa4-6493-4d99-8744-6399757295c7,1,0,ae6d0e12-8857-476c-b4b2-f03295cbed3e,ae6d0e12-8857-476c-b4b2-f03295cbed3e,1,0,cc8e3172-491d-45d8-a7eb-fc6c400845cb,cc8e3172-491d-45d8-a7eb-fc6c400845cb,1,0,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,1,0,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,1,0,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,1,0,51d83895-5692-4479-9612-07c790d19dff,51d83895-5692-4479-9612-07c790d19dff,1,0,9c1325af-7492-42be-b3af-51b692534510,9c1325af-7492-42be-b3af-51b692534510,1,0,dface15c-cd65-4fb1-b4dd-b513086d3f8e,dface15c-cd65-4fb1-b4dd-b513086d3f8e,1,0,d854b528-8456-4453-9c2d-4f96caf10481,d854b528-8456-4453-9c2d-4f96caf10481,1,0,622d6de2-7404-41cc-961b-131d078d7ab4,622d6de2-7404-41cc-961b-131d078d7ab4,1,0,245f870e-a53a-4d86-aa0a-c0c7709b8acb,245f870e-a53a-4d86-aa0a-c0c7709b8acb,1,0,476f6bfa-b10c-4e0f-8499-23c652715b3f,476f6bfa-b10c-4e0f-8499-23c652715b3f,1,0,65c9754b-53f6-4616-a9d4-74826f7b0ced,65c9754b-53f6-4616-a9d4-74826f7b0ced,1,0,eca2b076-d218-4d1c-948b-7894edf9fa49,eca2b076-d218-4d1c-948b-7894edf9fa49,1,0,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,1,0,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,1,0,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,1,0,b7e85f5c-4312-44c6-895a-3f636a8c78d8,b7e85f5c-4312-44c6-895a-3f636a8c78d8,1,0,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,1,0,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1,0,a1afacc5-f49a-4df2-a44d-479594d50179,a1afacc5-f49a-4df2-a44d-479594d50179,1,0,fe70eba3-7477-4a38-a511-d69960abb928,fe70eba3-7477-4a38-a511-d69960abb928,1,0,6534ea96-2145-49e6-9739-f59459dc7f6b,6534ea96-2145-49e6-9739-f59459dc7f6b,1,0,f49bffa0-cad6-4801-b82e-21aa580e72e6,f49bffa0-cad6-4801-b82e-21aa580e72e6,1,0,bbbfb817-8db3-4415-86c3-af028276d6e9,bbbfb817-8db3-4415-86c3-af028276d6e9,1,0,6a91112c-f6cc-47a0-9d26-a36c7702af7d,6a91112c-f6cc-47a0-9d26-a36c7702af7d,1,0,40a59681-f31d-4fb9-9301-67c1430590e0,40a59681-f31d-4fb9-9301-67c1430590e0,1,0,ae3358ad-ea3a-4b73-a305-02a152863978,ae3358ad-ea3a-4b73-a305-02a152863978,1,0,cb92dc2e-6053-4233-a408-4464514b1257,cb92dc2e-6053-4233-a408-4464514b1257,1,0,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,1,0,85550a7a-8fe0-4296-ace5-63cf053536b4,85550a7a-8fe0-4296-ace5-63cf053536b4,1,0,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,1,0,9c3bc502-bcb1-4c90-ae43-53c798958339,9c3bc502-bcb1-4c90-ae43-53c798958339,1,0,3f8b6411-6606-4d27-891e-7c77be47c5f9,3f8b6411-6606-4d27-891e-7c77be47c5f9,1,0,cfc0adf6-87b4-4c8a-91e2-46c2616b319b,cfc0adf6-87b4-4c8a-91e2-46c2616b319b,1,0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,1,0,5eb4ca7f-027a-4860-a167-e6b424527e7a,5eb4ca7f-027a-4860-a167-e6b424527e7a,1,0,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,1,0,6871015f-d959-4a77-a091-a23cb4ebd8f9,6871015f-d959-4a77-a091-a23cb4ebd8f9,1,0,e5e1631b-a494-4e73-b356-b4330b84cc88,e5e1631b-a494-4e73-b356-b4330b84cc88,1,0,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,1,0,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,1,0,4dbf114a-5402-40b0-9cab-19601aa8328e,4dbf114a-5402-40b0-9cab-19601aa8328e,1,0,a0856ca2-6a66-4108-b6d4-82443cdccca6,a0856ca2-6a66-4108-b6d4-82443cdccca6,1,0,378b0708-a0a1-4c82-b55a-796acb27e696,378b0708-a0a1-4c82-b55a-796acb27e696,1,0,8e462c0e-c67a-45e9-9871-1f976b01632d,8e462c0e-c67a-45e9-9871-1f976b01632d,1,0,c5335e1f-3e47-46b7-b695-0653f825d855,c5335e1f-3e47-46b7-b695-0653f825d855,1,0,d7faad11-1e35-460c-8943-49370f328c03,d7faad11-1e35-460c-8943-49370f328c03,1,0,e4726010-85c5-4ccc-b574-4b3b55f0d391,e4726010-85c5-4ccc-b574-4b3b55f0d391,1,0,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,1,0,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,1,0,1f4f839a-4e19-45b8-a988-13ee604c269c,1f4f839a-4e19-45b8-a988-13ee604c269c,1,0,b3aa97e1-baef-45f4-9179-052f35527a5e,b3aa97e1-baef-45f4-9179-052f35527a5e,1,0,d613941f-ed4c-4957-b469-ea6b0d2a121d,d613941f-ed4c-4957-b469-ea6b0d2a121d,1,0,0d8d08e3-194f-416c-a1e0-aa92b40b7911,0d8d08e3-194f-416c-a1e0-aa92b40b7911,1,0,af0178fe-eb3a-485b-9acf-35c8702aa330,af0178fe-eb3a-485b-9acf-35c8702aa330,1,0,201d323b-4c0c-4c93-ae43-43a378ec0d9e,201d323b-4c0c-4c93-ae43-43a378ec0d9e,1,0,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,1,0,c513ceb0-0855-43ce-a311-c9bea88e2563,c513ceb0-0855-43ce-a311-c9bea88e2563,1,0,974bfc13-85c2-454a-b562-e72384eb4c31,974bfc13-85c2-454a-b562-e72384eb4c31,1,0,69cd6adc-b129-4fbc-804d-8d5aaef77280,69cd6adc-b129-4fbc-804d-8d5aaef77280,1,0,3431a3de-cb9d-46dc-b597-3203831796a9,3431a3de-cb9d-46dc-b597-3203831796a9,1,0,f3866271-04ed-4963-852e-cf41e9e18e1d,f3866271-04ed-4963-852e-cf41e9e18e1d,1,0,b77e5ec2-35cd-43ae-957f-af35214fa621,b77e5ec2-35cd-43ae-957f-af35214fa621,1,0,4a04d83d-cadd-4f36-9ec8-f926259c18ba,4a04d83d-cadd-4f36-9ec8-f926259c18ba,1,0,85e670c0-1616-4611-984c-3d40e890b2e9,85e670c0-1616-4611-984c-3d40e890b2e9,1,0,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,1,0,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,1,0,f1693207-2637-412a-972f-2bc79b9c7fc8,f1693207-2637-412a-972f-2bc79b9c7fc8,1,0,da59378e-0a97-4cff-977b-cc51967068ee,da59378e-0a97-4cff-977b-cc51967068ee,1,0,bbaad46d-f60d-49e6-a077-075366bca47e,bbaad46d-f60d-49e6-a077-075366bca47e,1,0,0d9f5703-91e4-4769-bedd-5bd974f2f617,0d9f5703-91e4-4769-bedd-5bd974f2f617,1,0,926cdf17-1929-43d6-8205-858aab558ad9,926cdf17-1929-43d6-8205-858aab558ad9,1,0,5ec6838f-2d70-4f91-b41b-16adfe8ed587,5ec6838f-2d70-4f91-b41b-16adfe8ed587,1,0,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,1,0,bee8b8a0-f058-44cb-822c-620351567627,bee8b8a0-f058-44cb-822c-620351567627,1,0,26365e29-903b-47fd-ad96-e0d87f5d6e87,26365e29-903b-47fd-ad96-e0d87f5d6e87,1,0,569180cb-ce54-4267-94b9-332e35e3c17d,569180cb-ce54-4267-94b9-332e35e3c17d,1,0,55bce105-51c0-452e-9eec-b960fe740db2,55bce105-51c0-452e-9eec-b960fe740db2,1,0,776c171d-5dd5-4965-94dc-c2fe6792d5f2,776c171d-5dd5-4965-94dc-c2fe6792d5f2,1,0,86bb1105-702a-47be-906a-1821a69b1b6c,86bb1105-702a-47be-906a-1821a69b1b6c,1,0,40653767-9542-44e9-a84b-ffee75584638,40653767-9542-44e9-a84b-ffee75584638,1,0,49bd152e-479a-46fe-b3af-26ed9181dc34,49bd152e-479a-46fe-b3af-26ed9181dc34,1,0,0a742dd2-1ff4-42de-b303-f2bb01b36fe2,0a742dd2-1ff4-42de-b303-f2bb01b36fe2,1,0,69e13959-51ad-4ac2-9cfc-17ac28b78c78,69e13959-51ad-4ac2-9cfc-17ac28b78c78,1,0,f890ca1b-f2c2-4630-9002-301b759ca6d9,f890ca1b-f2c2-4630-9002-301b759ca6d9,1,0,08c8a9bf-7b89-4d0e-a496-4c7efeca0577,08c8a9bf-7b89-4d0e-a496-4c7efeca0577,1,0,f6c2b015-9cfc-40d2-a93f-b0e88db4a23f,f6c2b015-9cfc-40d2-a93f-b0e88db4a23f,1,0,103f3d8f-e47a-4772-bdd7-dd5f8508d22b,103f3d8f-e47a-4772-bdd7-dd5f8508d22b,1,0,ba8ea271-8716-49ef-8b10-f4b5798c1f62,ba8ea271-8716-49ef-8b10-f4b5798c1f62,1,0,3633c30c-9479-4801-89cc-a5734a41e465,3633c30c-9479-4801-89cc-a5734a41e465,1,0,f295c68d-7e29-48b8-a95a-56e96d9843c1,f295c68d-7e29-48b8-a95a-56e96d9843c1,1,0,7ebe16ee-8e5d-4b05-89b5-9539f73be90c,7ebe16ee-8e5d-4b05-89b5-9539f73be90c,1,0,ea5d0221-fb1e-4626-862a-9c1209365d8f,ea5d0221-fb1e-4626-862a-9c1209365d8f,1,0,12bce69b-933c-4ce4-9d29-a47f3db0226e,12bce69b-933c-4ce4-9d29-a47f3db0226e,1,0,82dcd6a3-c35b-421c-a8f9-77855ad2abca,82dcd6a3-c35b-421c-a8f9-77855ad2abca,1,0,ad0b1720-282e-49d4-af80-324a887963c3,ad0b1720-282e-49d4-af80-324a887963c3,1,0,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,1,0,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,1,0,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,1,0,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,1,0,fcb97a46-d5fd-4bb5-b899-17723a9fe346,fcb97a46-d5fd-4bb5-b899-17723a9fe346,1,0,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,1,0,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,1,0,a1a44832-6026-47ae-affd-5b6d52e84307,a1a44832-6026-47ae-affd-5b6d52e84307,1,0,d2fd8650-d13a-411d-8206-61b16016bd82,d2fd8650-d13a-411d-8206-61b16016bd82,1,0,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,1,0,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,1,0,a92acf0e-9132-4456-9a82-1543d98ca453,a92acf0e-9132-4456-9a82-1543d98ca453,1,0,4033eb31-8281-402a-afff-431fa36e589e,4033eb31-8281-402a-afff-431fa36e589e,1,0,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,1,0,f59488c7-4643-4988-8043-5c9724e04279,f59488c7-4643-4988-8043-5c9724e04279,1,0,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,1,0,b67a509d-bb0f-427e-b447-4d4617078d6a,b67a509d-bb0f-427e-b447-4d4617078d6a,1,0,968ecfca-cf06-4952-83c1-a151e46c78a9,968ecfca-cf06-4952-83c1-a151e46c78a9,1,0,4945c734-a47d-44e9-8a7f-94b31911c1ce,4945c734-a47d-44e9-8a7f-94b31911c1ce,1,0,20a194e9-06cf-4013-bfa4-bc15554a54d0,20a194e9-06cf-4013-bfa4-bc15554a54d0,1,0,ab4f3d3d-bb5a-4dbc-b699-808458036b00,ab4f3d3d-bb5a-4dbc-b699-808458036b00,1,0,09761456-2273-437f-9316-0391cfaa81b3,09761456-2273-437f-9316-0391cfaa81b3,1,0,93922abc-98b9-4b3d-a5c8-7294378a69e1,93922abc-98b9-4b3d-a5c8-7294378a69e1,1,0,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,1,0,85223d37-2503-4783-94dc-fe6265e718d5,85223d37-2503-4783-94dc-fe6265e718d5,1,0,0918cd76-56e5-4314-8a1c-c21d023ba6f8,0918cd76-56e5-4314-8a1c-c21d023ba6f8,1,0,9db21c2e-79fa-44e4-902e-416abfccb54a,9db21c2e-79fa-44e4-902e-416abfccb54a,1,0,fb082db3-197b-4d1e-b9ea-362624d547ee,fb082db3-197b-4d1e-b9ea-362624d547ee,1,0,c09dcf00-a45a-4487-99c5-d3a37956ec88,c09dcf00-a45a-4487-99c5-d3a37956ec88,1,0,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,1,0,2714e1b6-6b02-43a1-bc94-2934b429ed35,2714e1b6-6b02-43a1-bc94-2934b429ed35,1,0,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,1,0,4c7016da-9991-4917-8eaa-e760cc9e29d1,4c7016da-9991-4917-8eaa-e760cc9e29d1,1,0,febb3770-5c11-4ada-9e49-a27950bdaddf,febb3770-5c11-4ada-9e49-a27950bdaddf,1,0,d7b57669-e538-4e54-ab1b-8428f0586466,d7b57669-e538-4e54-ab1b-8428f0586466,1,0,9c484a15-039e-416d-af97-4c2bd90fd873,9c484a15-039e-416d-af97-4c2bd90fd873,1,0,534855e3-4cf2-471c-b982-7138917050c9,534855e3-4cf2-471c-b982-7138917050c9,1,0,4c72b944-d000-4920-aec8-54029f88ddf4,4c72b944-d000-4920-aec8-54029f88ddf4,1,0,b4033d05-05c2-4617-80d9-abfa389c47f4,b4033d05-05c2-4617-80d9-abfa389c47f4,1,0,0f46b124-1575-4984-9bc1-b5e4696efc74,0f46b124-1575-4984-9bc1-b5e4696efc74,1,0,a0183a0b-1459-4b32-924c-6ea156f02125,a0183a0b-1459-4b32-924c-6ea156f02125,1,0,fc2dc619-41e0-4cce-a080-d5c8de5029a8,fc2dc619-41e0-4cce-a080-d5c8de5029a8,1,0,9609e5fb-fd11-463c-8679-9b10fc0993ed,9609e5fb-fd11-463c-8679-9b10fc0993ed,1,0,f438b941-2aae-4c67-81dc-340f6acc25b1,f438b941-2aae-4c67-81dc-340f6acc25b1,1,0,48075630-2041-48c3-9eb0-d2107cfcb249,48075630-2041-48c3-9eb0-d2107cfcb249,1,0,7d7e7e13-eb42-420d-9bfc-14fab901c3c1,7d7e7e13-eb42-420d-9bfc-14fab901c3c1,1,0,aa29e1be-4e99-4136-8dc1-0124908979ad,aa29e1be-4e99-4136-8dc1-0124908979ad,1,0,0d76799d-7fc7-446b-88fb-dca839de00a5,0d76799d-7fc7-446b-88fb-dca839de00a5,1,0,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,1,0,ea4a869c-861c-412c-a3be-de1c57d1a251,ea4a869c-861c-412c-a3be-de1c57d1a251,1,0,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,1,0,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,1,0,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,1,0,50ac390d-324f-40bd-b3df-0468a63b94b6,50ac390d-324f-40bd-b3df-0468a63b94b6,1,0,80337710-2c60-45c4-ae1f-bb42731fb611,80337710-2c60-45c4-ae1f-bb42731fb611,1,0,9dcf467e-7701-4c7b-b747-95f4d9b9295c,9dcf467e-7701-4c7b-b747-95f4d9b9295c,1,0,dd07b255-25af-466e-a224-c561a8ca567b,dd07b255-25af-466e-a224-c561a8ca567b,1,0,77149f7a-8a76-4569-9487-991c41e132ef,77149f7a-8a76-4569-9487-991c41e132ef,1,0,1e9e115a-e65b-4346-b0d3-47cf1dbe75f2,1e9e115a-e65b-4346-b0d3-47cf1dbe75f2,1,0,9e1be65e-986f-4d21-91f0-15c66db0c947,9e1be65e-986f-4d21-91f0-15c66db0c947,1,0,67993b79-6aca-4641-b2e2-0a15f44e47d5,67993b79-6aca-4641-b2e2-0a15f44e47d5,1,0,d2fe4578-a1f8-4586-b052-fa71d25365c9,d2fe4578-a1f8-4586-b052-fa71d25365c9,1,0,f31f3dab-5796-47ac-a54d-3081f8cad817,f31f3dab-5796-47ac-a54d-3081f8cad817,1,0,cd59707e-b9e4-4038-8203-ae22a8060e8d,cd59707e-b9e4-4038-8203-ae22a8060e8d,1,0,db497857-33d3-49a1-b328-dfc62c973ecb,db497857-33d3-49a1-b328-dfc62c973ecb,1,0,139c001c-7b07-465a-9187-399ad32d294f,139c001c-7b07-465a-9187-399ad32d294f,1,0,5d228ce4-069e-4f98-beed-b8e1de17c3d9,5d228ce4-069e-4f98-beed-b8e1de17c3d9,1,0,9770fc09-87bf-4fce-9b0d-410efd30edae,9770fc09-87bf-4fce-9b0d-410efd30edae,1,0,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,1,0,20156709-1481-4007-8e89-9ce79fc589fc,20156709-1481-4007-8e89-9ce79fc589fc,1,0,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,1,0,7e7c5abd-b645-4de5-a40e-5805ec4456e2,7e7c5abd-b645-4de5-a40e-5805ec4456e2,1,0,763a16c3-a728-4b65-a485-705990310b4a,763a16c3-a728-4b65-a485-705990310b4a,1,0,65338920-c744-4d1e-b351-848b90a3feda,65338920-c744-4d1e-b351-848b90a3feda,1,0,2aedb1ac-caf1-45c7-913e-82a36637d5d4,2aedb1ac-caf1-45c7-913e-82a36637d5d4,1,0,65f3ad72-ed03-482b-a2f1-05053eef408a,65f3ad72-ed03-482b-a2f1-05053eef408a,1,0,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,1,0,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,1,0,56177464-5e9f-4598-96bc-eb311993c503,56177464-5e9f-4598-96bc-eb311993c503,1,0,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,1,0,bdfe65f4-4174-4e66-915c-943137981cf0,bdfe65f4-4174-4e66-915c-943137981cf0,1,0,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,1,0,c895d58a-5be1-4157-81af-f4f6db9b4b9e,c895d58a-5be1-4157-81af-f4f6db9b4b9e,1,0,0d89036c-af6e-4709-847c-0dab74a33d72,0d89036c-af6e-4709-847c-0dab74a33d72,1,0,7d223aab-d4f6-41d5-a701-6fe03517cf50,7d223aab-d4f6-41d5-a701-6fe03517cf50,1,0,631cdd15-eb1f-4903-9073-4de3911ba2e6,631cdd15-eb1f-4903-9073-4de3911ba2e6,1,0,6b10ab0a-8d4e-4847-9ce7-663fb4770c35,6b10ab0a-8d4e-4847-9ce7-663fb4770c35,1,0,42630eee-ce93-40a8-b96e-3eb759f48976,42630eee-ce93-40a8-b96e-3eb759f48976,1,0,174e0187-cf34-4949-8dc2-a1f9aece78dc,174e0187-cf34-4949-8dc2-a1f9aece78dc,1,0,5d9f2db6-704d-45cb-96c3-e59e47ad4fea,5d9f2db6-704d-45cb-96c3-e59e47ad4fea,1,0,e4dbeb50-292f-452f-a0da-a55e5ea936e4,e4dbeb50-292f-452f-a0da-a55e5ea936e4,1,0,8ce6cc1a-8570-4704-b9a3-44e815b2e753,8ce6cc1a-8570-4704-b9a3-44e815b2e753,1,0,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,1,0,497cbe4d-586d-48a2-8e98-d20e3e09ed42,497cbe4d-586d-48a2-8e98-d20e3e09ed42,1,0,38b7679d-3739-4572-baf2-d8c7b2a94f0a,38b7679d-3739-4572-baf2-d8c7b2a94f0a,1,0,1470f052-f032-46bc-b1ee-54555e725dfd,1470f052-f032-46bc-b1ee-54555e725dfd,1,0,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,1,0,7d336fdd-5cbf-4c92-a783-f451f7590502,7d336fdd-5cbf-4c92-a783-f451f7590502,1,0,ee8af8ee-e49a-4511-9a91-48814ab99d23,ee8af8ee-e49a-4511-9a91-48814ab99d23,1,0,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,1,0,bc10ad8f-383c-469a-8c0e-60805161055b,bc10ad8f-383c-469a-8c0e-60805161055b,1,0,86760ecb-2ddd-40ce-bc4f-94c23027a55e,86760ecb-2ddd-40ce-bc4f-94c23027a55e,1,0,6fbf844e-ee8d-490f-9177-6392d262312f,6fbf844e-ee8d-490f-9177-6392d262312f,1,0,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,1,0,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,1,0,37722a34-1148-4cc8-95e6-4645ae9cca98,37722a34-1148-4cc8-95e6-4645ae9cca98,1,0,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,1,0,cc34bd23-de0a-4b09-8333-e4693576b9f4,cc34bd23-de0a-4b09-8333-e4693576b9f4,1,0,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,1,0,903af13a-1f73-4145-a3d0-971c3be5fbe6,903af13a-1f73-4145-a3d0-971c3be5fbe6,1,0,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,1,0,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,1,0,953dbad6-4f5c-4319-874a-db358a77d001,953dbad6-4f5c-4319-874a-db358a77d001,1,0,05243f56-7e9b-4a61-8efb-1b5e525fff21,05243f56-7e9b-4a61-8efb-1b5e525fff21,1,0,7aa86a2d-2b47-447e-8901-806411011279,7aa86a2d-2b47-447e-8901-806411011279,1,0,fca0dfad-f853-4694-9ce9-53a3a10f59b7,fca0dfad-f853-4694-9ce9-53a3a10f59b7,1,0,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,1,0,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,1,0,b4cb92fb-ad82-44ed-9203-397b412b3453,b4cb92fb-ad82-44ed-9203-397b412b3453,1,0,69ceac29-06d3-45f2-b914-7966465cd0d3,69ceac29-06d3-45f2-b914-7966465cd0d3,1,0,b690721d-960b-4374-8d2c-feed3a2b354b,b690721d-960b-4374-8d2c-feed3a2b354b,1,0,271243d3-1871-4a0a-bf7f-63bacacf0a59,271243d3-1871-4a0a-bf7f-63bacacf0a59,1,0,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,1,0,5b379a72-8605-4e88-84cb-14272a3b8f5f,5b379a72-8605-4e88-84cb-14272a3b8f5f,1,0,1281fe19-bbca-4a4f-84d8-14187e62000f,1281fe19-bbca-4a4f-84d8-14187e62000f,1,0,ec44f92a-06bf-4a53-a7ba-fbe9846a68a6,ec44f92a-06bf-4a53-a7ba-fbe9846a68a6,1,0,9b7051d5-abc4-416c-a0e6-515d120d78e4,9b7051d5-abc4-416c-a0e6-515d120d78e4,1,0,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,1,0,869938e6-6310-4326-bd15-5b91fe2e0911,869938e6-6310-4326-bd15-5b91fe2e0911,1,0,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,1,0,a156521a-ece1-49d3-8056-1c3508273c45,a156521a-ece1-49d3-8056-1c3508273c45,1,0,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,1,0,10018f80-3138-4089-bf9a-a5f178f1e295,10018f80-3138-4089-bf9a-a5f178f1e295,1,0,43aba109-4b7f-45ef-9c30-8b754e81911b,43aba109-4b7f-45ef-9c30-8b754e81911b,1,0,4ccd72e1-7fd7-4a3b-8428-71b44992937e,4ccd72e1-7fd7-4a3b-8428-71b44992937e,1,0,46077650-2b2c-4319-8279-41f277971669,46077650-2b2c-4319-8279-41f277971669,1,0,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,1,0,612f3b95-d7db-4b33-92b5-4873205b424b,612f3b95-d7db-4b33-92b5-4873205b424b,1,0,d7afa1a6-0ac9-4527-8f1c-5317ce259b52,d7afa1a6-0ac9-4527-8f1c-5317ce259b52,1,0,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,1,0,e82ebd72-7b5a-4f45-b853-1001bf680a05,e82ebd72-7b5a-4f45-b853-1001bf680a05,1,0,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,1,0,e9e9b733-e97a-430d-95ce-45ea27751f64,e9e9b733-e97a-430d-95ce-45ea27751f64,1,0,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,1,0,3dd50c66-27f7-4f1e-86e9-c709995c8609,3dd50c66-27f7-4f1e-86e9-c709995c8609,1,0,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,1,0,ed1369c5-c274-45bd-ae91-7648565ae09f,ed1369c5-c274-45bd-ae91-7648565ae09f,1,0,8d0fce61-a22f-4033-9e03-3f00c4a21722,8d0fce61-a22f-4033-9e03-3f00c4a21722,1,0,bfb3f026-e940-49c3-ac30-408186f9e11e,bfb3f026-e940-49c3-ac30-408186f9e11e,1,0,e1dc83eb-a8cd-454b-8de8-cff2049be78c,e1dc83eb-a8cd-454b-8de8-cff2049be78c,1,0,9edd9288-1463-4d67-b9f0-40f351d978e9,9edd9288-1463-4d67-b9f0-40f351d978e9,1,0,c9db6c68-965f-4567-b26e-5d497a389de1,c9db6c68-965f-4567-b26e-5d497a389de1,1,0,4da2f65d-56bd-4140-9b31-e5ccac4a800a,4da2f65d-56bd-4140-9b31-e5ccac4a800a,1,0,eb163bba-b94c-4a78-9c2d-7b519325e3d4,eb163bba-b94c-4a78-9c2d-7b519325e3d4,1,0,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,1,0,616cd2cc-eaf4-4586-bca1-c044429b491a,616cd2cc-eaf4-4586-bca1-c044429b491a,1,0,939bdb9a-294b-4b42-a56f-030f69bc29c4,939bdb9a-294b-4b42-a56f-030f69bc29c4,1,0,ee7a763b-bcbf-4ff3-89af-eb7965b33515,ee7a763b-bcbf-4ff3-89af-eb7965b33515,1,0,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,1,0,81d900be-ddc1-417f-ae2c-1aacf040de9a,81d900be-ddc1-417f-ae2c-1aacf040de9a,1,0,c65f69ce-be78-4e8d-b91d-293c4108ce77,c65f69ce-be78-4e8d-b91d-293c4108ce77,1,0,521a5717-0b38-401d-bd72-30cee219bd14,521a5717-0b38-401d-bd72-30cee219bd14,1,0,977c30dc-6f27-4931-9fd5-d12ed147e3ec,977c30dc-6f27-4931-9fd5-d12ed147e3ec,1,0,eea4f72e-dd1b-46c7-b270-876a482236b3,eea4f72e-dd1b-46c7-b270-876a482236b3,1,0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,1,0,2d249dad-8b4f-462b-ab13-892639a6e071,2d249dad-8b4f-462b-ab13-892639a6e071,1,0,f6249bf4-d2e7-48f3-808f-d776915d14cb,f6249bf4-d2e7-48f3-808f-d776915d14cb,1,0,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,1,0,883cdeb0-e747-4157-bbe7-0ebc423a82af,883cdeb0-e747-4157-bbe7-0ebc423a82af,1,0,ba62ac73-91da-4dad-abc7-3cf8acf7e315,ba62ac73-91da-4dad-abc7-3cf8acf7e315,1,0,6a71416d-dba1-4883-9264-597ecf9d6270,6a71416d-dba1-4883-9264-597ecf9d6270,1,0,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,1,0,6593baab-fce0-49ed-867e-be242bfc08d7,6593baab-fce0-49ed-867e-be242bfc08d7,1,0,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,1,0,57aed64d-da61-4c18-af21-dab3afdc5c03,57aed64d-da61-4c18-af21-dab3afdc5c03,1,0,452822b4-a590-44db-ab77-d8c01f7300e7,452822b4-a590-44db-ab77-d8c01f7300e7,1,0,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,1,0,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,1,0,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,1,0,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,1,0,19b29d30-e395-42f2-b700-7474bb2cdcb7,19b29d30-e395-42f2-b700-7474bb2cdcb7,1,0,b0deb957-624b-4bcb-824c-76aedf1affe9,b0deb957-624b-4bcb-824c-76aedf1affe9,1,0,9934e608-593d-45d0-9df3-539f0c8fc385,9934e608-593d-45d0-9df3-539f0c8fc385,1,0,80da4126-4319-425f-8427-7d60652cf754,80da4126-4319-425f-8427-7d60652cf754,1,0,05236ace-bcdd-4eb8-a1fb-5843ee311d10,05236ace-bcdd-4eb8-a1fb-5843ee311d10,1,0,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,1,0,449060fd-4711-4b9e-93e0-11b35c314fb3,449060fd-4711-4b9e-93e0-11b35c314fb3,1,0,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,1,0,0614d340-6524-4715-978d-87ab21377e72,0614d340-6524-4715-978d-87ab21377e72,1,0,d47daac5-ec3b-4d4e-8b01-045a37f7074d,d47daac5-ec3b-4d4e-8b01-045a37f7074d,1,0,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,1,0,912cbd30-1ed5-4888-a4b6-98e9215b28e9,912cbd30-1ed5-4888-a4b6-98e9215b28e9,1,0,abf093ce-be63-487d-8be4-be282aa475be,abf093ce-be63-487d-8be4-be282aa475be,1,0,7a910ad6-b922-4716-8140-1540d76296b2,7a910ad6-b922-4716-8140-1540d76296b2,1,0,5189beb9-b939-4f97-aca0-c2f3492ac8b9,5189beb9-b939-4f97-aca0-c2f3492ac8b9,1,0,0b139d7a-b583-4082-b9f2-8f3fb444bd51,0b139d7a-b583-4082-b9f2-8f3fb444bd51,1,0,b8931f98-c1d7-4e9b-be43-065064e7ba95,b8931f98-c1d7-4e9b-be43-065064e7ba95,1,0,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,1,0,60848308-931c-4da3-aa4b-37f6fb4b194f,60848308-931c-4da3-aa4b-37f6fb4b194f,1,0,0761c32c-1de6-4c40-9178-64aeb46b6622,0761c32c-1de6-4c40-9178-64aeb46b6622,1,0,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,1,0,54b14504-503b-45f6-9b5d-785b49829425,54b14504-503b-45f6-9b5d-785b49829425,1,0,80d3ee33-1cdc-4af6-85c2-787094526592,80d3ee33-1cdc-4af6-85c2-787094526592,1,0,c8b28660-6cb0-4ef5-85c2-a75da863ba96,c8b28660-6cb0-4ef5-85c2-a75da863ba96,1,0,1cd607b4-49fc-460e-a014-6afe50083b47,1cd607b4-49fc-460e-a014-6afe50083b47,1,0,a215e767-36e9-4408-9d18-7b4be757022a,a215e767-36e9-4408-9d18-7b4be757022a,1,0,a3e262bc-9f0d-480d-a1d1-c2326105d22d,a3e262bc-9f0d-480d-a1d1-c2326105d22d,1,0,8eae0c79-288b-4773-90bb-49299ad45628,8eae0c79-288b-4773-90bb-49299ad45628,1,0,2faa5594-f1b4-4312-b674-82fdf9623105,2faa5594-f1b4-4312-b674-82fdf9623105,1,0,185c1ad3-b5db-49b6-9342-d08e1bf64903,185c1ad3-b5db-49b6-9342-d08e1bf64903,1,0,3c69a4ad-001d-4421-88f6-412e15d710d6,3c69a4ad-001d-4421-88f6-412e15d710d6,1,0,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,1,0,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,1,0,6a68a08a-ea37-4573-ab9f-ec822f6d250b,6a68a08a-ea37-4573-ab9f-ec822f6d250b,1,0,00e87d04-8104-420b-b2c6-7304889a75b2,00e87d04-8104-420b-b2c6-7304889a75b2,1,0,bde86820-f7bb-463b-97d0-bfa5f8323af0,bde86820-f7bb-463b-97d0-bfa5f8323af0,1,0,b9b24093-810c-4158-846d-e2c7aea54d36,b9b24093-810c-4158-846d-e2c7aea54d36,1,0,289a6aac-dc4e-4fae-8815-853e78d450bb,289a6aac-dc4e-4fae-8815-853e78d450bb,1,0,557e7d89-83ed-45d0-86cc-6e355f14025d,557e7d89-83ed-45d0-86cc-6e355f14025d,1,0,d681b26b-dd8d-46d7-986e-10f05c37a1e4,d681b26b-dd8d-46d7-986e-10f05c37a1e4,1,0,4d3c216e-c04f-4884-8681-1c861c50ce7d,4d3c216e-c04f-4884-8681-1c861c50ce7d,1,0,4a41eee0-c973-4824-a07c-9fcf731f055e,4a41eee0-c973-4824-a07c-9fcf731f055e,1,0,ee756c33-f408-4449-a6bb-3186a0421362,ee756c33-f408-4449-a6bb-3186a0421362,1,0,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,1,0,6ff66622-4d20-4696-9fe9-4b4faeb21d96,6ff66622-4d20-4696-9fe9-4b4faeb21d96,1,0,46237eec-c206-4d21-883c-27599b9ed38c,46237eec-c206-4d21-883c-27599b9ed38c,1,0,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,1,0,8ce759ff-f579-461c-bb1e-9ac2b01e88df,8ce759ff-f579-461c-bb1e-9ac2b01e88df,1,0,8b451909-2c15-48f2-b869-65e7031cc542,8b451909-2c15-48f2-b869-65e7031cc542,1,0,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,1,0,7b377fca-4466-476f-9eb2-0b00141103d6,7b377fca-4466-476f-9eb2-0b00141103d6,1,0,9ce5eceb-f366-4035-956e-62721358b154,9ce5eceb-f366-4035-956e-62721358b154,1,0,8b5358e9-5810-45a7-a49e-fe7fe63c73f3,8b5358e9-5810-45a7-a49e-fe7fe63c73f3,1,0,23afa5f6-9c3f-4f79-885b-b20785fc5e45,23afa5f6-9c3f-4f79-885b-b20785fc5e45,1,0,379a8bf7-b760-43d6-b5c4-6393b00e294f,379a8bf7-b760-43d6-b5c4-6393b00e294f,1,0,e44b737f-9076-4070-94ba-ed0b00e60393,e44b737f-9076-4070-94ba-ed0b00e60393,1,0,5582e533-b908-40c9-8c81-876906f0d47e,5582e533-b908-40c9-8c81-876906f0d47e,1,0,71656b8b-2d9b-4ac9-884d-72f47b9c69b7,71656b8b-2d9b-4ac9-884d-72f47b9c69b7,1,0,e0797541-88c2-4ad9-9ff4-d56899e6a6ee,e0797541-88c2-4ad9-9ff4-d56899e6a6ee,1,0,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,1,0,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,1,0,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1,0,d915d338-3e4c-45c3-aef5-a07cf41b05f6,d915d338-3e4c-45c3-aef5-a07cf41b05f6,1,0,28080e64-cd09-410d-9e3e-3ffdb43d3ace,28080e64-cd09-410d-9e3e-3ffdb43d3ace,1,0,9cfd3d38-4e0e-40f4-ae77-7a997646e4b2,9cfd3d38-4e0e-40f4-ae77-7a997646e4b2,1,0,978640a2-5c4b-4e21-857e-34f00840fba8,978640a2-5c4b-4e21-857e-34f00840fba8,1,0,da2913e3-a29b-423f-9aae-08fed56a7d90,da2913e3-a29b-423f-9aae-08fed56a7d90,1,0,149e72b8-cc03-4b4f-8ca4-07987600c34d,149e72b8-cc03-4b4f-8ca4-07987600c34d,1,0,7649bd7b-fe8c-4338-80fc-153160a5e538,7649bd7b-fe8c-4338-80fc-153160a5e538,1,0,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,1,0,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,1,0,6137605e-4850-44ec-b4ee-048bd8e0ec3a,6137605e-4850-44ec-b4ee-048bd8e0ec3a,1,0,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,1,0,0e6e9372-beb4-478e-9428-71b19a60739b,0e6e9372-beb4-478e-9428-71b19a60739b,1,0,32b11498-542f-46b2-829f-1525936ab7fa,32b11498-542f-46b2-829f-1525936ab7fa,1,0,64afa916-4750-4008-8c6c-2a470fb11283,64afa916-4750-4008-8c6c-2a470fb11283,1,0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,1,0,35354abc-9a76-4ee8-8796-c24b37365ea0,35354abc-9a76-4ee8-8796-c24b37365ea0,1,0,7078977f-31bf-427e-ac37-e309d81fe999,7078977f-31bf-427e-ac37-e309d81fe999,1,0,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,1,0,d8854555-9e15-4d82-a1fd-656a848a8e8a,d8854555-9e15-4d82-a1fd-656a848a8e8a,1,0,53191842-ea05-4491-84d7-071cd201992d,53191842-ea05-4491-84d7-071cd201992d,1,0,86c70449-4cf7-4baf-9742-b82b134ed929,86c70449-4cf7-4baf-9742-b82b134ed929,1,0,af3b1881-163a-4c07-a1d9-77ceadf59c77,af3b1881-163a-4c07-a1d9-77ceadf59c77,1,0,d3443b92-32f5-4ac0-8356-062647efe3d8,d3443b92-32f5-4ac0-8356-062647efe3d8,1,0,b78be6fb-7db8-48c8-ba7b-aab1fea34890,b78be6fb-7db8-48c8-ba7b-aab1fea34890,1,0,bd27276a-e80c-4135-b341-f99a816ffe86,bd27276a-e80c-4135-b341-f99a816ffe86,1,0,35306678-147c-4ad1-a3c6-c80a11afa22f,35306678-147c-4ad1-a3c6-c80a11afa22f,1,0,0da75726-ae71-4d83-a696-a774c787a8a2,0da75726-ae71-4d83-a696-a774c787a8a2,1,0,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,1,0,896a7267-0198-4cbb-b6e6-7aa157c0cc61,896a7267-0198-4cbb-b6e6-7aa157c0cc61,1,0,2005bf54-219b-4111-bff1-e12e2c6dca3e,2005bf54-219b-4111-bff1-e12e2c6dca3e,1,0,abab8f73-d705-4350-b44d-f912649a2190,abab8f73-d705-4350-b44d-f912649a2190,1,0,20c9c25c-f8c9-429f-84bd-543cb809abef,20c9c25c-f8c9-429f-84bd-543cb809abef,1,0,dc5f451e-3275-43a8-9f48-45b83220d461,dc5f451e-3275-43a8-9f48-45b83220d461,1,0,028f5e81-61df-4d13-876d-781c5fd18ee6,028f5e81-61df-4d13-876d-781c5fd18ee6,1,0,3cbb59ef-7f64-4590-8a54-ba01e78283c3,3cbb59ef-7f64-4590-8a54-ba01e78283c3,1,0,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,1,0,388eb513-fadb-40cd-8a7b-33b904dd758e,388eb513-fadb-40cd-8a7b-33b904dd758e,1,0,0613c6aa-e1fe-4632-a396-a17ec773158f,0613c6aa-e1fe-4632-a396-a17ec773158f,1,0,1a330987-4c79-4ab7-b250-db8d32c78751,1a330987-4c79-4ab7-b250-db8d32c78751,1,0,b7295e8e-0aa4-4a49-81ea-0594a358e9ca,b7295e8e-0aa4-4a49-81ea-0594a358e9ca,1,0,555062ed-9a04-41d8-877f-0a667e9a08cd,555062ed-9a04-41d8-877f-0a667e9a08cd,1,0,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,1,0,ac160e1c-fef7-4625-84e0-964b397f6bdb,ac160e1c-fef7-4625-84e0-964b397f6bdb,1,0,b8946d9c-dda8-4b94-8cbf-db62b647c53e,b8946d9c-dda8-4b94-8cbf-db62b647c53e,1,0,24215916-7732-4030-9f88-163f644e94f7,24215916-7732-4030-9f88-163f644e94f7,1,0,69697945-9748-4cea-a20f-e244b46de2e8,69697945-9748-4cea-a20f-e244b46de2e8,1,0,68538fd1-262c-43ea-b09f-8a66643a0062,68538fd1-262c-43ea-b09f-8a66643a0062,1,0,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,1,0,82ad24cc-d9f8-440b-a720-e204101d85da,82ad24cc-d9f8-440b-a720-e204101d85da,1,0,aa63c001-c3da-4179-8fd8-fe2ff510511e,aa63c001-c3da-4179-8fd8-fe2ff510511e,1,0,b2e894b0-6443-4a52-95b6-6b564f809680,b2e894b0-6443-4a52-95b6-6b564f809680,1,0,8010065f-aec8-4768-85ec-9eb7b2b01e7e,8010065f-aec8-4768-85ec-9eb7b2b01e7e,1,0,a44348cb-e20c-4afd-8483-3b9c735b352c,a44348cb-e20c-4afd-8483-3b9c735b352c,1,0,ebfe4c74-6e16-4b64-8a52-cea95c446903,ebfe4c74-6e16-4b64-8a52-cea95c446903,1,0,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,1,0,d912e472-9553-4b96-8b16-7aaff6c14239,d912e472-9553-4b96-8b16-7aaff6c14239,1,0,b04018b5-a74d-43c9-8519-6cc8aa23fe09,b04018b5-a74d-43c9-8519-6cc8aa23fe09,1,0,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,1,0,9283277f-2b75-4c3a-810a-8d4071b3afcc,9283277f-2b75-4c3a-810a-8d4071b3afcc,1,0,d03d5b18-57a2-43c0-99ea-8ad9d5788179,d03d5b18-57a2-43c0-99ea-8ad9d5788179,1,0,c491a7fc-14f9-498a-b7dd-575dfc66878e,c491a7fc-14f9-498a-b7dd-575dfc66878e,1,0,db15f8eb-4736-4b47-9cee-3e6883f0888c,db15f8eb-4736-4b47-9cee-3e6883f0888c,1,0,59064eb2-2770-4f1c-96bd-801926fe68ef,59064eb2-2770-4f1c-96bd-801926fe68ef,1,0,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,1,0,8a8848b8-345a-452d-bf95-28f9c91c7e95,8a8848b8-345a-452d-bf95-28f9c91c7e95,1,0,a9441693-87ca-4157-98e1-63375852755c,a9441693-87ca-4157-98e1-63375852755c,1,0,6303ea55-e8ed-4acc-9717-941eefafc2a9,6303ea55-e8ed-4acc-9717-941eefafc2a9,1,0,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,1,0,d0b17206-3949-4513-a47f-02e1a8ba369a,d0b17206-3949-4513-a47f-02e1a8ba369a,1,0,cb4f20d4-13e6-4c27-b491-da7931f4bf05,cb4f20d4-13e6-4c27-b491-da7931f4bf05,1,0,6b2340d7-687f-43a3-8eb8-8ddb86712466,6b2340d7-687f-43a3-8eb8-8ddb86712466,1,0,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,1,0,9328da5c-4689-4a60-8136-ae9eac46ab38,9328da5c-4689-4a60-8136-ae9eac46ab38,1,0,ca5d586f-81bb-40ee-b3bd-de854857c984,ca5d586f-81bb-40ee-b3bd-de854857c984,1,0,32c10512-7bb8-423b-9503-ab2fa41386a4,32c10512-7bb8-423b-9503-ab2fa41386a4,1,0,888edfc4-8140-4675-b267-c32bf1d8d29d,888edfc4-8140-4675-b267-c32bf1d8d29d,1,0,2abbd53a-0ead-42af-8df6-fde663aea300,2abbd53a-0ead-42af-8df6-fde663aea300,1,0,24611bf9-5492-443a-935c-a0058e86493f,24611bf9-5492-443a-935c-a0058e86493f,1,0,42641296-64da-46e0-a407-de2d492f9c90,42641296-64da-46e0-a407-de2d492f9c90,1,0,b834af0b-086c-445d-a271-7e178c324551,b834af0b-086c-445d-a271-7e178c324551,1,0,ec34befe-3c0b-4a75-b943-840c52e7dda5,ec34befe-3c0b-4a75-b943-840c52e7dda5,1,0,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,1,0,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,1,0,6733f1bd-7878-4a33-8995-c07526e87c1a,6733f1bd-7878-4a33-8995-c07526e87c1a,1,0,f7e73257-fae1-465a-ae74-faaa0273a416,f7e73257-fae1-465a-ae74-faaa0273a416,1,0,73f89524-dbe8-426f-8ee6-1277eb1967cc,73f89524-dbe8-426f-8ee6-1277eb1967cc,1,0,ee7d970c-cef7-4740-a357-1fe78f88a6e6,ee7d970c-cef7-4740-a357-1fe78f88a6e6,1,0,13beb01d-dd08-4a6d-863b-651e70bbf51f,13beb01d-dd08-4a6d-863b-651e70bbf51f,1,0,94bc76ae-72a0-418f-98c4-ae0a0326a2da,94bc76ae-72a0-418f-98c4-ae0a0326a2da,1,0,784475ff-eec5-462a-a511-ba31f8374c2e,784475ff-eec5-462a-a511-ba31f8374c2e,1,0,b5b56a64-5550-4da9-8872-d42ab871d21c,b5b56a64-5550-4da9-8872-d42ab871d21c,1,0,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,1,0,45a8c780-c067-40d7-bbe9-81f854aacf7a,45a8c780-c067-40d7-bbe9-81f854aacf7a,1,0,57885cac-059a-4a08-aa2c-43b116d2c777,57885cac-059a-4a08-aa2c-43b116d2c777,1,0,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,1,0,27e0b5d9-1a4c-45b8-8969-d1d1c39129c1,27e0b5d9-1a4c-45b8-8969-d1d1c39129c1,1,0,626cbb27-6af2-4a9a-959e-15af4417e489,626cbb27-6af2-4a9a-959e-15af4417e489,1,0,e7b0ae70-0192-456c-9dc5-e66049fa9df2,e7b0ae70-0192-456c-9dc5-e66049fa9df2,1,0,68944d09-618e-4fa3-a7af-8c84218e0ac7,68944d09-618e-4fa3-a7af-8c84218e0ac7,1,0,91b12ce3-e8ba-4c9d-9daa-1d5532500314,91b12ce3-e8ba-4c9d-9daa-1d5532500314,1,0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,1,0,356a8091-4c0b-41d0-b8d2-963b3a807469,356a8091-4c0b-41d0-b8d2-963b3a807469,1,0,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,1,0,cb57aabc-eeef-42b4-9bc2-873cebd9618c,cb57aabc-eeef-42b4-9bc2-873cebd9618c,1,0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,1,0,52f30ed7-aa16-4ce2-9684-e50229ab0015,52f30ed7-aa16-4ce2-9684-e50229ab0015,1,0,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,1,0,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0526492c-be48-4c84-8d68-19fa1c7e9d6e,1,0,54ecaf7b-9bc5-483c-96e1-270bcd323590,54ecaf7b-9bc5-483c-96e1-270bcd323590,1,0,f00e93bf-6e3b-4819-a4e1-33471a6d0fff,f00e93bf-6e3b-4819-a4e1-33471a6d0fff,1,0,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,1,0,58f6f8fa-7473-40f5-973a-6279335d8f33,58f6f8fa-7473-40f5-973a-6279335d8f33,1,0,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,1,0,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1,0,fa3632fe-185b-49aa-85ae-dfb721835d40,fa3632fe-185b-49aa-85ae-dfb721835d40,1,0,a4f15108-477c-465e-aaea-cb495ef52cf5,a4f15108-477c-465e-aaea-cb495ef52cf5,1,0,9cda5c2c-f401-4f63-b445-cef160296e48,9cda5c2c-f401-4f63-b445-cef160296e48,1,0,e8ae4a26-3127-43ae-af7a-c2e278d2611d,e8ae4a26-3127-43ae-af7a-c2e278d2611d,1,0,b923c78f-d074-41b4-b832-086686258f19,b923c78f-d074-41b4-b832-086686258f19,1,0,8ff96413-6fdd-4b8d-a181-ea0d8633defc,8ff96413-6fdd-4b8d-a181-ea0d8633defc,1,0,54604ed2-766b-4308-b99e-447817d82799,54604ed2-766b-4308-b99e-447817d82799,1,0,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,1,0,ee008096-1ae8-4a64-9d3d-14cb15c8be70,ee008096-1ae8-4a64-9d3d-14cb15c8be70,1,0,a0a85b22-63ee-4a05-8b0d-1feb9ee07b0a,a0a85b22-63ee-4a05-8b0d-1feb9ee07b0a,1,0,a4754a7b-971f-4517-963e-b7cb9d57f86d,a4754a7b-971f-4517-963e-b7cb9d57f86d,1,0,f48b4475-2cd9-41df-962a-6529f84985ca,f48b4475-2cd9-41df-962a-6529f84985ca,1,0,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,1,0,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,1,0,bf94feb9-edf7-4df8-b5f5-805613663a0a,bf94feb9-edf7-4df8-b5f5-805613663a0a,1,0,6d852a13-c85e-4e84-8396-f91c1ed0596e,6d852a13-c85e-4e84-8396-f91c1ed0596e,1,0,9c2d5313-a4fd-417e-a340-ad4980d0028b,9c2d5313-a4fd-417e-a340-ad4980d0028b,1,0,4fb4a280-9426-4c41-a9ba-11f9d01a0740,4fb4a280-9426-4c41-a9ba-11f9d01a0740,1,0,1591ee7e-870c-4bf7-9450-be84f1b2506f,1591ee7e-870c-4bf7-9450-be84f1b2506f,1,0,7e32c295-a769-4cff-a3eb-992f7031475f,7e32c295-a769-4cff-a3eb-992f7031475f,1,0,5a398637-a06c-4442-9093-a864fa7f049f,5a398637-a06c-4442-9093-a864fa7f049f,1,0,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,1,0,115a6019-ef87-4126-8ebf-070c1e882940,115a6019-ef87-4126-8ebf-070c1e882940,1,0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,1,0,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,1,0,67efa786-312f-4c9c-b970-0320e92069af,67efa786-312f-4c9c-b970-0320e92069af,1,0,5b952e35-1037-4447-8293-6d8889692c8b,5b952e35-1037-4447-8293-6d8889692c8b,1,0,2bc2ca58-6cc0-4d4b-8672-f9328c86c2c1,2bc2ca58-6cc0-4d4b-8672-f9328c86c2c1,1,0,05bc8b4e-8c90-4502-8b16-7b1e7625d569,05bc8b4e-8c90-4502-8b16-7b1e7625d569,1,0,ce34d88d-3017-4197-a962-ea23a6a96d32,ce34d88d-3017-4197-a962-ea23a6a96d32,1,0,2cbc16da-aa67-4ad6-82f8-fa6922447be6,2cbc16da-aa67-4ad6-82f8-fa6922447be6,1,0,19d7a1ba-c343-4575-95da-53dac6d4b2cb,19d7a1ba-c343-4575-95da-53dac6d4b2cb,1,0,6cc8b3a0-3377-4b39-b6b0-69c862a15465,6cc8b3a0-3377-4b39-b6b0-69c862a15465,1,0,acb193f4-52e5-4572-a79b-b825a2f6525f,acb193f4-52e5-4572-a79b-b825a2f6525f,1,0,5d46f719-e468-48e2-b4ec-acb85c710451,5d46f719-e468-48e2-b4ec-acb85c710451,1,0,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,1,0,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,1,0,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,1,0,733d4494-01e2-46f5-a49b-f289267a90c9,733d4494-01e2-46f5-a49b-f289267a90c9,1,0,1e14d062-1d5a-4939-8ce6-4d9514990376,1e14d062-1d5a-4939-8ce6-4d9514990376,1,0,f86f24d2-9a83-47ae-9d95-b49a0a295770,f86f24d2-9a83-47ae-9d95-b49a0a295770,1,0,8368e1fa-da0c-4a9b-9d50-a122933c7899,8368e1fa-da0c-4a9b-9d50-a122933c7899,1,0,37986729-a275-4e86-8613-faee9a4f2525,37986729-a275-4e86-8613-faee9a4f2525,1,0,5814cb3a-8f7c-45b4-a590-b69d4912120f,5814cb3a-8f7c-45b4-a590-b69d4912120f,1,0,f06c8396-65ec-4ece-aed0-d45b2d8969b5,f06c8396-65ec-4ece-aed0-d45b2d8969b5,1,0,1faeab7f-7bd7-496d-8882-4aab6c425854,1faeab7f-7bd7-496d-8882-4aab6c425854,1,0,af922fb8-a99c-4154-89fe-d30a4d13024a,af922fb8-a99c-4154-89fe-d30a4d13024a,1,0,24c2f463-2bbb-471f-a409-507afad52caf,24c2f463-2bbb-471f-a409-507afad52caf,1,0,cbb07013-9ae1-43ec-8142-a724d788cb67,cbb07013-9ae1-43ec-8142-a724d788cb67,1,0,2403ac84-b513-4aa0-9a68-8d1ad705ce24,2403ac84-b513-4aa0-9a68-8d1ad705ce24,1,0,952b49e0-e1a1-4130-8fb2-083e3988255c,952b49e0-e1a1-4130-8fb2-083e3988255c,1,0,367b227f-f66e-4cec-9fc3-850bca8bc6c8,367b227f-f66e-4cec-9fc3-850bca8bc6c8,1,0,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1,0,7fcb9d79-1144-4099-8d7f-309d3bf045a5,7fcb9d79-1144-4099-8d7f-309d3bf045a5,1,0,db418313-8583-48a9-9fec-e2c5de4fdf76,db418313-8583-48a9-9fec-e2c5de4fdf76,1,0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,1,0,2f26970e-b964-43e2-8d6d-999bbc577689,2f26970e-b964-43e2-8d6d-999bbc577689,1,0,65a50026-88e7-45dd-bb0c-f212218ca093,65a50026-88e7-45dd-bb0c-f212218ca093,1,0,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,1,0,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1,0,5c17a594-eb0b-4cdf-af35-0eaba968e065,5c17a594-eb0b-4cdf-af35-0eaba968e065,1,0,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,1,0,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,1,0,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,1,0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,1,0,01a1fd57-6c09-4a5b-9f75-da4366159423,01a1fd57-6c09-4a5b-9f75-da4366159423,1,0,71d79b25-3682-4f2c-b6b2-a307e3e72844,71d79b25-3682-4f2c-b6b2-a307e3e72844,1,0,45c1ed0d-202e-4289-820f-e1de0f544386,45c1ed0d-202e-4289-820f-e1de0f544386,1,0,e889e80f-97c9-43c6-8268-d652764fcafb,e889e80f-97c9-43c6-8268-d652764fcafb,1,0,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,1,0,95ccaaf2-f6ca-4540-8a39-3c90121c4236,95ccaaf2-f6ca-4540-8a39-3c90121c4236,1,0,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,1,0,f47a9bec-2a9f-4955-a432-acb63a5b0e46,f47a9bec-2a9f-4955-a432-acb63a5b0e46,1,0,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1,0,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,1,0,b787818e-5572-4ef2-ba54-1e9b69569824,b787818e-5572-4ef2-ba54-1e9b69569824,1,0,1e13bd37-61b5-4901-a607-e00e5d1900a8,1e13bd37-61b5-4901-a607-e00e5d1900a8,1,0,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,1,0,231d7b21-c00c-4782-b610-d56593be436f,231d7b21-c00c-4782-b610-d56593be436f,1,0,79250d1a-77ff-4015-a5b5-83460b1611e2,79250d1a-77ff-4015-a5b5-83460b1611e2,1,0,60018ee0-71ec-4975-a95d-f6f188748ff2,60018ee0-71ec-4975-a95d-f6f188748ff2,1,0,68d35468-279a-43ef-9d71-fed44a792177,68d35468-279a-43ef-9d71-fed44a792177,1,0,77bec3d8-582a-4156-861b-4902008f014c,77bec3d8-582a-4156-861b-4902008f014c,1,0,2ad1caba-7a89-4389-934f-419970260961,2ad1caba-7a89-4389-934f-419970260961,1,0,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,1,0,f88c4a72-368c-4f45-bb2c-d18f214a5079,f88c4a72-368c-4f45-bb2c-d18f214a5079,1,0,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,1,0,9dc2e313-c086-4fd9-83e8-911859ef480d,9dc2e313-c086-4fd9-83e8-911859ef480d,1,0,8a14ced0-9e45-4b3a-a135-11413c3a33c2,8a14ced0-9e45-4b3a-a135-11413c3a33c2,1,0,af7377db-0b27-42f7-a639-e2feb4015412,af7377db-0b27-42f7-a639-e2feb4015412,1,0,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,1,0,ab7db146-f26a-418a-8c45-e2513bf84e08,ab7db146-f26a-418a-8c45-e2513bf84e08,1,0,ece3bd8d-6616-44d5-9c14-6b3557738872,ece3bd8d-6616-44d5-9c14-6b3557738872,1,0,663a80ba-b97e-4265-a627-4a7d273f9472,663a80ba-b97e-4265-a627-4a7d273f9472,1,0,bf3304c0-5078-478f-bbf8-6178264c5f26,bf3304c0-5078-478f-bbf8-6178264c5f26,1,0,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,1,0,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,1,0,4893ad50-df19-4d86-9469-40491ba733c9,4893ad50-df19-4d86-9469-40491ba733c9,1,0,25a65c1e-8e67-4135-843d-1e0da72dfd64,25a65c1e-8e67-4135-843d-1e0da72dfd64,1,0,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,1,0,29a6416e-b0f5-4111-8f86-1ba80244e73a,29a6416e-b0f5-4111-8f86-1ba80244e73a,1,0,0f49085a-9b83-4256-be60-f341b2ef132e,0f49085a-9b83-4256-be60-f341b2ef132e,1,0,f44c66d6-cfe2-482f-a921-de3db3cd09ea,f44c66d6-cfe2-482f-a921-de3db3cd09ea,1,0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,1,0,c521bd61-386e-41c8-bcc3-29d54b63cc32,c521bd61-386e-41c8-bcc3-29d54b63cc32,1,0,d46e3424-6d30-4229-9a56-ab256517534a,d46e3424-6d30-4229-9a56-ab256517534a,1,0,09d3633d-8e8c-47f3-8f34-d70eb94577e1,09d3633d-8e8c-47f3-8f34-d70eb94577e1,1,0,fe868143-363b-4da1-889b-98d4dd10a1fd,fe868143-363b-4da1-889b-98d4dd10a1fd,1,0,b791a549-ae94-46f2-8f04-771fdeb4cc54,b791a549-ae94-46f2-8f04-771fdeb4cc54,1,0,4681cb63-c581-4c08-b18c-016d9b478ef2,4681cb63-c581-4c08-b18c-016d9b478ef2,1,0,04055821-03ce-4049-af2c-8670c80517f6,04055821-03ce-4049-af2c-8670c80517f6,1,0,0101305d-62eb-4802-9cd4-d615a518d842,0101305d-62eb-4802-9cd4-d615a518d842,1,0,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,1,0,1d429511-9446-4102-95f4-df676125e14c,1d429511-9446-4102-95f4-df676125e14c,1,0,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,1,0,7c424424-9660-462d-9cf2-4c1e6bd284fa,7c424424-9660-462d-9cf2-4c1e6bd284fa,1,0,e118f957-ab2c-473b-ab64-37032f727416,e118f957-ab2c-473b-ab64-37032f727416,1,0,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,1,0,21f64e5f-dc94-4ce9-b836-e75646ae3325,21f64e5f-dc94-4ce9-b836-e75646ae3325,1,0,82e8a180-f2e1-406c-9609-89d33504aff2,82e8a180-f2e1-406c-9609-89d33504aff2,1,0,e7437c81-3d5b-466e-880c-8febe4a68e88,e7437c81-3d5b-466e-880c-8febe4a68e88,1,0,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,1,0,307771e6-bcf7-4016-b369-e1655bbe9e94,307771e6-bcf7-4016-b369-e1655bbe9e94,1,0,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,1,0,38fc6a54-846c-40b0-9254-3261f540bf18,38fc6a54-846c-40b0-9254-3261f540bf18,1,0,d9134d0c-56cd-4b8f-ab11-ae37fc306801,d9134d0c-56cd-4b8f-ab11-ae37fc306801,1,0,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,1,0,8f2af24b-f5fa-4f6d-831e-28453bdedefc,8f2af24b-f5fa-4f6d-831e-28453bdedefc,1,0,d119e21d-0087-4f22-b3bd-b14707b65330,d119e21d-0087-4f22-b3bd-b14707b65330,1,0,dc9b4072-11de-40fe-bf2a-f7b15af0a250,dc9b4072-11de-40fe-bf2a-f7b15af0a250,1,0,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,1,0,aa0e290d-21ab-4197-b8f3-cf1f97ab1b98,aa0e290d-21ab-4197-b8f3-cf1f97ab1b98,1,0,eefa9859-4168-4a10-923f-e4a713c99a3b,eefa9859-4168-4a10-923f-e4a713c99a3b,1,0,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,1,0,932b1c1a-72eb-49cd-8218-d0ced9c454d8,932b1c1a-72eb-49cd-8218-d0ced9c454d8,1,0,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,1,0,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,1,0,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,1,0,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,1,0,5dd336c4-88c5-4f53-acf0-5f86a658c528,5dd336c4-88c5-4f53-acf0-5f86a658c528,1,0,c723112b-286d-46f1-989d-81252062a025,c723112b-286d-46f1-989d-81252062a025,1,0,67e8b47e-4bad-4b2f-b196-8a9708893051,67e8b47e-4bad-4b2f-b196-8a9708893051,1,0,39bddcde-697c-4e77-adfd-e4a77529ea97,39bddcde-697c-4e77-adfd-e4a77529ea97,1,0,a3b15381-bf9b-4b26-96eb-392fa2cc8223,a3b15381-bf9b-4b26-96eb-392fa2cc8223,1,0,a583e53a-3f3c-48c7-8928-37ce40b2bafe,a583e53a-3f3c-48c7-8928-37ce40b2bafe,1,0,a844dd4a-274a-4894-9446-031dbe006084,a844dd4a-274a-4894-9446-031dbe006084,1,0,9a740f81-5437-47af-8ed9-ea62edcb2ea1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,1,0,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,1,0,77bdd30f-4933-4bda-9c7a-b0a097da0910,77bdd30f-4933-4bda-9c7a-b0a097da0910,1,0,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,1,0,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,1,0,8e9eb604-5f15-4ef5-8906-5bcd57b3d099,8e9eb604-5f15-4ef5-8906-5bcd57b3d099,1,0,a682e9e1-284f-4e32-86b2-6736f159f585,a682e9e1-284f-4e32-86b2-6736f159f585,1,0,84f0bd89-9b86-440f-b942-9b685e22233e,84f0bd89-9b86-440f-b942-9b685e22233e,1,0,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,1,0,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,1,0,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,1,0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,1,0,fabf8a0b-366f-4f23-9377-315534bb854b,fabf8a0b-366f-4f23-9377-315534bb854b,1,0,7aac6439-64c9-4492-b866-bf91dda82d06,7aac6439-64c9-4492-b866-bf91dda82d06,1,0,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,1,0,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,1,0,08b86f29-64ef-467a-af1a-d27ffdf621ba,08b86f29-64ef-467a-af1a-d27ffdf621ba,1,0,6483d1ab-c53d-4985-ad7e-b799adbcd9da,6483d1ab-c53d-4985-ad7e-b799adbcd9da,1,0,82f66233-ed13-49ae-ab72-7cf91c88c760,82f66233-ed13-49ae-ab72-7cf91c88c760,1,0,75cddbcd-e960-4164-81d8-ac0a2a36e95b,75cddbcd-e960-4164-81d8-ac0a2a36e95b,1,0,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,1,0,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,1,0,d9151001-a911-45c1-a8e6-dcf0da623ed3,d9151001-a911-45c1-a8e6-dcf0da623ed3,1,0,42f4ad3c-3724-4032-82f0-10c8dbe6cc9f,42f4ad3c-3724-4032-82f0-10c8dbe6cc9f,1,0,bbd8b83d-413a-4ffc-8351-e0ec4f4ae619,bbd8b83d-413a-4ffc-8351-e0ec4f4ae619,1,0,c49cef0d-3b71-4e66-9e35-72b94920dae5,c49cef0d-3b71-4e66-9e35-72b94920dae5,1,0,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,1,0,e589a693-ff50-4c36-ae26-a8fcae966d57,e589a693-ff50-4c36-ae26-a8fcae966d57,1,0,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,1,0,90f023f5-5b48-4f98-bfc6-b704277a355d,90f023f5-5b48-4f98-bfc6-b704277a355d,1,0,99485603-706d-4301-be25-82b1c0ee8f4d,99485603-706d-4301-be25-82b1c0ee8f4d,1,0,e7a28021-c75e-41b2-9974-cf4beee34d28,e7a28021-c75e-41b2-9974-cf4beee34d28,1,0,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,1,0,2a603c61-4cbf-4c6d-a0b2-40c835d36737,2a603c61-4cbf-4c6d-a0b2-40c835d36737,1,0,a8d7f071-401b-499e-957c-d077d8002e54,a8d7f071-401b-499e-957c-d077d8002e54,1,0,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,1,0,b363f72f-3629-453c-9f7d-9828ef6de733,b363f72f-3629-453c-9f7d-9828ef6de733,1,0,211a539b-4be9-4816-98f6-f756e65eafd8,211a539b-4be9-4816-98f6-f756e65eafd8,1,0,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,1,0,e9b9da80-7806-4c9c-a002-01cfa3109169,e9b9da80-7806-4c9c-a002-01cfa3109169,1,0,a271041d-0203-4ecd-bb39-70256c50192e,a271041d-0203-4ecd-bb39-70256c50192e,1,0,c6c26c3c-de7a-4ed4-944d-ada62cf1ab8f,c6c26c3c-de7a-4ed4-944d-ada62cf1ab8f,1,0,a54872fc-4e7e-4829-8564-1b2e7f0ee134,a54872fc-4e7e-4829-8564-1b2e7f0ee134,1,0,fe10d76e-3f80-4529-83a8-74c452a781f6,fe10d76e-3f80-4529-83a8-74c452a781f6,1,0,e3d1a7f5-ba86-414e-b2d2-89cc9db51667,e3d1a7f5-ba86-414e-b2d2-89cc9db51667,1,0,13333d66-ff04-49ec-973a-1229da8c9f50,13333d66-ff04-49ec-973a-1229da8c9f50,1,0,73eff626-a363-4a5a-879e-61ef6ce0726f,73eff626-a363-4a5a-879e-61ef6ce0726f,1,0,acf15b79-a6c4-4c46-8013-50d3b223baf6,acf15b79-a6c4-4c46-8013-50d3b223baf6,1,0,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,1,0,2d8d5d74-2bc0-4282-af66-e4a37694c147,2d8d5d74-2bc0-4282-af66-e4a37694c147,1,0,cfd31341-287b-4684-9ac0-b28b4e066f15,cfd31341-287b-4684-9ac0-b28b4e066f15,1,0,81de1b0b-7f2d-4098-ae99-061c6a90dc29,81de1b0b-7f2d-4098-ae99-061c6a90dc29,1,0,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,1,0,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,1,0,dd0610c8-cd87-4fe2-8a1f-70157132785b,dd0610c8-cd87-4fe2-8a1f-70157132785b,1,0,f829e2a9-5bdb-4171-8b32-8d10d5968813,f829e2a9-5bdb-4171-8b32-8d10d5968813,1,0,647ba8f8-57f7-4c19-af59-525517c1e392,647ba8f8-57f7-4c19-af59-525517c1e392,1,0,39062cb3-4ae8-4c0d-889b-038a55179946,39062cb3-4ae8-4c0d-889b-038a55179946,1,0,c62d4212-36ca-4afb-bac9-269b6f64ca51,c62d4212-36ca-4afb-bac9-269b6f64ca51,1,0,5cec5e16-46ad-4f8c-b869-f5b1cc487884,5cec5e16-46ad-4f8c-b869-f5b1cc487884,1,0,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,1,0,7aacdf81-49fd-47a3-a36a-c483f1b05872,7aacdf81-49fd-47a3-a36a-c483f1b05872,1,0,857015e2-afb2-403d-bfb7-7acb5080797b,857015e2-afb2-403d-bfb7-7acb5080797b,1,0,5657286b-114b-41de-ab7d-45d0f0d95e2d,5657286b-114b-41de-ab7d-45d0f0d95e2d,1,0,42a0271e-6783-44db-95c1-09805ae01f58,42a0271e-6783-44db-95c1-09805ae01f58,1,0,8628783e-4fad-4dff-8220-9e0ddc8580f8,8628783e-4fad-4dff-8220-9e0ddc8580f8,1,0,356fc245-3034-42d1-84d0-632c6dc7a3d5,356fc245-3034-42d1-84d0-632c6dc7a3d5,1,0,07462664-6b58-4f5a-9b3f-2e5c376f17df,07462664-6b58-4f5a-9b3f-2e5c376f17df,1,0,6f23e946-f700-424b-b9bf-3a9c8846908d,6f23e946-f700-424b-b9bf-3a9c8846908d,1,0,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,1,0,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,1,0,2aafb1a1-4321-47e9-9783-03ab616a2873,2aafb1a1-4321-47e9-9783-03ab616a2873,1,0,71109997-6da0-4eaf-bbf2-f94fa24f37cc,71109997-6da0-4eaf-bbf2-f94fa24f37cc,1,0,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,1,0,d601281c-379d-4a9d-843e-478fd6567415,d601281c-379d-4a9d-843e-478fd6567415,1,0,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,1,0,427e6f15-334e-42be-9554-895d8f7ebfc6,427e6f15-334e-42be-9554-895d8f7ebfc6,1,0,02abb5e3-9d4e-4c45-af19-71796966ed19,02abb5e3-9d4e-4c45-af19-71796966ed19,1,0,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,1,0,36bc8523-41a5-48ff-9bd0-758d078c4408,36bc8523-41a5-48ff-9bd0-758d078c4408,1,0,94ca1b45-3cf0-4857-8299-999c93f4fb56,94ca1b45-3cf0-4857-8299-999c93f4fb56,1,0,ee8419c6-79ca-4546-9a66-bacaa08d2a73,ee8419c6-79ca-4546-9a66-bacaa08d2a73,1,0,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,1,0,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,1,0,ada11ea2-94d5-4172-a383-a51774599568,ada11ea2-94d5-4172-a383-a51774599568,1,0,50515bbc-43ee-4b00-bfc5-105b7981bd8f,50515bbc-43ee-4b00-bfc5-105b7981bd8f,1,0,1ea080b0-0a11-4152-b8bb-4918bc142a23,1ea080b0-0a11-4152-b8bb-4918bc142a23,1,0,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,1,0,6930e471-7935-4d68-a980-2acde93ba801,6930e471-7935-4d68-a980-2acde93ba801,1,0,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,1,0,5135cc48-c749-4acb-a225-d110f386f482,5135cc48-c749-4acb-a225-d110f386f482,1,0,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,1,0,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,1,0,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,1,0,2e9fa546-96fb-4ecb-b933-7921e131e89b,2e9fa546-96fb-4ecb-b933-7921e131e89b,1,0,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,1,0,637a132b-1a88-44ba-b45f-ed4ed1ac1001,637a132b-1a88-44ba-b45f-ed4ed1ac1001,1,0,c3efa853-cd29-4618-929f-e3bec33dfd65,c3efa853-cd29-4618-929f-e3bec33dfd65,1,0,62185c28-3d24-487a-9441-b309dcf11e31,62185c28-3d24-487a-9441-b309dcf11e31,1,0,9f264aeb-664d-4724-8248-11873d63ef3b,9f264aeb-664d-4724-8248-11873d63ef3b,1,0,b926d058-53a9-4eea-b4f9-98e77f798dd9,b926d058-53a9-4eea-b4f9-98e77f798dd9,1,0,495e2c77-4868-4191-ac18-f94e55a5982e,495e2c77-4868-4191-ac18-f94e55a5982e,1,0,20191a65-322c-457d-85f5-ed1258b6fe8e,20191a65-322c-457d-85f5-ed1258b6fe8e,1,0,d71ca3bc-e41a-44d9-afe4-c68f1211b3a1,d71ca3bc-e41a-44d9-afe4-c68f1211b3a1,1,0,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,1,0,769c60aa-44f4-4c98-a461-d3f5c2b67f61,769c60aa-44f4-4c98-a461-d3f5c2b67f61,1,0,f9809c99-0eaa-4249-967c-a4bef4763277,f9809c99-0eaa-4249-967c-a4bef4763277,1,0,37fa88a0-f2c1-455f-a28d-74165e8b933d,37fa88a0-f2c1-455f-a28d-74165e8b933d,1,0,e4476f09-909b-49f7-8e01-72eea8ceaca6,e4476f09-909b-49f7-8e01-72eea8ceaca6,1,0,2861412c-46f0-454e-b81d-fe081afb5c7a,2861412c-46f0-454e-b81d-fe081afb5c7a,1,0,2b4ece05-b694-42e9-8239-55722fd84294,2b4ece05-b694-42e9-8239-55722fd84294,1,0,6564ce89-134f-4726-8693-fd93aad46180,6564ce89-134f-4726-8693-fd93aad46180,1,0,0d743731-da5d-4c99-b19f-e93c69b77e14,0d743731-da5d-4c99-b19f-e93c69b77e14,1,0,d6f15367-23e2-4766-bc7c-8acd0063aa0c,d6f15367-23e2-4766-bc7c-8acd0063aa0c,1,0,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,1,0,fa4c5665-4d73-4db2-a055-8c1c8a302f82,fa4c5665-4d73-4db2-a055-8c1c8a302f82,1,0,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,1,0,9100b286-8ae9-4de3-b116-5ce0fa95b80c,9100b286-8ae9-4de3-b116-5ce0fa95b80c,1,0,3d315df6-e000-4cbd-810d-0b26c0d1bc54,3d315df6-e000-4cbd-810d-0b26c0d1bc54,1,0,fa429302-ccaf-4c89-8a11-3a1d30817c00,fa429302-ccaf-4c89-8a11-3a1d30817c00,1,0,9b4c49ce-93da-439a-8d67-f3774e92800a,9b4c49ce-93da-439a-8d67-f3774e92800a,1,0,5f8fa827-7017-4b45-b458-3571b8b611f5,5f8fa827-7017-4b45-b458-3571b8b611f5,1,0,79749167-2912-4e06-9deb-7915a1b4390d,79749167-2912-4e06-9deb-7915a1b4390d,1,0,1c93fcd3-53a1-403f-a30b-454fbc941d55,1c93fcd3-53a1-403f-a30b-454fbc941d55,1,0,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,1,0,adec3963-b22f-4463-a3f4-c9ec27d187a8,adec3963-b22f-4463-a3f4-c9ec27d187a8,1,0,d8dae0c8-8e11-44bf-bf60-d316220f3e82,d8dae0c8-8e11-44bf-bf60-d316220f3e82,1,0,12afec4d-1728-4aa8-86e5-23cd2f1572b3,12afec4d-1728-4aa8-86e5-23cd2f1572b3,1,0,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,1,0,ee0c3960-d1bf-411f-a51f-e6e27dabea87,ee0c3960-d1bf-411f-a51f-e6e27dabea87,1,0,d7fb9441-1aef-4257-af3f-7f16340ac85e,d7fb9441-1aef-4257-af3f-7f16340ac85e,1,0,d07c094c-2795-4e0c-b030-bdb82be7ba6d,d07c094c-2795-4e0c-b030-bdb82be7ba6d,1,0,62637860-2013-4f9d-9aed-7cbb0dce8983,62637860-2013-4f9d-9aed-7cbb0dce8983,1,0,331217f6-7ec2-425d-93bd-f2979c5f2e05,331217f6-7ec2-425d-93bd-f2979c5f2e05,1,0,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,1,0,d754ed75-2a32-4b86-a153-7b50c39f9836,d754ed75-2a32-4b86-a153-7b50c39f9836,1,0,b81f3ee1-66f7-4626-a35b-ef85388c678e,b81f3ee1-66f7-4626-a35b-ef85388c678e,1,0,2ad04793-c162-4915-a260-ca4da535cdac,2ad04793-c162-4915-a260-ca4da535cdac,1,0,78942e92-a31c-4824-a614-a6e07ae26171,78942e92-a31c-4824-a614-a6e07ae26171,1,0,6568d853-dfe5-4064-aa73-c1f546e951b4,6568d853-dfe5-4064-aa73-c1f546e951b4,1,0,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,1,0,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,1,0,bbe718b2-6b4c-4d78-a408-5369d356a1e6,bbe718b2-6b4c-4d78-a408-5369d356a1e6,1,0,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,1,0,eb7623df-b4e3-4272-9f92-42a9214f9f17,eb7623df-b4e3-4272-9f92-42a9214f9f17,1,0,a5f5bc90-e670-4ee7-95fe-067fe1b129f7,a5f5bc90-e670-4ee7-95fe-067fe1b129f7,1,0,f790f620-2247-4a04-b0ad-8aa591655948,f790f620-2247-4a04-b0ad-8aa591655948,1,0,6d9d9087-91ad-4368-9087-0af8f83fdc9e,6d9d9087-91ad-4368-9087-0af8f83fdc9e,1,0,61fdb27e-b449-40a7-8ecd-7e3e8ae3aa23,61fdb27e-b449-40a7-8ecd-7e3e8ae3aa23,1,0,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,1,0,b08fd921-c3d6-44eb-9401-fec5acab5d22,b08fd921-c3d6-44eb-9401-fec5acab5d22,1,0,f4f185af-5507-427c-b82b-515ea71f3fc1,f4f185af-5507-427c-b82b-515ea71f3fc1,1,0,1611855a-abf4-4269-aed3-3f78dce7bea5,1611855a-abf4-4269-aed3-3f78dce7bea5,1,0,c5bd277c-b258-43af-9c80-3e328b1581f5,c5bd277c-b258-43af-9c80-3e328b1581f5,1,0,96dac7e8-5113-4217-ac0a-fffea4acc410,96dac7e8-5113-4217-ac0a-fffea4acc410,1,0,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,1,0,f9cefef4-2182-42ca-93ef-b6a51d6555cc,f9cefef4-2182-42ca-93ef-b6a51d6555cc,1,0,71e1c7de-7367-424c-ae07-6ec04b408b83,71e1c7de-7367-424c-ae07-6ec04b408b83,1,0,b3956392-199c-4934-80d1-8cdab453d879,b3956392-199c-4934-80d1-8cdab453d879,1,0,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,1,0,d1bd7448-aa5f-43fc-9735-224f36960c3e,d1bd7448-aa5f-43fc-9735-224f36960c3e,1,0,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,1,0,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,1,0,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1,0,8227471b-8ffb-4ba7-b4da-b21570582876,8227471b-8ffb-4ba7-b4da-b21570582876,1,0,ea7ab9fa-5119-4773-b17d-fc74c7479d3d,ea7ab9fa-5119-4773-b17d-fc74c7479d3d,1,0,3e0fe508-87fa-47af-a47f-c0630a186900,3e0fe508-87fa-47af-a47f-c0630a186900,1,0,09740271-b8a8-4949-a116-b64449d80036,09740271-b8a8-4949-a116-b64449d80036,1,0,c8fedc0b-33d6-46a5-b4fc-a3cd728f5fd7,c8fedc0b-33d6-46a5-b4fc-a3cd728f5fd7,1,0,25864028-1a53-4a8d-b6e4-189fa62c62f5,25864028-1a53-4a8d-b6e4-189fa62c62f5,1,0,e923beae-0bd8-4119-a802-fd6bfb729f10,e923beae-0bd8-4119-a802-fd6bfb729f10,1,0,67c1269a-79e6-44d9-9254-671c50fb3974,67c1269a-79e6-44d9-9254-671c50fb3974,1,0,5d455d2a-910d-48c7-bc74-ba5ad7855110,5d455d2a-910d-48c7-bc74-ba5ad7855110,1,0,7cf3feea-75e2-42cc-9c89-4a9182034910,7cf3feea-75e2-42cc-9c89-4a9182034910,1,0,930a0156-feb3-4e14-96a5-cd183a4891f4,930a0156-feb3-4e14-96a5-cd183a4891f4,1,0,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,1,0,e268a337-f576-4ec2-8a22-0500b79b2441,e268a337-f576-4ec2-8a22-0500b79b2441,1,0,eb33a8fa-75a6-4926-a025-05bc0abe4374,eb33a8fa-75a6-4926-a025-05bc0abe4374,1,0,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,1,0,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,1,0,bf480259-6e72-4ad1-ac41-0b0d41a75387,bf480259-6e72-4ad1-ac41-0b0d41a75387,1,0,a41f060a-f0f6-4940-960b-5056082b2c45,a41f060a-f0f6-4940-960b-5056082b2c45,1,0,5d45a926-513f-4bbc-a002-54a2db94b297,5d45a926-513f-4bbc-a002-54a2db94b297,1,0,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,1,0,073e14d4-5d43-428b-a9a7-985d173e94c7,073e14d4-5d43-428b-a9a7-985d173e94c7,1,0,61dc318a-c17d-402e-bf64-a0c0a63a1c93,61dc318a-c17d-402e-bf64-a0c0a63a1c93,1,0,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,1,0,2394775b-8910-4667-9c74-e1606e0b13bc,2394775b-8910-4667-9c74-e1606e0b13bc,1,0,43c88ffd-a036-4563-890b-bdc60180e841,43c88ffd-a036-4563-890b-bdc60180e841,1,0,af6e5e8e-6482-4820-a810-9e275ae039bf,af6e5e8e-6482-4820-a810-9e275ae039bf,1,0,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,1,0,7690620b-21d9-463a-8c22-60844927b4a0,7690620b-21d9-463a-8c22-60844927b4a0,1,0,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,1,0,b1db3255-38da-4684-b44e-4e2e9ee1dc35,b1db3255-38da-4684-b44e-4e2e9ee1dc35,1,0,4761f89b-7894-4dca-83b0-3be2d0828781,4761f89b-7894-4dca-83b0-3be2d0828781,1,0,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,1,0,7236d52f-9068-45ad-8b92-a7319e737e08,7236d52f-9068-45ad-8b92-a7319e737e08,1,0,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,1,0,9db23e96-d13a-4847-941a-462f64d0619d,9db23e96-d13a-4847-941a-462f64d0619d,1,0,7575fd54-c91b-4220-a2ef-2cf533f60426,7575fd54-c91b-4220-a2ef-2cf533f60426,1,0,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1,0,26e2c83b-8873-4ad3-9c50-e94421473a43,26e2c83b-8873-4ad3-9c50-e94421473a43,1,0,f0b2ec05-8e01-4ccf-b927-671329a9013b,f0b2ec05-8e01-4ccf-b927-671329a9013b,1,0,ab442b11-2482-4f80-ac82-01966e0657ec,ab442b11-2482-4f80-ac82-01966e0657ec,1,0,14fe4d39-81a1-470e-9724-6642ce34ad89,14fe4d39-81a1-470e-9724-6642ce34ad89,1,0,457578ab-dfe2-4419-8d8a-64283b341f42,457578ab-dfe2-4419-8d8a-64283b341f42,1,0,67ef6671-f537-46bf-88e6-f5bcf34a17a4,67ef6671-f537-46bf-88e6-f5bcf34a17a4,1,0,de778ca7-feaf-4531-80ae-11a534c56928,de778ca7-feaf-4531-80ae-11a534c56928,1,0,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,1,0,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0a76a84d-e883-477e-8b87-7bf984cdc1cf,1,0,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,1,0,86df8648-e195-4661-99ee-6052788eb276,86df8648-e195-4661-99ee-6052788eb276,1,0,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,1,0,35133725-9647-42dc-a76a-2e62b2918ac4,35133725-9647-42dc-a76a-2e62b2918ac4,1,0,c7b883dc-6c26-4eb5-bc19-7919ad57da27,c7b883dc-6c26-4eb5-bc19-7919ad57da27,1,0,7fc37008-c378-4a70-a9a9-07543c7248a6,7fc37008-c378-4a70-a9a9-07543c7248a6,1,0,6410853e-a17e-44db-b8cc-bfefd7c4d239,6410853e-a17e-44db-b8cc-bfefd7c4d239,1,0,df042e4e-01a6-4480-a9c5-c0d7a454bb41,df042e4e-01a6-4480-a9c5-c0d7a454bb41,1,0,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,1,0,6852c584-d989-418d-8d18-255492891ef0,6852c584-d989-418d-8d18-255492891ef0,1,0,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,1,0,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,1,0,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,1,0,ff830967-faa9-415f-aa6e-8d27779f91f8,ff830967-faa9-415f-aa6e-8d27779f91f8,1,0,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,1,0,88618d0f-97af-4055-a490-561d4b8065a7,88618d0f-97af-4055-a490-561d4b8065a7,1,0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,1,0,7b816ca0-ba60-4637-8348-23b26ad23e3f,7b816ca0-ba60-4637-8348-23b26ad23e3f,1,0,814a6db4-a43c-44e6-ac44-11983642c5ad,814a6db4-a43c-44e6-ac44-11983642c5ad,1,0,0bd74786-e018-4a66-b994-cdb439c57657,0bd74786-e018-4a66-b994-cdb439c57657,1,0,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,1,0,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,1,0,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,1,0,09502176-c53d-4525-b8ed-32d0a2e21a5d,09502176-c53d-4525-b8ed-32d0a2e21a5d,1,0,75ad984e-d41f-4591-b207-e8a4b05757a7,75ad984e-d41f-4591-b207-e8a4b05757a7,1,0,3f020f90-7aeb-4b21-ad71-4572ac796d4c,3f020f90-7aeb-4b21-ad71-4572ac796d4c,1,0,759e2ba0-2941-4cc1-8409-50b8a3620058,759e2ba0-2941-4cc1-8409-50b8a3620058,1,0,491cf25d-091e-4e09-b145-92d7073326cf,491cf25d-091e-4e09-b145-92d7073326cf,1,0,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,1,0,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,1,0,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,1,0,900bc96e-fbcc-473e-970c-96f561420f8e,900bc96e-fbcc-473e-970c-96f561420f8e,1,0,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,1,0,21d5a0b0-9a2b-4989-a50a-781645513179,21d5a0b0-9a2b-4989-a50a-781645513179,1,0,3255033a-e922-412e-a825-a3e8bd284703,3255033a-e922-412e-a825-a3e8bd284703,1,0,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1,0,f250f992-ad5a-4dab-ad38-240604adb0c4,f250f992-ad5a-4dab-ad38-240604adb0c4,1,0,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,1,0,e63671f6-c96d-4ea4-8300-af7dbd0d016f,e63671f6-c96d-4ea4-8300-af7dbd0d016f,1,0,2c511469-0df6-470f-a808-decb275e8b1a,2c511469-0df6-470f-a808-decb275e8b1a,1,0,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1,0,99b40f9f-f8f1-4779-8afc-59d30612f3d6,99b40f9f-f8f1-4779-8afc-59d30612f3d6,1,0,6131e875-3254-4281-9343-9118564c5451,6131e875-3254-4281-9343-9118564c5451,1,0,69622ff8-8a23-42fc-b63d-5097e3f636ac,69622ff8-8a23-42fc-b63d-5097e3f636ac,1,0,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,1,0,ef326bd8-1570-455e-ae8c-063b5578ad15,ef326bd8-1570-455e-ae8c-063b5578ad15,1,0,efd4e0a3-2f98-40ef-8089-c853cd588fa6,efd4e0a3-2f98-40ef-8089-c853cd588fa6,1,0,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,1,0,cb6d4979-2d70-4ceb-af08-deb2b19daf14,cb6d4979-2d70-4ceb-af08-deb2b19daf14,1,0,bf30b754-84fb-4104-b52b-a4f7df6fba12,bf30b754-84fb-4104-b52b-a4f7df6fba12,1,0,7bbd0835-b3e9-40cb-a424-670828b60bbb,7bbd0835-b3e9-40cb-a424-670828b60bbb,1,0,3e2138ea-48f9-4a60-8f22-53933bea49db,3e2138ea-48f9-4a60-8f22-53933bea49db,1,0,16bda2eb-eab8-4230-b89f-517fb943e009,16bda2eb-eab8-4230-b89f-517fb943e009,1,0,00964512-297f-4b8b-8def-8e4fc0eba991,00964512-297f-4b8b-8def-8e4fc0eba991,1,0,4185fea3-baba-4ba5-8019-9023b3011d4d,4185fea3-baba-4ba5-8019-9023b3011d4d,1,0,ea790035-92d6-445e-9fa3-08e565634d2b,ea790035-92d6-445e-9fa3-08e565634d2b,1,0,cce8900a-51eb-487d-b380-227d1b9d3943,cce8900a-51eb-487d-b380-227d1b9d3943,1,0,c043c36c-90c6-483b-bc20-7c2d85109b90,c043c36c-90c6-483b-bc20-7c2d85109b90,1,0,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,1,0,91d2d40a-c271-412c-b344-1fc98b94ba21,91d2d40a-c271-412c-b344-1fc98b94ba21,1,0,7ce47046-aee8-4809-bac9-a98930a844e1,7ce47046-aee8-4809-bac9-a98930a844e1,1,0,f480b8b9-ecec-4207-a0aa-12c5be4c2250,f480b8b9-ecec-4207-a0aa-12c5be4c2250,1,0,32717d25-6644-4903-8950-03e4c9b1a8fe,32717d25-6644-4903-8950-03e4c9b1a8fe,1,0,3644d8f3-db88-4fce-a851-39c115acfe03,3644d8f3-db88-4fce-a851-39c115acfe03,1,0,4653da74-34b2-47b9-ad88-efd761d6f1e9,4653da74-34b2-47b9-ad88-efd761d6f1e9,1,0,abf8a23d-45c3-4feb-8df2-279b709d7722,abf8a23d-45c3-4feb-8df2-279b709d7722,1,0,b0cd056f-c601-4d07-89c4-f7137b88bab6,b0cd056f-c601-4d07-89c4-f7137b88bab6,1,0,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,1,0,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,1,0,96ed4d39-3bdc-480f-af86-218f22000514,96ed4d39-3bdc-480f-af86-218f22000514,1,0,c9f72e74-22ac-4dc0-8462-0aa7819a9342,c9f72e74-22ac-4dc0-8462-0aa7819a9342,1,0,ca650484-293f-403a-b916-5ec7c3a8969e,ca650484-293f-403a-b916-5ec7c3a8969e,1,0,b71e706d-623e-4039-9bf0-24f151d861d8,b71e706d-623e-4039-9bf0-24f151d861d8,1,0,528f4823-33d8-49bd-a8fe-756a08a107c2,528f4823-33d8-49bd-a8fe-756a08a107c2,1,0,4869095b-b76e-45ca-b77d-0e74f59673f0,4869095b-b76e-45ca-b77d-0e74f59673f0,1,0,bcca2442-448b-4760-923b-cc9621ecb441,bcca2442-448b-4760-923b-cc9621ecb441,1,0,ba7657df-429a-4737-b787-19ef09fdebb2,ba7657df-429a-4737-b787-19ef09fdebb2,1,0,867d72be-f406-45a5-a511-b90459683f11,867d72be-f406-45a5-a511-b90459683f11,1,0,88b22e62-c144-401f-9635-3fb4d914772e,88b22e62-c144-401f-9635-3fb4d914772e,1,0,efeb2914-6604-403a-a11e-5cb995ab2bc9,efeb2914-6604-403a-a11e-5cb995ab2bc9,1,0,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,1,0,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,1,0,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,1,0,8525d945-08aa-4928-8dca-4e172ea94328,8525d945-08aa-4928-8dca-4e172ea94328,1,0,de506523-241a-4845-9259-37066afbf16a,de506523-241a-4845-9259-37066afbf16a,1,0,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0510206f-eef0-4a5e-aeb7-d53c26d34adb,1,0,e616e007-43e7-4740-a083-b85f5435718a,e616e007-43e7-4740-a083-b85f5435718a,1,0,82be906c-bb06-40ea-b908-54574b0b4848,82be906c-bb06-40ea-b908-54574b0b4848,1,0,727da5b1-e054-4832-8e44-f5d5e56f52e5,727da5b1-e054-4832-8e44-f5d5e56f52e5,1,0,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,1,0,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1,0,6feaad7c-9680-4341-b215-14581e2e2b37,6feaad7c-9680-4341-b215-14581e2e2b37,1,0,d5656a92-adfb-4733-830d-2b1565798b1f,d5656a92-adfb-4733-830d-2b1565798b1f,1,0,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,1,0,b0f6ea83-2849-4151-930d-692866919db3,b0f6ea83-2849-4151-930d-692866919db3,1,0,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,1,0,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,1,0,f66cb2da-3b3c-481f-823a-506f8290f619,f66cb2da-3b3c-481f-823a-506f8290f619,1,0,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,1,0,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,1,0,0bdcf045-5132-4a68-839c-a30515dc569e,0bdcf045-5132-4a68-839c-a30515dc569e,1,0,683861f9-9a5f-47db-8b03-959f839d5a3a,683861f9-9a5f-47db-8b03-959f839d5a3a,1,0,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,1,0,125be5bf-f410-451d-aa96-22fabc6a4d8a,125be5bf-f410-451d-aa96-22fabc6a4d8a,1,0,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,1,0,0a46166a-4562-4a50-b139-39dbe8a1fc84,0a46166a-4562-4a50-b139-39dbe8a1fc84,1,0,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,1,0,6ce64d65-f710-4d3f-a85f-26ce6915451e,6ce64d65-f710-4d3f-a85f-26ce6915451e,1,0,33eb9806-e34f-42a0-9825-3ff2de92c503,33eb9806-e34f-42a0-9825-3ff2de92c503,1,0,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,1,0,bcb58235-7cd7-4c15-a1eb-194ee38259e6,bcb58235-7cd7-4c15-a1eb-194ee38259e6,1,0,e19aefe7-634d-4218-8d40-75802d1691e0,e19aefe7-634d-4218-8d40-75802d1691e0,1,0,b885dbb2-6e18-46a6-929c-3d6d392343ad,b885dbb2-6e18-46a6-929c-3d6d392343ad,1,0,d31e24cf-7493-45dc-ba81-3a00618e53bc,d31e24cf-7493-45dc-ba81-3a00618e53bc,1,0,03f32b08-1b71-47cb-ba1d-965037df4d64,03f32b08-1b71-47cb-ba1d-965037df4d64,1,0,4ec26e3d-6c38-4c90-9f91-c2235f8b4154,4ec26e3d-6c38-4c90-9f91-c2235f8b4154,1,0,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,1,0,f942d212-9be0-4d80-84b6-5b63070e33e4,f942d212-9be0-4d80-84b6-5b63070e33e4,1,0,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,1,0,19a0b881-302e-4d0e-ace0-29a9d8379a48,19a0b881-302e-4d0e-ace0-29a9d8379a48,1,0,64c91eaa-084f-4801-8dbf-4e075c689c2b,64c91eaa-084f-4801-8dbf-4e075c689c2b,1,0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,1,0,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,1,0,3aa12805-823a-439b-b039-fb9940aee312,3aa12805-823a-439b-b039-fb9940aee312,1,0,87d53573-f266-4b74-94af-041ae4b6518f,87d53573-f266-4b74-94af-041ae4b6518f,1,0,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,1,0,801cf1f7-2c65-4126-a3e9-b66abfdde67a,801cf1f7-2c65-4126-a3e9-b66abfdde67a,1,0,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,1,0,29c2bc01-8838-4459-8ac2-79862aa1dbc9,29c2bc01-8838-4459-8ac2-79862aa1dbc9,1,0,ad556c33-6811-48b4-ae90-57700a4d3fd6,ad556c33-6811-48b4-ae90-57700a4d3fd6,1,0,6e0833f4-3b57-4a5f-810f-9e2a492335df,6e0833f4-3b57-4a5f-810f-9e2a492335df,1,0,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,1,0,977bc9d8-9843-4343-85af-11a3d91f9966,977bc9d8-9843-4343-85af-11a3d91f9966,1,0,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,1,0,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,1,0,a6582448-734d-4a4c-a32c-c4755ca1bc93,a6582448-734d-4a4c-a32c-c4755ca1bc93,1,0,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,1,0,53327cc4-22b0-40f9-bae7-db483f85901c,53327cc4-22b0-40f9-bae7-db483f85901c,1,0,098d904d-95c9-459e-86d0-357ba9a40191,098d904d-95c9-459e-86d0-357ba9a40191,1,0,e9ab9d00-6e42-439b-8efc-fcacf727016d,e9ab9d00-6e42-439b-8efc-fcacf727016d,1,0,2d58033f-e15d-4a91-8165-dd311025c7c4,2d58033f-e15d-4a91-8165-dd311025c7c4,1,0,49cb3a36-90b3-4154-b571-265fc5cee21e,49cb3a36-90b3-4154-b571-265fc5cee21e,1,0,10472d2c-18ca-49b0-bd9d-c750db8498c5,10472d2c-18ca-49b0-bd9d-c750db8498c5,1,0,8efe5daf-272d-4255-b5c4-66dca7463b50,8efe5daf-272d-4255-b5c4-66dca7463b50,1,0,65af25a6-f699-4c40-b13e-3b7dff3f16fe,65af25a6-f699-4c40-b13e-3b7dff3f16fe,1,0,c4d2486d-289c-4812-b223-5ccfcd7f29e3,c4d2486d-289c-4812-b223-5ccfcd7f29e3,1,0,f9229c3e-4a47-49a4-8b14-908218012ff7,f9229c3e-4a47-49a4-8b14-908218012ff7,1,0,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,1,0,b9743978-ba6d-4892-bb32-f24d4a47dd50,b9743978-ba6d-4892-bb32-f24d4a47dd50,1,0,c43accb9-f33d-437f-b305-0595f8fe3032,c43accb9-f33d-437f-b305-0595f8fe3032,1,0,084a398b-836e-424c-af93-22aa39d5a15a,084a398b-836e-424c-af93-22aa39d5a15a,1,0,7da57c89-af2c-445a-96f7-39250f70306f,7da57c89-af2c-445a-96f7-39250f70306f,1,0,b5b94d94-25f7-4cfa-b1e9-6009fb848763,b5b94d94-25f7-4cfa-b1e9-6009fb848763,1,0,a2accf54-5966-42e8-ab2e-e56e415963ee,a2accf54-5966-42e8-ab2e-e56e415963ee,1,0,d8eb5329-5900-4b5d-b45e-458513dddfef,d8eb5329-5900-4b5d-b45e-458513dddfef,1,0,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,1,0,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,1,0,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,1,0,eaaed107-69d4-4963-be83-74519e331715,eaaed107-69d4-4963-be83-74519e331715,1,0,38cddf96-8703-4396-8c73-47fb22828a48,38cddf96-8703-4396-8c73-47fb22828a48,1,0,2c2cb793-0177-4983-91ca-9c292c5b10f1,2c2cb793-0177-4983-91ca-9c292c5b10f1,1,0,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,1,0,221fa473-3327-44e6-a033-6fdfd2be713c,221fa473-3327-44e6-a033-6fdfd2be713c,1,0,7a5973f0-7e29-44af-8e7b-70af71f704a4,7a5973f0-7e29-44af-8e7b-70af71f704a4,1,0,2b2bf0f7-0946-4492-bba0-27f007a70e64,2b2bf0f7-0946-4492-bba0-27f007a70e64,1,0,22c9a703-5ed3-4156-8fa6-476b1c1452f1,22c9a703-5ed3-4156-8fa6-476b1c1452f1,1,0,8be10d88-8c37-4444-9c89-6cbbe9913bda,8be10d88-8c37-4444-9c89-6cbbe9913bda,1,0,27089e8e-2c75-431c-b808-5d4dcba3cdca,27089e8e-2c75-431c-b808-5d4dcba3cdca,1,0,9ab3980e-a480-4f90-a8cc-bde99d5ace35,9ab3980e-a480-4f90-a8cc-bde99d5ace35,1,0,ec928563-6e35-4b84-b477-90d2481cec1c,ec928563-6e35-4b84-b477-90d2481cec1c,1,0,5d3e9678-20fe-4128-867a-3f7addaa7831,5d3e9678-20fe-4128-867a-3f7addaa7831,1,0,bb878f73-8a0f-459a-9076-ce57fe7957dc,bb878f73-8a0f-459a-9076-ce57fe7957dc,1,0,cb1d4a41-20a9-4d76-8798-d47d8858bff1,cb1d4a41-20a9-4d76-8798-d47d8858bff1,1,0,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,1,0,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,1,0,9f4b8e36-83ff-4694-8540-b5f47b18395f,9f4b8e36-83ff-4694-8540-b5f47b18395f,1,0,b4c026eb-4271-4366-b529-1cdfe2874563,b4c026eb-4271-4366-b529-1cdfe2874563,1,0,314b0da2-24d3-48cc-8532-d36c45eb3bf8,314b0da2-24d3-48cc-8532-d36c45eb3bf8,1,0,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,1,0,4077e700-ec20-4afa-8155-bf7e516a70cb,4077e700-ec20-4afa-8155-bf7e516a70cb,1,0,5198c6db-2100-4902-82c8-85c8ea555e78,5198c6db-2100-4902-82c8-85c8ea555e78,1,0,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,1,0,f0b1e9f4-2e07-44e6-88d2-c11457135781,f0b1e9f4-2e07-44e6-88d2-c11457135781,1,0,e010c0f9-f770-4fdc-8607-50838c0262ef,e010c0f9-f770-4fdc-8607-50838c0262ef,1,0,f935399f-3554-4c08-b0a6-eba13074e1b7,f935399f-3554-4c08-b0a6-eba13074e1b7,1,0,10008125-3aeb-4912-8ad6-d92d283ea09a,10008125-3aeb-4912-8ad6-d92d283ea09a,1,0,765f9584-fefa-4695-b130-dd54c3b0d79d,765f9584-fefa-4695-b130-dd54c3b0d79d,1,0,dd050ca0-8335-4654-ab5c-7babcb4824ef,dd050ca0-8335-4654-ab5c-7babcb4824ef,1,0,706cbf55-626d-4cab-b589-a2464368f6c1,706cbf55-626d-4cab-b589-a2464368f6c1,1,0,d22a0a50-220d-459e-a23a-39730a1e67c4,d22a0a50-220d-459e-a23a-39730a1e67c4,1,0,2c1c9284-ba8b-4282-a89c-429f02ea41f6,2c1c9284-ba8b-4282-a89c-429f02ea41f6,1,0,8c241467-76f7-4161-a8a1-5da4a6576b75,8c241467-76f7-4161-a8a1-5da4a6576b75,1,0,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1,0,fd7e5257-024c-46de-9ff3-edd302fadba5,fd7e5257-024c-46de-9ff3-edd302fadba5,1,0,a4168057-d99f-4b55-b762-214f95ae3a30,a4168057-d99f-4b55-b762-214f95ae3a30,1,0,ab4fe549-1c07-42d9-b412-8b89ed115591,ab4fe549-1c07-42d9-b412-8b89ed115591,1,0,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,1,0,b49c589d-b45d-4aff-8899-72cfe433e9a6,b49c589d-b45d-4aff-8899-72cfe433e9a6,1,0,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,1,0,273ad3f7-c645-434d-93b0-e832134f3043,273ad3f7-c645-434d-93b0-e832134f3043,1,0,d320803b-1de4-4e66-b455-0afe39be5c41,d320803b-1de4-4e66-b455-0afe39be5c41,1,0,67e85b9a-a138-49ea-b474-04475f0f8c90,67e85b9a-a138-49ea-b474-04475f0f8c90,1,0,5d990585-02dd-4a13-8dfa-920df7d1dbb0,5d990585-02dd-4a13-8dfa-920df7d1dbb0,1,0,788a98e0-194f-466c-b4fa-bafd527aae26,788a98e0-194f-466c-b4fa-bafd527aae26,1,0,07820e9e-9d6b-4c37-909e-90dbd33e30c0,07820e9e-9d6b-4c37-909e-90dbd33e30c0,1,0,364218e0-87ba-4008-a3e3-e2351a5e04b8,364218e0-87ba-4008-a3e3-e2351a5e04b8,1,0,143f6db9-a4dc-4039-90d0-6161394a3e2f,143f6db9-a4dc-4039-90d0-6161394a3e2f,1,0,97e853dc-065f-4c6d-84cb-3d3aff367b22,97e853dc-065f-4c6d-84cb-3d3aff367b22,1,0,2f1fdf47-2627-496f-9e1f-77019abb2104,2f1fdf47-2627-496f-9e1f-77019abb2104,1,0,c996532a-8795-4136-8a40-9bb4b263277c,c996532a-8795-4136-8a40-9bb4b263277c,1,0,64c77788-fc49-4979-8163-949a891bd8b7,64c77788-fc49-4979-8163-949a891bd8b7,1,0,c39750ca-e33f-40c2-b830-119423d9a2ae,c39750ca-e33f-40c2-b830-119423d9a2ae,1,0,9372ff6b-27b6-48f3-a2a2-762e7c485766,9372ff6b-27b6-48f3-a2a2-762e7c485766,1,0,f454595a-4a3d-451b-8e8b-b17aa8314591,f454595a-4a3d-451b-8e8b-b17aa8314591,1,0,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,1,0,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,1,0,bc708da8-7fc6-4da1-8129-9ef6a86667af,bc708da8-7fc6-4da1-8129-9ef6a86667af,1,0,061842fe-4077-4d6e-aefe-de79409da730,061842fe-4077-4d6e-aefe-de79409da730,1,0,86249619-8981-4fc4-85fc-ce30e4b9d542,86249619-8981-4fc4-85fc-ce30e4b9d542,1,0,da6e4bff-9835-4b92-b62b-291a5d6c86fe,da6e4bff-9835-4b92-b62b-291a5d6c86fe,1,0,98aa8a80-29fa-4a54-8d0e-90d413d63da1,98aa8a80-29fa-4a54-8d0e-90d413d63da1,1,0,60af0c11-852e-4b45-afb7-251d75a87150,60af0c11-852e-4b45-afb7-251d75a87150,1,0,37e81463-a558-4b03-b0e4-82ac0e99c80c,37e81463-a558-4b03-b0e4-82ac0e99c80c,1,0,8be35c43-32e6-418d-b3d6-e53ef56babb7,8be35c43-32e6-418d-b3d6-e53ef56babb7,1,0,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,1,0,935d01e1-232b-480e-a6bf-c21c617c6348,935d01e1-232b-480e-a6bf-c21c617c6348,1,0,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,1,0,05c702a1-2c74-45d5-b2ee-fdd795b0945a,05c702a1-2c74-45d5-b2ee-fdd795b0945a,1,0,3fadaeb7-2c41-42a4-bfa8-c585602b1028,3fadaeb7-2c41-42a4-bfa8-c585602b1028,1,0,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,1,0,083c709b-ed8c-47e4-a190-421e14259e73,083c709b-ed8c-47e4-a190-421e14259e73,1,0,b98dacc7-29e1-426b-a664-0a988f18186c,b98dacc7-29e1-426b-a664-0a988f18186c,1,0,d678856d-6e7c-443f-a6e3-350bbe8af659,d678856d-6e7c-443f-a6e3-350bbe8af659,1,0,d0979762-22ce-41be-b7a4-5e9ac149d94b,d0979762-22ce-41be-b7a4-5e9ac149d94b,1,0,ae23e70c-479e-47ad-9bfa-58560a903410,ae23e70c-479e-47ad-9bfa-58560a903410,1,0,c0d83781-bbda-43f7-bf0e-5defa3d47143,c0d83781-bbda-43f7-bf0e-5defa3d47143,1,0,21fa5fdd-acbc-403b-9acb-bbf95284bd20,21fa5fdd-acbc-403b-9acb-bbf95284bd20,1,0,576a01e3-4d6d-4241-a3c4-7661ba129bcb,576a01e3-4d6d-4241-a3c4-7661ba129bcb,1,0,9f7290dd-19f4-4163-9795-fe562e84f06d,9f7290dd-19f4-4163-9795-fe562e84f06d,1,0,c3b5c81f-b787-4f63-8cba-79def0921477,c3b5c81f-b787-4f63-8cba-79def0921477,1,0,1f0cb3d4-1344-451b-a257-be3cd854acfd,1f0cb3d4-1344-451b-a257-be3cd854acfd,1,0,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0131fe59-ce47-48b7-8f7e-1544bf0fa031,1,0,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,1,0,372150e2-526e-4424-8c54-e4b16bdd25b5,372150e2-526e-4424-8c54-e4b16bdd25b5,1,0,2f9c347d-ee82-49f2-a5eb-97f55374856f,2f9c347d-ee82-49f2-a5eb-97f55374856f,1,0,752dc569-cf84-42d7-911d-49d455f7214e,752dc569-cf84-42d7-911d-49d455f7214e,1,0,fecab2b9-27e1-44d6-9082-79c3569b7477,fecab2b9-27e1-44d6-9082-79c3569b7477,1,0,07ae092f-8517-47b7-b54c-5dbcb6506929,07ae092f-8517-47b7-b54c-5dbcb6506929,1,0,db4c25bb-d199-43ec-833d-82972de04a41,db4c25bb-d199-43ec-833d-82972de04a41,1,0,43d19685-0794-41f2-9171-bf565133718d,43d19685-0794-41f2-9171-bf565133718d,1,0,b68c15c4-4966-4f13-8912-2d479b65089a,b68c15c4-4966-4f13-8912-2d479b65089a,1,0,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,1,0,a89ee622-6942-411a-8566-f03d139c9e5b,a89ee622-6942-411a-8566-f03d139c9e5b,1,0,f87e3935-dae1-4192-b6a7-05e3c700c590,f87e3935-dae1-4192-b6a7-05e3c700c590,1,0,ee635706-6ee2-4956-8d58-a235f64687f6,ee635706-6ee2-4956-8d58-a235f64687f6,1,0,a5a40ca7-d665-420b-a516-1355019d6901,a5a40ca7-d665-420b-a516-1355019d6901,1,0,198ea989-5001-47ac-86b8-aa2585a5f7d7,198ea989-5001-47ac-86b8-aa2585a5f7d7,1,0,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,1,0,fb84c5f7-11da-4b17-979e-41e27a74e789,fb84c5f7-11da-4b17-979e-41e27a74e789,1,0,adf9304c-ccf8-492e-95b1-0754764586a2,adf9304c-ccf8-492e-95b1-0754764586a2,1,0,fd175112-ec8f-4088-9b21-d8135056f0c5,fd175112-ec8f-4088-9b21-d8135056f0c5,1,0,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,1,0,df76a1b7-312a-4e77-bac1-79befadb4495,df76a1b7-312a-4e77-bac1-79befadb4495,1,0,ab39fad8-1039-491e-982a-c49637770ec0,ab39fad8-1039-491e-982a-c49637770ec0,1,0,7d93a6ba-3ca7-45ab-a540-743c79587535,7d93a6ba-3ca7-45ab-a540-743c79587535,1,0,76b58810-0527-4dfc-8858-bac68e7e65f3,76b58810-0527-4dfc-8858-bac68e7e65f3,1,0,aba97fd9-f05e-45cd-8404-ed702070e17a,aba97fd9-f05e-45cd-8404-ed702070e17a,1,0,f5c415cd-429b-469f-9332-c43ab5d1c8d6,f5c415cd-429b-469f-9332-c43ab5d1c8d6,1,0,6de34ed8-5d6c-4bb6-af94-328e692b862e,6de34ed8-5d6c-4bb6-af94-328e692b862e,1,0,e705bde3-45c3-4ffd-a767-0320c6cc8b91,e705bde3-45c3-4ffd-a767-0320c6cc8b91,1,0,504280a1-a451-4547-ae71-e217f8fdf8f6,504280a1-a451-4547-ae71-e217f8fdf8f6,1,0,b071a9fe-0e9f-4ded-8dab-b1388fd12897,b071a9fe-0e9f-4ded-8dab-b1388fd12897,1,0,a2accd5e-e6f5-4d5f-8243-51aadfa88b00,a2accd5e-e6f5-4d5f-8243-51aadfa88b00,1,0,458e9c6b-b828-404b-be5a-c6c0aeea34c9,458e9c6b-b828-404b-be5a-c6c0aeea34c9,1,0,7262eb4d-2d2d-454c-beaa-974645813af7,7262eb4d-2d2d-454c-beaa-974645813af7,1,0,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,1,0,49221b2f-aae2-4bee-9a1a-18263fc74244,49221b2f-aae2-4bee-9a1a-18263fc74244,1,0,da0cd264-da2f-4044-af28-c91d2efe1d5c,da0cd264-da2f-4044-af28-c91d2efe1d5c,1,0,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,1,0,fad26b16-8638-496b-bd12-381fc6f5b71f,fad26b16-8638-496b-bd12-381fc6f5b71f,1,0,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,1,0,324a56c9-02d9-4177-af84-a817b8c41169,324a56c9-02d9-4177-af84-a817b8c41169,1,0,64ed8c1a-6446-4f0d-a2ef-c599e84c4909,64ed8c1a-6446-4f0d-a2ef-c599e84c4909,1,0,52fc85fb-309b-4739-bbd3-c3966657e973,52fc85fb-309b-4739-bbd3-c3966657e973,1,0,87081ab5-bdd5-4daa-88ef-8a2cba8c7d53,87081ab5-bdd5-4daa-88ef-8a2cba8c7d53,1,0,be3cfba8-e6f6-4202-ab0f-96c00fbf7462,be3cfba8-e6f6-4202-ab0f-96c00fbf7462,1,0,64ef1b5c-ec04-45eb-9998-bc573f4038d7,64ef1b5c-ec04-45eb-9998-bc573f4038d7,1,0,4fde5159-8f21-4151-8dbd-b2cd376d9392,4fde5159-8f21-4151-8dbd-b2cd376d9392,1,0,3ea799a6-6642-4388-b0a3-c2962e71ff51,3ea799a6-6642-4388-b0a3-c2962e71ff51,1,0,1e44abfe-c173-4802-b535-96849d384983,1e44abfe-c173-4802-b535-96849d384983,1,0,2751a509-037b-49aa-9ca8-e87057d6d82c,2751a509-037b-49aa-9ca8-e87057d6d82c,1,0,35f62549-eb6a-4284-a6e3-406b0d9df0cf,35f62549-eb6a-4284-a6e3-406b0d9df0cf,1,0,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,1,0,fd66995b-ee76-41d3-983f-33d84bdcbbd4,fd66995b-ee76-41d3-983f-33d84bdcbbd4,1,0,73e97918-b34e-4ad2-8591-4c219eb92f2c,73e97918-b34e-4ad2-8591-4c219eb92f2c,1,0,445cf7eb-35d0-48f8-9579-c2ec574ef324,445cf7eb-35d0-48f8-9579-c2ec574ef324,1,0,1025657e-afd2-4c7b-96d5-ccbedaca4619,1025657e-afd2-4c7b-96d5-ccbedaca4619,1,0,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,1,0,e754ad5c-cf3c-4198-af81-128475924cb0,e754ad5c-cf3c-4198-af81-128475924cb0,1,0,ed65d504-b210-4014-85ec-275ad633ef04,ed65d504-b210-4014-85ec-275ad633ef04,1,0,dc31edb1-273e-4b1a-8e69-32393479ff36,dc31edb1-273e-4b1a-8e69-32393479ff36,1,0,3ab0649b-239f-4466-b897-73c0ab628927,3ab0649b-239f-4466-b897-73c0ab628927,1,0,4c697110-8941-4d6d-ba03-f2b9e96ff82e,4c697110-8941-4d6d-ba03-f2b9e96ff82e,1,0,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,1,0,b172631b-da0d-42f4-ae6b-ae122a46cced,b172631b-da0d-42f4-ae6b-ae122a46cced,1,0,1a25e744-37ae-46ca-a328-ff8eced21a82,1a25e744-37ae-46ca-a328-ff8eced21a82,1,0,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,1,0,46169f0b-8514-40a1-9d27-8489cab72503,46169f0b-8514-40a1-9d27-8489cab72503,1,0,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,1,0,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,1,0,c90243af-582c-4f5a-88e7-e0cbc0555fcb,c90243af-582c-4f5a-88e7-e0cbc0555fcb,1,0,14bf4066-15cb-4165-b854-45443ee27da1,14bf4066-15cb-4165-b854-45443ee27da1,1,0,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,1,0,5a94a307-3f54-4753-8ef5-ce9f88417827,5a94a307-3f54-4753-8ef5-ce9f88417827,1,0,0f09b6b8-72ac-4461-96c4-683be403e2ff,0f09b6b8-72ac-4461-96c4-683be403e2ff,1,0,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,1,0,19d1d74a-de5f-475a-896c-a32b7d28f918,19d1d74a-de5f-475a-896c-a32b7d28f918,1,0,4427cab9-4eea-4415-98ef-6021a447c60c,4427cab9-4eea-4415-98ef-6021a447c60c,1,0,fe46b4da-d865-468f-badd-83644bf88faa,fe46b4da-d865-468f-badd-83644bf88faa,1,0,2851c9d4-4366-4488-926d-a7fcd3b1548c,2851c9d4-4366-4488-926d-a7fcd3b1548c,1,0,31116aa2-cfbc-48e8-886b-45c1c17508fd,31116aa2-cfbc-48e8-886b-45c1c17508fd,1,0,6aa819d3-c56d-4561-a2e4-a1188ab1295a,6aa819d3-c56d-4561-a2e4-a1188ab1295a,1,0,2ddf344d-7065-40d5-9306-23870d8fc04a,2ddf344d-7065-40d5-9306-23870d8fc04a,1,0,c630ab2d-0a20-4136-88b6-220b2cad6a71,c630ab2d-0a20-4136-88b6-220b2cad6a71,1,0,00cd1dea-bc54-475c-956d-dc5221104932,00cd1dea-bc54-475c-956d-dc5221104932,1,0,c343495b-5947-4fe7-a94b-d1f2b2455b4f,c343495b-5947-4fe7-a94b-d1f2b2455b4f,1,0,fbce7316-bb9a-40c1-af3c-352f4b559ab6,fbce7316-bb9a-40c1-af3c-352f4b559ab6,1,0,a3721457-b33b-4742-b6e1-531af10969d1,a3721457-b33b-4742-b6e1-531af10969d1,1,0,9619a603-e578-4f30-bcc6-adfddfa915c0,9619a603-e578-4f30-bcc6-adfddfa915c0,1,0,3807f865-dd2c-44f7-9238-3db191f0a186,3807f865-dd2c-44f7-9238-3db191f0a186,1,0,4a55351b-77e2-4c7c-a7d7-aac213d3c2a7,4a55351b-77e2-4c7c-a7d7-aac213d3c2a7,1,0,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,1,0,2c5a56d3-386e-45df-adc2-4471f52f9bdc,2c5a56d3-386e-45df-adc2-4471f52f9bdc,1,0,8f184df5-bfe8-4df3-bc7c-18218cef7650,8f184df5-bfe8-4df3-bc7c-18218cef7650,1,0,387e273a-889f-454b-8b43-feaa12025fde,387e273a-889f-454b-8b43-feaa12025fde,1,0,22474ca3-565b-4b67-a5b4-b0b959306d10,22474ca3-565b-4b67-a5b4-b0b959306d10,1,0,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1,0,078d1e8f-6d27-4761-9532-b1e7a60e4c13,078d1e8f-6d27-4761-9532-b1e7a60e4c13,1,0,4262193c-58ad-47c6-8088-735d8cd037ea,4262193c-58ad-47c6-8088-735d8cd037ea,1,0,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,1,0,de6d1aad-39eb-46ce-87aa-d29812bb37bf,de6d1aad-39eb-46ce-87aa-d29812bb37bf,1,0,4ad859ec-cc75-4bac-9e89-397798450e48,4ad859ec-cc75-4bac-9e89-397798450e48,1,0,d93ab94c-0f55-4b80-b226-41b44c73b3ea,d93ab94c-0f55-4b80-b226-41b44c73b3ea,1,0,94cbed80-5a35-471f-b354-439a11629210,94cbed80-5a35-471f-b354-439a11629210,1,0,1162cc0a-42e5-47cb-9507-68459579f110,1162cc0a-42e5-47cb-9507-68459579f110,1,0,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,1,0,bb49dc80-4934-4f44-8f27-9a363dca8dc4,bb49dc80-4934-4f44-8f27-9a363dca8dc4,1,0,7338e497-03a7-4ed4-85a2-ca802c065a9f,7338e497-03a7-4ed4-85a2-ca802c065a9f,1,0,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,1,0,5249687b-9ff4-46f5-be15-dbb5d5047fd1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,1,0,d33df51c-3dcd-496c-90f2-7ee05582bdf7,d33df51c-3dcd-496c-90f2-7ee05582bdf7,1,0,24b39ebd-2424-4939-8e3e-d09eb674d409,24b39ebd-2424-4939-8e3e-d09eb674d409,1,0,08c751bb-9e57-4536-901e-bb316c8e96d7,08c751bb-9e57-4536-901e-bb316c8e96d7,1,0,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,1,0,034cdcef-08e5-4751-9885-400aa69e0b94,034cdcef-08e5-4751-9885-400aa69e0b94,1,0,3e44d463-f253-4a64-8d68-631fcb66935c,3e44d463-f253-4a64-8d68-631fcb66935c,1,0,653d6483-029b-4453-a7d0-3a3c6d9d0b05,653d6483-029b-4453-a7d0-3a3c6d9d0b05,1,0,ac507771-50bd-4f8b-b72f-5954562c9131,ac507771-50bd-4f8b-b72f-5954562c9131,1,0,efefebea-2032-4006-b9ca-50a23b7da1ef,efefebea-2032-4006-b9ca-50a23b7da1ef,1,0,4c794d37-3352-4acb-a939-5e90fb682db8,4c794d37-3352-4acb-a939-5e90fb682db8,1,0,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,1,0,008f5068-da9c-4dac-9c0a-a50366d27cbb,008f5068-da9c-4dac-9c0a-a50366d27cbb,1,0,950b3ee3-070f-4946-8b9b-0aa2058de986,950b3ee3-070f-4946-8b9b-0aa2058de986,1,0,bd04a870-0943-4bdb-9e30-50a69daa8a13,bd04a870-0943-4bdb-9e30-50a69daa8a13,1,0,573c2153-7069-4589-8a2a-4517edca877d,573c2153-7069-4589-8a2a-4517edca877d,1,0,0a2f03c1-87d7-4589-9c47-8dd67faa1759,0a2f03c1-87d7-4589-9c47-8dd67faa1759,1,0,d1475ede-879c-4085-9980-2edaaf0eb0e9,d1475ede-879c-4085-9980-2edaaf0eb0e9,1,0,54eac28f-da81-4939-b2f9-924d3c215de5,54eac28f-da81-4939-b2f9-924d3c215de5,1,0,20d34659-1bde-4af0-be2c-da922e4ace6e,20d34659-1bde-4af0-be2c-da922e4ace6e,1,0,dec45aee-a4a8-473c-904e-15d5ff31efc3,dec45aee-a4a8-473c-904e-15d5ff31efc3,1,0,8b9318e5-c6ce-4253-9759-8ddd42468775,8b9318e5-c6ce-4253-9759-8ddd42468775,1,0,31cac1e9-eb16-489c-9322-30d1e27a80b3,31cac1e9-eb16-489c-9322-30d1e27a80b3,1,0,0d100e33-7941-41c1-962d-7672c874e9c5,0d100e33-7941-41c1-962d-7672c874e9c5,1,0,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,1,0,6e61d717-de36-4dce-8af9-b6c14ed76acb,6e61d717-de36-4dce-8af9-b6c14ed76acb,1,0,474518fe-9cb5-4a12-9388-bc7a64511617,474518fe-9cb5-4a12-9388-bc7a64511617,1,0,64337614-b1c9-4931-b576-448721fa4602,64337614-b1c9-4931-b576-448721fa4602,1,0,1d73b59c-0594-4ed3-b584-cf1261941e1d,1d73b59c-0594-4ed3-b584-cf1261941e1d,1,0,8ff2547f-d596-4fa1-9e12-079e1cc4c057,8ff2547f-d596-4fa1-9e12-079e1cc4c057,1,0,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1,0,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,1,0,05507f2b-eed8-4da4-8efc-77d9d8e2daca,05507f2b-eed8-4da4-8efc-77d9d8e2daca,1,0,0440ed06-3f42-48a8-9431-fd608920b577,0440ed06-3f42-48a8-9431-fd608920b577,1,0,37be75c9-bf1a-437a-ab05-f9e3aac6f440,37be75c9-bf1a-437a-ab05-f9e3aac6f440,1,0,b85b3a58-95e4-4698-b1ae-037901ecc1b1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,1,0,b77d748a-d180-432d-91c3-774e6ccf7efa,b77d748a-d180-432d-91c3-774e6ccf7efa,1,0,e5b9c1b0-4690-442c-b160-e6c587e42e57,e5b9c1b0-4690-442c-b160-e6c587e42e57,1,0,e3adb576-6b33-475b-976b-7a6783de3184,e3adb576-6b33-475b-976b-7a6783de3184,1,0,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,1,0,78f5a205-dffb-4009-897a-e8f36372f33c,78f5a205-dffb-4009-897a-e8f36372f33c,1,0,f7597041-f182-42fb-803a-2521c70d627d,f7597041-f182-42fb-803a-2521c70d627d,1,0,ce988b8a-d0c1-400a-9466-aa757501bb58,ce988b8a-d0c1-400a-9466-aa757501bb58,1,0,ab98d665-8da8-406e-9e0e-3e130ab393ef,ab98d665-8da8-406e-9e0e-3e130ab393ef,1,0,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,1,0,ea8beea1-7d80-4613-b2f9-79ee612e977a,ea8beea1-7d80-4613-b2f9-79ee612e977a,1,0,afd62a32-fdbb-429a-9a64-89c61a07e018,afd62a32-fdbb-429a-9a64-89c61a07e018,1,0,027cef43-99bd-48d3-a1a3-2102ac003742,027cef43-99bd-48d3-a1a3-2102ac003742,1,0,00197ea9-de76-4e2a-97bc-93e44053e35e,00197ea9-de76-4e2a-97bc-93e44053e35e,1,0,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,1,0,a51f7c6f-2631-4d23-becc-c0e8b711fddd,a51f7c6f-2631-4d23-becc-c0e8b711fddd,1,0,37806357-d92c-4bea-a5ef-77f138578fda,37806357-d92c-4bea-a5ef-77f138578fda,1,0,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,1,0,0a880538-f97f-448e-a4a9-82b0194dbe28,0a880538-f97f-448e-a4a9-82b0194dbe28,1,0,179868b7-d342-4df0-9386-c114d75faf3a,179868b7-d342-4df0-9386-c114d75faf3a,1,0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,1,0,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,1,0,7e4afed8-5c56-4765-bcd0-a40e6121ba22,7e4afed8-5c56-4765-bcd0-a40e6121ba22,1,0,155660a1-8a63-4562-a715-d75a8af7176b,155660a1-8a63-4562-a715-d75a8af7176b,1,0,878fe826-fa99-44ad-9891-5eada9744017,878fe826-fa99-44ad-9891-5eada9744017,1,0,0d61712a-dfaf-46f1-b728-62993dd94fbe,0d61712a-dfaf-46f1-b728-62993dd94fbe,1,0,3a6cf496-09b9-4947-9df5-06d23b474558,3a6cf496-09b9-4947-9df5-06d23b474558,1,0,625b498a-33d1-4162-9525-fb7790cbb6a8,625b498a-33d1-4162-9525-fb7790cbb6a8,1,0,28223f7b-d15a-4f12-b57c-1f6d08a902f9,28223f7b-d15a-4f12-b57c-1f6d08a902f9,1,0,dd9eb5b7-5aed-4e51-9939-9ff14492d240,dd9eb5b7-5aed-4e51-9939-9ff14492d240,1,0,b2a14899-d589-4990-b85e-7bffb427e8af,b2a14899-d589-4990-b85e-7bffb427e8af,1,0,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0981d114-05bd-4ee1-a8fd-398fa6620d0b,1,0,3210ba40-382e-4917-ad0f-9bd88d23dc25,3210ba40-382e-4917-ad0f-9bd88d23dc25,1,0,835e3ead-d01f-410b-937a-902dd5e66aec,835e3ead-d01f-410b-937a-902dd5e66aec,1,0,40141982-d1d6-416f-844e-19143a407ff9,40141982-d1d6-416f-844e-19143a407ff9,1,0,f5c4d4ad-dda6-4dc3-b112-61f776006f3c,f5c4d4ad-dda6-4dc3-b112-61f776006f3c,1,0,466d9fd7-188e-4f3b-a673-35db9075d537,466d9fd7-188e-4f3b-a673-35db9075d537,1,0,1c2e2c7d-c9d2-46a6-81f9-30078ca511c7,1c2e2c7d-c9d2-46a6-81f9-30078ca511c7,1,0,09d3717a-d6f9-42fd-ae9e-df5658fa3981,09d3717a-d6f9-42fd-ae9e-df5658fa3981,1,0,98393093-7ba6-4b4d-86be-ee5826cd8cd5,98393093-7ba6-4b4d-86be-ee5826cd8cd5,1,0,87de486d-3f35-4432-a7cd-9d3832db63cf,87de486d-3f35-4432-a7cd-9d3832db63cf,1,0,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,1,0,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,1,0,bb7ce04a-8143-4c0b-a196-1b57f1640142,bb7ce04a-8143-4c0b-a196-1b57f1640142,1,0,4872f12c-705c-4dd3-802f-d27496a0d634,4872f12c-705c-4dd3-802f-d27496a0d634,1,0,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,1,0,fc65918a-2ad1-47b1-980d-5afe63579964,fc65918a-2ad1-47b1-980d-5afe63579964,1,0,7ece6efe-16a1-4294-8c28-3fa6427ba9f0,7ece6efe-16a1-4294-8c28-3fa6427ba9f0,1,0,61094d92-b1e6-45b9-9258-38a7bb1d6469,61094d92-b1e6-45b9-9258-38a7bb1d6469,1,0,4791b5d4-3568-4420-8c25-89ecce7c6353,4791b5d4-3568-4420-8c25-89ecce7c6353,1,0,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,1,0,f9ada91a-e673-4821-9bce-cb0dd75ca28b,f9ada91a-e673-4821-9bce-cb0dd75ca28b,1,0,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,1,0,90ce635a-0277-4056-980d-d1a16d91cb30,90ce635a-0277-4056-980d-d1a16d91cb30,1,0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,1,0,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1,0,00605607-03ab-43fc-ba08-9fc32f582d0a,00605607-03ab-43fc-ba08-9fc32f582d0a,1,0,5ab0a910-74ab-4af0-b5a3-40845a789fde,5ab0a910-74ab-4af0-b5a3-40845a789fde,1,0,bb659006-c11e-4427-8d86-229ba43ef679,bb659006-c11e-4427-8d86-229ba43ef679,1,0,766208a3-2780-427b-a7d3-93abe99d236b,766208a3-2780-427b-a7d3-93abe99d236b,1,0,63ce4c3c-5bad-409c-904f-18f34cf1da78,63ce4c3c-5bad-409c-904f-18f34cf1da78,1,0,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,1,0,26ac22f9-0bbb-4671-b446-626e345e2461,26ac22f9-0bbb-4671-b446-626e345e2461,1,0,0d63ee6d-e17f-4a86-b384-adf9793f3331,0d63ee6d-e17f-4a86-b384-adf9793f3331,1,0,f152945b-2a7b-449e-a915-176166af7bac,f152945b-2a7b-449e-a915-176166af7bac,1,0,77f5d86a-7fae-4490-9740-0e31102dab5c,77f5d86a-7fae-4490-9740-0e31102dab5c,1,0,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,1,0,24be43ec-d39e-46aa-9c11-2536b835e515,24be43ec-d39e-46aa-9c11-2536b835e515,1,0,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,1,0,df9af3ee-6a69-4a03-8ff5-0735e9a38013,df9af3ee-6a69-4a03-8ff5-0735e9a38013,1,0,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1,0,7743fe24-b941-4dad-bc76-05fb6b26b1d7,7743fe24-b941-4dad-bc76-05fb6b26b1d7,1,0,5bf2da0d-f318-4036-9234-8a3a6eca88b2,5bf2da0d-f318-4036-9234-8a3a6eca88b2,1,0,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,1,0,c3634571-6fe5-45ab-9362-161305eef661,c3634571-6fe5-45ab-9362-161305eef661,1,0,ec11342f-594f-416f-a10f-bd1bfa695c08,ec11342f-594f-416f-a10f-bd1bfa695c08,1,0,31c3ac44-204e-43fd-bca3-fd18fa091c58,31c3ac44-204e-43fd-bca3-fd18fa091c58,1,0,74f03c35-5da0-406e-a938-e8e5d49975ef,74f03c35-5da0-406e-a938-e8e5d49975ef,1,0,c9ab3890-6d16-431f-ab2b-b5058e6202a4,c9ab3890-6d16-431f-ab2b-b5058e6202a4,1,0,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,1,0,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,1,0,4090c6f7-1d25-4b17-9baa-18daa0640b0f,4090c6f7-1d25-4b17-9baa-18daa0640b0f,1,0,26125e58-dfc8-4bbb-a3a4-80616471746e,26125e58-dfc8-4bbb-a3a4-80616471746e,1,0,b1c699cd-efdc-461c-ad37-10bfd4bc9674,b1c699cd-efdc-461c-ad37-10bfd4bc9674,1,0,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,1,0,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,1,0,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,1,0,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,1,0,96661303-1286-4f84-93b7-0e6da2bd7893,96661303-1286-4f84-93b7-0e6da2bd7893,1,0,68076431-36e6-46dc-92cb-e0d8e605bf66,68076431-36e6-46dc-92cb-e0d8e605bf66,1,0,239fa55a-6572-4e5c-9918-c2e14063c76d,239fa55a-6572-4e5c-9918-c2e14063c76d,1,0,8211a1b6-c3b1-466b-8d11-22603fb50c7a,8211a1b6-c3b1-466b-8d11-22603fb50c7a,1,0,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,1,0,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,1,0,a83cb338-5707-42c9-9e88-11f6c68fcc32,a83cb338-5707-42c9-9e88-11f6c68fcc32,1,0,36b15776-5211-4afa-9b6c-c042121218c0,36b15776-5211-4afa-9b6c-c042121218c0,1,0,422a0e10-361f-46ba-b92e-3088d81e12a4,422a0e10-361f-46ba-b92e-3088d81e12a4,1,0,f37b7b25-abd2-4e19-9712-78aafceb4f43,f37b7b25-abd2-4e19-9712-78aafceb4f43,1,0,7cd4c6ea-5795-4bea-a159-1e66650c42fe,7cd4c6ea-5795-4bea-a159-1e66650c42fe,1,0,091fcffa-da7e-4375-bf0b-11cc4950b5ad,091fcffa-da7e-4375-bf0b-11cc4950b5ad,1,0,57e91491-73b6-43f7-b7f8-26efec56ce9e,57e91491-73b6-43f7-b7f8-26efec56ce9e,1,0,f93741c9-ab94-464b-b0d4-4af99c9f92d5,f93741c9-ab94-464b-b0d4-4af99c9f92d5,1,0,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,1,0,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,1,0,c59fd3f8-c734-49d3-90ba-e608a22ac981,c59fd3f8-c734-49d3-90ba-e608a22ac981,1,0,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,1,0,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,1,0,475f76ea-f494-41f1-9b65-f39907e5a427,475f76ea-f494-41f1-9b65-f39907e5a427,1,0,986280d1-41bb-4b15-a5ae-516d6a04c1f4,986280d1-41bb-4b15-a5ae-516d6a04c1f4,1,0,43bfd29a-d254-4c33-8639-200b483578c1,43bfd29a-d254-4c33-8639-200b483578c1,1,0,6a274167-7f80-4613-9890-259ffd8ccfc4,6a274167-7f80-4613-9890-259ffd8ccfc4,1,0,00696255-ea14-4fee-8633-0962f3c441d1,00696255-ea14-4fee-8633-0962f3c441d1,1,0,4e90e1ab-b1ec-4795-ad45-1db151a5492c,4e90e1ab-b1ec-4795-ad45-1db151a5492c,1,0,91791e56-ca80-4d90-b8a8-16145f6a9721,91791e56-ca80-4d90-b8a8-16145f6a9721,1,0,b242c6a2-5ac9-4edb-b5dd-24eda8162151,b242c6a2-5ac9-4edb-b5dd-24eda8162151,1,0,8d080f3c-06ed-48bf-9709-eea73d676741,8d080f3c-06ed-48bf-9709-eea73d676741,1,0,57b31a5d-9fdc-43d2-ae81-67157822c4b6,57b31a5d-9fdc-43d2-ae81-67157822c4b6,1,0,d4e2da66-9a70-459f-a873-cb4ad71d17b2,d4e2da66-9a70-459f-a873-cb4ad71d17b2,1,0,a84a91d2-d326-4bf4-82e6-d573ee35d090,a84a91d2-d326-4bf4-82e6-d573ee35d090,1,0,fef27478-ddfd-4ad9-8161-148761f29698,fef27478-ddfd-4ad9-8161-148761f29698,1,0,39cbda23-db3f-4ddd-8981-8540247406db,39cbda23-db3f-4ddd-8981-8540247406db,1,0,c8a18d99-62ff-45a4-acb5-48e3310c1b53,c8a18d99-62ff-45a4-acb5-48e3310c1b53,1,0,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,1,0,3500c6fa-813a-49dd-a4bf-163500db5b7f,3500c6fa-813a-49dd-a4bf-163500db5b7f,1,0,1d02493a-dd89-4a51-b75e-9c49f9818b95,1d02493a-dd89-4a51-b75e-9c49f9818b95,1,0,2845c5d1-e836-4499-bcae-f3c8fdae75ee,2845c5d1-e836-4499-bcae-f3c8fdae75ee,1,0,fe4e8e4e-9471-4583-b9b3-576007db08ee,fe4e8e4e-9471-4583-b9b3-576007db08ee,1,0,49deaaa8-6d50-4b25-8153-6712d88fb0fb,49deaaa8-6d50-4b25-8153-6712d88fb0fb,1,0,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1,0,46a06de8-06fd-4b49-835f-4f24b832b3c4,46a06de8-06fd-4b49-835f-4f24b832b3c4,1,0,3845a567-4375-4c3a-af61-5b82674060ab,3845a567-4375-4c3a-af61-5b82674060ab,1,0,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,1,0,a835a3a7-989b-4247-b836-d23bba2f391a,a835a3a7-989b-4247-b836-d23bba2f391a,1,0,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,1,0,9b149c20-9328-4e2d-a34b-95c883ae4dcc,9b149c20-9328-4e2d-a34b-95c883ae4dcc,1,0,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,1,0,f8dbf226-ea56-4b15-baf1-a41fceba2a32,f8dbf226-ea56-4b15-baf1-a41fceba2a32,1,0,5e86a443-bd0f-411d-b1b9-41bfa0cf1a2f,5e86a443-bd0f-411d-b1b9-41bfa0cf1a2f,1,0,fcaecd43-b938-4680-93be-963db5218f35,fcaecd43-b938-4680-93be-963db5218f35,1,0,63415525-46a2-4d70-bdab-665945a9185c,63415525-46a2-4d70-bdab-665945a9185c,1,0,27e37fde-daf0-47fa-865c-3cd86151f5be,27e37fde-daf0-47fa-865c-3cd86151f5be,1,0,b3b63074-984a-48d2-ba5b-d69dd0b8067e,b3b63074-984a-48d2-ba5b-d69dd0b8067e,1,0,fc4a9f03-c81f-4201-814c-c6d5a5029168,fc4a9f03-c81f-4201-814c-c6d5a5029168,1,0,abba612c-137a-4dff-89f3-445945c30859,abba612c-137a-4dff-89f3-445945c30859,1,0,c4753515-a483-453e-a48b-b12d8ef48fd9,c4753515-a483-453e-a48b-b12d8ef48fd9,1,0,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,1,0,98c3bc52-2351-460c-8b8e-0d3f45ca3131,98c3bc52-2351-460c-8b8e-0d3f45ca3131,1,0,d1ade16c-bd56-46e5-874f-3117c5653192,d1ade16c-bd56-46e5-874f-3117c5653192,1,0,339398c0-6407-483c-82f7-266ef08b8657,339398c0-6407-483c-82f7-266ef08b8657,1,0,4f0a8f8c-68cb-4afe-b487-64e7ceeef9ab,4f0a8f8c-68cb-4afe-b487-64e7ceeef9ab,1,0,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,1,0,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,1,0,29645810-44aa-402c-9561-7819d6f4a7ab,29645810-44aa-402c-9561-7819d6f4a7ab,1,0,46bf4911-5200-44ac-9b4d-eb0089c12e34,46bf4911-5200-44ac-9b4d-eb0089c12e34,1,0,6e1685bd-7269-401c-b36e-def6a36b41d5,6e1685bd-7269-401c-b36e-def6a36b41d5,1,0,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,1,0,e03b6592-b597-4795-a78e-775d4f2258db,e03b6592-b597-4795-a78e-775d4f2258db,1,0,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,1,0,3b207d5f-6584-4cf2-9173-20235484f9f4,3b207d5f-6584-4cf2-9173-20235484f9f4,1,0,878d9efe-b0e7-487f-b8f7-83470c131e09,878d9efe-b0e7-487f-b8f7-83470c131e09,1,0,8270573d-8ed6-449d-853b-462d2dabaaa9,8270573d-8ed6-449d-853b-462d2dabaaa9,1,0,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,1,0,f2502463-67e4-4bfe-8ad5-fb80aa73975a,f2502463-67e4-4bfe-8ad5-fb80aa73975a,1,0,59e885e6-d978-40c2-95b6-35fc61074fb4,59e885e6-d978-40c2-95b6-35fc61074fb4,1,0,267dc512-9ee1-4bc1-9034-3effb7fb2949,267dc512-9ee1-4bc1-9034-3effb7fb2949,1,0,0f211e73-5be9-4015-93e7-ccf63e793cb6,0f211e73-5be9-4015-93e7-ccf63e793cb6,1,0,6574d8f4-fb97-4a26-b166-711fad63aa07,6574d8f4-fb97-4a26-b166-711fad63aa07,1,0,fb3eddaf-3241-4d59-8314-97a5ae9258c4,fb3eddaf-3241-4d59-8314-97a5ae9258c4,1,0,a3b0494c-f436-45ea-9577-4c0c86b057c9,a3b0494c-f436-45ea-9577-4c0c86b057c9,1,0,5101c142-b25c-4bef-80e7-7407f2c15c90,5101c142-b25c-4bef-80e7-7407f2c15c90,1,0,6d7872f1-fd54-41c4-8253-5f2b125f31ae,6d7872f1-fd54-41c4-8253-5f2b125f31ae,1,0,0c218200-27a8-4f71-9b09-3632dd453644,0c218200-27a8-4f71-9b09-3632dd453644,1,0,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,1,0,b5d30250-18ab-4af1-b99a-ff5dba334d1f,b5d30250-18ab-4af1-b99a-ff5dba334d1f,1,0,936f1aa5-7516-444b-b451-1162fa5d705f,936f1aa5-7516-444b-b451-1162fa5d705f,1,0,e8d5533e-2669-44f6-9eed-eaedab666d42,e8d5533e-2669-44f6-9eed-eaedab666d42,1,0,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,1,0,9e323b0d-4e3b-45d4-9705-aa30e63014f5,9e323b0d-4e3b-45d4-9705-aa30e63014f5,1,0,5afa798a-958e-4e0c-a380-0104f4c037a7,5afa798a-958e-4e0c-a380-0104f4c037a7,1,0,c0295fd9-c749-41b3-8d0d-6af16f484b1f,c0295fd9-c749-41b3-8d0d-6af16f484b1f,1,0,bd32a863-3090-432d-89c4-356ba86a0bdc,bd32a863-3090-432d-89c4-356ba86a0bdc,1,0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,1,0,ed5465b4-a556-4078-ab18-49fef2afba2e,ed5465b4-a556-4078-ab18-49fef2afba2e,1,0,7368ab8f-59d5-4270-a43b-0f3e422169ed,7368ab8f-59d5-4270-a43b-0f3e422169ed,1,0,eeb0571b-1b74-4889-b8b5-f94186d692d7,eeb0571b-1b74-4889-b8b5-f94186d692d7,1,0,9ef3b72c-caa3-486b-9917-04c00f6689c1,9ef3b72c-caa3-486b-9917-04c00f6689c1,1,0,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,1,0,9245417f-f247-47ba-a1b4-a17ec2e8776c,9245417f-f247-47ba-a1b4-a17ec2e8776c,1,0,a4b721d7-b119-47eb-80e0-7db34c83964f,a4b721d7-b119-47eb-80e0-7db34c83964f,1,0,512629d1-e8b7-4f66-b613-b8c0cb9c250b,512629d1-e8b7-4f66-b613-b8c0cb9c250b,1,0,b7cf4684-4432-4658-9c06-b315d470a3a6,b7cf4684-4432-4658-9c06-b315d470a3a6,1,0,d3bc8211-54d8-47dd-aecf-5da72b65195f,d3bc8211-54d8-47dd-aecf-5da72b65195f,1,0,33f11da8-f670-4ec3-9d40-96fce031c60f,33f11da8-f670-4ec3-9d40-96fce031c60f,1,0,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,1,0,f74c2d41-2433-4bed-8aef-adfeed198252,f74c2d41-2433-4bed-8aef-adfeed198252,1,0,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,1,0,56c9703a-751a-4e6c-81f4-a8756fb040e3,56c9703a-751a-4e6c-81f4-a8756fb040e3,1,0,c3a86eec-1ff5-4392-9904-91a12a2e253a,c3a86eec-1ff5-4392-9904-91a12a2e253a,1,0,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,1,0,f02b7246-dae9-4e15-b4cd-b06133664d34,f02b7246-dae9-4e15-b4cd-b06133664d34,1,0,77f20022-17ce-4e00-8a84-015238bce6f3,77f20022-17ce-4e00-8a84-015238bce6f3,1,0,3734619b-7059-4547-8b97-0b3393389d4d,3734619b-7059-4547-8b97-0b3393389d4d,1,0,a30bf95f-aabd-4da0-8287-61e08f9362fb,a30bf95f-aabd-4da0-8287-61e08f9362fb,1,0,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,1,0,4078867c-2972-47f9-bebd-935a6f1cc667,4078867c-2972-47f9-bebd-935a6f1cc667,1,0,8502fe39-c241-4be5-a313-fd887bbbdfa1,8502fe39-c241-4be5-a313-fd887bbbdfa1,1,0,67a71201-13e5-42a3-902f-fb3a59710dfb,67a71201-13e5-42a3-902f-fb3a59710dfb,1,0,3a79a951-a997-4596-ab62-ba376d67725d,3a79a951-a997-4596-ab62-ba376d67725d,1,0,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,1,0,884c28de-434f-440a-8c63-67e659c097ad,884c28de-434f-440a-8c63-67e659c097ad,1,0,92ead3b5-8c55-4e4d-bd47-009e025b22f8,92ead3b5-8c55-4e4d-bd47-009e025b22f8,1,0,50d8e365-aa58-4b60-8992-01943379d485,50d8e365-aa58-4b60-8992-01943379d485,1,0,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,1,0,b3f7f763-bea9-4f59-9450-df95e5c3d89d,b3f7f763-bea9-4f59-9450-df95e5c3d89d,1,0,9111e28e-c1c7-414b-9288-61bd06a04d04,9111e28e-c1c7-414b-9288-61bd06a04d04,1,0,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,1,0,fec102ea-a3f6-49b5-b4b8-6884b0654129,fec102ea-a3f6-49b5-b4b8-6884b0654129,1,0,246571fb-38c7-4da6-929d-d8b44bc3437c,246571fb-38c7-4da6-929d-d8b44bc3437c,1,0,047fd6d7-5e30-4184-a09a-6525de526cc7,047fd6d7-5e30-4184-a09a-6525de526cc7,1,0,beb44b02-5d5e-4127-aee7-e184a43a4210,beb44b02-5d5e-4127-aee7-e184a43a4210,1,0,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1,0,e24641ed-3e92-46d7-852b-9958ab7bc520,e24641ed-3e92-46d7-852b-9958ab7bc520,1,0,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,1,0,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,1,0,2c61114f-abd7-4415-8cdf-4fe95d9fe354,2c61114f-abd7-4415-8cdf-4fe95d9fe354,1,0,abd7a766-5cc1-48db-8d29-797e9d666a78,abd7a766-5cc1-48db-8d29-797e9d666a78,1,0,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1,0,62eca88f-025d-44de-b92c-46cd8bc7e4a1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,1,0,8fbf9432-77e8-4951-87a1-4368e3a5e117,8fbf9432-77e8-4951-87a1-4368e3a5e117,1,0,fbd5d6d8-05cd-43a3-85da-8dcbeee08333,fbd5d6d8-05cd-43a3-85da-8dcbeee08333,1,0,b0dde395-8498-4469-9507-d290798117d7,b0dde395-8498-4469-9507-d290798117d7,1,0,999616ea-0faa-4ae2-9841-6a6997ea6694,999616ea-0faa-4ae2-9841-6a6997ea6694,1,0,c5f91669-13d8-4f0a-a054-2701078da38a,c5f91669-13d8-4f0a-a054-2701078da38a,1,0,34f9872b-e02e-4093-ba06-3cb5b8995850,34f9872b-e02e-4093-ba06-3cb5b8995850,1,0,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,1,0,3afe11f6-7424-4b41-a42f-91db33756fa3,3afe11f6-7424-4b41-a42f-91db33756fa3,1,0,94e68502-adf1-476e-be2f-8418385959fa,94e68502-adf1-476e-be2f-8418385959fa,1,0,bf80ccc5-f907-4e7f-a007-6030c7ba682e,bf80ccc5-f907-4e7f-a007-6030c7ba682e,1,0,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,1,0,05f1f184-50cb-47c5-b3a8-62be6a9780c1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,1,0,f908b81e-f5ba-46ca-b7c0-8cb43ab23901,f908b81e-f5ba-46ca-b7c0-8cb43ab23901,1,0,3c305f89-e453-46c7-987b-f01dc964efdb,3c305f89-e453-46c7-987b-f01dc964efdb,1,0,1809ff43-2af2-44d1-ac7b-91d5bbe4f0ce,1809ff43-2af2-44d1-ac7b-91d5bbe4f0ce,1,0,58c3936c-4db0-45c8-a22e-b5dd49a61497,58c3936c-4db0-45c8-a22e-b5dd49a61497,1,0,9aa607bc-5870-436a-bbe1-296560393e3b,9aa607bc-5870-436a-bbe1-296560393e3b,1,0,1635be16-4861-4a7d-babc-4caff448a7f7,1635be16-4861-4a7d-babc-4caff448a7f7,1,0,9e399087-c957-4a7a-ab9d-2b689736caab,9e399087-c957-4a7a-ab9d-2b689736caab,1,0,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,1,0,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,1,0,2b7372be-af0d-464e-8d09-8172229790af,2b7372be-af0d-464e-8d09-8172229790af,1,0,d85346db-be25-4dab-a2db-647c3d40dd17,d85346db-be25-4dab-a2db-647c3d40dd17,1,0,c7bafd34-5b15-42ec-b329-0be3002775ad,c7bafd34-5b15-42ec-b329-0be3002775ad,1,0,6feb2278-9149-47f8-a0ec-eb4bd9f44716,6feb2278-9149-47f8-a0ec-eb4bd9f44716,1,0,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,1,0,cd6770d5-cd3c-47af-bc46-c865993adf63,cd6770d5-cd3c-47af-bc46-c865993adf63,1,0,97ec899d-a2a0-4691-83ff-25b78dd49ef6,97ec899d-a2a0-4691-83ff-25b78dd49ef6,1,0,411db885-f761-44e5-bdd1-9fdf9e741ac1,411db885-f761-44e5-bdd1-9fdf9e741ac1,1,0,269ada84-71a9-4b4b-9604-caa40c5b7067,269ada84-71a9-4b4b-9604-caa40c5b7067,1,0,ea13607a-3e05-4468-9932-41b6d51cfedf,ea13607a-3e05-4468-9932-41b6d51cfedf,1,0,9f9936fc-54a0-4812-b12d-2f8f91551440,9f9936fc-54a0-4812-b12d-2f8f91551440,1,0,a5667633-9264-4dfa-9e26-c45e96e61ae3,a5667633-9264-4dfa-9e26-c45e96e61ae3,1,0,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,1,0,43e37533-ed38-4000-a387-5749f8d9aaf3,43e37533-ed38-4000-a387-5749f8d9aaf3,1,0,e93bdb44-64b3-43d8-b15a-c561dbb91974,e93bdb44-64b3-43d8-b15a-c561dbb91974,1,0,928e0e05-b946-48c8-9619-2d93eb94b036,928e0e05-b946-48c8-9619-2d93eb94b036,1,0,99e701f7-9206-4b20-bb32-e60c9a1d570e,99e701f7-9206-4b20-bb32-e60c9a1d570e,1,0,a7c7c835-5402-4bdd-a0e3-d21746174d5a,a7c7c835-5402-4bdd-a0e3-d21746174d5a,1,0,07e81872-afac-4720-86b4-91e7bf4a2881,07e81872-afac-4720-86b4-91e7bf4a2881,1,0,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,1,0,845262f8-8208-4c90-98ec-c85dd5734cf0,845262f8-8208-4c90-98ec-c85dd5734cf0,1,0,532dfa48-39b0-4d0f-9f8c-b51ca27e47a9,532dfa48-39b0-4d0f-9f8c-b51ca27e47a9,1,0,17bc0f34-c35b-4beb-be5f-8e8d8f06c053,17bc0f34-c35b-4beb-be5f-8e8d8f06c053,1,0,f91813e6-b75c-43fb-8da3-a0d958dc6fa0,f91813e6-b75c-43fb-8da3-a0d958dc6fa0,1,0,ad066c0d-4f4c-48af-9cc8-bb835372150a,ad066c0d-4f4c-48af-9cc8-bb835372150a,1,0,a2145e81-239e-4267-8a43-ea3f7babe878,a2145e81-239e-4267-8a43-ea3f7babe878,1,0,39598414-9c1d-46ec-a534-8bd43e622e45,39598414-9c1d-46ec-a534-8bd43e622e45,1,0,b552c510-4fd4-4c16-9022-dc5babcafc52,b552c510-4fd4-4c16-9022-dc5babcafc52,1,0,3892c06d-28f1-4238-a929-201316cac1ed,3892c06d-28f1-4238-a929-201316cac1ed,1,0,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,1,0,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,1,0,567c68fd-74c7-4b6e-9119-56ac8d78073c,567c68fd-74c7-4b6e-9119-56ac8d78073c,1,0,3326bbcb-b277-44db-a252-2448119e8146,3326bbcb-b277-44db-a252-2448119e8146,1,0,61cac5f7-320c-4098-9078-44fadcdeb219,61cac5f7-320c-4098-9078-44fadcdeb219,1,0,304304b1-36a4-42bb-8ab9-b23b59795001,304304b1-36a4-42bb-8ab9-b23b59795001,1,0,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,1,0,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,1,0,cd454738-62dd-4f95-af33-b52750678428,cd454738-62dd-4f95-af33-b52750678428,1,0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,1,0,e4abafc6-f859-4d96-9818-5b9bf8d66d69,e4abafc6-f859-4d96-9818-5b9bf8d66d69,1,0,535acd2c-26d2-4f32-9ae6-cc1956317c59,535acd2c-26d2-4f32-9ae6-cc1956317c59,1,0,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,1,0,ac4e0868-ba49-46b4-8872-d42483a5591f,ac4e0868-ba49-46b4-8872-d42483a5591f,1,0,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,1,0,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0493dcf1-5f94-41f9-a4c7-a52e12a29068,1,0,ca4c0299-625a-4b03-be0e-36ffb45c6d08,ca4c0299-625a-4b03-be0e-36ffb45c6d08,1,0,7fa1119b-4321-4b8f-a879-1d940084145a,7fa1119b-4321-4b8f-a879-1d940084145a,1,0,5d9c0841-6ea6-48dc-a53b-9f19894750f8,5d9c0841-6ea6-48dc-a53b-9f19894750f8,1,0,86b5303b-d967-4bc6-b2da-066c5a58613f,86b5303b-d967-4bc6-b2da-066c5a58613f,1,0,853b824d-9377-475f-913e-d02bd60f5f64,853b824d-9377-475f-913e-d02bd60f5f64,1,0,d5a73869-381e-4878-8db7-596643937202,d5a73869-381e-4878-8db7-596643937202,1,0,c91de10a-d370-4495-9d9e-98581e566385,c91de10a-d370-4495-9d9e-98581e566385,1,0,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,1,0,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,1,0,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,1,0,11a93e3a-3c5b-4242-913c-02474a383344,11a93e3a-3c5b-4242-913c-02474a383344,1,0,ddd2861c-592b-4879-b9de-4b05a22c0b43,ddd2861c-592b-4879-b9de-4b05a22c0b43,1,0,5b383021-a800-4f0b-b8a3-d344389bff6c,5b383021-a800-4f0b-b8a3-d344389bff6c,1,0,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,1,0,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,1,0,8a57d427-a34e-4121-84e6-1a86a9f9092d,8a57d427-a34e-4121-84e6-1a86a9f9092d,1,0,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,1,0,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,1,0,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,1,0,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,1,0,68447105-a784-4803-8eb8-3701b0fc819d,68447105-a784-4803-8eb8-3701b0fc819d,1,0,ec892726-dee3-4edb-ad71-020404b09477,ec892726-dee3-4edb-ad71-020404b09477,1,0,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,1,0,59dee70d-aeca-470a-b3c4-e43bb16c5753,59dee70d-aeca-470a-b3c4-e43bb16c5753,1,0,82777e92-0681-44bf-b51e-4d98fcd5d5bd,82777e92-0681-44bf-b51e-4d98fcd5d5bd,1,0,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,1,0,cee126de-d567-44d3-b14c-35da6e501324,cee126de-d567-44d3-b14c-35da6e501324,1,0,4599ef83-5f1e-44af-ae0c-67988656a99e,4599ef83-5f1e-44af-ae0c-67988656a99e,1,0,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,1,0,e1b94dcf-ec37-4b2d-a7af-120eeee40944,e1b94dcf-ec37-4b2d-a7af-120eeee40944,1,0,7d2a37b1-a1a0-435a-846a-95e255655044,7d2a37b1-a1a0-435a-846a-95e255655044,1,0,109db64c-00dc-490e-99a5-4430d9344e99,109db64c-00dc-490e-99a5-4430d9344e99,1,0,85837a55-fed5-4b7b-a622-30d728b9a677,85837a55-fed5-4b7b-a622-30d728b9a677,1,0,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,1,0,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,1,0,325bacdd-793f-47d8-b987-57e9d5f2782b,325bacdd-793f-47d8-b987-57e9d5f2782b,1,0,80395d47-70d7-4d8d-9b18-93283fba80c2,80395d47-70d7-4d8d-9b18-93283fba80c2,1,0,8b621ec9-24c9-4166-90ce-29c5ad30f78b,8b621ec9-24c9-4166-90ce-29c5ad30f78b,1,0,cc98670a-7b18-4973-b211-90261c5c8c10,cc98670a-7b18-4973-b211-90261c5c8c10,1,0,da9821c3-4b16-48b7-9088-d3cf8ac536a6,da9821c3-4b16-48b7-9088-d3cf8ac536a6,1,0,fb36c775-1124-4ba6-8af8-133bf66fcb54,fb36c775-1124-4ba6-8af8-133bf66fcb54,1,0,51f9aff4-71da-4b1b-b48b-04122a17d855,51f9aff4-71da-4b1b-b48b-04122a17d855,1,0,d5142574-a040-4dd0-a482-cdc61c1d86ab,d5142574-a040-4dd0-a482-cdc61c1d86ab,1,0,62957889-503f-4923-a372-29776dc3b5e5,62957889-503f-4923-a372-29776dc3b5e5,1,0,778e79ee-eb1a-4d52-8a31-58e781c78fe4,778e79ee-eb1a-4d52-8a31-58e781c78fe4,1,0,90385850-d37b-4b2e-ac87-95c17f32197c,90385850-d37b-4b2e-ac87-95c17f32197c,1,0,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,1,0,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,1,0,6b28a716-2fb1-47f7-a7d6-f2fe7edb32c3,6b28a716-2fb1-47f7-a7d6-f2fe7edb32c3,1,0,e849e46c-2ce6-427b-92bc-06d7997f59bf,e849e46c-2ce6-427b-92bc-06d7997f59bf,1,0,5a971dc0-28bf-4426-9426-9f456aea080a,5a971dc0-28bf-4426-9426-9f456aea080a,1,0,f480ac52-e2f1-4ed0-a0b1-20a622f77302,f480ac52-e2f1-4ed0-a0b1-20a622f77302,1,0,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,1,0,b9b0fbdc-8fda-46d1-bb3e-561a03604971,b9b0fbdc-8fda-46d1-bb3e-561a03604971,1,0,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,1,0,672c2936-9771-4e32-a970-7ac7f12a21e8,672c2936-9771-4e32-a970-7ac7f12a21e8,1,0,73afaad8-dfa9-43e3-bdaf-543c3545d788,73afaad8-dfa9-43e3-bdaf-543c3545d788,1,0,c264441d-4805-4968-baa2-37b8970049c7,c264441d-4805-4968-baa2-37b8970049c7,1,0,4f0bda80-2246-43be-95f8-ae8480682cd5,4f0bda80-2246-43be-95f8-ae8480682cd5,1,0,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,1,0,6f683f46-9eef-4e78-bc2f-7174238bf53c,6f683f46-9eef-4e78-bc2f-7174238bf53c,1,0,7d1ed38b-98cf-4a0e-a605-680bb580d904,7d1ed38b-98cf-4a0e-a605-680bb580d904,1,0,b769eda0-11de-401c-a68b-4fce4555d4fc,b769eda0-11de-401c-a68b-4fce4555d4fc,1,0,fd7a668f-3099-4e15-956a-92c6295dd4d5,fd7a668f-3099-4e15-956a-92c6295dd4d5,1,0,afcbd830-ec5f-4865-a176-ea3014dff908,afcbd830-ec5f-4865-a176-ea3014dff908,1,0,dc5fc801-14e4-42e8-b396-76eb30b69eea,dc5fc801-14e4-42e8-b396-76eb30b69eea,1,0,485b9f00-475a-49e5-ade2-b2e05d94ecf0,485b9f00-475a-49e5-ade2-b2e05d94ecf0,1,0,310aef5a-84d9-4a68-af78-d623beff8a88,310aef5a-84d9-4a68-af78-d623beff8a88,1,0,398bf9d1-c353-461e-a1be-683047dcbe41,398bf9d1-c353-461e-a1be-683047dcbe41,1,0,f36150de-33af-4410-8a4c-8c9f4b545793,f36150de-33af-4410-8a4c-8c9f4b545793,1,0,62f97480-7d4a-48f3-9d1d-612909b242c9,62f97480-7d4a-48f3-9d1d-612909b242c9,1,0,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,1,0,3068be84-a401-4701-8ac9-411fae130f84,3068be84-a401-4701-8ac9-411fae130f84,1,0,957394a7-e5b8-47fc-8680-1e71efe2be7d,957394a7-e5b8-47fc-8680-1e71efe2be7d,1,0,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,1,0,4f25ef45-c8d9-401d-b0e8-2217ac310f04,4f25ef45-c8d9-401d-b0e8-2217ac310f04,1,0,504ca240-b5ae-433e-ae5f-d818263eea23,504ca240-b5ae-433e-ae5f-d818263eea23,1,0,32461819-9437-417d-8d1e-851c9a2dcee2,32461819-9437-417d-8d1e-851c9a2dcee2,1,0,74228950-8a4b-4dd6-a053-8650de202521,74228950-8a4b-4dd6-a053-8650de202521,1,0,6b9ce91e-08b9-4972-9878-1724c67b68ec,6b9ce91e-08b9-4972-9878-1724c67b68ec,1,0,640814f2-6082-475e-8006-25fd5b24afdb,640814f2-6082-475e-8006-25fd5b24afdb,1,0,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,1,0,569047c2-0879-4fba-a814-44812d21043b,569047c2-0879-4fba-a814-44812d21043b,1,0,0c3c4494-c037-431e-9eeb-9b6cfd7372c3,0c3c4494-c037-431e-9eeb-9b6cfd7372c3,1,0,80512d95-5458-4934-98ae-a7b58099196b,80512d95-5458-4934-98ae-a7b58099196b,1,0,6f2354cd-4a34-4921-96bb-b786486f85cf,6f2354cd-4a34-4921-96bb-b786486f85cf,1,0,f1b66ea8-262d-4b38-a039-b83a843f6ee8,f1b66ea8-262d-4b38-a039-b83a843f6ee8,1,0,bcae6e05-f1fd-413e-9eef-2e1cee42a962,bcae6e05-f1fd-413e-9eef-2e1cee42a962,1,0,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,1,0,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,1,0,91562fe8-e630-4bcb-a14e-c0e1e129141a,91562fe8-e630-4bcb-a14e-c0e1e129141a,1,0,c261abfd-3828-47b5-aa32-dfdd3a1636ad,c261abfd-3828-47b5-aa32-dfdd3a1636ad,1,0,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,1,0,1db1cb24-f364-4b91-bc96-c216764207a0,1db1cb24-f364-4b91-bc96-c216764207a0,1,0,64d7c8a7-1c15-4afb-ad97-abf8729c604e,64d7c8a7-1c15-4afb-ad97-abf8729c604e,1,0,a3cbbc8a-4afd-48c5-91d4-4849d18905c1,a3cbbc8a-4afd-48c5-91d4-4849d18905c1,1,0,5d6b29dc-38af-4dce-b79c-ce8f23afb3b1,5d6b29dc-38af-4dce-b79c-ce8f23afb3b1,1,0,c04b685a-0d2d-404c-a74a-775ffab298ce,c04b685a-0d2d-404c-a74a-775ffab298ce,1,0,5fe6967d-e333-464b-a89e-8c868c0ce37d,5fe6967d-e333-464b-a89e-8c868c0ce37d,1,0,5aef2892-7a87-4d3b-bb46-8340a7fb97a8,5aef2892-7a87-4d3b-bb46-8340a7fb97a8,1,0,8efa4c12-b5ba-4dfd-bdc9-e824402fc4b1,8efa4c12-b5ba-4dfd-bdc9-e824402fc4b1,1,0,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,1,0,9155c95b-6afb-41bb-bd0b-d37e503fc163,9155c95b-6afb-41bb-bd0b-d37e503fc163,1,0,d917c19e-be15-41cc-9c8a-a97c8de85309,d917c19e-be15-41cc-9c8a-a97c8de85309,1,0,54b5b44c-5f24-4b2a-982c-4489b18db7f0,54b5b44c-5f24-4b2a-982c-4489b18db7f0,1,0,5bc04a9a-6a0a-4607-b8eb-743b87143ae7,5bc04a9a-6a0a-4607-b8eb-743b87143ae7,1,0,e8045f52-7b27-48b0-b009-d488718b3bef,e8045f52-7b27-48b0-b009-d488718b3bef,1,0,1796bcbb-a629-4509-95c9-78562689f809,1796bcbb-a629-4509-95c9-78562689f809,1,0,cd9799c9-f5bf-4537-8885-06fb6e6b8f93,cd9799c9-f5bf-4537-8885-06fb6e6b8f93,1,0,d19e8fcc-62cc-4ce4-81bc-ead33a2714df,d19e8fcc-62cc-4ce4-81bc-ead33a2714df,1,0,e057e428-99c1-419d-a169-697c1e825e94,e057e428-99c1-419d-a169-697c1e825e94,1,0,784a60bd-4070-476d-9b8b-f607c76dc52b,784a60bd-4070-476d-9b8b-f607c76dc52b,1,0,904d5bd0-3843-4aaa-86a3-f8e12282e5c0,904d5bd0-3843-4aaa-86a3-f8e12282e5c0,1,0,ce1ffc4e-56c2-45ce-80e8-8b96d00316bc,ce1ffc4e-56c2-45ce-80e8-8b96d00316bc,1,0,90420fe9-f75a-4bcc-8e1a-9d665a61ecef,90420fe9-f75a-4bcc-8e1a-9d665a61ecef,1,0,47907538-9357-4885-8b50-17f2e16c260f,47907538-9357-4885-8b50-17f2e16c260f,1,0,17e1840f-fef3-4f17-8476-273e6af24cb4,17e1840f-fef3-4f17-8476-273e6af24cb4,1,0,a64566fa-b706-49bc-8277-4531145c400e,a64566fa-b706-49bc-8277-4531145c400e,1,0,a8f32b13-249c-4ce6-a521-f06a87f2e670,a8f32b13-249c-4ce6-a521-f06a87f2e670,1,0,815775e4-cfb7-495b-87c4-d134b90d93d4,815775e4-cfb7-495b-87c4-d134b90d93d4,1,0,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,1,0,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,1,0,7a27b378-89ac-4cad-8c69-a0cd14812d7e,7a27b378-89ac-4cad-8c69-a0cd14812d7e,1,0,d2433a11-8e1d-4e4c-966d-37cde6283f72,d2433a11-8e1d-4e4c-966d-37cde6283f72,1,0,59eb5919-3c33-48bf-b322-ec78018e4142,59eb5919-3c33-48bf-b322-ec78018e4142,1,0,63f308a5-b955-48a5-8052-50c5bede65d0,63f308a5-b955-48a5-8052-50c5bede65d0,1,0,1b614b97-5c1d-497a-9574-40114059f836,1b614b97-5c1d-497a-9574-40114059f836,1,0,477dfea4-e401-4cf0-b0a8-2df7c3836c58,477dfea4-e401-4cf0-b0a8-2df7c3836c58,1,0,294c000f-6979-4ed1-bbc7-7402facd9185,294c000f-6979-4ed1-bbc7-7402facd9185,1,0,db607fbc-f785-47d5-9550-577424aa3fe9,db607fbc-f785-47d5-9550-577424aa3fe9,1,0,b7111ddf-a623-4bae-90aa-636148492ca2,b7111ddf-a623-4bae-90aa-636148492ca2,1,0,905d9dcd-5793-4362-8fe8-2edce8c35e32,905d9dcd-5793-4362-8fe8-2edce8c35e32,1,0,a96cb6fd-54e0-4514-9210-7f4636acd336,a96cb6fd-54e0-4514-9210-7f4636acd336,1,0,3580e7a7-95d1-4a8e-bc12-a1449fe03757,3580e7a7-95d1-4a8e-bc12-a1449fe03757,1,0,13759790-6c70-4323-9321-a68b90c51663,13759790-6c70-4323-9321-a68b90c51663,1,0,d9704b20-c29c-4e7f-b777-0ac9080a5631,d9704b20-c29c-4e7f-b777-0ac9080a5631,1,0,c1372891-0f55-4868-ab97-906eff52be0e,c1372891-0f55-4868-ab97-906eff52be0e,1,0,33e96bda-1708-4ee4-8d4d-3b919bda3e38,33e96bda-1708-4ee4-8d4d-3b919bda3e38,1,0,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,1,0,93fcaa62-2a19-468b-9128-c7930583fbfd,93fcaa62-2a19-468b-9128-c7930583fbfd,1,0,2d885109-4c96-41c0-a996-785bfd793c2d,2d885109-4c96-41c0-a996-785bfd793c2d,1,0,e870a1bd-0c08-4d1e-832a-357922983c19,e870a1bd-0c08-4d1e-832a-357922983c19,1,0,9f71aeac-f889-40dc-91bd-d670da4efd2b,9f71aeac-f889-40dc-91bd-d670da4efd2b,1,0,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,1,0,614ef0bd-3298-408b-bf71-37df8ee60702,614ef0bd-3298-408b-bf71-37df8ee60702,1,0,26ff1be6-f72a-456a-9dce-302029752603,26ff1be6-f72a-456a-9dce-302029752603,1,0,db850a08-0c99-4a57-9b04-38be64bd38fb,db850a08-0c99-4a57-9b04-38be64bd38fb,1,0,abeca127-5ae9-46af-a5e8-d6438fd68367,abeca127-5ae9-46af-a5e8-d6438fd68367,1,0,bce81631-9f6d-42b3-b4b6-2199afb08f2f,bce81631-9f6d-42b3-b4b6-2199afb08f2f,1,0,67d6878f-3e47-4142-8f98-c5a207f0b8a8,67d6878f-3e47-4142-8f98-c5a207f0b8a8,1,0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,1,0,68636657-4d46-4c2a-9b2f-11521a55dfb4,68636657-4d46-4c2a-9b2f-11521a55dfb4,1,0,18a83f43-dc84-4f8a-9580-681b19f571c4,18a83f43-dc84-4f8a-9580-681b19f571c4,1,0,01c588b0-d0ce-4978-b04d-084e6a00fcc7,01c588b0-d0ce-4978-b04d-084e6a00fcc7,1,0,a23642d9-8c4f-44a5-8865-bfb286e47c55,a23642d9-8c4f-44a5-8865-bfb286e47c55,1,0,7b37e038-dcef-41e1-b6e7-ed73c6958415,7b37e038-dcef-41e1-b6e7-ed73c6958415,1,0,24df2d14-5ebf-4ded-ba14-5daee7a0c536,24df2d14-5ebf-4ded-ba14-5daee7a0c536,1,0,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,1,0,03bb028a-ee8c-411e-8382-653046f803c6,03bb028a-ee8c-411e-8382-653046f803c6,1,0,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,1,0,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,1,0,38d5ed93-133b-44fe-827a-69a6cfc0461d,38d5ed93-133b-44fe-827a-69a6cfc0461d,1,0,436a9c94-55f6-4463-becd-573189753ee7,436a9c94-55f6-4463-becd-573189753ee7,1,0,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,1,0,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,1,0,5148d263-de26-4c92-b090-ae59f42dfb05,5148d263-de26-4c92-b090-ae59f42dfb05,1,0,dbefe81f-85cf-4d84-9600-b359598c2543,dbefe81f-85cf-4d84-9600-b359598c2543,1,0,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1,0,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,1,0,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,1,0,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1,0,d5967e0f-03cd-4190-a702-7e9290eae1eb,d5967e0f-03cd-4190-a702-7e9290eae1eb,1,0,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,1,0,8eb18de5-8283-4d0c-bb11-b882e78181d5,8eb18de5-8283-4d0c-bb11-b882e78181d5,1,0,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,1,0,7059b117-714c-4710-aebe-76f88c4d41d5,7059b117-714c-4710-aebe-76f88c4d41d5,1,0,ea050453-4947-40dc-aa2a-503ddd1a235a,ea050453-4947-40dc-aa2a-503ddd1a235a,1,0,37d0e6d4-702e-46f5-ae87-4d393fa0c701,37d0e6d4-702e-46f5-ae87-4d393fa0c701,1,0,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1,0,3a62d88e-9298-42c0-bd87-c749ecd01d19,3a62d88e-9298-42c0-bd87-c749ecd01d19,1,0,abbf064e-c6ea-4712-930b-a9fef42e0ee1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,1,0,fc13dd80-ce44-4ed1-a9d7-dae44602b954,fc13dd80-ce44-4ed1-a9d7-dae44602b954,1,0,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,1,0,433b23a1-a863-4775-b2f2-1384e8f3cbbb,433b23a1-a863-4775-b2f2-1384e8f3cbbb,1,0,a1677c47-b9a4-427a-972d-9bb2293445b6,a1677c47-b9a4-427a-972d-9bb2293445b6,1,0,e4a328c0-e73b-465d-ae36-38e5a71690fa,e4a328c0-e73b-465d-ae36-38e5a71690fa,1,0,bf66612b-aec4-414b-bee6-9bcab145c7cc,bf66612b-aec4-414b-bee6-9bcab145c7cc,1,0,811f356f-554a-4a63-90b6-dedb5fec7c05,811f356f-554a-4a63-90b6-dedb5fec7c05,1,0,85bebd81-a355-4010-889b-cff6f72dafcb,85bebd81-a355-4010-889b-cff6f72dafcb,1,0,49521f36-fd1b-47dd-81cc-48b6fb651e22,49521f36-fd1b-47dd-81cc-48b6fb651e22,1,0,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1,0,bc946e21-53bb-4332-8c63-7b0aa78826eb,bc946e21-53bb-4332-8c63-7b0aa78826eb,1,0,4be2bdad-9a43-4593-acbc-a02e9144a89f,4be2bdad-9a43-4593-acbc-a02e9144a89f,1,0,64a86d5d-f925-45ee-82da-76df1cc20729,64a86d5d-f925-45ee-82da-76df1cc20729,1,0,eb4455f2-a5a0-44fb-8302-7312bc32df66,eb4455f2-a5a0-44fb-8302-7312bc32df66,1,0,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,1,0,9f20e59e-7db8-466f-b965-7045fc3f1489,9f20e59e-7db8-466f-b965-7045fc3f1489,1,0,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,1,0,89ac3d39-1915-4e67-a4e4-5a67a155cb75,89ac3d39-1915-4e67-a4e4-5a67a155cb75,1,0,d27b637d-5a51-49ff-bf73-343891534586,d27b637d-5a51-49ff-bf73-343891534586,1,0,b5a073a2-54e2-47c9-b533-f75fd2c9f343,b5a073a2-54e2-47c9-b533-f75fd2c9f343,1,0,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0c8571be-f9b6-4292-add9-980cfe7fa2ec,1,0,989b8ccd-bc05-48c1-9969-b3733028b65f,989b8ccd-bc05-48c1-9969-b3733028b65f,1,0,6c70b13d-f9d0-459f-8d38-c01c11f356f1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,1,0,45ca19df-90f3-4143-a659-bc0cb97efee9,45ca19df-90f3-4143-a659-bc0cb97efee9,1,0,6fe997a3-d729-420b-b2b2-558e9a1031ee,6fe997a3-d729-420b-b2b2-558e9a1031ee,1,0,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,1,0,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,1,0,83ae9b22-20ff-4e94-9282-19daf2274328,83ae9b22-20ff-4e94-9282-19daf2274328,1,0,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,1,0,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,1,0,a92b2b70-7e69-49d1-b921-c9d1b0718f94,a92b2b70-7e69-49d1-b921-c9d1b0718f94,1,0,d57a3300-0f9f-4fe5-b627-01c96b723053,d57a3300-0f9f-4fe5-b627-01c96b723053,1,0,19f690a3-d27b-43c1-94b7-585fc628da05,19f690a3-d27b-43c1-94b7-585fc628da05,1,0,d375fac5-098c-42b5-a0bd-9a4ae7516ada,d375fac5-098c-42b5-a0bd-9a4ae7516ada,1,0,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,1,0,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,1,0,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,1,0,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,1,0,cf783265-a4cb-436f-963a-1ff8220ae246,cf783265-a4cb-436f-963a-1ff8220ae246,1,0,3560f949-48f9-4fca-9fe2-81efc1ec0eee,3560f949-48f9-4fca-9fe2-81efc1ec0eee,1,0,662078f0-b75d-4c44-896f-7b7f74fd1ed4,662078f0-b75d-4c44-896f-7b7f74fd1ed4,1,0,4fa11304-fbd4-4c90-909d-5024283a6868,4fa11304-fbd4-4c90-909d-5024283a6868,1,0,207290c2-5221-48ad-99aa-bb0f7955df3f,207290c2-5221-48ad-99aa-bb0f7955df3f,1,0,162137ef-dea2-4ace-9e67-897dad0e7c3d,162137ef-dea2-4ace-9e67-897dad0e7c3d,1,0,d91a016e-cca9-4976-9c53-2c96fa95cf1a,d91a016e-cca9-4976-9c53-2c96fa95cf1a,1,0,012fb2f1-1c15-4800-8968-78a90c2a1348,012fb2f1-1c15-4800-8968-78a90c2a1348,1,0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,1,0,aec8f9e6-d177-45f5-ba55-2d662428c2ae,aec8f9e6-d177-45f5-ba55-2d662428c2ae,1,0,b0bf8af5-d824-459c-bc40-17495406af3c,b0bf8af5-d824-459c-bc40-17495406af3c,1,0,7dfdd08b-7cd9-480c-829d-97f5e7152eec,7dfdd08b-7cd9-480c-829d-97f5e7152eec,1,0,64752b64-80ae-4537-986a-d61423dc546b,64752b64-80ae-4537-986a-d61423dc546b,1,0,2c37e123-ea35-4501-93e1-2fa295444bec,2c37e123-ea35-4501-93e1-2fa295444bec,1,0,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,1,0,a997a430-3ea8-4fde-9f53-7b507a04c215,a997a430-3ea8-4fde-9f53-7b507a04c215,1,0,f648e19d-026b-4fa7-8e70-1866b27b94f8,f648e19d-026b-4fa7-8e70-1866b27b94f8,1,0,d32081fc-47d3-4e66-837e-705c94ba8ca8,d32081fc-47d3-4e66-837e-705c94ba8ca8,1,0,69c207c2-7699-4467-b127-286ecd6d0f29,69c207c2-7699-4467-b127-286ecd6d0f29,1,0,70a06a02-8fb8-4a39-9e50-b7c27c41f49f,70a06a02-8fb8-4a39-9e50-b7c27c41f49f,1,0,810755ad-e921-4250-a0d3-af77fe1b6c79,810755ad-e921-4250-a0d3-af77fe1b6c79,1,0,f0f2f6de-b5ca-416c-b2e7-70a2df0993a1,f0f2f6de-b5ca-416c-b2e7-70a2df0993a1,1,0,99a40d71-f47a-4c04-9137-d297eda2fad9,99a40d71-f47a-4c04-9137-d297eda2fad9,1,0,33fa908a-5516-43c8-94d3-28c60eba8d66,33fa908a-5516-43c8-94d3-28c60eba8d66,1,0,f3750ea4-5f9e-4ab3-9495-3f182ecff407,f3750ea4-5f9e-4ab3-9495-3f182ecff407,1,0,14002d51-87d4-4647-92ef-a9b1935cb666,14002d51-87d4-4647-92ef-a9b1935cb666,1,0,e941a39d-1f3c-4e6e-af17-75f92a15dd40,e941a39d-1f3c-4e6e-af17-75f92a15dd40,1,0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,1,0,72c695c3-66f6-4aa8-8a39-737ec6967a1d,72c695c3-66f6-4aa8-8a39-737ec6967a1d,1,0,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,1,0,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,1,0,d5d11480-d5c7-4569-80c1-f872655ff084,d5d11480-d5c7-4569-80c1-f872655ff084,1,0,b1e45d36-08e9-430e-976b-03e6e3320c6a,b1e45d36-08e9-430e-976b-03e6e3320c6a,1,0,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,1,0,8e21374f-5a65-406c-856d-2040607da4bc,8e21374f-5a65-406c-856d-2040607da4bc,1,0,7904d64a-2c30-4434-8924-b4817b727db9,7904d64a-2c30-4434-8924-b4817b727db9,1,0,c550a43a-1240-4f29-9045-a262f37f703a,c550a43a-1240-4f29-9045-a262f37f703a,1,0,86b1feed-ed65-4672-a49a-c52282b40be3,86b1feed-ed65-4672-a49a-c52282b40be3,1,0,85ac42d7-400a-4469-8fcd-e6a14f258792,85ac42d7-400a-4469-8fcd-e6a14f258792,1,0,ec681c28-661c-43e3-9285-9fc606f2d24c,ec681c28-661c-43e3-9285-9fc606f2d24c,1,0,be0fbbfc-5873-41a6-80ef-35ed1b8adb4c,be0fbbfc-5873-41a6-80ef-35ed1b8adb4c,1,0,413c2d03-f717-4503-9723-c605114b2799,413c2d03-f717-4503-9723-c605114b2799,1,0,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1,0,3e5f5167-8978-4191-b0f6-6a262b848b95,3e5f5167-8978-4191-b0f6-6a262b848b95,1,0,ae3aef9e-df3b-4ebc-912d-2bc581063745,ae3aef9e-df3b-4ebc-912d-2bc581063745,1,0,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,1,0,a8c09e65-6e10-4772-b264-6ead83d52fe3,a8c09e65-6e10-4772-b264-6ead83d52fe3,1,0,797f4377-ee0f-4a2d-be90-a74ac10ef682,797f4377-ee0f-4a2d-be90-a74ac10ef682,1,0,f401c5be-2698-452d-8908-08faad120a47,f401c5be-2698-452d-8908-08faad120a47,1,0,98de52ae-dfab-480b-a167-4cf2a3962ed1,98de52ae-dfab-480b-a167-4cf2a3962ed1,1,0,efa5c204-b827-4860-aadd-3737c8fc5f6b,efa5c204-b827-4860-aadd-3737c8fc5f6b,1,0,ef438c21-9d10-4116-8fc7-03927062db59,ef438c21-9d10-4116-8fc7-03927062db59,1,0,7ffa25d5-5199-4e08-af76-969c17709ad4,7ffa25d5-5199-4e08-af76-969c17709ad4,1,0,a93180c6-fcb7-4b28-b954-d2f2831f1832,a93180c6-fcb7-4b28-b954-d2f2831f1832,1,0,b46fff37-cc0e-4ff4-8fde-6bd9d9b895ec,b46fff37-cc0e-4ff4-8fde-6bd9d9b895ec,1,0,eeeede5e-9534-498e-b820-87a5f919c068,eeeede5e-9534-498e-b820-87a5f919c068,1,0,8b1f81e0-1eb0-4aae-9bb6-b25d97a6c9c2,8b1f81e0-1eb0-4aae-9bb6-b25d97a6c9c2,1,0,55ecc3a2-3d94-4201-8a29-06469e0b1a17,55ecc3a2-3d94-4201-8a29-06469e0b1a17,1,0,4123c760-0e30-48d0-8211-1db84f53314b,4123c760-0e30-48d0-8211-1db84f53314b,1,0,a086da23-29d8-4d02-846b-5d171e14d730,a086da23-29d8-4d02-846b-5d171e14d730,1,0,9ec76352-5e4a-485d-bd93-eb739869e406,9ec76352-5e4a-485d-bd93-eb739869e406,1,0,6d3619e3-d125-44b6-9b51-ebf9505b04d2,6d3619e3-d125-44b6-9b51-ebf9505b04d2,1,0,9d2c802c-c946-44e5-b9bc-13ef534968cd,9d2c802c-c946-44e5-b9bc-13ef534968cd,1,0,8046b46e-d855-4a80-8270-72a104e4a941,8046b46e-d855-4a80-8270-72a104e4a941,1,0,4524e15c-4c35-4e1d-910f-5859b5702dff,4524e15c-4c35-4e1d-910f-5859b5702dff,1,0,e200002c-9f3a-49d9-bba1-dca11555511d,e200002c-9f3a-49d9-bba1-dca11555511d,1,0,efa0f74a-7ec0-42f4-a948-7ce3890559d8,efa0f74a-7ec0-42f4-a948-7ce3890559d8,1,0,97e11b91-9590-44b3-afcd-f465ce23e509,97e11b91-9590-44b3-afcd-f465ce23e509,1,0,301c1fc5-ca0a-4fac-ac51-c2e42fb3c2a8,301c1fc5-ca0a-4fac-ac51-c2e42fb3c2a8,1,0,6f2d0c99-3354-4924-959c-59320e1b0063,6f2d0c99-3354-4924-959c-59320e1b0063,1,0,aee8df57-983b-440d-9c02-cace7e632f15,aee8df57-983b-440d-9c02-cace7e632f15,1,0,6e9648dd-388f-4563-88b0-feddc6e9ce8e,6e9648dd-388f-4563-88b0-feddc6e9ce8e,1,0,eb975d96-d230-4454-8f14-6bf5522e06d2,eb975d96-d230-4454-8f14-6bf5522e06d2,1,0,6aa6513c-6f3b-4897-96fd-4a08aeb9eb1e,6aa6513c-6f3b-4897-96fd-4a08aeb9eb1e,1,0,c29d3ae4-9458-46b8-a09b-012e5d435d43,c29d3ae4-9458-46b8-a09b-012e5d435d43,1,0,dad62d28-168c-4659-a800-e484772d9003,dad62d28-168c-4659-a800-e484772d9003,1,0,4cada7d2-f1b1-4914-95fc-c5e1431c13a7,4cada7d2-f1b1-4914-95fc-c5e1431c13a7,1,0,ecbe1ead-4e4b-49db-b7f1-c097c9df2fb9,ecbe1ead-4e4b-49db-b7f1-c097c9df2fb9,1,0,be026f77-285b-4470-8a4e-c68f6e9859e2,be026f77-285b-4470-8a4e-c68f6e9859e2,1,0,a9d54a18-9c35-471b-ad8b-44ba743b7977,a9d54a18-9c35-471b-ad8b-44ba743b7977,1,0,4f75014c-831f-4de5-8b6e-94874ce274ce,4f75014c-831f-4de5-8b6e-94874ce274ce,1,0,c9f74923-95e1-4f5c-8649-3543fae6b116,c9f74923-95e1-4f5c-8649-3543fae6b116,1,0,b00616bb-406d-4e8e-80a0-f0c14cc850c0,b00616bb-406d-4e8e-80a0-f0c14cc850c0,1,0,d60aae4f-7c61-416c-bbc9-e7c95d757848,d60aae4f-7c61-416c-bbc9-e7c95d757848,1,0,c8a0da4e-0b0f-4def-a61e-5f6e04468e01,c8a0da4e-0b0f-4def-a61e-5f6e04468e01,1,0,62f9c12c-1837-4320-99b0-8f7ae44af735,62f9c12c-1837-4320-99b0-8f7ae44af735,1,0,ae352e0c-9f89-4ed9-ab45-f4e9040f7858,ae352e0c-9f89-4ed9-ab45-f4e9040f7858,1,0,853a5fdc-3621-442c-abd3-2fd266fddd84,853a5fdc-3621-442c-abd3-2fd266fddd84,1,0,daaff4d7-bc0b-4ab5-a277-fc02472f76ed,daaff4d7-bc0b-4ab5-a277-fc02472f76ed,1,0,33c9ebee-7b42-4010-a5c9-71ca7479d95c,33c9ebee-7b42-4010-a5c9-71ca7479d95c,1,0,cf202dca-e0ee-45c8-8792-46fc2f126e68,cf202dca-e0ee-45c8-8792-46fc2f126e68,1,0,be150cca-e977-4663-af19-79d8b0f91b3d,be150cca-e977-4663-af19-79d8b0f91b3d,1,0,f12857d7-bcae-4c6c-9169-2a0b1f9e9e6a,f12857d7-bcae-4c6c-9169-2a0b1f9e9e6a,1,0,1c13d12d-5c96-4d96-a07d-ec4a766c86ac,1c13d12d-5c96-4d96-a07d-ec4a766c86ac,1,0,6279f4bc-b77f-4618-9ce3-d50efc798871,6279f4bc-b77f-4618-9ce3-d50efc798871,1,0,fb05b40b-8cf5-4821-afcb-f00a77458a9b,fb05b40b-8cf5-4821-afcb-f00a77458a9b,1,0,37c68cb5-6aaf-4e57-b68c-1a5b5db252b7,37c68cb5-6aaf-4e57-b68c-1a5b5db252b7,1,0,3967bec7-9af5-40bf-9e22-a0f6b13cc795,3967bec7-9af5-40bf-9e22-a0f6b13cc795,1,0,eab9da25-07b6-4c60-9a83-08e8277d0ae7,eab9da25-07b6-4c60-9a83-08e8277d0ae7,1,0,b79ed991-f5d9-42b6-8f0b-0df49e550ced,b79ed991-f5d9-42b6-8f0b-0df49e550ced,1,0,ac50e8d6-fe0b-45a4-b0dd-cc81d7fd7357,ac50e8d6-fe0b-45a4-b0dd-cc81d7fd7357,1,0,f58a3df1-ddf3-45c8-b470-cc026cb0537f,f58a3df1-ddf3-45c8-b470-cc026cb0537f,1,0,c4e9954b-59d8-46e3-ada8-bda66e8aaceb,c4e9954b-59d8-46e3-ada8-bda66e8aaceb,1,0,568c16cf-c3fc-4e16-8f05-e00be8e136c2,568c16cf-c3fc-4e16-8f05-e00be8e136c2,1,0,b36ad726-fb8f-4974-986a-33f997e3fc64,b36ad726-fb8f-4974-986a-33f997e3fc64,1,0,e196c73e-c09b-4aed-b403-2b97a8bf6e47,e196c73e-c09b-4aed-b403-2b97a8bf6e47,1,0,27fdab52-f1ab-48d3-b117-06afcf319eaa,27fdab52-f1ab-48d3-b117-06afcf319eaa,1,0,bf3530c3-3244-4528-a846-ea175af53804,bf3530c3-3244-4528-a846-ea175af53804,1,0,5bdfff5e-f04c-4fe3-ae92-10a99da3a6a8,5bdfff5e-f04c-4fe3-ae92-10a99da3a6a8,1,0,3d0ae989-2d16-42df-a442-7bde817ec1b2,3d0ae989-2d16-42df-a442-7bde817ec1b2,1,0,f3d1adac-197a-4194-89fe-7178f8ccd788,f3d1adac-197a-4194-89fe-7178f8ccd788,1,0,7077b04e-75c0-414d-b295-d28aeda2bdd4,7077b04e-75c0-414d-b295-d28aeda2bdd4,1,0,c8330995-22f4-4be6-beff-64f87c6f09ed,c8330995-22f4-4be6-beff-64f87c6f09ed,1,0,56b6b570-764b-4220-9b5f-70753b0fadbd,56b6b570-764b-4220-9b5f-70753b0fadbd,1,0,588f481e-4486-4649-b584-08f7e3ab8cde,588f481e-4486-4649-b584-08f7e3ab8cde,1,0,5dfe90e2-cb1a-4510-b22c-af94ca06dd7b,5dfe90e2-cb1a-4510-b22c-af94ca06dd7b,1,0,70c217b8-ddf0-4b7c-80b0-f5a76dbbcec7,70c217b8-ddf0-4b7c-80b0-f5a76dbbcec7,1,0,74e3e5c4-7dec-4fde-975b-01e7f4002a87,74e3e5c4-7dec-4fde-975b-01e7f4002a87,1,0,689b382f-308e-4558-817c-819ceb59f61e,689b382f-308e-4558-817c-819ceb59f61e,1,0,ed96d8d2-3164-4a85-8408-06d9a1f0c2ce,ed96d8d2-3164-4a85-8408-06d9a1f0c2ce,1,0,2482e800-50c9-4c7c-909f-18ba2e30ff31,2482e800-50c9-4c7c-909f-18ba2e30ff31,1,0,fdb20bf0-6dc5-4ce6-acdc-4def1cc23a67,fdb20bf0-6dc5-4ce6-acdc-4def1cc23a67,1,0,b528d506-be3f-47f2-880b-af7093c71649,b528d506-be3f-47f2-880b-af7093c71649,1,0,7f3f55d5-b1f5-4b6b-b189-ff5715341489,7f3f55d5-b1f5-4b6b-b189-ff5715341489,1,0,5a32d342-8b80-4069-98c3-cf392f473b06,5a32d342-8b80-4069-98c3-cf392f473b06,1,0,888c5a1f-5329-40da-9102-eac26657a7d9,888c5a1f-5329-40da-9102-eac26657a7d9,1,0,0b2c1689-22ba-4ed6-80f3-10475f11db1a,0b2c1689-22ba-4ed6-80f3-10475f11db1a,1,0,46bbfede-5b4d-44fc-90ec-f6f3598340c4,46bbfede-5b4d-44fc-90ec-f6f3598340c4,1,0,acc6358f-be29-4931-8ed2-b769a48cee08,acc6358f-be29-4931-8ed2-b769a48cee08,1,0,51c58d33-32f7-401a-84d4-5a942129fbd5,51c58d33-32f7-401a-84d4-5a942129fbd5,1,0,07d5174e-8422-471f-a435-bf51d5af1bf0,07d5174e-8422-471f-a435-bf51d5af1bf0,1,0,e58672f5-84c9-462f-b5a6-7f15a6f2f797,e58672f5-84c9-462f-b5a6-7f15a6f2f797,1,0,256618cc-0956-4cda-9691-e4ced68a791f,256618cc-0956-4cda-9691-e4ced68a791f,1,0,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,1,0,4b9771a7-b924-4e61-8468-4633e3c54706,4b9771a7-b924-4e61-8468-4633e3c54706,1,0,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,1,0,667de710-cee5-4a97-8434-641d199f3b68,667de710-cee5-4a97-8434-641d199f3b68,1,0,e9a2320b-71a1-4974-8b5a-1990062ec7df,e9a2320b-71a1-4974-8b5a-1990062ec7df,1,0,2e459a7c-c448-4db4-ae21-e59646527030,2e459a7c-c448-4db4-ae21-e59646527030,1,0,891194d9-9f02-4b22-89cd-941181c83ecb,891194d9-9f02-4b22-89cd-941181c83ecb,1,0,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,1,0,f6e85eeb-d81b-4526-9a33-ab77bd447236,f6e85eeb-d81b-4526-9a33-ab77bd447236,1,0,470e37fe-d149-4007-b397-12fc84f93041,470e37fe-d149-4007-b397-12fc84f93041,1,0,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,1,0,7175cfa0-885c-4807-98ec-af255dcd55d9,7175cfa0-885c-4807-98ec-af255dcd55d9,1,0,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1,0,f5b66759-8102-4cba-a3fd-ee96db5bc809,f5b66759-8102-4cba-a3fd-ee96db5bc809,1,0,6c205eae-9113-46c1-a245-25d29173646e,6c205eae-9113-46c1-a245-25d29173646e,1,0,4cc4aa90-49fb-4602-9f9c-d4d47d223988,4cc4aa90-49fb-4602-9f9c-d4d47d223988,1,0,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,1,0,d08679db-f83f-476e-b8c4-f3f52c3cf6fd,d08679db-f83f-476e-b8c4-f3f52c3cf6fd,1,0,fad0898f-5769-46ab-bc5e-301924b851a0,fad0898f-5769-46ab-bc5e-301924b851a0,1,0,e0227e4b-be22-4614-8980-5d573fae705d,e0227e4b-be22-4614-8980-5d573fae705d,1,0,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,1,0,6f36007b-04dc-4007-abf7-e20fbd126b97,6f36007b-04dc-4007-abf7-e20fbd126b97,1,0,791dbdee-56f6-4fe3-ada4-965c9111d69e,791dbdee-56f6-4fe3-ada4-965c9111d69e,1,0,66ef1631-277b-4c22-99d7-1434b4dbbb3f,66ef1631-277b-4c22-99d7-1434b4dbbb3f,1,0,aa6444a8-6c17-4207-a623-9b734e08e30e,aa6444a8-6c17-4207-a623-9b734e08e30e,1,0,898535ff-50cd-464a-aadc-5e4f9de15b04,898535ff-50cd-464a-aadc-5e4f9de15b04,1,0,385e209d-65aa-43b1-8591-f92544882740,385e209d-65aa-43b1-8591-f92544882740,1,0,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,1,0,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,1,0,737f6f1b-9ffc-4916-b378-7321eab1f886,737f6f1b-9ffc-4916-b378-7321eab1f886,1,0,8381bc76-0e0f-4196-9911-ec05730cb1c9,8381bc76-0e0f-4196-9911-ec05730cb1c9,1,0,01dedf5b-2cce-4d24-81ea-2e3af82f5794,01dedf5b-2cce-4d24-81ea-2e3af82f5794,1,0,771a1900-46be-49fe-a02d-584780de8363,771a1900-46be-49fe-a02d-584780de8363,1,0,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,1,0,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,1,0,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,1,0,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,1,0,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,1,0,ef257b20-da10-4cda-8b9d-7de2d68a2f71,ef257b20-da10-4cda-8b9d-7de2d68a2f71,1,0,de0d41b7-acc0-4ebc-8933-d6b5ad351860,de0d41b7-acc0-4ebc-8933-d6b5ad351860,1,0,acd30e63-68dc-4ab2-a6fe-16eb69d09271,acd30e63-68dc-4ab2-a6fe-16eb69d09271,1,0,04013c34-8d59-4f87-b272-732d5a6dd675,04013c34-8d59-4f87-b272-732d5a6dd675,1,0,f9df9b6b-5051-46ef-bb1f-1974f41054a7,f9df9b6b-5051-46ef-bb1f-1974f41054a7,1,0,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,1,0,1a354069-07ea-40e0-bbac-e1b6232750c2,1a354069-07ea-40e0-bbac-e1b6232750c2,1,0,df31548b-0b8e-412b-999a-761970ae3c23,df31548b-0b8e-412b-999a-761970ae3c23,1,0,05135747-43e7-4b61-bc30-57b3289ea923,05135747-43e7-4b61-bc30-57b3289ea923,1,0,6d63728d-3384-4131-b890-1b82d14a04b7,6d63728d-3384-4131-b890-1b82d14a04b7,1,0,13b3c973-6be3-4898-89d5-20852cd14e46,13b3c973-6be3-4898-89d5-20852cd14e46,1,0,d978d078-4fd8-40b9-90c2-047cdaf94cba,d978d078-4fd8-40b9-90c2-047cdaf94cba,1,0,8640eacd-e6f9-4b0b-8511-c6ad2336ec6c,8640eacd-e6f9-4b0b-8511-c6ad2336ec6c,1,0,b374e22f-17f3-4186-af1f-fa35d1a7e559,b374e22f-17f3-4186-af1f-fa35d1a7e559,1,0,53555ee4-f99d-4935-a884-89313aa3ca6a,53555ee4-f99d-4935-a884-89313aa3ca6a,1,0,f38bb317-8a59-4786-be76-e1d4e534628d,f38bb317-8a59-4786-be76-e1d4e534628d,1,0,25741b39-1c6b-4851-8584-9711d25ef05a,25741b39-1c6b-4851-8584-9711d25ef05a,1,0,f4554046-493e-4960-94df-0a8b9d02f474,f4554046-493e-4960-94df-0a8b9d02f474,1,0,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,1,0,9222a6c0-b785-4811-bfb6-44ac44a55925,9222a6c0-b785-4811-bfb6-44ac44a55925,1,0,ea84021d-2431-44ad-a446-f1fb979c9e96,ea84021d-2431-44ad-a446-f1fb979c9e96,1,0,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,1,0,8fa21575-177f-4b7c-94b5-dfeefe737cb4,8fa21575-177f-4b7c-94b5-dfeefe737cb4,1,0,6da034af-0481-4a3c-aff9-c50ced6f21d4,6da034af-0481-4a3c-aff9-c50ced6f21d4,1,0,d07016c8-7d97-42cd-865b-85b49075adfb,d07016c8-7d97-42cd-865b-85b49075adfb,1,0,491a2337-1bf9-45c1-8ae6-95605ef41992,491a2337-1bf9-45c1-8ae6-95605ef41992,1,0,c3f2a760-610a-40e0-945b-1f9f6369444d,c3f2a760-610a-40e0-945b-1f9f6369444d,1,0,9202335d-50bb-4282-9438-24c7fb9cf637,9202335d-50bb-4282-9438-24c7fb9cf637,1,0,a62906e5-27f8-4e72-8769-9a3eed6997d7,a62906e5-27f8-4e72-8769-9a3eed6997d7,1,0,6c5d0ac3-6086-434c-812b-1c1158ecc574,6c5d0ac3-6086-434c-812b-1c1158ecc574,1,0,783536d7-c0db-44c9-96e8-58b57804d7c8,783536d7-c0db-44c9-96e8-58b57804d7c8,1,0,a8295435-c2c4-4aff-874b-7412556aa76d,a8295435-c2c4-4aff-874b-7412556aa76d,1,0,f6c4e24b-172b-4ba3-8e3e-988306ade660,f6c4e24b-172b-4ba3-8e3e-988306ade660,1,0,9baab24c-a5a3-46f4-ad17-a28d4a49f851,9baab24c-a5a3-46f4-ad17-a28d4a49f851,1,0,d1952319-0e42-4684-a386-fbe7c24526c2,d1952319-0e42-4684-a386-fbe7c24526c2,1,0,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,1,0,83b47a9d-d44b-4c40-becd-df74f9cb2e91,83b47a9d-d44b-4c40-becd-df74f9cb2e91,1,0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,1,0,86e2a2eb-160f-4e93-a449-b2f726286d1b,86e2a2eb-160f-4e93-a449-b2f726286d1b,1,0,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,1,0,364184c2-ec71-44be-b40c-ba719b4ab0e1,364184c2-ec71-44be-b40c-ba719b4ab0e1,1,0,7ef46c54-ec0c-4211-a750-e5949956b593,7ef46c54-ec0c-4211-a750-e5949956b593,1,0,04823681-875e-459a-b3cf-051c89527f38,04823681-875e-459a-b3cf-051c89527f38,1,0,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,1,0,38265f08-3301-40d1-b630-a319c983e826,38265f08-3301-40d1-b630-a319c983e826,1,0,5175c496-bac7-4c57-9628-793b727aecd0,5175c496-bac7-4c57-9628-793b727aecd0,1,0,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1,0,fc42df4a-93f0-461f-acfe-fea09158030f,fc42df4a-93f0-461f-acfe-fea09158030f,1,0,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,1,0,6d002aef-00c9-4069-80df-153151218831,6d002aef-00c9-4069-80df-153151218831,1,0,4fec3a6c-5a99-4763-aa07-d5de8712559e,4fec3a6c-5a99-4763-aa07-d5de8712559e,1,0,968a1202-d271-43e0-bfd4-d38e49ceadd4,968a1202-d271-43e0-bfd4-d38e49ceadd4,1,0,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,1,0,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,1,0,ea61e442-273e-4ce4-a806-8090893729ba,ea61e442-273e-4ce4-a806-8090893729ba,1,0,aef03c0b-2846-43b7-b382-9a51ec783e85,aef03c0b-2846-43b7-b382-9a51ec783e85,1,0,e7100f2b-d169-4635-ab87-7a2225ff12ee,e7100f2b-d169-4635-ab87-7a2225ff12ee,1,0,c0804a4a-64d5-457f-a542-8e5badccbdf1,c0804a4a-64d5-457f-a542-8e5badccbdf1,1,0,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,1,0,4a2d2790-debf-4dc2-8216-878d8808d161,4a2d2790-debf-4dc2-8216-878d8808d161,1,0,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,1,0,4507a92e-abb6-4329-88b2-3429bc694bc6,4507a92e-abb6-4329-88b2-3429bc694bc6,1,0,2694c1b4-536b-4187-adf6-0f8757aaae76,2694c1b4-536b-4187-adf6-0f8757aaae76,1,0,e523f88b-b3de-476e-a3cc-592970492dec,e523f88b-b3de-476e-a3cc-592970492dec,1,0,0e2107e2-8648-4b2e-9dfb-c23b1ff5b007,0e2107e2-8648-4b2e-9dfb-c23b1ff5b007,1,0,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,1,0,ea0843f4-60fb-4d44-abf4-0021867c636b,ea0843f4-60fb-4d44-abf4-0021867c636b,1,0,59aadc03-adbc-481f-89bc-d7f391789522,59aadc03-adbc-481f-89bc-d7f391789522,1,0,254f6ccd-0451-4231-91c9-4abe57b647be,254f6ccd-0451-4231-91c9-4abe57b647be,1,0,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1,0,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0dcc537b-76b3-4e73-b060-6cbdcf6345db,1,0,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,1,0,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,1,0,7601fa7e-079a-4347-abea-e161b2d00783,7601fa7e-079a-4347-abea-e161b2d00783,1,0,ee84cb40-f82d-4558-91be-229d68ad9f4a,ee84cb40-f82d-4558-91be-229d68ad9f4a,1,0,101a7eff-9556-4165-879a-a7c8a852e236,101a7eff-9556-4165-879a-a7c8a852e236,1,0,01775932-3603-4efc-9235-abdb97490dea,01775932-3603-4efc-9235-abdb97490dea,1,0,7637844b-4059-4f8a-8436-b4f4e8cb4f74,7637844b-4059-4f8a-8436-b4f4e8cb4f74,1,0,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,1,0,0ee5b788-61dc-464b-86da-f985df7704b6,0ee5b788-61dc-464b-86da-f985df7704b6,1,0,1c2da2ac-e797-11e6-0489-a8667f21fde4,1c2da2ac-e797-11e6-0489-a8667f21fde4,1,0,2375c6a8-9799-4b7c-a48d-091a90c67693,2375c6a8-9799-4b7c-a48d-091a90c67693,1,0,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,1,0,df7892fe-e796-11e6-0489-a8667f21fde4,df7892fe-e796-11e6-0489-a8667f21fde4,1,0,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,1,0,63c6522f-be04-422a-b4f4-0f55f58b09a8,63c6522f-be04-422a-b4f4-0f55f58b09a8,1,0,be919dc1-a377-43e1-82e6-ce946cabdd55,be919dc1-a377-43e1-82e6-ce946cabdd55,1,0,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,1,0,9ded532e-9e60-4895-a4c5-4ea6697aa83c,9ded532e-9e60-4895-a4c5-4ea6697aa83c,1,0,106c5159-ffc7-4059-b3e3-acf74326a44f,106c5159-ffc7-4059-b3e3-acf74326a44f,1,0,d39fd717-1a69-4fd3-889e-4fa9abefea1c,d39fd717-1a69-4fd3-889e-4fa9abefea1c,1,0,fae8b26c-e796-11e6-0489-a8667f21fde4,fae8b26c-e796-11e6-0489-a8667f21fde4,1,0,5b85e6df-7493-4201-97ad-2aea14de6006,5b85e6df-7493-4201-97ad-2aea14de6006,1,0,061e6c0f-ba52-40ec-96ad-2eba3eee3097,061e6c0f-ba52-40ec-96ad-2eba3eee3097,1,0,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,1,0,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,1,0,4840753b-e2e1-4e67-b35f-2f5eab7754f5,4840753b-e2e1-4e67-b35f-2f5eab7754f5,1,0,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,1,0,6ffd9c17-d90b-4d19-b337-0fbc2c717557,6ffd9c17-d90b-4d19-b337-0fbc2c717557,1,0,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,1,0,3bb83275-7a0e-420f-8c6b-028038f11a8c,3bb83275-7a0e-420f-8c6b-028038f11a8c,1,0,e1950a23-f6e7-48af-b78a-77aa61f08ece,e1950a23-f6e7-48af-b78a-77aa61f08ece,1,0,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1,0,0a7d282e-45bb-4a87-b325-1659519867fb,0a7d282e-45bb-4a87-b325-1659519867fb,1,0,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,1,0,5d726fa3-bde0-4d97-a577-415857bbb5c1,5d726fa3-bde0-4d97-a577-415857bbb5c1,1,0,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,1,0,49068231-202c-4ac6-a39a-69207cb597dd,49068231-202c-4ac6-a39a-69207cb597dd,1,0,5a470575-e012-42ad-9ad7-53930a8e843f,5a470575-e012-42ad-9ad7-53930a8e843f,1,0,5872d4ed-6503-422d-bcf9-63a8df3e777d,5872d4ed-6503-422d-bcf9-63a8df3e777d,1,0,e21cda29-2579-485e-a207-20b76f719c80,e21cda29-2579-485e-a207-20b76f719c80,1,0,1b232a57-2833-42c6-b318-38dae2af1ab2,1b232a57-2833-42c6-b318-38dae2af1ab2,1,0,007ade8c-b102-408b-b877-b531e046560b,007ade8c-b102-408b-b877-b531e046560b,1,0,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,1,0,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,1,0,eb69c41a-392d-43bb-9b67-a0adcb651b1e,eb69c41a-392d-43bb-9b67-a0adcb651b1e,1,0,93b01c88-48a2-4753-b443-0e9892395a8f,93b01c88-48a2-4753-b443-0e9892395a8f,1,0,0b7f8e05-bb34-47cc-9775-04362e814316,0b7f8e05-bb34-47cc-9775-04362e814316,1,0,e71e0297-3709-4247-933e-18a6350cbf39,e71e0297-3709-4247-933e-18a6350cbf39,1,0,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0b32e372-c6ad-4dda-acd1-8b5d58537d37,1,0,602dac6f-abe6-407a-92d3-7f1613e5dda6,602dac6f-abe6-407a-92d3-7f1613e5dda6,1,0,db03a88b-2804-45c2-9089-7ddb87ef2f18,db03a88b-2804-45c2-9089-7ddb87ef2f18,1,0,df6417d1-c722-4a87-a543-5d2c31795b20,df6417d1-c722-4a87-a543-5d2c31795b20,1,0,526a85c9-3a8d-4044-adb9-fd0689c70601,526a85c9-3a8d-4044-adb9-fd0689c70601,1,0,c4203772-580c-4db1-9bde-8925faa90688,c4203772-580c-4db1-9bde-8925faa90688,1,0,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,1,0,dc024d33-1715-40da-9c00-443d25a31ebc,dc024d33-1715-40da-9c00-443d25a31ebc,1,0,d029aa93-fea4-40e4-8cfb-2dc96544829b,d029aa93-fea4-40e4-8cfb-2dc96544829b,1,0,f8f585d1-01a0-4892-8852-c692ffaa1344,f8f585d1-01a0-4892-8852-c692ffaa1344,1,0,35c237a7-71e1-415c-809d-e99babee4e0e,35c237a7-71e1-415c-809d-e99babee4e0e,1,0,2116119f-7637-45a1-8e59-c9149619413b,2116119f-7637-45a1-8e59-c9149619413b,1,0,43882a2c-b625-4cfb-8220-3d12bfee09e4,43882a2c-b625-4cfb-8220-3d12bfee09e4,1,0,90639fdb-144d-495a-a097-76c45107fc97,90639fdb-144d-495a-a097-76c45107fc97,1,0,c076b7fd-7e17-4811-82e7-047e2bf43bb0,c076b7fd-7e17-4811-82e7-047e2bf43bb0,1,0,84b28732-9001-4798-b613-35ea65c26cce,84b28732-9001-4798-b613-35ea65c26cce,1,0,77d8285f-a87b-4a4e-b6ee-85bcd54dee12,77d8285f-a87b-4a4e-b6ee-85bcd54dee12,1,0,f2ec9416-3830-4607-90f3-f77fc53c9c70,f2ec9416-3830-4607-90f3-f77fc53c9c70,1,0,3057de81-eb41-4161-9dc2-5445699906af,3057de81-eb41-4161-9dc2-5445699906af,1,0,f660bf92-7de1-4a22-9cea-777069e4679d,f660bf92-7de1-4a22-9cea-777069e4679d,1,0,54f3fbe7-ac93-44f6-ba6e-37cb99f3569c,54f3fbe7-ac93-44f6-ba6e-37cb99f3569c,1,0,20feb794-eb05-46a6-90e7-ca4e2376d7b2,20feb794-eb05-46a6-90e7-ca4e2376d7b2,1,0,8deb4f57-18fc-4db0-ad0f-82d60af3d80b,8deb4f57-18fc-4db0-ad0f-82d60af3d80b,1,0,2f484aa4-452a-46af-a707-a5a6917bc0db,2f484aa4-452a-46af-a707-a5a6917bc0db,1,0,fd6ff934-6f11-4182-b0cb-6926902d33c0,fd6ff934-6f11-4182-b0cb-6926902d33c0,1,0,315af891-2075-4833-a404-6c0f2004ee53,315af891-2075-4833-a404-6c0f2004ee53,1,0,5725db77-bfbf-4d85-9565-163b309a53ee,5725db77-bfbf-4d85-9565-163b309a53ee,1,0,99a7142c-b3c7-4221-abf8-6831a3cbc16e,99a7142c-b3c7-4221-abf8-6831a3cbc16e,1,0,d367a1a1-5a54-4bf9-96c7-d55667e2fb16,d367a1a1-5a54-4bf9-96c7-d55667e2fb16,1,0,2e09abe1-0934-42ae-970f-5e001c35c31a,2e09abe1-0934-42ae-970f-5e001c35c31a,1,0,587d48a3-5627-4481-b13e-c22740b57d8a,587d48a3-5627-4481-b13e-c22740b57d8a,1,0,1f3e3089-1e04-4147-8ece-aa96a76467dd,1f3e3089-1e04-4147-8ece-aa96a76467dd,1,0,22a213b5-ed72-4181-8ff8-89f860c87aa1,22a213b5-ed72-4181-8ff8-89f860c87aa1,1,0,4c56cbff-653e-4f16-b702-c77190d7eb7f,4c56cbff-653e-4f16-b702-c77190d7eb7f,1,0,172ff335-c7ae-4905-b705-2a1475b95713,172ff335-c7ae-4905-b705-2a1475b95713,1,0,db4c311d-ee62-4d47-ac31-5a20cadb7ed1,db4c311d-ee62-4d47-ac31-5a20cadb7ed1,1,0,1d852dc0-90c9-4568-84f9-b1d822573b6b,1d852dc0-90c9-4568-84f9-b1d822573b6b,1,0,24f85dbd-59be-4b8d-bea8-7ff8ddb7486a,24f85dbd-59be-4b8d-bea8-7ff8ddb7486a,1,0,c997f56c-ef9c-434e-bc4e-7fc5f885aaba,c997f56c-ef9c-434e-bc4e-7fc5f885aaba,1,0,37c8f5e1-3513-47f8-896d-a54d11b83dcd,37c8f5e1-3513-47f8-896d-a54d11b83dcd,1,0,9e07733c-39f0-491b-91e1-bf2782d957dd,9e07733c-39f0-491b-91e1-bf2782d957dd,1,0,cc584a1d-dc91-4693-a5c9-6e8c6607e9d8,cc584a1d-dc91-4693-a5c9-6e8c6607e9d8,1,0,5902d979-1235-4d5a-ace7-93261bdeb725,5902d979-1235-4d5a-ace7-93261bdeb725,1,0,5a090286-7969-44c9-815b-fc58aeb5d8d3,5a090286-7969-44c9-815b-fc58aeb5d8d3,1,0,8e87cf35-af54-4fa2-9428-460b765b282b,8e87cf35-af54-4fa2-9428-460b765b282b,1,0,73380bb1-bee3-4b73-a3df-1dbea99011d2,73380bb1-bee3-4b73-a3df-1dbea99011d2,1,0,8be29533-38de-413d-b420-7dac2e80af6c,8be29533-38de-413d-b420-7dac2e80af6c,1,0,82a77018-8e38-41dd-9d1f-3130bc29a707,82a77018-8e38-41dd-9d1f-3130bc29a707,1,0,4d75aaef-532e-4ed3-8153-083f04f05cc1,4d75aaef-532e-4ed3-8153-083f04f05cc1,1,0,3854a0ba-e156-4ba3-a301-b1a41ac386c4,3854a0ba-e156-4ba3-a301-b1a41ac386c4,1,0,f8136f59-ef0c-4c0f-8207-f7a4000e4f0c,f8136f59-ef0c-4c0f-8207-f7a4000e4f0c,1,0,c2321963-cd86-45ec-b323-3fdb5932da3a,c2321963-cd86-45ec-b323-3fdb5932da3a,1,0,d5af38bf-6261-4177-8f74-998a85f0ef39,d5af38bf-6261-4177-8f74-998a85f0ef39,1,0,42bbd9f7-ef72-440f-9eb1-fcb3bdc1d91e,42bbd9f7-ef72-440f-9eb1-fcb3bdc1d91e,1,0,c6a4d03d-f3b2-449c-8a2b-deb542dd2c99,c6a4d03d-f3b2-449c-8a2b-deb542dd2c99,1,0,4b714d9c-26f4-46e8-ac79-471522b3853b,4b714d9c-26f4-46e8-ac79-471522b3853b,1,0,411489de-f907-4d60-a776-64bb0aa12a0e,411489de-f907-4d60-a776-64bb0aa12a0e,1,0,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,1,0,9c47670e-9eb9-49ec-876c-cd545aaa093c,9c47670e-9eb9-49ec-876c-cd545aaa093c,1,0,f57e74e6-75e8-4136-911e-86793036a077,f57e74e6-75e8-4136-911e-86793036a077,1,0,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,1,0,3ba8c378-ef3d-4646-90b3-6d8078aa623e,3ba8c378-ef3d-4646-90b3-6d8078aa623e,1,0,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,1,0,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,1,0,d61ca454-505b-4fd6-be15-d7ed948a5ff6,d61ca454-505b-4fd6-be15-d7ed948a5ff6,1,0,2dd7eb87-8130-425a-be13-85235508cde6,2dd7eb87-8130-425a-be13-85235508cde6,1,0,8a62c997-4fda-4464-90bd-ab719161949f,8a62c997-4fda-4464-90bd-ab719161949f,1,0,28af52dd-3144-428b-956d-b6f27863ec4a,28af52dd-3144-428b-956d-b6f27863ec4a,1,0,8ac94328-2300-4681-9c35-fd7e2f830310,8ac94328-2300-4681-9c35-fd7e2f830310,1,0,da0ee165-1917-466b-ac5c-16c28e2318bb,da0ee165-1917-466b-ac5c-16c28e2318bb,1,0,4868cb2e-0892-42bc-9de1-73cb8a15a96f,4868cb2e-0892-42bc-9de1-73cb8a15a96f,1,0,e8b80879-33b3-4c45-ad68-1acabcf91faf,e8b80879-33b3-4c45-ad68-1acabcf91faf,1,0,4a87fafc-7ca7-478e-bb31-358c2b85fa92,4a87fafc-7ca7-478e-bb31-358c2b85fa92,1,0,239601eb-e8de-4d58-a32a-01ee52f6e698,239601eb-e8de-4d58-a32a-01ee52f6e698,1,0,11370667-bec5-4a2d-8aa1-97f4d795718f,11370667-bec5-4a2d-8aa1-97f4d795718f,1,0,2032162d-fbb5-4e6a-be72-cda79869b9ff,2032162d-fbb5-4e6a-be72-cda79869b9ff,1,0,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,1,0,10543f9a-4e3f-427a-b36a-9c66709dd6fb,10543f9a-4e3f-427a-b36a-9c66709dd6fb,1,0,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,1,0,96ab5424-7be1-416d-b74d-d0c815726b1f,96ab5424-7be1-416d-b74d-d0c815726b1f,1,0,3714e794-ddef-4ad9-a933-6130bbc84545,3714e794-ddef-4ad9-a933-6130bbc84545,1,0,282b089c-7411-40d6-9a0a-ceaf6abb5586,282b089c-7411-40d6-9a0a-ceaf6abb5586,1,0,678188aa-76e7-49bc-a4be-1c55ccd625b1,678188aa-76e7-49bc-a4be-1c55ccd625b1,1,0,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,1,0,b3415b4a-d8de-4536-aa4b-82e75fd986ee,b3415b4a-d8de-4536-aa4b-82e75fd986ee,1,0,acc996ab-672a-4602-b7ad-8eee83557e61,acc996ab-672a-4602-b7ad-8eee83557e61,1,0,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,1,0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,1,0,97745768-ed35-44f1-beba-abb8b28a29ae,97745768-ed35-44f1-beba-abb8b28a29ae,1,0,69364942-bcd1-4b06-9b57-fa59b4e7c552,69364942-bcd1-4b06-9b57-fa59b4e7c552,1,0,ab201c5f-4134-42cf-a528-c1c4df02f2d7,ab201c5f-4134-42cf-a528-c1c4df02f2d7,1,0,303fb7b5-6a23-40ea-ae12-b54f4ebae026,303fb7b5-6a23-40ea-ae12-b54f4ebae026,1,0,634cd26b-78f1-4446-8aad-b96ed16e5329,634cd26b-78f1-4446-8aad-b96ed16e5329,1,0,d8e62f1a-92ca-4971-9609-e79da798c083,d8e62f1a-92ca-4971-9609-e79da798c083,1,0,61892a62-9381-401d-af31-9073ef2509fb,61892a62-9381-401d-af31-9073ef2509fb,1,0,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,1,0,d5e1806b-9827-40ab-9cfa-23c22456d137,d5e1806b-9827-40ab-9cfa-23c22456d137,1,0,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,1,0,d24170d7-5477-4ec8-acd2-0de8bd2067d6,d24170d7-5477-4ec8-acd2-0de8bd2067d6,1,0,f047da82-7574-4da4-b54e-480195280a11,f047da82-7574-4da4-b54e-480195280a11,1,0,a469f018-da26-485f-87c3-f580321a34f0,a469f018-da26-485f-87c3-f580321a34f0,1,0,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,1,0,388f7571-8f1b-45c5-a8b8-45d648f2f5dd,388f7571-8f1b-45c5-a8b8-45d648f2f5dd,1,0,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,1,0,628de771-c19c-4474-989f-8fb6cd7756a2,628de771-c19c-4474-989f-8fb6cd7756a2,1,0,6b0ddefa-ee70-4b27-989f-e23c734ab943,6b0ddefa-ee70-4b27-989f-e23c734ab943,1,0,ee873280-28ea-41fb-af52-c10c2018cbe4,ee873280-28ea-41fb-af52-c10c2018cbe4,1,0,6789e57b-1293-442c-97d0-b8007367602e,6789e57b-1293-442c-97d0-b8007367602e,1,0,0f193c89-b664-448e-bed3-2147430367f7,0f193c89-b664-448e-bed3-2147430367f7,1,0,4c9b2506-75a8-47d3-a5d5-d946088ba14a,4c9b2506-75a8-47d3-a5d5-d946088ba14a,1,0,36eacaa1-2efd-49c0-82de-2f8972535bf2,36eacaa1-2efd-49c0-82de-2f8972535bf2,1,0,c35a643d-fe3a-4293-93c0-074fa68a31e3,c35a643d-fe3a-4293-93c0-074fa68a31e3,1,0,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,1,0,72ee9a03-a320-4e60-be04-0ee813ea567f,72ee9a03-a320-4e60-be04-0ee813ea567f,1,0,f6f52cc8-23a3-4402-b1eb-0e41584c802a,f6f52cc8-23a3-4402-b1eb-0e41584c802a,1,0,8398e065-8b4b-4901-b057-2a048776bafe,8398e065-8b4b-4901-b057-2a048776bafe,1,0,073c56ca-bf45-422d-957a-f9c57aeee4d0,073c56ca-bf45-422d-957a-f9c57aeee4d0,1,0,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,1,0,52f065fe-556a-47cd-82b1-c56d7894df30,52f065fe-556a-47cd-82b1-c56d7894df30,1,0,186efec4-1343-4234-a9b6-c8d8096faf76,186efec4-1343-4234-a9b6-c8d8096faf76,1,0,68598d98-0c59-4cda-b0b2-6901d3aff88b,68598d98-0c59-4cda-b0b2-6901d3aff88b,1,0,219c1375-f26e-4698-aa82-4b9d735df783,219c1375-f26e-4698-aa82-4b9d735df783,1,0,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,1,0,32012b27-1b43-49be-b9af-df0c877e7a4c,32012b27-1b43-49be-b9af-df0c877e7a4c,1,0,e97d5152-9e58-4a91-a691-b4d358f1c89d,e97d5152-9e58-4a91-a691-b4d358f1c89d,1,0,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1,0,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,1,0,296c478b-4103-46cb-9d14-97f59034ffd4,296c478b-4103-46cb-9d14-97f59034ffd4,1,0,fb918a68-f86d-46c0-9078-61d2b32b5aef,fb918a68-f86d-46c0-9078-61d2b32b5aef,1,0,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,1,0,1ddfc773-4f3c-4764-978e-585aab4666de,1ddfc773-4f3c-4764-978e-585aab4666de,1,0,e424d122-1dbb-4545-975c-177997129f2e,e424d122-1dbb-4545-975c-177997129f2e,1,0,c83bc626-dfdd-4451-92b0-b53eed40f534,c83bc626-dfdd-4451-92b0-b53eed40f534,1,0,7b9b1d11-4f78-4113-8fca-1a3a30953aef,7b9b1d11-4f78-4113-8fca-1a3a30953aef,1,0,7f84cb85-c3e4-4b53-b829-3b1e216f978a,7f84cb85-c3e4-4b53-b829-3b1e216f978a,1,0,7e621ecc-7d2b-42bf-a502-f8e59de56b63,7e621ecc-7d2b-42bf-a502-f8e59de56b63,1,0,798fd445-d02e-4e97-890a-0283f33317cf,798fd445-d02e-4e97-890a-0283f33317cf,1,0,095583ca-010d-43ad-8c7a-8938fa4cb761,095583ca-010d-43ad-8c7a-8938fa4cb761,1,0,178d210c-e847-4805-a8d4-31acdf4983af,178d210c-e847-4805-a8d4-31acdf4983af,1,0,aa214d9f-23b1-4996-8a43-9010dceeb53d,aa214d9f-23b1-4996-8a43-9010dceeb53d,1,0,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,1,0,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,1,0,d9d103bd-1dd6-48a9-8869-6c8485705393,d9d103bd-1dd6-48a9-8869-6c8485705393,1,0,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,1,0,ff0e8487-bdbf-4b21-877e-00008c81bc09,ff0e8487-bdbf-4b21-877e-00008c81bc09,1,0,39c9f8ac-56a0-4057-8359-7228bf97184a,39c9f8ac-56a0-4057-8359-7228bf97184a,1,0,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,1,0,2c0dd892-1d3e-4497-850b-080bdb9c59d8,2c0dd892-1d3e-4497-850b-080bdb9c59d8,1,0,3b727d49-c9ed-4d9e-af61-c13b9a170c75,3b727d49-c9ed-4d9e-af61-c13b9a170c75,1,0,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1,0,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,1,0,37bde288-8e02-4127-bd80-de8ae7590a14,37bde288-8e02-4127-bd80-de8ae7590a14,1,0,a9b8e517-78cd-4428-b2fc-9e16af0069d7,a9b8e517-78cd-4428-b2fc-9e16af0069d7,1,0,5c592024-c009-4674-bbb8-283669e673ef,5c592024-c009-4674-bbb8-283669e673ef,1,0,e76f16b9-77a0-4033-90d0-6e04e4494747,e76f16b9-77a0-4033-90d0-6e04e4494747,1,0,cfb221fc-8639-4e15-9a78-f7837d657a99,cfb221fc-8639-4e15-9a78-f7837d657a99,1,0,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,1,0,022147c1-1ebe-4c8d-b367-4c47115b101d,022147c1-1ebe-4c8d-b367-4c47115b101d,1,0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,1,0,fca6b230-a38e-4791-9cc5-3d215f79dc6f,fca6b230-a38e-4791-9cc5-3d215f79dc6f,1,0,04e87de4-940a-4533-8c81-8f145b201dc0,04e87de4-940a-4533-8c81-8f145b201dc0,1,0,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,1,0,fa488af9-a5ec-47d8-8661-fa5058a60a6b,fa488af9-a5ec-47d8-8661-fa5058a60a6b,1,0,97cc84c6-3565-474c-a028-83acb5390446,97cc84c6-3565-474c-a028-83acb5390446,1,0,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,1,0,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,1,0,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,1,0,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1,0,b366d7eb-626c-4c0c-b4cc-c392763e6e94,b366d7eb-626c-4c0c-b4cc-c392763e6e94,1,0,4c7e24aa-726a-4595-82ad-ef1e525b14fa,4c7e24aa-726a-4595-82ad-ef1e525b14fa,1,0,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,1,0,04b5ae71-7fa4-4a64-b406-59dc603b80c5,04b5ae71-7fa4-4a64-b406-59dc603b80c5,1,0,f23a2023-f776-40db-8689-1fc3f7ebc482,f23a2023-f776-40db-8689-1fc3f7ebc482,1,0,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1,0,ab178a93-8570-43b6-ae42-f34a7cc4f359,ab178a93-8570-43b6-ae42-f34a7cc4f359,1,0,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,1,0,168e3189-2676-4cdb-bc9d-78d85df51faf,168e3189-2676-4cdb-bc9d-78d85df51faf,1,0,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,1,0,470bbff8-20d0-475c-a61a-1a09ac14c2db,470bbff8-20d0-475c-a61a-1a09ac14c2db,1,0,6ea25680-c4db-4717-9498-62420ca16970,6ea25680-c4db-4717-9498-62420ca16970,1,0,14e20d48-635e-4c52-9099-e743323fc190,14e20d48-635e-4c52-9099-e743323fc190,1,0,c37a660e-16c5-495e-9486-e61bcb693fa0,c37a660e-16c5-495e-9486-e61bcb693fa0,1,0,8f44ebad-1160-474e-a566-fb9da55ffcba,8f44ebad-1160-474e-a566-fb9da55ffcba,1,0,11cf336e-7890-4972-bf71-32d7416ff647,11cf336e-7890-4972-bf71-32d7416ff647,1,0,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,1,0,14bd3392-36cd-4ed0-8847-44375d6fb861,14bd3392-36cd-4ed0-8847-44375d6fb861,1,0,759ede7a-e832-44e6-9b11-5bfb3c507820,759ede7a-e832-44e6-9b11-5bfb3c507820,1,0,64484611-b32c-4155-a063-7df5a3f924dd,64484611-b32c-4155-a063-7df5a3f924dd,1,0,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,1,0,821b93bd-f0dd-4468-972a-d9b2b4de72f1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,1,0,56900066-90e3-40c0-b64a-8f7964a4dfc1,56900066-90e3-40c0-b64a-8f7964a4dfc1,1,0,56f0c4d6-9b13-486a-9586-05e657dca8be,56f0c4d6-9b13-486a-9586-05e657dca8be,1,0,c795c0d3-6a0d-4311-9821-df320663727e,c795c0d3-6a0d-4311-9821-df320663727e,1,0,512b8d89-8798-4549-9e79-b9c3f7d9098f,512b8d89-8798-4549-9e79-b9c3f7d9098f,1,0,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,1,0,7f356abf-9045-4a76-89f3-8b52d467122a,7f356abf-9045-4a76-89f3-8b52d467122a,1,0,625a61ac-4ad0-4b31-aa67-9f864154b9c4,625a61ac-4ad0-4b31-aa67-9f864154b9c4,1,0,51fa8d01-44a1-4e75-9b04-6a2504972f08,51fa8d01-44a1-4e75-9b04-6a2504972f08,1,0,73dae482-a1ee-4c57-8859-2dd8e8635a49,73dae482-a1ee-4c57-8859-2dd8e8635a49,1,0,e4ea640f-e3a4-44ad-b17d-51f32136372e,e4ea640f-e3a4-44ad-b17d-51f32136372e,1,0,7dca913d-e37a-4740-8e3d-677d379605ee,7dca913d-e37a-4740-8e3d-677d379605ee,1,0,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,1,0,e62845df-704f-4ad5-b227-e0128877a814,e62845df-704f-4ad5-b227-e0128877a814,1,0,4f1393e4-9db5-43d6-b47e-caa1aad9b35c,4f1393e4-9db5-43d6-b47e-caa1aad9b35c,1,0,e62e60ea-9f0c-4a7e-869f-4639f31f826c,e62e60ea-9f0c-4a7e-869f-4639f31f826c,1,0,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,1,0,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,1,0,4cd4694f-17f8-43ba-8940-07628bd937fe,4cd4694f-17f8-43ba-8940-07628bd937fe,1,0,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,1,0,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,1,0,7df6c94b-3cfe-4764-988e-858d733e35d9,7df6c94b-3cfe-4764-988e-858d733e35d9,1,0,8b251c7d-2d55-4734-a1da-7f1115d95080,8b251c7d-2d55-4734-a1da-7f1115d95080,1,0,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,1,0,5a8c3621-595a-4168-8bba-a7f8d499e47e,5a8c3621-595a-4168-8bba-a7f8d499e47e,1,0,fc4cfed6-e492-4420-b357-8143a8c2a41a,fc4cfed6-e492-4420-b357-8143a8c2a41a,1,0,4311a250-64af-443e-a711-93b7c41175cf,4311a250-64af-443e-a711-93b7c41175cf,1,0,804b6c57-1d7b-4927-be5b-84b7959fe55e,804b6c57-1d7b-4927-be5b-84b7959fe55e,1,0,f2655d85-79ea-4736-8f41-94a4f9b2b998,f2655d85-79ea-4736-8f41-94a4f9b2b998,1,0,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,1,0,a8eb5ed9-df99-405b-afad-eeaa98956eee,a8eb5ed9-df99-405b-afad-eeaa98956eee,1,0,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,1,0,26a1279f-91f0-4632-ad7c-21cf2f524208,26a1279f-91f0-4632-ad7c-21cf2f524208,1,0,bf751ed0-ee47-4eaf-81bd-f0da00bef343,bf751ed0-ee47-4eaf-81bd-f0da00bef343,1,0,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,1,0,1f1def7c-e0ee-4963-afea-1751bf1b812c,1f1def7c-e0ee-4963-afea-1751bf1b812c,1,0,9a4c0898-ab56-425c-8191-5ab90f4e12bf,9a4c0898-ab56-425c-8191-5ab90f4e12bf,1,0,6841ec47-7a84-441a-b975-69d089072ce7,6841ec47-7a84-441a-b975-69d089072ce7,1,0,ead4001a-0d8a-4b95-8212-2a40e5aa6659,ead4001a-0d8a-4b95-8212-2a40e5aa6659,1,0,22165c8a-2179-4cd5-b195-bd2721e9e232,22165c8a-2179-4cd5-b195-bd2721e9e232,1,0,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,1,0,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,1,0,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,1,0,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,1,0,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,1,0,9d9debfd-4a10-4f09-9d09-2aa5e058b525,9d9debfd-4a10-4f09-9d09-2aa5e058b525,1,0,fc19586c-d89c-495c-b473-6f85967ed48e,fc19586c-d89c-495c-b473-6f85967ed48e,1,0,2ac7c701-a281-4e77-a5f8-294526021e2d,2ac7c701-a281-4e77-a5f8-294526021e2d,1,0,979df549-889d-496a-b6ce-c56d54c771b5,979df549-889d-496a-b6ce-c56d54c771b5,1,0,91b320d8-3426-44d3-97d7-c200287d7343,91b320d8-3426-44d3-97d7-c200287d7343,1,0,b9297f72-b40a-4adb-9975-bb693d4834a4,b9297f72-b40a-4adb-9975-bb693d4834a4,1,0,41cf3916-216f-4c4e-a587-82777f4263e0,41cf3916-216f-4c4e-a587-82777f4263e0,1,0,2ce3a350-86f1-4275-8299-3c3693ca11fa,2ce3a350-86f1-4275-8299-3c3693ca11fa,1,0,59f0ed15-c84c-4f41-bdd4-26317e4e914d,59f0ed15-c84c-4f41-bdd4-26317e4e914d,1,0,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,1,0,8fef790c-a3f4-460c-9093-5065cbdba196,8fef790c-a3f4-460c-9093-5065cbdba196,1,0,79bd24d0-61a9-4558-90ac-4e726066789c,79bd24d0-61a9-4558-90ac-4e726066789c,1,0,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,1,0,ef356548-51a4-4b09-b37d-ede5b8f3edb6,ef356548-51a4-4b09-b37d-ede5b8f3edb6,1,0,53c0d900-5e96-4381-a1ed-4424a5799608,53c0d900-5e96-4381-a1ed-4424a5799608,1,0,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,1,0,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,1,0,45ca9e20-1246-4400-a019-ffb521af6ea7,45ca9e20-1246-4400-a019-ffb521af6ea7,1,0,73eed854-5c3a-4a10-9bfa-793fd517f303,73eed854-5c3a-4a10-9bfa-793fd517f303,1,0,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,1,0,9134dc40-a8f1-4c60-9431-27cb98be5ecd,9134dc40-a8f1-4c60-9431-27cb98be5ecd,1,0,16c4622a-33af-4a95-b44e-0861a6df21d2,16c4622a-33af-4a95-b44e-0861a6df21d2,1,0,d8cac67b-cce2-4a00-a8df-c6570c50153f,d8cac67b-cce2-4a00-a8df-c6570c50153f,1,0,37213c65-bf26-4e50-a2fa-58eb45439b58,37213c65-bf26-4e50-a2fa-58eb45439b58,1,0,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,1,0,b6b31892-73ee-4c9b-92b0-2735536c4938,b6b31892-73ee-4c9b-92b0-2735536c4938,1,0,deb8b883-142e-47d0-a722-7c734a0cf9b3,deb8b883-142e-47d0-a722-7c734a0cf9b3,1,0,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,1,0,29233058-ccb1-4110-a9bc-cdb4c531f35a,29233058-ccb1-4110-a9bc-cdb4c531f35a,1,0,cf3729b2-9ee6-437c-81df-83966793be50,cf3729b2-9ee6-437c-81df-83966793be50,1,0,429d08b7-0b98-4f9b-a053-d04dd84a7026,429d08b7-0b98-4f9b-a053-d04dd84a7026,1,0,b64fd964-cee8-4619-872f-82d2fdc14240,b64fd964-cee8-4619-872f-82d2fdc14240,1,0,5ce7846d-9806-40f5-8631-4e14deb8bc95,5ce7846d-9806-40f5-8631-4e14deb8bc95,1,0,79528a0e-1e48-4d14-bd28-756fd5db57b9,79528a0e-1e48-4d14-bd28-756fd5db57b9,1,0,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,1,0,d9426219-4b37-4776-8d5d-acab5825e789,d9426219-4b37-4776-8d5d-acab5825e789,1,0,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,1,0,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,1,0,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,1,0,29e7299a-ce80-497a-8102-615d0a001ea8,29e7299a-ce80-497a-8102-615d0a001ea8,1,0,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,1,0,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,1,0,adc2cc11-b647-453f-a98e-8a73b7c368c7,adc2cc11-b647-453f-a98e-8a73b7c368c7,1,0,905b787b-c638-4703-af70-416a2ce43b50,905b787b-c638-4703-af70-416a2ce43b50,1,0,d7ea882a-6ef9-407f-b0e9-7bb42cf5ef17,d7ea882a-6ef9-407f-b0e9-7bb42cf5ef17,1,0,4522c564-61da-40da-a749-5312121a331d,4522c564-61da-40da-a749-5312121a331d,1,0,9394c709-6cbe-4ef6-bc8c-cba8af65821e,9394c709-6cbe-4ef6-bc8c-cba8af65821e,1,0,2943b572-7411-4f92-a6cc-7ee552b85223,2943b572-7411-4f92-a6cc-7ee552b85223,1,0,28478e7a-e8aa-40aa-866c-a3624f903141,28478e7a-e8aa-40aa-866c-a3624f903141,1,0,f692ab21-a8de-4feb-914f-4beef350543a,f692ab21-a8de-4feb-914f-4beef350543a,1,0,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,1,0,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,1,0,dabb3395-6100-4f53-913d-e0230e81b494,dabb3395-6100-4f53-913d-e0230e81b494,1,0,e0a3fae1-1582-4c7a-acd8-870b558acec4,e0a3fae1-1582-4c7a-acd8-870b558acec4,1,0,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,1,0,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,1,0,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,1,0,ecbe625a-55eb-437a-8dee-33fb034d4c0d,ecbe625a-55eb-437a-8dee-33fb034d4c0d,1,0,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,1,0,948b10b3-0d7c-4dca-8816-75eb86e7881b,948b10b3-0d7c-4dca-8816-75eb86e7881b,1,0,9de91b5a-98e4-414b-b650-b669b0159b49,9de91b5a-98e4-414b-b650-b669b0159b49,1,0,3de3948d-40ff-4e0d-8445-9bf49c916161,3de3948d-40ff-4e0d-8445-9bf49c916161,1,0,73a093ea-1927-483b-b6f5-8f0cbd253753,73a093ea-1927-483b-b6f5-8f0cbd253753,1,0,345f04c0-0274-4e79-b523-f1fa3cf0d92a,345f04c0-0274-4e79-b523-f1fa3cf0d92a,1,0,f3a14787-de1b-4b65-8cb1-bc33a785821c,f3a14787-de1b-4b65-8cb1-bc33a785821c,1,0,ec61075e-fbcb-494a-b790-81548a212d2b,ec61075e-fbcb-494a-b790-81548a212d2b,1,0,0c444045-302b-4dbd-a9a3-81fd40004948,0c444045-302b-4dbd-a9a3-81fd40004948,1,0,f9c0862c-34a2-41a3-ae46-b6a8e1ad1b08,f9c0862c-34a2-41a3-ae46-b6a8e1ad1b08,1,0,1528b799-1c0f-4244-85e8-e738b827934a,1528b799-1c0f-4244-85e8-e738b827934a,1,0,45d79e4d-8c2a-432b-abb8-fb9046abea40,45d79e4d-8c2a-432b-abb8-fb9046abea40,1,0,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,1,0,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,1,0,bd0f9ec3-156a-4a6f-a52b-1213ec825bc0,bd0f9ec3-156a-4a6f-a52b-1213ec825bc0,1,0,71e52f63-04db-4336-ace6-b143d0a7d250,71e52f63-04db-4336-ace6-b143d0a7d250,1,0,afe79ef0-7830-43ce-85f3-c4c97831aa67,afe79ef0-7830-43ce-85f3-c4c97831aa67,1,0,0d7c3192-b15b-4d40-83f9-b76c6f8e654f,0d7c3192-b15b-4d40-83f9-b76c6f8e654f,1,0,fe07f268-bcfd-40c6-adf3-79df859ff731,fe07f268-bcfd-40c6-adf3-79df859ff731,1,0,1a1c88ff-b0c4-42c3-bf10-ebdf4de935b7,1a1c88ff-b0c4-42c3-bf10-ebdf4de935b7,1,0,15e90374-99d9-48f7-b7d6-ec160cdb378f,15e90374-99d9-48f7-b7d6-ec160cdb378f,1,0,ad5b6b8e-c2b5-45aa-8e07-50ae8877ac8f,ad5b6b8e-c2b5-45aa-8e07-50ae8877ac8f,1,0,6c470f57-c920-435a-a013-ff83a737cf3a,6c470f57-c920-435a-a013-ff83a737cf3a,1,0,a5e13e12-72b7-477d-8d80-06015fa5dece,a5e13e12-72b7-477d-8d80-06015fa5dece,1,0,d9c47acd-b5ee-4ea1-b247-7cc09a13eb82,d9c47acd-b5ee-4ea1-b247-7cc09a13eb82,1,0,4a81906a-7db7-4e7d-a95e-79b07a43e573,4a81906a-7db7-4e7d-a95e-79b07a43e573,1,0,0bcabdf4-3348-405d-ba75-7bcc106f9e7f,0bcabdf4-3348-405d-ba75-7bcc106f9e7f,1,0,5f2980ca-3f1c-4680-a6e9-477825442782,5f2980ca-3f1c-4680-a6e9-477825442782,1,0,40fd6b4a-2180-4403-b7e6-48b42d8285b7,40fd6b4a-2180-4403-b7e6-48b42d8285b7,1,0,ef098c52-fcfa-4f0f-85b0-aba0d5aa46b2,ef098c52-fcfa-4f0f-85b0-aba0d5aa46b2,1,0,a671cb1e-b27a-44bb-a8ca-1388f099de2e,a671cb1e-b27a-44bb-a8ca-1388f099de2e,1,0,6cff6b09-91b5-4f2b-89aa-23d2f83f9d89,6cff6b09-91b5-4f2b-89aa-23d2f83f9d89,1,0,a4b6920e-3e25-4798-809a-27d7bfae4ee7,a4b6920e-3e25-4798-809a-27d7bfae4ee7,1,0,981f6e35-64b8-4d63-b383-32ea71fcd025,981f6e35-64b8-4d63-b383-32ea71fcd025,1,0,9a7b964d-1c06-44af-8d25-f84493c70a42,9a7b964d-1c06-44af-8d25-f84493c70a42,1,0,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,1,0,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,1,0,ab057ce4-ac51-4465-8aad-eadc9088c62d,ab057ce4-ac51-4465-8aad-eadc9088c62d,1,0,8842c0e3-2e20-4f37-ae7c-f5449004994b,8842c0e3-2e20-4f37-ae7c-f5449004994b,1,0,5b2cc44b-69cb-495c-a26b-003a495df40b,5b2cc44b-69cb-495c-a26b-003a495df40b,1,0,30250d93-10ff-45c9-920b-5fed3f9d8093,30250d93-10ff-45c9-920b-5fed3f9d8093,1,0,fc959221-6313-45d9-b2c4-85befaede226,fc959221-6313-45d9-b2c4-85befaede226,1,0,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,1,0,5206d407-ac91-477e-80e7-97c312da934c,5206d407-ac91-477e-80e7-97c312da934c,1,0,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,1,0,ccb8a530-260a-4488-b1d9-c67325c69bf4,ccb8a530-260a-4488-b1d9-c67325c69bf4,1,0,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,1,0,23f93492-59f5-491b-8708-45096934c7e6,23f93492-59f5-491b-8708-45096934c7e6,1,0,30f5471a-17fb-4184-9798-4f8e3ef0cccb,30f5471a-17fb-4184-9798-4f8e3ef0cccb,1,0,27abda4c-a43c-49b4-90cd-db780afe0c45,27abda4c-a43c-49b4-90cd-db780afe0c45,1,0,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,1,0,1a28db16-d410-4101-bf31-21cefa880dae,1a28db16-d410-4101-bf31-21cefa880dae,1,0,2b85bcf6-85b0-4efb-bada-b65414a8d264,2b85bcf6-85b0-4efb-bada-b65414a8d264,1,0,cf027de4-59c9-4b8f-9695-b1d4d16548fe,cf027de4-59c9-4b8f-9695-b1d4d16548fe,1,0,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,1,0,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0b13cad5-91ae-4cd1-a620-9a315ae8024c,1,0,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,1,0,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,1,0,81dd61e5-fe02-4272-a525-affda9b606ca,81dd61e5-fe02-4272-a525-affda9b606ca,1,0,8de7b423-b7d1-46fe-b1dc-fb936736b864,8de7b423-b7d1-46fe-b1dc-fb936736b864,1,0,f565876c-0326-4b12-895e-c248b9e64115,f565876c-0326-4b12-895e-c248b9e64115,1,0,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,1,0,88cefe4a-a6c5-4753-935e-f956d9de9f77,88cefe4a-a6c5-4753-935e-f956d9de9f77,1,0,882e78b7-90bd-4b95-8852-146bdb51ec15,882e78b7-90bd-4b95-8852-146bdb51ec15,1,0,ae4435c3-62c0-4f08-b526-7f9571eed8ae,ae4435c3-62c0-4f08-b526-7f9571eed8ae,1,0,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,1,0,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,1,0,c7b46558-d688-4c42-ae52-f98de7923176,c7b46558-d688-4c42-ae52-f98de7923176,1,0,31fdbb46-1df1-4b74-a54e-b922260dcca6,31fdbb46-1df1-4b74-a54e-b922260dcca6,1,0,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,1,0,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,1,0,80c23bf0-cef0-4d07-a017-d90635f8041d,80c23bf0-cef0-4d07-a017-d90635f8041d,1,0,47a24216-3299-470b-a18c-d8c1258fff24,47a24216-3299-470b-a18c-d8c1258fff24,1,0,72dcfd46-491e-4f88-a0ea-57919f8fbdea,72dcfd46-491e-4f88-a0ea-57919f8fbdea,1,0,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,1,0,8317ac49-890d-4921-8c0d-1bfc676f0b40,8317ac49-890d-4921-8c0d-1bfc676f0b40,1,0,f9161bc3-9a1c-4870-8681-8e97d8ce838a,f9161bc3-9a1c-4870-8681-8e97d8ce838a,1,0,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,1,0,c3b3805b-3501-47a7-b280-46180049b235,c3b3805b-3501-47a7-b280-46180049b235,1,0,29af05c2-37de-495b-b3cf-477d452abe5e,29af05c2-37de-495b-b3cf-477d452abe5e,1,0,0c732569-a50f-4be3-a214-0843c6a3da47,0c732569-a50f-4be3-a214-0843c6a3da47,1,0,f55d74bf-5824-4228-9683-31f7c7fdf74d,f55d74bf-5824-4228-9683-31f7c7fdf74d,1,0,5e922083-0ceb-449a-8201-7dd27a46f2fc,5e922083-0ceb-449a-8201-7dd27a46f2fc,1,0,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,1,0,c30c6860-befb-497e-b432-3dba0f86c540,c30c6860-befb-497e-b432-3dba0f86c540,1,0,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,1,0,e757303e-c61a-4e42-9829-c5a36dba9414,e757303e-c61a-4e42-9829-c5a36dba9414,1,0,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,1,0,091de87c-0801-4bd3-aaaa-ed37bc4cd161,091de87c-0801-4bd3-aaaa-ed37bc4cd161,1,0,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,1,0,b53c545c-3b1c-4315-a213-4f2b2c7128aa,b53c545c-3b1c-4315-a213-4f2b2c7128aa,1,0,02a84df9-2171-43e6-8135-a74edd384826,02a84df9-2171-43e6-8135-a74edd384826,1,0,ff36356d-cb1d-4316-896a-c6ae83b92437,ff36356d-cb1d-4316-896a-c6ae83b92437,1,0,465cce6a-7064-4b0a-932c-40f842042f33,465cce6a-7064-4b0a-932c-40f842042f33,1,0,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,1,0,e67dff00-92e2-4f58-a950-d5bbca9291c5,e67dff00-92e2-4f58-a950-d5bbca9291c5,1,0,e1964724-804a-4ecc-be9e-5b84e58f2b84,e1964724-804a-4ecc-be9e-5b84e58f2b84,1,0,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,1,0,bf3cb513-2856-472b-8713-7bf8ba70cdce,bf3cb513-2856-472b-8713-7bf8ba70cdce,1,0,de4815c8-0853-47e0-862b-b60119c674f6,de4815c8-0853-47e0-862b-b60119c674f6,1,0,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,1,0,8f17ec3f-6d62-46b8-baef-b20430e948ce,8f17ec3f-6d62-46b8-baef-b20430e948ce,1,0,ea1298d0-9396-4a50-b83e-24064e8dd99d,ea1298d0-9396-4a50-b83e-24064e8dd99d,1,0,038dbb00-e4c6-4e64-b861-3a0764f54ab3,038dbb00-e4c6-4e64-b861-3a0764f54ab3,1,0,1c291f7d-a493-4297-8aaa-912896800066,1c291f7d-a493-4297-8aaa-912896800066,1,0,69149801-a825-4ed2-b077-c26660dff271,69149801-a825-4ed2-b077-c26660dff271,1,0,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,1,0,518ab687-b84a-40c8-8547-aee4257c1b71,518ab687-b84a-40c8-8547-aee4257c1b71,1,0,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,1,0,7732ef07-16eb-46a0-9645-7de95c5482af,7732ef07-16eb-46a0-9645-7de95c5482af,1,0,75dac536-b316-4b04-a57b-03656c678bec,75dac536-b316-4b04-a57b-03656c678bec,1,0,a07d6c85-159d-4d09-b117-561a1e20329f,a07d6c85-159d-4d09-b117-561a1e20329f,1,0,8a2f9733-4f83-41f2-9d74-dca7161a4b41,8a2f9733-4f83-41f2-9d74-dca7161a4b41,1,0,fbd2d900-1e0d-48f3-9793-0186ee49915c,fbd2d900-1e0d-48f3-9793-0186ee49915c,1,0,436b558e-6547-4ba6-8cee-954fe36743ea,436b558e-6547-4ba6-8cee-954fe36743ea,1,0,6120bb6e-b177-48bf-b467-02bab0d4cc0d,6120bb6e-b177-48bf-b467-02bab0d4cc0d,1,0,a5af4715-6c4f-484b-9599-5b1b9147713f,a5af4715-6c4f-484b-9599-5b1b9147713f,1,0,307b6e66-6fef-4777-b20a-37898928932f,307b6e66-6fef-4777-b20a-37898928932f,1,0,a69494c0-dcce-4359-aa82-c1cfae8a43eb,a69494c0-dcce-4359-aa82-c1cfae8a43eb,1,0,2b243d49-5500-403a-b177-ac1c70bb889d,2b243d49-5500-403a-b177-ac1c70bb889d,1,0,51c040c6-e7a4-4e0e-b479-039636fdb6ec,51c040c6-e7a4-4e0e-b479-039636fdb6ec,1,0,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,1,0,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,1,0,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,1,0,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,1,0,3a36e0f5-a645-47f1-99ae-5b0493d604ad,3a36e0f5-a645-47f1-99ae-5b0493d604ad,1,0,57f762f7-b8e4-498b-a3dc-3d40c94855ec,57f762f7-b8e4-498b-a3dc-3d40c94855ec,1,0,ca7d4086-de35-40fd-af65-73369d452135,ca7d4086-de35-40fd-af65-73369d452135,1,0,563c0f5c-e0b4-4229-a3f6-183091060aa4,563c0f5c-e0b4-4229-a3f6-183091060aa4,1,0,bf967588-ea8f-49a3-9331-af2331ffa162,bf967588-ea8f-49a3-9331-af2331ffa162,1,0,d59c2725-5d98-495e-9f86-f5d38dbfad90,d59c2725-5d98-495e-9f86-f5d38dbfad90,1,0,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,1,0,0ba68198-983d-409b-be27-96f1572b3f12,0ba68198-983d-409b-be27-96f1572b3f12,1,0,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,1,0,decb27a8-7dd3-4601-a694-30429e638b39,decb27a8-7dd3-4601-a694-30429e638b39,1,0,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,1,0,d7a128e4-f31f-4b09-8424-e816ab59d5c3,d7a128e4-f31f-4b09-8424-e816ab59d5c3,1,0,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,1,0,aa9513b4-f575-4030-a7f9-ac09aa319e98,aa9513b4-f575-4030-a7f9-ac09aa319e98,1,0,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,1,0,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,1,0,d03f66b1-48a3-434b-bb58-9fd53c183514,d03f66b1-48a3-434b-bb58-9fd53c183514,1,0,a469e55e-d7ca-4c27-b350-fafe7364c18f,a469e55e-d7ca-4c27-b350-fafe7364c18f,1,0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,1,0,d2160866-78ca-424a-92b9-d389fb341ee0,d2160866-78ca-424a-92b9-d389fb341ee0,1,0,73b36823-72a4-4286-8ee2-02b2f086d5ea,73b36823-72a4-4286-8ee2-02b2f086d5ea,1,0,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,1,0,4378ab20-5467-476b-8f04-4b6876efdee6,4378ab20-5467-476b-8f04-4b6876efdee6,1,0,55e47901-c79c-41c5-9d7f-6b6846ed2782,55e47901-c79c-41c5-9d7f-6b6846ed2782,1,0,c013a650-bd4b-4e14-97cc-05df17dbb0d5,c013a650-bd4b-4e14-97cc-05df17dbb0d5,1,0,00bc2e99-c7c9-4a4b-b0bc-c9babe17deda,00bc2e99-c7c9-4a4b-b0bc-c9babe17deda,1,0,18ba2c0c-d606-47ee-9409-66acb24bd794,18ba2c0c-d606-47ee-9409-66acb24bd794,1,0,9f24891c-3846-455a-bf95-be3b186f4342,9f24891c-3846-455a-bf95-be3b186f4342,1,0,ddc332d9-1d60-40fe-87fd-7f2164db1edf,ddc332d9-1d60-40fe-87fd-7f2164db1edf,1,0,d0e3c3a5-e74c-4c0a-8679-77e6a097eb36,d0e3c3a5-e74c-4c0a-8679-77e6a097eb36,1,0,20c43755-49cc-4f11-bd2f-52a9e53547ef,20c43755-49cc-4f11-bd2f-52a9e53547ef,1,0,7dbed991-4883-444c-8ce2-96c203a905f2,7dbed991-4883-444c-8ce2-96c203a905f2,1,0,bbadd00d-6410-41ec-a7d8-4dbd52986cc2,bbadd00d-6410-41ec-a7d8-4dbd52986cc2,1,0,d5f66278-4ab2-407a-abef-eb7636e9ba95,d5f66278-4ab2-407a-abef-eb7636e9ba95,1,0,61e51391-c412-46a5-8290-d5183ad0db83,61e51391-c412-46a5-8290-d5183ad0db83,1,0,e9dfdaa2-4094-4501-a38a-3811e7e4c708,e9dfdaa2-4094-4501-a38a-3811e7e4c708,1,0,0a62947e-848a-47fa-a239-95aee6b955d4,0a62947e-848a-47fa-a239-95aee6b955d4,1,0,beaef14b-175f-4ebe-b387-9c922a42c99e,beaef14b-175f-4ebe-b387-9c922a42c99e,1,0,13daaad0-2726-4065-8158-47059865452a,13daaad0-2726-4065-8158-47059865452a,1,0,a7829dfb-adb9-4401-a609-ca9a0f2376b3,a7829dfb-adb9-4401-a609-ca9a0f2376b3,1,0,26f1076a-8100-4cf4-9539-29637a5e9137,26f1076a-8100-4cf4-9539-29637a5e9137,1,0,3ad5d8a7-3071-46aa-aebf-306bdb67983b,3ad5d8a7-3071-46aa-aebf-306bdb67983b,1,0,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,1,0,cb954476-c551-4a06-9bcd-18d67ba47dc8,cb954476-c551-4a06-9bcd-18d67ba47dc8,1,0,79201015-bfae-463e-81f1-0ae2d3066f3f,79201015-bfae-463e-81f1-0ae2d3066f3f,1,0,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,1,0,951927d4-7bfc-4edb-b97f-dcc29a937400,951927d4-7bfc-4edb-b97f-dcc29a937400,1,0,71309e88-d514-40f3-a329-b2a420e75504,71309e88-d514-40f3-a329-b2a420e75504,1,0,1ea3178b-73dd-4063-9140-c61687a4b1b8,1ea3178b-73dd-4063-9140-c61687a4b1b8,1,0,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,1,0,696723be-7b4f-4321-956e-eff07ea9f5fa,696723be-7b4f-4321-956e-eff07ea9f5fa,1,0,616c27dc-5c59-4469-97a7-27e0752bd3a7,616c27dc-5c59-4469-97a7-27e0752bd3a7,1,0,f7323121-74bc-441c-a3e9-dd5cb4f0accd,f7323121-74bc-441c-a3e9-dd5cb4f0accd,1,0,5225b4da-431e-469d-a30c-31fa434b7e86,5225b4da-431e-469d-a30c-31fa434b7e86,1,0,68dcbdd5-c1fd-472f-873c-359d3a237b8c,68dcbdd5-c1fd-472f-873c-359d3a237b8c,1,0,3c6e831c-c934-46bb-8040-edd6de81ba1b,3c6e831c-c934-46bb-8040-edd6de81ba1b,1,0,3c737aff-9581-409a-9a6e-d5e3c133d8df,3c737aff-9581-409a-9a6e-d5e3c133d8df,1,0,916a9ea9-309d-4a7a-9ded-63bda01a39d4,916a9ea9-309d-4a7a-9ded-63bda01a39d4,1,0,0fdbd1ab-716d-46b5-aa75-fb09812ced5b,0fdbd1ab-716d-46b5-aa75-fb09812ced5b,1,0,b26ab92b-9739-4eb4-b855-be6850274432,b26ab92b-9739-4eb4-b855-be6850274432,1,0,17944416-85a5-49e4-9fa8-652c671c3df0,17944416-85a5-49e4-9fa8-652c671c3df0,1,0,b7936cda-654e-4707-af76-385a63243cdf,b7936cda-654e-4707-af76-385a63243cdf,1,0,192844c3-7cb9-4477-a4af-0edb8ce5129d,192844c3-7cb9-4477-a4af-0edb8ce5129d,1,0,33324481-55d1-475f-9f12-7542a05429a2,33324481-55d1-475f-9f12-7542a05429a2,1,0,07b7591f-dcfc-483f-85f6-b5a08d952fe2,07b7591f-dcfc-483f-85f6-b5a08d952fe2,1,0,866c418f-332e-415a-bb8e-794d38f15080,866c418f-332e-415a-bb8e-794d38f15080,1,0,a34b8fdc-e756-4065-b68a-12a07fa7c40e,a34b8fdc-e756-4065-b68a-12a07fa7c40e,1,0,b853debb-d715-4296-9070-45cc5dae571d,b853debb-d715-4296-9070-45cc5dae571d,1,0,fc406b50-f267-44b8-a833-ba7e8880903e,fc406b50-f267-44b8-a833-ba7e8880903e,1,0,6517bf8b-d2fd-4b6b-a4a5-b3086ebad8de,6517bf8b-d2fd-4b6b-a4a5-b3086ebad8de,1,0,391a1891-85a2-45b8-a747-3ecd705fc75b,391a1891-85a2-45b8-a747-3ecd705fc75b,1,0,05681509-254d-4232-af69-62a63ed05716,05681509-254d-4232-af69-62a63ed05716,1,0,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,1,0,b9ef62f6-9b1d-4d13-8016-73ed531d195a,b9ef62f6-9b1d-4d13-8016-73ed531d195a,1,0,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,1,0,229fe764-87f5-4d19-b042-c31fef5cddd6,229fe764-87f5-4d19-b042-c31fef5cddd6,1,0,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,1,0,e932800c-fd81-417d-a601-c774b888d66a,e932800c-fd81-417d-a601-c774b888d66a,1,0,a2335b6f-1dbb-4722-979b-8bed83aa8c94,a2335b6f-1dbb-4722-979b-8bed83aa8c94,1,0,211cf921-d880-4f74-b8ee-5312dea28613,211cf921-d880-4f74-b8ee-5312dea28613,1,0,2fd3a396-b8ae-409e-9373-02a039393a80,2fd3a396-b8ae-409e-9373-02a039393a80,1,0,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,1,0,346ef414-b20b-4095-86fe-18ca21c9887f,346ef414-b20b-4095-86fe-18ca21c9887f,1,0,c01ab97b-4964-4f7d-b749-56c0b94feb93,c01ab97b-4964-4f7d-b749-56c0b94feb93,1,0,0cc63813-cf16-4a99-b3bd-18a773091230,0cc63813-cf16-4a99-b3bd-18a773091230,1,0,4fc00971-c980-468a-9690-5cd520d12eb0,4fc00971-c980-468a-9690-5cd520d12eb0,1,0,85972c27-4f39-4982-9307-7877e87ef87b,85972c27-4f39-4982-9307-7877e87ef87b,1,0,96afdffb-7595-4c49-9e86-8296f50bd2f5,96afdffb-7595-4c49-9e86-8296f50bd2f5,1,0,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,1,0,e125d3e0-950f-42ee-8904-bd26091afa55,e125d3e0-950f-42ee-8904-bd26091afa55,1,0,2b4797a5-074a-4a01-b99f-1c5590cfde40,2b4797a5-074a-4a01-b99f-1c5590cfde40,1,0,718e53d2-24ec-40fb-9def-825441ada46c,718e53d2-24ec-40fb-9def-825441ada46c,1,0,4c0a7fd6-8f09-41d6-949f-65ce708c1256,4c0a7fd6-8f09-41d6-949f-65ce708c1256,1,0,792abc06-b52a-4691-ba92-96ed73ca702a,792abc06-b52a-4691-ba92-96ed73ca702a,1,0,148dbe44-86d1-4362-b9db-8ff68cd2b34d,148dbe44-86d1-4362-b9db-8ff68cd2b34d,1,0,1fbc893e-3000-4fac-88f5-c82251835d65,1fbc893e-3000-4fac-88f5-c82251835d65,1,0,05852816-63ec-4179-abca-66372bbfb04c,05852816-63ec-4179-abca-66372bbfb04c,1,0,0165f721-b011-4524-bfd5-81e35092f2be,0165f721-b011-4524-bfd5-81e35092f2be,1,0,e74925d4-1979-4600-8560-0932d26450ad,e74925d4-1979-4600-8560-0932d26450ad,1,0,aa108131-151d-4356-8a24-345e4ec74281,aa108131-151d-4356-8a24-345e4ec74281,1,0,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,1,0,e3251f1a-3c80-4c86-9960-270920bd512f,e3251f1a-3c80-4c86-9960-270920bd512f,1,0,3c3d5474-977b-4df9-88de-042e997bd10d,3c3d5474-977b-4df9-88de-042e997bd10d,1,0,4b88d172-5a44-4011-bb38-e94bf7a9c879,4b88d172-5a44-4011-bb38-e94bf7a9c879,1,0,3bced2d4-e3d7-4489-a26d-f84620b096f4,3bced2d4-e3d7-4489-a26d-f84620b096f4,1,0,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,1,0,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,1,0,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,1,0,18436045-1008-4114-8032-274fea0f4627,18436045-1008-4114-8032-274fea0f4627,1,0,cad93727-cffb-44a6-aaee-be73a078e802,cad93727-cffb-44a6-aaee-be73a078e802,1,0,c034f410-ff8e-45d7-925f-94448f88a7af,c034f410-ff8e-45d7-925f-94448f88a7af,1,0,0027727b-3917-4010-9953-1649266e8ed7,0027727b-3917-4010-9953-1649266e8ed7,1,0,b088786a-046f-458c-8e7a-5bebf8df8b34,b088786a-046f-458c-8e7a-5bebf8df8b34,1,0,6d015113-1e32-4f5e-aacd-8134d7307125,6d015113-1e32-4f5e-aacd-8134d7307125,1,0,58230238-d2f2-422e-90cb-de355996eb19,58230238-d2f2-422e-90cb-de355996eb19,1,0,3d907678-628d-4fb2-85c2-149839024c08,3d907678-628d-4fb2-85c2-149839024c08,1,0,71384d10-6acf-4139-b766-cb8b5796f1a7,71384d10-6acf-4139-b766-cb8b5796f1a7,1,0,a8f149d7-e9bc-4695-b4f4-88434e31aafb,a8f149d7-e9bc-4695-b4f4-88434e31aafb,1,0,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,1,0,11ba510f-cb57-43d0-9897-c49e10b67ccd,11ba510f-cb57-43d0-9897-c49e10b67ccd,1,0,9d92af67-c88d-4429-9e85-0b5bf04c4b79,9d92af67-c88d-4429-9e85-0b5bf04c4b79,1,0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,1,0,43523bbb-c923-4a20-bcb5-50d30cc826ee,43523bbb-c923-4a20-bcb5-50d30cc826ee,1,0,c89d9aad-3364-45df-88b5-b23ae76edbba,c89d9aad-3364-45df-88b5-b23ae76edbba,1,0,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,1,0,7e4b9dce-e332-4d35-8b5f-d3f88918989d,7e4b9dce-e332-4d35-8b5f-d3f88918989d,1,0,d7a72321-5f1f-427e-a54d-f308dab1b9c4,d7a72321-5f1f-427e-a54d-f308dab1b9c4,1,0,b183eb38-a96e-4e12-9220-4b4027ae875c,b183eb38-a96e-4e12-9220-4b4027ae875c,1,0,07f7e1b5-07b0-4017-bb91-31759c4ffed1,07f7e1b5-07b0-4017-bb91-31759c4ffed1,1,0,6de76d43-40d5-494f-8d30-2ef80c79bc7e,6de76d43-40d5-494f-8d30-2ef80c79bc7e,1,0,60146806-ee46-44d5-8a7a-2ed48741e1c1,60146806-ee46-44d5-8a7a-2ed48741e1c1,1,0,96fe619a-b819-4f96-9788-e1f4ef57833a,96fe619a-b819-4f96-9788-e1f4ef57833a,1,0,94dff2da-f721-411a-9fc0-5d013b685dcc,94dff2da-f721-411a-9fc0-5d013b685dcc,1,0,9343fc5f-7b08-4be5-8cd5-dbed635b819d,9343fc5f-7b08-4be5-8cd5-dbed635b819d,1,0,99e87e66-1b07-451b-a476-f5213cbd7150,99e87e66-1b07-451b-a476-f5213cbd7150,1,0,c3317f75-f6ad-41f6-97f1-77074c3ff62a,c3317f75-f6ad-41f6-97f1-77074c3ff62a,1,0,8800dec9-84f8-4643-8742-1d76fe575f58,8800dec9-84f8-4643-8742-1d76fe575f58,1,0,62903794-3b41-4d21-b800-1c26dbeda3ce,62903794-3b41-4d21-b800-1c26dbeda3ce,1,0,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,1,0,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,1,0,93de88de-0069-4aa8-96b2-d5709e4def2f,93de88de-0069-4aa8-96b2-d5709e4def2f,1,0,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,1,0,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,1,0,3a8d9010-8785-4d8d-b908-b821d7d681c9,3a8d9010-8785-4d8d-b908-b821d7d681c9,1,0,2568a935-ea49-4b99-aa9c-de27de6a0e81,2568a935-ea49-4b99-aa9c-de27de6a0e81,1,0,de2bdd4f-93f2-4341-86d6-7082fc286a5c,de2bdd4f-93f2-4341-86d6-7082fc286a5c,1,0,ba96ec0e-931e-45be-a782-e68ba4fedddb,ba96ec0e-931e-45be-a782-e68ba4fedddb,1,0,9af5882f-3a42-4fae-83df-6aa8de577112,9af5882f-3a42-4fae-83df-6aa8de577112,1,0,79bc5e39-3017-48bf-8e42-fa34e8b581ef,79bc5e39-3017-48bf-8e42-fa34e8b581ef,1,0,fe6e207f-d306-4470-8441-ffd3f3710d31,fe6e207f-d306-4470-8441-ffd3f3710d31,1,0,7451af80-7387-4e8d-a3da-2ae0540c3fd4,7451af80-7387-4e8d-a3da-2ae0540c3fd4,1,0,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1,0,df459525-4e4d-4819-b996-5a6379b22a88,df459525-4e4d-4819-b996-5a6379b22a88,1,0,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,1,0,e67b4a32-4bac-450e-be6d-88c262383f31,e67b4a32-4bac-450e-be6d-88c262383f31,1,0,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,1,0,6c4c3eca-8b02-451b-af52-93073c3da146,6c4c3eca-8b02-451b-af52-93073c3da146,1,0,095c281c-3903-465d-baea-af1e6abf8019,095c281c-3903-465d-baea-af1e6abf8019,1,0,440d115d-a769-427e-891a-88d65fba2057,440d115d-a769-427e-891a-88d65fba2057,1,0,f7932210-027e-4fad-b7f7-3530789ce803,f7932210-027e-4fad-b7f7-3530789ce803,1,0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,1,0,4975d3d6-b5a2-41c6-973b-6817013a388d,4975d3d6-b5a2-41c6-973b-6817013a388d,1,0,18ebc799-9724-4ffb-855e-b09a0723869e,18ebc799-9724-4ffb-855e-b09a0723869e,1,0,a06b8ef5-83e6-4fc6-91e1-256004134d69,a06b8ef5-83e6-4fc6-91e1-256004134d69,1,0,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1,0,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,1,0,5b663988-3599-46dc-8d59-4c82ceac537c,5b663988-3599-46dc-8d59-4c82ceac537c,1,0,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0f5f136c-688b-491e-a72b-3d9c2e609f0e,1,0,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,1,0,679cc0df-df5c-4c33-8c64-c0b6cee39116,679cc0df-df5c-4c33-8c64-c0b6cee39116,1,0,b156752b-f25c-4f35-9474-8ac3636597f5,b156752b-f25c-4f35-9474-8ac3636597f5,1,0,bdc51d67-5fc2-4d28-8875-69e33e625be6,bdc51d67-5fc2-4d28-8875-69e33e625be6,1,0,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,1,0,b494ca7b-6548-4fa2-932c-acdf8c62a78a,b494ca7b-6548-4fa2-932c-acdf8c62a78a,1,0,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,1,0,f335aa38-4e9e-4653-9a76-b6d4ae178c93,f335aa38-4e9e-4653-9a76-b6d4ae178c93,1,0,a62894bc-fab4-4ed4-a57d-cbe725527198,a62894bc-fab4-4ed4-a57d-cbe725527198,1,0,b5bb5376-27a6-43f2-9e91-bf7c913b89fd,b5bb5376-27a6-43f2-9e91-bf7c913b89fd,1,0,24861cd2-2be0-4454-8154-2201e63be266,24861cd2-2be0-4454-8154-2201e63be266,1,0,2e364599-aad9-4d1d-a4df-6cbd3ed768e7,2e364599-aad9-4d1d-a4df-6cbd3ed768e7,1,0,b1dd4569-6ed9-49f4-b05b-359229afb7a5,b1dd4569-6ed9-49f4-b05b-359229afb7a5,1,0,c14cac09-820e-47ae-81bb-eb497950d40c,c14cac09-820e-47ae-81bb-eb497950d40c,1,0,201cd431-6027-466c-abec-09ff65f42244,201cd431-6027-466c-abec-09ff65f42244,1,0,1018c5d8-8aed-49ba-a27c-a44bddd96144,1018c5d8-8aed-49ba-a27c-a44bddd96144,1,0,a81e5d20-9c42-462d-83a3-f86522c473f5,a81e5d20-9c42-462d-83a3-f86522c473f5,1,0,1ce4440e-3709-4cb1-8505-2379d5146be3,1ce4440e-3709-4cb1-8505-2379d5146be3,1,0,81c1f13c-e4ac-46b8-a205-c4f695ddf667,81c1f13c-e4ac-46b8-a205-c4f695ddf667,1,0,a26d8489-88a8-438e-bb58-c7b5a742a243,a26d8489-88a8-438e-bb58-c7b5a742a243,1,0,4b700bfd-5179-4504-b710-fd65036dded7,4b700bfd-5179-4504-b710-fd65036dded7,1,0,b046cb0b-f88b-4fb1-b08d-bb02b20dee74,b046cb0b-f88b-4fb1-b08d-bb02b20dee74,1,0,67dc31fa-cc64-4d29-96aa-65a7fd480790,67dc31fa-cc64-4d29-96aa-65a7fd480790,1,0,17f0e86d-8661-492c-85fa-2ce3cd1a57d5,17f0e86d-8661-492c-85fa-2ce3cd1a57d5,1,0,17aadd5f-cda2-4785-a07f-3ab4b04434a6,17aadd5f-cda2-4785-a07f-3ab4b04434a6,1,0,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,1,0,1832336e-32f6-42c4-9087-8614ead52bb3,1832336e-32f6-42c4-9087-8614ead52bb3,1,0,ff9f7b5c-70f4-4eed-8216-64448e7da76f,ff9f7b5c-70f4-4eed-8216-64448e7da76f,1,0,44ac2869-990d-4cac-a14b-c1a28854341e,44ac2869-990d-4cac-a14b-c1a28854341e,1,0,d5df31c3-89f9-469c-80a9-fb4706d30bc4,d5df31c3-89f9-469c-80a9-fb4706d30bc4,1,0,65ad33ce-edab-4f8b-8f44-1a5634d87191,65ad33ce-edab-4f8b-8f44-1a5634d87191,1,0,bcd727b5-4678-41e9-85d5-98d4157cdd77,bcd727b5-4678-41e9-85d5-98d4157cdd77,1,0,38c6dd83-2a70-4c4a-9f29-3b2b54a15501,38c6dd83-2a70-4c4a-9f29-3b2b54a15501,1,0,f403fcb3-a4f8-479d-9fa1-85d458b9a4b5,f403fcb3-a4f8-479d-9fa1-85d458b9a4b5,1,0,c56d3cfe-6ae1-4fe3-abdc-2d845049ddde,c56d3cfe-6ae1-4fe3-abdc-2d845049ddde,1,0,66f1dc54-f28c-4fb7-a6c9-f839d656e87c,66f1dc54-f28c-4fb7-a6c9-f839d656e87c,1,0,b8e3d08d-d442-4ffa-83d8-f372a7d2d340,b8e3d08d-d442-4ffa-83d8-f372a7d2d340,1,0,ebba727b-8155-4dd8-8ea0-207ca396566b,ebba727b-8155-4dd8-8ea0-207ca396566b,1,0,e4166141-f18f-4d27-beb5-9e30fe30f842,e4166141-f18f-4d27-beb5-9e30fe30f842,1,0,b62434ac-ef9f-4fe7-8279-357e0dd760ac,b62434ac-ef9f-4fe7-8279-357e0dd760ac,1,0,eb1c7d02-f5fc-4b37-9b32-7dd828958d76,eb1c7d02-f5fc-4b37-9b32-7dd828958d76,1,0,db2f20a7-e01f-4c03-9343-a815e1b46b50,db2f20a7-e01f-4c03-9343-a815e1b46b50,1,0,cf122ec9-d781-434c-9742-300e701317d6,cf122ec9-d781-434c-9742-300e701317d6,1,0,2aa2a968-2cac-4883-9bc8-5a3ccbd2e7a9,2aa2a968-2cac-4883-9bc8-5a3ccbd2e7a9,1,0,7d1361af-c5d3-4312-ab5e-ba00bf3418f2,7d1361af-c5d3-4312-ab5e-ba00bf3418f2,1,0,d7fdb3d5-3c18-4d9c-938a-2fbe8a96e877,d7fdb3d5-3c18-4d9c-938a-2fbe8a96e877,1,0,b8658e11-42b6-41bb-b384-5380e2228338,b8658e11-42b6-41bb-b384-5380e2228338,1,0,40c0919f-2c53-4502-af06-745dfa47fd8e,40c0919f-2c53-4502-af06-745dfa47fd8e,1,0,b01e4e7f-1b01-4c19-ab4b-7a8c1f6b0d22,b01e4e7f-1b01-4c19-ab4b-7a8c1f6b0d22,1,0,662a2803-da19-40c7-a906-e20d0843f67f,662a2803-da19-40c7-a906-e20d0843f67f,1,0,327c0731-1496-4463-837f-8f9c3e4c1a49,327c0731-1496-4463-837f-8f9c3e4c1a49,1,0,d74a37c2-7f50-40da-b7f8-29f79ae7230c,d74a37c2-7f50-40da-b7f8-29f79ae7230c,1,0,37a677e7-6661-41b5-ba68-740361168ccf,37a677e7-6661-41b5-ba68-740361168ccf,1,0,2a41d20d-d57a-4ce8-832f-c1b83099e563,2a41d20d-d57a-4ce8-832f-c1b83099e563,1,0,a0701ad3-572a-4806-91c0-6c5fff8dd350,a0701ad3-572a-4806-91c0-6c5fff8dd350,1,0,c9f268d1-6d2a-47d5-9371-f951b95d24a6,c9f268d1-6d2a-47d5-9371-f951b95d24a6,1,0,86b155be-d611-46b4-8275-bb19a2fa20ba,86b155be-d611-46b4-8275-bb19a2fa20ba,1,0,fedb2d36-bb2e-49dd-9d52-afcc41f3636b,fedb2d36-bb2e-49dd-9d52-afcc41f3636b,1,0,5d74d2d1-a2af-4a52-a884-a60e6b07ffac,5d74d2d1-a2af-4a52-a884-a60e6b07ffac,1,0,69e67507-e063-4221-9b84-2ee9d8903c1a,69e67507-e063-4221-9b84-2ee9d8903c1a,1,0,a649cb56-2a53-4508-8bf4-9aa01373ede2,a649cb56-2a53-4508-8bf4-9aa01373ede2,1,0,7e572d75-3a89-43c0-ad68-18498d67f8ca,7e572d75-3a89-43c0-ad68-18498d67f8ca,1,0,3c159a42-d9f9-4de4-a86f-893b1fc65b46,3c159a42-d9f9-4de4-a86f-893b1fc65b46,1,0,545cd0e7-4125-48f1-9123-0bc39e436e5e,545cd0e7-4125-48f1-9123-0bc39e436e5e,1,0,9a17eec6-b517-4133-8d25-bb953d84461f,9a17eec6-b517-4133-8d25-bb953d84461f,1,0,a0a61d7f-879d-4e92-98a3-5291c834c341,a0a61d7f-879d-4e92-98a3-5291c834c341,1,0,7bf60016-2edc-443b-98b4-0864b548c482,7bf60016-2edc-443b-98b4-0864b548c482,1,0,74139209-f345-4fd9-9ade-15cc4d399836,74139209-f345-4fd9-9ade-15cc4d399836,1,0,e39de1c5-b43b-4f71-aa32-c03b8afd6f65,e39de1c5-b43b-4f71-aa32-c03b8afd6f65,1,0,d5b6aad4-b1bd-464b-aca0-f8455d6388b4,d5b6aad4-b1bd-464b-aca0-f8455d6388b4,1,0,033ab408-fa51-4af2-a82c-f3167de00681,033ab408-fa51-4af2-a82c-f3167de00681,1,0,f7267120-f367-4d47-be5e-e2aa7a2ada46,f7267120-f367-4d47-be5e-e2aa7a2ada46,1,0,911b4ba4-1902-4c69-a4c9-963ab93d35b0,911b4ba4-1902-4c69-a4c9-963ab93d35b0,1,0,70cf60eb-a5f8-4573-a28b-6844721459de,70cf60eb-a5f8-4573-a28b-6844721459de,1,0,e2666bd9-bf44-408b-98fa-b9be26bde33f,e2666bd9-bf44-408b-98fa-b9be26bde33f,1,0,9151fa13-6612-4c4c-a264-3fd669205de7,9151fa13-6612-4c4c-a264-3fd669205de7,1,0,fee8fd9d-be7d-4560-9b96-819ffd497c88,fee8fd9d-be7d-4560-9b96-819ffd497c88,1,0,c86135b4-063c-4ca8-99e2-35c61026b43f,c86135b4-063c-4ca8-99e2-35c61026b43f,1,0,186792a9-0a07-4b6d-a9a0-337221f6b009,186792a9-0a07-4b6d-a9a0-337221f6b009,1,0,49163bf6-4a6a-4da9-a0ed-257c22224b47,49163bf6-4a6a-4da9-a0ed-257c22224b47,1,0,74c71abe-90eb-4c05-a4a6-375a93e7b99c,74c71abe-90eb-4c05-a4a6-375a93e7b99c,1,0,d36efd98-34a7-41b4-99b6-34c09e71525a,d36efd98-34a7-41b4-99b6-34c09e71525a,1,0,e73a6a9d-8ddd-4531-9f17-745117d9da9b,e73a6a9d-8ddd-4531-9f17-745117d9da9b,1,0,9dd4e17c-d10b-435e-8665-08997edc3e7e,9dd4e17c-d10b-435e-8665-08997edc3e7e,1,0,cafd44e1-8509-4550-8329-ff8cab0c31ae,cafd44e1-8509-4550-8329-ff8cab0c31ae,1,0,ee0412d3-58e7-4715-8774-d49778e1ef73,ee0412d3-58e7-4715-8774-d49778e1ef73,1,0,ea31df21-1402-417a-9788-b17a7116e842,ea31df21-1402-417a-9788-b17a7116e842,1,0,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,1,0,e964753f-7f4c-4f9f-bd17-cdac317c1d35,e964753f-7f4c-4f9f-bd17-cdac317c1d35,1,0,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,1,0,43c22498-3fd6-4038-a291-05f0db9ab66a,43c22498-3fd6-4038-a291-05f0db9ab66a,1,0,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,1,0,ee6e5e56-5848-46b6-89bf-b9345a57d94c,ee6e5e56-5848-46b6-89bf-b9345a57d94c,1,0,8817c872-bdee-4577-bcc3-4046edc72803,8817c872-bdee-4577-bcc3-4046edc72803,1,0,5b88c214-4e4e-45c2-b8c5-14eb852e9900,5b88c214-4e4e-45c2-b8c5-14eb852e9900,1,0,105cd740-1f60-45e1-871c-adeecd291b0d,105cd740-1f60-45e1-871c-adeecd291b0d,1,0,95aec7d2-179b-4ea3-a3df-3d737b713564,95aec7d2-179b-4ea3-a3df-3d737b713564,1,0,4bd1cae4-d5b5-444e-9cf5-67a969714293,4bd1cae4-d5b5-444e-9cf5-67a969714293,1,0,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,1,0,f279a625-b88f-43b4-bce9-de1186fe7d7e,f279a625-b88f-43b4-bce9-de1186fe7d7e,1,0,a2f19cb2-9f2e-442b-b9f2-e5253c70871c,a2f19cb2-9f2e-442b-b9f2-e5253c70871c,1,0,0c67453e-038b-46f3-8c13-2786e8622ad8,0c67453e-038b-46f3-8c13-2786e8622ad8,1,0,8ff1dc4d-b46c-4519-80fe-19448e620e74,8ff1dc4d-b46c-4519-80fe-19448e620e74,1,0,7cd5ca8c-cc97-4664-964e-152fdcb5bdef,7cd5ca8c-cc97-4664-964e-152fdcb5bdef,1,0,be0a5f9a-ffab-41d8-b55a-a61355f5d269,be0a5f9a-ffab-41d8-b55a-a61355f5d269,1,0,9286105d-9aa9-44f9-ae63-bbbcec64eade,9286105d-9aa9-44f9-ae63-bbbcec64eade,1,0,99fc224a-2a61-441a-85e9-d69df6aa8b5e,99fc224a-2a61-441a-85e9-d69df6aa8b5e,1,0,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,1,0,d009782b-d73e-42d1-9979-2cbaf20ee98e,d009782b-d73e-42d1-9979-2cbaf20ee98e,1,0,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1,0,88d8edf7-654f-4627-b68d-c7e929726da6,88d8edf7-654f-4627-b68d-c7e929726da6,1,0,483720db-6c9e-4179-b5c7-56159c9b6073,483720db-6c9e-4179-b5c7-56159c9b6073,1,0,1725c619-9c4a-40ac-9044-00fee71945a4,1725c619-9c4a-40ac-9044-00fee71945a4,1,0,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,1,0,e95b126d-797d-4071-b7b4-b14aaf595f2d,e95b126d-797d-4071-b7b4-b14aaf595f2d,1,0,9241ea3c-633f-4469-9e70-c5a20e464da8,9241ea3c-633f-4469-9e70-c5a20e464da8,1,0,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,1,0,961ae0fb-7f7b-414d-8fbf-32b893b41085,961ae0fb-7f7b-414d-8fbf-32b893b41085,1,0,10adf8c8-6f5f-477f-b244-4452b774b766,10adf8c8-6f5f-477f-b244-4452b774b766,1,0,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,1,0,04ec5e44-8469-4e9c-8021-83d258f2ec54,04ec5e44-8469-4e9c-8021-83d258f2ec54,1,0,cff36ede-0bd1-424b-8c75-b9695133f32e,cff36ede-0bd1-424b-8c75-b9695133f32e,1,0,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,1,0,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,1,0,58b33683-1916-4aef-9b98-5569ef7782ed,58b33683-1916-4aef-9b98-5569ef7782ed,1,0,d3e1f622-f438-4cad-94ae-0272f51610f7,d3e1f622-f438-4cad-94ae-0272f51610f7,1,0,8569cd73-d40d-4d92-83e0-8ece0c03a86a,8569cd73-d40d-4d92-83e0-8ece0c03a86a,1,0,9ebe2809-be6b-4c91-9443-b237fb7ad43c,9ebe2809-be6b-4c91-9443-b237fb7ad43c,1,0,bf29c091-de15-4cd4-be0e-a9785f97d444,bf29c091-de15-4cd4-be0e-a9785f97d444,1,0,060b2bb4-ca03-4da9-930f-7f91f6299a35,060b2bb4-ca03-4da9-930f-7f91f6299a35,1,0,394b1a1c-a7ae-41b7-a346-4bac99fa567d,394b1a1c-a7ae-41b7-a346-4bac99fa567d,1,0,9a5fa511-59e8-4a1b-a101-f276f0b7b261,9a5fa511-59e8-4a1b-a101-f276f0b7b261,1,0,ccfe4e36-80b6-419f-8bb3-c1046203d023,ccfe4e36-80b6-419f-8bb3-c1046203d023,1,0,94b2e060-53b7-4b40-af05-30bea3520330,94b2e060-53b7-4b40-af05-30bea3520330,1,0,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,1,0,41b0dabd-85a3-4819-84dd-371eaf4f996e,41b0dabd-85a3-4819-84dd-371eaf4f996e,1,0,86a5ba4d-0681-4ddc-a505-0f537528e1a3,86a5ba4d-0681-4ddc-a505-0f537528e1a3,1,0,12d936f5-932b-4561-b934-c8444808a450,12d936f5-932b-4561-b934-c8444808a450,1,0,2ccb06ca-9bb7-4b74-9a96-c109bb117984,2ccb06ca-9bb7-4b74-9a96-c109bb117984,1,0,ac1a661d-db18-4576-80a9-a19d4140c05e,ac1a661d-db18-4576-80a9-a19d4140c05e,1,0,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,1,0,aa114d56-2faf-4925-8319-f0aa3993e9ee,aa114d56-2faf-4925-8319-f0aa3993e9ee,1,0,c3ffeb09-121b-4d77-9c15-def4648b4f3c,c3ffeb09-121b-4d77-9c15-def4648b4f3c,1,0,c2de0724-04c1-4adb-b62a-b7ba727dbe67,c2de0724-04c1-4adb-b62a-b7ba727dbe67,1,0,4ae26777-69ff-4a55-942b-0bad8ab7a70a,4ae26777-69ff-4a55-942b-0bad8ab7a70a,1,0,a0d8fb0a-0e90-4140-8687-e249b153dc66,a0d8fb0a-0e90-4140-8687-e249b153dc66,1,0,917c6f60-2a07-4587-9496-d393aff93953,917c6f60-2a07-4587-9496-d393aff93953,1,0,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,1,0,9fe72d73-4c95-47e0-bf92-dcb714d747c6,9fe72d73-4c95-47e0-bf92-dcb714d747c6,1,0,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,1,0,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,1,0,2b94076d-39ee-45ad-9ba5-435115cf5d4f,2b94076d-39ee-45ad-9ba5-435115cf5d4f,1,0,72ace16c-e90a-4d05-bc23-4351d4c87683,72ace16c-e90a-4d05-bc23-4351d4c87683,1,0,bd86e378-84bb-486a-be7b-319a3fe3b70b,bd86e378-84bb-486a-be7b-319a3fe3b70b,1,0,ef3bc279-6721-4949-8dc0-f96141f7f05c,ef3bc279-6721-4949-8dc0-f96141f7f05c,1,0,f81c7e21-48ad-4b64-975d-e62d34c7235a,f81c7e21-48ad-4b64-975d-e62d34c7235a,1,0,d0523c14-585e-45d3-9735-891235631004,d0523c14-585e-45d3-9735-891235631004,1,0,b6f8bc3e-f0cd-43ef-b060-d701cd446197,b6f8bc3e-f0cd-43ef-b060-d701cd446197,1,0,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,1,0,b94e805f-e1ab-4870-b855-98aa401864b2,b94e805f-e1ab-4870-b855-98aa401864b2,1,0,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,1,0,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,1,0,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,1,0,45af8f5d-d505-466b-a798-19f2219a180c,45af8f5d-d505-466b-a798-19f2219a180c,1,0,8a8229bc-f70a-4434-bacc-8a81fc58154b,8a8229bc-f70a-4434-bacc-8a81fc58154b,1,0,6324ad14-82ca-467b-b6b7-8d5f6049ca65,6324ad14-82ca-467b-b6b7-8d5f6049ca65,1,0,273446f0-f28b-4ce2-874c-3c6a57299b71,273446f0-f28b-4ce2-874c-3c6a57299b71,1,0,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,1,0,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,1,0,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,1,0,7a4e17bf-3649-4982-a9c6-5982390f1f1d,7a4e17bf-3649-4982-a9c6-5982390f1f1d,1,0,722be6e0-2698-431b-9206-777a36e6742f,722be6e0-2698-431b-9206-777a36e6742f,1,0,75bb0122-26bd-40be-8de8-7a57680c85ae,75bb0122-26bd-40be-8de8-7a57680c85ae,1,0,28dd22df-07cc-4e6d-89b2-b15a13f76615,28dd22df-07cc-4e6d-89b2-b15a13f76615,1,0,0c98b025-5adb-44dc-ab14-4c6517cc230b,0c98b025-5adb-44dc-ab14-4c6517cc230b,1,0,da2f09bd-109f-43aa-a90b-f033d17ed689,da2f09bd-109f-43aa-a90b-f033d17ed689,1,0,c4b3cb31-356e-4868-921c-f6710349def8,c4b3cb31-356e-4868-921c-f6710349def8,1,0,f98a7b6d-f364-4b84-9aeb-8dd822ef582f,f98a7b6d-f364-4b84-9aeb-8dd822ef582f,1,0,44526cb1-561d-4b87-a628-d79cc64ccdec,44526cb1-561d-4b87-a628-d79cc64ccdec,1,0,5e4dbba3-07df-4e30-be14-d9244f5ec21c,5e4dbba3-07df-4e30-be14-d9244f5ec21c,1,0,c8116351-4487-40f3-ae04-1e0741cc5df6,c8116351-4487-40f3-ae04-1e0741cc5df6,1,0,a6be80f7-d6aa-4371-a180-3d355080d849,a6be80f7-d6aa-4371-a180-3d355080d849,1,0,b37722c3-e29f-4a40-b4eb-0317919fc7a5,b37722c3-e29f-4a40-b4eb-0317919fc7a5,1,0,b1b1cd90-094d-428b-a6bc-156521c1c54d,b1b1cd90-094d-428b-a6bc-156521c1c54d,1,0,4f79ef7c-79be-4a69-acc0-bd591c712d03,4f79ef7c-79be-4a69-acc0-bd591c712d03,1,0,a0dd2129-d3a1-4bca-b555-72b065be1c13,a0dd2129-d3a1-4bca-b555-72b065be1c13,1,0,dc5e8229-e301-477c-846e-2e7078e3ee5f,dc5e8229-e301-477c-846e-2e7078e3ee5f,1,0,24836e44-8fdd-44bd-91d8-4ddab2caf485,24836e44-8fdd-44bd-91d8-4ddab2caf485,1,0,3727bcfe-4d75-4270-86e7-4a66ab14866c,3727bcfe-4d75-4270-86e7-4a66ab14866c,1,0,870a4708-0b5a-4fa3-9978-d94b161d289a,870a4708-0b5a-4fa3-9978-d94b161d289a,1,0,30e9f89d-7b94-488e-9963-886c271b1af7,30e9f89d-7b94-488e-9963-886c271b1af7,1,0,91af7a52-0825-4af5-94df-cc501e0123cd,91af7a52-0825-4af5-94df-cc501e0123cd,1,0,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1,0,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,1,0,9693cc78-852e-445b-a7d2-f1689fa9eeec,9693cc78-852e-445b-a7d2-f1689fa9eeec,1,0,eb33e555-db41-462a-a45d-c7e0945cece8,eb33e555-db41-462a-a45d-c7e0945cece8,1,0,9cfd517c-1008-483a-9f65-7d15feb2cefc,9cfd517c-1008-483a-9f65-7d15feb2cefc,1,0,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,1,0,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,1,0,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,1,0,1d76f613-f4f6-4772-8c16-d97b3104a553,1d76f613-f4f6-4772-8c16-d97b3104a553,1,0,3e58d607-b906-449f-b044-9c130a487b86,3e58d607-b906-449f-b044-9c130a487b86,1,0,7a911212-7fde-4ea8-a1fa-229116b60895,7a911212-7fde-4ea8-a1fa-229116b60895,1,0,f4580043-5bc2-4295-8523-909302009b44,f4580043-5bc2-4295-8523-909302009b44,1,0,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,1,0,81936ac2-32fe-4e14-897b-0aba92b90c05,81936ac2-32fe-4e14-897b-0aba92b90c05,1,0,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,1,0,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,1,0,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,1,0,2d279d24-1953-4a2f-8206-77481d2fd718,2d279d24-1953-4a2f-8206-77481d2fd718,1,0,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,1,0,0a920200-77d0-42ea-abf6-0d40d63289b0,0a920200-77d0-42ea-abf6-0d40d63289b0,1,0,c850bafc-4073-44ef-b148-194f87c46f0e,c850bafc-4073-44ef-b148-194f87c46f0e,1,0,6d1dd726-815d-476e-b668-95cff4182e54,6d1dd726-815d-476e-b668-95cff4182e54,1,0,12f4a0ed-4798-4467-8834-de3eb385e22d,12f4a0ed-4798-4467-8834-de3eb385e22d,1,0,5710809e-4c41-42ab-952f-f7778fe9be0f,5710809e-4c41-42ab-952f-f7778fe9be0f,1,0,0811f6c2-6bb3-43b8-9944-910adc4c6f23,0811f6c2-6bb3-43b8-9944-910adc4c6f23,1,0,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,1,0,c86b02ab-3532-4f4c-b993-e237ed0d4d12,c86b02ab-3532-4f4c-b993-e237ed0d4d12,1,0,83c860a2-d0d7-4b7c-a127-78d86b155cfa,83c860a2-d0d7-4b7c-a127-78d86b155cfa,1,0,06e45039-8bc4-44dd-8a93-2cec34ad51ee,06e45039-8bc4-44dd-8a93-2cec34ad51ee,1,0,46e01647-cbdd-4387-affc-29b92ede8644,46e01647-cbdd-4387-affc-29b92ede8644,1,0,faa44953-118b-4027-a913-c485bca7a93f,faa44953-118b-4027-a913-c485bca7a93f,1,0,c9bd0dcd-98ec-4dc9-869a-e735fd269046,c9bd0dcd-98ec-4dc9-869a-e735fd269046,1,0,d039bfa4-39a0-43d4-ab6a-0697f9d2b375,d039bfa4-39a0-43d4-ab6a-0697f9d2b375,1,0,09072c75-75c7-4050-b674-9454558a1f87,09072c75-75c7-4050-b674-9454558a1f87,1,0,f0c8d2d2-d597-4f09-8257-0fa7524f1e44,f0c8d2d2-d597-4f09-8257-0fa7524f1e44,1,0,3e2f75ab-4143-48ca-83db-3006cb2a8584,3e2f75ab-4143-48ca-83db-3006cb2a8584,1,0,91a82492-5e27-46b6-b1a8-48e89a437715,91a82492-5e27-46b6-b1a8-48e89a437715,1,0,53bc7bfd-8786-464f-a615-ceae2971cbc9,53bc7bfd-8786-464f-a615-ceae2971cbc9,1,0,aa77817b-bd2f-4757-99b0-5e67a1b032d3,aa77817b-bd2f-4757-99b0-5e67a1b032d3,1,0,8cc27936-976d-4f31-91c6-644d15b69c55,8cc27936-976d-4f31-91c6-644d15b69c55,1,0,cf9de063-89f4-4632-b7a1-0cfbea6df643,cf9de063-89f4-4632-b7a1-0cfbea6df643,1,0,ee3bab2c-bd6a-4a33-89a2-78b4dd89bb88,ee3bab2c-bd6a-4a33-89a2-78b4dd89bb88,1,0,2478fb43-57a3-4348-b3d4-61f015e4e231,2478fb43-57a3-4348-b3d4-61f015e4e231,1,0,daa99b45-b2d2-47bc-9d7e-2d21b1a3dfd8,daa99b45-b2d2-47bc-9d7e-2d21b1a3dfd8,1,0,0449c160-01e5-4fe4-8759-5b93c484b467,0449c160-01e5-4fe4-8759-5b93c484b467,1,0,0684e4ba-28c7-4032-a43f-a3a4a37ec50b,0684e4ba-28c7-4032-a43f-a3a4a37ec50b,1,0,bcac012d-b4a9-49bb-9c54-722c741d183c,bcac012d-b4a9-49bb-9c54-722c741d183c,1,0,5370d079-975f-4f7c-95c3-7868147ecc76,5370d079-975f-4f7c-95c3-7868147ecc76,1,0,4dd66f76-e4e0-4f84-9fad-bb922cd51503,4dd66f76-e4e0-4f84-9fad-bb922cd51503,1,0,e76a411a-121b-4791-a785-dd54795eaa7f,e76a411a-121b-4791-a785-dd54795eaa7f,1,0,66844ae3-f098-462c-aef8-1fd38c403760,66844ae3-f098-462c-aef8-1fd38c403760,1,0,be96718a-223d-4597-bccf-2fb7d16dbbcc,be96718a-223d-4597-bccf-2fb7d16dbbcc,1,0,eb551461-ae0d-41dd-89fa-2f6e7f3c4840,eb551461-ae0d-41dd-89fa-2f6e7f3c4840,1,0,acec1961-a953-4f7b-b42b-baa1b8b3be14,acec1961-a953-4f7b-b42b-baa1b8b3be14,1,0,eb6394d4-1679-4494-8d23-419f5a714cdc,eb6394d4-1679-4494-8d23-419f5a714cdc,1,0,ffb3c2e4-bb9b-4d12-80bb-79e3c6d5700d,ffb3c2e4-bb9b-4d12-80bb-79e3c6d5700d,1,0,7e9fadd6-d0ad-4856-a195-1058f00bf488,7e9fadd6-d0ad-4856-a195-1058f00bf488,1,0,76d0c5ee-5b85-4670-ba1c-8fdaa7ba872a,76d0c5ee-5b85-4670-ba1c-8fdaa7ba872a,1,0,84f67d35-ca48-4fff-94e4-5f4beb7e3c08,84f67d35-ca48-4fff-94e4-5f4beb7e3c08,1,0,2972c142-0aac-4e36-b34e-4e73f18ba9cb,2972c142-0aac-4e36-b34e-4e73f18ba9cb,1,0,d6915227-4ede-4cd2-9e7c-d23dc409936e,d6915227-4ede-4cd2-9e7c-d23dc409936e,1,0,46c3341c-352c-43fb-b338-15c8ad487fbf,46c3341c-352c-43fb-b338-15c8ad487fbf,1,0,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,1,0,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,1,0,f9450d6a-849c-4621-b528-9cafc4819b44,f9450d6a-849c-4621-b528-9cafc4819b44,1,0,5b7cac99-2fca-4dbb-8d49-b84f310a2496,5b7cac99-2fca-4dbb-8d49-b84f310a2496,1,0,a4673d5c-9dae-48f7-9c91-53c1302a266a,a4673d5c-9dae-48f7-9c91-53c1302a266a,1,0,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,1,0,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,1,0,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,1,0,3f410b53-e762-41fe-9469-d538dfec3a9a,3f410b53-e762-41fe-9469-d538dfec3a9a,1,0,bb11c22e-0fbd-4985-be67-0866df7f7e61,bb11c22e-0fbd-4985-be67-0866df7f7e61,1,0,92ea60c0-1027-4337-9130-40028951f09b,92ea60c0-1027-4337-9130-40028951f09b,1,0,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,1,0,d64f18a4-ff93-4284-9eca-085109eafd24,d64f18a4-ff93-4284-9eca-085109eafd24,1,0,6381b8d2-7722-45c7-8800-19f6574d7d7a,6381b8d2-7722-45c7-8800-19f6574d7d7a,1,0,bf428e7a-2970-4bab-8c8e-35ea16151c0e,bf428e7a-2970-4bab-8c8e-35ea16151c0e,1,0,232dbd5f-b7f1-4463-946c-b8fbf93ac466,232dbd5f-b7f1-4463-946c-b8fbf93ac466,1,0,a1a74b34-4174-4769-8f03-bd4a32e83418,a1a74b34-4174-4769-8f03-bd4a32e83418,1,0,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,1,0,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,1,0,7086199b-20ec-4a74-a52f-71824134e8c5,7086199b-20ec-4a74-a52f-71824134e8c5,1,0,1731708f-53cb-4b00-b90e-f581b4baa845,1731708f-53cb-4b00-b90e-f581b4baa845,1,0,d4b0feca-c00a-4d48-9f23-d92277ea6483,d4b0feca-c00a-4d48-9f23-d92277ea6483,1,0,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,1,0,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,1,0,23cb5bc2-9638-4d1c-b4bc-d5297e271570,23cb5bc2-9638-4d1c-b4bc-d5297e271570,1,0,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,1,0,04b7389d-697d-4b0d-a239-ac8c674cc46f,04b7389d-697d-4b0d-a239-ac8c674cc46f,1,0,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,1,0,864cad61-8280-415d-8fe1-bcb39d56670a,864cad61-8280-415d-8fe1-bcb39d56670a,1,0,b106bd29-5dc7-44d7-94d0-00f61499392e,b106bd29-5dc7-44d7-94d0-00f61499392e,1,0,a4febff8-0566-4977-bf55-1d574568fe9f,a4febff8-0566-4977-bf55-1d574568fe9f,1,0,5199cc65-bed1-40b9-96fe-cf6d855a8b91,5199cc65-bed1-40b9-96fe-cf6d855a8b91,1,0,f518add9-5c26-4dac-ab2e-b30fe3fbd347,f518add9-5c26-4dac-ab2e-b30fe3fbd347,1,0,23f53317-7aa8-4816-8a69-3d39d5e76da0,23f53317-7aa8-4816-8a69-3d39d5e76da0,1,0,9ade5155-fa6d-4999-b019-a5e7e235a158,9ade5155-fa6d-4999-b019-a5e7e235a158,1,0,8b302c5e-b255-4cb5-94d9-0dfef4250097,8b302c5e-b255-4cb5-94d9-0dfef4250097,1,0,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,1,0,d4eb3e9a-feb5-42d9-841b-ff20288228b6,d4eb3e9a-feb5-42d9-841b-ff20288228b6,1,0,49d713b8-6a61-4bd1-9650-0de1869967d2,49d713b8-6a61-4bd1-9650-0de1869967d2,1,0,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,1,0,bd0e4aeb-19f9-48fc-b838-38d785004360,bd0e4aeb-19f9-48fc-b838-38d785004360,1,0,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,1,0,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,1,0,6d351276-2c04-4198-a3e4-865881c12f5c,6d351276-2c04-4198-a3e4-865881c12f5c,1,0,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,1,0,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,1,0,8e07a76d-db30-491c-b296-181c8e689382,8e07a76d-db30-491c-b296-181c8e689382,1,0,4f1752ae-42d0-477d-854b-de143c428a85,4f1752ae-42d0-477d-854b-de143c428a85,1,0,29674b66-c542-4a34-8caa-8e57a51bd190,29674b66-c542-4a34-8caa-8e57a51bd190,1,0,1a41acdd-3503-4c69-b93b-eb1cb6749712,1a41acdd-3503-4c69-b93b-eb1cb6749712,1,0,0e45c53e-7571-49bf-b673-cff53d32af89,0e45c53e-7571-49bf-b673-cff53d32af89,1,0,169b0670-8fa7-48d1-b6b1-2cf581b18390,169b0670-8fa7-48d1-b6b1-2cf581b18390,1,0,2e239650-973b-4908-b91e-477062046528,2e239650-973b-4908-b91e-477062046528,1,0,4692eeee-5b73-42f3-ad39-794141af9e2b,4692eeee-5b73-42f3-ad39-794141af9e2b,1,0,0ddeed48-b98a-47c3-84a2-2eac065be06c,0ddeed48-b98a-47c3-84a2-2eac065be06c,1,0,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,1,0,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,1,0,47714327-dd28-4e32-a1c9-20ee47d9afd0,47714327-dd28-4e32-a1c9-20ee47d9afd0,1,0,4d76ef7a-f1a6-4147-84f4-6e1717dfd77e,4d76ef7a-f1a6-4147-84f4-6e1717dfd77e,1,0,d1eb0aa7-b485-4f3a-846d-be069ca807c0,d1eb0aa7-b485-4f3a-846d-be069ca807c0,1,0,afde7867-15d3-43fa-b439-6d9e40df580b,afde7867-15d3-43fa-b439-6d9e40df580b,1,0,a676ff94-a0d1-4de9-8690-ec67f2c891d8,a676ff94-a0d1-4de9-8690-ec67f2c891d8,1,0,012bf716-3672-462e-b390-7bb4384ab4b1,012bf716-3672-462e-b390-7bb4384ab4b1,1,0,65342599-ff37-4f99-8e40-f05d87403bcf,65342599-ff37-4f99-8e40-f05d87403bcf,1,0,3a3f505a-7a50-4111-8029-5b9057fed232,3a3f505a-7a50-4111-8029-5b9057fed232,1,0,1d66cd80-fd61-4bf2-a7f9-34b33443e1ea,1d66cd80-fd61-4bf2-a7f9-34b33443e1ea,1,0,7b638691-416d-4484-81f4-e4c796a92818,7b638691-416d-4484-81f4-e4c796a92818,1,0,03ab92e2-81a3-4e38-84a8-85c1d78d51e9,03ab92e2-81a3-4e38-84a8-85c1d78d51e9,1,0,ef09e296-af08-44ff-8303-4833b23a12c3,ef09e296-af08-44ff-8303-4833b23a12c3,1,0,8984f28e-8c83-499a-838c-5f51410d7b0e,8984f28e-8c83-499a-838c-5f51410d7b0e,1,0,73bf8c40-76ee-4c61-b56a-898bcd6da1ca,73bf8c40-76ee-4c61-b56a-898bcd6da1ca,1,0,434a0471-1389-4764-a901-69249e1fdc38,434a0471-1389-4764-a901-69249e1fdc38,1,0,7b6c1d9f-968e-4126-990e-fa2787ad83b2,7b6c1d9f-968e-4126-990e-fa2787ad83b2,1,0,b89108a9-8b4e-4b34-8f72-4eb502963743,b89108a9-8b4e-4b34-8f72-4eb502963743,1,0,398b93b1-620d-4942-ba44-7ea0f9cc14f0,398b93b1-620d-4942-ba44-7ea0f9cc14f0,1,0,7b06537e-d818-41b3-acc5-b6b63b543be8,7b06537e-d818-41b3-acc5-b6b63b543be8,1,0,74226c30-5f9b-4e47-b7cc-35e92139cbfa,74226c30-5f9b-4e47-b7cc-35e92139cbfa,1,0,09f812cb-770c-4f85-87f0-db35952c764e,09f812cb-770c-4f85-87f0-db35952c764e,1,0,8bbbcfd9-b6da-41f6-b543-863b12b9fb59,8bbbcfd9-b6da-41f6-b543-863b12b9fb59,1,0,eb48f8a9-1644-432d-a8a8-e63bc013a2fe,eb48f8a9-1644-432d-a8a8-e63bc013a2fe,1,0,36951804-70a4-45fa-9fad-1c37fd3ce7b7,36951804-70a4-45fa-9fad-1c37fd3ce7b7,1,0,d0031774-fa35-469f-9f8a-3aaa920928a0,d0031774-fa35-469f-9f8a-3aaa920928a0,1,0,6da02618-2454-48fe-b1dc-399d0d40d043,6da02618-2454-48fe-b1dc-399d0d40d043,1,0,5a080203-ecd2-4f40-ac64-c8024eda595e,5a080203-ecd2-4f40-ac64-c8024eda595e,1,0,3eabcb69-398b-43f5-bf53-c20f90bee5c4,3eabcb69-398b-43f5-bf53-c20f90bee5c4,1,0,9c33639e-529a-490f-9365-80778b54c3f7,9c33639e-529a-490f-9365-80778b54c3f7,1,0,561b97a0-9d42-4735-a606-8d5b5862689f,561b97a0-9d42-4735-a606-8d5b5862689f,1,0,10d5c0c2-301f-4477-a88f-254f99a30fa0,10d5c0c2-301f-4477-a88f-254f99a30fa0,1,0,84ba4ba7-2743-438a-8b65-cc14090f8a92,84ba4ba7-2743-438a-8b65-cc14090f8a92,1,0,cdc4312c-b1af-407c-bfc3-28db04915aa6,cdc4312c-b1af-407c-bfc3-28db04915aa6,1,0,97b76ee8-c73f-456b-9008-b453bd376317,97b76ee8-c73f-456b-9008-b453bd376317,1,0,ee305e39-978b-4069-a4e6-05e761a5d6ae,ee305e39-978b-4069-a4e6-05e761a5d6ae,1,0,965650ae-8a6e-469a-869a-0ce821818058,965650ae-8a6e-469a-869a-0ce821818058,1,0,00fde8e2-3eb3-484a-a960-a390cbdaa16a,00fde8e2-3eb3-484a-a960-a390cbdaa16a,1,0,c7a82aa5-043c-46a2-9f5a-cba098ca36bd,c7a82aa5-043c-46a2-9f5a-cba098ca36bd,1,0,94744edd-61d0-4329-95d8-fc19dc7c6af1,94744edd-61d0-4329-95d8-fc19dc7c6af1,1,0,43bbf87f-8f21-49b9-be2f-eceb64c2c650,43bbf87f-8f21-49b9-be2f-eceb64c2c650,1,0,69db1a1c-3e9d-4e3c-b31e-731f2b8635b9,69db1a1c-3e9d-4e3c-b31e-731f2b8635b9,1,0,621b1881-9a7f-4fa4-a373-46467743e29c,621b1881-9a7f-4fa4-a373-46467743e29c,1,0,932ef5a0-4bad-424d-9772-ad8393c12006,932ef5a0-4bad-424d-9772-ad8393c12006,1,0,35dbc542-3ad9-4a72-9863-229a67cda425,35dbc542-3ad9-4a72-9863-229a67cda425,1,0,8e4277e9-983a-4d43-b08e-a4f918df87bf,8e4277e9-983a-4d43-b08e-a4f918df87bf,1,0,110e76d3-26ad-4392-9f82-255d792478a1,110e76d3-26ad-4392-9f82-255d792478a1,1,0,9117730e-1d3f-47b6-84fc-7a02377f86a0,9117730e-1d3f-47b6-84fc-7a02377f86a0,1,0,0a7eec2f-41c6-4d77-98a4-5e0bfc698997,0a7eec2f-41c6-4d77-98a4-5e0bfc698997,1,0,ec06e6a7-7894-4411-9b54-f811837b8a2e,ec06e6a7-7894-4411-9b54-f811837b8a2e,1,0,f43f3a1b-7f71-4a4f-9ec2-5f4d7d77efca,f43f3a1b-7f71-4a4f-9ec2-5f4d7d77efca,1,0,0947bd87-9542-4d2b-8439-9f6ccdb2c9cc,0947bd87-9542-4d2b-8439-9f6ccdb2c9cc,1,0,c0e2673a-1846-4ae5-933a-4e33b73a866b,c0e2673a-1846-4ae5-933a-4e33b73a866b,1,0,3996aff6-b6ce-4f6b-a2f3-1b0bf8b1d0c2,3996aff6-b6ce-4f6b-a2f3-1b0bf8b1d0c2,1,0,f5fadf27-b8ca-421b-8a73-c3f10aef248b,f5fadf27-b8ca-421b-8a73-c3f10aef248b,1,0,006fa20c-ba4b-4003-a743-b47c4b7bd815,006fa20c-ba4b-4003-a743-b47c4b7bd815,1,0,4ecd2da3-4d0c-416b-ae97-66f6f753226b,4ecd2da3-4d0c-416b-ae97-66f6f753226b,1,0,ec680d71-eb28-4b42-a664-c6137c259eaa,ec680d71-eb28-4b42-a664-c6137c259eaa,1,0,efa1d27f-0620-4b3a-b058-12f160008478,efa1d27f-0620-4b3a-b058-12f160008478,1,0,2dd0ec2e-457d-4147-b806-ff3d6fa091fb,2dd0ec2e-457d-4147-b806-ff3d6fa091fb,1,0,005d4afc-7d09-4cef-acaa-50d49e455df0,005d4afc-7d09-4cef-acaa-50d49e455df0,1,0,d773673e-992d-4f22-9fb3-acfb8863217d,d773673e-992d-4f22-9fb3-acfb8863217d,1,0,6cf00002-d685-4340-a873-196126a19664,6cf00002-d685-4340-a873-196126a19664,1,0,e422c08d-f54f-4a49-b0c5-a50bf63973c9,e422c08d-f54f-4a49-b0c5-a50bf63973c9,1,0,8288078e-0d2f-47c5-8e58-c5a17a76cc11,8288078e-0d2f-47c5-8e58-c5a17a76cc11,1,0,82abcc34-c8aa-42a0-b2fe-f66b7cafc2a0,82abcc34-c8aa-42a0-b2fe-f66b7cafc2a0,1,0,304feda3-6d33-466c-9e0d-9cea97d763be,304feda3-6d33-466c-9e0d-9cea97d763be,1,0,ecaf5d2f-0cea-4ad0-8550-51be37cead5c,ecaf5d2f-0cea-4ad0-8550-51be37cead5c,1,0,448e7386-cc56-4578-9c57-ef270980a0ff,448e7386-cc56-4578-9c57-ef270980a0ff,1,0,c2cdc60c-157d-450f-b3ba-2b6242459ebb,c2cdc60c-157d-450f-b3ba-2b6242459ebb,1,0,186f87ca-b9d5-48fa-b196-eed2794bade4,186f87ca-b9d5-48fa-b196-eed2794bade4,1,0,b87d9e04-9e12-42a5-b9fd-ea9a9bab59eb,b87d9e04-9e12-42a5-b9fd-ea9a9bab59eb,1,0,65b653b7-1298-40e4-9d69-2ce7810d5985,65b653b7-1298-40e4-9d69-2ce7810d5985,1,0,5fd170a9-44fc-4d18-9e51-2dbf09ca902e,5fd170a9-44fc-4d18-9e51-2dbf09ca902e,1,0,66359bb1-8692-415a-86d9-f40545f88d3a,66359bb1-8692-415a-86d9-f40545f88d3a,1,0,83be7bdf-e915-440f-a39f-1bb74db34b3e,83be7bdf-e915-440f-a39f-1bb74db34b3e,1,0,190b6efe-e67e-4274-abb9-263178a6ec4a,190b6efe-e67e-4274-abb9-263178a6ec4a,1,0,1363523a-929e-49ac-ae39-d43acf9f0478,1363523a-929e-49ac-ae39-d43acf9f0478,1,0,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,1,0,2876c476-8280-426d-8bf9-c93beda0ddd5,2876c476-8280-426d-8bf9-c93beda0ddd5,1,0,963e0813-4f6b-4d31-b66d-77125c47ce19,963e0813-4f6b-4d31-b66d-77125c47ce19,1,0,a720abc8-dcf0-4684-8d94-22d394a8e4df,a720abc8-dcf0-4684-8d94-22d394a8e4df,1,0,e40f53de-c27b-4e74-8241-f784d7ca5c84,e40f53de-c27b-4e74-8241-f784d7ca5c84,1,0,ef38b84d-277e-48c2-8826-330132eb6807,ef38b84d-277e-48c2-8826-330132eb6807,1,0,67a50910-059a-4724-84e0-c21bc3ac74c2,67a50910-059a-4724-84e0-c21bc3ac74c2,1,0,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,1,0,d9f76f2f-2b32-4986-8987-a585f831d951,d9f76f2f-2b32-4986-8987-a585f831d951,1,0,b1a96083-1c12-43f4-ba61-3a0588fc7310,b1a96083-1c12-43f4-ba61-3a0588fc7310,1,0,2e37c7d0-b97f-4c72-821e-b2bb77fb3140,2e37c7d0-b97f-4c72-821e-b2bb77fb3140,1,0,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,1,0,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,1,0,2c0d11fc-b927-4b5d-a16c-d60e69580824,2c0d11fc-b927-4b5d-a16c-d60e69580824,1,0,ee49981d-91f6-4002-9205-b8a53e6f54e0,ee49981d-91f6-4002-9205-b8a53e6f54e0,1,0,64a74365-ca32-4b7d-af8e-695624e3dcb6,64a74365-ca32-4b7d-af8e-695624e3dcb6,1,0,5251e744-666e-48a0-a5b4-9cef313c7631,5251e744-666e-48a0-a5b4-9cef313c7631,1,0,d3aca87c-2b47-48da-82dd-18ca867c8463,d3aca87c-2b47-48da-82dd-18ca867c8463,1,0,669b81a6-6526-4b5c-aafa-1988ae5253ce,669b81a6-6526-4b5c-aafa-1988ae5253ce,1,0,ab138a0c-71fe-4ca2-9d82-21f5830dde24,ab138a0c-71fe-4ca2-9d82-21f5830dde24,1,0,ffa6c000-ec84-4749-8ffe-42b0599751cd,ffa6c000-ec84-4749-8ffe-42b0599751cd,1,0,740bde9c-9fe1-4183-ab01-3fbe91d33b61,740bde9c-9fe1-4183-ab01-3fbe91d33b61,1,0,e8e19542-c5c8-418b-8a83-20336fd9075a,e8e19542-c5c8-418b-8a83-20336fd9075a,1,0,ebedc283-5eb0-459b-b686-f8643666b8b8,ebedc283-5eb0-459b-b686-f8643666b8b8,1,0,6a6afffd-cfed-4801-8b59-34d27e46565c,6a6afffd-cfed-4801-8b59-34d27e46565c,1,0,a469b12d-4537-419c-91e0-37abc9d31505,a469b12d-4537-419c-91e0-37abc9d31505,1,0,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,1,0,82c42232-531e-403f-8599-cc21a248fa2c,82c42232-531e-403f-8599-cc21a248fa2c,1,0,9104b791-9ac4-41ba-a7f0-9e609db3b578,9104b791-9ac4-41ba-a7f0-9e609db3b578,1,0,2d3721d1-816f-4e84-9df1-863cb269d83d,2d3721d1-816f-4e84-9df1-863cb269d83d,1,0,eaa11272-8cc2-4f82-808f-e4f641748574,eaa11272-8cc2-4f82-808f-e4f641748574,1,0,9dfd78a7-74ba-4c7a-8842-4baf4ffd5e4f,9dfd78a7-74ba-4c7a-8842-4baf4ffd5e4f,1,0,7d422da3-8ec4-4bc8-94ba-88d92625d4c7,7d422da3-8ec4-4bc8-94ba-88d92625d4c7,1,0,8035e1ce-a36a-4628-8196-1f04f50e230a,8035e1ce-a36a-4628-8196-1f04f50e230a,1,0,51f08b3c-2f03-408e-89d5-53ccbaec4e74,51f08b3c-2f03-408e-89d5-53ccbaec4e74,1,0,920ebc04-3018-4948-bae2-16de8f0f0c9a,920ebc04-3018-4948-bae2-16de8f0f0c9a,1,0,4c4fc449-05a5-4223-bd28-c73d27780a9b,4c4fc449-05a5-4223-bd28-c73d27780a9b,1,0,0b09cf2f-1759-4362-b997-29e09ac00445,0b09cf2f-1759-4362-b997-29e09ac00445,1,0,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,1,0,828ddf5d-ca09-4baf-897f-77d569e02a6b,828ddf5d-ca09-4baf-897f-77d569e02a6b,1,0,8856015c-a695-4b1a-99ef-770263f9dc4a,8856015c-a695-4b1a-99ef-770263f9dc4a,1,0,183ec2b5-e173-4885-9e26-1098ffa15020,183ec2b5-e173-4885-9e26-1098ffa15020,1,0,74702fdf-bfc5-4658-ba58-e39bcfbaa647,74702fdf-bfc5-4658-ba58-e39bcfbaa647,1,0,2f436ec3-6a04-4d2c-998a-c60ea875ca86,2f436ec3-6a04-4d2c-998a-c60ea875ca86,1,0,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,1,0,ae641a80-4ada-4592-ace9-29a82e6700e4,ae641a80-4ada-4592-ace9-29a82e6700e4,1,0,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,1,0,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,1,0,703453e8-cb49-491b-8e19-a17b89894d1e,703453e8-cb49-491b-8e19-a17b89894d1e,1,0,f0b0608c-178f-4dea-b461-0d8f00d79d30,f0b0608c-178f-4dea-b461-0d8f00d79d30,1,0,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,1,0,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,1,0,5546b9a9-a4fe-4a2b-9492-883bcb37a210,5546b9a9-a4fe-4a2b-9492-883bcb37a210,1,0,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,1,0,275a5772-8428-497a-81ef-c919f15fcccd,275a5772-8428-497a-81ef-c919f15fcccd,1,0,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,1,0,b5278cbd-1771-4739-9013-a28682689778,b5278cbd-1771-4739-9013-a28682689778,1,0,a52f2de4-f414-4837-9b1a-6d8f282e1327,a52f2de4-f414-4837-9b1a-6d8f282e1327,1,0,82573440-0ef5-4c07-bb1e-fe90295981d2,82573440-0ef5-4c07-bb1e-fe90295981d2,1,0,804be484-09cf-45a4-bd1f-c8850067e2b2,804be484-09cf-45a4-bd1f-c8850067e2b2,1,0,f1a145ce-a199-475c-ab8a-065c11a27277,f1a145ce-a199-475c-ab8a-065c11a27277,1,0,8d509c4e-fcea-4ccd-aec4-e146f2d4319b,8d509c4e-fcea-4ccd-aec4-e146f2d4319b,1,0,d126a11e-c770-4309-941f-cbcdd5cbad5d,d126a11e-c770-4309-941f-cbcdd5cbad5d,1,0,f4d88096-bff9-416a-8f75-9143ede1213f,f4d88096-bff9-416a-8f75-9143ede1213f,1,0,6b0721fe-d27f-4d1a-b377-26fce2ed1687,6b0721fe-d27f-4d1a-b377-26fce2ed1687,1,0,25c97480-330c-42f2-a2a5-031062a3a683,25c97480-330c-42f2-a2a5-031062a3a683,1,0,a2fb1bf9-d29a-4bfe-95f1-10883fa019b3,a2fb1bf9-d29a-4bfe-95f1-10883fa019b3,1,0,6adc3aa8-8784-467d-8e12-b60418a5c729,6adc3aa8-8784-467d-8e12-b60418a5c729,1,0,265206ed-4d41-497e-a483-c14052134500,265206ed-4d41-497e-a483-c14052134500,1,0,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,1,0,10336352-f3a1-4bc3-bdec-1a2eef15f176,10336352-f3a1-4bc3-bdec-1a2eef15f176,1,0,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,1,0,3b7c713e-81ae-4adc-9519-99c936599ef7,3b7c713e-81ae-4adc-9519-99c936599ef7,1,0,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1,0,ecda2c4b-6411-4b47-ab59-1918bad5acdd,ecda2c4b-6411-4b47-ab59-1918bad5acdd,1,0,a9a05a66-0a1c-4e53-9d09-1abe8f45e354,a9a05a66-0a1c-4e53-9d09-1abe8f45e354,1,0,2c811ee8-f50d-4c39-82ee-0492feb1c431,2c811ee8-f50d-4c39-82ee-0492feb1c431,1,0,399f679b-f48a-4d4e-b890-5eab9e4598c3,399f679b-f48a-4d4e-b890-5eab9e4598c3,1,0,da9ca4c4-c291-4f8b-accd-bc1b123ed4f8,da9ca4c4-c291-4f8b-accd-bc1b123ed4f8,1,0,9ad1ea04-1aee-4a80-b4df-60526cdf3ad0,9ad1ea04-1aee-4a80-b4df-60526cdf3ad0,1,0,0a92df3d-fb51-4fba-938c-55846929bd5f,0a92df3d-fb51-4fba-938c-55846929bd5f,1,0,1d005a8d-aaac-4442-a7dc-12634d03f6f3,1d005a8d-aaac-4442-a7dc-12634d03f6f3,1,0,348d0ad2-f64e-4ea0-8b8e-11bbc10926f7,348d0ad2-f64e-4ea0-8b8e-11bbc10926f7,1,0,7f7eb00d-7a38-4025-8853-9d1cf2dab1e3,7f7eb00d-7a38-4025-8853-9d1cf2dab1e3,1,0,36221881-a9c8-4b91-acac-44f7c065c05a,36221881-a9c8-4b91-acac-44f7c065c05a,1,0,3fdcf013-38e0-4a30-9ae8-19100e6704ba,3fdcf013-38e0-4a30-9ae8-19100e6704ba,1,0,876e31ff-ab7b-4ea4-b491-161963727dd1,876e31ff-ab7b-4ea4-b491-161963727dd1,1,0,bb43995b-68b4-41a1-8458-e10a2d8925f1,bb43995b-68b4-41a1-8458-e10a2d8925f1,1,0,61730dd9-fed7-43ce-8f38-724cac8f3d08,61730dd9-fed7-43ce-8f38-724cac8f3d08,1,0,e6a494b8-27e7-46a6-9435-7be6e150a69e,e6a494b8-27e7-46a6-9435-7be6e150a69e,1,0,133dc852-59d3-4351-934d-8845f8a38431,133dc852-59d3-4351-934d-8845f8a38431,1,0,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,1,0,b67914a8-d483-4bed-bd4d-a4aadd4998a4,b67914a8-d483-4bed-bd4d-a4aadd4998a4,1,0,707a8a49-fec5-454c-9e80-c3da829d395c,707a8a49-fec5-454c-9e80-c3da829d395c,1,0,b5ea4aff-11be-4232-94a2-cb92801b6c49,b5ea4aff-11be-4232-94a2-cb92801b6c49,1,0,6f630213-c16c-421c-a160-09e3c729ab26,6f630213-c16c-421c-a160-09e3c729ab26,1,0,878c638c-7c84-4914-896a-d4fdf0d759ef,878c638c-7c84-4914-896a-d4fdf0d759ef,1,0,6065653e-b7a9-4033-9617-f64430c57d89,6065653e-b7a9-4033-9617-f64430c57d89,1,0,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,1,0,00d1d85b-c258-4f10-9d13-a99375a29fc1,00d1d85b-c258-4f10-9d13-a99375a29fc1,1,0,f6d79449-eca9-4d13-9ddc-8b36ae9e729e,f6d79449-eca9-4d13-9ddc-8b36ae9e729e,1,0,b9d56dc6-3a10-4795-9ca3-dbf69310813e,b9d56dc6-3a10-4795-9ca3-dbf69310813e,1,0,f4b53ce1-8c1b-4f57-b5de-acb4692a37d8,f4b53ce1-8c1b-4f57-b5de-acb4692a37d8,1,0,9b18e04f-036d-43ae-b949-9432f96d71d9,9b18e04f-036d-43ae-b949-9432f96d71d9,1,0,e99a1f54-4001-45ee-81e3-472656c05f57,e99a1f54-4001-45ee-81e3-472656c05f57,1,0,b104e7b9-8a41-4154-a84b-d1bb12fab939,b104e7b9-8a41-4154-a84b-d1bb12fab939,1,0,86b835c4-341e-4b0d-99e5-2369684ff3f4,86b835c4-341e-4b0d-99e5-2369684ff3f4,1,0,55c48fa8-8d12-4378-97a0-c0ed683f6b83,55c48fa8-8d12-4378-97a0-c0ed683f6b83,1,0,b0f74a92-f5e4-4859-9a72-643ddb5315cb,b0f74a92-f5e4-4859-9a72-643ddb5315cb,1,0,1864093d-62ac-4b12-ad16-c460432c99f6,1864093d-62ac-4b12-ad16-c460432c99f6,1,0,6eb78c87-24ed-43a8-800d-ccde02358b32,6eb78c87-24ed-43a8-800d-ccde02358b32,1,0,787d5fec-c476-4519-884b-f62492fc8396,787d5fec-c476-4519-884b-f62492fc8396,1,0,59ebd5fb-d782-46ea-b693-7885d2ababa8,59ebd5fb-d782-46ea-b693-7885d2ababa8,1,0,39a39567-43d8-47c5-9f17-0a11f31e129a,39a39567-43d8-47c5-9f17-0a11f31e129a,1,0,b24e8ff0-eb86-4ce6-84f5-49134b48f031,b24e8ff0-eb86-4ce6-84f5-49134b48f031,1,0,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,1,0,e983f539-e369-491e-9cee-510518187870,e983f539-e369-491e-9cee-510518187870,1,0,876b23bf-2f48-4916-ad0f-4de8306e1864,876b23bf-2f48-4916-ad0f-4de8306e1864,1,0,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,1,0,e7c63a25-c804-4bc4-a6f1-81009dd889e2,e7c63a25-c804-4bc4-a6f1-81009dd889e2,1,0,e99a1b17-0e37-489a-bc39-3dd2e23b0861,e99a1b17-0e37-489a-bc39-3dd2e23b0861,1,0,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,1,0,4c1576c4-b327-4ec1-87bc-662c5aba343b,4c1576c4-b327-4ec1-87bc-662c5aba343b,1,0,70e710c5-42df-465f-a9c5-8345c87e1f19,70e710c5-42df-465f-a9c5-8345c87e1f19,1,0,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,1,0,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,1,0,4492ac73-eb91-41f8-98f1-54c2b3ad212a,4492ac73-eb91-41f8-98f1-54c2b3ad212a,1,0,869b43fb-968f-4fe0-b945-5030c90a38f2,869b43fb-968f-4fe0-b945-5030c90a38f2,1,0,af071a52-212b-4131-98e6-81f6048a70e6,af071a52-212b-4131-98e6-81f6048a70e6,1,0,37210dde-9a2f-475c-8341-578ac99f0e17,37210dde-9a2f-475c-8341-578ac99f0e17,1,0,e5094d4f-ee61-4142-a97b-d96172350f65,e5094d4f-ee61-4142-a97b-d96172350f65,1,0,3a8fffb6-a732-440c-afb9-d1c699ea53b6,3a8fffb6-a732-440c-afb9-d1c699ea53b6,1,0,b0650787-8ff5-4407-b491-bcdc2f61fd58,b0650787-8ff5-4407-b491-bcdc2f61fd58,1,0,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,1,0,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,1,0,9aadad98-69f5-41ce-ad1c-0afd8c610d86,9aadad98-69f5-41ce-ad1c-0afd8c610d86,1,0,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,1,0,3d662173-e19d-4077-9a08-8c8899226e24,3d662173-e19d-4077-9a08-8c8899226e24,1,0,69fd1e6e-7302-4ca8-8419-ec567ae66bef,69fd1e6e-7302-4ca8-8419-ec567ae66bef,1,0,0eee931a-57bb-4844-8e6e-eaca342640a0,0eee931a-57bb-4844-8e6e-eaca342640a0,1,0,20c57e30-5856-4801-9e77-8006471d89f8,20c57e30-5856-4801-9e77-8006471d89f8,1,0,64eff9f4-c57b-40a0-bd83-7e371fd010ce,64eff9f4-c57b-40a0-bd83-7e371fd010ce,1,0,4a3fe393-8aea-4394-8c10-a234f1f191ad,4a3fe393-8aea-4394-8c10-a234f1f191ad,1,0,6f9a3d00-d935-4fa6-9fd2-14700226daff,6f9a3d00-d935-4fa6-9fd2-14700226daff,1,0,d792831c-698d-40c6-96c2-dd0ae6f30707,d792831c-698d-40c6-96c2-dd0ae6f30707,1,0,a1d91c5f-1acd-4b46-887e-d06e7260dd20,a1d91c5f-1acd-4b46-887e-d06e7260dd20,1,0,3fd26019-c464-4c73-b18e-0888740b1747,3fd26019-c464-4c73-b18e-0888740b1747,1,0,a21989bd-a57f-4969-be3b-d8b39ead4145,a21989bd-a57f-4969-be3b-d8b39ead4145,1,0,c4aee120-cdbb-4b48-a1c7-99cccbafb120,c4aee120-cdbb-4b48-a1c7-99cccbafb120,1,0,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,1,0,a3667b25-7c18-446d-a318-685a4fe4bf89,a3667b25-7c18-446d-a318-685a4fe4bf89,1,0,fd271670-bde6-4351-abec-eb82548c6c98,fd271670-bde6-4351-abec-eb82548c6c98,1,0,498b012b-bb63-490e-8100-1d33dc84b400,498b012b-bb63-490e-8100-1d33dc84b400,1,0,8103f12c-ed50-4052-8117-33b6d11ef620,8103f12c-ed50-4052-8117-33b6d11ef620,1,0,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,1,0,799b3dda-fbfc-4dea-a577-30321e64f4d5,799b3dda-fbfc-4dea-a577-30321e64f4d5,1,0,7c7857b6-90e8-4b3f-9902-fd81bf68d133,7c7857b6-90e8-4b3f-9902-fd81bf68d133,1,0,617de19c-bf01-4900-832a-c169e9faeb79,617de19c-bf01-4900-832a-c169e9faeb79,1,0,70b73fd0-f5dc-411e-9bbb-10a538e8281b,70b73fd0-f5dc-411e-9bbb-10a538e8281b,1,0,758f44ad-54da-4f72-accf-0afecc4f4827,758f44ad-54da-4f72-accf-0afecc4f4827,1,0,05ee4a7c-63e6-4587-8be7-e206345e3471,05ee4a7c-63e6-4587-8be7-e206345e3471,1,0,98d5e98b-0382-4b28-a5d9-24392925664a,98d5e98b-0382-4b28-a5d9-24392925664a,1,0,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,1,0,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,1,0,19a18193-c5d3-4e56-86c5-5a81c525e9ad,19a18193-c5d3-4e56-86c5-5a81c525e9ad,1,0,c208fcc0-d7b2-435b-963a-e18c97727f8f,c208fcc0-d7b2-435b-963a-e18c97727f8f,1,0,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,1,0,bf11f7b1-6332-4499-ba48-b94bc10ef869,bf11f7b1-6332-4499-ba48-b94bc10ef869,1,0,4de445f0-7c27-4540-a5a8-9c3ca2a13fd2,4de445f0-7c27-4540-a5a8-9c3ca2a13fd2,1,0,2977fedd-2c56-4d21-8eb1-a424e1b17cb3,2977fedd-2c56-4d21-8eb1-a424e1b17cb3,1,0,0b8a2936-07c5-4b90-80e6-5a058e546de6,0b8a2936-07c5-4b90-80e6-5a058e546de6,1,0,34524248-668e-48e5-a801-f489cd664de8,34524248-668e-48e5-a801-f489cd664de8,1,0,ae0891ae-ecd2-4072-8d2b-0556030c9dfd,ae0891ae-ecd2-4072-8d2b-0556030c9dfd,1,0,e8f36bca-738b-471c-b8d3-8a484978934a,e8f36bca-738b-471c-b8d3-8a484978934a,1,0,05c27c89-2c26-4252-842d-9aa43ba0ea2f,05c27c89-2c26-4252-842d-9aa43ba0ea2f,1,0,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,1,0,f092729c-6b5d-4709-8b28-15e06129731d,f092729c-6b5d-4709-8b28-15e06129731d,1,0,c03be2f7-d681-417d-975a-5c8c7b716659,c03be2f7-d681-417d-975a-5c8c7b716659,1,0,fca7af5f-bdc0-4264-be68-5e5e38545368,fca7af5f-bdc0-4264-be68-5e5e38545368,1,0,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,1,0,ae124745-edfb-11e6-4681-a8667f21fde4,ae124745-edfb-11e6-4681-a8667f21fde4,1,0,f6fcf9c2-edfb-11e6-4681-a8667f21fde4,f6fcf9c2-edfb-11e6-4681-a8667f21fde4,1,0,ec70cf10-edfb-11e6-4681-a8667f21fde4,ec70cf10-edfb-11e6-4681-a8667f21fde4,1,0,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,1,0,0b7cee9b-3870-49f5-a58e-063cf5353467,0b7cee9b-3870-49f5-a58e-063cf5353467,1,0,d392a791-af74-40c9-ab20-6ed6aeabe864,d392a791-af74-40c9-ab20-6ed6aeabe864,1,0,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,1,0,1612570d-b069-405a-9dd3-80b8175fb468,1612570d-b069-405a-9dd3-80b8175fb468,1,0,3c429fe8-e663-4a58-817f-8f8382697dbb,3c429fe8-e663-4a58-817f-8f8382697dbb,1,0,c37be0c3-d2db-4e63-a8cb-7956a5396650,c37be0c3-d2db-4e63-a8cb-7956a5396650,1,0,83180e0d-fc4b-41ec-9a17-5af555a4776f,83180e0d-fc4b-41ec-9a17-5af555a4776f,1,0,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,1,0,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,1,0,561ed574-617d-4a46-b32b-f022e07846c8,561ed574-617d-4a46-b32b-f022e07846c8,1,0,cba706bf-a9a7-4dda-9c5a-a26e85119396,cba706bf-a9a7-4dda-9c5a-a26e85119396,1,0,159a4eb5-00cd-426c-86e3-09cd3f569f22,159a4eb5-00cd-426c-86e3-09cd3f569f22,1,0,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,1,0,3e8c6546-416c-4437-8c85-2cf591b4fc3f,3e8c6546-416c-4437-8c85-2cf591b4fc3f,1,0,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,1,0,9a0b27db-e4ac-496b-b6de-876b90381527,9a0b27db-e4ac-496b-b6de-876b90381527,1,0,2ded5135-b6c3-46dd-b563-7b6fab986d23,2ded5135-b6c3-46dd-b563-7b6fab986d23,1,0,14215720-ccb3-4e5a-8345-cd42c96a3e77,14215720-ccb3-4e5a-8345-cd42c96a3e77,1,0,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,1,0,0690a5c7-bc25-4101-afa5-69c095d415c2,0690a5c7-bc25-4101-afa5-69c095d415c2,1,0,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,1,0,79013bba-a0f2-481c-a63e-095a54ee52aa,79013bba-a0f2-481c-a63e-095a54ee52aa,1,0,8523c346-f144-41b8-a702-2d588e7097c2,8523c346-f144-41b8-a702-2d588e7097c2,1,0,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,1,0,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,1,0,fa2bd6a6-bb46-4e21-8684-248578310164,fa2bd6a6-bb46-4e21-8684-248578310164,1,0,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,1,0,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,1,0,88ccac36-169d-48f8-bc68-15e3bb775b79,88ccac36-169d-48f8-bc68-15e3bb775b79,1,0,a1640988-bd60-43b3-86f1-184b9db275c6,a1640988-bd60-43b3-86f1-184b9db275c6,1,0,300a02f7-8062-4843-b11e-0321f8b40f4d,300a02f7-8062-4843-b11e-0321f8b40f4d,1,0,c8015ae6-31a7-49f4-a9e6-5d13774f64e5,c8015ae6-31a7-49f4-a9e6-5d13774f64e5,1,0,970430c4-37fc-476c-a3f6-5f6bebd2e663,970430c4-37fc-476c-a3f6-5f6bebd2e663,1,0,4cddde4a-42d5-44d0-a693-ea90eab9b169,4cddde4a-42d5-44d0-a693-ea90eab9b169,1,0,d9d612bb-6d04-4186-b243-f99aded0ba43,d9d612bb-6d04-4186-b243-f99aded0ba43,1,0,15db8b7b-59f5-4551-b2bd-b24801f056b5,15db8b7b-59f5-4551-b2bd-b24801f056b5,1,0,88d2236b-794b-485a-b075-f1a54cadcd3a,88d2236b-794b-485a-b075-f1a54cadcd3a,1,0,b7f9553f-6219-4401-a6f4-9debd47186d2,b7f9553f-6219-4401-a6f4-9debd47186d2,1,0,26a7e044-a583-40af-9daa-5aea628c8f19,26a7e044-a583-40af-9daa-5aea628c8f19,1,0,548717ca-0645-49b4-9580-c77cd4d03ebb,548717ca-0645-49b4-9580-c77cd4d03ebb,1,0,b451f2fc-ced2-418a-a803-4fe99488b394,b451f2fc-ced2-418a-a803-4fe99488b394,1,0,62269222-67a7-489e-ba59-4294902275bc,62269222-67a7-489e-ba59-4294902275bc,1,0,fed1b714-a2c9-42cf-9ced-35ed895e4167,fed1b714-a2c9-42cf-9ced-35ed895e4167,1,0,6f334263-10c8-4187-9a84-d2fd1afadc48,6f334263-10c8-4187-9a84-d2fd1afadc48,1,0,f5674a0d-a106-4cc0-a402-b378280eab3d,f5674a0d-a106-4cc0-a402-b378280eab3d,1,0,fa99302b-3e86-4330-b9ff-c38d933f81f0,fa99302b-3e86-4330-b9ff-c38d933f81f0,1,0,fb9c08ee-92e9-4bd9-8794-ef0f221eee99,fb9c08ee-92e9-4bd9-8794-ef0f221eee99,1,0,e4cd44e6-1255-490f-96d9-f805ac92cf67,e4cd44e6-1255-490f-96d9-f805ac92cf67,1,0,8ae9be37-cda5-4b66-8a97-5e77d2a2c75f,8ae9be37-cda5-4b66-8a97-5e77d2a2c75f,1,0,5a9011fc-c023-47fb-a999-2c6ca33a04b9,5a9011fc-c023-47fb-a999-2c6ca33a04b9,1,0,ab574fa5-0730-4456-b741-111e5ea8a896,ab574fa5-0730-4456-b741-111e5ea8a896,1,0,b8d5adf0-dc2f-4041-bc97-cb2442f00054,b8d5adf0-dc2f-4041-bc97-cb2442f00054,1,0,398199c4-4830-48e9-89c5-45c2c5a30ee6,398199c4-4830-48e9-89c5-45c2c5a30ee6,1,0,546ba3bb-4614-423f-954c-466530f42784,546ba3bb-4614-423f-954c-466530f42784,1,0,e5bc54f0-d7d0-471c-adda-a0e73e0dd3cf,e5bc54f0-d7d0-471c-adda-a0e73e0dd3cf,1,0,af447f33-ef41-4eda-96ec-5bac26fff33e,af447f33-ef41-4eda-96ec-5bac26fff33e,1,0,f0c83fc5-6e9a-4185-ab43-2b419ace7909,f0c83fc5-6e9a-4185-ab43-2b419ace7909,1,0,4bd15718-6a0e-4a86-921a-09d38ba4be4c,4bd15718-6a0e-4a86-921a-09d38ba4be4c,1,0,32586ba6-8922-4321-b134-70d1b77a16a4,32586ba6-8922-4321-b134-70d1b77a16a4,1,0,a21cf522-d657-49ba-a198-01ff1de5e3f0,a21cf522-d657-49ba-a198-01ff1de5e3f0,1,0,4dc698da-8471-4b3f-816d-f1467cd2e5f1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,1,0,7ceb2f18-4dae-4b13-a5be-e949be165b4e,7ceb2f18-4dae-4b13-a5be-e949be165b4e,1,0,c4f94f6d-e33f-4226-bf47-c4b544098082,c4f94f6d-e33f-4226-bf47-c4b544098082,1,0,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,1,0,fc67b510-3fb4-4305-92d2-c252bc718f03,fc67b510-3fb4-4305-92d2-c252bc718f03,1,0,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,1,0,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,1,0,cf1f7915-94ad-47e7-8676-73271d0cf71e,cf1f7915-94ad-47e7-8676-73271d0cf71e,1,0,fceb6e4a-bd51-4193-a542-70d2317af669,fceb6e4a-bd51-4193-a542-70d2317af669,1,0,f9f991a6-ddf3-4953-8a1f-e6c0e1a7f4e9,f9f991a6-ddf3-4953-8a1f-e6c0e1a7f4e9,1,0,80847d57-1795-46c7-a106-926e1f43ac1e,80847d57-1795-46c7-a106-926e1f43ac1e,1,0,38685415-dc87-48b4-8cc4-f85b438f2ec2,38685415-dc87-48b4-8cc4-f85b438f2ec2,1,0,110eff8b-aeec-4ba5-b710-fefc1bd60284,110eff8b-aeec-4ba5-b710-fefc1bd60284,1,0,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,1,0,75eca481-002b-4046-898d-dfac9357611f,75eca481-002b-4046-898d-dfac9357611f,1,0,0110decc-d06e-43cf-9d01-30d412edcdd7,0110decc-d06e-43cf-9d01-30d412edcdd7,1,0,3ea32a24-d37b-4fad-937a-9d1357d649a9,3ea32a24-d37b-4fad-937a-9d1357d649a9,1,0,2856ee9a-0fea-4684-b7b8-4844773eae07,2856ee9a-0fea-4684-b7b8-4844773eae07,1,0,84e09840-8d67-416f-87a2-7f03c04180c9,84e09840-8d67-416f-87a2-7f03c04180c9,1,0,0388f22d-f91d-45c9-a8ae-900a24cbfe67,0388f22d-f91d-45c9-a8ae-900a24cbfe67,1,0,60fa2562-4914-46d6-a00a-1bb6e2803263,60fa2562-4914-46d6-a00a-1bb6e2803263,1,0,0d61a8d4-2dc8-435e-a238-416d7640576f,0d61a8d4-2dc8-435e-a238-416d7640576f,1,0,5ea899d4-e076-4a1c-838c-e369abc4705f,5ea899d4-e076-4a1c-838c-e369abc4705f,1,0,f2bf5f4a-e53b-4300-bbc7-97ac2e06f3c2,f2bf5f4a-e53b-4300-bbc7-97ac2e06f3c2,1,0,ab2e75f0-8da7-4b38-8f30-537424b719db,ab2e75f0-8da7-4b38-8f30-537424b719db,1,0,db344a42-61b8-4544-9aa1-8840ab8a70f0,db344a42-61b8-4544-9aa1-8840ab8a70f0,1,0,bd029e3f-a6bd-4be9-81f3-f3ea84f424ce,bd029e3f-a6bd-4be9-81f3-f3ea84f424ce,1,0,043bd776-5a7b-45ff-8b4a-5eed2bba0054,043bd776-5a7b-45ff-8b4a-5eed2bba0054,1,0,6a708860-e3b6-46ea-bea5-0d3e426c72f6,6a708860-e3b6-46ea-bea5-0d3e426c72f6,1,0,7c9e30d0-4a25-4d1d-a5ad-c48b231f453c,7c9e30d0-4a25-4d1d-a5ad-c48b231f453c,1,0,f53a3a46-edad-4cc0-8814-3755c2ea2c03,f53a3a46-edad-4cc0-8814-3755c2ea2c03,1,0,0a60b201-23f7-483b-ac16-5d270f32344e,0a60b201-23f7-483b-ac16-5d270f32344e,1,0,78058cd3-eb56-483c-96f5-1bf8883abc76,78058cd3-eb56-483c-96f5-1bf8883abc76,1,0,cd1fbfdd-d05e-4c22-aa04-83e9d36fb557,cd1fbfdd-d05e-4c22-aa04-83e9d36fb557,1,0,b67fb4f8-e895-4a8e-9230-31bc5cde4953,b67fb4f8-e895-4a8e-9230-31bc5cde4953,1,0,f3c9fde1-6d0e-4319-a798-ed8e330750de,f3c9fde1-6d0e-4319-a798-ed8e330750de,1,0,50d1bd75-3523-41c0-8da1-500731c0872b,50d1bd75-3523-41c0-8da1-500731c0872b,1,0,1a8d3872-6e19-4a49-b0ea-b120b6c09d7f,1a8d3872-6e19-4a49-b0ea-b120b6c09d7f,1,0,b8fe43d1-b9a7-4ec1-94bd-1e7fad424f8d,b8fe43d1-b9a7-4ec1-94bd-1e7fad424f8d,1,0,f64089ee-72dd-4fcf-8926-31e95c6fcf77,f64089ee-72dd-4fcf-8926-31e95c6fcf77,1,0,5d93aea8-3f41-4e77-bed5-4b2377cbfe0e,5d93aea8-3f41-4e77-bed5-4b2377cbfe0e,1,0,e1e151cc-7b8a-4125-804f-c902a522ed81,e1e151cc-7b8a-4125-804f-c902a522ed81,1,0,f475494e-fe94-4902-b2da-3ade01eba5bb,f475494e-fe94-4902-b2da-3ade01eba5bb,1,0,fbb814b2-cb2f-474d-9c96-5571cef3030e,fbb814b2-cb2f-474d-9c96-5571cef3030e,1,0,4e892154-3279-492c-9eae-124304225c5d,4e892154-3279-492c-9eae-124304225c5d,1,0,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,1,0,575a135a-6ffd-4ae8-a597-7e584df9bac4,575a135a-6ffd-4ae8-a597-7e584df9bac4,1,0,693a7196-f525-4bd2-a417-e902977f21cb,693a7196-f525-4bd2-a417-e902977f21cb,1,0,9bb39184-08b7-440e-a8f8-5caf0083ba0f,9bb39184-08b7-440e-a8f8-5caf0083ba0f,1,0,d48e817e-f6a4-47e5-a052-35d09e066490,d48e817e-f6a4-47e5-a052-35d09e066490,1,0,7bf36370-3761-4fd5-bea5-90fa142a9d57,7bf36370-3761-4fd5-bea5-90fa142a9d57,1,0,3b81427f-cf64-4a5e-adb3-5415d515fecd,3b81427f-cf64-4a5e-adb3-5415d515fecd,1,0,e9f2b604-7181-476d-8b34-3a544cbb353d,e9f2b604-7181-476d-8b34-3a544cbb353d,1,0,73773919-d01c-41dd-bb31-9c66648ac0ff,73773919-d01c-41dd-bb31-9c66648ac0ff,1,0,5d1afad0-3d7e-4214-b52a-72c184490084,5d1afad0-3d7e-4214-b52a-72c184490084,1,0,5f7901a1-f992-42fa-9ddb-d63574da3b56,5f7901a1-f992-42fa-9ddb-d63574da3b56,1,0,26abd45a-12b3-4312-88fb-53c90a6e6679,26abd45a-12b3-4312-88fb-53c90a6e6679,1,0,1541ad74-3e73-4699-bccf-c13313fbedfe,1541ad74-3e73-4699-bccf-c13313fbedfe,1,0,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1,0,1f03420b-0480-451a-9263-8431ff0b0c73,1f03420b-0480-451a-9263-8431ff0b0c73,1,0,2bf547e4-d295-4f69-9dbf-9a9d91b2db98,2bf547e4-d295-4f69-9dbf-9a9d91b2db98,1,0,46506a80-495e-4f06-a191-54ccf5d6cc3f,46506a80-495e-4f06-a191-54ccf5d6cc3f,1,0,b9788ea3-b910-4b5b-96c3-921d62745b6e,b9788ea3-b910-4b5b-96c3-921d62745b6e,1,0,0646de72-49fd-466d-af0f-843bfa527049,0646de72-49fd-466d-af0f-843bfa527049,1,0,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,1,0,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,1,0,be2b4dba-e77e-4947-bd2f-0710b357ca2a,be2b4dba-e77e-4947-bd2f-0710b357ca2a,1,0,df750e63-50fc-4085-b8b8-f05e4751ff51,df750e63-50fc-4085-b8b8-f05e4751ff51,1,0,86182e9a-89e0-40d7-b2d7-fcd92ee42942,86182e9a-89e0-40d7-b2d7-fcd92ee42942,1,0,091cb921-c7e3-4a5f-97b7-34e625159b9c,091cb921-c7e3-4a5f-97b7-34e625159b9c,1,0,f6118cdd-1dcd-464e-a49d-e95c69466750,f6118cdd-1dcd-464e-a49d-e95c69466750,1,0,39932897-959b-41a6-94ad-61426abfdbd9,39932897-959b-41a6-94ad-61426abfdbd9,1,0,c56ea6f3-1032-4b7a-a20e-e912196da1cd,c56ea6f3-1032-4b7a-a20e-e912196da1cd,1,0,b69b611d-18d3-4e78-8a09-f010bcf9c261,b69b611d-18d3-4e78-8a09-f010bcf9c261,1,0,e8e087c1-9131-4037-8562-8bce8c38f78c,e8e087c1-9131-4037-8562-8bce8c38f78c,1,0,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,1,0,6adaef8e-82b6-4664-9748-4f41b170d91a,6adaef8e-82b6-4664-9748-4f41b170d91a,1,0,20d655a7-788c-48bc-83ae-25003106bedb,20d655a7-788c-48bc-83ae-25003106bedb,1,0,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,1,0,68a72014-4b2e-4347-aaa7-54d95b8eb919,68a72014-4b2e-4347-aaa7-54d95b8eb919,1,0,379c9295-d0d5-418d-82f3-5ae19985cc53,379c9295-d0d5-418d-82f3-5ae19985cc53,1,0,25830f5b-27e2-4eff-9728-b21eb498727d,25830f5b-27e2-4eff-9728-b21eb498727d,1,0,af02f534-8508-4f9f-bcc1-0c6f3d696971,af02f534-8508-4f9f-bcc1-0c6f3d696971,1,0,dd345cfb-ea0c-4ea8-9b35-22547b000275,dd345cfb-ea0c-4ea8-9b35-22547b000275,1,0,a71d9c41-7510-4d38-90df-1034977b8f45,a71d9c41-7510-4d38-90df-1034977b8f45,1,0,86a871da-3725-43a1-a7c3-98acd187011b,86a871da-3725-43a1-a7c3-98acd187011b,1,0,2447cfeb-d877-4222-8ac2-b0026b85f932,2447cfeb-d877-4222-8ac2-b0026b85f932,1,0,fb94e9cb-1f27-42a6-a701-18bbe5888e70,fb94e9cb-1f27-42a6-a701-18bbe5888e70,1,0,2e26e32e-a0c6-4460-99de-865622202166,2e26e32e-a0c6-4460-99de-865622202166,1,0,c9489a6e-45af-4877-9788-158071571a0a,c9489a6e-45af-4877-9788-158071571a0a,1,0,23959912-f8fc-42bc-9ec2-1d520ebc5dad,23959912-f8fc-42bc-9ec2-1d520ebc5dad,1,0,4770398f-8013-4d43-93ce-ec1165e40c4e,4770398f-8013-4d43-93ce-ec1165e40c4e,1,0,9a706997-90cb-430d-972c-d2bad87c4a79,9a706997-90cb-430d-972c-d2bad87c4a79,1,0,6f661660-b9c4-41d4-99a8-e08006cfe9c8,6f661660-b9c4-41d4-99a8-e08006cfe9c8,1,0,199e79fa-54d6-4748-aaaa-9c55283582a3,199e79fa-54d6-4748-aaaa-9c55283582a3,1,0,5ef026c2-2ef4-45d6-9792-5ba0d298714b,5ef026c2-2ef4-45d6-9792-5ba0d298714b,1,0,45d61391-4cf7-4f45-8775-ada582c42400,45d61391-4cf7-4f45-8775-ada582c42400,1,0,78b2a913-2ab9-455d-85a3-504f0f468468,78b2a913-2ab9-455d-85a3-504f0f468468,1,0,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,1,0,560b5b12-4dee-4c69-ab6b-7680757a2797,560b5b12-4dee-4c69-ab6b-7680757a2797,1,0,3cfb1ce0-de42-4914-85c0-807d0c10f77e,3cfb1ce0-de42-4914-85c0-807d0c10f77e,1,0,a27244c2-ac65-423f-afce-42efd288a83d,a27244c2-ac65-423f-afce-42efd288a83d,1,0,d4002184-8e08-4dcc-9070-62f595e82e23,d4002184-8e08-4dcc-9070-62f595e82e23,1,0,62163fda-1a09-4d4f-b290-76ff324042ab,62163fda-1a09-4d4f-b290-76ff324042ab,1,0,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,1,0,6e6a1557-06fa-45c0-ad98-c43809553cd7,6e6a1557-06fa-45c0-ad98-c43809553cd7,1,0,179f7436-e328-42b8-9382-19ee6f10c768,179f7436-e328-42b8-9382-19ee6f10c768,1,0,2093344a-47d4-43ac-98df-29c4dff7fca9,2093344a-47d4-43ac-98df-29c4dff7fca9,1,0,3343cb0c-0f80-4ef9-9871-3db9f2299186,3343cb0c-0f80-4ef9-9871-3db9f2299186,1,0,791d7289-b188-4120-a5f5-f5eb1fd675bf,791d7289-b188-4120-a5f5-f5eb1fd675bf,1,0,e996d749-1aa5-4fe5-b87b-3d8d06144d93,e996d749-1aa5-4fe5-b87b-3d8d06144d93,1,0,6613153f-4f81-4bac-8144-7562cce67f55,6613153f-4f81-4bac-8144-7562cce67f55,1,0,488ce902-b60e-4255-8aec-92dafd1d5dd0,488ce902-b60e-4255-8aec-92dafd1d5dd0,1,0,411779cc-de2c-4731-acc0-631a01367eb5,411779cc-de2c-4731-acc0-631a01367eb5,1,0,30794af1-3180-4ed5-b11d-ca139acb22fa,30794af1-3180-4ed5-b11d-ca139acb22fa,1,0,39aeb27d-62d2-480a-aa6b-33e2363194d1,39aeb27d-62d2-480a-aa6b-33e2363194d1,1,0,60410722-dca9-4c3a-a9c4-33fcd45fe584,60410722-dca9-4c3a-a9c4-33fcd45fe584,1,0,3f200f5a-01bd-4304-9c57-18703cac9ec9,3f200f5a-01bd-4304-9c57-18703cac9ec9,1,0,aa89881f-f111-4384-911c-847b04bb56dd,aa89881f-f111-4384-911c-847b04bb56dd,1,0,444d9e3b-c702-4ad6-a929-a220eff0f6e7,444d9e3b-c702-4ad6-a929-a220eff0f6e7,1,0,022c4519-1cdb-45b6-a699-89fd6688999c,022c4519-1cdb-45b6-a699-89fd6688999c,1,0,fb5b79a2-caec-4c6e-a112-27e78a184d5e,fb5b79a2-caec-4c6e-a112-27e78a184d5e,1,0,fa523958-ce1e-42e1-ae00-2dcb401b7eda,fa523958-ce1e-42e1-ae00-2dcb401b7eda,1,0,1518bca2-a004-4566-8991-7c60e6745a49,1518bca2-a004-4566-8991-7c60e6745a49,1,0,ed8618e2-3ce6-4956-856a-9f40279b4da6,ed8618e2-3ce6-4956-856a-9f40279b4da6,1,0,733f6bc2-544d-4fac-bca8-11b981b95a03,733f6bc2-544d-4fac-bca8-11b981b95a03,1,0,3d140a17-40b4-46a7-a846-78f2f77d49f2,3d140a17-40b4-46a7-a846-78f2f77d49f2,1,0,965646a5-5e5b-49cd-864a-c3870844cfdb,965646a5-5e5b-49cd-864a-c3870844cfdb,1,0,27c88cf7-c0ed-44af-bb70-f14269ce1e87,27c88cf7-c0ed-44af-bb70-f14269ce1e87,1,0,0333cd9e-392d-40b2-869d-ad47119e0384,0333cd9e-392d-40b2-869d-ad47119e0384,1,0,82cc8820-0b92-4bb7-b097-7ac79e922f01,82cc8820-0b92-4bb7-b097-7ac79e922f01,1,0,25451a36-c842-44a5-94f4-7e540050b825,25451a36-c842-44a5-94f4-7e540050b825,1,0,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,1,0,f2267d6c-6972-4621-b677-87798056363b,f2267d6c-6972-4621-b677-87798056363b,1,0,243d201b-3714-4700-b410-c74c9093e6f6,243d201b-3714-4700-b410-c74c9093e6f6,1,0,e1e9862e-c87b-400f-bca1-b1380cb98ddc,e1e9862e-c87b-400f-bca1-b1380cb98ddc,1,0,de3cb50c-ef99-419e-b922-c6a453da6a5b,de3cb50c-ef99-419e-b922-c6a453da6a5b,1,0,d4ca4802-756a-494c-bab3-e77e0777a3fa,d4ca4802-756a-494c-bab3-e77e0777a3fa,1,0,134c1054-8d65-405f-ba3b-5beeca803a72,134c1054-8d65-405f-ba3b-5beeca803a72,1,0,cfa1669b-5310-4171-83fd-4dff3c6ac345,cfa1669b-5310-4171-83fd-4dff3c6ac345,1,0,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,1,0,aec7df6a-21a1-495d-b0a9-3769e1069888,aec7df6a-21a1-495d-b0a9-3769e1069888,1,0,463b98bf-b4d4-4edb-995d-0a75ff29b60d,463b98bf-b4d4-4edb-995d-0a75ff29b60d,1,0,317f88a7-12a4-4d21-b637-3050525406f4,317f88a7-12a4-4d21-b637-3050525406f4,1,0,2d9d2319-68fb-436d-b431-98858b88a75a,2d9d2319-68fb-436d-b431-98858b88a75a,1,0,0db78226-37d0-4016-b4c9-5134af1aabc7,0db78226-37d0-4016-b4c9-5134af1aabc7,1,0,8d6b4d23-a260-4352-9975-c13ce3e05220,8d6b4d23-a260-4352-9975-c13ce3e05220,1,0,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,1,0,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,1,0,6f5ac40b-ea22-47cf-acf2-614406669a72,6f5ac40b-ea22-47cf-acf2-614406669a72,1,0,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,1,0,488d2644-6fef-488a-af38-40f59c0e0d8c,488d2644-6fef-488a-af38-40f59c0e0d8c,1,0,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,1,0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,1,0,f1efef30-8651-4728-becd-abe3f9026a43,f1efef30-8651-4728-becd-abe3f9026a43,1,0,c2612e22-4f0d-4713-b4eb-decd9780d088,c2612e22-4f0d-4713-b4eb-decd9780d088,1,0,11b1410f-8e14-4b2f-8890-177f4875020e,11b1410f-8e14-4b2f-8890-177f4875020e,1,0,2276b2b0-1705-4014-956f-5087e9dd5c1e,2276b2b0-1705-4014-956f-5087e9dd5c1e,1,0,f72b9d4b-7196-45a3-9349-e32fc91e875a,f72b9d4b-7196-45a3-9349-e32fc91e875a,1,0,6c509dcc-4529-4ac3-86fe-26f807991b1c,6c509dcc-4529-4ac3-86fe-26f807991b1c,1,0,529c8887-f691-4ba8-aeaf-937858d61c30,529c8887-f691-4ba8-aeaf-937858d61c30,1,0,43435d30-8c25-4757-9a29-9173415959ff,43435d30-8c25-4757-9a29-9173415959ff,1,0,4aef5419-7cf5-4443-b773-9273c983844f,4aef5419-7cf5-4443-b773-9273c983844f,1,0,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,1,0,2bb5c23c-ad87-4b66-b766-d2e3f82715bd,2bb5c23c-ad87-4b66-b766-d2e3f82715bd,1,0,d01871bb-492e-4ab8-ada9-e9d8ec1adbce,d01871bb-492e-4ab8-ada9-e9d8ec1adbce,1,0,dd931c85-8c19-42a8-a39e-7af0c5bd346c,dd931c85-8c19-42a8-a39e-7af0c5bd346c,1,0,4fa153eb-1efb-43e5-ac09-e5431d4800df,4fa153eb-1efb-43e5-ac09-e5431d4800df,1,0,ada760f3-6a9f-4b81-afc1-98eb164af747,ada760f3-6a9f-4b81-afc1-98eb164af747,1,0,262dea64-4ccd-4b97-ac7e-ec1dbdd9ac98,262dea64-4ccd-4b97-ac7e-ec1dbdd9ac98,1,0,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,1,0,8e9f9baf-8d12-46cc-915f-f6f290af5512,8e9f9baf-8d12-46cc-915f-f6f290af5512,1,0,a8e14d2e-911d-4096-9027-deb7a08838e0,a8e14d2e-911d-4096-9027-deb7a08838e0,1,0,c51d8ae2-66fe-4052-8ee4-980855b1f90c,c51d8ae2-66fe-4052-8ee4-980855b1f90c,1,0,27610803-846f-40bd-b817-f73708f1fdb7,27610803-846f-40bd-b817-f73708f1fdb7,1,0,4e2a3873-0317-44be-8dbb-e4cefc0361a8,4e2a3873-0317-44be-8dbb-e4cefc0361a8,1,0,5808331f-9ab4-4a23-a592-1f65087f3214,5808331f-9ab4-4a23-a592-1f65087f3214,1,0,9316738d-3d38-4068-818e-a001355b19fb,9316738d-3d38-4068-818e-a001355b19fb,1,0,d86d766f-021a-4c11-b9e8-403af08918cc,d86d766f-021a-4c11-b9e8-403af08918cc,1,0,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,1,0,29200d04-d7da-435a-89e6-858c11a1a98c,29200d04-d7da-435a-89e6-858c11a1a98c,1,0,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,1,0,6c119ef2-d24b-4c3d-ad07-611bed89cab1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,1,0,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,1,0,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,1,0,27df6c22-85d7-4cb6-be19-82af76c84bf9,27df6c22-85d7-4cb6-be19-82af76c84bf9,1,0,d5b23aac-ea1c-497e-bed7-8685bb682e36,d5b23aac-ea1c-497e-bed7-8685bb682e36,1,0,2b37c085-7c70-4004-93d3-24418b7b3ef2,2b37c085-7c70-4004-93d3-24418b7b3ef2,1,0,6da15163-dd4c-4981-82e8-ad3bd2f516aa,6da15163-dd4c-4981-82e8-ad3bd2f516aa,1,0,e3000fff-aaba-4396-8026-768108ea8f2b,e3000fff-aaba-4396-8026-768108ea8f2b,1,0,1fc05949-c1ba-4363-8353-6902bc041021,1fc05949-c1ba-4363-8353-6902bc041021,1,0,d6e61d59-fe83-4a9e-aa15-e072a39fd8fd,d6e61d59-fe83-4a9e-aa15-e072a39fd8fd,1,0,614fc08c-78b6-4d49-9488-05fcf9b76d58,614fc08c-78b6-4d49-9488-05fcf9b76d58,1,0,d983cae8-edbb-4f26-9c0a-2f701cb11046,d983cae8-edbb-4f26-9c0a-2f701cb11046,1,0,40e2fb30-bb03-4178-a8eb-ddf48337ef23,40e2fb30-bb03-4178-a8eb-ddf48337ef23,1,0,1026fbcb-acd8-40dc-b638-6e02c6378c55,1026fbcb-acd8-40dc-b638-6e02c6378c55,1,0,dc9e2ba6-f4f1-493f-9054-cac633f239dd,dc9e2ba6-f4f1-493f-9054-cac633f239dd,1,0,7b95d0b1-c7b2-43b4-9119-320cb8912032,7b95d0b1-c7b2-43b4-9119-320cb8912032,1,0,004582b7-00aa-405e-8e24-ce76c945edae,004582b7-00aa-405e-8e24-ce76c945edae,1,0,97a9b005-a836-4308-8e63-0e00f6890baa,97a9b005-a836-4308-8e63-0e00f6890baa,1,0,98c34ada-0b78-41db-9183-6d7b9e466bde,98c34ada-0b78-41db-9183-6d7b9e466bde,1,0,fb688339-918e-40a1-8721-a26f3077973e,fb688339-918e-40a1-8721-a26f3077973e,1,0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1,0,b50f3157-3c3a-4553-a16a-7fcd660e2824,b50f3157-3c3a-4553-a16a-7fcd660e2824,1,0,19858faf-2bc5-4cfb-b258-cb101ab66e87,19858faf-2bc5-4cfb-b258-cb101ab66e87,1,0,f779f4a1-1fab-46d4-8043-ac25c247d361,f779f4a1-1fab-46d4-8043-ac25c247d361,1,0,308358bc-773a-43fa-adff-dcc5884a2bd4,308358bc-773a-43fa-adff-dcc5884a2bd4,1,0,ed541a1c-a842-40a9-b357-612db71ec32c,ed541a1c-a842-40a9-b357-612db71ec32c,1,0,b0e37495-7d9e-41d0-8225-652f9ac328cf,b0e37495-7d9e-41d0-8225-652f9ac328cf,1,0,3bd2e1c8-9ef3-449b-acf6-397b90669c49,3bd2e1c8-9ef3-449b-acf6-397b90669c49,1,0,cb334191-2ff3-439e-bdaf-4b8fe6561c3b,cb334191-2ff3-439e-bdaf-4b8fe6561c3b,1,0,f9865a2a-50e3-4f9c-a509-319be62dc468,f9865a2a-50e3-4f9c-a509-319be62dc468,1,0,5f3a30b0-1ba8-423c-9bc2-f9a87cafe818,5f3a30b0-1ba8-423c-9bc2-f9a87cafe818,1,0,766d8852-3bb4-4a6c-81c0-911722af4e8e,766d8852-3bb4-4a6c-81c0-911722af4e8e,1,0,f6dae699-06eb-41ef-878b-3fdfe1b1f213,f6dae699-06eb-41ef-878b-3fdfe1b1f213,1,0,fe6de86a-54c9-4ae2-9f17-cfce38b7b560,fe6de86a-54c9-4ae2-9f17-cfce38b7b560,1,0,911f8810-e96e-4f02-9377-47e49919f87e,911f8810-e96e-4f02-9377-47e49919f87e,1,0,cde46d6d-9f8a-45b6-98a7-9411030ccd72,cde46d6d-9f8a-45b6-98a7-9411030ccd72,1,0,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,1,0,224b9439-4b30-4b64-8edf-e7718ee90a7d,224b9439-4b30-4b64-8edf-e7718ee90a7d,1,0,74dc2374-daf1-4a8a-ba10-d3aced96af3b,74dc2374-daf1-4a8a-ba10-d3aced96af3b,1,0,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,1,0,e28e953f-93b3-4d4d-9ee4-c56df26037eb,e28e953f-93b3-4d4d-9ee4-c56df26037eb,1,0,578e0fd2-997c-437a-befc-33d128097a7e,578e0fd2-997c-437a-befc-33d128097a7e,1,0,14089231-31a8-4471-b85b-064836794ff3,14089231-31a8-4471-b85b-064836794ff3,1,0,014de276-fb2f-4deb-873f-475729be0f66,014de276-fb2f-4deb-873f-475729be0f66,1,0,40a60ff7-96ca-485b-a2d9-640a208a7de6,40a60ff7-96ca-485b-a2d9-640a208a7de6,1,0,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,1,0,ac028c56-b2a8-4a9b-a325-554c636f838e,ac028c56-b2a8-4a9b-a325-554c636f838e,1,0,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,1,0,f99e98ac-cd94-4989-8c02-ef8b323c6815,f99e98ac-cd94-4989-8c02-ef8b323c6815,1,0,e2562347-4549-4111-862e-86c20a6daade,e2562347-4549-4111-862e-86c20a6daade,1,0,b270fc64-15c6-41ed-ad09-44c833ca7c41,b270fc64-15c6-41ed-ad09-44c833ca7c41,1,0,4c3312fd-5613-4e9b-ae7c-572fa1887ded,4c3312fd-5613-4e9b-ae7c-572fa1887ded,1,0,6c8c9618-287a-41ab-890c-60250925ad52,6c8c9618-287a-41ab-890c-60250925ad52,1,0,55b9650e-098b-4d44-9fb5-d525b46f014b,55b9650e-098b-4d44-9fb5-d525b46f014b,1,0,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,1,0,bc55dc06-a769-40be-9c99-0794bdd2dbea,bc55dc06-a769-40be-9c99-0794bdd2dbea,1,0,feb5f490-e791-11e6-508c-a8667f21fde4,feb5f490-e791-11e6-508c-a8667f21fde4,1,0,7861e179-96d2-422f-a7c2-b38b59074956,7861e179-96d2-422f-a7c2-b38b59074956,1,0,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,1,0,6962f838-e792-11e6-508c-a8667f21fde4,6962f838-e792-11e6-508c-a8667f21fde4,1,0,3797b4c6-e336-4cbe-8d0b-0902e1247b42,3797b4c6-e336-4cbe-8d0b-0902e1247b42,1,0,67ebc493-d29a-4614-890a-feb8b5bd884b,67ebc493-d29a-4614-890a-feb8b5bd884b,1,0,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,1,0,dba6cb38-79c6-4060-87c5-a993548f36c4,dba6cb38-79c6-4060-87c5-a993548f36c4,1,0,6b44227a-e226-4bcb-8638-06b49f830669,6b44227a-e226-4bcb-8638-06b49f830669,1,0,f2406400-87e9-4df2-bcd3-8f1e3ad62088,f2406400-87e9-4df2-bcd3-8f1e3ad62088,1,0,4f2b6bf8-e792-11e6-508c-a8667f21fde4,4f2b6bf8-e792-11e6-508c-a8667f21fde4,1,0,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,1,0,a5623e87-3102-4521-b4ab-c41bf2403a1a,a5623e87-3102-4521-b4ab-c41bf2403a1a,1,0,599b1692-5f4e-42ef-ae1a-822ff527a415,599b1692-5f4e-42ef-ae1a-822ff527a415,1,0,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,1,0,4bb7372a-87a9-426e-b09f-fc0110455b10,4bb7372a-87a9-426e-b09f-fc0110455b10,1,0,ac853a0f-c185-4cdb-9f09-c921770937b5,ac853a0f-c185-4cdb-9f09-c921770937b5,1,0,920a7940-4d12-476d-a909-2231787839a9,920a7940-4d12-476d-a909-2231787839a9,1,0,168fce48-2413-45fc-ad21-9b465121d81b,168fce48-2413-45fc-ad21-9b465121d81b,1,0,d65c8992-aabc-4b67-9893-01862231ebe1,d65c8992-aabc-4b67-9893-01862231ebe1,1,0,23f70675-6a05-4b50-ad68-c55ddc93e857,23f70675-6a05-4b50-ad68-c55ddc93e857,1,0,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,1,0,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,1,0,3370d43e-8e97-4411-8123-2bb2bcf60a75,3370d43e-8e97-4411-8123-2bb2bcf60a75,1,0,d9d377c9-406f-4bc9-8076-1f049348b816,d9d377c9-406f-4bc9-8076-1f049348b816,1,0,dcfcb108-3761-43d9-ad2a-29633bd1ae47,dcfcb108-3761-43d9-ad2a-29633bd1ae47,1,0,bac41d45-249f-40b4-a013-008e261369c8,bac41d45-249f-40b4-a013-008e261369c8,1,0,84e34b4a-02e8-4676-8b81-771ddf3c2931,84e34b4a-02e8-4676-8b81-771ddf3c2931,1,0,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0aa6a024-66ae-4592-87d6-f7cb2a59f906,1,0,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,1,0,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,1,0,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,1,0,f71ac535-74a5-4001-a613-455a9e1bf734,f71ac535-74a5-4001-a613-455a9e1bf734,1,0,55a42b83-b6d2-409b-a8ff-7849b08e07ed,55a42b83-b6d2-409b-a8ff-7849b08e07ed,1,0,61889399-ecc2-442c-a790-a8b27a7a540c,61889399-ecc2-442c-a790-a8b27a7a540c,1,0,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,1,0,079ba95c-8293-47e2-b8bd-7acf73c2d880,079ba95c-8293-47e2-b8bd-7acf73c2d880,1,0,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,1,0,a5f264a8-a547-4653-abb1-eb1666d527dc,a5f264a8-a547-4653-abb1-eb1666d527dc,1,0,dabae379-6356-497a-aab5-cf102f16a72a,dabae379-6356-497a-aab5-cf102f16a72a,1,0,337370e0-1021-4887-9d38-6c3833c90a5b,337370e0-1021-4887-9d38-6c3833c90a5b,1,0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,1,0,d6f01f1c-801b-4776-ae11-48236103f76a,d6f01f1c-801b-4776-ae11-48236103f76a,1,0,b6fe68cf-657b-40e0-af2e-247607a86519,b6fe68cf-657b-40e0-af2e-247607a86519,1,0,9b0b8191-94b7-428f-be86-e9e4cd24a72f,9b0b8191-94b7-428f-be86-e9e4cd24a72f,1,0,a923dbcb-7146-4445-ad17-f4a32c16a837,a923dbcb-7146-4445-ad17-f4a32c16a837,1,0,41dec792-1d1a-4e06-a54b-a86193b98225,41dec792-1d1a-4e06-a54b-a86193b98225,1,0,52257beb-3e0c-4681-b430-9690398cd13a,52257beb-3e0c-4681-b430-9690398cd13a,1,0,135e637c-c28e-4547-8da2-d897dca54cb2,135e637c-c28e-4547-8da2-d897dca54cb2,1,0,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,1,0,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,1,0,a0be938b-139e-41bd-b067-f5241ff68c90,a0be938b-139e-41bd-b067-f5241ff68c90,1,0,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,1,0,5356543a-db9a-4265-b83f-31d45544c8e6,5356543a-db9a-4265-b83f-31d45544c8e6,1,0,857dd311-9c6d-4dba-82d8-283d7b05b09e,857dd311-9c6d-4dba-82d8-283d7b05b09e,1,0,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1,0,8064eb3a-d56c-4517-9db0-b7300149c7c4,8064eb3a-d56c-4517-9db0-b7300149c7c4,1,0,fe926c88-d792-4db3-abcf-3c94dfdcc407,fe926c88-d792-4db3-abcf-3c94dfdcc407,1,0,b1c3a6c1-5245-4a65-8a45-13948be6f6a1,b1c3a6c1-5245-4a65-8a45-13948be6f6a1,1,0,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,1,0,e0c51555-1614-4aa7-a075-c5e1251579ba,e0c51555-1614-4aa7-a075-c5e1251579ba,1,0,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,1,0,af88ea84-5742-4c9f-9a02-6d0f25186f72,af88ea84-5742-4c9f-9a02-6d0f25186f72,1,0,51363236-c8eb-4eb7-9692-5c18edc9a5a8,51363236-c8eb-4eb7-9692-5c18edc9a5a8,1,0,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,1,0,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,1,0,8adebe50-a946-40c2-9258-b17efe787e0e,8adebe50-a946-40c2-9258-b17efe787e0e,1,0,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,1,0,81ef02df-498d-4af0-8254-dc6730cbf140,81ef02df-498d-4af0-8254-dc6730cbf140,1,0,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,1,0,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,1,0,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1,0,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,1,0,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,1,0,d6b72e00-018a-4fdc-b6a4-06dcecf89809,d6b72e00-018a-4fdc-b6a4-06dcecf89809,1,0,9f816562-57f0-473f-8c85-14f7521ffd7f,9f816562-57f0-473f-8c85-14f7521ffd7f,1,0,14077038-2e41-4a05-a476-99f6f88a5c29,14077038-2e41-4a05-a476-99f6f88a5c29,1,0,917b0acc-88fe-4afc-b19b-6da69e060393,917b0acc-88fe-4afc-b19b-6da69e060393,1,0,a091b76e-8ba4-4534-bbb0-9990e69b8603,a091b76e-8ba4-4534-bbb0-9990e69b8603,1,0,867ee5d2-7566-4052-a311-b56e7e46b90d,867ee5d2-7566-4052-a311-b56e7e46b90d,1,0,8f51328b-73a8-46fb-b6db-7b7a84c05c2a,8f51328b-73a8-46fb-b6db-7b7a84c05c2a,1,0,0f0f5b42-2407-44e6-85d7-26ace96b2cd9,0f0f5b42-2407-44e6-85d7-26ace96b2cd9,1,0,ffec426d-2556-46d6-b313-aeca43581865,ffec426d-2556-46d6-b313-aeca43581865,1,0,f32e0941-2061-4e12-bdae-fcb65f91ac28,f32e0941-2061-4e12-bdae-fcb65f91ac28,1,0,6f0e0f44-db5a-4a13-9131-866b77b90f14,6f0e0f44-db5a-4a13-9131-866b77b90f14,1,0,9415e0aa-391f-4798-ad7d-3b854a756de8,9415e0aa-391f-4798-ad7d-3b854a756de8,1,0,f82d5bd6-4c74-4c23-978c-565aae3d752a,f82d5bd6-4c74-4c23-978c-565aae3d752a,1,0,7fba41a5-4faa-412b-b367-b30ced0314c0,7fba41a5-4faa-412b-b367-b30ced0314c0,1,0,37333d0b-3589-4b8b-bf6c-e605e0287b66,37333d0b-3589-4b8b-bf6c-e605e0287b66,1,0,1813c469-da20-46a6-8947-6815b66f64c1,1813c469-da20-46a6-8947-6815b66f64c1,1,0,64e702e9-8934-4356-a1b2-be0e8b390630,64e702e9-8934-4356-a1b2-be0e8b390630,1,0,74880ac4-bdd3-48e6-82a0-a2103da42723,74880ac4-bdd3-48e6-82a0-a2103da42723,1,0,ad083c26-7461-4e94-b524-0174242fbd91,ad083c26-7461-4e94-b524-0174242fbd91,1,0,5ce39370-f918-493f-bb24-53346b6fd836,5ce39370-f918-493f-bb24-53346b6fd836,1,0,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,1,0,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0e3d2750-bb4c-42b9-9829-60f1480ced9c,1,0,ddc6761c-a32a-41e1-b110-fdc39ad440d3,ddc6761c-a32a-41e1-b110-fdc39ad440d3,1,0,0b322ee2-b018-4d00-8f05-62ee16e519ff,0b322ee2-b018-4d00-8f05-62ee16e519ff,1,0,0866e282-055a-49bb-9aa5-b1af7c74c344,0866e282-055a-49bb-9aa5-b1af7c74c344,1,0,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,1,0,a76b1fd1-ba00-40e6-8756-f17fee449818,a76b1fd1-ba00-40e6-8756-f17fee449818,1,0,5c913626-48d1-4e0a-a423-64078ce59c7b,5c913626-48d1-4e0a-a423-64078ce59c7b,1,0,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,1,0,7b0ec304-1904-413e-a9c6-ff62e87107dd,7b0ec304-1904-413e-a9c6-ff62e87107dd,1,0,d4dd8c96-914d-496f-b735-ef85ec473605,d4dd8c96-914d-496f-b735-ef85ec473605,1,0,62517db4-59e6-4945-bcd6-b3f1845572bf,62517db4-59e6-4945-bcd6-b3f1845572bf,1,0,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,1,0,f0f72149-0e7f-441a-b70d-8f47d4977927,f0f72149-0e7f-441a-b70d-8f47d4977927,1,0,776efc3e-ac27-4550-bafd-6e91aa987af2,776efc3e-ac27-4550-bafd-6e91aa987af2,1,0,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,1,0,cc438366-85ea-48be-8b74-d05cddb1fc51,cc438366-85ea-48be-8b74-d05cddb1fc51,1,0,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,1,0,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,1,0,3271b800-1825-422f-97bb-757baf403e90,3271b800-1825-422f-97bb-757baf403e90,1,0,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,1,0,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,1,0,a040c756-4687-4bfd-a690-b122d3c490e5,a040c756-4687-4bfd-a690-b122d3c490e5,1,0,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,1,0,961a9801-3956-4ea0-b0d3-908f09bf4929,961a9801-3956-4ea0-b0d3-908f09bf4929,1,0,6fac5c14-e126-4342-9078-edf1d0efcbf2,6fac5c14-e126-4342-9078-edf1d0efcbf2,1,0,0a3325a1-21c4-4997-882f-4ac2edc175f0,0a3325a1-21c4-4997-882f-4ac2edc175f0,1,0,71102d3f-f020-4d6f-9582-9a7eefb4e797,71102d3f-f020-4d6f-9582-9a7eefb4e797,1,0,53ef6849-a3f3-4171-9167-f349f2d6a736,53ef6849-a3f3-4171-9167-f349f2d6a736,1,0,3f588bd3-d461-42b7-8ab1-386af6399d56,3f588bd3-d461-42b7-8ab1-386af6399d56,1,0,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,1,0,8c576405-29c1-46b1-ab2e-40e52c21cab0,8c576405-29c1-46b1-ab2e-40e52c21cab0,1,0,b33a89da-8589-4902-83fa-6545e5fce23e,b33a89da-8589-4902-83fa-6545e5fce23e,1,0,f0620d5a-e1fe-419f-af37-e0f462f97e8d,f0620d5a-e1fe-419f-af37-e0f462f97e8d,1,0,3e2f2ae1-c809-43fc-8276-b0a16a92858c,3e2f2ae1-c809-43fc-8276-b0a16a92858c,1,0,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,1,0,1a7c7427-bead-4655-9dd6-df6e722663c5,1a7c7427-bead-4655-9dd6-df6e722663c5,1,0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,1,0,fd96c8ab-602a-4735-b168-52b501e80351,fd96c8ab-602a-4735-b168-52b501e80351,1,0,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,1,0,370f0c75-d2c5-4be5-a633-4bcc77998ece,370f0c75-d2c5-4be5-a633-4bcc77998ece,1,0,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,1,0,2139532c-f6cb-4393-936e-cc912e5adca9,2139532c-f6cb-4393-936e-cc912e5adca9,1,0,755c3eca-4956-4a44-9b38-c11dae00b87f,755c3eca-4956-4a44-9b38-c11dae00b87f,1,0,f57c558c-2c94-4b9d-8697-448d0548ab1a,f57c558c-2c94-4b9d-8697-448d0548ab1a,1,0,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,1,0,c32db021-eca1-4b67-aa85-3d6e28c51b53,c32db021-eca1-4b67-aa85-3d6e28c51b53,1,0,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,1,0,02466dcf-02a1-4853-814f-a913a9baba45,02466dcf-02a1-4853-814f-a913a9baba45,1,0,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,1,0,62b75eb2-42e1-4484-a77f-b676dd36f3d4,62b75eb2-42e1-4484-a77f-b676dd36f3d4,1,0,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,1,0,856510ee-74f5-44e9-a3c0-1c60cfb7a787,856510ee-74f5-44e9-a3c0-1c60cfb7a787,1,0,28b761c6-c286-4125-a4ed-da602e49950f,28b761c6-c286-4125-a4ed-da602e49950f,1,0,4ac66a22-c736-4e06-a8aa-ef4a71788c65,4ac66a22-c736-4e06-a8aa-ef4a71788c65,1,0,9cfe9281-8840-4077-824d-a2c9cbb0b730,9cfe9281-8840-4077-824d-a2c9cbb0b730,1,0,76389fa9-b9e0-492e-9c93-24b5f3bf094c,76389fa9-b9e0-492e-9c93-24b5f3bf094c,1,0,23e3de37-9315-45e6-bbfd-60aae28c25ae,23e3de37-9315-45e6-bbfd-60aae28c25ae,1,0,a9957f43-8b6f-4d98-a2d8-77b78047494c,a9957f43-8b6f-4d98-a2d8-77b78047494c,1,0,e470e15d-1b06-43cb-a9f9-ba489e2f596f,e470e15d-1b06-43cb-a9f9-ba489e2f596f,1,0,0408002c-9255-43a2-8022-82f02ee0e8f4,0408002c-9255-43a2-8022-82f02ee0e8f4,1,0,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,1,0,1851afd4-5324-45c1-b754-54e65943f945,1851afd4-5324-45c1-b754-54e65943f945,1,0,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,1,0,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,1,0,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,1,0,c322dc4a-30f3-4d23-9824-4a01c496408d,c322dc4a-30f3-4d23-9824-4a01c496408d,1,0,dcff004c-1b61-4a19-b977-ea21bf688614,dcff004c-1b61-4a19-b977-ea21bf688614,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1} \ No newline at end of file +{6,1,1,34642432-d990-11eb-1994-0242ac110002,1,1d19c598-d990-11eb-038a-0242ac110002,"3.1.5.110","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",6459,1,0,d7e97d10-d98f-11eb-0c83-0242ac110002,d7e97d10-d98f-11eb-0c83-0242ac110002,1,0,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,1,0,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,1,0,7795348b-2f52-47f7-bf00-e11e5e795a43,7795348b-2f52-47f7-bf00-e11e5e795a43,1,0,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,1,0,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,1,0,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,1,0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,1,0,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,1,0,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,1,0,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,1,0,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,1,0,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,1,0,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,1,0,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,1,0,5b68d479-7880-44de-84e3-7f578b43f0dc,5b68d479-7880-44de-84e3-7f578b43f0dc,1,0,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,bf9ca98c-5c95-4cfb-9181-8c1d847f9fbb,1,0,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,4cbbdbaf-1f3a-46cd-8c42-28cdcfa32c06,1,0,b4629308-42de-4ce8-8591-cf0c2399a9a2,b4629308-42de-4ce8-8591-cf0c2399a9a2,1,0,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,1,0,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,1,0,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,1,0,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1,0,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,de7ed8f7-3c02-47e0-aea8-4747ac68a5d5,1,0,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,1,0,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,1,0,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,1,0,1983fe34-c984-4659-ba41-0e94504f8989,1983fe34-c984-4659-ba41-0e94504f8989,1,0,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,1,0,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,1,0,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,1,0,08a413ff-bebd-42e5-8ff3-2115746a0844,08a413ff-bebd-42e5-8ff3-2115746a0844,1,0,f24de2ea-fcda-4052-b90f-e9d84314c4f2,f24de2ea-fcda-4052-b90f-e9d84314c4f2,1,0,ff8ae395-c740-4a30-a048-0d57eef6267f,ff8ae395-c740-4a30-a048-0d57eef6267f,1,0,51d06532-f61a-4ed5-afaa-cc4563633e0c,51d06532-f61a-4ed5-afaa-cc4563633e0c,1,0,0e49d980-581b-459f-a4b0-024e8c97e4c0,0e49d980-581b-459f-a4b0-024e8c97e4c0,1,0,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,1,0,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,1,0,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,1,0,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,1,0,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,1,0,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,1,0,839e29b1-a0d2-40fa-9f3e-46e66b943358,839e29b1-a0d2-40fa-9f3e-46e66b943358,1,0,c56d2cc7-630a-441b-b23f-ba78c34849bd,c56d2cc7-630a-441b-b23f-ba78c34849bd,1,0,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,1,0,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,21d92c2f-6c78-43ce-b1f4-59d7845b5a91,1,0,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,1,0,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,1,0,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,2a4b10be-3cd7-4755-905f-7b4d02ff6a22,1,0,3cffb795-2a28-4beb-92f4-5813f5994022,3cffb795-2a28-4beb-92f4-5813f5994022,1,0,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,1,0,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,1,0,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,1,0,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,1,0,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,1,0,a379287d-1ce8-460d-a503-910e728e28f1,a379287d-1ce8-460d-a503-910e728e28f1,1,0,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,1,0,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,1,0,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,d8c58e53-b7b9-4426-bdfa-d0816adf8cc1,1,0,4009cb3a-6754-481f-911b-907558cea38a,4009cb3a-6754-481f-911b-907558cea38a,1,0,653a7fd8-91c7-49aa-aa63-45da087e0d0a,653a7fd8-91c7-49aa-aa63-45da087e0d0a,1,0,d7cf3981-cf63-4a21-868b-8175a7704a8f,d7cf3981-cf63-4a21-868b-8175a7704a8f,1,0,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0ae93712-74e8-41c7-8f2d-4dfc8983697d,1,0,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,1,0,64f548c8-c1fc-434e-b3ee-5be367ead1db,64f548c8-c1fc-434e-b3ee-5be367ead1db,1,0,cd592a5d-b184-4558-8a28-7079ccf28b89,cd592a5d-b184-4558-8a28-7079ccf28b89,1,0,2009c673-c1a5-45fc-8da2-a36c435085a6,2009c673-c1a5-45fc-8da2-a36c435085a6,1,0,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,1,0,5d16e042-3889-4851-86f1-bc43bf06ee88,5d16e042-3889-4851-86f1-bc43bf06ee88,1,0,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,1,0,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,1,0,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,e0d3efe0-a321-4790-ba5d-e549a91a3ec6,1,0,e39ecc8a-ce81-483d-85de-b0488c8b7749,e39ecc8a-ce81-483d-85de-b0488c8b7749,1,0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,8f3b124f-bf85-4307-8f0c-47be1fb5c8b0,1,0,e15c3525-3453-4b62-834e-7c69f9efea51,e15c3525-3453-4b62-834e-7c69f9efea51,1,0,1514eaff-faea-4d82-9465-d0d5292bb31d,1514eaff-faea-4d82-9465-d0d5292bb31d,1,0,6d39c6df-8cd4-47ad-9125-252b37d94575,6d39c6df-8cd4-47ad-9125-252b37d94575,1,0,bc89af7a-1971-4245-8d88-1a5a50c50a8b,bc89af7a-1971-4245-8d88-1a5a50c50a8b,1,0,ad73f3a3-1dad-4920-af41-bda2b947a2f7,ad73f3a3-1dad-4920-af41-bda2b947a2f7,1,0,98b67b5a-3550-4a64-9e07-07fcc9154c73,98b67b5a-3550-4a64-9e07-07fcc9154c73,1,0,fd930b50-4ada-4e7f-8bfd-ed9a7c4e8964,fd930b50-4ada-4e7f-8bfd-ed9a7c4e8964,1,0,ad7c6165-2e44-4808-a77a-526882cf5dea,ad7c6165-2e44-4808-a77a-526882cf5dea,1,0,fa2a9ef2-00a1-44f4-a82c-6c7288dd62dc,fa2a9ef2-00a1-44f4-a82c-6c7288dd62dc,1,0,b7e435a9-6107-4d02-a949-cff793462e31,b7e435a9-6107-4d02-a949-cff793462e31,1,0,f0cda8f5-56f5-423b-8c1c-7113433ebf25,f0cda8f5-56f5-423b-8c1c-7113433ebf25,1,0,1a220e88-428b-4d85-926d-e572bf19997c,1a220e88-428b-4d85-926d-e572bf19997c,1,0,ca0d938b-244e-421f-9fa4-320784b9f416,ca0d938b-244e-421f-9fa4-320784b9f416,1,0,a108b11d-a489-4684-84ea-d5377c7394de,a108b11d-a489-4684-84ea-d5377c7394de,1,0,289a2d84-2477-4177-a6ef-507e2cadeea2,289a2d84-2477-4177-a6ef-507e2cadeea2,1,0,1c877cee-d9b8-48dc-8d79-04d27bb522f7,1c877cee-d9b8-48dc-8d79-04d27bb522f7,1,0,dd911418-ee16-4413-bfe9-4a5a238d3ce1,dd911418-ee16-4413-bfe9-4a5a238d3ce1,1,0,61cd6eab-6bab-4382-986e-4c7fc44f369b,61cd6eab-6bab-4382-986e-4c7fc44f369b,1,0,757b547b-b79c-459a-a64a-eef19a09a38f,757b547b-b79c-459a-a64a-eef19a09a38f,1,0,3d428bdf-c41b-43ac-957e-2943406c832c,3d428bdf-c41b-43ac-957e-2943406c832c,1,0,85cbc0b7-6aa5-455b-abed-7bc659d9ad51,85cbc0b7-6aa5-455b-abed-7bc659d9ad51,1,0,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,950f8fd5-fefa-4bfb-97a0-38d77ae830dc,1,0,cbbe7903-842c-470e-a2d6-7928df8f13e9,cbbe7903-842c-470e-a2d6-7928df8f13e9,1,0,e02597c4-bf45-4bb6-931d-62d2244f6c58,e02597c4-bf45-4bb6-931d-62d2244f6c58,1,0,75561d71-4b06-40fc-8a46-ed5d33c80dea,75561d71-4b06-40fc-8a46-ed5d33c80dea,1,0,42544966-445d-41b8-b6a0-a52c64758232,42544966-445d-41b8-b6a0-a52c64758232,1,0,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,1,0,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,1,0,5578afd2-5aed-4164-8467-52a66f4773c4,5578afd2-5aed-4164-8467-52a66f4773c4,1,0,9eea8645-1ba7-4faf-9c29-868bf99964dd,9eea8645-1ba7-4faf-9c29-868bf99964dd,1,0,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,1,0,654523be-93d9-4faa-9a35-ce2fede13820,654523be-93d9-4faa-9a35-ce2fede13820,1,0,0c44fdea-7b81-45be-87f5-d64456a9d379,0c44fdea-7b81-45be-87f5-d64456a9d379,1,0,d9bad22e-4049-4371-86a3-1b00ae6215af,d9bad22e-4049-4371-86a3-1b00ae6215af,1,0,d09d6f21-cdd0-485e-bd2c-92092a1aefef,d09d6f21-cdd0-485e-bd2c-92092a1aefef,1,0,2fc92784-d7b0-4209-ba06-e54bed2f160f,2fc92784-d7b0-4209-ba06-e54bed2f160f,1,0,d5a5f53b-9cd5-4036-a379-31680cec3c24,d5a5f53b-9cd5-4036-a379-31680cec3c24,1,0,85e05ed7-25ed-4148-8247-86ff531ec48d,85e05ed7-25ed-4148-8247-86ff531ec48d,1,0,dcd34215-200c-4d3c-828c-4c3cd8b17a81,dcd34215-200c-4d3c-828c-4c3cd8b17a81,1,0,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,1,0,4a046c9b-98a0-4d4f-8e0b-b162d3c6bfc5,4a046c9b-98a0-4d4f-8e0b-b162d3c6bfc5,1,0,a4e4c91c-fd95-4369-98e3-51ffba79937b,a4e4c91c-fd95-4369-98e3-51ffba79937b,1,0,d343d4e4-d07f-48c3-9db1-774b0d6c1134,d343d4e4-d07f-48c3-9db1-774b0d6c1134,1,0,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,1,0,5797e28d-1318-4728-8b17-bcb78d85349a,5797e28d-1318-4728-8b17-bcb78d85349a,1,0,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,1,0,9f9e6146-17ce-4296-a89f-33dfe4d0468d,9f9e6146-17ce-4296-a89f-33dfe4d0468d,1,0,3cf15377-a5bb-4c37-9780-0dbff8d3d5bb,3cf15377-a5bb-4c37-9780-0dbff8d3d5bb,1,0,3aa020db-a811-4fb9-9ea9-00a3359fbb53,3aa020db-a811-4fb9-9ea9-00a3359fbb53,1,0,968588bb-ee60-4399-955a-3ec4228d3c40,968588bb-ee60-4399-955a-3ec4228d3c40,1,0,c90e64cf-f5d4-47b9-8243-7177ac42202e,c90e64cf-f5d4-47b9-8243-7177ac42202e,1,0,23dbb528-7ea8-44ae-a1f2-b7608118666e,23dbb528-7ea8-44ae-a1f2-b7608118666e,1,0,b9627855-6773-4a59-b7d3-f9e2e565cd9e,b9627855-6773-4a59-b7d3-f9e2e565cd9e,1,0,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,1,0,46692974-34aa-45e1-8fec-9b36064073cd,46692974-34aa-45e1-8fec-9b36064073cd,1,0,a6308250-2b1b-40ef-bd20-589d519e3c38,a6308250-2b1b-40ef-bd20-589d519e3c38,1,0,22eafd3b-dc42-4a99-89af-3cd5311dc29f,22eafd3b-dc42-4a99-89af-3cd5311dc29f,1,0,c67f671a-3c83-44f4-9c6a-e06667ac8da6,c67f671a-3c83-44f4-9c6a-e06667ac8da6,1,0,283ce432-3553-4de9-94a2-ca9a590437f5,283ce432-3553-4de9-94a2-ca9a590437f5,1,0,1fbd4cfa-58cb-41ea-920e-a39cfa6ad90c,1fbd4cfa-58cb-41ea-920e-a39cfa6ad90c,1,0,0da019ca-1fc7-4aff-8998-3ddcccf10872,0da019ca-1fc7-4aff-8998-3ddcccf10872,1,0,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,1,0,34b0e268-497d-44d4-b822-84909d0685aa,34b0e268-497d-44d4-b822-84909d0685aa,1,0,8961a859-2203-4678-ae1f-63e2474a787a,8961a859-2203-4678-ae1f-63e2474a787a,1,0,fe63db47-3ece-4518-b6a2-0b6499f60a61,fe63db47-3ece-4518-b6a2-0b6499f60a61,1,0,f6dd250e-75fd-47fc-abcb-79ea19ebd747,f6dd250e-75fd-47fc-abcb-79ea19ebd747,1,0,53c41e6c-89b0-4818-9832-02140373979b,53c41e6c-89b0-4818-9832-02140373979b,1,0,671afc3e-7589-49d8-95a5-1cf195c3b2f8,671afc3e-7589-49d8-95a5-1cf195c3b2f8,1,0,47accdc7-8fa0-4996-9305-c42b6ca12df9,47accdc7-8fa0-4996-9305-c42b6ca12df9,1,0,57e75b31-13b3-46fc-8ec4-7570ab0e9928,57e75b31-13b3-46fc-8ec4-7570ab0e9928,1,0,5abc496c-5745-4220-9fdc-bac092717871,5abc496c-5745-4220-9fdc-bac092717871,1,0,8ad81449-0b75-4775-a841-ca7fc7bf0d43,8ad81449-0b75-4775-a841-ca7fc7bf0d43,1,0,6b29b4b3-df0a-42f7-b89f-809ffbdacf02,6b29b4b3-df0a-42f7-b89f-809ffbdacf02,1,0,43d8dd53-df3e-407e-a3c1-5b893cc1976c,43d8dd53-df3e-407e-a3c1-5b893cc1976c,1,0,7741dfee-c4cc-454d-8e01-99ee82a78b5a,7741dfee-c4cc-454d-8e01-99ee82a78b5a,1,0,61e246f4-fe19-4377-8f69-fd1cb90e3f88,61e246f4-fe19-4377-8f69-fd1cb90e3f88,1,0,05c9e6c3-3e1c-4311-99ac-ec4d59a37205,05c9e6c3-3e1c-4311-99ac-ec4d59a37205,1,0,d437805b-42a9-439d-aef8-abbebe280b69,d437805b-42a9-439d-aef8-abbebe280b69,1,0,b33ccec0-a085-4e91-a26d-c262775d92e8,b33ccec0-a085-4e91-a26d-c262775d92e8,1,0,8adeeac2-d2d0-4d90-b7cb-c7871da477d5,8adeeac2-d2d0-4d90-b7cb-c7871da477d5,1,0,9e082d71-175a-4e80-8cca-6b538d3240eb,9e082d71-175a-4e80-8cca-6b538d3240eb,1,0,b8c4aff0-a36d-4be9-9a5e-b0873d83ff15,b8c4aff0-a36d-4be9-9a5e-b0873d83ff15,1,0,68704139-32bb-4b00-b439-147025d06a35,68704139-32bb-4b00-b439-147025d06a35,1,0,df80f175-7f2b-44f8-90d4-118e2e157356,df80f175-7f2b-44f8-90d4-118e2e157356,1,0,5a88f624-7b7e-43fe-8bc4-ae85d832a855,5a88f624-7b7e-43fe-8bc4-ae85d832a855,1,0,42e39ef7-268f-4053-b4e5-4bceab17d3e4,42e39ef7-268f-4053-b4e5-4bceab17d3e4,1,0,b49b47fb-d4dc-4efe-ad07-e8705d787e72,b49b47fb-d4dc-4efe-ad07-e8705d787e72,1,0,7df36398-7752-4f51-9978-1bcb4bcdd062,7df36398-7752-4f51-9978-1bcb4bcdd062,1,0,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,1,0,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,1,0,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,1,0,fce03f58-7f68-4d7c-a999-687667c1f03d,fce03f58-7f68-4d7c-a999-687667c1f03d,1,0,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,1,0,f4885af5-6ed6-40e8-81a5-0e9537f943d7,f4885af5-6ed6-40e8-81a5-0e9537f943d7,1,0,716302cc-ad47-4823-a81a-4c58857aa0a4,716302cc-ad47-4823-a81a-4c58857aa0a4,1,0,d0f3824e-ddfb-491d-8aea-e4e4806dc3ee,d0f3824e-ddfb-491d-8aea-e4e4806dc3ee,1,0,7cab0151-f86e-4ada-9ec6-e602749e34fc,7cab0151-f86e-4ada-9ec6-e602749e34fc,1,0,d9be359f-c5cb-4f3e-9ccd-61f38c6bbb26,d9be359f-c5cb-4f3e-9ccd-61f38c6bbb26,1,0,15b5979c-755b-480e-b00a-dcc95f62dfeb,15b5979c-755b-480e-b00a-dcc95f62dfeb,1,0,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,1,0,eb3cee83-57be-4a2a-a180-366c2f6454bc,eb3cee83-57be-4a2a-a180-366c2f6454bc,1,0,c78c1d9c-5c34-4636-bf2c-6cc410e95003,c78c1d9c-5c34-4636-bf2c-6cc410e95003,1,0,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,dcdf2b25-b024-4a89-b2c4-0a2ee43ef623,1,0,9200527c-b6b9-4962-9440-10449583e1e3,9200527c-b6b9-4962-9440-10449583e1e3,1,0,e8faa1a9-807a-4916-b3c5-76ba2199754c,e8faa1a9-807a-4916-b3c5-76ba2199754c,1,0,99b5c632-61fe-41f5-ac00-ea530633bf28,99b5c632-61fe-41f5-ac00-ea530633bf28,1,0,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,1,0,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,1,0,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,1,0,485911f7-a964-450d-82da-cab020836eb2,485911f7-a964-450d-82da-cab020836eb2,1,0,1960b036-b479-4f4f-80c5-23fc82474082,1960b036-b479-4f4f-80c5-23fc82474082,1,0,7707d7b0-bf30-4362-929a-a5de104266fc,7707d7b0-bf30-4362-929a-a5de104266fc,1,0,0da8a402-ea0f-488a-a087-77990e85a643,0da8a402-ea0f-488a-a087-77990e85a643,1,0,5e7ea635-f307-43cb-9aa7-2c99997b3c2d,5e7ea635-f307-43cb-9aa7-2c99997b3c2d,1,0,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,484003f5-a6df-48fb-a395-d0e0ebc8cc0d,1,0,cedd0b47-07cb-4dae-86b5-31d396b693c7,cedd0b47-07cb-4dae-86b5-31d396b693c7,1,0,8b4614aa-c769-49f4-a281-a0ffb101abf1,8b4614aa-c769-49f4-a281-a0ffb101abf1,1,0,c08391e1-c4e3-42aa-8738-061031d0cb75,c08391e1-c4e3-42aa-8738-061031d0cb75,1,0,ba06091b-b659-4d29-a971-81335cf4060a,ba06091b-b659-4d29-a971-81335cf4060a,1,0,7c376c72-409e-4b5f-a5b6-85b0a1c23f58,7c376c72-409e-4b5f-a5b6-85b0a1c23f58,1,0,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,b7a0d00f-fbf3-41fe-b72f-c17e163264f9,1,0,7bbd6fe8-c2fe-4ed2-abd7-2b3fc5b2f410,7bbd6fe8-c2fe-4ed2-abd7-2b3fc5b2f410,1,0,d61fa2fb-a035-469f-9ae1-b78ecd82c83d,d61fa2fb-a035-469f-9ae1-b78ecd82c83d,1,0,bf4c6723-e586-4643-9f03-9e672afea26f,bf4c6723-e586-4643-9f03-9e672afea26f,1,0,4c3a39e3-40ee-423b-91f0-14b60e045b40,4c3a39e3-40ee-423b-91f0-14b60e045b40,1,0,2f2875d7-7598-4ed5-8cc0-a1982ffb5377,2f2875d7-7598-4ed5-8cc0-a1982ffb5377,1,0,23204b0b-bf77-4f7c-9945-e73ad924ebb4,23204b0b-bf77-4f7c-9945-e73ad924ebb4,1,0,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,1,0,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,1,0,a54f2d41-a05e-4878-80c6-81ca2899fa4c,a54f2d41-a05e-4878-80c6-81ca2899fa4c,1,0,23a898d9-5bcb-4744-ab6c-97b17dc98f20,23a898d9-5bcb-4744-ab6c-97b17dc98f20,1,0,c83f7826-0fef-4a9b-8d36-dee5d93c7417,c83f7826-0fef-4a9b-8d36-dee5d93c7417,1,0,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,1,0,f8f56806-ed7e-4059-a0c8-940538c14c98,f8f56806-ed7e-4059-a0c8-940538c14c98,1,0,9ff9f92b-c509-48da-82ce-15b524a895d6,9ff9f92b-c509-48da-82ce-15b524a895d6,1,0,c8bf96c8-f359-4940-8e87-3d190371d6d3,c8bf96c8-f359-4940-8e87-3d190371d6d3,1,0,477f0b81-0eb1-4de1-8cb5-38f1e0823947,477f0b81-0eb1-4de1-8cb5-38f1e0823947,1,0,d914eaa9-ce85-4df7-a545-2d411ef915b0,d914eaa9-ce85-4df7-a545-2d411ef915b0,1,0,41881344-82b7-4904-9ab8-0207d9bcd0a9,41881344-82b7-4904-9ab8-0207d9bcd0a9,1,0,5c542a16-0f95-43be-85cd-bfd49b15f215,5c542a16-0f95-43be-85cd-bfd49b15f215,1,0,ef4d648f-4cac-4df9-9880-2aa13c422d10,ef4d648f-4cac-4df9-9880-2aa13c422d10,1,0,21032fa5-9426-40bd-91e4-ace1e4ceb013,21032fa5-9426-40bd-91e4-ace1e4ceb013,1,0,7185a8f8-48c4-43a9-b31f-102302b8f152,7185a8f8-48c4-43a9-b31f-102302b8f152,1,0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,1,0,27a80757-c0fd-40c7-ad24-4c819c1ba72b,27a80757-c0fd-40c7-ad24-4c819c1ba72b,1,0,c573a29f-4c39-402d-8af4-e0fff80877f8,c573a29f-4c39-402d-8af4-e0fff80877f8,1,0,7fce9e49-e558-4760-9d95-dde6ac6c1e78,7fce9e49-e558-4760-9d95-dde6ac6c1e78,1,0,e5aba4a3-6056-4ef3-827c-d74283175393,e5aba4a3-6056-4ef3-827c-d74283175393,1,0,edc731ba-532f-4fa1-81a8-58beb3b2dfb1,edc731ba-532f-4fa1-81a8-58beb3b2dfb1,1,0,63039e62-7314-42ff-bdc6-c251f38b3827,63039e62-7314-42ff-bdc6-c251f38b3827,1,0,8a4b7aab-b602-4581-8fa4-fab66791f701,8a4b7aab-b602-4581-8fa4-fab66791f701,1,0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,1,0,a2be2d7a-cca0-460f-a915-dadfb9cd588b,a2be2d7a-cca0-460f-a915-dadfb9cd588b,1,0,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,1,0,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,1,0,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,1,0,1f4408f5-460e-431b-9842-bc6875ccf0ae,1f4408f5-460e-431b-9842-bc6875ccf0ae,1,0,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,1,0,7bfc6163-a62f-45e8-9112-40a5d675ba4a,7bfc6163-a62f-45e8-9112-40a5d675ba4a,1,0,542ff510-0245-4a08-80ac-a9941c66ae93,542ff510-0245-4a08-80ac-a9941c66ae93,1,0,03297623-eaa2-4db0-bf1b-ce2076faf20a,03297623-eaa2-4db0-bf1b-ce2076faf20a,1,0,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,1,0,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,1,0,82a3802c-b6d6-4511-bd8b-eeec003afa33,82a3802c-b6d6-4511-bd8b-eeec003afa33,1,0,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,1,0,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,1,0,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,1,0,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,1,0,a755cb43-492d-4069-9b6a-29b92ebb5b0e,a755cb43-492d-4069-9b6a-29b92ebb5b0e,1,0,7f7598e5-ca54-487e-b95c-b18d330b034c,7f7598e5-ca54-487e-b95c-b18d330b034c,1,0,86d09107-f511-4148-b5d9-d97e92addfde,86d09107-f511-4148-b5d9-d97e92addfde,1,0,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,1,0,2120ad01-6bff-48bd-bad8-324e1301b112,2120ad01-6bff-48bd-bad8-324e1301b112,1,0,b9255acf-dc35-4225-8d3a-544e66b7334d,b9255acf-dc35-4225-8d3a-544e66b7334d,1,0,55b78834-3d90-4858-a6f7-e0368b1d8c41,55b78834-3d90-4858-a6f7-e0368b1d8c41,1,0,059b9a75-f53a-4518-a48a-afc72ab9ee36,059b9a75-f53a-4518-a48a-afc72ab9ee36,1,0,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,1,0,31e95872-97c7-49e3-bd1b-8df4de07014d,31e95872-97c7-49e3-bd1b-8df4de07014d,1,0,8b9be02b-cd1f-4231-a895-6c9be26348c2,8b9be02b-cd1f-4231-a895-6c9be26348c2,1,0,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,1,0,64e03321-33a4-424d-a101-90f1e0da4c2e,64e03321-33a4-424d-a101-90f1e0da4c2e,1,0,fa4f0b33-5253-4a5f-8121-feae3e1968a6,fa4f0b33-5253-4a5f-8121-feae3e1968a6,1,0,e0d21be2-91dc-4a04-9078-49420ddddcd5,e0d21be2-91dc-4a04-9078-49420ddddcd5,1,0,56c97764-7dba-42e0-8ba0-82712aca20e9,56c97764-7dba-42e0-8ba0-82712aca20e9,1,0,a1d80053-ef03-4c00-9fc9-266e61aeaffb,a1d80053-ef03-4c00-9fc9-266e61aeaffb,1,0,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,1,0,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,1,0,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,1,0,7f3c6269-ea41-492f-87b7-7eaaf712762e,7f3c6269-ea41-492f-87b7-7eaaf712762e,1,0,a5d037b0-c666-4179-9d6a-5f48c4a126a8,a5d037b0-c666-4179-9d6a-5f48c4a126a8,1,0,f0850411-4dee-4f1d-baec-7d6c96b10637,f0850411-4dee-4f1d-baec-7d6c96b10637,1,0,12f95031-b81f-4802-b2f3-6f70def90db0,12f95031-b81f-4802-b2f3-6f70def90db0,1,0,5732112a-f31d-41cd-9a7f-312a27395502,5732112a-f31d-41cd-9a7f-312a27395502,1,0,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,1,0,691f9902-6b95-4579-a3d9-3b2b5b548776,691f9902-6b95-4579-a3d9-3b2b5b548776,1,0,c7a8a88f-040a-47a6-8c93-7f3f01544760,c7a8a88f-040a-47a6-8c93-7f3f01544760,1,0,06fc381d-f27a-433c-95c3-e0981e01f22b,06fc381d-f27a-433c-95c3-e0981e01f22b,1,0,6d93ec4f-167a-4804-910b-988ee8aad78e,6d93ec4f-167a-4804-910b-988ee8aad78e,1,0,f646835e-61eb-4ebd-811e-dac5e70bd1b4,f646835e-61eb-4ebd-811e-dac5e70bd1b4,1,0,61b49c4c-3021-4868-834a-9137476ae169,61b49c4c-3021-4868-834a-9137476ae169,1,0,58911911-5192-45fe-87cf-c4a222a521a1,58911911-5192-45fe-87cf-c4a222a521a1,1,0,70067937-9f27-4442-b87b-6c4576ce1b78,70067937-9f27-4442-b87b-6c4576ce1b78,1,0,115d5d06-a2fc-453e-aab5-c869b6d5850b,115d5d06-a2fc-453e-aab5-c869b6d5850b,1,0,d33ca006-d81d-4ef8-8503-7878e81c599f,d33ca006-d81d-4ef8-8503-7878e81c599f,1,0,123bb339-b95e-44c3-b1e9-482dcaa6f297,123bb339-b95e-44c3-b1e9-482dcaa6f297,1,0,f4119605-beb3-46b6-b372-ecdb74f10a33,f4119605-beb3-46b6-b372-ecdb74f10a33,1,0,d2a2e332-a52c-4277-bd19-5ea8ef198469,d2a2e332-a52c-4277-bd19-5ea8ef198469,1,0,e440c594-14bb-4a6e-af53-a4519c7d5548,e440c594-14bb-4a6e-af53-a4519c7d5548,1,0,4165bdaa-8e27-40de-bcdc-0379c34e8868,4165bdaa-8e27-40de-bcdc-0379c34e8868,1,0,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,1,0,82b05859-4c4d-4d5a-a620-cc6aab10f527,82b05859-4c4d-4d5a-a620-cc6aab10f527,1,0,c5871658-94dd-4df4-9a3f-db5d245dd106,c5871658-94dd-4df4-9a3f-db5d245dd106,1,0,a3131bf3-88b1-431c-a01c-be6e26396f91,a3131bf3-88b1-431c-a01c-be6e26396f91,1,0,5c3edcbd-fb62-471c-b75b-f1a759956ebe,5c3edcbd-fb62-471c-b75b-f1a759956ebe,1,0,e606f8eb-952a-4abb-b1ae-4211204bed84,e606f8eb-952a-4abb-b1ae-4211204bed84,1,0,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,1,0,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1,0,b4deaebf-2c21-47d7-9436-10c94c94667c,b4deaebf-2c21-47d7-9436-10c94c94667c,1,0,2a12ce95-3214-4bd2-a0e6-c2af41875821,2a12ce95-3214-4bd2-a0e6-c2af41875821,1,0,bf05548c-babf-402b-b698-9a62e7c69add,bf05548c-babf-402b-b698-9a62e7c69add,1,0,f8295f29-2533-4013-981b-240f017d9f7c,f8295f29-2533-4013-981b-240f017d9f7c,1,0,538b316b-3876-4da6-8b97-ad8ef59de17d,538b316b-3876-4da6-8b97-ad8ef59de17d,1,0,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,1,0,ebc5f182-482b-4dec-9961-ce3a448abd0e,ebc5f182-482b-4dec-9961-ce3a448abd0e,1,0,83e618f5-1bf4-474a-9d65-389f1e4b16c3,83e618f5-1bf4-474a-9d65-389f1e4b16c3,1,0,1357512e-3ed3-455d-bc91-81db3b92f9fe,1357512e-3ed3-455d-bc91-81db3b92f9fe,1,0,82223d0f-41d9-45a6-9612-ae4d8408fa1b,82223d0f-41d9-45a6-9612-ae4d8408fa1b,1,0,3ee058a9-aff5-46f0-8928-8a417e7800d4,3ee058a9-aff5-46f0-8928-8a417e7800d4,1,0,c9a03f19-42bb-4e07-8ce8-1b954e431ada,c9a03f19-42bb-4e07-8ce8-1b954e431ada,1,0,ed4edc6f-048a-40d5-8f61-989895c95cf3,ed4edc6f-048a-40d5-8f61-989895c95cf3,1,0,73cc5fea-597f-4490-9c62-b175fdc38fd3,73cc5fea-597f-4490-9c62-b175fdc38fd3,1,0,c2049ace-3095-4dd7-9cc0-7721118451ad,c2049ace-3095-4dd7-9cc0-7721118451ad,1,0,9ea7a191-38bb-40cc-8025-d34a5ed17c7c,9ea7a191-38bb-40cc-8025-d34a5ed17c7c,1,0,dc17d8b6-d277-43eb-8823-71d440ae1e90,dc17d8b6-d277-43eb-8823-71d440ae1e90,1,0,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,1,0,15111bf5-5bf5-4486-aff0-20ded684b67f,15111bf5-5bf5-4486-aff0-20ded684b67f,1,0,2465986e-7519-4638-9f62-5f692bebeeac,2465986e-7519-4638-9f62-5f692bebeeac,1,0,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,1,0,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,1,0,022f99dd-e1b7-42a7-8141-a8c2e8628901,022f99dd-e1b7-42a7-8141-a8c2e8628901,1,0,cc770616-f6f6-4054-876c-f319b1f8c6cf,cc770616-f6f6-4054-876c-f319b1f8c6cf,1,0,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,3baffdec-a2cb-48c9-9c21-4fc469e81e3b,1,0,046e6f4f-3d92-4b20-b19f-fca608fa0f11,046e6f4f-3d92-4b20-b19f-fca608fa0f11,1,0,74bea66f-15bf-48de-9ff9-f9c35a8bf5cc,74bea66f-15bf-48de-9ff9-f9c35a8bf5cc,1,0,8486e623-1a54-4ad9-ab44-591b6a559bc3,8486e623-1a54-4ad9-ab44-591b6a559bc3,1,0,dce82d28-9a7b-4d4c-af13-90f459cf4af2,dce82d28-9a7b-4d4c-af13-90f459cf4af2,1,0,cb9f2231-49bb-4b14-a124-8996628afead,cb9f2231-49bb-4b14-a124-8996628afead,1,0,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,6fe9a455-7fef-4a1b-8109-57eafc17e2b6,1,0,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,1,0,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,1,0,2031ed38-6a8e-4ca7-aa97-449ee36ab7a3,2031ed38-6a8e-4ca7-aa97-449ee36ab7a3,1,0,896de79f-3c34-4436-a4e2-4dd4f45c3e20,896de79f-3c34-4436-a4e2-4dd4f45c3e20,1,0,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,1,0,e6c42b5d-57fd-42ce-a968-653620e797f6,e6c42b5d-57fd-42ce-a968-653620e797f6,1,0,724fb328-fec6-4afe-bc99-0ff0951b184b,724fb328-fec6-4afe-bc99-0ff0951b184b,1,0,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,7a0cdc94-9e53-4fcc-ac2f-97ad2ad939f5,1,0,f6259a3b-98f5-4649-8fd0-da0a0285f375,f6259a3b-98f5-4649-8fd0-da0a0285f375,1,0,c565bf25-c55e-4324-851a-cec497f5114a,c565bf25-c55e-4324-851a-cec497f5114a,1,0,db6679c4-a647-471a-9f90-40248eb18db9,db6679c4-a647-471a-9f90-40248eb18db9,1,0,455a1ca6-7212-43ac-b5a2-cf85dd2f9c14,455a1ca6-7212-43ac-b5a2-cf85dd2f9c14,1,0,e7c366f7-c8e3-4ffe-bc5e-ca8a4619ec11,e7c366f7-c8e3-4ffe-bc5e-ca8a4619ec11,1,0,2997e4da-d831-48e4-96e2-c29f9d077302,2997e4da-d831-48e4-96e2-c29f9d077302,1,0,30f59002-a23d-4eff-b84f-f280f11b220e,30f59002-a23d-4eff-b84f-f280f11b220e,1,0,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,1,0,5b0e250c-4d2d-4e37-ade1-593854610d3f,5b0e250c-4d2d-4e37-ade1-593854610d3f,1,0,14583452-805e-423d-be9a-e04683c7c46f,14583452-805e-423d-be9a-e04683c7c46f,1,0,148f63d5-23ad-4824-a24c-14d5a54c62d3,148f63d5-23ad-4824-a24c-14d5a54c62d3,1,0,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,1,0,d7376ea8-245a-4342-9a40-c729ca19f966,d7376ea8-245a-4342-9a40-c729ca19f966,1,0,eabfa8b7-fb65-43dd-9308-787f7cce88c9,eabfa8b7-fb65-43dd-9308-787f7cce88c9,1,0,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,4bf12710-aef2-43ec-b16f-9c6c9e8eb18d,1,0,b1e837ff-0edd-4525-b2e2-92cc7990e00e,b1e837ff-0edd-4525-b2e2-92cc7990e00e,1,0,30213cef-b2bc-4e6c-8094-74a61f28b2ed,30213cef-b2bc-4e6c-8094-74a61f28b2ed,1,0,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,037fd2f3-27f1-4d8f-a621-82fa5754e8c7,1,0,3fc1e50e-b9da-45f7-8e06-57ef6951ca40,3fc1e50e-b9da-45f7-8e06-57ef6951ca40,1,0,66d67f47-ccbb-4d58-aceb-af876f480750,66d67f47-ccbb-4d58-aceb-af876f480750,1,0,71871ca9-095d-4bde-ac80-1371f578cd51,71871ca9-095d-4bde-ac80-1371f578cd51,1,0,6aa8c1d6-9956-4a98-9992-b119ba5ba1c7,6aa8c1d6-9956-4a98-9992-b119ba5ba1c7,1,0,cafbea88-86f0-4a44-98f4-70d1837da452,cafbea88-86f0-4a44-98f4-70d1837da452,1,0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,1,0,ceb286e9-4e7c-49fa-a695-424073e0dffc,ceb286e9-4e7c-49fa-a695-424073e0dffc,1,0,727689c3-c0d8-496f-a47b-4f3243ad8974,727689c3-c0d8-496f-a47b-4f3243ad8974,1,0,ec7b492d-5d38-4f31-90e0-577ad181514e,ec7b492d-5d38-4f31-90e0-577ad181514e,1,0,d1771aec-ba78-4b5d-861a-9ac6d8627dea,d1771aec-ba78-4b5d-861a-9ac6d8627dea,1,0,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,1,0,07288e13-583c-4caf-983a-76c5d2ebf66f,07288e13-583c-4caf-983a-76c5d2ebf66f,1,0,2522fce4-d121-482b-a39d-0c1a842d315e,2522fce4-d121-482b-a39d-0c1a842d315e,1,0,4807629d-8421-4bd9-beb4-5b2940197958,4807629d-8421-4bd9-beb4-5b2940197958,1,0,b8d7bdc9-2778-4f36-a0d9-c43fce15eb3c,b8d7bdc9-2778-4f36-a0d9-c43fce15eb3c,1,0,4bad7c64-131a-42cb-9be7-d61f14f456d0,4bad7c64-131a-42cb-9be7-d61f14f456d0,1,0,d46e141b-7a10-4d65-971f-3a35f2114017,d46e141b-7a10-4d65-971f-3a35f2114017,1,0,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,1,0,0f325868-167b-43d5-b17a-eadc606a8f79,0f325868-167b-43d5-b17a-eadc606a8f79,1,0,51ea38c1-3005-4f4b-b813-91c8e2717683,51ea38c1-3005-4f4b-b813-91c8e2717683,1,0,766c7fb5-727e-4975-9ea1-3b0df4739620,766c7fb5-727e-4975-9ea1-3b0df4739620,1,0,ba59393c-c499-4999-91d4-b9e34d94db0e,ba59393c-c499-4999-91d4-b9e34d94db0e,1,0,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,626da0dd-d75b-4779-be1f-9b71d2f2d4e1,1,0,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1d4b7f71-6c72-4f41-a2ed-1f2fe2122c04,1,0,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,1,0,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,1,0,913743c3-9529-4c86-b056-93e954df7819,913743c3-9529-4c86-b056-93e954df7819,1,0,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,1,0,3b453f76-ab85-4c65-b008-7f8bf44c9631,3b453f76-ab85-4c65-b008-7f8bf44c9631,1,0,ba5574bd-53ca-413f-a245-272f468a80fb,ba5574bd-53ca-413f-a245-272f468a80fb,1,0,772e7011-0019-4edc-b673-b7151cf4fa6c,772e7011-0019-4edc-b673-b7151cf4fa6c,1,0,21ac47fa-12c2-43e2-9b57-afdf521d3485,21ac47fa-12c2-43e2-9b57-afdf521d3485,1,0,f58bffe7-4a02-4c4e-bfed-7895177a400c,f58bffe7-4a02-4c4e-bfed-7895177a400c,1,0,fe285122-2257-4fb2-ab7e-1683c31db1c6,fe285122-2257-4fb2-ab7e-1683c31db1c6,1,0,0facc6eb-a178-45ee-a6bc-4bf085d80453,0facc6eb-a178-45ee-a6bc-4bf085d80453,1,0,f74eef36-9441-4b6f-b21c-de9643832f9f,f74eef36-9441-4b6f-b21c-de9643832f9f,1,0,8d1c44d7-52f2-4089-9d77-2f03bf051455,8d1c44d7-52f2-4089-9d77-2f03bf051455,1,0,ac2e5217-aaeb-4b6f-b063-538c84f2da06,ac2e5217-aaeb-4b6f-b063-538c84f2da06,1,0,b5e73fbe-499c-4666-a482-0ef399c97c1e,b5e73fbe-499c-4666-a482-0ef399c97c1e,1,0,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,1,0,4ac77dea-3c2b-4566-8857-ba99f7b025c9,4ac77dea-3c2b-4566-8857-ba99f7b025c9,1,0,8e87da88-9fa8-4dd8-b904-622b763239f4,8e87da88-9fa8-4dd8-b904-622b763239f4,1,0,2a7f1ce3-2629-4860-886b-67c9f82eeb29,2a7f1ce3-2629-4860-886b-67c9f82eeb29,1,0,6b5720a8-0bcc-4196-934d-84db9d99ec27,6b5720a8-0bcc-4196-934d-84db9d99ec27,1,0,c0b3e3e9-20bc-42e1-a68f-646a958586d1,c0b3e3e9-20bc-42e1-a68f-646a958586d1,1,0,39496918-7d71-4960-ad8b-0028ae659266,39496918-7d71-4960-ad8b-0028ae659266,1,0,bdf2fd35-2000-45c2-9df6-65031ee0e4af,bdf2fd35-2000-45c2-9df6-65031ee0e4af,1,0,e91118e9-d054-41a1-bfe9-343179718f33,e91118e9-d054-41a1-bfe9-343179718f33,1,0,529cc5b5-835f-4e70-9232-a9649fdc7ae5,529cc5b5-835f-4e70-9232-a9649fdc7ae5,1,0,09fec67d-6e45-428c-b858-9ae20979676c,09fec67d-6e45-428c-b858-9ae20979676c,1,0,4875a235-bcc8-47eb-83e3-a66f0f690b97,4875a235-bcc8-47eb-83e3-a66f0f690b97,1,0,58ffc4d9-d711-4b68-905c-d2ac4f78b547,58ffc4d9-d711-4b68-905c-d2ac4f78b547,1,0,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,114ab2a1-f7c3-4453-a6cc-4c5a23c00cb5,1,0,93c347d8-66cb-406c-9ee6-b1962482893f,93c347d8-66cb-406c-9ee6-b1962482893f,1,0,cce593b4-6f7c-466d-892c-7fe89fcddf5d,cce593b4-6f7c-466d-892c-7fe89fcddf5d,1,0,94ab750f-46b4-427c-a7f2-4e94fb9b0678,94ab750f-46b4-427c-a7f2-4e94fb9b0678,1,0,397d9926-31a3-4c03-acb7-74478f9863e1,397d9926-31a3-4c03-acb7-74478f9863e1,1,0,264dd12a-b4c5-44bf-b3c0-ef9225505f76,264dd12a-b4c5-44bf-b3c0-ef9225505f76,1,0,90b8fdf3-3e42-442f-a002-6a28ad0edc99,90b8fdf3-3e42-442f-a002-6a28ad0edc99,1,0,330a176f-5b61-41f5-84bb-b99a9439c2a0,330a176f-5b61-41f5-84bb-b99a9439c2a0,1,0,042245ef-3a30-46fb-b3e3-6599d5426cbd,042245ef-3a30-46fb-b3e3-6599d5426cbd,1,0,d1ba8620-c0c9-4281-afa6-9c9962c338d3,d1ba8620-c0c9-4281-afa6-9c9962c338d3,1,0,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,1,0,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,1,0,4bdc1a18-f184-4f95-bda4-8f5c4b7c3aa1,4bdc1a18-f184-4f95-bda4-8f5c4b7c3aa1,1,0,60200fc6-252f-4eaf-88a2-d2cefa25061f,60200fc6-252f-4eaf-88a2-d2cefa25061f,1,0,0798a128-2f87-4173-99ae-115bb8b3a3b8,0798a128-2f87-4173-99ae-115bb8b3a3b8,1,0,697bd1de-bbef-4362-aa39-71f6008f4bd7,697bd1de-bbef-4362-aa39-71f6008f4bd7,1,0,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,1,0,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,1,0,89574884-bce2-406d-9961-d1656b306eb8,89574884-bce2-406d-9961-d1656b306eb8,1,0,3de28e34-3c1e-4e7f-a720-3418c8c9c496,3de28e34-3c1e-4e7f-a720-3418c8c9c496,1,0,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,1,0,dacb236e-42a5-47e5-b239-ff18ae48e21e,dacb236e-42a5-47e5-b239-ff18ae48e21e,1,0,5cdb6e71-fd20-461a-83db-d59ccdb5b366,5cdb6e71-fd20-461a-83db-d59ccdb5b366,1,0,388b8576-9ba4-460f-b71b-3d644663656a,388b8576-9ba4-460f-b71b-3d644663656a,1,0,d4d38827-fce6-4c39-a4b4-51c7d7edc475,d4d38827-fce6-4c39-a4b4-51c7d7edc475,1,0,2d40609d-b56f-4082-9a6f-8216817ebd24,2d40609d-b56f-4082-9a6f-8216817ebd24,1,0,62629f36-5d1e-460f-9ac5-983607c40cb2,62629f36-5d1e-460f-9ac5-983607c40cb2,1,0,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,1,0,732b19c8-4f22-4748-a796-71538e46fc2f,732b19c8-4f22-4748-a796-71538e46fc2f,1,0,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,1,0,4b07cdb0-c32e-4751-b317-bee62b43f128,4b07cdb0-c32e-4751-b317-bee62b43f128,1,0,74f02619-7fa8-4c6d-81d6-230156ee45f4,74f02619-7fa8-4c6d-81d6-230156ee45f4,1,0,32cab8f2-cebf-4508-9396-eb41f4e8ba22,32cab8f2-cebf-4508-9396-eb41f4e8ba22,1,0,62ef3558-5ad3-44ab-8578-1acbbfa54135,62ef3558-5ad3-44ab-8578-1acbbfa54135,1,0,a103cca0-8243-40e9-bcdd-97a1cc8a3943,a103cca0-8243-40e9-bcdd-97a1cc8a3943,1,0,c3572d8d-46ff-40bb-800c-2c07f884c219,c3572d8d-46ff-40bb-800c-2c07f884c219,1,0,80fd89d7-160d-4528-9aa0-05b8dac64b4c,80fd89d7-160d-4528-9aa0-05b8dac64b4c,1,0,d1034240-ab06-413a-9828-a5c7dc879680,d1034240-ab06-413a-9828-a5c7dc879680,1,0,b77edd78-2fad-4926-a74f-02f2135356e6,b77edd78-2fad-4926-a74f-02f2135356e6,1,0,57b0b6b2-bbdd-48d2-a52e-e3495e00860e,57b0b6b2-bbdd-48d2-a52e-e3495e00860e,1,0,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,1,0,da551cf6-4f86-4e37-8967-a84c80e1fb13,da551cf6-4f86-4e37-8967-a84c80e1fb13,1,0,4f4916dc-b6fe-4f99-9220-bd7c076408ae,4f4916dc-b6fe-4f99-9220-bd7c076408ae,1,0,857daa3a-0058-4464-9173-13a2926812e2,857daa3a-0058-4464-9173-13a2926812e2,1,0,5fb2c120-fd14-4e78-a35f-c8e9478b3235,5fb2c120-fd14-4e78-a35f-c8e9478b3235,1,0,9d514ce1-f9bd-4018-8107-545cdd372fbd,9d514ce1-f9bd-4018-8107-545cdd372fbd,1,0,fe6b732f-3a33-460f-9686-cffdd5f7d99b,fe6b732f-3a33-460f-9686-cffdd5f7d99b,1,0,06250212-aeb1-4cb8-8785-ea71b1dad848,06250212-aeb1-4cb8-8785-ea71b1dad848,1,0,0c068a61-e5e6-4475-96fa-b7c1d825da42,0c068a61-e5e6-4475-96fa-b7c1d825da42,1,0,1047e34d-397a-42cc-80e6-1be755bd6462,1047e34d-397a-42cc-80e6-1be755bd6462,1,0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1cd473c3-4e36-47a9-b466-73d86ec244b0,1,0,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,1,0,b406b5f9-eeaf-43a0-8930-067554d783c9,b406b5f9-eeaf-43a0-8930-067554d783c9,1,0,47718840-2939-4e30-a72c-a20c88ac4c17,47718840-2939-4e30-a72c-a20c88ac4c17,1,0,58a38994-9fe4-4783-967d-79d1141b90f3,58a38994-9fe4-4783-967d-79d1141b90f3,1,0,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,1,0,7c2e35a8-d05d-4e52-baee-a1e13585c502,7c2e35a8-d05d-4e52-baee-a1e13585c502,1,0,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,1,0,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,2cea7641-6f1d-4bc7-9d38-8d99f196e0f5,1,0,0093680b-c8bc-472d-8b0d-2e6565fc6c22,0093680b-c8bc-472d-8b0d-2e6565fc6c22,1,0,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,7fa6a20a-26e2-41ad-be66-a43b50d0bbcd,1,0,5f4456d6-ff0c-425e-9603-c099492d7a6f,5f4456d6-ff0c-425e-9603-c099492d7a6f,1,0,af7c417e-5c10-4146-bde1-40db86c5806f,af7c417e-5c10-4146-bde1-40db86c5806f,1,0,ab5b0155-a4b1-47a1-ad87-12365dde20c1,ab5b0155-a4b1-47a1-ad87-12365dde20c1,1,0,90f3f3c5-4ca9-4c8f-9b73-f67760a6d2f0,90f3f3c5-4ca9-4c8f-9b73-f67760a6d2f0,1,0,f551f78a-2f05-4932-ac33-cfa1b077f46f,f551f78a-2f05-4932-ac33-cfa1b077f46f,1,0,a96091a7-d3a5-4893-8440-f360231bf468,a96091a7-d3a5-4893-8440-f360231bf468,1,0,9ce6eef0-5280-4374-9714-474ac571e4e2,9ce6eef0-5280-4374-9714-474ac571e4e2,1,0,6f21c34c-26aa-493d-aa08-2d4366b4064a,6f21c34c-26aa-493d-aa08-2d4366b4064a,1,0,0f55650a-2422-42a9-8258-61df4c17f1ef,0f55650a-2422-42a9-8258-61df4c17f1ef,1,0,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,2ef4ea1d-fd86-4ef3-a7e0-73abba89474d,1,0,3eaece9d-c9be-4b0b-a6f6-a3932274b806,3eaece9d-c9be-4b0b-a6f6-a3932274b806,1,0,5d9427ec-981d-4fb5-878b-8dba0d3a5536,5d9427ec-981d-4fb5-878b-8dba0d3a5536,1,0,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,c5dd6184-96e5-4abc-8c1e-5270e6547ee5,1,0,a0047712-5769-495d-97af-20d06751a5b4,a0047712-5769-495d-97af-20d06751a5b4,1,0,e729c3c6-16e5-405b-99b1-a88022300c6d,e729c3c6-16e5-405b-99b1-a88022300c6d,1,0,9c089520-8233-42f6-8eee-9839ac708c6f,9c089520-8233-42f6-8eee-9839ac708c6f,1,0,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,24f2cfc7-6dc0-400c-8eb2-106ca2ea7034,1,0,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,5f3ffa44-49be-4da5-ab2a-a35c9bd76dee,1,0,89055896-49dd-4cfd-ab78-8ac3698e12d5,89055896-49dd-4cfd-ab78-8ac3698e12d5,1,0,277ca641-e869-4fcd-8a79-54c451efbbdd,277ca641-e869-4fcd-8a79-54c451efbbdd,1,0,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,1,0,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,1,0,672c4741-6d7b-4d3e-baa7-389bef0625d7,672c4741-6d7b-4d3e-baa7-389bef0625d7,1,0,04398ec0-1c13-43f8-8f5d-7b7619592a4d,04398ec0-1c13-43f8-8f5d-7b7619592a4d,1,0,ce463861-92df-47f2-bd0f-4a2dbf72aacc,ce463861-92df-47f2-bd0f-4a2dbf72aacc,1,0,1220ce92-b964-4fb8-9db0-b4c8c6bdbdf7,1220ce92-b964-4fb8-9db0-b4c8c6bdbdf7,1,0,eca79a64-3d00-4178-b4eb-cf5468622c96,eca79a64-3d00-4178-b4eb-cf5468622c96,1,0,1487d68c-7a2f-48cf-8c80-4074072ed52c,1487d68c-7a2f-48cf-8c80-4074072ed52c,1,0,57502594-74dd-45fe-9234-9a477d5b9741,57502594-74dd-45fe-9234-9a477d5b9741,1,0,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,6ed8c74c-6b6e-4ed1-95ff-a733f618b213,1,0,d97c6536-fd62-4c9a-b83e-490a29a0721b,d97c6536-fd62-4c9a-b83e-490a29a0721b,1,0,93ec2af7-2ca8-4133-8cc0-31073f9bf216,93ec2af7-2ca8-4133-8cc0-31073f9bf216,1,0,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,1,0,681b27ac-69a5-4c5b-b2c7-285330fe5a4a,681b27ac-69a5-4c5b-b2c7-285330fe5a4a,1,0,6dc4c216-e49f-4833-b45f-6060b67995ef,6dc4c216-e49f-4833-b45f-6060b67995ef,1,0,0753701c-016e-4385-85c0-a485ca50efdc,0753701c-016e-4385-85c0-a485ca50efdc,1,0,c3a6b470-37d5-4499-badb-33b73b52e346,c3a6b470-37d5-4499-badb-33b73b52e346,1,0,24415097-bde5-447a-ac74-bd9bf0eb19fc,24415097-bde5-447a-ac74-bd9bf0eb19fc,1,0,a29d42d6-a448-4940-804d-d1be31da000d,a29d42d6-a448-4940-804d-d1be31da000d,1,0,dd780b76-2a10-40b5-9bcd-7bc8c9b06651,dd780b76-2a10-40b5-9bcd-7bc8c9b06651,1,0,8be6c4a3-d75b-405d-8d98-9baf6f20abb2,8be6c4a3-d75b-405d-8d98-9baf6f20abb2,1,0,7cbd82e3-4bf8-46ab-8504-4bf30523fa2a,7cbd82e3-4bf8-46ab-8504-4bf30523fa2a,1,0,c4b01e52-4136-460d-bd82-970177f1e256,c4b01e52-4136-460d-bd82-970177f1e256,1,0,9533784b-311a-4dbe-b73e-7348aabd387e,9533784b-311a-4dbe-b73e-7348aabd387e,1,0,56bdc69a-d8e8-4da6-a3a5-41ef32bbb626,56bdc69a-d8e8-4da6-a3a5-41ef32bbb626,1,0,67b04258-04cc-4d85-9bd0-0862a104a5c9,67b04258-04cc-4d85-9bd0-0862a104a5c9,1,0,c770cd75-f370-4042-9a5a-82b2fc1853cc,c770cd75-f370-4042-9a5a-82b2fc1853cc,1,0,6ee215f9-20ab-4c48-b2c2-cb1869e8906c,6ee215f9-20ab-4c48-b2c2-cb1869e8906c,1,0,b74af9c1-bc44-40ce-b093-d1f548a1742f,b74af9c1-bc44-40ce-b093-d1f548a1742f,1,0,1b401a14-4581-4f24-aaca-5f204f8fcf8b,1b401a14-4581-4f24-aaca-5f204f8fcf8b,1,0,267f7ee6-7b02-4e48-aa1e-145f586edd87,267f7ee6-7b02-4e48-aa1e-145f586edd87,1,0,e1e8ea42-6886-430a-bc59-249259112e6a,e1e8ea42-6886-430a-bc59-249259112e6a,1,0,1e27f3cd-1c9e-4f9f-b2ff-88fb1da37e11,1e27f3cd-1c9e-4f9f-b2ff-88fb1da37e11,1,0,3dcf815c-5c9a-4a78-a42e-7c9ff6faaeb8,3dcf815c-5c9a-4a78-a42e-7c9ff6faaeb8,1,0,1379f050-4f1c-4c41-993e-f7efc71325fb,1379f050-4f1c-4c41-993e-f7efc71325fb,1,0,4655fa12-9169-4d08-bdab-9b3174d0b223,4655fa12-9169-4d08-bdab-9b3174d0b223,1,0,753c70c1-af12-4ec2-ac12-dd1ce33f729f,753c70c1-af12-4ec2-ac12-dd1ce33f729f,1,0,6c07ddfb-8823-4953-9905-9550b847dc3f,6c07ddfb-8823-4953-9905-9550b847dc3f,1,0,2362a8d5-dca2-4527-acc0-63782377f28a,2362a8d5-dca2-4527-acc0-63782377f28a,1,0,dfd6d85c-a734-4458-83b0-87b5949f9c68,dfd6d85c-a734-4458-83b0-87b5949f9c68,1,0,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,1,0,79b6ecf5-8a6b-44a4-9587-5f8764463228,79b6ecf5-8a6b-44a4-9587-5f8764463228,1,0,cd49148c-e385-4b75-a758-a93196e73dba,cd49148c-e385-4b75-a758-a93196e73dba,1,0,ece15c4e-4a4b-421b-9f00-10f698da476b,ece15c4e-4a4b-421b-9f00-10f698da476b,1,0,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,1,0,300ecdd6-144f-48c8-9fd4-6166f1de1047,300ecdd6-144f-48c8-9fd4-6166f1de1047,1,0,b6bbfb59-8249-47af-9394-be262f118811,b6bbfb59-8249-47af-9394-be262f118811,1,0,999df397-a730-4110-b253-59fd5583dab9,999df397-a730-4110-b253-59fd5583dab9,1,0,7f7bf652-0375-4f49-94f1-ebe6a00e4e23,7f7bf652-0375-4f49-94f1-ebe6a00e4e23,1,0,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,1,0,fb63d488-fb91-4d08-8f8c-f4836538216f,fb63d488-fb91-4d08-8f8c-f4836538216f,1,0,b8be6c09-6880-45d3-a2d1-06ad72d069c9,b8be6c09-6880-45d3-a2d1-06ad72d069c9,1,0,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,1,0,148dd521-8754-451b-803b-cbee7c3d3965,148dd521-8754-451b-803b-cbee7c3d3965,1,0,38bc48c7-3938-47be-be3f-844f19561301,38bc48c7-3938-47be-be3f-844f19561301,1,0,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,1,0,147038fb-6154-41f3-aad6-547db27d1e43,147038fb-6154-41f3-aad6-547db27d1e43,1,0,832fa9d3-deab-4c57-b6e2-dee5d24d6100,832fa9d3-deab-4c57-b6e2-dee5d24d6100,1,0,dd4270ef-6b4c-491e-8871-959dbec14c53,dd4270ef-6b4c-491e-8871-959dbec14c53,1,0,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,1,0,9883862f-c0eb-41fe-9374-05c6d72878bc,9883862f-c0eb-41fe-9374-05c6d72878bc,1,0,8ccd9be8-ef26-49b9-8cee-03ae4e500386,8ccd9be8-ef26-49b9-8cee-03ae4e500386,1,0,ddca925c-fdcd-40ce-a504-4fca1758de3f,ddca925c-fdcd-40ce-a504-4fca1758de3f,1,0,9bd92328-8c9c-4882-8956-a1fccf555a64,9bd92328-8c9c-4882-8956-a1fccf555a64,1,0,cafc6b5b-a76a-4b1b-9592-ba440f7bf34f,cafc6b5b-a76a-4b1b-9592-ba440f7bf34f,1,0,f64de21f-5a7c-4a1a-a929-07fc53049f6c,f64de21f-5a7c-4a1a-a929-07fc53049f6c,1,0,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,1,0,ea653eca-f96a-447d-8b09-7a7cb6929ed6,ea653eca-f96a-447d-8b09-7a7cb6929ed6,1,0,4f9b6c01-0919-41ba-91dc-49497d0fecf7,4f9b6c01-0919-41ba-91dc-49497d0fecf7,1,0,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,ea07cd11-418c-4e4f-be9f-c160ee8a64e8,1,0,5efc4bc4-b711-4620-8d2e-9d947c6cc141,5efc4bc4-b711-4620-8d2e-9d947c6cc141,1,0,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1d8d0eed-caaa-494c-aeea-0df5846fc97a,1,0,1328947f-91c3-43f4-a11e-f34893d987b3,1328947f-91c3-43f4-a11e-f34893d987b3,1,0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,6de9dab4-ee34-4584-a2e7-7a29c86794b0,1,0,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,1,0,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,1,0,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,1,0,2b72fe1c-afe1-4905-8db2-2bb1baca6295,2b72fe1c-afe1-4905-8db2-2bb1baca6295,1,0,aa8c4a71-3276-4b83-8be2-3528129e58b3,aa8c4a71-3276-4b83-8be2-3528129e58b3,1,0,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,1,0,528d3535-f20f-4d3c-8b7d-482d4d626eb0,528d3535-f20f-4d3c-8b7d-482d4d626eb0,1,0,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,1,0,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,e9a2441e-faf9-4158-acc7-b1a6178ae0f3,1,0,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,1,0,871a75ef-1987-4695-9916-07439aeedc53,871a75ef-1987-4695-9916-07439aeedc53,1,0,ba64deac-5826-43f2-b88a-2e180da87059,ba64deac-5826-43f2-b88a-2e180da87059,1,0,53ee3eb6-d2d1-4fb3-8a78-1fa4543850a1,53ee3eb6-d2d1-4fb3-8a78-1fa4543850a1,1,0,0072986b-0463-4a39-9851-f9adeda99716,0072986b-0463-4a39-9851-f9adeda99716,1,0,fa44433b-1c44-45a0-9487-47aa092442cf,fa44433b-1c44-45a0-9487-47aa092442cf,1,0,041cecfd-cef2-45d9-90e8-afe0d97d2d95,041cecfd-cef2-45d9-90e8-afe0d97d2d95,1,0,0d4a26fb-7176-43f2-8767-d3e227c7306a,0d4a26fb-7176-43f2-8767-d3e227c7306a,1,0,77de81f0-97c5-4751-9f38-f5785c7c45e0,77de81f0-97c5-4751-9f38-f5785c7c45e0,1,0,933cbafc-5667-4a91-8b1d-dca3d7662522,933cbafc-5667-4a91-8b1d-dca3d7662522,1,0,59acaca9-ed29-4927-bee6-287c91934690,59acaca9-ed29-4927-bee6-287c91934690,1,0,9136814a-89e6-4b0f-8ca1-73e4ef29f534,9136814a-89e6-4b0f-8ca1-73e4ef29f534,1,0,d7e4795a-3431-4f7d-9699-4241611adcf0,d7e4795a-3431-4f7d-9699-4241611adcf0,1,0,ea0a498a-a1cb-4f28-88cb-0bc62971172b,ea0a498a-a1cb-4f28-88cb-0bc62971172b,1,0,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,7e4222fd-fb98-4ae5-9d98-d41c3d572a0c,1,0,d9d14a24-c023-4b69-ad57-30d1474e1232,d9d14a24-c023-4b69-ad57-30d1474e1232,1,0,b6e98aee-4936-491d-8c67-8490e1af2e34,b6e98aee-4936-491d-8c67-8490e1af2e34,1,0,0732ab1c-b49a-49ed-8667-65f4427cc301,0732ab1c-b49a-49ed-8667-65f4427cc301,1,0,b292eb46-df87-43c0-9a37-93c5a22af252,b292eb46-df87-43c0-9a37-93c5a22af252,1,0,0943dd00-1653-4760-a9fe-ebc083ffa660,0943dd00-1653-4760-a9fe-ebc083ffa660,1,0,7406da96-2e16-42a0-9522-d76547708eca,7406da96-2e16-42a0-9522-d76547708eca,1,0,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,ede6a379-b0e5-4b8d-a454-779c0fd8b0b3,1,0,4fb8564e-2338-4c23-84a4-31f768047ced,4fb8564e-2338-4c23-84a4-31f768047ced,1,0,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,1,0,f93c9a7f-0249-421e-b3d0-55f02d130017,f93c9a7f-0249-421e-b3d0-55f02d130017,1,0,062c507a-9d35-4eb5-bb91-d106a535a503,062c507a-9d35-4eb5-bb91-d106a535a503,1,0,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,ea1284f2-33f1-4e3d-b009-1ffad3aaf300,1,0,bd727741-ba99-484d-9d7d-2c2ad7ddd1a5,bd727741-ba99-484d-9d7d-2c2ad7ddd1a5,1,0,90327957-5bdc-4949-883c-9eb50f527b3e,90327957-5bdc-4949-883c-9eb50f527b3e,1,0,031980f5-60e8-426a-9907-3afff75a6b05,031980f5-60e8-426a-9907-3afff75a6b05,1,0,1a26f2d5-2465-484c-9311-12d9b3b92ae3,1a26f2d5-2465-484c-9311-12d9b3b92ae3,1,0,fd317d96-380e-4ee7-a25b-401e8521cc7a,fd317d96-380e-4ee7-a25b-401e8521cc7a,1,0,64837ad8-3055-4da3-a39c-0e7db38b6084,64837ad8-3055-4da3-a39c-0e7db38b6084,1,0,695cda1d-b816-4200-9a71-490078a9faa7,695cda1d-b816-4200-9a71-490078a9faa7,1,0,75fc5bea-e239-4de1-ad68-6454876e4b9f,75fc5bea-e239-4de1-ad68-6454876e4b9f,1,0,31ba33d4-5941-4b11-ae99-b15188bfef76,31ba33d4-5941-4b11-ae99-b15188bfef76,1,0,0744e8be-747c-47bb-85f3-58b6f6f9b786,0744e8be-747c-47bb-85f3-58b6f6f9b786,1,0,7142ae5b-ec7b-4a69-9c26-f51e05a4c270,7142ae5b-ec7b-4a69-9c26-f51e05a4c270,1,0,3b380a63-9232-42c2-bfa2-e8fc89448bbd,3b380a63-9232-42c2-bfa2-e8fc89448bbd,1,0,e18b4527-8727-4a10-9e99-a80012debe6c,e18b4527-8727-4a10-9e99-a80012debe6c,1,0,1ed910db-e434-4efd-9b12-c25353a31d5a,1ed910db-e434-4efd-9b12-c25353a31d5a,1,0,10556a26-ea4b-46b4-84d1-175eb13b333f,10556a26-ea4b-46b4-84d1-175eb13b333f,1,0,f1e600b0-55ed-4611-b147-f04d5621796b,f1e600b0-55ed-4611-b147-f04d5621796b,1,0,e3b84128-95e1-45df-84db-5e1791779543,e3b84128-95e1-45df-84db-5e1791779543,1,0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,1,0,101a4eb3-cdda-47af-8c69-615a6920347a,101a4eb3-cdda-47af-8c69-615a6920347a,1,0,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,1,0,e9d95895-8708-4035-89ad-72573b870491,e9d95895-8708-4035-89ad-72573b870491,1,0,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,1,0,f0152598-ffa3-4eb7-811f-906e569373e6,f0152598-ffa3-4eb7-811f-906e569373e6,1,0,f79bada2-838f-4e4f-a017-935cf671a70c,f79bada2-838f-4e4f-a017-935cf671a70c,1,0,312118ff-a2a4-479c-964a-5250cca0cd20,312118ff-a2a4-479c-964a-5250cca0cd20,1,0,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,f8d32d21-ea2f-42bb-a785-9bd3cf754cd9,1,0,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,1,0,8a310493-c06f-46db-b2b5-14d6ed203312,8a310493-c06f-46db-b2b5-14d6ed203312,1,0,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,caf8f0e8-7a2c-498b-9b74-ed6b87cce670,1,0,b68ec95b-64f3-4a2b-9683-231d50f01eeb,b68ec95b-64f3-4a2b-9683-231d50f01eeb,1,0,89318397-b3a6-4468-985b-ed5cb8ab5cdb,89318397-b3a6-4468-985b-ed5cb8ab5cdb,1,0,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,5e5b0ad7-ef73-4a73-baf5-360a9244a1cc,1,0,4a008342-f72f-4ca1-bad1-64b59b509911,4a008342-f72f-4ca1-bad1-64b59b509911,1,0,4436b2cf-2d71-401f-99fd-012ff0c91fbd,4436b2cf-2d71-401f-99fd-012ff0c91fbd,1,0,cefa1723-a4d4-44c4-bd57-ffa713f9306c,cefa1723-a4d4-44c4-bd57-ffa713f9306c,1,0,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,1,0,5396be45-d7c0-43df-aed4-cad062a02b11,5396be45-d7c0-43df-aed4-cad062a02b11,1,0,017e3da8-e48e-488b-9bbf-4fef1a4f3417,017e3da8-e48e-488b-9bbf-4fef1a4f3417,1,0,de4d37c9-b278-4c0c-bc10-1b63ecd72947,de4d37c9-b278-4c0c-bc10-1b63ecd72947,1,0,aebf163d-d8e8-492a-a973-8cb51982d475,aebf163d-d8e8-492a-a973-8cb51982d475,1,0,5a741cf6-8160-4409-9396-2e6d1e67e6fa,5a741cf6-8160-4409-9396-2e6d1e67e6fa,1,0,4920aabf-6f53-4f91-932a-8ace24631a74,4920aabf-6f53-4f91-932a-8ace24631a74,1,0,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,1,0,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,1,0,d9e98c14-9b07-406b-92c8-bec76165e028,d9e98c14-9b07-406b-92c8-bec76165e028,1,0,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,1,0,bbec9c3d-31dd-484e-ab32-41ef845f1370,bbec9c3d-31dd-484e-ab32-41ef845f1370,1,0,8692ba41-d91d-4af0-8aba-69dd5409d593,8692ba41-d91d-4af0-8aba-69dd5409d593,1,0,7abb55d2-eac6-44a0-9ebc-fa26a7f0c028,7abb55d2-eac6-44a0-9ebc-fa26a7f0c028,1,0,68e207e7-8c20-426d-8a0e-c3dd4d683631,68e207e7-8c20-426d-8a0e-c3dd4d683631,1,0,6d7fa2f9-7ca4-4ad6-b94b-8267768a0f04,6d7fa2f9-7ca4-4ad6-b94b-8267768a0f04,1,0,5cc3a29d-aa98-42bf-9800-f584229c8e46,5cc3a29d-aa98-42bf-9800-f584229c8e46,1,0,a95b564a-c895-40f2-b947-ea08462bb2a0,a95b564a-c895-40f2-b947-ea08462bb2a0,1,0,1e015740-5b45-4729-9732-57359a7c602f,1e015740-5b45-4729-9732-57359a7c602f,1,0,db82191f-77bd-44da-8b33-86f01018e25a,db82191f-77bd-44da-8b33-86f01018e25a,1,0,ca63ca2f-703d-4317-8c5d-0650ea638f3f,ca63ca2f-703d-4317-8c5d-0650ea638f3f,1,0,aa2256c7-9847-40a5-9e49-11c508e0d45b,aa2256c7-9847-40a5-9e49-11c508e0d45b,1,0,a04493f4-508c-4047-b0e3-b7d4bde6427b,a04493f4-508c-4047-b0e3-b7d4bde6427b,1,0,6c138ffd-057f-4f7d-af4d-1b1a589a9057,6c138ffd-057f-4f7d-af4d-1b1a589a9057,1,0,418982cd-d403-47cf-a7ef-993a36104947,418982cd-d403-47cf-a7ef-993a36104947,1,0,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,1,0,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,1,0,35eea3b8-d017-442a-b5a0-a1571165b9a9,35eea3b8-d017-442a-b5a0-a1571165b9a9,1,0,7e84901c-cb7f-437c-a135-0902cd47acb6,7e84901c-cb7f-437c-a135-0902cd47acb6,1,0,69530795-5a90-47b0-ae8d-a44b420b51f6,69530795-5a90-47b0-ae8d-a44b420b51f6,1,0,da2b47f5-4109-4f72-a4a5-70be24a6881f,da2b47f5-4109-4f72-a4a5-70be24a6881f,1,0,849f034e-85dc-4515-aae6-240c1e0d46d9,849f034e-85dc-4515-aae6-240c1e0d46d9,1,0,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,5fbea8c7-48e3-4ed0-a8d0-cf942b37a166,1,0,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,d85ba2d1-63e9-4680-bd88-6c0c4dba5d0f,1,0,acfa1919-07ce-4464-8552-6b104e284dca,acfa1919-07ce-4464-8552-6b104e284dca,1,0,cd74d617-8ebe-4a7d-b011-38c98d856d8c,cd74d617-8ebe-4a7d-b011-38c98d856d8c,1,0,f4cff4ff-68e9-4072-971e-1b359d3aa980,f4cff4ff-68e9-4072-971e-1b359d3aa980,1,0,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,f9a5bd40-7c56-4ced-bddb-a66c1fc31b81,1,0,fdb012c9-583a-42af-95da-070e75a58078,fdb012c9-583a-42af-95da-070e75a58078,1,0,7d069b11-cddd-463d-97be-3cbeaaf0954c,7d069b11-cddd-463d-97be-3cbeaaf0954c,1,0,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,1,0,5ea4412e-0ce0-4176-917b-37817ed788e1,5ea4412e-0ce0-4176-917b-37817ed788e1,1,0,8242daae-181a-47df-b28e-c1de3fce0359,8242daae-181a-47df-b28e-c1de3fce0359,1,0,8de2c020-0ebe-4374-93d7-d2e19ed82470,8de2c020-0ebe-4374-93d7-d2e19ed82470,1,0,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,1,0,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,1,0,b9004626-915c-44c8-9cb7-25e5b627ee83,b9004626-915c-44c8-9cb7-25e5b627ee83,1,0,1a3eff9b-6598-4e11-9b8f-81249c53abec,1a3eff9b-6598-4e11-9b8f-81249c53abec,1,0,63c6cfad-124d-491a-829d-b298463c95e6,63c6cfad-124d-491a-829d-b298463c95e6,1,0,3da31d2f-24dd-469b-bd3b-073fa3b3d585,3da31d2f-24dd-469b-bd3b-073fa3b3d585,1,0,33b12dd8-7a86-4a51-bd3d-4911ec1ffde4,33b12dd8-7a86-4a51-bd3d-4911ec1ffde4,1,0,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1e020429-ac68-46f4-b34c-c2c4a2b494f6,1,0,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1,0,f11ffcfd-3588-4785-b222-cebe80455303,f11ffcfd-3588-4785-b222-cebe80455303,1,0,789a2027-8601-434c-bf47-37696a3966ad,789a2027-8601-434c-bf47-37696a3966ad,1,0,f71eceb3-ef2e-4e6c-bf9c-e7e7d42c1c7c,f71eceb3-ef2e-4e6c-bf9c-e7e7d42c1c7c,1,0,1c7e9baa-7728-4afd-829a-806cee13ecdb,1c7e9baa-7728-4afd-829a-806cee13ecdb,1,0,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,1,0,bfdc6346-db5b-427f-acca-9b48db8fefd0,bfdc6346-db5b-427f-acca-9b48db8fefd0,1,0,1c3f258c-345e-47f6-9e29-98b1222fb348,1c3f258c-345e-47f6-9e29-98b1222fb348,1,0,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,1,0,4c3085e1-2f86-4af4-a392-ab45e30a7152,4c3085e1-2f86-4af4-a392-ab45e30a7152,1,0,35c938f4-065f-47f5-a75b-637ed0080725,35c938f4-065f-47f5-a75b-637ed0080725,1,0,89cc9ae4-e933-4f4a-849f-48ef67b75819,89cc9ae4-e933-4f4a-849f-48ef67b75819,1,0,36e096be-ee28-437a-b8f2-c1e274c150e3,36e096be-ee28-437a-b8f2-c1e274c150e3,1,0,160e9608-7301-4572-af02-6a7cceca1560,160e9608-7301-4572-af02-6a7cceca1560,1,0,4a70416b-6598-4239-be70-2c0c8255388a,4a70416b-6598-4239-be70-2c0c8255388a,1,0,f6b69c2b-e32a-477f-9128-b61d8237290e,f6b69c2b-e32a-477f-9128-b61d8237290e,1,0,e2779397-46ed-4d95-8529-45896f9567d2,e2779397-46ed-4d95-8529-45896f9567d2,1,0,e14c0841-226c-4c79-bec9-cfc8d2c3a160,e14c0841-226c-4c79-bec9-cfc8d2c3a160,1,0,d05bbd02-9db3-4830-be9d-7080f3506e01,d05bbd02-9db3-4830-be9d-7080f3506e01,1,0,6f3c5b90-b030-4267-a973-33d12c2c7680,6f3c5b90-b030-4267-a973-33d12c2c7680,1,0,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1ff8210b-26c5-4429-b580-7c6ec7c9b63a,1,0,7e3283df-05a6-4dc5-a786-056c71bdbf6f,7e3283df-05a6-4dc5-a786-056c71bdbf6f,1,0,c6af8b0f-3767-4198-88e2-f5763cb0294a,c6af8b0f-3767-4198-88e2-f5763cb0294a,1,0,88b879b7-1bb3-4478-b569-35bdb5c56939,88b879b7-1bb3-4478-b569-35bdb5c56939,1,0,7a62d031-c340-4b1e-90af-fff697a2e979,7a62d031-c340-4b1e-90af-fff697a2e979,1,0,18bf6916-83cc-41e5-a35b-1489450ae632,18bf6916-83cc-41e5-a35b-1489450ae632,1,0,ebab97cf-5335-4648-9845-8ca41f79fb49,ebab97cf-5335-4648-9845-8ca41f79fb49,1,0,bb29fa44-6772-4426-a0b8-422115e14288,bb29fa44-6772-4426-a0b8-422115e14288,1,0,ac847dc9-e222-45cf-af4a-6fa863c919a8,ac847dc9-e222-45cf-af4a-6fa863c919a8,1,0,a5cc5ae2-be80-4957-8aca-9e477433dfcc,a5cc5ae2-be80-4957-8aca-9e477433dfcc,1,0,62fa393c-687c-49bf-8a25-81adc04430fb,62fa393c-687c-49bf-8a25-81adc04430fb,1,0,13fcf1e8-730e-436f-b316-6bcb8301f894,13fcf1e8-730e-436f-b316-6bcb8301f894,1,0,fa548f02-82e0-4897-89e8-0618ebf16919,fa548f02-82e0-4897-89e8-0618ebf16919,1,0,8c28a5b0-517f-48fe-9bde-5e611c319413,8c28a5b0-517f-48fe-9bde-5e611c319413,1,0,904e1209-91d8-49b1-b291-364ef728cbbf,904e1209-91d8-49b1-b291-364ef728cbbf,1,0,4a0d7cd7-8e43-4a1f-88b8-ffc376b38f7c,4a0d7cd7-8e43-4a1f-88b8-ffc376b38f7c,1,0,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1198f2ee-b8a8-456d-9461-61bc5d42c7a1,1,0,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,b8ecb7f0-ef40-4d31-9ec2-a731439d3200,1,0,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,1,0,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,1,0,23314bcd-2dd4-43f1-9fdb-ae182a48c886,23314bcd-2dd4-43f1-9fdb-ae182a48c886,1,0,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,c5f86fa3-4a36-4e22-8b57-7088dd250cd3,1,0,9440a132-366f-4fc9-bd72-2544ba2b072a,9440a132-366f-4fc9-bd72-2544ba2b072a,1,0,84282afa-21f5-40db-9386-e6f741c9a06c,84282afa-21f5-40db-9386-e6f741c9a06c,1,0,5b3b3da9-8619-4fbd-b140-3528875cd179,5b3b3da9-8619-4fbd-b140-3528875cd179,1,0,99e5e866-7ac6-4916-ab66-3e2909822c56,99e5e866-7ac6-4916-ab66-3e2909822c56,1,0,03363877-2752-4a03-95f2-d73b732e0bfd,03363877-2752-4a03-95f2-d73b732e0bfd,1,0,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,1,0,78051e10-74ab-44be-adca-e4c93824a386,78051e10-74ab-44be-adca-e4c93824a386,1,0,73629419-83d8-4727-88a9-76c851d104c9,73629419-83d8-4727-88a9-76c851d104c9,1,0,cadb54f0-dcff-4f96-983e-a309fd72f330,cadb54f0-dcff-4f96-983e-a309fd72f330,1,0,a9c3065b-db68-4f59-9235-33f9fbfdaafd,a9c3065b-db68-4f59-9235-33f9fbfdaafd,1,0,3715cf3d-0abc-4711-8ac9-d41f0be7878f,3715cf3d-0abc-4711-8ac9-d41f0be7878f,1,0,8e8d8078-8b32-4c24-b26e-89a92bf60160,8e8d8078-8b32-4c24-b26e-89a92bf60160,1,0,e6af9db4-b93f-422e-846c-e6c5fd33f992,e6af9db4-b93f-422e-846c-e6c5fd33f992,1,0,2895ac1f-5f15-422d-9d90-2df87255a92a,2895ac1f-5f15-422d-9d90-2df87255a92a,1,0,f96cbb27-7619-41e0-8577-e623ef02dc58,f96cbb27-7619-41e0-8577-e623ef02dc58,1,0,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,ed5ff5b0-f980-4b9a-9299-eef68e3b42d5,1,0,d74dfd31-2016-435b-8652-15fdbca59490,d74dfd31-2016-435b-8652-15fdbca59490,1,0,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,1,0,27651e0e-d560-434b-a49c-f473a5b20c4d,27651e0e-d560-434b-a49c-f473a5b20c4d,1,0,dab1491b-0685-442d-b945-2bfde3f37933,dab1491b-0685-442d-b945-2bfde3f37933,1,0,42107b14-9373-418a-a41d-35c87434c51a,42107b14-9373-418a-a41d-35c87434c51a,1,0,24d8ce8d-e94c-4168-abad-d0ce5e6cbf1b,24d8ce8d-e94c-4168-abad-d0ce5e6cbf1b,1,0,8786575a-eab6-46bf-be3a-167e2d5b41dd,8786575a-eab6-46bf-be3a-167e2d5b41dd,1,0,ce85554b-81ba-4149-a951-d09bdc14fa16,ce85554b-81ba-4149-a951-d09bdc14fa16,1,0,23a1ef35-1469-44ea-8535-fa9c7f535cae,23a1ef35-1469-44ea-8535-fa9c7f535cae,1,0,9ff1c73e-71be-4ea6-97fb-e710d995ee62,9ff1c73e-71be-4ea6-97fb-e710d995ee62,1,0,50f7effb-e051-49dd-8b56-0771dda350cc,50f7effb-e051-49dd-8b56-0771dda350cc,1,0,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,1,0,2558d812-ac0a-49ba-87db-3f661209a3c4,2558d812-ac0a-49ba-87db-3f661209a3c4,1,0,20d712ef-77c1-4374-92e1-f20a3ebc7eab,20d712ef-77c1-4374-92e1-f20a3ebc7eab,1,0,65d23ce8-e326-45ee-86b0-6dcf35797201,65d23ce8-e326-45ee-86b0-6dcf35797201,1,0,a2683c3f-1b21-47d8-951d-7d30cde51efc,a2683c3f-1b21-47d8-951d-7d30cde51efc,1,0,54c77053-1728-4914-a354-73fe8853a0e1,54c77053-1728-4914-a354-73fe8853a0e1,1,0,21136691-078f-4bf7-bddd-f41416a76d86,21136691-078f-4bf7-bddd-f41416a76d86,1,0,9d669d30-a0af-4095-852a-96b4224ee933,9d669d30-a0af-4095-852a-96b4224ee933,1,0,590aba18-7d56-48e3-9454-5f2882a32f80,590aba18-7d56-48e3-9454-5f2882a32f80,1,0,30a121c7-c4f5-45c4-9504-9778ed85d9e3,30a121c7-c4f5-45c4-9504-9778ed85d9e3,1,0,c68e2157-2541-4f80-966a-d68ce603f131,c68e2157-2541-4f80-966a-d68ce603f131,1,0,18363a37-28b0-488b-a7d6-54d3596d2a6d,18363a37-28b0-488b-a7d6-54d3596d2a6d,1,0,e5f401b5-4672-4529-a8dd-6d819f3f269c,e5f401b5-4672-4529-a8dd-6d819f3f269c,1,0,126d5d78-a2b0-4c16-b429-bf8d251280e7,126d5d78-a2b0-4c16-b429-bf8d251280e7,1,0,f8f96dce-913c-4858-bcb7-dcfe3dc2f72e,f8f96dce-913c-4858-bcb7-dcfe3dc2f72e,1,0,70d93c88-c9e9-4b8e-b8f3-ef07c665ab5d,70d93c88-c9e9-4b8e-b8f3-ef07c665ab5d,1,0,12443114-1931-4eb7-968a-7dbe166b7298,12443114-1931-4eb7-968a-7dbe166b7298,1,0,0080c29d-ec54-43a8-aab8-c67e0279b6b7,0080c29d-ec54-43a8-aab8-c67e0279b6b7,1,0,a0271f6e-dc70-4dfe-a395-203e8a89f933,a0271f6e-dc70-4dfe-a395-203e8a89f933,1,0,e5dfee58-f748-48ee-81a3-7c6133f06365,e5dfee58-f748-48ee-81a3-7c6133f06365,1,0,5e52dfe6-5a98-4a32-9429-5f44bf442367,5e52dfe6-5a98-4a32-9429-5f44bf442367,1,0,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,c0e01a15-6937-4331-bdd7-2f5a68d0d3dd,1,0,d065c02e-9991-468a-ae32-b8c29d078d03,d065c02e-9991-468a-ae32-b8c29d078d03,1,0,c509683e-eb13-4e1a-91ed-cd6982ec5001,c509683e-eb13-4e1a-91ed-cd6982ec5001,1,0,88bf6f58-7943-42c4-bc0f-56b991590026,88bf6f58-7943-42c4-bc0f-56b991590026,1,0,9aa0a0cb-9547-4868-9495-b00f3ecd2b3a,9aa0a0cb-9547-4868-9495-b00f3ecd2b3a,1,0,a9e31d90-fe65-47c3-8109-6e1eae862f53,a9e31d90-fe65-47c3-8109-6e1eae862f53,1,0,68500931-89e0-491e-aba8-b013c9e6f8c3,68500931-89e0-491e-aba8-b013c9e6f8c3,1,0,70b79e56-bb71-4f38-93cf-94dda79d9b4c,70b79e56-bb71-4f38-93cf-94dda79d9b4c,1,0,e678bb94-3cb1-4706-8e76-4fada4d5036c,e678bb94-3cb1-4706-8e76-4fada4d5036c,1,0,5c4c9931-3fb0-47a8-9e4f-d552de12b355,5c4c9931-3fb0-47a8-9e4f-d552de12b355,1,0,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,dc1d0f97-e2f3-4e1d-b21c-411b46e39848,1,0,2a498baf-ec2e-4dda-b568-801bb60db225,2a498baf-ec2e-4dda-b568-801bb60db225,1,0,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,1,0,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,1,0,f987ca28-545b-4540-9e36-b0daa67dc3cb,f987ca28-545b-4540-9e36-b0daa67dc3cb,1,0,70f156d8-9cb4-442d-a36b-7a43d03bcd12,70f156d8-9cb4-442d-a36b-7a43d03bcd12,1,0,35989876-16b1-4b02-9381-444a06a7a21d,35989876-16b1-4b02-9381-444a06a7a21d,1,0,f7608000-1e8a-4ca4-afb7-e04ef547b70a,f7608000-1e8a-4ca4-afb7-e04ef547b70a,1,0,f0a6de82-45ab-4153-bccf-df82fc960aa1,f0a6de82-45ab-4153-bccf-df82fc960aa1,1,0,77adf47b-6015-46fc-9e29-f1c025ea0d81,77adf47b-6015-46fc-9e29-f1c025ea0d81,1,0,26cea519-19d0-4707-be0a-1a43fde6e563,26cea519-19d0-4707-be0a-1a43fde6e563,1,0,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,1,0,7ea3206a-2a16-460d-ad6d-849103f50bdb,7ea3206a-2a16-460d-ad6d-849103f50bdb,1,0,eb35bff2-8467-48fe-bf93-ece2aa40f506,eb35bff2-8467-48fe-bf93-ece2aa40f506,1,0,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,1,0,10302ca9-850c-4561-a774-d099c20b1919,10302ca9-850c-4561-a774-d099c20b1919,1,0,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,1,0,d693bfcf-e117-445b-b0e1-d895bc5227c4,d693bfcf-e117-445b-b0e1-d895bc5227c4,1,0,68cf55da-b29e-4a65-815b-c9cdc8e5888e,68cf55da-b29e-4a65-815b-c9cdc8e5888e,1,0,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,1,0,1041ed81-c1f7-43b2-9087-914865a3076e,1041ed81-c1f7-43b2-9087-914865a3076e,1,0,5d7174d2-42b3-4e12-b705-4209dd73b53b,5d7174d2-42b3-4e12-b705-4209dd73b53b,1,0,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,1,0,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,1,0,0508e7ab-3dd9-42b4-9542-089ce0656bbb,0508e7ab-3dd9-42b4-9542-089ce0656bbb,1,0,cfe59dfd-a509-4f83-b926-b3ff94234a43,cfe59dfd-a509-4f83-b926-b3ff94234a43,1,0,17df1591-61b0-4204-8379-8d1f58445968,17df1591-61b0-4204-8379-8d1f58445968,1,0,9020fa9d-e7de-4574-ab65-db6651b5b610,9020fa9d-e7de-4574-ab65-db6651b5b610,1,0,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,fd5e72f7-3078-48eb-b01b-1800ffbd86d3,1,0,e83ad33d-27df-4181-afd2-b7f416e6e705,e83ad33d-27df-4181-afd2-b7f416e6e705,1,0,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,ddeec7f4-8bd3-40af-bcac-00d18c0e6d6a,1,0,f0438b0a-7916-4de4-a3a8-d43407c3295f,f0438b0a-7916-4de4-a3a8-d43407c3295f,1,0,3309648c-aae6-4684-ae8d-7ed636bc3468,3309648c-aae6-4684-ae8d-7ed636bc3468,1,0,f9aa933e-6684-48de-b802-96c8e61b1fe6,f9aa933e-6684-48de-b802-96c8e61b1fe6,1,0,f41e5a5b-394b-423a-bee5-ed4d1da0be71,f41e5a5b-394b-423a-bee5-ed4d1da0be71,1,0,23db175f-ddfb-4af7-9c0c-232b6adb7daf,23db175f-ddfb-4af7-9c0c-232b6adb7daf,1,0,9de4d430-95ec-4435-b3e8-4fc85778d517,9de4d430-95ec-4435-b3e8-4fc85778d517,1,0,205b8908-fa21-42bd-bff0-fb95e6787f15,205b8908-fa21-42bd-bff0-fb95e6787f15,1,0,4e309f26-35e8-49d9-bbd1-c7884e666dca,4e309f26-35e8-49d9-bbd1-c7884e666dca,1,0,84f05fe4-51d3-49a8-83e7-1cae2028147e,84f05fe4-51d3-49a8-83e7-1cae2028147e,1,0,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,8a9ab11b-5bb5-4da9-9053-8f9e8198d019,1,0,5320abf1-b09b-4de0-9adf-4cb1da31df6f,5320abf1-b09b-4de0-9adf-4cb1da31df6f,1,0,c382ee3a-d0a8-4ed8-ac88-5558b631f448,c382ee3a-d0a8-4ed8-ac88-5558b631f448,1,0,3916ddbd-9023-42a4-849e-9cda6e591408,3916ddbd-9023-42a4-849e-9cda6e591408,1,0,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,1,0,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,1,0,8e36227c-c0aa-43c4-93ad-e78701248fb1,8e36227c-c0aa-43c4-93ad-e78701248fb1,1,0,f135b60e-6d28-4ba1-acd7-76090f14855d,f135b60e-6d28-4ba1-acd7-76090f14855d,1,0,5b105084-c4ba-4ff6-9196-8b3e3a9991e2,5b105084-c4ba-4ff6-9196-8b3e3a9991e2,1,0,f78ffd16-5bd4-421a-99af-9cf5f126d960,f78ffd16-5bd4-421a-99af-9cf5f126d960,1,0,2bd23dd2-8107-410f-8137-3d022546594b,2bd23dd2-8107-410f-8137-3d022546594b,1,0,3f09badb-70bd-4996-822f-2e2e9524f09d,3f09badb-70bd-4996-822f-2e2e9524f09d,1,0,aca89232-c531-47ca-a82e-e7bfadd56674,aca89232-c531-47ca-a82e-e7bfadd56674,1,0,4b8927df-e124-4bf6-9d70-6e91b4796d90,4b8927df-e124-4bf6-9d70-6e91b4796d90,1,0,871b63a2-c7a6-4343-8d8b-7dda1b0def87,871b63a2-c7a6-4343-8d8b-7dda1b0def87,1,0,52b45b3d-b01b-4aac-8a1e-e256957c39c3,52b45b3d-b01b-4aac-8a1e-e256957c39c3,1,0,fc78d8df-ab27-4544-a65c-73908b9c5425,fc78d8df-ab27-4544-a65c-73908b9c5425,1,0,f8a090d2-b2d1-4ead-a8bf-6325a7552743,f8a090d2-b2d1-4ead-a8bf-6325a7552743,1,0,84f935da-9fe5-44ea-845b-b447b8b0a6f5,84f935da-9fe5-44ea-845b-b447b8b0a6f5,1,0,a4878c33-f156-44cc-b114-5670403075eb,a4878c33-f156-44cc-b114-5670403075eb,1,0,0f1f8bc8-73ce-4384-9496-9bc2d0e212be,0f1f8bc8-73ce-4384-9496-9bc2d0e212be,1,0,695ad525-d1ba-42fb-adc1-6c44ac433c69,695ad525-d1ba-42fb-adc1-6c44ac433c69,1,0,026dadd4-a698-4d56-9b72-7ad9f224e502,026dadd4-a698-4d56-9b72-7ad9f224e502,1,0,d0b49fd9-4054-409f-97a0-a0811ba6c1ab,d0b49fd9-4054-409f-97a0-a0811ba6c1ab,1,0,c7130560-3953-496f-b1d0-cae676fcb5a9,c7130560-3953-496f-b1d0-cae676fcb5a9,1,0,b7d5c226-a787-45e5-b46b-c51b145fcf6a,b7d5c226-a787-45e5-b46b-c51b145fcf6a,1,0,8ca63a1d-4593-4f52-8b5e-4feb9f8487ca,8ca63a1d-4593-4f52-8b5e-4feb9f8487ca,1,0,1e4cc0d6-6e5e-4d16-ba44-060912ec292f,1e4cc0d6-6e5e-4d16-ba44-060912ec292f,1,0,e9311a22-56b5-4607-8eaa-52382ed040c3,e9311a22-56b5-4607-8eaa-52382ed040c3,1,0,dc7b8596-b2c0-415f-95d9-c0aaa96c5675,dc7b8596-b2c0-415f-95d9-c0aaa96c5675,1,0,87e6e315-01e0-41eb-8373-0a60635f2f7a,87e6e315-01e0-41eb-8373-0a60635f2f7a,1,0,9b77e99b-b1d3-4368-a671-59e0ebba3f0e,9b77e99b-b1d3-4368-a671-59e0ebba3f0e,1,0,ad847998-6e50-4160-81fc-3b58ad68f202,ad847998-6e50-4160-81fc-3b58ad68f202,1,0,b2b98bcf-41da-4643-a6dc-39e5379b99e5,b2b98bcf-41da-4643-a6dc-39e5379b99e5,1,0,fdd9fb90-f5f0-4c08-9341-4374403bc950,fdd9fb90-f5f0-4c08-9341-4374403bc950,1,0,0e2d814a-cc9d-4f91-910d-bda54779e298,0e2d814a-cc9d-4f91-910d-bda54779e298,1,0,8fdfef8d-502e-4d27-a539-e833048fa1eb,8fdfef8d-502e-4d27-a539-e833048fa1eb,1,0,65530aca-7cf2-4a52-b5be-5dcbc15a049e,65530aca-7cf2-4a52-b5be-5dcbc15a049e,1,0,15eb2c2d-305d-42c0-9aec-936b82114bdb,15eb2c2d-305d-42c0-9aec-936b82114bdb,1,0,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,1,0,cbca7272-2aae-4e21-b3f5-12786f085648,cbca7272-2aae-4e21-b3f5-12786f085648,1,0,7718bd0b-7b8a-4ffc-b228-f05683b5531a,7718bd0b-7b8a-4ffc-b228-f05683b5531a,1,0,0b303d25-e141-431f-828c-1778d3c247f6,0b303d25-e141-431f-828c-1778d3c247f6,1,0,881f53bc-a52e-4312-b09d-3d3f53ddf84b,881f53bc-a52e-4312-b09d-3d3f53ddf84b,1,0,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,1,0,945ae8d2-b74a-41e9-b740-c82acdd40d04,945ae8d2-b74a-41e9-b740-c82acdd40d04,1,0,976533bf-f162-42a1-a47e-6d681ee67b82,976533bf-f162-42a1-a47e-6d681ee67b82,1,0,19bc0dd8-9e6b-4855-bc42-b4e98443163f,19bc0dd8-9e6b-4855-bc42-b4e98443163f,1,0,a61e10af-eaba-4e7a-a641-65d77453a559,a61e10af-eaba-4e7a-a641-65d77453a559,1,0,edf81bbb-905a-474d-959a-db5629a8e104,edf81bbb-905a-474d-959a-db5629a8e104,1,0,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e,1,0,e9e242b7-0077-4c47-8f45-df50e7cc90cf,e9e242b7-0077-4c47-8f45-df50e7cc90cf,1,0,820383e1-9b95-4c0f-8464-722f1fe64ad5,820383e1-9b95-4c0f-8464-722f1fe64ad5,1,0,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,1,0,292bfe6b-703e-40cb-856d-abb470e6709f,292bfe6b-703e-40cb-856d-abb470e6709f,1,0,276c42ca-f5e0-4bb4-9b89-a925def35cb1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,1,0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,1,0,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1,0,8811ea1a-1221-47b7-9574-3f36ff15a3cf,8811ea1a-1221-47b7-9574-3f36ff15a3cf,1,0,1d715463-691b-4c01-ae39-57c261f2a6ad,1d715463-691b-4c01-ae39-57c261f2a6ad,1,0,4c3d007f-a62c-4fd9-beda-58dbf08ad188,4c3d007f-a62c-4fd9-beda-58dbf08ad188,1,0,c35373a9-f0b0-4ddb-a985-409ac9c64609,c35373a9-f0b0-4ddb-a985-409ac9c64609,1,0,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,c5b4d6e4-4c99-46cb-98cf-9a0024215a12,1,0,c1c40916-fee5-46e3-90fc-10e7595866c9,c1c40916-fee5-46e3-90fc-10e7595866c9,1,0,87dad256-122b-4d7e-b249-a2c313a9cf33,87dad256-122b-4d7e-b249-a2c313a9cf33,1,0,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,1,0,f20a04a7-84fa-48e3-8ac5-28176c1fcada,f20a04a7-84fa-48e3-8ac5-28176c1fcada,1,0,b722d6e1-fd6f-4bb4-923d-01764393722d,b722d6e1-fd6f-4bb4-923d-01764393722d,1,0,ac5f945e-2d03-44fb-a8cf-5d786194cefd,ac5f945e-2d03-44fb-a8cf-5d786194cefd,1,0,698ec00f-bf75-420e-81ab-a98808daf3f7,698ec00f-bf75-420e-81ab-a98808daf3f7,1,0,f441907c-d02e-431e-baf4-1854e48a1f50,f441907c-d02e-431e-baf4-1854e48a1f50,1,0,4ad722ca-10fc-4a83-91c9-ef0012685f89,4ad722ca-10fc-4a83-91c9-ef0012685f89,1,0,783dd4ba-a597-45ba-8989-2ed5224d62bc,783dd4ba-a597-45ba-8989-2ed5224d62bc,1,0,3b033d29-0de7-49dd-90bc-f414b28426d7,3b033d29-0de7-49dd-90bc-f414b28426d7,1,0,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,1,0,dad9710a-73ca-4e0d-b98b-75f955d0822d,dad9710a-73ca-4e0d-b98b-75f955d0822d,1,0,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,1,0,2191939f-6f71-47c9-a3d2-57acbf7f411e,2191939f-6f71-47c9-a3d2-57acbf7f411e,1,0,6ddd9c1f-daff-494c-bd6f-741bd40881ab,6ddd9c1f-daff-494c-bd6f-741bd40881ab,1,0,683c1238-5828-4ab9-a89e-7a3b31fc7fa5,683c1238-5828-4ab9-a89e-7a3b31fc7fa5,1,0,7e9c0fa3-128e-4c3f-a1f7-63cb88a1c0b1,7e9c0fa3-128e-4c3f-a1f7-63cb88a1c0b1,1,0,2ca8bca9-813a-4833-8ef0-a5e83f91c10f,2ca8bca9-813a-4833-8ef0-a5e83f91c10f,1,0,59b34b58-6ac9-467e-963b-0cccbf098797,59b34b58-6ac9-467e-963b-0cccbf098797,1,0,313d9858-3995-4a4c-b2b0-15d2350417b4,313d9858-3995-4a4c-b2b0-15d2350417b4,1,0,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,1,0,a2c36563-126d-4c3a-9714-5b7a4903073b,a2c36563-126d-4c3a-9714-5b7a4903073b,1,0,2e4da82c-dddb-4462-b34f-6511cd2a8356,2e4da82c-dddb-4462-b34f-6511cd2a8356,1,0,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,1,0,2976c29f-f482-463d-8f6e-6a632fb50893,2976c29f-f482-463d-8f6e-6a632fb50893,1,0,701964a1-7762-45ee-a9a4-41dd9ce94783,701964a1-7762-45ee-a9a4-41dd9ce94783,1,0,55d1909e-f552-441f-8e14-47d2e604cf6a,55d1909e-f552-441f-8e14-47d2e604cf6a,1,0,eae627db-c52b-4e41-94d1-58db28cd0063,eae627db-c52b-4e41-94d1-58db28cd0063,1,0,8eddf64b-2250-48cc-9b6e-cea6dd942f41,8eddf64b-2250-48cc-9b6e-cea6dd942f41,1,0,514e95b8-2fdd-46f7-89bf-7d1a3d9d6e1b,514e95b8-2fdd-46f7-89bf-7d1a3d9d6e1b,1,0,6ca91336-5ccd-4d0b-9602-53f4925c492d,6ca91336-5ccd-4d0b-9602-53f4925c492d,1,0,d853dd5f-d987-4cdb-82b5-5e40a5a5e449,d853dd5f-d987-4cdb-82b5-5e40a5a5e449,1,0,dc16c546-eecc-49fe-a401-e2e3987faa1f,dc16c546-eecc-49fe-a401-e2e3987faa1f,1,0,47058e36-a281-43a5-a41d-691b3ef32b5b,47058e36-a281-43a5-a41d-691b3ef32b5b,1,0,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,4fc5c023-91e2-4b3e-8f61-4dfe3be78f3a,1,0,646def82-bc88-4187-8be0-93938656a20f,646def82-bc88-4187-8be0-93938656a20f,1,0,e620e93c-4382-478f-a700-ad2faa67362b,e620e93c-4382-478f-a700-ad2faa67362b,1,0,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,a07971f5-ed6d-4829-a6bb-4b17cd5c6f6c,1,0,9c4e28e8-7257-42ed-9fd8-793a0b8eb945,9c4e28e8-7257-42ed-9fd8-793a0b8eb945,1,0,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,9b7b6d0e-68d6-4a73-837c-2a6fd456b236,1,0,7f6222c1-1a50-4565-b66b-bcb430674efc,7f6222c1-1a50-4565-b66b-bcb430674efc,1,0,a4a8693b-dc91-4762-92e6-35360c8768db,a4a8693b-dc91-4762-92e6-35360c8768db,1,0,2ae236ec-28a7-44e0-a0ba-be62fe52d817,2ae236ec-28a7-44e0-a0ba-be62fe52d817,1,0,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,2fb5650f-a5e5-4db8-a6a7-ca1101b41d3e,1,0,b0fca543-6951-4233-bdf6-58082b22252a,b0fca543-6951-4233-bdf6-58082b22252a,1,0,4929cf90-54c6-412c-b2fa-dc8230fb8f85,4929cf90-54c6-412c-b2fa-dc8230fb8f85,1,0,52ae6431-afb3-4dea-b106-00e11b174ec7,52ae6431-afb3-4dea-b106-00e11b174ec7,1,0,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,1,0,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,1,0,528d96cc-8838-49ea-8d76-ea56747882e0,528d96cc-8838-49ea-8d76-ea56747882e0,1,0,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,b9166ea0-cce8-4f76-a9cb-a3d6eb4dfb95,1,0,8b83324c-e10e-49d1-99d7-5bc468c25975,8b83324c-e10e-49d1-99d7-5bc468c25975,1,0,ddb75923-27bf-4996-b024-4bc6eb0f59a7,ddb75923-27bf-4996-b024-4bc6eb0f59a7,1,0,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,1,0,ed137e05-1996-411d-9927-45a3d7e3ee3b,ed137e05-1996-411d-9927-45a3d7e3ee3b,1,0,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,1,0,fbebf341-9842-41e1-8e4d-490fa02065ce,fbebf341-9842-41e1-8e4d-490fa02065ce,1,0,3be0acc7-223a-46ec-9ea2-ec99b869fa78,3be0acc7-223a-46ec-9ea2-ec99b869fa78,1,0,067f88f6-ccd2-491e-a466-94345a1f220f,067f88f6-ccd2-491e-a466-94345a1f220f,1,0,517ac144-ecb9-4d14-83ea-01e58f0901fc,517ac144-ecb9-4d14-83ea-01e58f0901fc,1,0,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,cf7bc2ca-fb57-4b1a-98cf-f2caa7e611f5,1,0,486083d8-33b1-453f-9f05-5ff867e2f4ba,486083d8-33b1-453f-9f05-5ff867e2f4ba,1,0,e4f9d9f6-38d7-4056-a95a-987ad2da2211,e4f9d9f6-38d7-4056-a95a-987ad2da2211,1,0,22c21c2b-4297-43b2-88f0-9555d22f7a14,22c21c2b-4297-43b2-88f0-9555d22f7a14,1,0,734f61c4-5429-4a09-8697-8949ac5e6bd1,734f61c4-5429-4a09-8697-8949ac5e6bd1,1,0,d04e0e2d-0a5f-4866-b0b3-b582915db899,d04e0e2d-0a5f-4866-b0b3-b582915db899,1,0,19649d3f-52aa-4054-bb84-a6a11d212495,19649d3f-52aa-4054-bb84-a6a11d212495,1,0,640d7486-8abd-40aa-a244-2ed899b7225a,640d7486-8abd-40aa-a244-2ed899b7225a,1,0,58321939-f25a-456d-8dee-97e64743dc2e,58321939-f25a-456d-8dee-97e64743dc2e,1,0,416fba62-70c4-4f8c-b10b-56d47b27ca35,416fba62-70c4-4f8c-b10b-56d47b27ca35,1,0,ec48a164-bc30-4e36-a40a-a3cca07aea0d,ec48a164-bc30-4e36-a40a-a3cca07aea0d,1,0,3174d57f-c6a8-44dc-adc1-47e9a54c844d,3174d57f-c6a8-44dc-adc1-47e9a54c844d,1,0,c05f87b4-ec5f-4d14-981f-02ca8ba89863,c05f87b4-ec5f-4d14-981f-02ca8ba89863,1,0,b7736108-89bd-44eb-89c1-8a5a774058f1,b7736108-89bd-44eb-89c1-8a5a774058f1,1,0,e07841ef-8392-4ceb-936d-fd160b3b03cd,e07841ef-8392-4ceb-936d-fd160b3b03cd,1,0,eee66f49-8954-4674-9e02-6bff6c332d30,eee66f49-8954-4674-9e02-6bff6c332d30,1,0,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,1,0,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,1,0,875d1fc1-8172-4e48-8192-035882e1665d,875d1fc1-8172-4e48-8192-035882e1665d,1,0,26132b28-98cc-4690-92ad-139f91839ba2,26132b28-98cc-4690-92ad-139f91839ba2,1,0,e7415ada-dd47-41f5-b4d5-7e77d1adad33,e7415ada-dd47-41f5-b4d5-7e77d1adad33,1,0,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0bd85b79-cc32-4c1d-b629-567a1bdfac56,1,0,79c15db6-6066-4fe5-b30e-3196b6ca3d66,79c15db6-6066-4fe5-b30e-3196b6ca3d66,1,0,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,1,0,ca81e0ea-c428-47f9-aedb-078214104a2f,ca81e0ea-c428-47f9-aedb-078214104a2f,1,0,9518d09c-6996-4439-9278-3c71d5ae8fce,9518d09c-6996-4439-9278-3c71d5ae8fce,1,0,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,1,0,40cefda6-490e-4962-9747-94b823ea4ed7,40cefda6-490e-4962-9747-94b823ea4ed7,1,0,5fbd9a13-012d-4c36-b72c-da3bc4157cff,5fbd9a13-012d-4c36-b72c-da3bc4157cff,1,0,7e8d7d4f-98f7-4c81-94b1-f2d552b1ae5d,7e8d7d4f-98f7-4c81-94b1-f2d552b1ae5d,1,0,6aa6d14f-cd6c-413a-864e-d847d9ce120b,6aa6d14f-cd6c-413a-864e-d847d9ce120b,1,0,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,1,0,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,1,0,35a28677-0653-47f9-82e1-02c4b9266fee,35a28677-0653-47f9-82e1-02c4b9266fee,1,0,461be12a-9f16-4826-978a-436608ca8733,461be12a-9f16-4826-978a-436608ca8733,1,0,9b143299-d300-4b6c-b667-5552fb3bdcde,9b143299-d300-4b6c-b667-5552fb3bdcde,1,0,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,1,0,74973d06-f57d-403e-945c-5cd2f4fc4869,74973d06-f57d-403e-945c-5cd2f4fc4869,1,0,259564b8-172e-4eed-9360-d561ec6dad69,259564b8-172e-4eed-9360-d561ec6dad69,1,0,91c799d7-2b3d-4d1a-87ff-221057a428c6,91c799d7-2b3d-4d1a-87ff-221057a428c6,1,0,5a2d5d8a-afd9-4954-9868-7c82bad00426,5a2d5d8a-afd9-4954-9868-7c82bad00426,1,0,26aea96b-20f8-4e35-b55f-4fe3602e6597,26aea96b-20f8-4e35-b55f-4fe3602e6597,1,0,a3a3a211-e361-4e41-a6f8-d731a366c163,a3a3a211-e361-4e41-a6f8-d731a366c163,1,0,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,c40d6fde-4d9a-4d9e-af86-42b7916e2abe,1,0,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,4d5204ae-711d-4c31-8a18-280dbc9d2bf5,1,0,ca01417c-0ffd-4e00-91e8-93cd305be82d,ca01417c-0ffd-4e00-91e8-93cd305be82d,1,0,933ae96b-c69e-4396-bbfb-0daa81e529a4,933ae96b-c69e-4396-bbfb-0daa81e529a4,1,0,e1823be2-b646-4a1a-a9a9-c925a12c0586,e1823be2-b646-4a1a-a9a9-c925a12c0586,1,0,909e56e3-981f-430b-b775-18c70b3549e7,909e56e3-981f-430b-b775-18c70b3549e7,1,0,e613a6aa-82cb-40fd-8f28-0a74fe21e6a6,e613a6aa-82cb-40fd-8f28-0a74fe21e6a6,1,0,b98ca634-25a5-4366-af04-815ba34c8bb2,b98ca634-25a5-4366-af04-815ba34c8bb2,1,0,14d69108-4d26-401a-b7ae-2c86dadf831c,14d69108-4d26-401a-b7ae-2c86dadf831c,1,0,d6251f65-d366-4bc9-a5db-42063fe03594,d6251f65-d366-4bc9-a5db-42063fe03594,1,0,22c60cbc-429f-40d9-bf8b-681b7786c41d,22c60cbc-429f-40d9-bf8b-681b7786c41d,1,0,8d9d2284-e592-44c5-93bb-247037ab6b95,8d9d2284-e592-44c5-93bb-247037ab6b95,1,0,31dd320b-06aa-4314-9914-2c2420f572a1,31dd320b-06aa-4314-9914-2c2420f572a1,1,0,56730848-3bef-4b8c-b449-fe9d09c9c374,56730848-3bef-4b8c-b449-fe9d09c9c374,1,0,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,1,0,91d8c5e4-eaec-4951-9224-16882fda08f6,91d8c5e4-eaec-4951-9224-16882fda08f6,1,0,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,1,0,4654d192-74bf-430f-abee-6f4dc431b182,4654d192-74bf-430f-abee-6f4dc431b182,1,0,c4fe10b6-d025-4736-be23-3113bd7fe7b4,c4fe10b6-d025-4736-be23-3113bd7fe7b4,1,0,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1,0,4678c704-933a-45ef-9d41-89b8f39016bb,4678c704-933a-45ef-9d41-89b8f39016bb,1,0,8ceea1e8-42ce-469f-823a-ceffdbd6b112,8ceea1e8-42ce-469f-823a-ceffdbd6b112,1,0,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,80eb2a49-8c0e-4f92-b99c-7fdadca03e7b,1,0,3f7ee937-d853-47b7-a1f5-d821208e3531,3f7ee937-d853-47b7-a1f5-d821208e3531,1,0,086d69d6-e2fa-45cb-84b6-f8f3e2919160,086d69d6-e2fa-45cb-84b6-f8f3e2919160,1,0,6995ee71-5901-46d9-a5c1-b35d795bda20,6995ee71-5901-46d9-a5c1-b35d795bda20,1,0,543c32a4-ad43-4f60-9b35-77081f841ad9,543c32a4-ad43-4f60-9b35-77081f841ad9,1,0,e93a4293-0497-4f11-b8b9-40300104fb96,e93a4293-0497-4f11-b8b9-40300104fb96,1,0,93531e5d-5dfc-42e8-be52-2e83f37262b0,93531e5d-5dfc-42e8-be52-2e83f37262b0,1,0,61bf78c0-7004-4a74-b362-e979c7316e05,61bf78c0-7004-4a74-b362-e979c7316e05,1,0,c4351896-eff1-4e4d-8823-028d63a9d6bf,c4351896-eff1-4e4d-8823-028d63a9d6bf,1,0,475f83a2-ba5a-4072-94f8-1324b1f198a4,475f83a2-ba5a-4072-94f8-1324b1f198a4,1,0,a9ae364f-b668-4fb4-b976-f227951ffb6b,a9ae364f-b668-4fb4-b976-f227951ffb6b,1,0,63066bee-d428-4e32-a032-f17475056537,63066bee-d428-4e32-a032-f17475056537,1,0,cd7c15c1-c573-46c9-b109-339b8b54c3ee,cd7c15c1-c573-46c9-b109-339b8b54c3ee,1,0,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,1,0,deee8bde-381f-4094-8794-7a06248860dd,deee8bde-381f-4094-8794-7a06248860dd,1,0,8c2a0f6b-492c-4c5a-97c5-da0d07f9d781,8c2a0f6b-492c-4c5a-97c5-da0d07f9d781,1,0,d92cb614-ed09-47db-b70b-d3e533c44c6a,d92cb614-ed09-47db-b70b-d3e533c44c6a,1,0,2757ee75-4b36-4901-bff1-044708754edb,2757ee75-4b36-4901-bff1-044708754edb,1,0,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,1,0,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,1,0,90032ffa-f117-4a34-82f8-cc7e5a22a542,90032ffa-f117-4a34-82f8-cc7e5a22a542,1,0,71144539-6472-4727-8887-0139f6221370,71144539-6472-4727-8887-0139f6221370,1,0,bff07da4-ae19-48a9-806b-14b285d42485,bff07da4-ae19-48a9-806b-14b285d42485,1,0,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,1,0,b0ccc05d-8d39-4f57-8e87-6846014f92ea,b0ccc05d-8d39-4f57-8e87-6846014f92ea,1,0,49e787c9-753a-468a-b8dd-2e970d9a1fed,49e787c9-753a-468a-b8dd-2e970d9a1fed,1,0,e871dea7-1953-4511-90b0-e0957afac4c0,e871dea7-1953-4511-90b0-e0957afac4c0,1,0,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,1,0,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,1,0,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,1,0,d91441cf-d793-4dfa-9225-f0c16818edde,d91441cf-d793-4dfa-9225-f0c16818edde,1,0,8986c155-54be-4b1b-b31a-5c00b88bc40d,8986c155-54be-4b1b-b31a-5c00b88bc40d,1,0,40ae107d-67a8-404c-adf9-1a760bba94ff,40ae107d-67a8-404c-adf9-1a760bba94ff,1,0,42a39785-144c-4d2d-92c6-fd8b345f687b,42a39785-144c-4d2d-92c6-fd8b345f687b,1,0,32b07bc0-3b2a-4244-93d4-49f172ad3ffb,32b07bc0-3b2a-4244-93d4-49f172ad3ffb,1,0,7abec628-65c3-4a44-ae11-99c2ffc592a3,7abec628-65c3-4a44-ae11-99c2ffc592a3,1,0,7b263bb6-4a6b-46c6-a1f0-48721ac1694b,7b263bb6-4a6b-46c6-a1f0-48721ac1694b,1,0,80b4e8c4-1fb3-4c3b-883f-93b5e213f46e,80b4e8c4-1fb3-4c3b-883f-93b5e213f46e,1,0,98061bca-6e72-479b-9125-a0f9452f4ed1,98061bca-6e72-479b-9125-a0f9452f4ed1,1,0,4d50203f-4577-4615-8001-4e4ac98fd392,4d50203f-4577-4615-8001-4e4ac98fd392,1,0,5c06642b-9c31-485b-87dd-48c6d7dbd30f,5c06642b-9c31-485b-87dd-48c6d7dbd30f,1,0,eeac3530-8897-4ab6-8fe8-09fcbfcd9fde,eeac3530-8897-4ab6-8fe8-09fcbfcd9fde,1,0,c3e2e470-f0bc-4fda-8c0e-4fb900e564a9,c3e2e470-f0bc-4fda-8c0e-4fb900e564a9,1,0,7fb0f8fd-4673-4f1d-a6ef-bc4ba9a2229f,7fb0f8fd-4673-4f1d-a6ef-bc4ba9a2229f,1,0,7172bed5-b12b-4e83-b15d-1d95b63a6272,7172bed5-b12b-4e83-b15d-1d95b63a6272,1,0,25d75a3c-b801-4b1e-aed8-90e667f36c67,25d75a3c-b801-4b1e-aed8-90e667f36c67,1,0,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,addb3aa1-a9d6-4d30-b5db-7f3ce46bc1b2,1,0,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,63ebf7fd-d514-4fce-abc1-fb3f253d01cd,1,0,a275802f-937a-49f4-92da-fcdd185a036d,a275802f-937a-49f4-92da-fcdd185a036d,1,0,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,1,0,f2dc9319-ba60-421a-8340-be3e3a291393,f2dc9319-ba60-421a-8340-be3e3a291393,1,0,bf4eb62a-bc74-4845-bad2-58a2a8302a65,bf4eb62a-bc74-4845-bad2-58a2a8302a65,1,0,b66eb190-1c16-4f20-a94f-954bcdf313b8,b66eb190-1c16-4f20-a94f-954bcdf313b8,1,0,49e21b87-beae-4640-a497-ef468da0cbbc,49e21b87-beae-4640-a497-ef468da0cbbc,1,0,08c83b5e-08dd-425d-b024-62af684df926,08c83b5e-08dd-425d-b024-62af684df926,1,0,9e40a2ef-0c96-4455-8ed6-6e09011df3df,9e40a2ef-0c96-4455-8ed6-6e09011df3df,1,0,0de78690-2038-456b-b140-2b2b81f14e44,0de78690-2038-456b-b140-2b2b81f14e44,1,0,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,1,0,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,1,0,b953eafc-20be-4463-8c3e-903184e18402,b953eafc-20be-4463-8c3e-903184e18402,1,0,dcefdde9-645e-43c7-9244-384dadc75439,dcefdde9-645e-43c7-9244-384dadc75439,1,0,fa787228-aed5-4a16-b958-d102b78bf776,fa787228-aed5-4a16-b958-d102b78bf776,1,0,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,1,0,be900d20-c02d-476d-9ede-2bc5303ef6cb,be900d20-c02d-476d-9ede-2bc5303ef6cb,1,0,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,1,0,07b53437-cc8d-4834-a1e0-7007538b6eab,07b53437-cc8d-4834-a1e0-7007538b6eab,1,0,0dbec644-cb98-4368-ab76-5997259cbce7,0dbec644-cb98-4368-ab76-5997259cbce7,1,0,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,1,0,74b1237b-4a46-438d-9756-b564260df99d,74b1237b-4a46-438d-9756-b564260df99d,1,0,19decf0f-c24e-4551-b3d6-8ebd413cba78,19decf0f-c24e-4551-b3d6-8ebd413cba78,1,0,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,1,0,189383a5-0001-4427-9e00-18451e4bfb6e,189383a5-0001-4427-9e00-18451e4bfb6e,1,0,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,1,0,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,1,0,08dbba81-68fb-49ef-8aac-9631fcfa87c6,08dbba81-68fb-49ef-8aac-9631fcfa87c6,1,0,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,1,0,8170a27d-45e9-48b1-860b-c2d9cc5961cd,8170a27d-45e9-48b1-860b-c2d9cc5961cd,1,0,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,1,0,61cc4ec9-81e7-415b-8adf-3a5e61be505f,61cc4ec9-81e7-415b-8adf-3a5e61be505f,1,0,f41d01ec-983a-4b39-9c11-a6d25d08df4f,f41d01ec-983a-4b39-9c11-a6d25d08df4f,1,0,3247e64e-b57e-4c33-8086-7ab93c5b6371,3247e64e-b57e-4c33-8086-7ab93c5b6371,1,0,1ef34700-ce65-4985-b4d6-7133133ef32d,1ef34700-ce65-4985-b4d6-7133133ef32d,1,0,886d99ce-9ea2-4160-8d73-84df7197c030,886d99ce-9ea2-4160-8d73-84df7197c030,1,0,e5dca369-dc9a-4332-a509-f734b8787e13,e5dca369-dc9a-4332-a509-f734b8787e13,1,0,692d289b-8bd2-4b88-a8ea-0389c967df63,692d289b-8bd2-4b88-a8ea-0389c967df63,1,0,722af623-156c-4e63-8b2a-93da760f1559,722af623-156c-4e63-8b2a-93da760f1559,1,0,393074c4-0afc-4232-8101-11a4ea6ed28a,393074c4-0afc-4232-8101-11a4ea6ed28a,1,0,5ff23123-450c-40ae-9b79-c540da53e2a0,5ff23123-450c-40ae-9b79-c540da53e2a0,1,0,639339a1-7de5-4b05-adf3-f60e7edd922c,639339a1-7de5-4b05-adf3-f60e7edd922c,1,0,dea9af9d-13c0-40d4-a9b0-1908e0a58795,dea9af9d-13c0-40d4-a9b0-1908e0a58795,1,0,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,9e9b8c05-787a-43c0-891d-3d9ad7e4976f,1,0,50ef6fc7-edfc-497b-ae9d-fb676934a631,50ef6fc7-edfc-497b-ae9d-fb676934a631,1,0,6f706d33-6fc6-4311-994f-6887c46f3c3b,6f706d33-6fc6-4311-994f-6887c46f3c3b,1,0,0e1a45b0-d95d-415f-b954-5689610aa393,0e1a45b0-d95d-415f-b954-5689610aa393,1,0,4736b3d3-f696-4bdd-b0e3-0884ea88f623,4736b3d3-f696-4bdd-b0e3-0884ea88f623,1,0,e3ac6312-4397-4012-a3d1-e35071d3fb6b,e3ac6312-4397-4012-a3d1-e35071d3fb6b,1,0,1c32ac14-580d-4ac2-939b-dc5ce64b4f7f,1c32ac14-580d-4ac2-939b-dc5ce64b4f7f,1,0,9162a85e-a385-42b0-b809-da916fce44b7,9162a85e-a385-42b0-b809-da916fce44b7,1,0,f6939587-ff87-4eca-ae52-10e1bd2abfce,f6939587-ff87-4eca-ae52-10e1bd2abfce,1,0,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,1,0,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,1,0,3cb575a9-dc82-45e0-81f0-d651e12246da,3cb575a9-dc82-45e0-81f0-d651e12246da,1,0,01a73950-3e8f-4f56-903f-af0d9574e72e,01a73950-3e8f-4f56-903f-af0d9574e72e,1,0,14bd0844-c829-4325-aa7f-0f417bf955dc,14bd0844-c829-4325-aa7f-0f417bf955dc,1,0,7f1cd658-ca10-49c6-80ef-b8956f3269ea,7f1cd658-ca10-49c6-80ef-b8956f3269ea,1,0,b0d9086f-cef7-47a8-ad62-d85fea28ebda,b0d9086f-cef7-47a8-ad62-d85fea28ebda,1,0,49c010fc-f5cc-45f4-ba46-132e7661c3dd,49c010fc-f5cc-45f4-ba46-132e7661c3dd,1,0,23d137ad-5b37-40a9-9c9f-3a2cecfb5abb,23d137ad-5b37-40a9-9c9f-3a2cecfb5abb,1,0,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,1,0,2c02a558-8d12-44cf-be6b-9c399b9032e5,2c02a558-8d12-44cf-be6b-9c399b9032e5,1,0,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,1,0,aea031ed-44c1-441b-8ed2-3a790c0263ab,aea031ed-44c1-441b-8ed2-3a790c0263ab,1,0,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,1,0,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,1,0,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,1,0,9c267aa6-5f23-49f6-868a-3324ef2845ff,9c267aa6-5f23-49f6-868a-3324ef2845ff,1,0,495eeeee-d7bf-4063-99e2-86daa066451a,495eeeee-d7bf-4063-99e2-86daa066451a,1,0,b6184698-79e4-4c19-9440-092ccd9dabf8,b6184698-79e4-4c19-9440-092ccd9dabf8,1,0,7d01fc0c-378e-421d-ab70-6a418eed5941,7d01fc0c-378e-421d-ab70-6a418eed5941,1,0,6eeb4867-bf9d-48dc-b96b-934a0c293010,6eeb4867-bf9d-48dc-b96b-934a0c293010,1,0,d2816f95-4809-4727-8ab6-8afd375f5a75,d2816f95-4809-4727-8ab6-8afd375f5a75,1,0,1d49b1bb-5f90-46e4-adcf-55ad46442648,1d49b1bb-5f90-46e4-adcf-55ad46442648,1,0,8d4685b7-ba72-4a28-8182-3104e1330567,8d4685b7-ba72-4a28-8182-3104e1330567,1,0,b91b93f0-29ca-452d-97be-7109fb248e22,b91b93f0-29ca-452d-97be-7109fb248e22,1,0,e1803e54-ec5e-4a82-8097-5e2331820991,e1803e54-ec5e-4a82-8097-5e2331820991,1,0,1bcbf91d-cbbc-4c47-86ed-b2cab62ccbe2,1bcbf91d-cbbc-4c47-86ed-b2cab62ccbe2,1,0,27aebf22-27fe-48d4-a6f4-ea4f6a6714bb,27aebf22-27fe-48d4-a6f4-ea4f6a6714bb,1,0,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,1,0,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,1,0,8506dbe9-7066-444b-83b6-fb2d71a336e7,8506dbe9-7066-444b-83b6-fb2d71a336e7,1,0,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,1,0,932656e8-4011-4250-844b-1fd47abda912,932656e8-4011-4250-844b-1fd47abda912,1,0,6686d828-3129-4d44-a8a2-a64657d424cb,6686d828-3129-4d44-a8a2-a64657d424cb,1,0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,1,0,ce235ab9-1dec-459a-9fec-498c262ece56,ce235ab9-1dec-459a-9fec-498c262ece56,1,0,fb7a9f90-15ef-4121-adff-cd40f699182b,fb7a9f90-15ef-4121-adff-cd40f699182b,1,0,0fa52339-2d11-4c81-92b9-aa27d116134d,0fa52339-2d11-4c81-92b9-aa27d116134d,1,0,26135cf4-fbe1-4f72-a1fd-69e85ec008a6,26135cf4-fbe1-4f72-a1fd-69e85ec008a6,1,0,d83b8068-512d-4c10-88b4-f9b3413a3a81,d83b8068-512d-4c10-88b4-f9b3413a3a81,1,0,b3bbcd07-a593-4591-9d7e-9a990c0acb62,b3bbcd07-a593-4591-9d7e-9a990c0acb62,1,0,b96df5bb-d78a-40ed-a62d-2bf796c59c62,b96df5bb-d78a-40ed-a62d-2bf796c59c62,1,0,073890e5-13eb-4c50-9a6e-3e5507b111b7,073890e5-13eb-4c50-9a6e-3e5507b111b7,1,0,34a4d235-dc56-47e5-91b6-0af887ccdf42,34a4d235-dc56-47e5-91b6-0af887ccdf42,1,0,d60e7164-c686-4c50-b831-a4ee4f505c35,d60e7164-c686-4c50-b831-a4ee4f505c35,1,0,e660c8bf-af5f-4525-a56e-68925d2b96fa,e660c8bf-af5f-4525-a56e-68925d2b96fa,1,0,2fad50a6-6a3e-4f87-ab84-907364427a63,2fad50a6-6a3e-4f87-ab84-907364427a63,1,0,e37aa075-143b-44e9-a2e2-77b3e0f76a77,e37aa075-143b-44e9-a2e2-77b3e0f76a77,1,0,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1df47f0c-7935-481b-9dfb-1f660ea81a2b,1,0,258736e4-93c0-4a46-8caa-75be42c9f006,258736e4-93c0-4a46-8caa-75be42c9f006,1,0,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,3153b2b9-9e3e-4d6b-ab8c-5ccaac78a08a,1,0,56d0acf3-c888-4824-a6e4-27d61fa35415,56d0acf3-c888-4824-a6e4-27d61fa35415,1,0,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,588bd1b2-ee61-4a05-83cd-efb1b82ccb44,1,0,439129dd-ad00-484c-b84a-fb325af979ed,439129dd-ad00-484c-b84a-fb325af979ed,1,0,dcae6376-f44c-421e-87f2-df83413c021e,dcae6376-f44c-421e-87f2-df83413c021e,1,0,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,dbdcdcab-4cd5-44af-b52c-6ce14a26ca9c,1,0,151f2d0a-cc43-490d-ad7d-71390703aa72,151f2d0a-cc43-490d-ad7d-71390703aa72,1,0,2a515a4f-683b-4674-b097-62dd2d940c39,2a515a4f-683b-4674-b097-62dd2d940c39,1,0,d14058f5-dfd4-47eb-ae6d-01b7062f5940,d14058f5-dfd4-47eb-ae6d-01b7062f5940,1,0,90f358ae-9c80-40cf-8e8f-aa02d78a2cdb,90f358ae-9c80-40cf-8e8f-aa02d78a2cdb,1,0,1681dd7a-de80-4b8d-9657-c9702a19d653,1681dd7a-de80-4b8d-9657-c9702a19d653,1,0,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,1,0,fdb5b235-1978-4c2a-a03f-02341df00c3c,fdb5b235-1978-4c2a-a03f-02341df00c3c,1,0,9f593f27-8009-40c0-94d6-53f177ce55f4,9f593f27-8009-40c0-94d6-53f177ce55f4,1,0,917f8d67-2c28-4e02-9453-e1ef9297c9a6,917f8d67-2c28-4e02-9453-e1ef9297c9a6,1,0,38637f61-399a-4966-9e64-4751aecffa31,38637f61-399a-4966-9e64-4751aecffa31,1,0,0f38a18b-a36c-45fe-86c1-396634aaa5df,0f38a18b-a36c-45fe-86c1-396634aaa5df,1,0,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,f2b7b8d0-c0f7-46ba-907a-f8dfa76fc2da,1,0,a81c783d-2dea-4dde-9ca1-7b23d609eb22,a81c783d-2dea-4dde-9ca1-7b23d609eb22,1,0,137ec4ee-5053-47a7-8f5d-f6e63174608f,137ec4ee-5053-47a7-8f5d-f6e63174608f,1,0,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,1,0,4b4f5777-7c36-461e-9d3e-1baaf0497d62,4b4f5777-7c36-461e-9d3e-1baaf0497d62,1,0,8f4d5fc1-5c2c-4202-bb79-a180b03b3267,8f4d5fc1-5c2c-4202-bb79-a180b03b3267,1,0,da881296-fea4-444b-96b2-12cb69d588c7,da881296-fea4-444b-96b2-12cb69d588c7,1,0,03f9d2d0-eae4-4098-a70e-4eb569b11fd9,03f9d2d0-eae4-4098-a70e-4eb569b11fd9,1,0,30031e74-e58a-44a2-98dd-fc8c950831c4,30031e74-e58a-44a2-98dd-fc8c950831c4,1,0,530a3164-4ef1-4b3b-8269-13764ef4bf15,530a3164-4ef1-4b3b-8269-13764ef4bf15,1,0,6df2bb92-558c-4453-9de4-e4176e8f93dc,6df2bb92-558c-4453-9de4-e4176e8f93dc,1,0,3fc019d1-aec8-4835-96c5-3bbf43da0b94,3fc019d1-aec8-4835-96c5-3bbf43da0b94,1,0,5371672a-c8e0-4c12-834e-f23dd885b49a,5371672a-c8e0-4c12-834e-f23dd885b49a,1,0,6417d7c8-6436-4907-98eb-44cd7638f3f1,6417d7c8-6436-4907-98eb-44cd7638f3f1,1,0,1f927f76-5523-4880-9d26-d69a059f2b67,1f927f76-5523-4880-9d26-d69a059f2b67,1,0,27a9c1de-90a9-49f8-8b16-f7ef041ae1de,27a9c1de-90a9-49f8-8b16-f7ef041ae1de,1,0,5c45e96f-e245-4d16-9c47-836505582aef,5c45e96f-e245-4d16-9c47-836505582aef,1,0,2c04d747-c363-4218-92c9-5c83393e928b,2c04d747-c363-4218-92c9-5c83393e928b,1,0,093b8255-7ee5-4463-bd20-542b1d63e799,093b8255-7ee5-4463-bd20-542b1d63e799,1,0,5afb95e0-51a3-4a0f-bea7-e06716421974,5afb95e0-51a3-4a0f-bea7-e06716421974,1,0,2bce3fbe-436b-4a9f-8478-5436d61cd57c,2bce3fbe-436b-4a9f-8478-5436d61cd57c,1,0,ba49877b-6e30-4177-a67c-00e65aa498fb,ba49877b-6e30-4177-a67c-00e65aa498fb,1,0,3d02ca78-c396-4797-909c-e6b910c0ff66,3d02ca78-c396-4797-909c-e6b910c0ff66,1,0,25b39aeb-94c3-4199-9d56-5bd87e325bf2,25b39aeb-94c3-4199-9d56-5bd87e325bf2,1,0,b0b63551-4e83-4201-af9a-b4ab150c43a5,b0b63551-4e83-4201-af9a-b4ab150c43a5,1,0,ca85912b-87b4-481e-9184-017364b4603d,ca85912b-87b4-481e-9184-017364b4603d,1,0,2bd80198-4739-4e8f-9af1-40addc91a05b,2bd80198-4739-4e8f-9af1-40addc91a05b,1,0,80c18959-93f0-46e6-90fd-b564efcaa395,80c18959-93f0-46e6-90fd-b564efcaa395,1,0,c53b9e19-54e4-49b4-ac63-eaeee5c2e040,c53b9e19-54e4-49b4-ac63-eaeee5c2e040,1,0,47afc45d-719e-4740-a8aa-6157c4b1aea8,47afc45d-719e-4740-a8aa-6157c4b1aea8,1,0,2650db63-ca98-4a8a-8c36-165548aa5279,2650db63-ca98-4a8a-8c36-165548aa5279,1,0,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,6a8fdf0a-5dff-49e4-a423-fc80aceeee27,1,0,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,4b9320f1-c7b1-4c08-a832-64ef108d0d6d,1,0,e8c5c961-0633-438d-ba50-d2a774f6b167,e8c5c961-0633-438d-ba50-d2a774f6b167,1,0,48b57d1b-5246-4ce8-9e0f-e369e6add55c,48b57d1b-5246-4ce8-9e0f-e369e6add55c,1,0,b6d891e4-15d6-4b40-b474-a8a1d10231e8,b6d891e4-15d6-4b40-b474-a8a1d10231e8,1,0,e60a7341-3995-4d8c-a3c6-a23ea0137754,e60a7341-3995-4d8c-a3c6-a23ea0137754,1,0,a69525c7-27ff-48df-b26b-325ba580a53e,a69525c7-27ff-48df-b26b-325ba580a53e,1,0,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,24a7de1c-1c1f-4987-91ff-02f78f15dd9e,1,0,8482b31d-0ffa-4a94-9be1-09db8399b70d,8482b31d-0ffa-4a94-9be1-09db8399b70d,1,0,77fe53c2-de9d-4483-97c9-f7d44e137d5e,77fe53c2-de9d-4483-97c9-f7d44e137d5e,1,0,ac7ea771-4b10-4d43-9c0a-9cd36e4c49a4,ac7ea771-4b10-4d43-9c0a-9cd36e4c49a4,1,0,593be64c-6792-46d9-8618-84c50c9ad9e4,593be64c-6792-46d9-8618-84c50c9ad9e4,1,0,208d29cb-040f-4282-b8e8-dda8417b8e92,208d29cb-040f-4282-b8e8-dda8417b8e92,1,0,e57f4619-b5ed-44de-a186-a13a3897731b,e57f4619-b5ed-44de-a186-a13a3897731b,1,0,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,3b78a9d0-7382-4115-a7dc-d06c9a1962d1,1,0,9935d602-668e-4df9-a338-0f542def878b,9935d602-668e-4df9-a338-0f542def878b,1,0,3913f78f-ce34-4ae3-840a-ccdf06319cbb,3913f78f-ce34-4ae3-840a-ccdf06319cbb,1,0,104cf3e3-2104-4ac2-bdc6-792750a63ea0,104cf3e3-2104-4ac2-bdc6-792750a63ea0,1,0,35dee1ee-ca9e-4b6b-9767-1107283f5a04,35dee1ee-ca9e-4b6b-9767-1107283f5a04,1,0,c86aa97a-5898-4cb2-ae62-598bddf8e99f,c86aa97a-5898-4cb2-ae62-598bddf8e99f,1,0,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,cb3a5c5b-7bdc-4e12-96f1-11b1213b6853,1,0,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,e6fe7103-4dfa-4302-a58e-ccd7fac19c9d,1,0,bb3a9973-67ce-479e-8668-c2f3bb20301e,bb3a9973-67ce-479e-8668-c2f3bb20301e,1,0,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,e5250dfe-dda2-4547-9b9e-2470ea1be1ab,1,0,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,2c3fccc6-c4c0-49ec-bfc2-05ce05f27ea9,1,0,37169451-1464-4f24-8ca6-802963ffb636,37169451-1464-4f24-8ca6-802963ffb636,1,0,c3a958b1-590f-4418-a74f-5982b478cf52,c3a958b1-590f-4418-a74f-5982b478cf52,1,0,ef0e618d-0942-460a-ac65-9aca2fed976e,ef0e618d-0942-460a-ac65-9aca2fed976e,1,0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,fd1ed7ec-d848-41cd-8ce3-2e5a682abcf0,1,0,2ac8bd69-9fbf-4f15-b58d-397d9e903532,2ac8bd69-9fbf-4f15-b58d-397d9e903532,1,0,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,2ff35814-7eaa-4ae5-bbac-f46bebb36c9d,1,0,5b460b92-2c74-4f59-88b2-18d9aac42c04,5b460b92-2c74-4f59-88b2-18d9aac42c04,1,0,db05d35b-5f53-4c27-ba80-b477b9a98299,db05d35b-5f53-4c27-ba80-b477b9a98299,1,0,fa872ae1-b699-46fe-9d6a-e42e1388752b,fa872ae1-b699-46fe-9d6a-e42e1388752b,1,0,1acf34e6-c428-4130-82f0-5160dfcc0858,1acf34e6-c428-4130-82f0-5160dfcc0858,1,0,57046262-b9ce-4670-9cf5-6db9e58dd0d5,57046262-b9ce-4670-9cf5-6db9e58dd0d5,1,0,a9824176-36d5-4be5-9984-f4312ff48515,a9824176-36d5-4be5-9984-f4312ff48515,1,0,8e980ca0-1627-45e8-bd27-5dd1ac199459,8e980ca0-1627-45e8-bd27-5dd1ac199459,1,0,8b653beb-af9f-4f39-b691-ae14f80b7cd6,8b653beb-af9f-4f39-b691-ae14f80b7cd6,1,0,77559c11-713f-454d-aff4-56649e1350e9,77559c11-713f-454d-aff4-56649e1350e9,1,0,0c965703-c1d0-48b7-80f9-b8d869ff98f5,0c965703-c1d0-48b7-80f9-b8d869ff98f5,1,0,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,51f8d5ff-aec5-4c0a-ad02-df8c6cb1b4ad,1,0,7ba42162-557b-4e34-8aca-0cdee8cb2452,7ba42162-557b-4e34-8aca-0cdee8cb2452,1,0,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,eee99b8e-29b6-4b7a-81f1-3d91d740c0d7,1,0,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,ad4f2d1f-1e6f-4f6a-8061-202c0e42a8e4,1,0,dd577924-c6cb-4aa9-9db5-366d8958d00f,dd577924-c6cb-4aa9-9db5-366d8958d00f,1,0,8ed8f72e-404a-4be4-a44d-ddebbad5f411,8ed8f72e-404a-4be4-a44d-ddebbad5f411,1,0,e919bc4c-86e6-44f6-be27-5a729b63d042,e919bc4c-86e6-44f6-be27-5a729b63d042,1,0,ec580e4f-1518-4923-a10e-bc1da8688b37,ec580e4f-1518-4923-a10e-bc1da8688b37,1,0,91c3902a-314f-4d40-8bcc-8dd131fed2f4,91c3902a-314f-4d40-8bcc-8dd131fed2f4,1,0,ae2b21c5-9349-49e8-9627-26f05c21f43a,ae2b21c5-9349-49e8-9627-26f05c21f43a,1,0,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,7e4c0b74-e807-4aa9-ad69-3c85b147bb61,1,0,917a19d7-73db-4247-b892-397598d67879,917a19d7-73db-4247-b892-397598d67879,1,0,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1f866dc3-a4bc-4e8d-96a3-a26ee073926f,1,0,d8066600-c669-449d-a187-fdd3af8f7afa,d8066600-c669-449d-a187-fdd3af8f7afa,1,0,dadf86a6-c118-4827-b1b9-6cfee731242f,dadf86a6-c118-4827-b1b9-6cfee731242f,1,0,45bf7b20-f048-491a-a989-e50bea13d028,45bf7b20-f048-491a-a989-e50bea13d028,1,0,9ad3b432-5b49-44ee-9d8d-83c36458d927,9ad3b432-5b49-44ee-9d8d-83c36458d927,1,0,a9967bff-53b9-4295-a253-3647d956d3cb,a9967bff-53b9-4295-a253-3647d956d3cb,1,0,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,75f0fd5b-c594-4f3a-8ff2-3fdadf1dc96d,1,0,b8a31397-8974-44ec-92b0-7cbdc481cf7e,b8a31397-8974-44ec-92b0-7cbdc481cf7e,1,0,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,b29c7c0d-03eb-422b-a899-ba9a7eba99f6,1,0,fb16c4d5-854c-4525-92be-b21fa2df5b0d,fb16c4d5-854c-4525-92be-b21fa2df5b0d,1,0,5771de21-2086-432b-ad91-de14a39bd5bc,5771de21-2086-432b-ad91-de14a39bd5bc,1,0,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,b15bcf3b-0228-4d02-8f20-cd6ba82f7585,1,0,ed96fbfa-bda7-405c-9073-d0b6feffedad,ed96fbfa-bda7-405c-9073-d0b6feffedad,1,0,50c724cb-dde1-4313-9492-b1750bd0afc1,50c724cb-dde1-4313-9492-b1750bd0afc1,1,0,12901981-6106-4471-ab3a-e127c2bb4ebd,12901981-6106-4471-ab3a-e127c2bb4ebd,1,0,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,17ad1497-fa0e-469f-b2e2-b94a6f848ec5,1,0,d5ea5dea-233d-4106-b9ba-f030d4f762ef,d5ea5dea-233d-4106-b9ba-f030d4f762ef,1,0,903af05e-5ac5-46aa-843b-d74f9e417c1d,903af05e-5ac5-46aa-843b-d74f9e417c1d,1,0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,4dc4862e-74c3-469d-863b-09fdbe0d6be0,1,0,a344290a-c9be-47a7-95ad-ced1b52a0995,a344290a-c9be-47a7-95ad-ced1b52a0995,1,0,a4e56049-4de9-40a3-8197-a5c84a11f516,a4e56049-4de9-40a3-8197-a5c84a11f516,1,0,339c9220-fd5b-45d3-b300-cdcc8788f87e,339c9220-fd5b-45d3-b300-cdcc8788f87e,1,0,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,1,0,9042a6de-5048-432d-a448-7e21f2d1d24a,9042a6de-5048-432d-a448-7e21f2d1d24a,1,0,350d46bf-114e-48e7-90c6-6708d949f20d,350d46bf-114e-48e7-90c6-6708d949f20d,1,0,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,1,0,aac20ff3-5873-432e-b763-14411e623d41,aac20ff3-5873-432e-b763-14411e623d41,1,0,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,1,0,6df44466-8750-481a-9baf-c924f0d45353,6df44466-8750-481a-9baf-c924f0d45353,1,0,110121eb-a0eb-4662-8911-3dcc3d341a73,110121eb-a0eb-4662-8911-3dcc3d341a73,1,0,f8980c18-6b9c-4e45-919a-22e976d2a846,f8980c18-6b9c-4e45-919a-22e976d2a846,1,0,c946efb7-c67e-49c1-bf56-d3c2d7220acd,c946efb7-c67e-49c1-bf56-d3c2d7220acd,1,0,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,1,0,6b7c9f74-f2b6-463e-acb9-9f82901986cf,6b7c9f74-f2b6-463e-acb9-9f82901986cf,1,0,fc4c1d64-132b-4687-a37d-05000fdb4ba5,fc4c1d64-132b-4687-a37d-05000fdb4ba5,1,0,528777cd-090b-4b70-82f5-56def98c5893,528777cd-090b-4b70-82f5-56def98c5893,1,0,49dbe467-8832-4ede-9a05-494248619aeb,49dbe467-8832-4ede-9a05-494248619aeb,1,0,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,1,0,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,1,0,09c73108-8528-4970-9b7f-fff9eda7816a,09c73108-8528-4970-9b7f-fff9eda7816a,1,0,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,1,0,f568245a-d158-45dc-af92-2d411f12db7b,f568245a-d158-45dc-af92-2d411f12db7b,1,0,0f17cdac-aa17-45e6-b3d0-220b13345390,0f17cdac-aa17-45e6-b3d0-220b13345390,1,0,c675db75-d0c3-4026-b97c-6b23ecbb336a,c675db75-d0c3-4026-b97c-6b23ecbb336a,1,0,469f67fa-98b0-44b0-abd4-cae136c02834,469f67fa-98b0-44b0-abd4-cae136c02834,1,0,16a18458-999c-420e-80df-8fc10855746c,16a18458-999c-420e-80df-8fc10855746c,1,0,b794f222-0fde-439f-97a3-0da74075b415,b794f222-0fde-439f-97a3-0da74075b415,1,0,3a716aad-9b2c-48a7-b802-80732066391b,3a716aad-9b2c-48a7-b802-80732066391b,1,0,480d959f-aac8-4241-875f-78e1c1f32621,480d959f-aac8-4241-875f-78e1c1f32621,1,0,496e5de8-d75c-4536-9993-75374f070b40,496e5de8-d75c-4536-9993-75374f070b40,1,0,b4e610ba-c9c8-4b25-903b-e567dcbc2556,b4e610ba-c9c8-4b25-903b-e567dcbc2556,1,0,48febdbd-a085-4113-8511-ed7ff6be7d3c,48febdbd-a085-4113-8511-ed7ff6be7d3c,1,0,49413232-c0c3-4983-9d10-291a0399281b,49413232-c0c3-4983-9d10-291a0399281b,1,0,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,1,0,b9b076bb-38ab-4a94-8226-41a4d4d7432c,b9b076bb-38ab-4a94-8226-41a4d4d7432c,1,0,e12da8db-4037-473e-ba2b-d0ceb4534dcb,e12da8db-4037-473e-ba2b-d0ceb4534dcb,1,0,789514e5-8ea3-4a5e-88c5-ed89c4135866,789514e5-8ea3-4a5e-88c5-ed89c4135866,1,0,a16768ff-6137-43d8-8784-4805ed83632a,a16768ff-6137-43d8-8784-4805ed83632a,1,0,61971286-9f94-4a27-aa34-e10848adb70a,61971286-9f94-4a27-aa34-e10848adb70a,1,0,1e75d143-3452-496e-a137-6d7f4c4ed019,1e75d143-3452-496e-a137-6d7f4c4ed019,1,0,e0619d14-c658-4eb5-841a-3a029de28be4,e0619d14-c658-4eb5-841a-3a029de28be4,1,0,99a3b660-7875-47f7-9c6c-c552e5673deb,99a3b660-7875-47f7-9c6c-c552e5673deb,1,0,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,1,0,41cbf934-ea54-41df-abf0-09f319d2e67a,41cbf934-ea54-41df-abf0-09f319d2e67a,1,0,47246084-a5f8-4d0f-b4e2-204c1b97483a,47246084-a5f8-4d0f-b4e2-204c1b97483a,1,0,e58233ec-6cfc-4a8b-9929-689fa69cdb07,e58233ec-6cfc-4a8b-9929-689fa69cdb07,1,0,3291a891-a47c-43ca-b088-aecd3867d38c,3291a891-a47c-43ca-b088-aecd3867d38c,1,0,56cde2b4-00f2-49ba-b407-16e241c17fd2,56cde2b4-00f2-49ba-b407-16e241c17fd2,1,0,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,1,0,219ed110-f2a0-41c1-ac5a-02301b248c54,219ed110-f2a0-41c1-ac5a-02301b248c54,1,0,1c722dfd-2b07-4985-9188-17353de24771,1c722dfd-2b07-4985-9188-17353de24771,1,0,1a630496-2cdd-4c89-a1aa-ed20545ad133,1a630496-2cdd-4c89-a1aa-ed20545ad133,1,0,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,1,0,b19cea0e-e57a-4969-8daf-f48d3d16705f,b19cea0e-e57a-4969-8daf-f48d3d16705f,1,0,d4059340-3361-4baa-ae48-ecbfb9800a2e,d4059340-3361-4baa-ae48-ecbfb9800a2e,1,0,f78f6c43-dd90-4117-acf7-ed5b951cb964,f78f6c43-dd90-4117-acf7-ed5b951cb964,1,0,8eebd519-4989-4784-82b8-39d77eebfb17,8eebd519-4989-4784-82b8-39d77eebfb17,1,0,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,1,0,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,1,0,4527877b-5723-4aa5-8705-98174ac9c337,4527877b-5723-4aa5-8705-98174ac9c337,1,0,d6b21e7b-df57-4280-8c95-c269b5316018,d6b21e7b-df57-4280-8c95-c269b5316018,1,0,808c468b-6322-428d-ac6a-ccf2228b05b6,808c468b-6322-428d-ac6a-ccf2228b05b6,1,0,13664bb2-738f-4d18-b382-a7bcf8105a5a,13664bb2-738f-4d18-b382-a7bcf8105a5a,1,0,f3f56abe-9248-4555-bf99-29560eb4f9ee,f3f56abe-9248-4555-bf99-29560eb4f9ee,1,0,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,1,0,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,1,0,3eb43a06-b32d-4904-8489-6264d0207623,3eb43a06-b32d-4904-8489-6264d0207623,1,0,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,1,0,18615fe1-cfee-4888-9c09-88d1c5db39eb,18615fe1-cfee-4888-9c09-88d1c5db39eb,1,0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,1,0,087c83c0-75e7-476b-b7c6-5be55498a190,087c83c0-75e7-476b-b7c6-5be55498a190,1,0,ec5e5413-9e77-4929-83b8-6fee70688b28,ec5e5413-9e77-4929-83b8-6fee70688b28,1,0,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,1,0,8390c864-2b84-4c45-8583-cb4a4ab49168,8390c864-2b84-4c45-8583-cb4a4ab49168,1,0,1b2fefca-fef5-4319-90cc-325444cb63a6,1b2fefca-fef5-4319-90cc-325444cb63a6,1,0,34a128be-8fbb-4dd8-ac23-9f35041feb63,34a128be-8fbb-4dd8-ac23-9f35041feb63,1,0,baa31006-e0d6-496e-a60e-27b3dfd19397,baa31006-e0d6-496e-a60e-27b3dfd19397,1,0,3007d8ff-3942-45ed-bac5-8a6c40ca060c,3007d8ff-3942-45ed-bac5-8a6c40ca060c,1,0,8bfe1474-fd12-4744-a9ab-3383bfe766b3,8bfe1474-fd12-4744-a9ab-3383bfe766b3,1,0,3af97375-f776-4129-9521-b8d65d795db6,3af97375-f776-4129-9521-b8d65d795db6,1,0,0e98801b-a45b-44cb-a341-7e43d723f6ed,0e98801b-a45b-44cb-a341-7e43d723f6ed,1,0,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,1,0,103ac72d-c386-40ea-89d4-35798d064f1a,103ac72d-c386-40ea-89d4-35798d064f1a,1,0,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,1,0,d1fe15e9-8e5c-4819-85cd-24ab31409437,d1fe15e9-8e5c-4819-85cd-24ab31409437,1,0,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,1,0,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,1,0,74f68bda-17b1-4b3c-aa64-b1014300f9b5,74f68bda-17b1-4b3c-aa64-b1014300f9b5,1,0,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,1,0,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,1,0,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,1,0,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,1,0,47ee7d38-9fa9-458d-abee-e11270f79494,47ee7d38-9fa9-458d-abee-e11270f79494,1,0,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,1,0,076daecf-8fcb-496b-9f13-c4faa3a8a722,076daecf-8fcb-496b-9f13-c4faa3a8a722,1,0,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,1,0,296d7725-bdd3-4210-9db9-31de5711ea9b,296d7725-bdd3-4210-9db9-31de5711ea9b,1,0,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,1,0,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1,0,245c2c6c-7b7f-4381-9304-1d7287a215fa,245c2c6c-7b7f-4381-9304-1d7287a215fa,1,0,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,1,0,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,1,0,8bb5be12-98df-4a38-bffe-432fb13d8101,8bb5be12-98df-4a38-bffe-432fb13d8101,1,0,94209023-ce88-401c-9aff-526fb7e43709,94209023-ce88-401c-9aff-526fb7e43709,1,0,22b99094-b52a-4244-ae91-53848d82560b,22b99094-b52a-4244-ae91-53848d82560b,1,0,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,1,0,b0002134-d5c9-4508-9f0e-97f92461b590,b0002134-d5c9-4508-9f0e-97f92461b590,1,0,1506ec71-cb38-4831-a29d-dac2c4deddda,1506ec71-cb38-4831-a29d-dac2c4deddda,1,0,e05fd82b-b77b-4b7f-b300-43653017f341,e05fd82b-b77b-4b7f-b300-43653017f341,1,0,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,1,0,f15a0526-c207-42fe-aed9-438ae0c4a4b8,f15a0526-c207-42fe-aed9-438ae0c4a4b8,1,0,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,1,0,8583cab0-0620-4346-96e0-bcac40981b8a,8583cab0-0620-4346-96e0-bcac40981b8a,1,0,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,1,0,095990b1-187b-400c-941a-275f272239ca,095990b1-187b-400c-941a-275f272239ca,1,0,ba108470-350d-40c3-bb44-9852c2aa8c97,ba108470-350d-40c3-bb44-9852c2aa8c97,1,0,a37c33fa-64b0-4a1b-846a-0a236bad44f8,a37c33fa-64b0-4a1b-846a-0a236bad44f8,1,0,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,1,0,a50f4324-da44-449b-b500-74228b2aa7e0,a50f4324-da44-449b-b500-74228b2aa7e0,1,0,04236716-9c36-4a1d-b4fb-4b8c65644ab4,04236716-9c36-4a1d-b4fb-4b8c65644ab4,1,0,97276702-6686-4ac4-8360-d85369a08b20,97276702-6686-4ac4-8360-d85369a08b20,1,0,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,1,0,068883fe-d7ae-40e7-ad82-864867916daa,068883fe-d7ae-40e7-ad82-864867916daa,1,0,c1b02568-2095-4f83-8543-2402f67dbe3d,c1b02568-2095-4f83-8543-2402f67dbe3d,1,0,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,1,0,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,1,0,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,1,0,aecbd726-6952-49e6-b544-4c5cc764c24c,aecbd726-6952-49e6-b544-4c5cc764c24c,1,0,d335cfbf-bc78-4274-a178-10f60372474a,d335cfbf-bc78-4274-a178-10f60372474a,1,0,0f4411b3-addf-4fcf-8da8-c5140dea356c,0f4411b3-addf-4fcf-8da8-c5140dea356c,1,0,c501f9ab-d01b-4137-8cd0-e66103117c84,c501f9ab-d01b-4137-8cd0-e66103117c84,1,0,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,1,0,66e65355-1424-4c74-801c-faf5357257aa,66e65355-1424-4c74-801c-faf5357257aa,1,0,0a93187b-7ae4-4985-8089-3099dfec2b48,0a93187b-7ae4-4985-8089-3099dfec2b48,1,0,044458f3-ed9b-4afb-ae73-8f9162c032bf,044458f3-ed9b-4afb-ae73-8f9162c032bf,1,0,578f618e-5f4a-4e86-959d-39b59e973936,578f618e-5f4a-4e86-959d-39b59e973936,1,0,f74ede2e-2d28-4224-ba44-773eda7760a4,f74ede2e-2d28-4224-ba44-773eda7760a4,1,0,217df06a-1bdf-4394-b617-ed756ff17bc6,217df06a-1bdf-4394-b617-ed756ff17bc6,1,0,a1572e97-a487-497a-9062-49315e237e0f,a1572e97-a487-497a-9062-49315e237e0f,1,0,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,1,0,3c5d87a0-cfce-464a-b946-64c5a589a376,3c5d87a0-cfce-464a-b946-64c5a589a376,1,0,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,1,0,763de8d1-7f53-41b6-8d97-7da724e9f763,763de8d1-7f53-41b6-8d97-7da724e9f763,1,0,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,1,0,4ad59c75-cca4-4968-82e6-babd72d8b318,4ad59c75-cca4-4968-82e6-babd72d8b318,1,0,c248de15-63a2-48ec-8695-7a5213d4fc9b,c248de15-63a2-48ec-8695-7a5213d4fc9b,1,0,272ff0f9-7266-4c22-be12-fe62682b56a5,272ff0f9-7266-4c22-be12-fe62682b56a5,1,0,9f141dd5-d866-4c25-b58a-a7766a08b4e7,9f141dd5-d866-4c25-b58a-a7766a08b4e7,1,0,0570d846-889d-4cfc-98fb-a1ad0181597f,0570d846-889d-4cfc-98fb-a1ad0181597f,1,0,19e17c58-953f-4917-8b6a-c88808fcca36,19e17c58-953f-4917-8b6a-c88808fcca36,1,0,4804316d-3765-4a83-8438-10e8e82656db,4804316d-3765-4a83-8438-10e8e82656db,1,0,59458556-e343-4215-8e6c-69f924ec4183,59458556-e343-4215-8e6c-69f924ec4183,1,0,dd553dca-7eba-41bf-8939-2c61e170ff65,dd553dca-7eba-41bf-8939-2c61e170ff65,1,0,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,1,0,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,1,0,8099e978-28cc-4ade-ac5a-3785f3a45f70,8099e978-28cc-4ade-ac5a-3785f3a45f70,1,0,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,1,0,fe023ca5-f11a-4b98-99c1-363508e4ea4a,fe023ca5-f11a-4b98-99c1-363508e4ea4a,1,0,6f8d515e-13d9-45f8-9793-3757f5b85f81,6f8d515e-13d9-45f8-9793-3757f5b85f81,1,0,25ec541c-c437-4318-b2a8-5146df6ae080,25ec541c-c437-4318-b2a8-5146df6ae080,1,0,148754ed-3063-40a7-a3c3-8ad105552370,148754ed-3063-40a7-a3c3-8ad105552370,1,0,ab3f0862-c355-4fd7-a2a7-4eb8278de510,ab3f0862-c355-4fd7-a2a7-4eb8278de510,1,0,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,1,0,c12c3f3b-3a96-4e70-b131-8d7bd765095f,c12c3f3b-3a96-4e70-b131-8d7bd765095f,1,0,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,1,0,c563588c-346e-499e-ae33-9ff3cb62e658,c563588c-346e-499e-ae33-9ff3cb62e658,1,0,40dbc001-97b6-4188-8de9-3adac670bac4,40dbc001-97b6-4188-8de9-3adac670bac4,1,0,58589e42-9ff2-4ad4-bd98-a75ab6873625,58589e42-9ff2-4ad4-bd98-a75ab6873625,1,0,92255ded-6c44-43be-b0b1-fd03c2b78c8b,92255ded-6c44-43be-b0b1-fd03c2b78c8b,1,0,dfe6da42-f024-45c5-beea-ceccaf3a5faa,dfe6da42-f024-45c5-beea-ceccaf3a5faa,1,0,08f3e8f1-284c-4059-864a-42499d48596c,08f3e8f1-284c-4059-864a-42499d48596c,1,0,3d715c1b-9a5e-408d-98d6-5345d274144b,3d715c1b-9a5e-408d-98d6-5345d274144b,1,0,3f88bc69-e140-48b6-a2f9-24f6a391bff2,3f88bc69-e140-48b6-a2f9-24f6a391bff2,1,0,65eb5361-074c-451d-a5d8-d16b6ecccf82,65eb5361-074c-451d-a5d8-d16b6ecccf82,1,0,f7c8cab8-c634-4cf3-9183-c15c915231f8,f7c8cab8-c634-4cf3-9183-c15c915231f8,1,0,563a33a6-9eff-4ff1-9eba-dafc235d2ede,563a33a6-9eff-4ff1-9eba-dafc235d2ede,1,0,fbc21f7d-c272-41ea-b048-c5af294ab5ed,fbc21f7d-c272-41ea-b048-c5af294ab5ed,1,0,088c38fa-1c8f-42e7-aa72-5f5dd8cfc1c6,088c38fa-1c8f-42e7-aa72-5f5dd8cfc1c6,1,0,370f97ee-9aed-4a0a-aefc-647d973e6741,370f97ee-9aed-4a0a-aefc-647d973e6741,1,0,c586d28e-a3ec-4201-8ba0-d453bb7c5293,c586d28e-a3ec-4201-8ba0-d453bb7c5293,1,0,d84f12b0-6e01-4646-9abd-51578716433d,d84f12b0-6e01-4646-9abd-51578716433d,1,0,a4458c18-72eb-4fc0-8dc6-fccab93b0898,a4458c18-72eb-4fc0-8dc6-fccab93b0898,1,0,3a0ceb25-60f5-4fec-ab2e-e667939bfe21,3a0ceb25-60f5-4fec-ab2e-e667939bfe21,1,0,27db4549-df2f-4856-b07f-3c9399cdee9c,27db4549-df2f-4856-b07f-3c9399cdee9c,1,0,f667d49a-8077-450f-9442-2ea4fee7b62d,f667d49a-8077-450f-9442-2ea4fee7b62d,1,0,782b1285-9618-4ec9-b817-ce93e2d24d4d,782b1285-9618-4ec9-b817-ce93e2d24d4d,1,0,dd3e202f-6225-4061-a6ab-f29cd314ab08,dd3e202f-6225-4061-a6ab-f29cd314ab08,1,0,483b7600-e46f-4739-94c8-8637c62750a0,483b7600-e46f-4739-94c8-8637c62750a0,1,0,bdcf5f7a-2888-4143-b46d-1bf0dcc16872,bdcf5f7a-2888-4143-b46d-1bf0dcc16872,1,0,bce8a955-0a0e-4771-9763-4f5d319d9848,bce8a955-0a0e-4771-9763-4f5d319d9848,1,0,090c475c-fb33-46a9-a0ed-fb9d7def2ca5,090c475c-fb33-46a9-a0ed-fb9d7def2ca5,1,0,d10c3389-5bf0-4c73-ab92-786eb19d1676,d10c3389-5bf0-4c73-ab92-786eb19d1676,1,0,c824c20d-7503-4a77-81b8-2a68b20eab68,c824c20d-7503-4a77-81b8-2a68b20eab68,1,0,a0db92c6-b39e-41ab-82e3-161e32f67bda,a0db92c6-b39e-41ab-82e3-161e32f67bda,1,0,88f91187-65d3-4684-992d-20ca29d3755a,88f91187-65d3-4684-992d-20ca29d3755a,1,0,da725701-d4fb-40a4-a63b-feaa8559d8cf,da725701-d4fb-40a4-a63b-feaa8559d8cf,1,0,0a44cfc8-0b55-4aed-990f-e97831494a3c,0a44cfc8-0b55-4aed-990f-e97831494a3c,1,0,c9adbe7c-ca6e-4048-a498-9b48f75d9b45,c9adbe7c-ca6e-4048-a498-9b48f75d9b45,1,0,c7cb80d6-13d9-49af-acdd-6d10dffd1e17,c7cb80d6-13d9-49af-acdd-6d10dffd1e17,1,0,9a3f04d7-b956-4e87-ac28-63f7afba1771,9a3f04d7-b956-4e87-ac28-63f7afba1771,1,0,41b23a18-0c4e-455f-b249-2f2eba8119db,41b23a18-0c4e-455f-b249-2f2eba8119db,1,0,ff697cb8-ab88-4634-94e3-c06a401f71ff,ff697cb8-ab88-4634-94e3-c06a401f71ff,1,0,cf98131d-2b1a-4a07-a8dd-72af01934a8b,cf98131d-2b1a-4a07-a8dd-72af01934a8b,1,0,bef1eead-3f8b-48b7-99f3-46ba332fb60d,bef1eead-3f8b-48b7-99f3-46ba332fb60d,1,0,c1b3d4c8-8c53-4452-bec5-9742bb827d8f,c1b3d4c8-8c53-4452-bec5-9742bb827d8f,1,0,b6e1d584-6817-4f06-b5b2-57037a23ce6f,b6e1d584-6817-4f06-b5b2-57037a23ce6f,1,0,1b5d2ded-3f58-4b3e-8678-48191897e408,1b5d2ded-3f58-4b3e-8678-48191897e408,1,0,62fd5457-0cfd-4273-8965-4b5bf9170209,62fd5457-0cfd-4273-8965-4b5bf9170209,1,0,88701798-0c0e-4d33-a68b-3eddfc25d835,88701798-0c0e-4d33-a68b-3eddfc25d835,1,0,c0d704b5-32de-4bb8-9525-f7d1da828ae5,c0d704b5-32de-4bb8-9525-f7d1da828ae5,1,0,b5b5ee06-4de8-4776-98f0-3e8e1b31985a,b5b5ee06-4de8-4776-98f0-3e8e1b31985a,1,0,2f999502-68e5-4823-8f94-aec98b1a1b1d,2f999502-68e5-4823-8f94-aec98b1a1b1d,1,0,2d064409-7f2a-4d2e-9155-6b34e4373e89,2d064409-7f2a-4d2e-9155-6b34e4373e89,1,0,fc51a562-01bb-47c3-bac5-89f78f64a5f3,fc51a562-01bb-47c3-bac5-89f78f64a5f3,1,0,8a33a6cd-f56d-405b-9515-9fc04d30e27a,8a33a6cd-f56d-405b-9515-9fc04d30e27a,1,0,9b199470-723d-4b72-9fdc-2bed2b7bc483,9b199470-723d-4b72-9fdc-2bed2b7bc483,1,0,5bb9aff1-f4ee-4c02-8e3f-f070bfbb8339,5bb9aff1-f4ee-4c02-8e3f-f070bfbb8339,1,0,6a06f9ee-8832-4e9e-aeba-b4cb9573c048,6a06f9ee-8832-4e9e-aeba-b4cb9573c048,1,0,38fa770e-f38d-4fdf-bb7a-56cfe76a8ab2,38fa770e-f38d-4fdf-bb7a-56cfe76a8ab2,1,0,afc4ce2a-60b6-48d0-ada0-2f651d050888,afc4ce2a-60b6-48d0-ada0-2f651d050888,1,0,5f289266-fc3c-4345-b7ab-cf863e2a6ccd,5f289266-fc3c-4345-b7ab-cf863e2a6ccd,1,0,5932f0d8-9012-4382-8c72-b1a5f4fbc937,5932f0d8-9012-4382-8c72-b1a5f4fbc937,1,0,66f1ff23-8fec-4be4-914c-43b7dee1c2a2,66f1ff23-8fec-4be4-914c-43b7dee1c2a2,1,0,56c3471e-459a-46ba-96ea-9f872b3ad54a,56c3471e-459a-46ba-96ea-9f872b3ad54a,1,0,2113195b-1553-4137-9e45-2cc62c72ee47,2113195b-1553-4137-9e45-2cc62c72ee47,1,0,1250f5b1-c766-434c-8d28-69b74a536294,1250f5b1-c766-434c-8d28-69b74a536294,1,0,80bc9b8b-7b17-4dbb-bca6-8465d6b01e0b,80bc9b8b-7b17-4dbb-bca6-8465d6b01e0b,1,0,6327e23d-6070-4b64-81c6-0d1a33eaae93,6327e23d-6070-4b64-81c6-0d1a33eaae93,1,0,4d086a1f-34e0-43f9-9401-d82e55746a9d,4d086a1f-34e0-43f9-9401-d82e55746a9d,1,0,5a4c543a-27d5-423b-a4d0-3952ea2817af,5a4c543a-27d5-423b-a4d0-3952ea2817af,1,0,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,1,0,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,1,0,93aa5247-6823-4f70-9d47-e5a0f409828a,93aa5247-6823-4f70-9d47-e5a0f409828a,1,0,48659b94-ace8-45f4-a043-6b2731ec6925,48659b94-ace8-45f4-a043-6b2731ec6925,1,0,3a8e60f9-19cb-42a6-a448-ad211261d9b8,3a8e60f9-19cb-42a6-a448-ad211261d9b8,1,0,74320602-094a-4645-b2c9-3053377a3ac3,74320602-094a-4645-b2c9-3053377a3ac3,1,0,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,1,0,b066c732-9c5f-4504-894f-96d457b0768f,b066c732-9c5f-4504-894f-96d457b0768f,1,0,9366463d-aa8a-4e89-86d8-c7f746f9551b,9366463d-aa8a-4e89-86d8-c7f746f9551b,1,0,e25da569-d435-45b2-b4e8-fc76d7f1c8df,e25da569-d435-45b2-b4e8-fc76d7f1c8df,1,0,a51a7f57-9c52-4457-819c-13e1b6f886e1,a51a7f57-9c52-4457-819c-13e1b6f886e1,1,0,7d08daba-5e36-4ce3-8a70-17750959b89e,7d08daba-5e36-4ce3-8a70-17750959b89e,1,0,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,1,0,39344a8c-2662-48ff-937b-12951bb268fb,39344a8c-2662-48ff-937b-12951bb268fb,1,0,b577663f-ead2-4b18-a4f6-f7f303e89319,b577663f-ead2-4b18-a4f6-f7f303e89319,1,0,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,1,0,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,1,0,72663843-4010-42ed-989b-0b58bf9f7146,72663843-4010-42ed-989b-0b58bf9f7146,1,0,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,1,0,3adcceea-867e-4b88-a633-4f8d4ccb43c0,3adcceea-867e-4b88-a633-4f8d4ccb43c0,1,0,a132189c-6584-4bb1-9cfd-1415cd83228a,a132189c-6584-4bb1-9cfd-1415cd83228a,1,0,7ba50e13-0a78-4cca-821f-006b1c83b0b0,7ba50e13-0a78-4cca-821f-006b1c83b0b0,1,0,a3670f95-5abe-49ee-8ea5-d7e4438801ba,a3670f95-5abe-49ee-8ea5-d7e4438801ba,1,0,4443dea1-5143-4e76-97a7-c35dbe1665e4,4443dea1-5143-4e76-97a7-c35dbe1665e4,1,0,0d780521-0767-425a-b44d-315d2dc42d04,0d780521-0767-425a-b44d-315d2dc42d04,1,0,c5b1572d-28f5-42f3-b2e0-8b54f091642e,c5b1572d-28f5-42f3-b2e0-8b54f091642e,1,0,0986c1b6-b677-428d-b49f-a93e40e77171,0986c1b6-b677-428d-b49f-a93e40e77171,1,0,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,1,0,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,1,0,b6662b2e-7e93-4eaa-9e4b-b5647285932b,b6662b2e-7e93-4eaa-9e4b-b5647285932b,1,0,4a180f2c-dc54-4591-8f62-f236d1e07799,4a180f2c-dc54-4591-8f62-f236d1e07799,1,0,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,1,0,a9a51e79-4c79-4a43-931b-c0321c1cd65b,a9a51e79-4c79-4a43-931b-c0321c1cd65b,1,0,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,1,0,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,1,0,22f2696e-0ac1-4a74-bca9-987b267b2b59,22f2696e-0ac1-4a74-bca9-987b267b2b59,1,0,d705cacc-3485-46d7-9ff4-48c3c0757c81,d705cacc-3485-46d7-9ff4-48c3c0757c81,1,0,98f043ea-633c-4a03-a56f-efbc9e6ef288,98f043ea-633c-4a03-a56f-efbc9e6ef288,1,0,2033b92a-0750-478a-a12d-cf4f74d0a9da,2033b92a-0750-478a-a12d-cf4f74d0a9da,1,0,92fa2196-d8e5-45f9-9d2e-59d837b163ea,92fa2196-d8e5-45f9-9d2e-59d837b163ea,1,0,25dc2290-e283-4449-81c1-1ce15b58067f,25dc2290-e283-4449-81c1-1ce15b58067f,1,0,c534a865-a17f-41e7-88b9-c6af89c9d202,c534a865-a17f-41e7-88b9-c6af89c9d202,1,0,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,1,0,0127937c-94c0-43fe-9630-cc2ec6904ad8,0127937c-94c0-43fe-9630-cc2ec6904ad8,1,0,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,1,0,8df5b3cd-7788-4198-a530-e88be83f1cdf,8df5b3cd-7788-4198-a530-e88be83f1cdf,1,0,ffaeea66-66d5-4741-a9b5-875afebfce7f,ffaeea66-66d5-4741-a9b5-875afebfce7f,1,0,8f6b6576-1d21-46c1-905c-f1685f0eee7a,8f6b6576-1d21-46c1-905c-f1685f0eee7a,1,0,06827a85-a9d1-472e-8087-906ff94a4adc,06827a85-a9d1-472e-8087-906ff94a4adc,1,0,bb3954de-5eaa-4ec0-931b-a1a9f233c120,bb3954de-5eaa-4ec0-931b-a1a9f233c120,1,0,10689022-cbbb-4134-901f-1e778fac2693,10689022-cbbb-4134-901f-1e778fac2693,1,0,f14e363f-512b-4658-afb5-10c3be5ff870,f14e363f-512b-4658-afb5-10c3be5ff870,1,0,4d211427-4494-45d4-ae84-38235f35eaef,4d211427-4494-45d4-ae84-38235f35eaef,1,0,f7784993-d95c-4652-9894-3cf67aeabeb8,f7784993-d95c-4652-9894-3cf67aeabeb8,1,0,485d8b29-79b1-4798-a742-75546ddb7262,485d8b29-79b1-4798-a742-75546ddb7262,1,0,e248de85-8f76-4471-ab3d-d35514b69b78,e248de85-8f76-4471-ab3d-d35514b69b78,1,0,8928ce42-2b12-402f-8115-98b5655db556,8928ce42-2b12-402f-8115-98b5655db556,1,0,9b62c109-7b52-4803-83e6-a5413cd00984,9b62c109-7b52-4803-83e6-a5413cd00984,1,0,cddb4bb0-22ec-49ae-b332-62d7307b93fe,cddb4bb0-22ec-49ae-b332-62d7307b93fe,1,0,72876709-806e-4406-b9c1-b8117f4d750a,72876709-806e-4406-b9c1-b8117f4d750a,1,0,b1efafef-74cc-4d36-a32c-b472712f11f3,b1efafef-74cc-4d36-a32c-b472712f11f3,1,0,ceb05584-1ecd-4681-8575-c0452f95b685,ceb05584-1ecd-4681-8575-c0452f95b685,1,0,03d08c14-f814-4e12-8f96-020c36cca2bf,03d08c14-f814-4e12-8f96-020c36cca2bf,1,0,a1a7aab6-cf35-42ce-97bb-c112638a2748,a1a7aab6-cf35-42ce-97bb-c112638a2748,1,0,4e36184e-d818-4f38-9257-6d91d9cc85ae,4e36184e-d818-4f38-9257-6d91d9cc85ae,1,0,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,1,0,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,1,0,3893a258-a9c7-441a-b80c-1cc8c3f4735c,3893a258-a9c7-441a-b80c-1cc8c3f4735c,1,0,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,1,0,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,1,0,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,1,0,b9a6b053-2b93-4946-9531-040d3131dcc5,b9a6b053-2b93-4946-9531-040d3131dcc5,1,0,9f36d26e-aa71-44d5-ac27-9aaa643555c3,9f36d26e-aa71-44d5-ac27-9aaa643555c3,1,0,87b8b5d7-d3d6-450a-adb1-5c875257ec80,87b8b5d7-d3d6-450a-adb1-5c875257ec80,1,0,e3640efe-e46c-4588-b251-dda23bf0641d,e3640efe-e46c-4588-b251-dda23bf0641d,1,0,b46b5090-5eb1-4950-9031-8b43f611fa9c,b46b5090-5eb1-4950-9031-8b43f611fa9c,1,0,522a4bff-34d3-46b2-8c66-0b30d881a86e,522a4bff-34d3-46b2-8c66-0b30d881a86e,1,0,3d7908b1-bd82-475e-8488-fafcbe3458ee,3d7908b1-bd82-475e-8488-fafcbe3458ee,1,0,8a6cdb21-4eff-46dc-b928-738199f54581,8a6cdb21-4eff-46dc-b928-738199f54581,1,0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1bac040b-83e4-402f-a9bf-d6a7b10c91e0,1,0,e9c632b0-7977-4e44-ac56-882617ad7cdc,e9c632b0-7977-4e44-ac56-882617ad7cdc,1,0,e84acba7-7e0f-43e8-a545-6e53d529d5d4,e84acba7-7e0f-43e8-a545-6e53d529d5d4,1,0,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,1,0,0f9c08c2-e7fa-4ea0-a935-f927feb01131,0f9c08c2-e7fa-4ea0-a935-f927feb01131,1,0,6086d53f-f1b2-4126-ab46-64705fe63b87,6086d53f-f1b2-4126-ab46-64705fe63b87,1,0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,62a6b1c9-8288-4fa1-a17d-241b85a5e4b0,1,0,57069b56-f732-41c0-9a75-cbdb1e88556c,57069b56-f732-41c0-9a75-cbdb1e88556c,1,0,cf80ff0d-9add-4fa5-bba2-00d43fce5ed8,cf80ff0d-9add-4fa5-bba2-00d43fce5ed8,1,0,d927f1f0-df5f-44a1-bbfd-152ebf1559dd,d927f1f0-df5f-44a1-bbfd-152ebf1559dd,1,0,7ce7aec1-fa24-4dd7-8754-8124e78521bf,7ce7aec1-fa24-4dd7-8754-8124e78521bf,1,0,8b115575-9d8b-42f8-9ec8-0825a4397c7f,8b115575-9d8b-42f8-9ec8-0825a4397c7f,1,0,40fa5847-28f0-41ff-bfb8-ec33c8626d33,40fa5847-28f0-41ff-bfb8-ec33c8626d33,1,0,6d042890-27b2-4efc-935e-8190bb57c037,6d042890-27b2-4efc-935e-8190bb57c037,1,0,23e79add-7f1c-422a-9df1-8f76ebf805df,23e79add-7f1c-422a-9df1-8f76ebf805df,1,0,9295d88f-0865-440c-a98a-4710c50211be,9295d88f-0865-440c-a98a-4710c50211be,1,0,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,1,0,5299d417-02c6-4f73-9c0c-8c22d267ab99,5299d417-02c6-4f73-9c0c-8c22d267ab99,1,0,38ac9a13-665a-4201-b5cc-687fe4a01130,38ac9a13-665a-4201-b5cc-687fe4a01130,1,0,97c59096-b2dc-45d0-a580-b3018a04f9af,97c59096-b2dc-45d0-a580-b3018a04f9af,1,0,8172256e-f51e-4de0-bd07-3668785f4cb9,8172256e-f51e-4de0-bd07-3668785f4cb9,1,0,5dcd8e28-b058-405a-bac4-defab7d4b789,5dcd8e28-b058-405a-bac4-defab7d4b789,1,0,6fbf63b7-1692-495e-a8ec-bdda182997a3,6fbf63b7-1692-495e-a8ec-bdda182997a3,1,0,4a2c2478-03ad-4521-9356-09ee07fce972,4a2c2478-03ad-4521-9356-09ee07fce972,1,0,077af11c-fd3c-4e87-b169-5f3137464f77,077af11c-fd3c-4e87-b169-5f3137464f77,1,0,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,1,0,da8f7f30-eb80-44db-a451-348306c90cd8,da8f7f30-eb80-44db-a451-348306c90cd8,1,0,879304f7-9507-4fb8-9177-355428d6bba9,879304f7-9507-4fb8-9177-355428d6bba9,1,0,efb50581-cc7e-47ac-bfa2-86da2860bf1d,efb50581-cc7e-47ac-bfa2-86da2860bf1d,1,0,fd07f403-1116-4102-a1bf-35abb03ad493,fd07f403-1116-4102-a1bf-35abb03ad493,1,0,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,1,0,0722315c-9217-4ecf-80ff-d1ee89f84a53,0722315c-9217-4ecf-80ff-d1ee89f84a53,1,0,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,1,0,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,1,0,a2f943a4-05a3-4eb6-9a10-74b6859469a6,a2f943a4-05a3-4eb6-9a10-74b6859469a6,1,0,c172aeaf-b444-47c0-baee-80ccd91fe934,c172aeaf-b444-47c0-baee-80ccd91fe934,1,0,757ea742-8c14-4e0a-a867-432eee5cfc64,757ea742-8c14-4e0a-a867-432eee5cfc64,1,0,b8c36d5a-7966-4978-9225-67502b9c60a4,b8c36d5a-7966-4978-9225-67502b9c60a4,1,0,747f1c23-3c03-456e-864e-fc714484b7d6,747f1c23-3c03-456e-864e-fc714484b7d6,1,0,9847676d-f44d-46a0-83e2-4a43a835caf8,9847676d-f44d-46a0-83e2-4a43a835caf8,1,0,43c18cae-21a9-413b-a350-d5cf826980f0,43c18cae-21a9-413b-a350-d5cf826980f0,1,0,16773cdb-b979-42d5-a2a5-d4b79e8737bd,16773cdb-b979-42d5-a2a5-d4b79e8737bd,1,0,c28a190a-f487-4e99-b8f8-6928268086f8,c28a190a-f487-4e99-b8f8-6928268086f8,1,0,94e02f76-8656-4999-9470-dd996118400c,94e02f76-8656-4999-9470-dd996118400c,1,0,9effd265-3783-44e2-8698-80dd82137546,9effd265-3783-44e2-8698-80dd82137546,1,0,bef52020-98f8-465b-8981-e5f8eed62308,bef52020-98f8-465b-8981-e5f8eed62308,1,0,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,1,0,e731dab7-df9e-48ae-8542-4c0c30666ae9,e731dab7-df9e-48ae-8542-4c0c30666ae9,1,0,f321e378-6d50-4567-8434-813f367d3a65,f321e378-6d50-4567-8434-813f367d3a65,1,0,27246fd8-a8a3-4244-b49a-c0372a812167,27246fd8-a8a3-4244-b49a-c0372a812167,1,0,7d91ff3c-1ec2-41d0-9d38-fa8f8534c55c,7d91ff3c-1ec2-41d0-9d38-fa8f8534c55c,1,0,6da15c1d-e144-472e-9a3a-2797c7df16e4,6da15c1d-e144-472e-9a3a-2797c7df16e4,1,0,350a7b29-4ba3-43c4-b77d-47085f53d760,350a7b29-4ba3-43c4-b77d-47085f53d760,1,0,a151715d-c89e-4e4c-b8fd-d7d6ad71e603,a151715d-c89e-4e4c-b8fd-d7d6ad71e603,1,0,f6d6f1b9-3956-4fdb-bbb0-5d81f083a072,f6d6f1b9-3956-4fdb-bbb0-5d81f083a072,1,0,a5dd4200-0f25-452d-9014-3b1506c31557,a5dd4200-0f25-452d-9014-3b1506c31557,1,0,c48c091c-0d46-4d1f-bc84-72b0537c7ec2,c48c091c-0d46-4d1f-bc84-72b0537c7ec2,1,0,122a94c7-bb89-4f11-b583-b56808c1df47,122a94c7-bb89-4f11-b583-b56808c1df47,1,0,f4371f32-95a5-40f4-bc5e-a5b9a12a86eb,f4371f32-95a5-40f4-bc5e-a5b9a12a86eb,1,0,5f434c45-a5ff-4a07-8662-6a592298c7e9,5f434c45-a5ff-4a07-8662-6a592298c7e9,1,0,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,1,0,bde05768-2dd6-4800-985d-27075f610cca,bde05768-2dd6-4800-985d-27075f610cca,1,0,d18956cf-e449-48cc-a127-01b5dc910ea2,d18956cf-e449-48cc-a127-01b5dc910ea2,1,0,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,1,0,5d338e31-a56b-45f0-8a62-0270ca543f6a,5d338e31-a56b-45f0-8a62-0270ca543f6a,1,0,afd8251f-548b-4bb6-8ad0-4f412bec7cb6,afd8251f-548b-4bb6-8ad0-4f412bec7cb6,1,0,e352fc19-96be-4410-a516-bc58cc234422,e352fc19-96be-4410-a516-bc58cc234422,1,0,9b742da4-1696-4c06-9dfa-dd85c9286c74,9b742da4-1696-4c06-9dfa-dd85c9286c74,1,0,db1062bc-4164-4095-9640-9804c0ebcd0b,db1062bc-4164-4095-9640-9804c0ebcd0b,1,0,c11d967b-1250-4345-90b0-011a96c5ae5e,c11d967b-1250-4345-90b0-011a96c5ae5e,1,0,ea7c61ff-745c-4908-9a94-bba022d12de4,ea7c61ff-745c-4908-9a94-bba022d12de4,1,0,24eed105-f612-4340-ad79-388a7b39b58c,24eed105-f612-4340-ad79-388a7b39b58c,1,0,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,8e4bd2ac-d555-490e-87ab-1b0cdd6f72e9,1,0,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,1,0,53caada5-1d53-45dc-9432-90075ddca890,53caada5-1d53-45dc-9432-90075ddca890,1,0,d1472d23-954b-4069-b2d6-df08c6ec0be1,d1472d23-954b-4069-b2d6-df08c6ec0be1,1,0,93fe2ce6-7193-42bc-a966-4653b7989eaa,93fe2ce6-7193-42bc-a966-4653b7989eaa,1,0,65678df4-a323-451f-98ba-305a74fc5805,65678df4-a323-451f-98ba-305a74fc5805,1,0,6a2add61-edb7-4561-bae9-06b3741e7726,6a2add61-edb7-4561-bae9-06b3741e7726,1,0,a7fe0aa5-722c-4a09-889b-ee422421addc,a7fe0aa5-722c-4a09-889b-ee422421addc,1,0,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,1,0,b572b1d0-4404-421c-9950-1cc1342ca5f3,b572b1d0-4404-421c-9950-1cc1342ca5f3,1,0,0c838a31-2b08-447c-b39a-a613cfba526c,0c838a31-2b08-447c-b39a-a613cfba526c,1,0,02082174-7276-4256-b9bb-9872065a01c4,02082174-7276-4256-b9bb-9872065a01c4,1,0,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,1,0,b1230b96-f4c8-4311-bfc0-df33bcc41394,b1230b96-f4c8-4311-bfc0-df33bcc41394,1,0,670c62c1-1a33-4dec-9540-5b4c1fe29074,670c62c1-1a33-4dec-9540-5b4c1fe29074,1,0,cc664d81-d0af-4d25-ae29-64f422e51bf2,cc664d81-d0af-4d25-ae29-64f422e51bf2,1,0,ae3876e2-bd06-415b-9d9a-b77d787be09e,ae3876e2-bd06-415b-9d9a-b77d787be09e,1,0,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,0cf49621-afc5-4c8d-a1b5-f8c30db9f415,1,0,4718392b-477c-496b-9d28-ddbdaa7a04f2,4718392b-477c-496b-9d28-ddbdaa7a04f2,1,0,879844f0-30b4-47f5-8d2e-5fea29910368,879844f0-30b4-47f5-8d2e-5fea29910368,1,0,303334ba-2785-47fe-a094-84f9dea33be2,303334ba-2785-47fe-a094-84f9dea33be2,1,0,04424730-6992-4a5b-838b-7a7c16dedbd0,04424730-6992-4a5b-838b-7a7c16dedbd0,1,0,1260b5dd-0a74-43df-bdbb-215b253da28e,1260b5dd-0a74-43df-bdbb-215b253da28e,1,0,e37a7cf1-a7b5-4b6e-b818-0915598c8505,e37a7cf1-a7b5-4b6e-b818-0915598c8505,1,0,240bec31-cd59-477b-8459-8e3278da22dc,240bec31-cd59-477b-8459-8e3278da22dc,1,0,f3abaf8e-0230-43db-aaf0-716fc02047eb,f3abaf8e-0230-43db-aaf0-716fc02047eb,1,0,b76c3bd6-924a-4378-acbe-6f17232b201b,b76c3bd6-924a-4378-acbe-6f17232b201b,1,0,e0519f0c-9c99-4f5c-a3a9-27adce45737d,e0519f0c-9c99-4f5c-a3a9-27adce45737d,1,0,554320a0-55dc-4289-bb08-63d405cb4ca5,554320a0-55dc-4289-bb08-63d405cb4ca5,1,0,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,45eec13d-e5e5-4a2e-ad6c-2780bde15ef2,1,0,3b1d0974-6031-4841-b632-aadd4ff13b2c,3b1d0974-6031-4841-b632-aadd4ff13b2c,1,0,0874a3c0-0d16-4172-b467-f0666d5fcaee,0874a3c0-0d16-4172-b467-f0666d5fcaee,1,0,9d358304-3fd0-4ec6-9400-cc498ff2f751,9d358304-3fd0-4ec6-9400-cc498ff2f751,1,0,cc380a19-ab29-4f20-93ad-9a58cd4de56e,cc380a19-ab29-4f20-93ad-9a58cd4de56e,1,0,6a5f7521-270e-476e-88ec-a8cf79ea61a6,6a5f7521-270e-476e-88ec-a8cf79ea61a6,1,0,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,1,0,74067eee-6cd4-4ae3-becc-457ecb51dc9a,74067eee-6cd4-4ae3-becc-457ecb51dc9a,1,0,e54a8786-86a4-48e3-a210-aaae4e5fce8c,e54a8786-86a4-48e3-a210-aaae4e5fce8c,1,0,86c86ea2-d14e-4443-b36c-c1c17c4f768a,86c86ea2-d14e-4443-b36c-c1c17c4f768a,1,0,14512818-58b0-44cc-b00d-d37913c57aad,14512818-58b0-44cc-b00d-d37913c57aad,1,0,077e2c42-bc3b-48bf-bbc2-41effe20f613,077e2c42-bc3b-48bf-bbc2-41effe20f613,1,0,57964dd6-4b0b-4590-bc44-de744cc423af,57964dd6-4b0b-4590-bc44-de744cc423af,1,0,f5bb88eb-c239-4ae3-a297-dfbbd679e008,f5bb88eb-c239-4ae3-a297-dfbbd679e008,1,0,c888ccc1-9116-4b88-b950-aeabd54191c0,c888ccc1-9116-4b88-b950-aeabd54191c0,1,0,ff4d92a7-5fa3-4a46-a6f5-47c3952edb22,ff4d92a7-5fa3-4a46-a6f5-47c3952edb22,1,0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,bb350b39-1f4d-460a-98c9-8d2308cf22f0,1,0,eaeb5aa8-8edf-4f74-8011-2d476f543bf6,eaeb5aa8-8edf-4f74-8011-2d476f543bf6,1,0,343b979a-97e3-4eac-a314-3bd3eea9c15c,343b979a-97e3-4eac-a314-3bd3eea9c15c,1,0,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,b2f17ef1-3f6f-4029-b3e2-28d6b79c5b76,1,0,7adced5f-3a5f-419a-926c-0452aad86c86,7adced5f-3a5f-419a-926c-0452aad86c86,1,0,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,1,0,7433b2a9-f634-4af7-ac85-6aa1280ea239,7433b2a9-f634-4af7-ac85-6aa1280ea239,1,0,9f32e85c-2ed6-41db-b0ec-6d8596940e80,9f32e85c-2ed6-41db-b0ec-6d8596940e80,1,0,f259b6b4-d582-429f-a16f-027a6bcb7438,f259b6b4-d582-429f-a16f-027a6bcb7438,1,0,46e0522b-b88b-43b2-9067-a5359e90994b,46e0522b-b88b-43b2-9067-a5359e90994b,1,0,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,1,0,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,1,0,72d41d01-9c9d-4fbe-8a39-932d82d171ef,72d41d01-9c9d-4fbe-8a39-932d82d171ef,1,0,f4afd271-64de-4a6d-b0ef-f27db4d66d32,f4afd271-64de-4a6d-b0ef-f27db4d66d32,1,0,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,1,0,697d5715-dd04-40be-9b28-539734725158,697d5715-dd04-40be-9b28-539734725158,1,0,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,1,0,d95fcb37-fc65-466d-93e2-489f41683276,d95fcb37-fc65-466d-93e2-489f41683276,1,0,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,1,0,a27a9296-46bb-49a1-8308-db675baa81d0,a27a9296-46bb-49a1-8308-db675baa81d0,1,0,1456f317-360c-4190-b2d1-1be7484369a5,1456f317-360c-4190-b2d1-1be7484369a5,1,0,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,1,0,4867948f-b027-44ae-b78c-a94e00eed52b,4867948f-b027-44ae-b78c-a94e00eed52b,1,0,aa0c32ae-da52-4df9-8b77-99ea31f8df81,aa0c32ae-da52-4df9-8b77-99ea31f8df81,1,0,d7dcd391-3a0e-4aa9-9b53-467a1de67593,d7dcd391-3a0e-4aa9-9b53-467a1de67593,1,0,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,1,0,ef044879-e731-418a-b917-6a685f27c5f4,ef044879-e731-418a-b917-6a685f27c5f4,1,0,618d13d5-fd1f-4b70-ad45-dd6a17a50730,618d13d5-fd1f-4b70-ad45-dd6a17a50730,1,0,0248a6c4-7ce5-4898-bb1d-9ad9509e6795,0248a6c4-7ce5-4898-bb1d-9ad9509e6795,1,0,6a5b9e7f-c368-40d8-812a-64f68ea1ef9d,6a5b9e7f-c368-40d8-812a-64f68ea1ef9d,1,0,58037b76-b548-4f07-bd67-67e552a5c6e5,58037b76-b548-4f07-bd67-67e552a5c6e5,1,0,68f19104-5fa3-4f28-a84b-bf68c3bed49b,68f19104-5fa3-4f28-a84b-bf68c3bed49b,1,0,f88ccd7a-8d15-4b24-addf-da522a0b4a43,f88ccd7a-8d15-4b24-addf-da522a0b4a43,1,0,00e48a23-eb5b-4a29-b36c-218ab9760f23,00e48a23-eb5b-4a29-b36c-218ab9760f23,1,0,331db120-ba88-4eb3-a8ec-10691be82e2d,331db120-ba88-4eb3-a8ec-10691be82e2d,1,0,349378d1-abe3-44de-84a4-d525b08e0474,349378d1-abe3-44de-84a4-d525b08e0474,1,0,1526b18d-7fab-414e-a5b2-377b67ac0b55,1526b18d-7fab-414e-a5b2-377b67ac0b55,1,0,c561fe6b-53ea-435b-a230-1850e2dc1ff5,c561fe6b-53ea-435b-a230-1850e2dc1ff5,1,0,aba7605f-6baf-42a8-b5ad-8f71c780b81f,aba7605f-6baf-42a8-b5ad-8f71c780b81f,1,0,8fc19eca-1a15-4758-af4b-79637e51edfb,8fc19eca-1a15-4758-af4b-79637e51edfb,1,0,b0e0a273-2613-4d5e-9901-df7893af4c74,b0e0a273-2613-4d5e-9901-df7893af4c74,1,0,4ad1ef06-d8b4-46da-b536-d23c40e85497,4ad1ef06-d8b4-46da-b536-d23c40e85497,1,0,be9144ce-5560-47bb-8c5e-9beefd15bfc3,be9144ce-5560-47bb-8c5e-9beefd15bfc3,1,0,ad09d1e6-5982-4e1c-864e-452ac5b2915a,ad09d1e6-5982-4e1c-864e-452ac5b2915a,1,0,caea53be-d2f7-4109-8017-d2bfdfde8c6f,caea53be-d2f7-4109-8017-d2bfdfde8c6f,1,0,60f30706-9919-4767-a17c-660754b9d542,60f30706-9919-4767-a17c-660754b9d542,1,0,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,1,0,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,c0bc4cc4-b5ca-47c2-b589-c0d25bb63f1e,1,0,35823167-b658-4563-8d01-b0aab05aa619,35823167-b658-4563-8d01-b0aab05aa619,1,0,9ee03c48-c338-4655-9095-d490231df2a3,9ee03c48-c338-4655-9095-d490231df2a3,1,0,94928ba3-6bbf-4bd3-94cf-9c51b50e005f,94928ba3-6bbf-4bd3-94cf-9c51b50e005f,1,0,3924c17c-6ee3-4406-8023-0a79a242e389,3924c17c-6ee3-4406-8023-0a79a242e389,1,0,84a159ed-bc5f-4497-94d1-94b187b0bffe,84a159ed-bc5f-4497-94d1-94b187b0bffe,1,0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,0a126b0d-28c8-4ed4-836f-e39e17693ad0,1,0,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,1,0,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,bf75c4de-b36a-4a7f-8d84-9fa3d020a6cb,1,0,f95adb50-fa0b-434c-93dd-b7fd211220b7,f95adb50-fa0b-434c-93dd-b7fd211220b7,1,0,e590825f-10c6-4fdd-98cd-3da01da2ed4f,e590825f-10c6-4fdd-98cd-3da01da2ed4f,1,0,2233ce53-b8a8-4c83-97a2-683c8575462a,2233ce53-b8a8-4c83-97a2-683c8575462a,1,0,b938ff17-e31c-4762-a96f-e1288f746a1d,b938ff17-e31c-4762-a96f-e1288f746a1d,1,0,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,d6a5083f-ca9a-42ed-b202-2983e4ba21c2,1,0,bd69bf55-dee0-4553-8f90-5fd025c0f773,bd69bf55-dee0-4553-8f90-5fd025c0f773,1,0,2071f210-dc13-43c0-a58e-b982821d6842,2071f210-dc13-43c0-a58e-b982821d6842,1,0,bea697f4-46a8-4698-ac60-64326e442f2b,bea697f4-46a8-4698-ac60-64326e442f2b,1,0,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,1,0,f415296e-fceb-4835-abe9-17bb17a5d5e5,f415296e-fceb-4835-abe9-17bb17a5d5e5,1,0,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,1,0,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,1,0,19056365-9ff1-4733-876e-a7ebdbbe0557,19056365-9ff1-4733-876e-a7ebdbbe0557,1,0,c8679d82-075c-4556-8231-c004d144fe61,c8679d82-075c-4556-8231-c004d144fe61,1,0,5e09dc5e-bbb7-4c38-b609-940c24f63c84,5e09dc5e-bbb7-4c38-b609-940c24f63c84,1,0,017b28eb-8ba9-465e-a748-20eadbeb4ea2,017b28eb-8ba9-465e-a748-20eadbeb4ea2,1,0,c0bb2d66-94c9-4bc6-afd5-534075e8395b,c0bb2d66-94c9-4bc6-afd5-534075e8395b,1,0,db7cc693-1645-4416-a9d9-5a7584cd3bbc,db7cc693-1645-4416-a9d9-5a7584cd3bbc,1,0,c849fb09-7833-49c8-9461-98426dc6c0af,c849fb09-7833-49c8-9461-98426dc6c0af,1,0,6c58fc3a-37f8-44b7-b076-2c10ce09b554,6c58fc3a-37f8-44b7-b076-2c10ce09b554,1,0,245c07a9-98b0-452b-b899-dc8751ab7ce0,245c07a9-98b0-452b-b899-dc8751ab7ce0,1,0,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,b0ca1b85-e1de-4b7c-8261-7f9e8a6a72eb,1,0,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,ae67dfe5-bb36-4400-81f5-8dab1fd0ca6e,1,0,91d7687b-7627-473f-a08d-433f9d385107,91d7687b-7627-473f-a08d-433f9d385107,1,0,2276a1d4-b4d9-4643-8342-36143ce4eb26,2276a1d4-b4d9-4643-8342-36143ce4eb26,1,0,83db1b00-e9e3-41da-8a59-47589dcfd618,83db1b00-e9e3-41da-8a59-47589dcfd618,1,0,91d2d798-1498-4c52-aa7b-99db4b992876,91d2d798-1498-4c52-aa7b-99db4b992876,1,0,e85a03d3-e7c7-4058-992a-515a557d9e52,e85a03d3-e7c7-4058-992a-515a557d9e52,1,0,195ea1f8-3e38-4254-a33d-c87424b8f7dc,195ea1f8-3e38-4254-a33d-c87424b8f7dc,1,0,d3a1d247-8f4a-45af-9861-7e313a100209,d3a1d247-8f4a-45af-9861-7e313a100209,1,0,837f27c1-26d7-4f24-a691-55dd9ed04ec5,837f27c1-26d7-4f24-a691-55dd9ed04ec5,1,0,9e2ddfbb-8d6b-4b82-8a2b-62c2ea990b10,9e2ddfbb-8d6b-4b82-8a2b-62c2ea990b10,1,0,5005655f-22b2-49e6-be4f-b15d768d10b2,5005655f-22b2-49e6-be4f-b15d768d10b2,1,0,208040c8-e98b-4c15-a2ec-38d44bfcfa6c,208040c8-e98b-4c15-a2ec-38d44bfcfa6c,1,0,f6811ee2-769e-488d-9ca0-70f1fe521ca9,f6811ee2-769e-488d-9ca0-70f1fe521ca9,1,0,83385f31-2cdf-44a1-85c3-461e4ad5fd45,83385f31-2cdf-44a1-85c3-461e4ad5fd45,1,0,b55b06db-604e-4fb9-9253-638c747bd8f9,b55b06db-604e-4fb9-9253-638c747bd8f9,1,0,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,1,0,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,9aa0c1ef-45b4-405b-ad6f-ebcf876e6318,1,0,deb69010-80b0-4e28-acc7-8c50e8e6f873,deb69010-80b0-4e28-acc7-8c50e8e6f873,1,0,1a9177fe-6699-42b3-9588-eed9c6008c2d,1a9177fe-6699-42b3-9588-eed9c6008c2d,1,0,93848cf6-7a87-42c7-b685-0bc418a2037c,93848cf6-7a87-42c7-b685-0bc418a2037c,1,0,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,4f49412a-fbbe-4ee1-9c2b-affe5266bba7,1,0,ae698468-f42a-4400-aee6-fd849740e634,ae698468-f42a-4400-aee6-fd849740e634,1,0,0b88b50d-6aa1-4364-82bd-1c0c0da93a58,0b88b50d-6aa1-4364-82bd-1c0c0da93a58,1,0,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,ddec19a2-2a76-4eeb-9cbb-6bc2b4a32bc8,1,0,6438435e-97cc-4bd2-98dc-e21cee55bb0f,6438435e-97cc-4bd2-98dc-e21cee55bb0f,1,0,31b93291-a58f-4176-8318-58200e8bc56e,31b93291-a58f-4176-8318-58200e8bc56e,1,0,293be1bc-49cb-4a99-add8-2a3a46829718,293be1bc-49cb-4a99-add8-2a3a46829718,1,0,00579e31-e97d-4d79-ba25-b8d500a17e7f,00579e31-e97d-4d79-ba25-b8d500a17e7f,1,0,5001bea4-c8f9-4950-9eda-d33125e3bb46,5001bea4-c8f9-4950-9eda-d33125e3bb46,1,0,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,4ac6d0dd-0007-46b8-bfcc-93c0f85b6b85,1,0,bc2dd611-b589-4519-b274-40db5c66b378,bc2dd611-b589-4519-b274-40db5c66b378,1,0,e815010d-e03d-46e4-b482-c1556902cc26,e815010d-e03d-46e4-b482-c1556902cc26,1,0,d4ab930a-ddaa-4552-afed-2618af822365,d4ab930a-ddaa-4552-afed-2618af822365,1,0,2388e3f4-b23b-488f-9ea5-d9434efca195,2388e3f4-b23b-488f-9ea5-d9434efca195,1,0,dd03e170-4186-495b-ae1c-fc66385d7ccf,dd03e170-4186-495b-ae1c-fc66385d7ccf,1,0,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,81fbb02e-76b2-4bca-bb3b-871e4e969a3c,1,0,cdef5df6-f3a1-4950-b197-4f375914f885,cdef5df6-f3a1-4950-b197-4f375914f885,1,0,c1caff49-dc4b-4b3e-be47-122ea8b70416,c1caff49-dc4b-4b3e-be47-122ea8b70416,1,0,a1185a4c-7351-48b0-b662-61f61a1ad715,a1185a4c-7351-48b0-b662-61f61a1ad715,1,0,bf5faaef-3a03-40bc-8d3a-644c0874b9ce,bf5faaef-3a03-40bc-8d3a-644c0874b9ce,1,0,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,4ee0c7a4-cc26-438d-8908-f6a900c99d8b,1,0,71d03545-df45-4c70-aa0d-3b916f2a9041,71d03545-df45-4c70-aa0d-3b916f2a9041,1,0,da9b0d3d-27dd-4a85-b0df-ec2f54d884f6,da9b0d3d-27dd-4a85-b0df-ec2f54d884f6,1,0,28a25822-2306-409a-a7c8-6f7e42bf25e8,28a25822-2306-409a-a7c8-6f7e42bf25e8,1,0,89cb31da-a980-4207-a537-85cd47f08d32,89cb31da-a980-4207-a537-85cd47f08d32,1,0,a45fa0c3-c363-4465-861f-13cedfeb79dd,a45fa0c3-c363-4465-861f-13cedfeb79dd,1,0,a72517c3-8c91-4e40-81ac-83c762789e87,a72517c3-8c91-4e40-81ac-83c762789e87,1,0,0233b335-7e26-4661-9850-8ab09d3178e3,0233b335-7e26-4661-9850-8ab09d3178e3,1,0,d942d536-5d01-4571-b910-abd973996a38,d942d536-5d01-4571-b910-abd973996a38,1,0,b82a7103-b872-49c3-b632-81d5a0051136,b82a7103-b872-49c3-b632-81d5a0051136,1,0,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,4b17ac35-78cb-4d01-bb08-659c0a93e8ce,1,0,20c2053c-8ebd-4c07-8d95-956b424d047c,20c2053c-8ebd-4c07-8d95-956b424d047c,1,0,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,7c9dee81-7e85-4d26-84c3-66b0d770ac5a,1,0,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,08fe5e70-ac6b-427a-b6f2-0e2f7848fa6b,1,0,bef6081e-f377-41d6-83a1-b0e218a3fb46,bef6081e-f377-41d6-83a1-b0e218a3fb46,1,0,9b67bfd5-ef23-4205-b7ba-9466517e9999,9b67bfd5-ef23-4205-b7ba-9466517e9999,1,0,20082776-ce24-41c5-ae11-6fa9bc54db59,20082776-ce24-41c5-ae11-6fa9bc54db59,1,0,ea2c4c8e-23cc-4884-812e-1e959da48afc,ea2c4c8e-23cc-4884-812e-1e959da48afc,1,0,c61e4c12-178d-47aa-a070-333fe5450168,c61e4c12-178d-47aa-a070-333fe5450168,1,0,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,9474b4f1-b1bb-4fcf-acdb-a149a09b8490,1,0,63fd620c-59a5-493c-a39e-457fad6fe35f,63fd620c-59a5-493c-a39e-457fad6fe35f,1,0,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,46b0a5b3-1fa7-44ff-a941-c6de47d36e77,1,0,75ffd0b9-79be-4600-a310-591fddb6d63e,75ffd0b9-79be-4600-a310-591fddb6d63e,1,0,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,1,0,89888993-3b05-475e-ac76-3cd7ced93250,89888993-3b05-475e-ac76-3cd7ced93250,1,0,129f704b-cc63-4a4e-b6a7-9e53de4537a2,129f704b-cc63-4a4e-b6a7-9e53de4537a2,1,0,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,1,0,592f55e1-b004-44ef-878a-6c2016ccbeb0,592f55e1-b004-44ef-878a-6c2016ccbeb0,1,0,19add2bd-eede-4a05-901b-cf8ce49a638f,19add2bd-eede-4a05-901b-cf8ce49a638f,1,0,becf53b6-3fbc-4c70-822f-4a70b0434353,becf53b6-3fbc-4c70-822f-4a70b0434353,1,0,c7f544c6-488e-4178-af0d-d2ae07a8b89a,c7f544c6-488e-4178-af0d-d2ae07a8b89a,1,0,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,7dc0429d-146a-4c4f-b122-5d5c053bd4ed,1,0,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,1,0,c38d8135-e11f-4860-b370-84ff279b7fbd,c38d8135-e11f-4860-b370-84ff279b7fbd,1,0,ee0798f5-47a8-4118-a25c-cfd3473007c1,ee0798f5-47a8-4118-a25c-cfd3473007c1,1,0,652ee894-047b-4a5a-a500-2d61b4c4a473,652ee894-047b-4a5a-a500-2d61b4c4a473,1,0,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,1,0,33f8cd94-71e7-4703-92c3-22690fbd871a,33f8cd94-71e7-4703-92c3-22690fbd871a,1,0,b6e5de4d-0156-4342-b646-6e6920a4bd3a,b6e5de4d-0156-4342-b646-6e6920a4bd3a,1,0,c03f9972-5a1f-449b-b170-5a958c2b5846,c03f9972-5a1f-449b-b170-5a958c2b5846,1,0,25896075-2484-4879-8310-7f5680d80b48,25896075-2484-4879-8310-7f5680d80b48,1,0,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1,0,9043894d-f89a-459f-a4ea-77fe3633aa91,9043894d-f89a-459f-a4ea-77fe3633aa91,1,0,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,e417e2ab-5e25-40a9-8dc2-9552a4fe1a38,1,0,085cbea9-1df1-4ee9-afb7-da2bf313697e,085cbea9-1df1-4ee9-afb7-da2bf313697e,1,0,09858042-6284-4499-8055-c1b5b783ce5f,09858042-6284-4499-8055-c1b5b783ce5f,1,0,38fc1e6e-7cd3-437b-b429-6655be34cd01,38fc1e6e-7cd3-437b-b429-6655be34cd01,1,0,95a71c2e-aa39-42ec-8889-2390a553f146,95a71c2e-aa39-42ec-8889-2390a553f146,1,0,8c4c7982-36cc-4dc9-b055-9954f61e6365,8c4c7982-36cc-4dc9-b055-9954f61e6365,1,0,ba51c7f5-0074-4c99-a27d-ddfd4bfcc068,ba51c7f5-0074-4c99-a27d-ddfd4bfcc068,1,0,5f3d5a05-a581-462d-96a2-2750ba0e0481,5f3d5a05-a581-462d-96a2-2750ba0e0481,1,0,477ab478-b336-4bac-898f-e20e3a4039b5,477ab478-b336-4bac-898f-e20e3a4039b5,1,0,a4d767a1-d2e6-4e0a-ab35-9207eef54998,a4d767a1-d2e6-4e0a-ab35-9207eef54998,1,0,e50cb13a-151b-45d2-a7b7-d23440ddfa24,e50cb13a-151b-45d2-a7b7-d23440ddfa24,1,0,cc3a7f15-4db6-445e-b282-f44d0460b7d3,cc3a7f15-4db6-445e-b282-f44d0460b7d3,1,0,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,1,0,0d8770aa-fa6e-471c-92c8-b96576927ef0,0d8770aa-fa6e-471c-92c8-b96576927ef0,1,0,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,4f86b052-b81e-49b8-9fa8-82b2ecbc8e01,1,0,e25b2b10-bf08-42db-9642-861efc5e583b,e25b2b10-bf08-42db-9642-861efc5e583b,1,0,b8a32c33-4e15-4c21-baab-64a86d44321b,b8a32c33-4e15-4c21-baab-64a86d44321b,1,0,d7dd9a03-6818-4987-8f39-58e1c906569f,d7dd9a03-6818-4987-8f39-58e1c906569f,1,0,e4216976-2747-4078-81d4-8ffab668c1f7,e4216976-2747-4078-81d4-8ffab668c1f7,1,0,fce028b8-b530-49f0-b6ad-a28d03e19b0f,fce028b8-b530-49f0-b6ad-a28d03e19b0f,1,0,301eea20-0e7f-441e-a531-28b4627dfd93,301eea20-0e7f-441e-a531-28b4627dfd93,1,0,41f87891-ddd5-4e0f-a4f2-8039fb71981b,41f87891-ddd5-4e0f-a4f2-8039fb71981b,1,0,3b9c03bc-8517-498f-8052-e53854fb0753,3b9c03bc-8517-498f-8052-e53854fb0753,1,0,47da49ee-b243-4e78-9c8f-bb26c60e6136,47da49ee-b243-4e78-9c8f-bb26c60e6136,1,0,39bee714-cacd-4d48-97a5-c838660e049a,39bee714-cacd-4d48-97a5-c838660e049a,1,0,6c66ff27-19af-4728-95a8-463fd1c4dcd3,6c66ff27-19af-4728-95a8-463fd1c4dcd3,1,0,9ed2c756-80a1-4559-8494-b7a9b82a4519,9ed2c756-80a1-4559-8494-b7a9b82a4519,1,0,69149ce1-d3f8-4e12-be8f-b328ade60882,69149ce1-d3f8-4e12-be8f-b328ade60882,1,0,ff592ecb-eb08-4554-87bf-1d2935b21d3c,ff592ecb-eb08-4554-87bf-1d2935b21d3c,1,0,d975aef4-8da8-4486-baeb-a99c48cff0ec,d975aef4-8da8-4486-baeb-a99c48cff0ec,1,0,75666bb9-f6d3-4dd6-8220-427a81f23fc9,75666bb9-f6d3-4dd6-8220-427a81f23fc9,1,0,9da27139-0bed-47b0-aef6-246929968502,9da27139-0bed-47b0-aef6-246929968502,1,0,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,1,0,29f2094a-d0d1-425c-8161-45a9ba186e19,29f2094a-d0d1-425c-8161-45a9ba186e19,1,0,893b2dd9-a939-4799-9b78-50d788a5f3ba,893b2dd9-a939-4799-9b78-50d788a5f3ba,1,0,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,1,0,a57f6dc1-59d7-4311-8acd-65ce57a9f386,a57f6dc1-59d7-4311-8acd-65ce57a9f386,1,0,e4842271-4fc0-4e15-afef-876f05af78c0,e4842271-4fc0-4e15-afef-876f05af78c0,1,0,31ee6430-b65d-42fa-859b-c4f1c40686ae,31ee6430-b65d-42fa-859b-c4f1c40686ae,1,0,c59e11f3-6bcb-404a-9d76-1416c12be354,c59e11f3-6bcb-404a-9d76-1416c12be354,1,0,c1a1f12b-3978-4047-956e-a5c7de8371a0,c1a1f12b-3978-4047-956e-a5c7de8371a0,1,0,ac39b903-0c60-417e-a50f-49ed375424f5,ac39b903-0c60-417e-a50f-49ed375424f5,1,0,135d57fe-d420-4bb0-9120-e43fd9b55c16,135d57fe-d420-4bb0-9120-e43fd9b55c16,1,0,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,9893e2d6-f3f8-4d73-bb06-19bf26d216ab,1,0,387d3bbf-cddd-4506-b14f-89c1f37adbbc,387d3bbf-cddd-4506-b14f-89c1f37adbbc,1,0,16392cf6-dd83-4df0-a54b-6efc29778a89,16392cf6-dd83-4df0-a54b-6efc29778a89,1,0,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,e693cdd0-8ead-4ba5-adec-86bab74ee7cd,1,0,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,10db9f99-c7d1-4b16-9ea2-9bfc2aa4ddb5,1,0,230722e6-942f-4594-be89-eff59c6572bf,230722e6-942f-4594-be89-eff59c6572bf,1,0,237dab99-ed72-432c-ad01-c6045d74f000,237dab99-ed72-432c-ad01-c6045d74f000,1,0,a1130128-cc48-4555-93a2-99e7f74f77dc,a1130128-cc48-4555-93a2-99e7f74f77dc,1,0,9b4b7424-1af7-4d80-8404-8819fcfeae75,9b4b7424-1af7-4d80-8404-8819fcfeae75,1,0,94e08dcf-3885-4a73-82ab-cb291f1cf95f,94e08dcf-3885-4a73-82ab-cb291f1cf95f,1,0,8947286f-ba4a-44e7-b805-2f096028dc4f,8947286f-ba4a-44e7-b805-2f096028dc4f,1,0,55ce840b-5838-4107-886d-f935b9907bd8,55ce840b-5838-4107-886d-f935b9907bd8,1,0,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,1,0,f1753bda-16db-4b00-a16a-37ddade8403f,f1753bda-16db-4b00-a16a-37ddade8403f,1,0,251ca8fe-09eb-45ca-be8b-0d8faf927009,251ca8fe-09eb-45ca-be8b-0d8faf927009,1,0,e353db15-71c5-4b68-9ffb-9800800a59dc,e353db15-71c5-4b68-9ffb-9800800a59dc,1,0,976d9ba7-d9c7-4a9e-ad5d-53cb5bca8984,976d9ba7-d9c7-4a9e-ad5d-53cb5bca8984,1,0,a1875d63-4303-46f1-bdea-fc529b5891f3,a1875d63-4303-46f1-bdea-fc529b5891f3,1,0,e05b6f44-8244-4e94-a6d3-57450f8b47dc,e05b6f44-8244-4e94-a6d3-57450f8b47dc,1,0,59123b12-6052-4480-9c86-f4de1b5cdc04,59123b12-6052-4480-9c86-f4de1b5cdc04,1,0,19b98b60-deb1-4642-8159-2a11332558e2,19b98b60-deb1-4642-8159-2a11332558e2,1,0,133f181a-fade-4182-826d-904fac780326,133f181a-fade-4182-826d-904fac780326,1,0,a687748a-0b2a-4277-b935-07616d28430d,a687748a-0b2a-4277-b935-07616d28430d,1,0,f60cb71a-f451-426a-aa3a-aa266b8da149,f60cb71a-f451-426a-aa3a-aa266b8da149,1,0,641ebe22-7135-4adb-bbd6-e0c37d246a2d,641ebe22-7135-4adb-bbd6-e0c37d246a2d,1,0,f71ba01e-9f6b-4241-8048-4368c8888756,f71ba01e-9f6b-4241-8048-4368c8888756,1,0,9059defa-047f-4dac-9749-3d0a6a77308a,9059defa-047f-4dac-9749-3d0a6a77308a,1,0,6010c27f-e857-4fc3-be13-1eea51f02ea7,6010c27f-e857-4fc3-be13-1eea51f02ea7,1,0,973609a2-5b5d-45c4-9606-a13d0de1a09b,973609a2-5b5d-45c4-9606-a13d0de1a09b,1,0,6aa814fa-417e-428c-951e-6efd9d0775da,6aa814fa-417e-428c-951e-6efd9d0775da,1,0,a247efe1-8608-4780-9cc8-54e29944475b,a247efe1-8608-4780-9cc8-54e29944475b,1,0,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,1,0,a8f162e9-3f59-41a5-b82f-da20928213c7,a8f162e9-3f59-41a5-b82f-da20928213c7,1,0,ade68dfd-5037-4fd7-b043-9514e3fe6342,ade68dfd-5037-4fd7-b043-9514e3fe6342,1,0,7b008aad-9d05-43e1-8295-62ae58cfff42,7b008aad-9d05-43e1-8295-62ae58cfff42,1,0,fdaf9255-d621-4a98-9530-f618ed440795,fdaf9255-d621-4a98-9530-f618ed440795,1,0,48cefa96-46c7-4870-a096-951dcbae479a,48cefa96-46c7-4870-a096-951dcbae479a,1,0,d74e01cc-941b-4974-8771-0bd2e0d86724,d74e01cc-941b-4974-8771-0bd2e0d86724,1,0,0daac965-2026-4acc-8ba1-3c1f01779257,0daac965-2026-4acc-8ba1-3c1f01779257,1,0,65a331c0-7501-49f6-8027-35b703d11834,65a331c0-7501-49f6-8027-35b703d11834,1,0,5e4ee280-3dd2-4f68-be6c-fb5343438817,5e4ee280-3dd2-4f68-be6c-fb5343438817,1,0,75d1b6df-ede3-4172-987f-fe1551f686ee,75d1b6df-ede3-4172-987f-fe1551f686ee,1,0,c67fab0a-704f-43ae-bd03-4b5b1a880b24,c67fab0a-704f-43ae-bd03-4b5b1a880b24,1,0,c1703a14-61a0-4461-8ad8-7173e2c431fe,c1703a14-61a0-4461-8ad8-7173e2c431fe,1,0,aecf5653-3005-43f2-ab49-40977e70f02b,aecf5653-3005-43f2-ab49-40977e70f02b,1,0,aae09896-3b22-4d7d-9059-e47660f8b88b,aae09896-3b22-4d7d-9059-e47660f8b88b,1,0,845530cd-36fb-44c3-b30a-730985c9ca2d,845530cd-36fb-44c3-b30a-730985c9ca2d,1,0,475f8577-a141-496b-94e1-53215c0dd017,475f8577-a141-496b-94e1-53215c0dd017,1,0,97638762-c01e-4c8f-88e2-b356e517e18f,97638762-c01e-4c8f-88e2-b356e517e18f,1,0,074e34f2-e9be-4bd3-beca-8b916772e2be,074e34f2-e9be-4bd3-beca-8b916772e2be,1,0,28fecf1b-7cab-4087-b66e-2052edb8ce3a,28fecf1b-7cab-4087-b66e-2052edb8ce3a,1,0,6527be82-a665-4f8a-818b-a35b96b3484b,6527be82-a665-4f8a-818b-a35b96b3484b,1,0,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,1,0,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,1,0,83e30f0b-67b2-411b-9624-ac4c4bd7f94a,83e30f0b-67b2-411b-9624-ac4c4bd7f94a,1,0,c79ba5a5-e6d9-4a3f-ab23-eca876607f7f,c79ba5a5-e6d9-4a3f-ab23-eca876607f7f,1,0,ce5549bd-ba99-4259-86a3-36521bad59f5,ce5549bd-ba99-4259-86a3-36521bad59f5,1,0,f5417147-4d2a-4e49-911b-2bb5eccb8441,f5417147-4d2a-4e49-911b-2bb5eccb8441,1,0,20fbed2b-4393-4de0-a71d-017a336bdac0,20fbed2b-4393-4de0-a71d-017a336bdac0,1,0,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,1,0,fbbb2449-9a07-4229-8ea5-bee0afab5f56,fbbb2449-9a07-4229-8ea5-bee0afab5f56,1,0,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,1,0,3f3f1b41-57a9-4a82-bdfa-89a6653479ab,3f3f1b41-57a9-4a82-bdfa-89a6653479ab,1,0,fd12fbe2-56a2-4c9e-a072-989d826a5ea3,fd12fbe2-56a2-4c9e-a072-989d826a5ea3,1,0,f38b6034-5246-42a7-8f3c-51eaf3e5399c,f38b6034-5246-42a7-8f3c-51eaf3e5399c,1,0,08552af7-3c44-42c6-94c5-63a2316127fc,08552af7-3c44-42c6-94c5-63a2316127fc,1,0,41f6f6d1-b7cf-4477-907b-ce69fc08c799,41f6f6d1-b7cf-4477-907b-ce69fc08c799,1,0,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,9f1a61dd-b04f-48ae-b0c0-17cf23bdb04b,1,0,0d124daf-dc52-4391-a2d9-3c43a45c422c,0d124daf-dc52-4391-a2d9-3c43a45c422c,1,0,a300ecc3-8031-4a50-a17d-b08cf3a72139,a300ecc3-8031-4a50-a17d-b08cf3a72139,1,0,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,e7e78b7e-b103-40d6-8064-f84e2d86ca3d,1,0,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,1,0,98153b59-8cc6-4dc7-b945-99c1146d07da,98153b59-8cc6-4dc7-b945-99c1146d07da,1,0,52f3e20c-1cf7-4284-a083-6539782f4bc3,52f3e20c-1cf7-4284-a083-6539782f4bc3,1,0,657b8663-713c-4a80-81e1-8c0166742a35,657b8663-713c-4a80-81e1-8c0166742a35,1,0,866438d1-1223-4768-9c96-e6cb12f1a4d5,866438d1-1223-4768-9c96-e6cb12f1a4d5,1,0,d416cc2a-425f-4c01-a550-5a755ed78cc8,d416cc2a-425f-4c01-a550-5a755ed78cc8,1,0,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,df9db8d5-c5c2-4a9d-88fe-77247b2c417e,1,0,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,1,0,a890be6b-f050-4ea4-a388-570948ffd22b,a890be6b-f050-4ea4-a388-570948ffd22b,1,0,9039f720-5728-4918-87d5-8b2d07cabcfd,9039f720-5728-4918-87d5-8b2d07cabcfd,1,0,b00c31d6-4fc6-4189-9f72-f91742ec705f,b00c31d6-4fc6-4189-9f72-f91742ec705f,1,0,1333101b-82e8-41a9-a793-5af5dcd6f68a,1333101b-82e8-41a9-a793-5af5dcd6f68a,1,0,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,766c9bee-b0fc-4a7f-b88e-cd8c4aad73b8,1,0,aaaa7d41-3399-41b5-b882-58af38121494,aaaa7d41-3399-41b5-b882-58af38121494,1,0,0f25646a-90f9-4747-a778-7efdaabc284c,0f25646a-90f9-4747-a778-7efdaabc284c,1,0,3705a086-46e6-4090-a52a-535908eea8a5,3705a086-46e6-4090-a52a-535908eea8a5,1,0,9b9cd161-5bee-4433-a0ec-b67deb099b5e,9b9cd161-5bee-4433-a0ec-b67deb099b5e,1,0,ca179cb5-65e1-4a55-bf12-096b926accb0,ca179cb5-65e1-4a55-bf12-096b926accb0,1,0,a6587758-f7af-4f85-81b4-4312c725824e,a6587758-f7af-4f85-81b4-4312c725824e,1,0,5d336d1e-24f9-404a-9671-3bcdc7c48a25,5d336d1e-24f9-404a-9671-3bcdc7c48a25,1,0,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,d508b3e9-4dac-40a3-9a0b-1cc76b4196ea,1,0,63470706-f14b-4733-87c2-d1173f5d7e7a,63470706-f14b-4733-87c2-d1173f5d7e7a,1,0,472ce1c2-9e83-418b-b1ec-e15e126bc919,472ce1c2-9e83-418b-b1ec-e15e126bc919,1,0,9fe30414-8261-4403-a854-f22b61824f69,9fe30414-8261-4403-a854-f22b61824f69,1,0,07bb26ac-bd97-465f-a192-db7fedbb579b,07bb26ac-bd97-465f-a192-db7fedbb579b,1,0,76cdcc51-0e6a-4f9c-a115-1864998c2add,76cdcc51-0e6a-4f9c-a115-1864998c2add,1,0,71c3e5d3-7504-433f-9d48-7c287b2b863b,71c3e5d3-7504-433f-9d48-7c287b2b863b,1,0,0894db61-51f6-4068-9634-e55d95e2a8ac,0894db61-51f6-4068-9634-e55d95e2a8ac,1,0,0d8c215d-1210-47a2-897d-a3257b9f849a,0d8c215d-1210-47a2-897d-a3257b9f849a,1,0,ea2e9a4e-eca1-4a6e-b7a6-8922a11334aa,ea2e9a4e-eca1-4a6e-b7a6-8922a11334aa,1,0,c971e0ba-53b8-4454-92f7-40b0d639058a,c971e0ba-53b8-4454-92f7-40b0d639058a,1,0,9d8496ea-fc0c-410d-994d-7480350d71d3,9d8496ea-fc0c-410d-994d-7480350d71d3,1,0,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,0f0456a8-ca04-4de4-9d9b-e8b0fdb8b860,1,0,ed297409-6215-4fd4-b47d-a2247e0343da,ed297409-6215-4fd4-b47d-a2247e0343da,1,0,5b62e0d1-8dba-47db-8dbb-517ad935fa0d,5b62e0d1-8dba-47db-8dbb-517ad935fa0d,1,0,e7a63151-fc1a-4563-8768-26d854ab012b,e7a63151-fc1a-4563-8768-26d854ab012b,1,0,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,1,0,c54f31ce-114b-46d3-b4c6-12c8f07727ca,c54f31ce-114b-46d3-b4c6-12c8f07727ca,1,0,73c7750f-8291-4e19-8551-635cd6b94215,73c7750f-8291-4e19-8551-635cd6b94215,1,0,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,1,0,a1463001-f3d8-4064-95e4-cf49aedc2a8c,a1463001-f3d8-4064-95e4-cf49aedc2a8c,1,0,59855d19-29cd-4efd-a453-b19e574113ef,59855d19-29cd-4efd-a453-b19e574113ef,1,0,249b6436-bd44-4950-b118-7f40f7aaf794,249b6436-bd44-4950-b118-7f40f7aaf794,1,0,65dd4904-0837-4de5-a5e5-601151055d94,65dd4904-0837-4de5-a5e5-601151055d94,1,0,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,9dd57f32-90a1-4a1d-bc2a-c1b12461d963,1,0,ce6d1259-af90-482b-b19a-405512321bd9,ce6d1259-af90-482b-b19a-405512321bd9,1,0,9b76ded4-814a-4267-99c5-2c8fb05ee352,9b76ded4-814a-4267-99c5-2c8fb05ee352,1,0,df48bfa3-5502-4a61-a79f-1dea043dac36,df48bfa3-5502-4a61-a79f-1dea043dac36,1,0,adee37e6-f087-422f-91b3-681f3d73189c,adee37e6-f087-422f-91b3-681f3d73189c,1,0,eb276904-cad7-4401-bb78-2d13946291f1,eb276904-cad7-4401-bb78-2d13946291f1,1,0,171a64b6-39d2-455f-b304-1c6ea8d85494,171a64b6-39d2-455f-b304-1c6ea8d85494,1,0,79ff04ac-4625-469b-916e-938f04de4dd2,79ff04ac-4625-469b-916e-938f04de4dd2,1,0,c5e9f987-4466-4161-8e36-278b0b3ce056,c5e9f987-4466-4161-8e36-278b0b3ce056,1,0,b6566d54-e821-4a2a-a447-0f533f35de91,b6566d54-e821-4a2a-a447-0f533f35de91,1,0,46568b9a-a765-4037-8a86-b184a570ab37,46568b9a-a765-4037-8a86-b184a570ab37,1,0,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,1,0,547a6dec-6fe8-439d-a8d9-ac2612af20d2,547a6dec-6fe8-439d-a8d9-ac2612af20d2,1,0,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,1,0,1e633034-6dcc-4564-9f40-348c32143314,1e633034-6dcc-4564-9f40-348c32143314,1,0,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,1,0,0b92cced-d818-400c-82b6-7726e912a478,0b92cced-d818-400c-82b6-7726e912a478,1,0,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,1,0,d8621f68-106e-4058-963f-56010491ae2e,d8621f68-106e-4058-963f-56010491ae2e,1,0,4766c40e-6330-4c1d-a64f-0c8c672886a4,4766c40e-6330-4c1d-a64f-0c8c672886a4,1,0,1f3057c2-135f-44b2-9f86-34481fbc5596,1f3057c2-135f-44b2-9f86-34481fbc5596,1,0,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,1,0,f2e2df50-52fc-4e95-909b-80fc91a68f62,f2e2df50-52fc-4e95-909b-80fc91a68f62,1,0,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1,0,7a944c45-9b3d-411f-b2ef-de3c896092bb,7a944c45-9b3d-411f-b2ef-de3c896092bb,1,0,d2762764-b5c0-4aeb-8e89-3371972f22d8,d2762764-b5c0-4aeb-8e89-3371972f22d8,1,0,54f3902b-f29a-4f04-8c9d-68c318fcd076,54f3902b-f29a-4f04-8c9d-68c318fcd076,1,0,573f1753-9194-4aaf-9217-5cac70ff108f,573f1753-9194-4aaf-9217-5cac70ff108f,1,0,323997ca-488d-4d84-aa44-da60b6b4d414,323997ca-488d-4d84-aa44-da60b6b4d414,1,0,50d3e00e-1a83-4bd5-91db-0561560caf42,50d3e00e-1a83-4bd5-91db-0561560caf42,1,0,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1,0,c8ba4901-7f70-4353-b039-d75f1cb3f5b7,c8ba4901-7f70-4353-b039-d75f1cb3f5b7,1,0,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,c121b8bc-ecbf-4775-b210-3c1e3502a6ac,1,0,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,9f4d5fe5-9bda-4ba9-a313-db1ab0ea14d1,1,0,44afff59-0590-4929-93b8-7b49735f21b5,44afff59-0590-4929-93b8-7b49735f21b5,1,0,905624ea-b253-413f-b651-1eb2c5a7d52a,905624ea-b253-413f-b651-1eb2c5a7d52a,1,0,b639ed30-3e37-4c65-a39f-00fe735950eb,b639ed30-3e37-4c65-a39f-00fe735950eb,1,0,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,1,0,f137eb0f-bde7-412d-9229-d7a4f9456e6c,f137eb0f-bde7-412d-9229-d7a4f9456e6c,1,0,90880131-8065-4a7e-a0fa-ecff9e27363c,90880131-8065-4a7e-a0fa-ecff9e27363c,1,0,57e9fcea-342c-4089-bd10-befb3faf0dbd,57e9fcea-342c-4089-bd10-befb3faf0dbd,1,0,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,1,0,51a0444d-13c8-45a8-97f6-f3f976964bf8,51a0444d-13c8-45a8-97f6-f3f976964bf8,1,0,9892f922-8745-4164-a200-94b5edc1ea0a,9892f922-8745-4164-a200-94b5edc1ea0a,1,0,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,1,0,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,1,0,2b1619a6-c841-4963-8c51-c1d8d6ba3746,2b1619a6-c841-4963-8c51-c1d8d6ba3746,1,0,eab50f82-4612-47fd-a5c2-9678016a1937,eab50f82-4612-47fd-a5c2-9678016a1937,1,0,2609ba3c-e4de-45b3-86e0-93db39a21eee,2609ba3c-e4de-45b3-86e0-93db39a21eee,1,0,00dcfeab-7ba1-4a50-996e-4fd693dd0514,00dcfeab-7ba1-4a50-996e-4fd693dd0514,1,0,d21971c9-9aa6-448a-ab37-49ad0b0547ec,d21971c9-9aa6-448a-ab37-49ad0b0547ec,1,0,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,1,0,3e4361e9-2baf-407b-9320-b2a265b44e46,3e4361e9-2baf-407b-9320-b2a265b44e46,1,0,a5902ed4-a8f1-460e-aced-0094b2c384a3,a5902ed4-a8f1-460e-aced-0094b2c384a3,1,0,00418e6c-77b2-4753-b9ff-3a8013436f8a,00418e6c-77b2-4753-b9ff-3a8013436f8a,1,0,e2c76c41-4c47-4588-a081-7bd81ac1698b,e2c76c41-4c47-4588-a081-7bd81ac1698b,1,0,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,1,0,26986f8d-d56d-4641-9184-2632d0881cca,26986f8d-d56d-4641-9184-2632d0881cca,1,0,92bec607-7217-42f6-8eb9-ace759672336,92bec607-7217-42f6-8eb9-ace759672336,1,0,144676de-f369-49f1-bb21-d60e073936df,144676de-f369-49f1-bb21-d60e073936df,1,0,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,1,0,4d660fec-4a76-470e-bba9-3d031941b289,4d660fec-4a76-470e-bba9-3d031941b289,1,0,38bf6d3b-5435-4bac-b9fc-23b80afeb760,38bf6d3b-5435-4bac-b9fc-23b80afeb760,1,0,644cf757-bff9-4e2e-b72b-1e736c42d4c3,644cf757-bff9-4e2e-b72b-1e736c42d4c3,1,0,a3c9a7eb-2104-4402-954c-3e12de4a7de3,a3c9a7eb-2104-4402-954c-3e12de4a7de3,1,0,a2a51b70-9570-4f53-9d30-e9a9b099a475,a2a51b70-9570-4f53-9d30-e9a9b099a475,1,0,556a0e57-5b3b-4303-a013-0bd296c506b8,556a0e57-5b3b-4303-a013-0bd296c506b8,1,0,fabbac92-cb98-4087-b3fa-387482ed0d86,fabbac92-cb98-4087-b3fa-387482ed0d86,1,0,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,1,0,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,1,0,fdcbe67c-55fb-444d-bed8-cee956ca3530,fdcbe67c-55fb-444d-bed8-cee956ca3530,1,0,e09534e3-ac6e-42a6-86e8-564acb20089a,e09534e3-ac6e-42a6-86e8-564acb20089a,1,0,5e380276-2a08-435c-927e-a7f56f5a4dbc,5e380276-2a08-435c-927e-a7f56f5a4dbc,1,0,6ff5b3cb-efff-430d-bf0a-957405f116ca,6ff5b3cb-efff-430d-bf0a-957405f116ca,1,0,d06e845a-9f54-40dd-b0df-6988def62017,d06e845a-9f54-40dd-b0df-6988def62017,1,0,63223883-06cf-4d01-be95-5e410cc58a22,63223883-06cf-4d01-be95-5e410cc58a22,1,0,1929139f-dabb-4c40-9423-158093360889,1929139f-dabb-4c40-9423-158093360889,1,0,dad92df4-685b-4260-b35f-4d031262dfea,dad92df4-685b-4260-b35f-4d031262dfea,1,0,4399c19a-ddba-42e9-88b4-c5c28abad237,4399c19a-ddba-42e9-88b4-c5c28abad237,1,0,982315ba-df74-4a31-8929-71d1e5e6f147,982315ba-df74-4a31-8929-71d1e5e6f147,1,0,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,1,0,b8b267e3-75af-4140-b515-d99e8e748e84,b8b267e3-75af-4140-b515-d99e8e748e84,1,0,8014684f-e1f1-4163-9083-459a009c0aac,8014684f-e1f1-4163-9083-459a009c0aac,1,0,ff976027-75e8-475c-abfa-876d36733c13,ff976027-75e8-475c-abfa-876d36733c13,1,0,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,1,0,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,1,0,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,40c8b547-35d0-4dbd-8fa1-ba108c3022b1,1,0,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,1,0,c0218ef0-4aa1-4ff1-963b-e6ab1001ae9e,c0218ef0-4aa1-4ff1-963b-e6ab1001ae9e,1,0,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,e55d259f-cfaa-46f9-92c4-687e1ff3b89d,1,0,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,cf13e2d9-72a0-47c0-bae2-f674024bbdb2,1,0,62d4d073-80df-41e6-a915-43a4f5575206,62d4d073-80df-41e6-a915-43a4f5575206,1,0,145ecede-baae-4725-832a-5387794922ed,145ecede-baae-4725-832a-5387794922ed,1,0,540be4e1-6eae-48e2-a645-8bd0a1259c65,540be4e1-6eae-48e2-a645-8bd0a1259c65,1,0,f772abd3-8ea0-41e9-aaca-c5375778941a,f772abd3-8ea0-41e9-aaca-c5375778941a,1,0,a1e494f8-96a4-41bd-9234-b87e8d8742c5,a1e494f8-96a4-41bd-9234-b87e8d8742c5,1,0,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,5c6b9fb5-7d29-4161-a81b-7c618ca07a47,1,0,35bc58df-8aff-48dd-83a9-b60b0461f94d,35bc58df-8aff-48dd-83a9-b60b0461f94d,1,0,b322b047-16eb-4500-826a-6dfebb7d997a,b322b047-16eb-4500-826a-6dfebb7d997a,1,0,83ead93b-4ff6-487d-934e-25088944fccc,83ead93b-4ff6-487d-934e-25088944fccc,1,0,764c76cc-0473-4633-868d-02f96aa43c10,764c76cc-0473-4633-868d-02f96aa43c10,1,0,c8da922f-e31e-49b0-b90e-1c060424bde5,c8da922f-e31e-49b0-b90e-1c060424bde5,1,0,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,1,0,eca025d2-4fe9-4542-b9f5-46ae2631256e,eca025d2-4fe9-4542-b9f5-46ae2631256e,1,0,9416a741-5106-454e-b953-81f3d99d5e71,9416a741-5106-454e-b953-81f3d99d5e71,1,0,30f6aedf-946f-400c-822d-5fa375b8fb1d,30f6aedf-946f-400c-822d-5fa375b8fb1d,1,0,46e313f7-54da-4884-89e8-cdba6ae30d30,46e313f7-54da-4884-89e8-cdba6ae30d30,1,0,feb1a5c1-c805-4079-8f05-8a44f51b0b02,feb1a5c1-c805-4079-8f05-8a44f51b0b02,1,0,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,1,0,1f55f330-7c0a-4a29-905f-51d664515bc5,1f55f330-7c0a-4a29-905f-51d664515bc5,1,0,6106e958-354c-4211-992c-3c3819e8828e,6106e958-354c-4211-992c-3c3819e8828e,1,0,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,1,0,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,61789ea5-aad2-4b3b-a1c7-3ff7409379eb,1,0,2cd04d4c-2619-40c9-adf4-7bb281f045b6,2cd04d4c-2619-40c9-adf4-7bb281f045b6,1,0,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1,0,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,1,0,231d3950-f363-4e63-83cd-8ddb81507c27,231d3950-f363-4e63-83cd-8ddb81507c27,1,0,87429f11-bf95-4013-bf13-da904570f88d,87429f11-bf95-4013-bf13-da904570f88d,1,0,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,1,0,feb41347-62db-41cf-ace0-d8b9de361af3,feb41347-62db-41cf-ace0-d8b9de361af3,1,0,5a088468-4065-4e0c-9b84-1162de8d3fdd,5a088468-4065-4e0c-9b84-1162de8d3fdd,1,0,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,dbdf3ae7-a0af-44b9-8e3d-c402d98cda03,1,0,f3ae1a2c-e0ca-461b-ba5a-76a6423c6325,f3ae1a2c-e0ca-461b-ba5a-76a6423c6325,1,0,b233d29c-3979-4ef6-b7f0-89ca88f65e82,b233d29c-3979-4ef6-b7f0-89ca88f65e82,1,0,684ca876-644e-43f5-b96a-1561fb5b1935,684ca876-644e-43f5-b96a-1561fb5b1935,1,0,5f91b00f-d8fc-4d63-8486-66339357ab22,5f91b00f-d8fc-4d63-8486-66339357ab22,1,0,16d44ab1-4bce-4df8-a215-6ed5173c75a8,16d44ab1-4bce-4df8-a215-6ed5173c75a8,1,0,86a9d7ab-7a96-4c58-8073-ca4b2b99cceb,86a9d7ab-7a96-4c58-8073-ca4b2b99cceb,1,0,1ae1a239-0d88-4467-af33-32bcfe6cf61d,1ae1a239-0d88-4467-af33-32bcfe6cf61d,1,0,375977c1-5745-4e78-a4df-cef966c0ccf8,375977c1-5745-4e78-a4df-cef966c0ccf8,1,0,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,1,0,c3796d85-2a24-43c4-9673-64e56249a1d0,c3796d85-2a24-43c4-9673-64e56249a1d0,1,0,fc1066b5-20d4-4c73-85f8-9889e554d6e1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,1,0,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,1,0,731211c2-ef90-4883-9525-83cd91b742ac,731211c2-ef90-4883-9525-83cd91b742ac,1,0,0adf02da-940a-4bfc-afa5-59605494a169,0adf02da-940a-4bfc-afa5-59605494a169,1,0,8361991a-0f30-4a03-9a4c-90556b744f53,8361991a-0f30-4a03-9a4c-90556b744f53,1,0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,1,0,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,1,0,259cb8f5-9e78-4b2f-941b-ccb4b1112c8b,259cb8f5-9e78-4b2f-941b-ccb4b1112c8b,1,0,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,1,0,73c1a829-0191-486b-97a0-7f333c6f8011,73c1a829-0191-486b-97a0-7f333c6f8011,1,0,db28f23f-a771-46c0-96e8-5e4389b28b8b,db28f23f-a771-46c0-96e8-5e4389b28b8b,1,0,5504f5d1-35d8-4a47-a0e1-003fe00395c1,5504f5d1-35d8-4a47-a0e1-003fe00395c1,1,0,56242b05-d722-4d4a-82d9-517e0e169d0b,56242b05-d722-4d4a-82d9-517e0e169d0b,1,0,f9196766-4ae2-4a73-bed6-4a8838323e02,f9196766-4ae2-4a73-bed6-4a8838323e02,1,0,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,1,0,50a1e3bf-8624-4474-854e-21b89aaf97ed,50a1e3bf-8624-4474-854e-21b89aaf97ed,1,0,503b3eab-b7f1-4ede-8845-3290a834cec7,503b3eab-b7f1-4ede-8845-3290a834cec7,1,0,847b97a3-d0bc-45e2-b06c-932bb22d8eca,847b97a3-d0bc-45e2-b06c-932bb22d8eca,1,0,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,1,0,3116fa60-bc42-4dea-aa03-387896168690,3116fa60-bc42-4dea-aa03-387896168690,1,0,ca797560-8802-4bdc-b21f-7a7fd795beae,ca797560-8802-4bdc-b21f-7a7fd795beae,1,0,3df19dbf-efe7-4e31-99ad-fafb59ec1329,3df19dbf-efe7-4e31-99ad-fafb59ec1329,1,0,baf12d47-fbfe-4563-aa23-26d9f7e83169,baf12d47-fbfe-4563-aa23-26d9f7e83169,1,0,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,1,0,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0ba11486-1972-4434-ab1a-5bb75cc05e9f,1,0,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,1,0,c1c62215-41b8-40bc-a806-1347db5b03e9,c1c62215-41b8-40bc-a806-1347db5b03e9,1,0,a24322f3-c7a5-4b25-bad6-9c75712a3e58,a24322f3-c7a5-4b25-bad6-9c75712a3e58,1,0,679d2b3b-a354-4dec-b49d-ab1163756e3a,679d2b3b-a354-4dec-b49d-ab1163756e3a,1,0,665e96bc-8ec1-4008-b9bd-db95a234b9b8,665e96bc-8ec1-4008-b9bd-db95a234b9b8,1,0,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,1,0,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,1,0,9bf55587-1ffe-42bc-b8e8-3f956956f689,9bf55587-1ffe-42bc-b8e8-3f956956f689,1,0,2f67931e-543f-457e-80fd-78ca754e2e9c,2f67931e-543f-457e-80fd-78ca754e2e9c,1,0,595e5752-36a7-4bba-8a40-26920acae01d,595e5752-36a7-4bba-8a40-26920acae01d,1,0,28801fba-c429-4afa-bdcd-b3ec3ec22fda,28801fba-c429-4afa-bdcd-b3ec3ec22fda,1,0,d1a873ae-d45b-4600-9419-e701dce3da02,d1a873ae-d45b-4600-9419-e701dce3da02,1,0,e3a31f0d-a98f-43c6-bc39-087095ae8c39,e3a31f0d-a98f-43c6-bc39-087095ae8c39,1,0,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,1,0,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,b1c1c2eb-f9cd-468a-8398-b0b7f611f832,1,0,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,4bb0f7c3-62f3-4352-9bc8-e243dd18fe4a,1,0,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,bc106ef9-3eeb-40d4-aa59-ae1855ba1744,1,0,73d8b319-9bea-4638-a602-23c12f37c227,73d8b319-9bea-4638-a602-23c12f37c227,1,0,a43e9de0-2921-4c58-a5f8-7446258be967,a43e9de0-2921-4c58-a5f8-7446258be967,1,0,307656e3-df7f-46e7-946c-bbd439265c95,307656e3-df7f-46e7-946c-bbd439265c95,1,0,eb3dfdc7-58b8-4b1f-b079-368c262364c9,eb3dfdc7-58b8-4b1f-b079-368c262364c9,1,0,5030a318-f8f7-4ec7-80d6-6eee0772562f,5030a318-f8f7-4ec7-80d6-6eee0772562f,1,0,242e911d-e49c-4b8a-8543-cc2e079220fd,242e911d-e49c-4b8a-8543-cc2e079220fd,1,0,9ea39d31-3775-4fb8-a3f3-202e54354d49,9ea39d31-3775-4fb8-a3f3-202e54354d49,1,0,73044e20-148c-46e9-b5b5-973c91de0d61,73044e20-148c-46e9-b5b5-973c91de0d61,1,0,f8ab477c-8e78-48c0-9f99-27748b109706,f8ab477c-8e78-48c0-9f99-27748b109706,1,0,24cff6c8-6c20-4383-b97c-6afa52738960,24cff6c8-6c20-4383-b97c-6afa52738960,1,0,462e2694-750d-49ef-93ac-17a7779be68d,462e2694-750d-49ef-93ac-17a7779be68d,1,0,c24ff02e-5afc-45df-81cf-64ea2b261c2d,c24ff02e-5afc-45df-81cf-64ea2b261c2d,1,0,2d51aae9-650d-4719-a94d-2609b69a2d36,2d51aae9-650d-4719-a94d-2609b69a2d36,1,0,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,1,0,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,1,0,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,1,0,85639a53-b367-49ce-84f2-4e21d81c489b,85639a53-b367-49ce-84f2-4e21d81c489b,1,0,24b59586-178e-4efc-90ae-529553f3bb6c,24b59586-178e-4efc-90ae-529553f3bb6c,1,0,20e75dd5-222a-4100-aa43-3684991e3f21,20e75dd5-222a-4100-aa43-3684991e3f21,1,0,3c611832-4bc2-4229-a27d-d5dc82f3a498,3c611832-4bc2-4229-a27d-d5dc82f3a498,1,0,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,1,0,5dadc422-1fbd-4918-9db3-09ec72c3404e,5dadc422-1fbd-4918-9db3-09ec72c3404e,1,0,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,1,0,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,1,0,c5478d09-c8d3-4cc6-878e-27656ecc8409,c5478d09-c8d3-4cc6-878e-27656ecc8409,1,0,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,1,0,75974146-5b1a-412c-b7d5-1575704bbdab,75974146-5b1a-412c-b7d5-1575704bbdab,1,0,949f87cb-258c-4b6b-95ee-8a7491a4b64e,949f87cb-258c-4b6b-95ee-8a7491a4b64e,1,0,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,1,0,5c089988-5381-41ed-9f05-f85db46b8d94,5c089988-5381-41ed-9f05-f85db46b8d94,1,0,85a36352-1569-4ce4-aeba-477db524c36d,85a36352-1569-4ce4-aeba-477db524c36d,1,0,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,1,0,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,d99991b8-3a81-4e18-b0ad-05fc3e3a199b,1,0,dd383422-dddb-4a81-9326-015fd345b5c1,dd383422-dddb-4a81-9326-015fd345b5c1,1,0,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,1,0,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,1,0,aa299fc6-051f-487c-ada4-451e08c4763c,aa299fc6-051f-487c-ada4-451e08c4763c,1,0,782cb93d-36e6-4923-b2b6-75caa3459cd6,782cb93d-36e6-4923-b2b6-75caa3459cd6,1,0,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,1,0,322645d4-e3fb-467b-a55d-d8e74cff2ea3,322645d4-e3fb-467b-a55d-d8e74cff2ea3,1,0,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,0f314b6b-5ed1-46ed-bdfd-cf53330c2783,1,0,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,1,0,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,5ea29362-0ab7-4ca3-865e-bf93db5ca24b,1,0,64ff6058-c6f3-4682-b9a1-11ec438fa447,64ff6058-c6f3-4682-b9a1-11ec438fa447,1,0,ced01234-9417-49ce-adf0-8cdd15e6dd7d,ced01234-9417-49ce-adf0-8cdd15e6dd7d,1,0,c1272bfc-196a-4f99-935f-e2516bc138d2,c1272bfc-196a-4f99-935f-e2516bc138d2,1,0,313e0688-745a-4385-b040-7ef8317a0eb7,313e0688-745a-4385-b040-7ef8317a0eb7,1,0,7fe61c5d-30bc-440d-9e40-12ff3b296616,7fe61c5d-30bc-440d-9e40-12ff3b296616,1,0,37c37f15-f84b-456b-aab6-729562dc0908,37c37f15-f84b-456b-aab6-729562dc0908,1,0,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,1,0,996c7873-1cc9-44f6-915b-5c6ed7ef2370,996c7873-1cc9-44f6-915b-5c6ed7ef2370,1,0,8dc08932-0988-4e82-8a5f-385c0694f9ff,8dc08932-0988-4e82-8a5f-385c0694f9ff,1,0,13dee5d8-f165-48de-9ccb-3ef0239f4b27,13dee5d8-f165-48de-9ccb-3ef0239f4b27,1,0,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,1,0,8a13c899-1659-48cf-9aa2-07ca99547b7b,8a13c899-1659-48cf-9aa2-07ca99547b7b,1,0,eb3f959c-94a4-4e77-b9f9-e81954254079,eb3f959c-94a4-4e77-b9f9-e81954254079,1,0,71dfde27-3762-4dd0-9252-6e703ce1b101,71dfde27-3762-4dd0-9252-6e703ce1b101,1,0,d8fc4644-5351-443c-8b5d-5de2c4b855d1,d8fc4644-5351-443c-8b5d-5de2c4b855d1,1,0,0f039952-09d3-49c8-b909-e8333a3fc8f9,0f039952-09d3-49c8-b909-e8333a3fc8f9,1,0,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,9cd2fc77-a4b0-457e-a6b0-63dbf521bf90,1,0,8363bd46-1ea5-44f0-858a-05bc03f6020e,8363bd46-1ea5-44f0-858a-05bc03f6020e,1,0,a321b6db-391b-4c65-8d27-ce486d10055e,a321b6db-391b-4c65-8d27-ce486d10055e,1,0,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,800ef5f0-fdd1-4f8b-8c0b-9744952bfb5b,1,0,99387869-f8b1-4269-bd26-e39380d17b69,99387869-f8b1-4269-bd26-e39380d17b69,1,0,4b2acdb9-fefd-4735-9dfd-d7d141967f3c,4b2acdb9-fefd-4735-9dfd-d7d141967f3c,1,0,bc07d643-a044-4882-b95b-2173a197fd0e,bc07d643-a044-4882-b95b-2173a197fd0e,1,0,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,1,0,7974e41d-5af3-4636-b405-c9405d89fb53,7974e41d-5af3-4636-b405-c9405d89fb53,1,0,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,1,0,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,1,0,826c2821-147d-4aaf-910c-acfbdb58a29f,826c2821-147d-4aaf-910c-acfbdb58a29f,1,0,36d6b0e1-5e10-408a-8eb1-09839e57690f,36d6b0e1-5e10-408a-8eb1-09839e57690f,1,0,6423b849-7ca4-4501-8856-445157d7e5df,6423b849-7ca4-4501-8856-445157d7e5df,1,0,0819e2b0-1eb0-41b3-ab89-0974bd926fb6,0819e2b0-1eb0-41b3-ab89-0974bd926fb6,1,0,e814287f-1c13-4f74-9507-d22a62394fd2,e814287f-1c13-4f74-9507-d22a62394fd2,1,0,417ac987-7369-45af-b670-fdffb048f33d,417ac987-7369-45af-b670-fdffb048f33d,1,0,640a5d72-dbc7-421b-afdb-cc3a4622ae04,640a5d72-dbc7-421b-afdb-cc3a4622ae04,1,0,79da84c1-5ac2-4472-8eb9-f0484b9582c2,79da84c1-5ac2-4472-8eb9-f0484b9582c2,1,0,2d0b161b-7d69-4ec4-a483-79bd458cb62c,2d0b161b-7d69-4ec4-a483-79bd458cb62c,1,0,f178bc1b-ebea-4fa9-8861-fe0d91f103e4,f178bc1b-ebea-4fa9-8861-fe0d91f103e4,1,0,e33a9c94-7e98-4b38-ba20-4546a90b2937,e33a9c94-7e98-4b38-ba20-4546a90b2937,1,0,1610e73c-58df-41cc-8349-51b920806821,1610e73c-58df-41cc-8349-51b920806821,1,0,ae37f465-1ee5-4f06-a834-deea9e9e0eb3,ae37f465-1ee5-4f06-a834-deea9e9e0eb3,1,0,c6ccf82f-f130-4037-9e89-1e0365b996a4,c6ccf82f-f130-4037-9e89-1e0365b996a4,1,0,c532963e-0d92-44b9-9cfc-43ed2744ccf9,c532963e-0d92-44b9-9cfc-43ed2744ccf9,1,0,6aff2855-24d4-4f90-b617-53326efdd1bd,6aff2855-24d4-4f90-b617-53326efdd1bd,1,0,0107a9c7-4c85-49c4-918a-925d85d57a0b,0107a9c7-4c85-49c4-918a-925d85d57a0b,1,0,6e1efa55-969b-4c2b-8af2-b11d672db5f0,6e1efa55-969b-4c2b-8af2-b11d672db5f0,1,0,e5b578a1-e33b-4d49-8064-427aa928a844,e5b578a1-e33b-4d49-8064-427aa928a844,1,0,f74e97ad-fef6-4122-a056-86f2d59dfdaf,f74e97ad-fef6-4122-a056-86f2d59dfdaf,1,0,df1ef691-1e86-4a80-8671-53b3d4504bfb,df1ef691-1e86-4a80-8671-53b3d4504bfb,1,0,474b9918-23da-4289-91a9-9115526c9b5d,474b9918-23da-4289-91a9-9115526c9b5d,1,0,1cf7be60-fd84-430d-b1b5-5619c51b8b3f,1cf7be60-fd84-430d-b1b5-5619c51b8b3f,1,0,60aa9d44-5986-490e-8093-f65e194b3607,60aa9d44-5986-490e-8093-f65e194b3607,1,0,a36dee5e-7184-4caf-bf46-3977b165093b,a36dee5e-7184-4caf-bf46-3977b165093b,1,0,aa3c61a7-c905-4b5a-a44d-e2ac5d79158a,aa3c61a7-c905-4b5a-a44d-e2ac5d79158a,1,0,182916b2-972b-4e39-93ba-d45aa7a195f5,182916b2-972b-4e39-93ba-d45aa7a195f5,1,0,2b654a53-7ce8-421f-aaf5-aa1451d91415,2b654a53-7ce8-421f-aaf5-aa1451d91415,1,0,30e55306-ea5c-4ef4-9903-ea030afa3d85,30e55306-ea5c-4ef4-9903-ea030afa3d85,1,0,234c1a72-8349-472a-8373-2a25ce6252f2,234c1a72-8349-472a-8373-2a25ce6252f2,1,0,b1ccb9f7-11ff-4ad2-8806-d64de84662f0,b1ccb9f7-11ff-4ad2-8806-d64de84662f0,1,0,539e0db9-be24-4086-9632-af20553ee50f,539e0db9-be24-4086-9632-af20553ee50f,1,0,862e2759-5311-4c68-8977-86133bcf8c0e,862e2759-5311-4c68-8977-86133bcf8c0e,1,0,b9adeb51-a009-4e83-85f8-bfa1547429d6,b9adeb51-a009-4e83-85f8-bfa1547429d6,1,0,ac9f4c2e-316b-4f96-8fe6-fb5a5a7e48ed,ac9f4c2e-316b-4f96-8fe6-fb5a5a7e48ed,1,0,da808c0e-b1b0-4d46-8c63-2bbe7d0dca9d,da808c0e-b1b0-4d46-8c63-2bbe7d0dca9d,1,0,b848d70a-9d08-4b1a-8df1-17697432516d,b848d70a-9d08-4b1a-8df1-17697432516d,1,0,9a30b92d-0c5b-4e11-a741-2b6efa8ac229,9a30b92d-0c5b-4e11-a741-2b6efa8ac229,1,0,92876c9e-52ff-480d-9878-5766f4f9d12c,92876c9e-52ff-480d-9878-5766f4f9d12c,1,0,b729d739-5249-4765-85ee-fd792bb22911,b729d739-5249-4765-85ee-fd792bb22911,1,0,d65c4485-7bac-4206-9a6c-7156f4bb876d,d65c4485-7bac-4206-9a6c-7156f4bb876d,1,0,d431d1e2-13dc-495c-9de1-b5ec872eceed,d431d1e2-13dc-495c-9de1-b5ec872eceed,1,0,e8bec681-d269-41ba-9184-556cbcc27d74,e8bec681-d269-41ba-9184-556cbcc27d74,1,0,b8aaef91-f72c-4127-a494-771c13694ca4,b8aaef91-f72c-4127-a494-771c13694ca4,1,0,433a114f-3198-4ef6-bbf8-ce9b54fdb736,433a114f-3198-4ef6-bbf8-ce9b54fdb736,1,0,02ac711c-e38e-422e-ac28-ba1b298df9cc,02ac711c-e38e-422e-ac28-ba1b298df9cc,1,0,3e090261-4aa2-4ece-9f77-62df83c890b3,3e090261-4aa2-4ece-9f77-62df83c890b3,1,0,9292034c-24e8-49a7-9b77-7974e117847d,9292034c-24e8-49a7-9b77-7974e117847d,1,0,3327b7d4-62fc-44cc-83b4-c449bfa4e706,3327b7d4-62fc-44cc-83b4-c449bfa4e706,1,0,43ecee25-68eb-48cf-bbaa-aee71052438f,43ecee25-68eb-48cf-bbaa-aee71052438f,1,0,93799f8b-0188-4546-8815-35e733bcc2b1,93799f8b-0188-4546-8815-35e733bcc2b1,1,0,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,1,0,c9ea4e72-5f01-42ae-88e3-52e49757b26f,c9ea4e72-5f01-42ae-88e3-52e49757b26f,1,0,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,1,0,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0f564dbe-6a6e-48df-9718-5cea5d608ee6,1,0,a623fef1-96eb-41ba-93fe-09162698f419,a623fef1-96eb-41ba-93fe-09162698f419,1,0,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,1,0,d8e1f92f-9efa-422d-bb21-43bd1a363cec,d8e1f92f-9efa-422d-bb21-43bd1a363cec,1,0,c1416383-bd7e-4dc4-ad88-d98ac87157fd,c1416383-bd7e-4dc4-ad88-d98ac87157fd,1,0,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,1,0,d5d9976a-4cc0-43f7-afd6-d43cebb07940,d5d9976a-4cc0-43f7-afd6-d43cebb07940,1,0,899f1526-d6bc-42ef-852e-7297a06db9e3,899f1526-d6bc-42ef-852e-7297a06db9e3,1,0,1b4feda1-e555-4b85-b236-b21153a7246f,1b4feda1-e555-4b85-b236-b21153a7246f,1,0,61d3cef4-2c42-417d-a762-a2d2f5a28924,61d3cef4-2c42-417d-a762-a2d2f5a28924,1,0,c694c132-1ddb-4273-818a-d3cca88c082a,c694c132-1ddb-4273-818a-d3cca88c082a,1,0,cd4da06e-c06b-4233-befc-1bc4c4db58e3,cd4da06e-c06b-4233-befc-1bc4c4db58e3,1,0,918a01fe-f753-4a4a-9200-55bbd6edaf5f,918a01fe-f753-4a4a-9200-55bbd6edaf5f,1,0,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,1,0,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,1,0,7ab6acda-6732-4582-8092-d43f9a98a28d,7ab6acda-6732-4582-8092-d43f9a98a28d,1,0,5ab1d405-bfc3-4440-8cdd-3a63013b064d,5ab1d405-bfc3-4440-8cdd-3a63013b064d,1,0,d6704410-6297-481e-a6cb-6d6aa566b4f8,d6704410-6297-481e-a6cb-6d6aa566b4f8,1,0,398937ca-b035-43bd-b0da-8c5153a87cb8,398937ca-b035-43bd-b0da-8c5153a87cb8,1,0,5b441321-bd1e-4c56-8f09-365b05985eed,5b441321-bd1e-4c56-8f09-365b05985eed,1,0,6bcba052-4d81-409d-b1a2-eed6be6fb024,6bcba052-4d81-409d-b1a2-eed6be6fb024,1,0,559f1e66-e8da-437a-aa27-d0e1be6619b6,559f1e66-e8da-437a-aa27-d0e1be6619b6,1,0,704d69cd-d921-4957-a004-43bd7eb4d979,704d69cd-d921-4957-a004-43bd7eb4d979,1,0,f1594682-16ac-408c-8307-a7a8db79b09f,f1594682-16ac-408c-8307-a7a8db79b09f,1,0,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,1,0,4cb814d8-cb1b-4366-b500-e820ad526b0c,4cb814d8-cb1b-4366-b500-e820ad526b0c,1,0,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,1,0,6c43df9f-ca36-415b-afec-302807820d73,6c43df9f-ca36-415b-afec-302807820d73,1,0,c7fb7551-806a-40b2-8879-14cd897b60d8,c7fb7551-806a-40b2-8879-14cd897b60d8,1,0,68337023-d573-4d04-95b6-44f73258c2a4,68337023-d573-4d04-95b6-44f73258c2a4,1,0,7cf39337-b722-486f-8e37-a62239d0ccd2,7cf39337-b722-486f-8e37-a62239d0ccd2,1,0,2571cfaf-d876-4385-a60a-1488aacf7080,2571cfaf-d876-4385-a60a-1488aacf7080,1,0,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,1,0,44398566-3189-4584-8f8a-9deb1d07ce41,44398566-3189-4584-8f8a-9deb1d07ce41,1,0,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,1,0,accfa63a-479d-4996-95bc-cdf5acdf203c,accfa63a-479d-4996-95bc-cdf5acdf203c,1,0,351998e0-8939-4dd4-a833-f4756bcc53b8,351998e0-8939-4dd4-a833-f4756bcc53b8,1,0,093332f5-3eb4-478c-ac95-59dcdc96765a,093332f5-3eb4-478c-ac95-59dcdc96765a,1,0,cd69bad8-524e-4be4-88cc-7732a88b38b8,cd69bad8-524e-4be4-88cc-7732a88b38b8,1,0,0a32248c-6994-4988-90d1-30882bc9da6b,0a32248c-6994-4988-90d1-30882bc9da6b,1,0,b57b53cb-6972-4bda-ae46-96571be1ebec,b57b53cb-6972-4bda-ae46-96571be1ebec,1,0,1a1a9636-fb72-4e4a-af96-5858442b1e61,1a1a9636-fb72-4e4a-af96-5858442b1e61,1,0,bca9cf34-9e11-4014-976a-28c4330b136e,bca9cf34-9e11-4014-976a-28c4330b136e,1,0,65fffe1a-6f36-4f50-975f-4471ad29d3ec,65fffe1a-6f36-4f50-975f-4471ad29d3ec,1,0,8fe5dad5-686a-4631-ae05-2917c33f7d83,8fe5dad5-686a-4631-ae05-2917c33f7d83,1,0,edef86c6-73bf-4e47-b62d-b2b548a732cd,edef86c6-73bf-4e47-b62d-b2b548a732cd,1,0,a1715044-d76f-4238-ba3e-989d04078d83,a1715044-d76f-4238-ba3e-989d04078d83,1,0,e72e59c0-391d-497e-9407-063e0edf573e,e72e59c0-391d-497e-9407-063e0edf573e,1,0,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,ae8a1e69-ee1c-4efa-8d63-0279b18617f6,1,0,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,1,0,299c47a7-0b30-4f62-8f5c-f087ad6411fb,299c47a7-0b30-4f62-8f5c-f087ad6411fb,1,0,4d4724df-24fb-4c59-9d04-3f984906214a,4d4724df-24fb-4c59-9d04-3f984906214a,1,0,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,1,0,cb9b73ee-8531-48d9-9266-9aaa4336a612,cb9b73ee-8531-48d9-9266-9aaa4336a612,1,0,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,1,0,d042687f-0725-4611-a868-f5b4f6a3a3a8,d042687f-0725-4611-a868-f5b4f6a3a3a8,1,0,bb143340-7fff-49ef-b121-355c96613f78,bb143340-7fff-49ef-b121-355c96613f78,1,0,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,1,0,f2f69644-80dc-4b5e-a208-ed1de131e25e,f2f69644-80dc-4b5e-a208-ed1de131e25e,1,0,73060f72-6d08-47da-aac8-d4d2ed8f871c,73060f72-6d08-47da-aac8-d4d2ed8f871c,1,0,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,82e8ac21-c2aa-47de-89ae-ea6cc10cc862,1,0,13b27ec3-2be9-4959-92e5-94ba7bb64f03,13b27ec3-2be9-4959-92e5-94ba7bb64f03,1,0,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,1,0,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,1,0,821225ea-1bad-49a6-a422-80d8a09baf13,821225ea-1bad-49a6-a422-80d8a09baf13,1,0,d0106f3a-8490-4277-a278-75c318ec252c,d0106f3a-8490-4277-a278-75c318ec252c,1,0,5035aa55-d557-419a-89e2-10ed0f8d109b,5035aa55-d557-419a-89e2-10ed0f8d109b,1,0,5f93d2af-64ff-41cc-8403-4a0e83160fea,5f93d2af-64ff-41cc-8403-4a0e83160fea,1,0,c12c90e4-7c40-489b-b14b-6b9442016e0f,c12c90e4-7c40-489b-b14b-6b9442016e0f,1,0,6371e288-3502-4d66-9006-b5a36107c0b7,6371e288-3502-4d66-9006-b5a36107c0b7,1,0,245814f7-028c-4c13-98eb-15412e851f81,245814f7-028c-4c13-98eb-15412e851f81,1,0,0132e564-2cd3-4930-8962-1068532f4be4,0132e564-2cd3-4930-8962-1068532f4be4,1,0,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,1,0,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,1,0,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,1,0,7021fca5-d612-43e1-927b-7f822153cf75,7021fca5-d612-43e1-927b-7f822153cf75,1,0,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,1,0,ee0a8d23-660a-492b-a813-b57394acee05,ee0a8d23-660a-492b-a813-b57394acee05,1,0,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,1,0,11c5930d-f882-46bd-9e7b-63e5344f6604,11c5930d-f882-46bd-9e7b-63e5344f6604,1,0,ade21e2e-349f-414b-8f35-6ae3b6a4064d,ade21e2e-349f-414b-8f35-6ae3b6a4064d,1,0,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,1,0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,1,0,83f51efe-e2af-459a-b59f-2c036124ac23,83f51efe-e2af-459a-b59f-2c036124ac23,1,0,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,1,0,b03829e9-ba22-4584-85f0-c36d63f48242,b03829e9-ba22-4584-85f0-c36d63f48242,1,0,084a7c95-a59b-4861-b8b3-b5710a57ac60,084a7c95-a59b-4861-b8b3-b5710a57ac60,1,0,efcea6da-6746-4e00-913a-14cab38b5d84,efcea6da-6746-4e00-913a-14cab38b5d84,1,0,aff367fb-7fca-44d0-adf9-3731f14834f6,aff367fb-7fca-44d0-adf9-3731f14834f6,1,0,a2782760-dd4c-44d2-a785-814d6f610455,a2782760-dd4c-44d2-a785-814d6f610455,1,0,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,1,0,6581ac1f-11ef-42b8-9f3b-590bb7546e63,6581ac1f-11ef-42b8-9f3b-590bb7546e63,1,0,ce952e88-35b7-4506-81ac-d7081e50a650,ce952e88-35b7-4506-81ac-d7081e50a650,1,0,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,1,0,3bf1281f-7570-4633-86b9-3e953a7e6647,3bf1281f-7570-4633-86b9-3e953a7e6647,1,0,715dc289-5b14-4ee0-8716-9c15958b9069,715dc289-5b14-4ee0-8716-9c15958b9069,1,0,92707138-5004-4378-8477-f909166d319d,92707138-5004-4378-8477-f909166d319d,1,0,43661775-43bb-4d9e-bfbb-c46e7d194ca3,43661775-43bb-4d9e-bfbb-c46e7d194ca3,1,0,532637ef-be0d-4f42-9747-a88e17eb3def,532637ef-be0d-4f42-9747-a88e17eb3def,1,0,61127152-3e24-40b4-8a23-5eb6cae568ff,61127152-3e24-40b4-8a23-5eb6cae568ff,1,0,ffd987e3-e8af-4d46-881e-1e312e74dbac,ffd987e3-e8af-4d46-881e-1e312e74dbac,1,0,ad1142ed-183d-47a3-800c-997a3770e11e,ad1142ed-183d-47a3-800c-997a3770e11e,1,0,ebef37c6-4808-4683-93be-036ce19cafd5,ebef37c6-4808-4683-93be-036ce19cafd5,1,0,66364cd4-aaa5-421d-96d6-3c283c14650d,66364cd4-aaa5-421d-96d6-3c283c14650d,1,0,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,1,0,3c54d440-e908-43d6-a5cc-bb64620c82d7,3c54d440-e908-43d6-a5cc-bb64620c82d7,1,0,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,1,0,bf1dd911-8ee1-407b-acae-10c85b74baf3,bf1dd911-8ee1-407b-acae-10c85b74baf3,1,0,e924058f-25c3-4744-a565-836b824991b7,e924058f-25c3-4744-a565-836b824991b7,1,0,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,1,0,518dcd70-4ccf-4866-a94f-7ceec7dd2801,518dcd70-4ccf-4866-a94f-7ceec7dd2801,1,0,f9950ab5-1077-4033-bbbf-53899a1bcf33,f9950ab5-1077-4033-bbbf-53899a1bcf33,1,0,8f16763b-86f0-4ad0-b786-cce7dcb3460e,8f16763b-86f0-4ad0-b786-cce7dcb3460e,1,0,0481bc65-6a32-46b9-ae87-993ba52a29a5,0481bc65-6a32-46b9-ae87-993ba52a29a5,1,0,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,1,0,dbc5f419-63b0-4cbe-90ff-c0101105e46c,dbc5f419-63b0-4cbe-90ff-c0101105e46c,1,0,c708f6e9-b7a0-4046-90f3-83527da7b872,c708f6e9-b7a0-4046-90f3-83527da7b872,1,0,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,1,0,14256e0a-a947-42a3-8e36-47bfbb052a0c,14256e0a-a947-42a3-8e36-47bfbb052a0c,1,0,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1,0,c0dcdb22-6719-4597-a781-bca1370909e5,c0dcdb22-6719-4597-a781-bca1370909e5,1,0,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,7ebf99c3-33d2-4e4c-ac45-ca4ed0c3c100,1,0,7a34f723-cd14-4949-a40f-7ce579bf0449,7a34f723-cd14-4949-a40f-7ce579bf0449,1,0,5cdc9ac7-bba9-4ed1-845a-607976fc4679,5cdc9ac7-bba9-4ed1-845a-607976fc4679,1,0,86c22871-6d1c-44e0-8ade-ce4bdeb23321,86c22871-6d1c-44e0-8ade-ce4bdeb23321,1,0,da51de81-4d4f-46b5-a308-7b50db6c45a7,da51de81-4d4f-46b5-a308-7b50db6c45a7,1,0,c2a8c2d3-ff13-4a13-acd4-797118c4e767,c2a8c2d3-ff13-4a13-acd4-797118c4e767,1,0,bc6adf75-8666-49f3-9703-b0014dfee123,bc6adf75-8666-49f3-9703-b0014dfee123,1,0,30632f54-b779-4857-a5cc-c53fe8887ee5,30632f54-b779-4857-a5cc-c53fe8887ee5,1,0,087480bb-8c89-4b00-a29b-b7e29926478d,087480bb-8c89-4b00-a29b-b7e29926478d,1,0,685373b7-638a-439a-8cba-703d56e4e404,685373b7-638a-439a-8cba-703d56e4e404,1,0,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,1,0,df22b227-b2c3-4e65-9706-7582f99fe59c,df22b227-b2c3-4e65-9706-7582f99fe59c,1,0,35828c88-f1ec-42e7-b189-78748931ee4a,35828c88-f1ec-42e7-b189-78748931ee4a,1,0,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,1,0,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1,0,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,1,0,921a0a14-8c06-4894-95ce-423000769364,921a0a14-8c06-4894-95ce-423000769364,1,0,3805ee39-a48a-499a-9ef8-9c2a5985404f,3805ee39-a48a-499a-9ef8-9c2a5985404f,1,0,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,1,0,08c2f92c-eb05-49e7-bfc9-4a89607b9864,08c2f92c-eb05-49e7-bfc9-4a89607b9864,1,0,6d751379-89a7-49b5-93e5-578329c63d9c,6d751379-89a7-49b5-93e5-578329c63d9c,1,0,c3f156ef-947e-4ebb-883f-4f099a116063,c3f156ef-947e-4ebb-883f-4f099a116063,1,0,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,1,0,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,1,0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,1,0,e98e9e56-2995-430c-bd3b-f1070aec15a5,e98e9e56-2995-430c-bd3b-f1070aec15a5,1,0,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,1,0,8a7546f4-bfc9-4732-bf60-43a41e2c8753,8a7546f4-bfc9-4732-bf60-43a41e2c8753,1,0,16244165-d5a4-4012-8bb5-7f5fee1111af,16244165-d5a4-4012-8bb5-7f5fee1111af,1,0,290b72ad-004f-46ab-be5e-47557543b965,290b72ad-004f-46ab-be5e-47557543b965,1,0,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,1,0,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,1,0,263bcd20-9878-48d4-aac4-b371ec49d8d6,263bcd20-9878-48d4-aac4-b371ec49d8d6,1,0,da1d8660-2757-4cea-bae0-c2210b9406ae,da1d8660-2757-4cea-bae0-c2210b9406ae,1,0,d60329c6-8f48-481d-82e7-18da355cb09c,d60329c6-8f48-481d-82e7-18da355cb09c,1,0,67a04d72-afea-487a-b629-e4b7dfc1df32,67a04d72-afea-487a-b629-e4b7dfc1df32,1,0,c4b14162-b25b-4099-9ec3-7251848ef08a,c4b14162-b25b-4099-9ec3-7251848ef08a,1,0,8eb5ba97-eb38-4357-8bfc-e9618280800d,8eb5ba97-eb38-4357-8bfc-e9618280800d,1,0,b72f73d5-e274-472b-871b-16af72dab603,b72f73d5-e274-472b-871b-16af72dab603,1,0,b008d184-0b61-460d-9490-89ecc1cd58ba,b008d184-0b61-460d-9490-89ecc1cd58ba,1,0,c8340e2f-6958-4bcd-8e17-499c4adfe60b,c8340e2f-6958-4bcd-8e17-499c4adfe60b,1,0,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,1,0,03f68d82-752c-45d1-bf9a-60ecd21a2c81,03f68d82-752c-45d1-bf9a-60ecd21a2c81,1,0,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,1,0,d4fffc79-2841-49a9-a382-e9e4138984df,d4fffc79-2841-49a9-a382-e9e4138984df,1,0,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,1,0,9f41f903-d316-4189-8dc0-603ea9036c1c,9f41f903-d316-4189-8dc0-603ea9036c1c,1,0,e19e70d6-8707-4dde-ae69-7bd97035ca03,e19e70d6-8707-4dde-ae69-7bd97035ca03,1,0,425b5272-1130-457d-8a05-aee8fad681d9,425b5272-1130-457d-8a05-aee8fad681d9,1,0,8d583436-f2a6-4a33-8137-1376f5754643,8d583436-f2a6-4a33-8137-1376f5754643,1,0,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,1,0,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,1,0,8f09cbed-6f24-461f-9b35-31c64310e74a,8f09cbed-6f24-461f-9b35-31c64310e74a,1,0,2d66502d-77ab-4cc9-9ccf-5433458fae9f,2d66502d-77ab-4cc9-9ccf-5433458fae9f,1,0,cff48da7-3c46-4602-83e8-90c9ea53e107,cff48da7-3c46-4602-83e8-90c9ea53e107,1,0,7155472d-c791-402c-96e1-d25612024c88,7155472d-c791-402c-96e1-d25612024c88,1,0,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,1,0,9005911d-ea81-48b6-bf50-1a328ff4d7be,9005911d-ea81-48b6-bf50-1a328ff4d7be,1,0,7df12006-c0c0-42a6-b852-bdced72c62e3,7df12006-c0c0-42a6-b852-bdced72c62e3,1,0,9c00987d-3c55-40eb-bae8-f36e71e4ef87,9c00987d-3c55-40eb-bae8-f36e71e4ef87,1,0,29273130-5142-48c9-8399-00e5ab4b6203,29273130-5142-48c9-8399-00e5ab4b6203,1,0,9e14cd7e-1293-4008-baf8-88df6a98abf7,9e14cd7e-1293-4008-baf8-88df6a98abf7,1,0,211d226f-dac6-43d5-8720-952da4339e35,211d226f-dac6-43d5-8720-952da4339e35,1,0,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,df67cdcd-20ff-46d4-902b-dc4d81ee46bd,1,0,98e3aace-52a6-4911-8205-92165adca6de,98e3aace-52a6-4911-8205-92165adca6de,1,0,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,1,0,577e5fea-b792-4c8b-b3b3-a03a14b64b04,577e5fea-b792-4c8b-b3b3-a03a14b64b04,1,0,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,1,0,b18d312b-f9c3-4f37-ac77-d499e949f154,b18d312b-f9c3-4f37-ac77-d499e949f154,1,0,ace2beea-d393-412f-8b71-b845b665e2c4,ace2beea-d393-412f-8b71-b845b665e2c4,1,0,463b8966-a5f9-4a80-82b9-1608a1622e13,463b8966-a5f9-4a80-82b9-1608a1622e13,1,0,f02e807c-6cd3-4a4f-8dad-73bd56ee98ff,f02e807c-6cd3-4a4f-8dad-73bd56ee98ff,1,0,eefd00fe-3241-498f-aeb4-d429a86ab563,eefd00fe-3241-498f-aeb4-d429a86ab563,1,0,802d3489-318f-467d-a9f4-d7c644edac60,802d3489-318f-467d-a9f4-d7c644edac60,1,0,3fd4bc77-2a1b-4750-a54a-4171c8d40027,3fd4bc77-2a1b-4750-a54a-4171c8d40027,1,0,5b27fde9-fa80-48b1-aea1-73e132b9a944,5b27fde9-fa80-48b1-aea1-73e132b9a944,1,0,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,1,0,a747ec6b-f230-49b4-a929-7ed1ba87b078,a747ec6b-f230-49b4-a929-7ed1ba87b078,1,0,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,1,0,01cb357c-af28-4855-afae-45b6df19b344,01cb357c-af28-4855-afae-45b6df19b344,1,0,26e58429-1e08-454a-b4d7-2470390149fb,26e58429-1e08-454a-b4d7-2470390149fb,1,0,daa42bf5-9c32-4913-bc27-38f77ccc1a9f,daa42bf5-9c32-4913-bc27-38f77ccc1a9f,1,0,7620b61a-b0d1-4c71-bc80-72c48e17b96d,7620b61a-b0d1-4c71-bc80-72c48e17b96d,1,0,4802e016-a9e9-47d0-916b-b42194a1f388,4802e016-a9e9-47d0-916b-b42194a1f388,1,0,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,1,0,4062674a-4a81-494d-82bc-4984cd7c7903,4062674a-4a81-494d-82bc-4984cd7c7903,1,0,782a8801-06ca-4d63-bf8b-63d2320766d8,782a8801-06ca-4d63-bf8b-63d2320766d8,1,0,93a73123-d98c-4286-9269-7bfcedd115e8,93a73123-d98c-4286-9269-7bfcedd115e8,1,0,c5985c02-1824-4ce9-b415-1621dd2ee864,c5985c02-1824-4ce9-b415-1621dd2ee864,1,0,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,1,0,e819aaf6-3dfb-492a-8a4a-50a7c6854790,e819aaf6-3dfb-492a-8a4a-50a7c6854790,1,0,62b95ba1-f213-42fb-90f3-a03e8094bc9e,62b95ba1-f213-42fb-90f3-a03e8094bc9e,1,0,619b534d-5605-40d3-9b8c-4443a21d7795,619b534d-5605-40d3-9b8c-4443a21d7795,1,0,a010bbf4-d547-4576-9797-28e3096ffed3,a010bbf4-d547-4576-9797-28e3096ffed3,1,0,a44c3eb2-1054-41ca-82e8-fc35336e7009,a44c3eb2-1054-41ca-82e8-fc35336e7009,1,0,01f67911-4ca7-4668-b970-62c299b98e56,01f67911-4ca7-4668-b970-62c299b98e56,1,0,20c89c94-f77f-4e14-8c97-2a70c1419ce3,20c89c94-f77f-4e14-8c97-2a70c1419ce3,1,0,aa509aa3-dd45-41f3-82c7-59662c2e2c47,aa509aa3-dd45-41f3-82c7-59662c2e2c47,1,0,c4552529-e69e-4c5c-bd66-04b2f7dac281,c4552529-e69e-4c5c-bd66-04b2f7dac281,1,0,381b49ba-793a-4418-9fd4-598844fb72a6,381b49ba-793a-4418-9fd4-598844fb72a6,1,0,1aee302d-df31-49ea-b542-436dc1d79ae1,1aee302d-df31-49ea-b542-436dc1d79ae1,1,0,593509da-d33c-49ff-a62c-a28cbc4651c1,593509da-d33c-49ff-a62c-a28cbc4651c1,1,0,5e346a0b-a322-4565-adb9-70131fb05fa3,5e346a0b-a322-4565-adb9-70131fb05fa3,1,0,9a69c559-194b-4f74-9879-82740260f5f6,9a69c559-194b-4f74-9879-82740260f5f6,1,0,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,93bf1dcf-670d-4c8b-bdbf-e43c2edf8056,1,0,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,8a06f980-78f3-42f4-9d96-da2e0f0f36a7,1,0,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,fee2aa74-7a81-4ab2-a457-2edf8ac1aa2d,1,0,2e19fb7b-270f-4181-b4a1-640280bbbc5c,2e19fb7b-270f-4181-b4a1-640280bbbc5c,1,0,cf69b045-665d-4f6c-827f-5044beacd125,cf69b045-665d-4f6c-827f-5044beacd125,1,0,aa773eef-0c4a-49be-9f5e-9131bc041415,aa773eef-0c4a-49be-9f5e-9131bc041415,1,0,9b31e474-01d4-4c3b-a633-3a2ff3917d62,9b31e474-01d4-4c3b-a633-3a2ff3917d62,1,0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1,0,8d7750e9-899f-4434-8702-44cd02681779,8d7750e9-899f-4434-8702-44cd02681779,1,0,d85244dc-c417-4e69-9aa7-7ad313ecb940,d85244dc-c417-4e69-9aa7-7ad313ecb940,1,0,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,1,0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,1,0,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,1,0,0713de12-87d5-4877-bd8a-2b6466df67df,0713de12-87d5-4877-bd8a-2b6466df67df,1,0,b3f188f4-d83e-4e97-b7d3-fc384b46a80a,b3f188f4-d83e-4e97-b7d3-fc384b46a80a,1,0,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,1,0,c4d7c569-4649-4f98-a048-45f3c5933670,c4d7c569-4649-4f98-a048-45f3c5933670,1,0,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,1,0,ad08b104-01f8-4900-a06c-baa1d55eba84,ad08b104-01f8-4900-a06c-baa1d55eba84,1,0,9352d10d-188f-4074-8dd1-7be5c11525e3,9352d10d-188f-4074-8dd1-7be5c11525e3,1,0,1933634a-6f10-48e7-99f0-60ac338f7832,1933634a-6f10-48e7-99f0-60ac338f7832,1,0,655deec5-c079-4748-8521-b3f10c243394,655deec5-c079-4748-8521-b3f10c243394,1,0,f6d4d818-d54c-4337-82cf-abd5e6dbe770,f6d4d818-d54c-4337-82cf-abd5e6dbe770,1,0,656c447b-291f-4e62-81ac-1c004841aa72,656c447b-291f-4e62-81ac-1c004841aa72,1,0,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,1,0,5ba93404-58ad-4321-9a62-27db828f75f6,5ba93404-58ad-4321-9a62-27db828f75f6,1,0,3da20e86-1d83-4935-b425-a91392dc8f35,3da20e86-1d83-4935-b425-a91392dc8f35,1,0,b56f25d2-72a9-4d80-8998-77ac3097c873,b56f25d2-72a9-4d80-8998-77ac3097c873,1,0,03bd775a-e0a1-4205-82ce-6068e73ad134,03bd775a-e0a1-4205-82ce-6068e73ad134,1,0,40bed47b-7754-4a70-b51a-47385fd46e83,40bed47b-7754-4a70-b51a-47385fd46e83,1,0,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,1,0,1e5a4f93-1ab9-4775-9538-2a1772215d89,1e5a4f93-1ab9-4775-9538-2a1772215d89,1,0,c25db165-0734-4fef-b161-e5164954a616,c25db165-0734-4fef-b161-e5164954a616,1,0,37e3d914-643e-4963-b4a0-7bc6727c0c9b,37e3d914-643e-4963-b4a0-7bc6727c0c9b,1,0,b6902500-3e03-4e83-a077-00500abc00b6,b6902500-3e03-4e83-a077-00500abc00b6,1,0,d253aa54-a447-44aa-bb13-82fd1ce22af4,d253aa54-a447-44aa-bb13-82fd1ce22af4,1,0,8936f114-7a0e-4a4c-8752-ccacab410778,8936f114-7a0e-4a4c-8752-ccacab410778,1,0,55649242-42fd-468f-a1e4-f6cd8871f7a4,55649242-42fd-468f-a1e4-f6cd8871f7a4,1,0,980e0883-cd8f-48c8-896f-ef185650f5c2,980e0883-cd8f-48c8-896f-ef185650f5c2,1,0,06ca1680-e641-499c-94ad-2d5ce5561747,06ca1680-e641-499c-94ad-2d5ce5561747,1,0,35bbf75b-99d0-447b-acb0-a3d2c98bea56,35bbf75b-99d0-447b-acb0-a3d2c98bea56,1,0,c31e34db-41ff-4db3-a4d0-f780f67070f6,c31e34db-41ff-4db3-a4d0-f780f67070f6,1,0,7a014fcb-a4b8-4c1c-b0de-21907a917c25,7a014fcb-a4b8-4c1c-b0de-21907a917c25,1,0,1688ef5d-72df-4bc4-a879-89033d466ad7,1688ef5d-72df-4bc4-a879-89033d466ad7,1,0,d3b09b09-df2d-40e5-86ce-84dab4898231,d3b09b09-df2d-40e5-86ce-84dab4898231,1,0,344cb0de-315d-4d05-93f8-8a1f53208470,344cb0de-315d-4d05-93f8-8a1f53208470,1,0,cd869887-0b0e-43db-8b51-04fe4a1341d5,cd869887-0b0e-43db-8b51-04fe4a1341d5,1,0,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,1,0,a7973409-b18e-4b88-ad50-e2ae89470d8f,a7973409-b18e-4b88-ad50-e2ae89470d8f,1,0,a537875e-492e-4cf2-96e9-e2e97bb206da,a537875e-492e-4cf2-96e9-e2e97bb206da,1,0,cd8fd85f-f02e-4f11-b4b4-40670febfaca,cd8fd85f-f02e-4f11-b4b4-40670febfaca,1,0,3f023afb-c02a-42ee-9afe-0f47ef3fe721,3f023afb-c02a-42ee-9afe-0f47ef3fe721,1,0,d7fe80d3-7fcf-427e-a991-5384f0c3947e,d7fe80d3-7fcf-427e-a991-5384f0c3947e,1,0,085a08f3-9d93-429d-9b1b-9065ab8363f7,085a08f3-9d93-429d-9b1b-9065ab8363f7,1,0,a530c0a1-c1d2-40bb-9d0e-320074dbb684,a530c0a1-c1d2-40bb-9d0e-320074dbb684,1,0,55c63580-16f1-4d6f-a40b-e630f71ebb98,55c63580-16f1-4d6f-a40b-e630f71ebb98,1,0,16939af9-e459-43da-8e0d-5d5891af6e0c,16939af9-e459-43da-8e0d-5d5891af6e0c,1,0,1d736a09-6c8f-433a-bf5b-201996bf4c62,1d736a09-6c8f-433a-bf5b-201996bf4c62,1,0,157988ad-d482-41df-b3e3-f2a0383d7130,157988ad-d482-41df-b3e3-f2a0383d7130,1,0,33af87a9-db69-41da-a33a-0435da2155e3,33af87a9-db69-41da-a33a-0435da2155e3,1,0,c95831b4-7d1d-4a9a-b5d0-caa03c4f4eca,c95831b4-7d1d-4a9a-b5d0-caa03c4f4eca,1,0,81b63f1d-2c65-4efb-8599-8a4d97b612ab,81b63f1d-2c65-4efb-8599-8a4d97b612ab,1,0,4b13a2c6-a6ce-47a0-8d9e-1a5dbe8d4b00,4b13a2c6-a6ce-47a0-8d9e-1a5dbe8d4b00,1,0,d1dde981-615a-461f-b0c5-a85f51003a2c,d1dde981-615a-461f-b0c5-a85f51003a2c,1,0,f5970c48-63d7-4064-bdfc-482b72939347,f5970c48-63d7-4064-bdfc-482b72939347,1,0,5c8039c0-34d8-4443-bd8f-dfe3dc2977a8,5c8039c0-34d8-4443-bd8f-dfe3dc2977a8,1,0,210972af-8687-4526-b288-60e7ee76cd61,210972af-8687-4526-b288-60e7ee76cd61,1,0,335f379a-2974-44ce-a668-e7ffe2ce6263,335f379a-2974-44ce-a668-e7ffe2ce6263,1,0,7edd75a2-9d03-4330-9185-28d0f0d4a2e4,7edd75a2-9d03-4330-9185-28d0f0d4a2e4,1,0,f7cc4f9e-cf9a-41f5-865f-d64108b981a5,f7cc4f9e-cf9a-41f5-865f-d64108b981a5,1,0,b58f8947-344c-4902-832c-d8004da55c34,b58f8947-344c-4902-832c-d8004da55c34,1,0,35cccc1d-3d67-4d39-aa79-2c30a5347587,35cccc1d-3d67-4d39-aa79-2c30a5347587,1,0,b6ee01eb-31ab-4f39-b4ff-37a04e3c7f35,b6ee01eb-31ab-4f39-b4ff-37a04e3c7f35,1,0,0776dfb2-67e0-4e11-9f94-abde790ff7e2,0776dfb2-67e0-4e11-9f94-abde790ff7e2,1,0,9c92b833-7406-48e2-9f59-69d575a3898f,9c92b833-7406-48e2-9f59-69d575a3898f,1,0,0cc5334f-8147-455c-8262-540324415812,0cc5334f-8147-455c-8262-540324415812,1,0,f3c4e6db-7c4e-4027-8bfd-f7854d566fc1,f3c4e6db-7c4e-4027-8bfd-f7854d566fc1,1,0,0eeb2f75-7092-4487-891f-cdbc9aa978cb,0eeb2f75-7092-4487-891f-cdbc9aa978cb,1,0,4ac60443-c7cb-492f-98b4-7e48bf9bfaa6,4ac60443-c7cb-492f-98b4-7e48bf9bfaa6,1,0,22979d50-ea57-4fab-9673-1b537838aead,22979d50-ea57-4fab-9673-1b537838aead,1,0,14676ee5-c247-46c6-a37e-c4362de79bb9,14676ee5-c247-46c6-a37e-c4362de79bb9,1,0,9fa36fe3-814e-4472-94ee-5d9d2b230b24,9fa36fe3-814e-4472-94ee-5d9d2b230b24,1,0,4b59dc62-0352-45a8-b33b-c42f4eea75ee,4b59dc62-0352-45a8-b33b-c42f4eea75ee,1,0,ea8a50ce-f09c-49f7-be58-ff2864e4eaa3,ea8a50ce-f09c-49f7-be58-ff2864e4eaa3,1,0,2020d672-bef4-4b30-885e-7f41364e412b,2020d672-bef4-4b30-885e-7f41364e412b,1,0,c292ddbc-9402-4c43-93d8-f8efafa6456e,c292ddbc-9402-4c43-93d8-f8efafa6456e,1,0,0281cbd6-972d-4632-9a6a-f8791e2534ee,0281cbd6-972d-4632-9a6a-f8791e2534ee,1,0,bae01f18-b6f3-44e4-93c3-ffcb3ef01b98,bae01f18-b6f3-44e4-93c3-ffcb3ef01b98,1,0,98d66bf0-617a-40aa-97bd-896d37a966ab,98d66bf0-617a-40aa-97bd-896d37a966ab,1,0,1847bb2f-8309-4c49-b752-ef7ec16d4230,1847bb2f-8309-4c49-b752-ef7ec16d4230,1,0,ca23f432-e2a3-4385-8cc1-7e9c96f9d7a1,ca23f432-e2a3-4385-8cc1-7e9c96f9d7a1,1,0,e1856045-f394-45b8-9f0c-298812f1f514,e1856045-f394-45b8-9f0c-298812f1f514,1,0,eb175c1d-7fcb-4807-82e3-688639468116,eb175c1d-7fcb-4807-82e3-688639468116,1,0,4ed9c099-700f-409b-bd91-e24719046953,4ed9c099-700f-409b-bd91-e24719046953,1,0,85b935b4-5eec-40cf-9d99-02cb3f599492,85b935b4-5eec-40cf-9d99-02cb3f599492,1,0,5764a412-4a20-4b2e-9905-ce74a9cac3ae,5764a412-4a20-4b2e-9905-ce74a9cac3ae,1,0,c4330791-d8f7-400f-b270-dee567e7a695,c4330791-d8f7-400f-b270-dee567e7a695,1,0,aab8ec4d-51de-4c1a-9794-266c119332d1,aab8ec4d-51de-4c1a-9794-266c119332d1,1,0,77cb6e52-37a9-423c-8260-6998161adcb5,77cb6e52-37a9-423c-8260-6998161adcb5,1,0,d903569d-911d-4277-a26f-afe2bf67eb09,d903569d-911d-4277-a26f-afe2bf67eb09,1,0,b5ac7de5-565f-4637-b267-dde3637e336b,b5ac7de5-565f-4637-b267-dde3637e336b,1,0,d4a6ab09-259f-4476-834c-a2b57cdeac05,d4a6ab09-259f-4476-834c-a2b57cdeac05,1,0,a56ff7f4-2259-455f-b707-b98aacd7d0b2,a56ff7f4-2259-455f-b707-b98aacd7d0b2,1,0,8c9636c3-0a84-4575-b4c7-6d8bb588e1b0,8c9636c3-0a84-4575-b4c7-6d8bb588e1b0,1,0,76e03401-7c07-4037-a464-d7377852de1d,76e03401-7c07-4037-a464-d7377852de1d,1,0,dc8239e8-fddf-411e-b51a-4230b63236cd,dc8239e8-fddf-411e-b51a-4230b63236cd,1,0,3b861376-2864-4de8-ba59-2a2835d7eaf6,3b861376-2864-4de8-ba59-2a2835d7eaf6,1,0,02910dcd-9e66-4239-a421-8067faf59577,02910dcd-9e66-4239-a421-8067faf59577,1,0,76d5a67f-bb11-4937-a66d-cdce28165562,76d5a67f-bb11-4937-a66d-cdce28165562,1,0,b99a23a5-bfbf-46ec-8268-ff89afdfc63a,b99a23a5-bfbf-46ec-8268-ff89afdfc63a,1,0,cdb93924-62ce-4268-9915-e6c67c1b9cb8,cdb93924-62ce-4268-9915-e6c67c1b9cb8,1,0,1139b6c7-7b55-45b4-98cf-ccac3bfaaa6c,1139b6c7-7b55-45b4-98cf-ccac3bfaaa6c,1,0,33c39990-f4fc-4629-83ba-b43b05a40ca6,33c39990-f4fc-4629-83ba-b43b05a40ca6,1,0,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0a136ad9-22ad-4ba7-a31a-40a193b49d26,1,0,208c7b8c-3df9-4441-8ebf-34ffa81572a2,208c7b8c-3df9-4441-8ebf-34ffa81572a2,1,0,8c17fd7c-74d7-496a-a843-42022afb0707,8c17fd7c-74d7-496a-a843-42022afb0707,1,0,091ccac1-9a63-4a89-bb0c-333b274b0c70,091ccac1-9a63-4a89-bb0c-333b274b0c70,1,0,849f00c3-2f18-414c-97f6-32a99173fab9,849f00c3-2f18-414c-97f6-32a99173fab9,1,0,b456d820-8034-4381-960d-66d9f86b0a4b,b456d820-8034-4381-960d-66d9f86b0a4b,1,0,bd55fd03-cf67-4333-a554-98e03d18f780,bd55fd03-cf67-4333-a554-98e03d18f780,1,0,6eac5f7b-0952-4c94-9028-529b14ffcd4f,6eac5f7b-0952-4c94-9028-529b14ffcd4f,1,0,a587cade-4c91-4769-9c6a-a4fb4fe94196,a587cade-4c91-4769-9c6a-a4fb4fe94196,1,0,1a7c774d-5b86-4051-b797-3081e19fa30a,1a7c774d-5b86-4051-b797-3081e19fa30a,1,0,00949768-5833-4fe2-8752-b009d1bceef8,00949768-5833-4fe2-8752-b009d1bceef8,1,0,167455d1-6658-409f-834c-f6ccfe7b25de,167455d1-6658-409f-834c-f6ccfe7b25de,1,0,1300c46e-24d4-45cf-a899-3d26b5cf0b50,1300c46e-24d4-45cf-a899-3d26b5cf0b50,1,0,4cde6fdc-85fa-4c00-896c-51a68f5f10a5,4cde6fdc-85fa-4c00-896c-51a68f5f10a5,1,0,f41de07b-cba3-4bb8-9ec0-64ec59753f84,f41de07b-cba3-4bb8-9ec0-64ec59753f84,1,0,f78a5650-4d6c-4c17-95e0-e95cf8d9ad4b,f78a5650-4d6c-4c17-95e0-e95cf8d9ad4b,1,0,c5b3ca21-8f7b-4933-853c-7d95b17b5631,c5b3ca21-8f7b-4933-853c-7d95b17b5631,1,0,8b0faa1e-09da-4ba4-894e-e86abc5d39df,8b0faa1e-09da-4ba4-894e-e86abc5d39df,1,0,cb50b309-1b6c-400c-9e9e-67204dcccaae,cb50b309-1b6c-400c-9e9e-67204dcccaae,1,0,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,1,0,2a6e1f2b-7378-456b-9657-9e971eaff716,2a6e1f2b-7378-456b-9657-9e971eaff716,1,0,c3cdea20-3055-4b4e-a531-a02d4f3ed294,c3cdea20-3055-4b4e-a531-a02d4f3ed294,1,0,46417026-c44a-4a06-af41-9cf6495a33b4,46417026-c44a-4a06-af41-9cf6495a33b4,1,0,363c15f3-660e-4e19-b3cc-37c5d05e8d22,363c15f3-660e-4e19-b3cc-37c5d05e8d22,1,0,eeb4b6f1-2476-467d-9862-6fe9d3013b2c,eeb4b6f1-2476-467d-9862-6fe9d3013b2c,1,0,59d5cd7d-7f53-4015-89d9-bb8ad89f8c04,59d5cd7d-7f53-4015-89d9-bb8ad89f8c04,1,0,9d7f7dde-fea8-4064-abe2-bb7d04500cb2,9d7f7dde-fea8-4064-abe2-bb7d04500cb2,1,0,3af45dae-f563-4d23-a87a-11b4d9d5d7a7,3af45dae-f563-4d23-a87a-11b4d9d5d7a7,1,0,fe102b7b-b61f-4572-b2d0-c0af11bfb7d7,fe102b7b-b61f-4572-b2d0-c0af11bfb7d7,1,0,2cfa0db8-f0e6-4513-ab19-52dccff302bc,2cfa0db8-f0e6-4513-ab19-52dccff302bc,1,0,b9fece39-6e5d-44c0-af5c-ad13cfb71560,b9fece39-6e5d-44c0-af5c-ad13cfb71560,1,0,a9c30e99-c265-471d-9115-50ac2bb05191,a9c30e99-c265-471d-9115-50ac2bb05191,1,0,d388c9ca-1dbd-45b9-ac33-5ffa8cb11499,d388c9ca-1dbd-45b9-ac33-5ffa8cb11499,1,0,efebb079-b913-4249-b128-e0ffc7ab43dd,efebb079-b913-4249-b128-e0ffc7ab43dd,1,0,52077ee4-fef1-451f-8338-86563ff5cf60,52077ee4-fef1-451f-8338-86563ff5cf60,1,0,8e6780f8-8d0e-47d1-ac26-47bf5d906f61,8e6780f8-8d0e-47d1-ac26-47bf5d906f61,1,0,fd4a26c1-31e0-4216-92e0-1e090ec4f094,fd4a26c1-31e0-4216-92e0-1e090ec4f094,1,0,637148a3-0f54-4d41-91dd-a0aa6e191015,637148a3-0f54-4d41-91dd-a0aa6e191015,1,0,9a86e2fe-a9bc-4f0a-a16e-a97944fe8539,9a86e2fe-a9bc-4f0a-a16e-a97944fe8539,1,0,b6f745d7-1326-494e-b442-e4118955b5db,b6f745d7-1326-494e-b442-e4118955b5db,1,0,86755cbc-efd8-43e7-bba8-975c0a51f38f,86755cbc-efd8-43e7-bba8-975c0a51f38f,1,0,93701593-5ac8-4266-b471-7e9ed35a9c3e,93701593-5ac8-4266-b471-7e9ed35a9c3e,1,0,0fdb864e-ede9-4777-835c-0804968ee544,0fdb864e-ede9-4777-835c-0804968ee544,1,0,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,1,0,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,1,0,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,1,0,5dee9814-fe38-4631-8148-8d6c87ef6f47,5dee9814-fe38-4631-8148-8d6c87ef6f47,1,0,37d17053-5c2b-4972-b6a5-a589f2ddbde6,37d17053-5c2b-4972-b6a5-a589f2ddbde6,1,0,c349968a-3f87-425b-8efb-d847934dee4b,c349968a-3f87-425b-8efb-d847934dee4b,1,0,3bb8dc33-970c-4c58-9036-ce716d963847,3bb8dc33-970c-4c58-9036-ce716d963847,1,0,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,fae0d2e0-1bcd-4a77-86d6-407ca05c1c95,1,0,b3ff39fa-f665-4d01-9a2a-69722e6b1071,b3ff39fa-f665-4d01-9a2a-69722e6b1071,1,0,0abacb0a-ce00-474e-8aec-35685c51ddef,0abacb0a-ce00-474e-8aec-35685c51ddef,1,0,ae407b17-03aa-4268-8603-58d6714dae89,ae407b17-03aa-4268-8603-58d6714dae89,1,0,9a5b9bf4-71b8-41f2-8e23-8c396357f0a5,9a5b9bf4-71b8-41f2-8e23-8c396357f0a5,1,0,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,1,0,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,1,0,5bb6e52c-ac26-4143-8e90-f04f703f823b,5bb6e52c-ac26-4143-8e90-f04f703f823b,1,0,579baaa4-6493-4d99-8744-6399757295c7,579baaa4-6493-4d99-8744-6399757295c7,1,0,ae6d0e12-8857-476c-b4b2-f03295cbed3e,ae6d0e12-8857-476c-b4b2-f03295cbed3e,1,0,cc8e3172-491d-45d8-a7eb-fc6c400845cb,cc8e3172-491d-45d8-a7eb-fc6c400845cb,1,0,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,d7cfc87f-ac09-44aa-91d9-6511c408c5cb,1,0,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,7ee1e0d0-9735-45da-bd24-c0dbabfd5b1e,1,0,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,1,0,51d83895-5692-4479-9612-07c790d19dff,51d83895-5692-4479-9612-07c790d19dff,1,0,9c1325af-7492-42be-b3af-51b692534510,9c1325af-7492-42be-b3af-51b692534510,1,0,dface15c-cd65-4fb1-b4dd-b513086d3f8e,dface15c-cd65-4fb1-b4dd-b513086d3f8e,1,0,d854b528-8456-4453-9c2d-4f96caf10481,d854b528-8456-4453-9c2d-4f96caf10481,1,0,622d6de2-7404-41cc-961b-131d078d7ab4,622d6de2-7404-41cc-961b-131d078d7ab4,1,0,245f870e-a53a-4d86-aa0a-c0c7709b8acb,245f870e-a53a-4d86-aa0a-c0c7709b8acb,1,0,476f6bfa-b10c-4e0f-8499-23c652715b3f,476f6bfa-b10c-4e0f-8499-23c652715b3f,1,0,65c9754b-53f6-4616-a9d4-74826f7b0ced,65c9754b-53f6-4616-a9d4-74826f7b0ced,1,0,eca2b076-d218-4d1c-948b-7894edf9fa49,eca2b076-d218-4d1c-948b-7894edf9fa49,1,0,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,1,0,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,1,0,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,1,0,b7e85f5c-4312-44c6-895a-3f636a8c78d8,b7e85f5c-4312-44c6-895a-3f636a8c78d8,1,0,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,1,0,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1,0,a1afacc5-f49a-4df2-a44d-479594d50179,a1afacc5-f49a-4df2-a44d-479594d50179,1,0,fe70eba3-7477-4a38-a511-d69960abb928,fe70eba3-7477-4a38-a511-d69960abb928,1,0,6534ea96-2145-49e6-9739-f59459dc7f6b,6534ea96-2145-49e6-9739-f59459dc7f6b,1,0,f49bffa0-cad6-4801-b82e-21aa580e72e6,f49bffa0-cad6-4801-b82e-21aa580e72e6,1,0,bbbfb817-8db3-4415-86c3-af028276d6e9,bbbfb817-8db3-4415-86c3-af028276d6e9,1,0,6a91112c-f6cc-47a0-9d26-a36c7702af7d,6a91112c-f6cc-47a0-9d26-a36c7702af7d,1,0,40a59681-f31d-4fb9-9301-67c1430590e0,40a59681-f31d-4fb9-9301-67c1430590e0,1,0,ae3358ad-ea3a-4b73-a305-02a152863978,ae3358ad-ea3a-4b73-a305-02a152863978,1,0,cb92dc2e-6053-4233-a408-4464514b1257,cb92dc2e-6053-4233-a408-4464514b1257,1,0,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,1,0,85550a7a-8fe0-4296-ace5-63cf053536b4,85550a7a-8fe0-4296-ace5-63cf053536b4,1,0,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,1,0,9c3bc502-bcb1-4c90-ae43-53c798958339,9c3bc502-bcb1-4c90-ae43-53c798958339,1,0,3f8b6411-6606-4d27-891e-7c77be47c5f9,3f8b6411-6606-4d27-891e-7c77be47c5f9,1,0,cfc0adf6-87b4-4c8a-91e2-46c2616b319b,cfc0adf6-87b4-4c8a-91e2-46c2616b319b,1,0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,1,0,5eb4ca7f-027a-4860-a167-e6b424527e7a,5eb4ca7f-027a-4860-a167-e6b424527e7a,1,0,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,f9b98ba5-1fa8-42a4-b1a2-dd71874083cb,1,0,6871015f-d959-4a77-a091-a23cb4ebd8f9,6871015f-d959-4a77-a091-a23cb4ebd8f9,1,0,e5e1631b-a494-4e73-b356-b4330b84cc88,e5e1631b-a494-4e73-b356-b4330b84cc88,1,0,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,1,0,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,1,0,4dbf114a-5402-40b0-9cab-19601aa8328e,4dbf114a-5402-40b0-9cab-19601aa8328e,1,0,a0856ca2-6a66-4108-b6d4-82443cdccca6,a0856ca2-6a66-4108-b6d4-82443cdccca6,1,0,378b0708-a0a1-4c82-b55a-796acb27e696,378b0708-a0a1-4c82-b55a-796acb27e696,1,0,8e462c0e-c67a-45e9-9871-1f976b01632d,8e462c0e-c67a-45e9-9871-1f976b01632d,1,0,c5335e1f-3e47-46b7-b695-0653f825d855,c5335e1f-3e47-46b7-b695-0653f825d855,1,0,d7faad11-1e35-460c-8943-49370f328c03,d7faad11-1e35-460c-8943-49370f328c03,1,0,e4726010-85c5-4ccc-b574-4b3b55f0d391,e4726010-85c5-4ccc-b574-4b3b55f0d391,1,0,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,1,0,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,1,0,1f4f839a-4e19-45b8-a988-13ee604c269c,1f4f839a-4e19-45b8-a988-13ee604c269c,1,0,b3aa97e1-baef-45f4-9179-052f35527a5e,b3aa97e1-baef-45f4-9179-052f35527a5e,1,0,d613941f-ed4c-4957-b469-ea6b0d2a121d,d613941f-ed4c-4957-b469-ea6b0d2a121d,1,0,0d8d08e3-194f-416c-a1e0-aa92b40b7911,0d8d08e3-194f-416c-a1e0-aa92b40b7911,1,0,af0178fe-eb3a-485b-9acf-35c8702aa330,af0178fe-eb3a-485b-9acf-35c8702aa330,1,0,201d323b-4c0c-4c93-ae43-43a378ec0d9e,201d323b-4c0c-4c93-ae43-43a378ec0d9e,1,0,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,1,0,c513ceb0-0855-43ce-a311-c9bea88e2563,c513ceb0-0855-43ce-a311-c9bea88e2563,1,0,974bfc13-85c2-454a-b562-e72384eb4c31,974bfc13-85c2-454a-b562-e72384eb4c31,1,0,69cd6adc-b129-4fbc-804d-8d5aaef77280,69cd6adc-b129-4fbc-804d-8d5aaef77280,1,0,3431a3de-cb9d-46dc-b597-3203831796a9,3431a3de-cb9d-46dc-b597-3203831796a9,1,0,f3866271-04ed-4963-852e-cf41e9e18e1d,f3866271-04ed-4963-852e-cf41e9e18e1d,1,0,b77e5ec2-35cd-43ae-957f-af35214fa621,b77e5ec2-35cd-43ae-957f-af35214fa621,1,0,4a04d83d-cadd-4f36-9ec8-f926259c18ba,4a04d83d-cadd-4f36-9ec8-f926259c18ba,1,0,85e670c0-1616-4611-984c-3d40e890b2e9,85e670c0-1616-4611-984c-3d40e890b2e9,1,0,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,1,0,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,1,0,f1693207-2637-412a-972f-2bc79b9c7fc8,f1693207-2637-412a-972f-2bc79b9c7fc8,1,0,da59378e-0a97-4cff-977b-cc51967068ee,da59378e-0a97-4cff-977b-cc51967068ee,1,0,bbaad46d-f60d-49e6-a077-075366bca47e,bbaad46d-f60d-49e6-a077-075366bca47e,1,0,0d9f5703-91e4-4769-bedd-5bd974f2f617,0d9f5703-91e4-4769-bedd-5bd974f2f617,1,0,926cdf17-1929-43d6-8205-858aab558ad9,926cdf17-1929-43d6-8205-858aab558ad9,1,0,5ec6838f-2d70-4f91-b41b-16adfe8ed587,5ec6838f-2d70-4f91-b41b-16adfe8ed587,1,0,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,1,0,bee8b8a0-f058-44cb-822c-620351567627,bee8b8a0-f058-44cb-822c-620351567627,1,0,26365e29-903b-47fd-ad96-e0d87f5d6e87,26365e29-903b-47fd-ad96-e0d87f5d6e87,1,0,569180cb-ce54-4267-94b9-332e35e3c17d,569180cb-ce54-4267-94b9-332e35e3c17d,1,0,55bce105-51c0-452e-9eec-b960fe740db2,55bce105-51c0-452e-9eec-b960fe740db2,1,0,776c171d-5dd5-4965-94dc-c2fe6792d5f2,776c171d-5dd5-4965-94dc-c2fe6792d5f2,1,0,86bb1105-702a-47be-906a-1821a69b1b6c,86bb1105-702a-47be-906a-1821a69b1b6c,1,0,40653767-9542-44e9-a84b-ffee75584638,40653767-9542-44e9-a84b-ffee75584638,1,0,49bd152e-479a-46fe-b3af-26ed9181dc34,49bd152e-479a-46fe-b3af-26ed9181dc34,1,0,0a742dd2-1ff4-42de-b303-f2bb01b36fe2,0a742dd2-1ff4-42de-b303-f2bb01b36fe2,1,0,69e13959-51ad-4ac2-9cfc-17ac28b78c78,69e13959-51ad-4ac2-9cfc-17ac28b78c78,1,0,f890ca1b-f2c2-4630-9002-301b759ca6d9,f890ca1b-f2c2-4630-9002-301b759ca6d9,1,0,08c8a9bf-7b89-4d0e-a496-4c7efeca0577,08c8a9bf-7b89-4d0e-a496-4c7efeca0577,1,0,f6c2b015-9cfc-40d2-a93f-b0e88db4a23f,f6c2b015-9cfc-40d2-a93f-b0e88db4a23f,1,0,103f3d8f-e47a-4772-bdd7-dd5f8508d22b,103f3d8f-e47a-4772-bdd7-dd5f8508d22b,1,0,ba8ea271-8716-49ef-8b10-f4b5798c1f62,ba8ea271-8716-49ef-8b10-f4b5798c1f62,1,0,3633c30c-9479-4801-89cc-a5734a41e465,3633c30c-9479-4801-89cc-a5734a41e465,1,0,f295c68d-7e29-48b8-a95a-56e96d9843c1,f295c68d-7e29-48b8-a95a-56e96d9843c1,1,0,7ebe16ee-8e5d-4b05-89b5-9539f73be90c,7ebe16ee-8e5d-4b05-89b5-9539f73be90c,1,0,ea5d0221-fb1e-4626-862a-9c1209365d8f,ea5d0221-fb1e-4626-862a-9c1209365d8f,1,0,12bce69b-933c-4ce4-9d29-a47f3db0226e,12bce69b-933c-4ce4-9d29-a47f3db0226e,1,0,82dcd6a3-c35b-421c-a8f9-77855ad2abca,82dcd6a3-c35b-421c-a8f9-77855ad2abca,1,0,ad0b1720-282e-49d4-af80-324a887963c3,ad0b1720-282e-49d4-af80-324a887963c3,1,0,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,1,0,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,1,0,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,1,0,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,1,0,fcb97a46-d5fd-4bb5-b899-17723a9fe346,fcb97a46-d5fd-4bb5-b899-17723a9fe346,1,0,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,1,0,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,1,0,a1a44832-6026-47ae-affd-5b6d52e84307,a1a44832-6026-47ae-affd-5b6d52e84307,1,0,d2fd8650-d13a-411d-8206-61b16016bd82,d2fd8650-d13a-411d-8206-61b16016bd82,1,0,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,f98bcdb8-6eed-4b4f-b3da-d80b5e8bed44,1,0,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,fbaa5b0a-56dc-4bf1-b1b2-e48073f63d13,1,0,a92acf0e-9132-4456-9a82-1543d98ca453,a92acf0e-9132-4456-9a82-1543d98ca453,1,0,4033eb31-8281-402a-afff-431fa36e589e,4033eb31-8281-402a-afff-431fa36e589e,1,0,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,1,0,f59488c7-4643-4988-8043-5c9724e04279,f59488c7-4643-4988-8043-5c9724e04279,1,0,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,1,0,b67a509d-bb0f-427e-b447-4d4617078d6a,b67a509d-bb0f-427e-b447-4d4617078d6a,1,0,968ecfca-cf06-4952-83c1-a151e46c78a9,968ecfca-cf06-4952-83c1-a151e46c78a9,1,0,4945c734-a47d-44e9-8a7f-94b31911c1ce,4945c734-a47d-44e9-8a7f-94b31911c1ce,1,0,20a194e9-06cf-4013-bfa4-bc15554a54d0,20a194e9-06cf-4013-bfa4-bc15554a54d0,1,0,ab4f3d3d-bb5a-4dbc-b699-808458036b00,ab4f3d3d-bb5a-4dbc-b699-808458036b00,1,0,09761456-2273-437f-9316-0391cfaa81b3,09761456-2273-437f-9316-0391cfaa81b3,1,0,93922abc-98b9-4b3d-a5c8-7294378a69e1,93922abc-98b9-4b3d-a5c8-7294378a69e1,1,0,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,3c0a9c45-8e57-43fa-8ae3-26b15571f2cd,1,0,85223d37-2503-4783-94dc-fe6265e718d5,85223d37-2503-4783-94dc-fe6265e718d5,1,0,0918cd76-56e5-4314-8a1c-c21d023ba6f8,0918cd76-56e5-4314-8a1c-c21d023ba6f8,1,0,9db21c2e-79fa-44e4-902e-416abfccb54a,9db21c2e-79fa-44e4-902e-416abfccb54a,1,0,fb082db3-197b-4d1e-b9ea-362624d547ee,fb082db3-197b-4d1e-b9ea-362624d547ee,1,0,c09dcf00-a45a-4487-99c5-d3a37956ec88,c09dcf00-a45a-4487-99c5-d3a37956ec88,1,0,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,531a5a0c-6ac9-4e93-8caa-42d9aad0bc82,1,0,2714e1b6-6b02-43a1-bc94-2934b429ed35,2714e1b6-6b02-43a1-bc94-2934b429ed35,1,0,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,e33c73b2-ef0b-49b7-a65f-ab2c814ad256,1,0,4c7016da-9991-4917-8eaa-e760cc9e29d1,4c7016da-9991-4917-8eaa-e760cc9e29d1,1,0,febb3770-5c11-4ada-9e49-a27950bdaddf,febb3770-5c11-4ada-9e49-a27950bdaddf,1,0,d7b57669-e538-4e54-ab1b-8428f0586466,d7b57669-e538-4e54-ab1b-8428f0586466,1,0,9c484a15-039e-416d-af97-4c2bd90fd873,9c484a15-039e-416d-af97-4c2bd90fd873,1,0,534855e3-4cf2-471c-b982-7138917050c9,534855e3-4cf2-471c-b982-7138917050c9,1,0,4c72b944-d000-4920-aec8-54029f88ddf4,4c72b944-d000-4920-aec8-54029f88ddf4,1,0,b4033d05-05c2-4617-80d9-abfa389c47f4,b4033d05-05c2-4617-80d9-abfa389c47f4,1,0,0f46b124-1575-4984-9bc1-b5e4696efc74,0f46b124-1575-4984-9bc1-b5e4696efc74,1,0,a0183a0b-1459-4b32-924c-6ea156f02125,a0183a0b-1459-4b32-924c-6ea156f02125,1,0,fc2dc619-41e0-4cce-a080-d5c8de5029a8,fc2dc619-41e0-4cce-a080-d5c8de5029a8,1,0,9609e5fb-fd11-463c-8679-9b10fc0993ed,9609e5fb-fd11-463c-8679-9b10fc0993ed,1,0,f438b941-2aae-4c67-81dc-340f6acc25b1,f438b941-2aae-4c67-81dc-340f6acc25b1,1,0,48075630-2041-48c3-9eb0-d2107cfcb249,48075630-2041-48c3-9eb0-d2107cfcb249,1,0,7d7e7e13-eb42-420d-9bfc-14fab901c3c1,7d7e7e13-eb42-420d-9bfc-14fab901c3c1,1,0,aa29e1be-4e99-4136-8dc1-0124908979ad,aa29e1be-4e99-4136-8dc1-0124908979ad,1,0,0d76799d-7fc7-446b-88fb-dca839de00a5,0d76799d-7fc7-446b-88fb-dca839de00a5,1,0,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,cb5674c3-0d91-4948-bafd-d9ef44a2a69d,1,0,ea4a869c-861c-412c-a3be-de1c57d1a251,ea4a869c-861c-412c-a3be-de1c57d1a251,1,0,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,eeafcc8c-fbe2-4bb4-8b8a-cf663208258d,1,0,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,6a3bd39a-59cb-4763-b49f-7ab67167a8b7,1,0,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,6c1d8f6c-db33-46dc-8824-aceacb4bf9c1,1,0,50ac390d-324f-40bd-b3df-0468a63b94b6,50ac390d-324f-40bd-b3df-0468a63b94b6,1,0,80337710-2c60-45c4-ae1f-bb42731fb611,80337710-2c60-45c4-ae1f-bb42731fb611,1,0,9dcf467e-7701-4c7b-b747-95f4d9b9295c,9dcf467e-7701-4c7b-b747-95f4d9b9295c,1,0,dd07b255-25af-466e-a224-c561a8ca567b,dd07b255-25af-466e-a224-c561a8ca567b,1,0,77149f7a-8a76-4569-9487-991c41e132ef,77149f7a-8a76-4569-9487-991c41e132ef,1,0,1e9e115a-e65b-4346-b0d3-47cf1dbe75f2,1e9e115a-e65b-4346-b0d3-47cf1dbe75f2,1,0,9e1be65e-986f-4d21-91f0-15c66db0c947,9e1be65e-986f-4d21-91f0-15c66db0c947,1,0,67993b79-6aca-4641-b2e2-0a15f44e47d5,67993b79-6aca-4641-b2e2-0a15f44e47d5,1,0,d2fe4578-a1f8-4586-b052-fa71d25365c9,d2fe4578-a1f8-4586-b052-fa71d25365c9,1,0,f31f3dab-5796-47ac-a54d-3081f8cad817,f31f3dab-5796-47ac-a54d-3081f8cad817,1,0,cd59707e-b9e4-4038-8203-ae22a8060e8d,cd59707e-b9e4-4038-8203-ae22a8060e8d,1,0,db497857-33d3-49a1-b328-dfc62c973ecb,db497857-33d3-49a1-b328-dfc62c973ecb,1,0,139c001c-7b07-465a-9187-399ad32d294f,139c001c-7b07-465a-9187-399ad32d294f,1,0,5d228ce4-069e-4f98-beed-b8e1de17c3d9,5d228ce4-069e-4f98-beed-b8e1de17c3d9,1,0,9770fc09-87bf-4fce-9b0d-410efd30edae,9770fc09-87bf-4fce-9b0d-410efd30edae,1,0,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,1,0,20156709-1481-4007-8e89-9ce79fc589fc,20156709-1481-4007-8e89-9ce79fc589fc,1,0,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,1,0,7e7c5abd-b645-4de5-a40e-5805ec4456e2,7e7c5abd-b645-4de5-a40e-5805ec4456e2,1,0,763a16c3-a728-4b65-a485-705990310b4a,763a16c3-a728-4b65-a485-705990310b4a,1,0,65338920-c744-4d1e-b351-848b90a3feda,65338920-c744-4d1e-b351-848b90a3feda,1,0,2aedb1ac-caf1-45c7-913e-82a36637d5d4,2aedb1ac-caf1-45c7-913e-82a36637d5d4,1,0,65f3ad72-ed03-482b-a2f1-05053eef408a,65f3ad72-ed03-482b-a2f1-05053eef408a,1,0,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,e177e258-7d0c-4fe1-80e5-3b89de9e23d9,1,0,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,3f25ac9f-c6b4-4ccc-bec4-a90c99403823,1,0,56177464-5e9f-4598-96bc-eb311993c503,56177464-5e9f-4598-96bc-eb311993c503,1,0,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,1,0,bdfe65f4-4174-4e66-915c-943137981cf0,bdfe65f4-4174-4e66-915c-943137981cf0,1,0,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,1,0,c895d58a-5be1-4157-81af-f4f6db9b4b9e,c895d58a-5be1-4157-81af-f4f6db9b4b9e,1,0,0d89036c-af6e-4709-847c-0dab74a33d72,0d89036c-af6e-4709-847c-0dab74a33d72,1,0,7d223aab-d4f6-41d5-a701-6fe03517cf50,7d223aab-d4f6-41d5-a701-6fe03517cf50,1,0,631cdd15-eb1f-4903-9073-4de3911ba2e6,631cdd15-eb1f-4903-9073-4de3911ba2e6,1,0,6b10ab0a-8d4e-4847-9ce7-663fb4770c35,6b10ab0a-8d4e-4847-9ce7-663fb4770c35,1,0,42630eee-ce93-40a8-b96e-3eb759f48976,42630eee-ce93-40a8-b96e-3eb759f48976,1,0,174e0187-cf34-4949-8dc2-a1f9aece78dc,174e0187-cf34-4949-8dc2-a1f9aece78dc,1,0,5d9f2db6-704d-45cb-96c3-e59e47ad4fea,5d9f2db6-704d-45cb-96c3-e59e47ad4fea,1,0,e4dbeb50-292f-452f-a0da-a55e5ea936e4,e4dbeb50-292f-452f-a0da-a55e5ea936e4,1,0,8ce6cc1a-8570-4704-b9a3-44e815b2e753,8ce6cc1a-8570-4704-b9a3-44e815b2e753,1,0,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,1,0,497cbe4d-586d-48a2-8e98-d20e3e09ed42,497cbe4d-586d-48a2-8e98-d20e3e09ed42,1,0,38b7679d-3739-4572-baf2-d8c7b2a94f0a,38b7679d-3739-4572-baf2-d8c7b2a94f0a,1,0,1470f052-f032-46bc-b1ee-54555e725dfd,1470f052-f032-46bc-b1ee-54555e725dfd,1,0,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,1,0,7d336fdd-5cbf-4c92-a783-f451f7590502,7d336fdd-5cbf-4c92-a783-f451f7590502,1,0,ee8af8ee-e49a-4511-9a91-48814ab99d23,ee8af8ee-e49a-4511-9a91-48814ab99d23,1,0,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,1,0,bc10ad8f-383c-469a-8c0e-60805161055b,bc10ad8f-383c-469a-8c0e-60805161055b,1,0,86760ecb-2ddd-40ce-bc4f-94c23027a55e,86760ecb-2ddd-40ce-bc4f-94c23027a55e,1,0,6fbf844e-ee8d-490f-9177-6392d262312f,6fbf844e-ee8d-490f-9177-6392d262312f,1,0,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,1,0,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,1,0,37722a34-1148-4cc8-95e6-4645ae9cca98,37722a34-1148-4cc8-95e6-4645ae9cca98,1,0,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,1,0,cc34bd23-de0a-4b09-8333-e4693576b9f4,cc34bd23-de0a-4b09-8333-e4693576b9f4,1,0,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,1,0,903af13a-1f73-4145-a3d0-971c3be5fbe6,903af13a-1f73-4145-a3d0-971c3be5fbe6,1,0,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,1,0,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,1,0,953dbad6-4f5c-4319-874a-db358a77d001,953dbad6-4f5c-4319-874a-db358a77d001,1,0,05243f56-7e9b-4a61-8efb-1b5e525fff21,05243f56-7e9b-4a61-8efb-1b5e525fff21,1,0,7aa86a2d-2b47-447e-8901-806411011279,7aa86a2d-2b47-447e-8901-806411011279,1,0,fca0dfad-f853-4694-9ce9-53a3a10f59b7,fca0dfad-f853-4694-9ce9-53a3a10f59b7,1,0,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,1,0,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,1,0,b4cb92fb-ad82-44ed-9203-397b412b3453,b4cb92fb-ad82-44ed-9203-397b412b3453,1,0,69ceac29-06d3-45f2-b914-7966465cd0d3,69ceac29-06d3-45f2-b914-7966465cd0d3,1,0,b690721d-960b-4374-8d2c-feed3a2b354b,b690721d-960b-4374-8d2c-feed3a2b354b,1,0,271243d3-1871-4a0a-bf7f-63bacacf0a59,271243d3-1871-4a0a-bf7f-63bacacf0a59,1,0,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,1,0,5b379a72-8605-4e88-84cb-14272a3b8f5f,5b379a72-8605-4e88-84cb-14272a3b8f5f,1,0,1281fe19-bbca-4a4f-84d8-14187e62000f,1281fe19-bbca-4a4f-84d8-14187e62000f,1,0,ec44f92a-06bf-4a53-a7ba-fbe9846a68a6,ec44f92a-06bf-4a53-a7ba-fbe9846a68a6,1,0,9b7051d5-abc4-416c-a0e6-515d120d78e4,9b7051d5-abc4-416c-a0e6-515d120d78e4,1,0,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,1,0,869938e6-6310-4326-bd15-5b91fe2e0911,869938e6-6310-4326-bd15-5b91fe2e0911,1,0,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,1,0,a156521a-ece1-49d3-8056-1c3508273c45,a156521a-ece1-49d3-8056-1c3508273c45,1,0,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,1,0,10018f80-3138-4089-bf9a-a5f178f1e295,10018f80-3138-4089-bf9a-a5f178f1e295,1,0,43aba109-4b7f-45ef-9c30-8b754e81911b,43aba109-4b7f-45ef-9c30-8b754e81911b,1,0,4ccd72e1-7fd7-4a3b-8428-71b44992937e,4ccd72e1-7fd7-4a3b-8428-71b44992937e,1,0,46077650-2b2c-4319-8279-41f277971669,46077650-2b2c-4319-8279-41f277971669,1,0,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,1,0,612f3b95-d7db-4b33-92b5-4873205b424b,612f3b95-d7db-4b33-92b5-4873205b424b,1,0,d7afa1a6-0ac9-4527-8f1c-5317ce259b52,d7afa1a6-0ac9-4527-8f1c-5317ce259b52,1,0,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,1,0,e82ebd72-7b5a-4f45-b853-1001bf680a05,e82ebd72-7b5a-4f45-b853-1001bf680a05,1,0,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,1,0,e9e9b733-e97a-430d-95ce-45ea27751f64,e9e9b733-e97a-430d-95ce-45ea27751f64,1,0,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,1,0,3dd50c66-27f7-4f1e-86e9-c709995c8609,3dd50c66-27f7-4f1e-86e9-c709995c8609,1,0,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,1,0,ed1369c5-c274-45bd-ae91-7648565ae09f,ed1369c5-c274-45bd-ae91-7648565ae09f,1,0,8d0fce61-a22f-4033-9e03-3f00c4a21722,8d0fce61-a22f-4033-9e03-3f00c4a21722,1,0,bfb3f026-e940-49c3-ac30-408186f9e11e,bfb3f026-e940-49c3-ac30-408186f9e11e,1,0,e1dc83eb-a8cd-454b-8de8-cff2049be78c,e1dc83eb-a8cd-454b-8de8-cff2049be78c,1,0,9edd9288-1463-4d67-b9f0-40f351d978e9,9edd9288-1463-4d67-b9f0-40f351d978e9,1,0,c9db6c68-965f-4567-b26e-5d497a389de1,c9db6c68-965f-4567-b26e-5d497a389de1,1,0,4da2f65d-56bd-4140-9b31-e5ccac4a800a,4da2f65d-56bd-4140-9b31-e5ccac4a800a,1,0,eb163bba-b94c-4a78-9c2d-7b519325e3d4,eb163bba-b94c-4a78-9c2d-7b519325e3d4,1,0,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,58cdbd20-a7f4-4c4c-8a4e-638714cc2699,1,0,616cd2cc-eaf4-4586-bca1-c044429b491a,616cd2cc-eaf4-4586-bca1-c044429b491a,1,0,939bdb9a-294b-4b42-a56f-030f69bc29c4,939bdb9a-294b-4b42-a56f-030f69bc29c4,1,0,ee7a763b-bcbf-4ff3-89af-eb7965b33515,ee7a763b-bcbf-4ff3-89af-eb7965b33515,1,0,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,1,0,81d900be-ddc1-417f-ae2c-1aacf040de9a,81d900be-ddc1-417f-ae2c-1aacf040de9a,1,0,c65f69ce-be78-4e8d-b91d-293c4108ce77,c65f69ce-be78-4e8d-b91d-293c4108ce77,1,0,521a5717-0b38-401d-bd72-30cee219bd14,521a5717-0b38-401d-bd72-30cee219bd14,1,0,977c30dc-6f27-4931-9fd5-d12ed147e3ec,977c30dc-6f27-4931-9fd5-d12ed147e3ec,1,0,eea4f72e-dd1b-46c7-b270-876a482236b3,eea4f72e-dd1b-46c7-b270-876a482236b3,1,0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,25e8d286-dfbb-4fdf-974b-fe3f6f76eac0,1,0,2d249dad-8b4f-462b-ab13-892639a6e071,2d249dad-8b4f-462b-ab13-892639a6e071,1,0,f6249bf4-d2e7-48f3-808f-d776915d14cb,f6249bf4-d2e7-48f3-808f-d776915d14cb,1,0,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,75f11ecd-c87a-4a14-a7ca-c755f63d7cf8,1,0,883cdeb0-e747-4157-bbe7-0ebc423a82af,883cdeb0-e747-4157-bbe7-0ebc423a82af,1,0,ba62ac73-91da-4dad-abc7-3cf8acf7e315,ba62ac73-91da-4dad-abc7-3cf8acf7e315,1,0,6a71416d-dba1-4883-9264-597ecf9d6270,6a71416d-dba1-4883-9264-597ecf9d6270,1,0,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,ce3fc202-7893-4d1b-9c8f-1b3349a5c147,1,0,6593baab-fce0-49ed-867e-be242bfc08d7,6593baab-fce0-49ed-867e-be242bfc08d7,1,0,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,403390cf-d3f8-4dfa-b83d-e2fca4ee0dff,1,0,57aed64d-da61-4c18-af21-dab3afdc5c03,57aed64d-da61-4c18-af21-dab3afdc5c03,1,0,452822b4-a590-44db-ab77-d8c01f7300e7,452822b4-a590-44db-ab77-d8c01f7300e7,1,0,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,62a71ba7-3226-4d10-8cc9-ac9908a00ae7,1,0,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,6ce1d71d-7548-4ee7-be78-21ae23d5a08d,1,0,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,f5ad6743-b19b-44c4-b3d1-2e39d74a4abd,1,0,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,4b89b7fb-31d9-43c7-9f7e-b0c31fa3331d,1,0,19b29d30-e395-42f2-b700-7474bb2cdcb7,19b29d30-e395-42f2-b700-7474bb2cdcb7,1,0,0c38782c-6559-4f1c-88af-aa022285ffbd,0c38782c-6559-4f1c-88af-aa022285ffbd,1,0,eed23203-924d-4092-a1a8-a7cdd72489e5,eed23203-924d-4092-a1a8-a7cdd72489e5,1,0,b0deb957-624b-4bcb-824c-76aedf1affe9,b0deb957-624b-4bcb-824c-76aedf1affe9,1,0,9934e608-593d-45d0-9df3-539f0c8fc385,9934e608-593d-45d0-9df3-539f0c8fc385,1,0,80da4126-4319-425f-8427-7d60652cf754,80da4126-4319-425f-8427-7d60652cf754,1,0,05236ace-bcdd-4eb8-a1fb-5843ee311d10,05236ace-bcdd-4eb8-a1fb-5843ee311d10,1,0,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,0f1b284c-6c9e-4799-bc47-3326c4b7bec2,1,0,449060fd-4711-4b9e-93e0-11b35c314fb3,449060fd-4711-4b9e-93e0-11b35c314fb3,1,0,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,e7efa9d5-ea93-4070-87bb-a4d95116d1b4,1,0,0614d340-6524-4715-978d-87ab21377e72,0614d340-6524-4715-978d-87ab21377e72,1,0,d47daac5-ec3b-4d4e-8b01-045a37f7074d,d47daac5-ec3b-4d4e-8b01-045a37f7074d,1,0,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,9d6ed3b9-35cd-47c0-9dfc-732e5066a071,1,0,912cbd30-1ed5-4888-a4b6-98e9215b28e9,912cbd30-1ed5-4888-a4b6-98e9215b28e9,1,0,abf093ce-be63-487d-8be4-be282aa475be,abf093ce-be63-487d-8be4-be282aa475be,1,0,7a910ad6-b922-4716-8140-1540d76296b2,7a910ad6-b922-4716-8140-1540d76296b2,1,0,3fa9aa34-382c-49fa-87d8-34bedcde5836,3fa9aa34-382c-49fa-87d8-34bedcde5836,1,0,5189beb9-b939-4f97-aca0-c2f3492ac8b9,5189beb9-b939-4f97-aca0-c2f3492ac8b9,1,0,0b139d7a-b583-4082-b9f2-8f3fb444bd51,0b139d7a-b583-4082-b9f2-8f3fb444bd51,1,0,b8931f98-c1d7-4e9b-be43-065064e7ba95,b8931f98-c1d7-4e9b-be43-065064e7ba95,1,0,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,1,0,60848308-931c-4da3-aa4b-37f6fb4b194f,60848308-931c-4da3-aa4b-37f6fb4b194f,1,0,0761c32c-1de6-4c40-9178-64aeb46b6622,0761c32c-1de6-4c40-9178-64aeb46b6622,1,0,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,1,0,54b14504-503b-45f6-9b5d-785b49829425,54b14504-503b-45f6-9b5d-785b49829425,1,0,80d3ee33-1cdc-4af6-85c2-787094526592,80d3ee33-1cdc-4af6-85c2-787094526592,1,0,c8b28660-6cb0-4ef5-85c2-a75da863ba96,c8b28660-6cb0-4ef5-85c2-a75da863ba96,1,0,1cd607b4-49fc-460e-a014-6afe50083b47,1cd607b4-49fc-460e-a014-6afe50083b47,1,0,a215e767-36e9-4408-9d18-7b4be757022a,a215e767-36e9-4408-9d18-7b4be757022a,1,0,a3e262bc-9f0d-480d-a1d1-c2326105d22d,a3e262bc-9f0d-480d-a1d1-c2326105d22d,1,0,8eae0c79-288b-4773-90bb-49299ad45628,8eae0c79-288b-4773-90bb-49299ad45628,1,0,2faa5594-f1b4-4312-b674-82fdf9623105,2faa5594-f1b4-4312-b674-82fdf9623105,1,0,185c1ad3-b5db-49b6-9342-d08e1bf64903,185c1ad3-b5db-49b6-9342-d08e1bf64903,1,0,3c69a4ad-001d-4421-88f6-412e15d710d6,3c69a4ad-001d-4421-88f6-412e15d710d6,1,0,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,1,0,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,1,0,6a68a08a-ea37-4573-ab9f-ec822f6d250b,6a68a08a-ea37-4573-ab9f-ec822f6d250b,1,0,00e87d04-8104-420b-b2c6-7304889a75b2,00e87d04-8104-420b-b2c6-7304889a75b2,1,0,bde86820-f7bb-463b-97d0-bfa5f8323af0,bde86820-f7bb-463b-97d0-bfa5f8323af0,1,0,b9b24093-810c-4158-846d-e2c7aea54d36,b9b24093-810c-4158-846d-e2c7aea54d36,1,0,289a6aac-dc4e-4fae-8815-853e78d450bb,289a6aac-dc4e-4fae-8815-853e78d450bb,1,0,557e7d89-83ed-45d0-86cc-6e355f14025d,557e7d89-83ed-45d0-86cc-6e355f14025d,1,0,d681b26b-dd8d-46d7-986e-10f05c37a1e4,d681b26b-dd8d-46d7-986e-10f05c37a1e4,1,0,4d3c216e-c04f-4884-8681-1c861c50ce7d,4d3c216e-c04f-4884-8681-1c861c50ce7d,1,0,4a41eee0-c973-4824-a07c-9fcf731f055e,4a41eee0-c973-4824-a07c-9fcf731f055e,1,0,ee756c33-f408-4449-a6bb-3186a0421362,ee756c33-f408-4449-a6bb-3186a0421362,1,0,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,1,0,6ff66622-4d20-4696-9fe9-4b4faeb21d96,6ff66622-4d20-4696-9fe9-4b4faeb21d96,1,0,46237eec-c206-4d21-883c-27599b9ed38c,46237eec-c206-4d21-883c-27599b9ed38c,1,0,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,92cbfe14-35c5-440b-9a13-ef8c8ab0630a,1,0,8ce759ff-f579-461c-bb1e-9ac2b01e88df,8ce759ff-f579-461c-bb1e-9ac2b01e88df,1,0,8b451909-2c15-48f2-b869-65e7031cc542,8b451909-2c15-48f2-b869-65e7031cc542,1,0,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,1,0,7b377fca-4466-476f-9eb2-0b00141103d6,7b377fca-4466-476f-9eb2-0b00141103d6,1,0,9ce5eceb-f366-4035-956e-62721358b154,9ce5eceb-f366-4035-956e-62721358b154,1,0,8b5358e9-5810-45a7-a49e-fe7fe63c73f3,8b5358e9-5810-45a7-a49e-fe7fe63c73f3,1,0,23afa5f6-9c3f-4f79-885b-b20785fc5e45,23afa5f6-9c3f-4f79-885b-b20785fc5e45,1,0,379a8bf7-b760-43d6-b5c4-6393b00e294f,379a8bf7-b760-43d6-b5c4-6393b00e294f,1,0,e44b737f-9076-4070-94ba-ed0b00e60393,e44b737f-9076-4070-94ba-ed0b00e60393,1,0,5582e533-b908-40c9-8c81-876906f0d47e,5582e533-b908-40c9-8c81-876906f0d47e,1,0,71656b8b-2d9b-4ac9-884d-72f47b9c69b7,71656b8b-2d9b-4ac9-884d-72f47b9c69b7,1,0,e0797541-88c2-4ad9-9ff4-d56899e6a6ee,e0797541-88c2-4ad9-9ff4-d56899e6a6ee,1,0,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,1,0,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,1,0,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1,0,d915d338-3e4c-45c3-aef5-a07cf41b05f6,d915d338-3e4c-45c3-aef5-a07cf41b05f6,1,0,28080e64-cd09-410d-9e3e-3ffdb43d3ace,28080e64-cd09-410d-9e3e-3ffdb43d3ace,1,0,9cfd3d38-4e0e-40f4-ae77-7a997646e4b2,9cfd3d38-4e0e-40f4-ae77-7a997646e4b2,1,0,978640a2-5c4b-4e21-857e-34f00840fba8,978640a2-5c4b-4e21-857e-34f00840fba8,1,0,da2913e3-a29b-423f-9aae-08fed56a7d90,da2913e3-a29b-423f-9aae-08fed56a7d90,1,0,149e72b8-cc03-4b4f-8ca4-07987600c34d,149e72b8-cc03-4b4f-8ca4-07987600c34d,1,0,7649bd7b-fe8c-4338-80fc-153160a5e538,7649bd7b-fe8c-4338-80fc-153160a5e538,1,0,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,1,0,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,1,0,6137605e-4850-44ec-b4ee-048bd8e0ec3a,6137605e-4850-44ec-b4ee-048bd8e0ec3a,1,0,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,1,0,0e6e9372-beb4-478e-9428-71b19a60739b,0e6e9372-beb4-478e-9428-71b19a60739b,1,0,32b11498-542f-46b2-829f-1525936ab7fa,32b11498-542f-46b2-829f-1525936ab7fa,1,0,64afa916-4750-4008-8c6c-2a470fb11283,64afa916-4750-4008-8c6c-2a470fb11283,1,0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,1,0,35354abc-9a76-4ee8-8796-c24b37365ea0,35354abc-9a76-4ee8-8796-c24b37365ea0,1,0,7078977f-31bf-427e-ac37-e309d81fe999,7078977f-31bf-427e-ac37-e309d81fe999,1,0,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,1,0,d8854555-9e15-4d82-a1fd-656a848a8e8a,d8854555-9e15-4d82-a1fd-656a848a8e8a,1,0,53191842-ea05-4491-84d7-071cd201992d,53191842-ea05-4491-84d7-071cd201992d,1,0,86c70449-4cf7-4baf-9742-b82b134ed929,86c70449-4cf7-4baf-9742-b82b134ed929,1,0,af3b1881-163a-4c07-a1d9-77ceadf59c77,af3b1881-163a-4c07-a1d9-77ceadf59c77,1,0,d3443b92-32f5-4ac0-8356-062647efe3d8,d3443b92-32f5-4ac0-8356-062647efe3d8,1,0,b78be6fb-7db8-48c8-ba7b-aab1fea34890,b78be6fb-7db8-48c8-ba7b-aab1fea34890,1,0,bd27276a-e80c-4135-b341-f99a816ffe86,bd27276a-e80c-4135-b341-f99a816ffe86,1,0,35306678-147c-4ad1-a3c6-c80a11afa22f,35306678-147c-4ad1-a3c6-c80a11afa22f,1,0,0da75726-ae71-4d83-a696-a774c787a8a2,0da75726-ae71-4d83-a696-a774c787a8a2,1,0,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,1,0,896a7267-0198-4cbb-b6e6-7aa157c0cc61,896a7267-0198-4cbb-b6e6-7aa157c0cc61,1,0,2005bf54-219b-4111-bff1-e12e2c6dca3e,2005bf54-219b-4111-bff1-e12e2c6dca3e,1,0,abab8f73-d705-4350-b44d-f912649a2190,abab8f73-d705-4350-b44d-f912649a2190,1,0,20c9c25c-f8c9-429f-84bd-543cb809abef,20c9c25c-f8c9-429f-84bd-543cb809abef,1,0,dc5f451e-3275-43a8-9f48-45b83220d461,dc5f451e-3275-43a8-9f48-45b83220d461,1,0,028f5e81-61df-4d13-876d-781c5fd18ee6,028f5e81-61df-4d13-876d-781c5fd18ee6,1,0,3cbb59ef-7f64-4590-8a54-ba01e78283c3,3cbb59ef-7f64-4590-8a54-ba01e78283c3,1,0,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,1,0,388eb513-fadb-40cd-8a7b-33b904dd758e,388eb513-fadb-40cd-8a7b-33b904dd758e,1,0,0613c6aa-e1fe-4632-a396-a17ec773158f,0613c6aa-e1fe-4632-a396-a17ec773158f,1,0,1a330987-4c79-4ab7-b250-db8d32c78751,1a330987-4c79-4ab7-b250-db8d32c78751,1,0,b7295e8e-0aa4-4a49-81ea-0594a358e9ca,b7295e8e-0aa4-4a49-81ea-0594a358e9ca,1,0,555062ed-9a04-41d8-877f-0a667e9a08cd,555062ed-9a04-41d8-877f-0a667e9a08cd,1,0,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,1,0,ac160e1c-fef7-4625-84e0-964b397f6bdb,ac160e1c-fef7-4625-84e0-964b397f6bdb,1,0,b8946d9c-dda8-4b94-8cbf-db62b647c53e,b8946d9c-dda8-4b94-8cbf-db62b647c53e,1,0,24215916-7732-4030-9f88-163f644e94f7,24215916-7732-4030-9f88-163f644e94f7,1,0,69697945-9748-4cea-a20f-e244b46de2e8,69697945-9748-4cea-a20f-e244b46de2e8,1,0,68538fd1-262c-43ea-b09f-8a66643a0062,68538fd1-262c-43ea-b09f-8a66643a0062,1,0,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,1,0,82ad24cc-d9f8-440b-a720-e204101d85da,82ad24cc-d9f8-440b-a720-e204101d85da,1,0,aa63c001-c3da-4179-8fd8-fe2ff510511e,aa63c001-c3da-4179-8fd8-fe2ff510511e,1,0,b2e894b0-6443-4a52-95b6-6b564f809680,b2e894b0-6443-4a52-95b6-6b564f809680,1,0,8010065f-aec8-4768-85ec-9eb7b2b01e7e,8010065f-aec8-4768-85ec-9eb7b2b01e7e,1,0,a44348cb-e20c-4afd-8483-3b9c735b352c,a44348cb-e20c-4afd-8483-3b9c735b352c,1,0,ebfe4c74-6e16-4b64-8a52-cea95c446903,ebfe4c74-6e16-4b64-8a52-cea95c446903,1,0,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,1,0,d912e472-9553-4b96-8b16-7aaff6c14239,d912e472-9553-4b96-8b16-7aaff6c14239,1,0,b04018b5-a74d-43c9-8519-6cc8aa23fe09,b04018b5-a74d-43c9-8519-6cc8aa23fe09,1,0,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,1,0,9283277f-2b75-4c3a-810a-8d4071b3afcc,9283277f-2b75-4c3a-810a-8d4071b3afcc,1,0,d03d5b18-57a2-43c0-99ea-8ad9d5788179,d03d5b18-57a2-43c0-99ea-8ad9d5788179,1,0,c491a7fc-14f9-498a-b7dd-575dfc66878e,c491a7fc-14f9-498a-b7dd-575dfc66878e,1,0,db15f8eb-4736-4b47-9cee-3e6883f0888c,db15f8eb-4736-4b47-9cee-3e6883f0888c,1,0,59064eb2-2770-4f1c-96bd-801926fe68ef,59064eb2-2770-4f1c-96bd-801926fe68ef,1,0,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,df81cc63-26f2-4e66-bf0b-fd083a6a7d7b,1,0,8a8848b8-345a-452d-bf95-28f9c91c7e95,8a8848b8-345a-452d-bf95-28f9c91c7e95,1,0,440ecfe8-72fd-447b-8680-c4a8c43f2c72,440ecfe8-72fd-447b-8680-c4a8c43f2c72,1,0,5afe3a0f-1bbc-4f04-87b3-f98d54b65a42,5afe3a0f-1bbc-4f04-87b3-f98d54b65a42,1,0,ee9e8f50-4d4f-43aa-99eb-cda2308c903e,ee9e8f50-4d4f-43aa-99eb-cda2308c903e,1,0,4ff043c1-6c0b-4889-a684-23da5a35b9c2,4ff043c1-6c0b-4889-a684-23da5a35b9c2,1,0,6fe56ecb-c969-4c03-8e6b-65395c29e817,6fe56ecb-c969-4c03-8e6b-65395c29e817,1,0,48627a8d-b108-43b8-a58e-fd98e4220639,48627a8d-b108-43b8-a58e-fd98e4220639,1,0,2a8eb62d-2795-48ab-ae02-68527996f411,2a8eb62d-2795-48ab-ae02-68527996f411,1,0,d3bf09be-0f21-4dc3-a525-1c4dc75928ea,d3bf09be-0f21-4dc3-a525-1c4dc75928ea,1,0,5ca880c5-7c34-4c31-a2b8-46265ddea7d4,5ca880c5-7c34-4c31-a2b8-46265ddea7d4,1,0,a9441693-87ca-4157-98e1-63375852755c,a9441693-87ca-4157-98e1-63375852755c,1,0,6303ea55-e8ed-4acc-9717-941eefafc2a9,6303ea55-e8ed-4acc-9717-941eefafc2a9,1,0,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,5b4e1b83-fc10-4acc-bef7-81c73dbbc453,1,0,d0b17206-3949-4513-a47f-02e1a8ba369a,d0b17206-3949-4513-a47f-02e1a8ba369a,1,0,cb4f20d4-13e6-4c27-b491-da7931f4bf05,cb4f20d4-13e6-4c27-b491-da7931f4bf05,1,0,6b2340d7-687f-43a3-8eb8-8ddb86712466,6b2340d7-687f-43a3-8eb8-8ddb86712466,1,0,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,1,0,9328da5c-4689-4a60-8136-ae9eac46ab38,9328da5c-4689-4a60-8136-ae9eac46ab38,1,0,ca5d586f-81bb-40ee-b3bd-de854857c984,ca5d586f-81bb-40ee-b3bd-de854857c984,1,0,32c10512-7bb8-423b-9503-ab2fa41386a4,32c10512-7bb8-423b-9503-ab2fa41386a4,1,0,888edfc4-8140-4675-b267-c32bf1d8d29d,888edfc4-8140-4675-b267-c32bf1d8d29d,1,0,2abbd53a-0ead-42af-8df6-fde663aea300,2abbd53a-0ead-42af-8df6-fde663aea300,1,0,24611bf9-5492-443a-935c-a0058e86493f,24611bf9-5492-443a-935c-a0058e86493f,1,0,42641296-64da-46e0-a407-de2d492f9c90,42641296-64da-46e0-a407-de2d492f9c90,1,0,b834af0b-086c-445d-a271-7e178c324551,b834af0b-086c-445d-a271-7e178c324551,1,0,ec34befe-3c0b-4a75-b943-840c52e7dda5,ec34befe-3c0b-4a75-b943-840c52e7dda5,1,0,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,1,0,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,1,0,6733f1bd-7878-4a33-8995-c07526e87c1a,6733f1bd-7878-4a33-8995-c07526e87c1a,1,0,f7e73257-fae1-465a-ae74-faaa0273a416,f7e73257-fae1-465a-ae74-faaa0273a416,1,0,73f89524-dbe8-426f-8ee6-1277eb1967cc,73f89524-dbe8-426f-8ee6-1277eb1967cc,1,0,ee7d970c-cef7-4740-a357-1fe78f88a6e6,ee7d970c-cef7-4740-a357-1fe78f88a6e6,1,0,13beb01d-dd08-4a6d-863b-651e70bbf51f,13beb01d-dd08-4a6d-863b-651e70bbf51f,1,0,94bc76ae-72a0-418f-98c4-ae0a0326a2da,94bc76ae-72a0-418f-98c4-ae0a0326a2da,1,0,784475ff-eec5-462a-a511-ba31f8374c2e,784475ff-eec5-462a-a511-ba31f8374c2e,1,0,b5b56a64-5550-4da9-8872-d42ab871d21c,b5b56a64-5550-4da9-8872-d42ab871d21c,1,0,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,1,0,45a8c780-c067-40d7-bbe9-81f854aacf7a,45a8c780-c067-40d7-bbe9-81f854aacf7a,1,0,57885cac-059a-4a08-aa2c-43b116d2c777,57885cac-059a-4a08-aa2c-43b116d2c777,1,0,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,c0403df4-b1f2-4d7e-adb5-9ed881c1359b,1,0,27e0b5d9-1a4c-45b8-8969-d1d1c39129c1,27e0b5d9-1a4c-45b8-8969-d1d1c39129c1,1,0,626cbb27-6af2-4a9a-959e-15af4417e489,626cbb27-6af2-4a9a-959e-15af4417e489,1,0,e7b0ae70-0192-456c-9dc5-e66049fa9df2,e7b0ae70-0192-456c-9dc5-e66049fa9df2,1,0,68944d09-618e-4fa3-a7af-8c84218e0ac7,68944d09-618e-4fa3-a7af-8c84218e0ac7,1,0,91b12ce3-e8ba-4c9d-9daa-1d5532500314,91b12ce3-e8ba-4c9d-9daa-1d5532500314,1,0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,1,0,356a8091-4c0b-41d0-b8d2-963b3a807469,356a8091-4c0b-41d0-b8d2-963b3a807469,1,0,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,1,0,cb57aabc-eeef-42b4-9bc2-873cebd9618c,cb57aabc-eeef-42b4-9bc2-873cebd9618c,1,0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,1,0,52f30ed7-aa16-4ce2-9684-e50229ab0015,52f30ed7-aa16-4ce2-9684-e50229ab0015,1,0,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,1,0,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0526492c-be48-4c84-8d68-19fa1c7e9d6e,1,0,54ecaf7b-9bc5-483c-96e1-270bcd323590,54ecaf7b-9bc5-483c-96e1-270bcd323590,1,0,f00e93bf-6e3b-4819-a4e1-33471a6d0fff,f00e93bf-6e3b-4819-a4e1-33471a6d0fff,1,0,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,1,0,58f6f8fa-7473-40f5-973a-6279335d8f33,58f6f8fa-7473-40f5-973a-6279335d8f33,1,0,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,1,0,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1,0,fa3632fe-185b-49aa-85ae-dfb721835d40,fa3632fe-185b-49aa-85ae-dfb721835d40,1,0,a4f15108-477c-465e-aaea-cb495ef52cf5,a4f15108-477c-465e-aaea-cb495ef52cf5,1,0,9cda5c2c-f401-4f63-b445-cef160296e48,9cda5c2c-f401-4f63-b445-cef160296e48,1,0,e8ae4a26-3127-43ae-af7a-c2e278d2611d,e8ae4a26-3127-43ae-af7a-c2e278d2611d,1,0,b923c78f-d074-41b4-b832-086686258f19,b923c78f-d074-41b4-b832-086686258f19,1,0,8ff96413-6fdd-4b8d-a181-ea0d8633defc,8ff96413-6fdd-4b8d-a181-ea0d8633defc,1,0,54604ed2-766b-4308-b99e-447817d82799,54604ed2-766b-4308-b99e-447817d82799,1,0,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,1,0,ee008096-1ae8-4a64-9d3d-14cb15c8be70,ee008096-1ae8-4a64-9d3d-14cb15c8be70,1,0,a0a85b22-63ee-4a05-8b0d-1feb9ee07b0a,a0a85b22-63ee-4a05-8b0d-1feb9ee07b0a,1,0,a4754a7b-971f-4517-963e-b7cb9d57f86d,a4754a7b-971f-4517-963e-b7cb9d57f86d,1,0,f48b4475-2cd9-41df-962a-6529f84985ca,f48b4475-2cd9-41df-962a-6529f84985ca,1,0,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,1,0,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,1,0,bf94feb9-edf7-4df8-b5f5-805613663a0a,bf94feb9-edf7-4df8-b5f5-805613663a0a,1,0,6d852a13-c85e-4e84-8396-f91c1ed0596e,6d852a13-c85e-4e84-8396-f91c1ed0596e,1,0,9c2d5313-a4fd-417e-a340-ad4980d0028b,9c2d5313-a4fd-417e-a340-ad4980d0028b,1,0,4fb4a280-9426-4c41-a9ba-11f9d01a0740,4fb4a280-9426-4c41-a9ba-11f9d01a0740,1,0,1591ee7e-870c-4bf7-9450-be84f1b2506f,1591ee7e-870c-4bf7-9450-be84f1b2506f,1,0,7e32c295-a769-4cff-a3eb-992f7031475f,7e32c295-a769-4cff-a3eb-992f7031475f,1,0,5a398637-a06c-4442-9093-a864fa7f049f,5a398637-a06c-4442-9093-a864fa7f049f,1,0,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,1,0,115a6019-ef87-4126-8ebf-070c1e882940,115a6019-ef87-4126-8ebf-070c1e882940,1,0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,1,0,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,1,0,67efa786-312f-4c9c-b970-0320e92069af,67efa786-312f-4c9c-b970-0320e92069af,1,0,5b952e35-1037-4447-8293-6d8889692c8b,5b952e35-1037-4447-8293-6d8889692c8b,1,0,2bc2ca58-6cc0-4d4b-8672-f9328c86c2c1,2bc2ca58-6cc0-4d4b-8672-f9328c86c2c1,1,0,05bc8b4e-8c90-4502-8b16-7b1e7625d569,05bc8b4e-8c90-4502-8b16-7b1e7625d569,1,0,ce34d88d-3017-4197-a962-ea23a6a96d32,ce34d88d-3017-4197-a962-ea23a6a96d32,1,0,2cbc16da-aa67-4ad6-82f8-fa6922447be6,2cbc16da-aa67-4ad6-82f8-fa6922447be6,1,0,19d7a1ba-c343-4575-95da-53dac6d4b2cb,19d7a1ba-c343-4575-95da-53dac6d4b2cb,1,0,6cc8b3a0-3377-4b39-b6b0-69c862a15465,6cc8b3a0-3377-4b39-b6b0-69c862a15465,1,0,acb193f4-52e5-4572-a79b-b825a2f6525f,acb193f4-52e5-4572-a79b-b825a2f6525f,1,0,5d46f719-e468-48e2-b4ec-acb85c710451,5d46f719-e468-48e2-b4ec-acb85c710451,1,0,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,1,0,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,1,0,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,1,0,733d4494-01e2-46f5-a49b-f289267a90c9,733d4494-01e2-46f5-a49b-f289267a90c9,1,0,1e14d062-1d5a-4939-8ce6-4d9514990376,1e14d062-1d5a-4939-8ce6-4d9514990376,1,0,f86f24d2-9a83-47ae-9d95-b49a0a295770,f86f24d2-9a83-47ae-9d95-b49a0a295770,1,0,8368e1fa-da0c-4a9b-9d50-a122933c7899,8368e1fa-da0c-4a9b-9d50-a122933c7899,1,0,37986729-a275-4e86-8613-faee9a4f2525,37986729-a275-4e86-8613-faee9a4f2525,1,0,5814cb3a-8f7c-45b4-a590-b69d4912120f,5814cb3a-8f7c-45b4-a590-b69d4912120f,1,0,f06c8396-65ec-4ece-aed0-d45b2d8969b5,f06c8396-65ec-4ece-aed0-d45b2d8969b5,1,0,1faeab7f-7bd7-496d-8882-4aab6c425854,1faeab7f-7bd7-496d-8882-4aab6c425854,1,0,af922fb8-a99c-4154-89fe-d30a4d13024a,af922fb8-a99c-4154-89fe-d30a4d13024a,1,0,24c2f463-2bbb-471f-a409-507afad52caf,24c2f463-2bbb-471f-a409-507afad52caf,1,0,cbb07013-9ae1-43ec-8142-a724d788cb67,cbb07013-9ae1-43ec-8142-a724d788cb67,1,0,2403ac84-b513-4aa0-9a68-8d1ad705ce24,2403ac84-b513-4aa0-9a68-8d1ad705ce24,1,0,952b49e0-e1a1-4130-8fb2-083e3988255c,952b49e0-e1a1-4130-8fb2-083e3988255c,1,0,367b227f-f66e-4cec-9fc3-850bca8bc6c8,367b227f-f66e-4cec-9fc3-850bca8bc6c8,1,0,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1a3a8a3a-dc34-4491-883d-57c3fb69840a,1,0,7fcb9d79-1144-4099-8d7f-309d3bf045a5,7fcb9d79-1144-4099-8d7f-309d3bf045a5,1,0,db418313-8583-48a9-9fec-e2c5de4fdf76,db418313-8583-48a9-9fec-e2c5de4fdf76,1,0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,6277a3b5-b158-4b58-a92b-5efdf2dabac0,1,0,2f26970e-b964-43e2-8d6d-999bbc577689,2f26970e-b964-43e2-8d6d-999bbc577689,1,0,65a50026-88e7-45dd-bb0c-f212218ca093,65a50026-88e7-45dd-bb0c-f212218ca093,1,0,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,ed9e5fbe-1db8-4fb9-a9fa-bb1927cae196,1,0,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1dd2b2c4-00aa-4029-ba32-fe82aa5c6cbe,1,0,5c17a594-eb0b-4cdf-af35-0eaba968e065,5c17a594-eb0b-4cdf-af35-0eaba968e065,1,0,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,2f4ea53a-c84d-4d5f-ae7a-817a20ccd96a,1,0,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,b2a39c8a-d884-4dfe-a593-e6788dabbd6b,1,0,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,3d0afdb2-ab8f-43c0-920a-88ed85545b2f,1,0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,17477f72-0622-445c-9cb7-2c5a5a65bbe0,1,0,01a1fd57-6c09-4a5b-9f75-da4366159423,01a1fd57-6c09-4a5b-9f75-da4366159423,1,0,71d79b25-3682-4f2c-b6b2-a307e3e72844,71d79b25-3682-4f2c-b6b2-a307e3e72844,1,0,45c1ed0d-202e-4289-820f-e1de0f544386,45c1ed0d-202e-4289-820f-e1de0f544386,1,0,e889e80f-97c9-43c6-8268-d652764fcafb,e889e80f-97c9-43c6-8268-d652764fcafb,1,0,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,4eb48d3a-e2d5-4db5-b08b-4b6ccc701f77,1,0,95ccaaf2-f6ca-4540-8a39-3c90121c4236,95ccaaf2-f6ca-4540-8a39-3c90121c4236,1,0,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,7c920b8b-1dbf-4f7e-99af-1ca784a59a64,1,0,f47a9bec-2a9f-4955-a432-acb63a5b0e46,f47a9bec-2a9f-4955-a432-acb63a5b0e46,1,0,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1ba73b6b-cb72-4370-a268-279dcd7a54b9,1,0,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,49de6b63-a845-4b5a-9818-18a3e0bb6fe8,1,0,b787818e-5572-4ef2-ba54-1e9b69569824,b787818e-5572-4ef2-ba54-1e9b69569824,1,0,1e13bd37-61b5-4901-a607-e00e5d1900a8,1e13bd37-61b5-4901-a607-e00e5d1900a8,1,0,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,395b43e4-c18b-4f68-b99c-aed8d4b8cac9,1,0,231d7b21-c00c-4782-b610-d56593be436f,231d7b21-c00c-4782-b610-d56593be436f,1,0,79250d1a-77ff-4015-a5b5-83460b1611e2,79250d1a-77ff-4015-a5b5-83460b1611e2,1,0,60018ee0-71ec-4975-a95d-f6f188748ff2,60018ee0-71ec-4975-a95d-f6f188748ff2,1,0,68d35468-279a-43ef-9d71-fed44a792177,68d35468-279a-43ef-9d71-fed44a792177,1,0,77bec3d8-582a-4156-861b-4902008f014c,77bec3d8-582a-4156-861b-4902008f014c,1,0,2ad1caba-7a89-4389-934f-419970260961,2ad1caba-7a89-4389-934f-419970260961,1,0,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,bfc1a708-662d-4dc1-82b4-7b09bb1b0751,1,0,f88c4a72-368c-4f45-bb2c-d18f214a5079,f88c4a72-368c-4f45-bb2c-d18f214a5079,1,0,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,611876ba-7e6e-40c3-89a9-bb9b19cd1bfb,1,0,9dc2e313-c086-4fd9-83e8-911859ef480d,9dc2e313-c086-4fd9-83e8-911859ef480d,1,0,8a14ced0-9e45-4b3a-a135-11413c3a33c2,8a14ced0-9e45-4b3a-a135-11413c3a33c2,1,0,af7377db-0b27-42f7-a639-e2feb4015412,af7377db-0b27-42f7-a639-e2feb4015412,1,0,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,e1a200e2-64f3-434c-ae0d-5f24b9d65c9b,1,0,ab7db146-f26a-418a-8c45-e2513bf84e08,ab7db146-f26a-418a-8c45-e2513bf84e08,1,0,ece3bd8d-6616-44d5-9c14-6b3557738872,ece3bd8d-6616-44d5-9c14-6b3557738872,1,0,663a80ba-b97e-4265-a627-4a7d273f9472,663a80ba-b97e-4265-a627-4a7d273f9472,1,0,bf3304c0-5078-478f-bbf8-6178264c5f26,bf3304c0-5078-478f-bbf8-6178264c5f26,1,0,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,fbf754c3-ab89-4704-b01a-67f8bcea0c7c,1,0,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,3b0afd55-f08d-4d59-b6df-d7c4d1c52446,1,0,4893ad50-df19-4d86-9469-40491ba733c9,4893ad50-df19-4d86-9469-40491ba733c9,1,0,25a65c1e-8e67-4135-843d-1e0da72dfd64,25a65c1e-8e67-4135-843d-1e0da72dfd64,1,0,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,5724fbd5-4d91-4e6d-ae24-8925a4d83c83,1,0,29a6416e-b0f5-4111-8f86-1ba80244e73a,29a6416e-b0f5-4111-8f86-1ba80244e73a,1,0,0f49085a-9b83-4256-be60-f341b2ef132e,0f49085a-9b83-4256-be60-f341b2ef132e,1,0,f44c66d6-cfe2-482f-a921-de3db3cd09ea,f44c66d6-cfe2-482f-a921-de3db3cd09ea,1,0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,5ec1b7af-f4bc-4ec1-8f43-85c4f9d146a0,1,0,c521bd61-386e-41c8-bcc3-29d54b63cc32,c521bd61-386e-41c8-bcc3-29d54b63cc32,1,0,d46e3424-6d30-4229-9a56-ab256517534a,d46e3424-6d30-4229-9a56-ab256517534a,1,0,09d3633d-8e8c-47f3-8f34-d70eb94577e1,09d3633d-8e8c-47f3-8f34-d70eb94577e1,1,0,fe868143-363b-4da1-889b-98d4dd10a1fd,fe868143-363b-4da1-889b-98d4dd10a1fd,1,0,b791a549-ae94-46f2-8f04-771fdeb4cc54,b791a549-ae94-46f2-8f04-771fdeb4cc54,1,0,4681cb63-c581-4c08-b18c-016d9b478ef2,4681cb63-c581-4c08-b18c-016d9b478ef2,1,0,041c364f-0498-494f-9e41-82cb416c0862,041c364f-0498-494f-9e41-82cb416c0862,1,0,913830c8-da01-4b7e-9d83-d406c2fefd49,913830c8-da01-4b7e-9d83-d406c2fefd49,1,0,ca8c4c19-9f92-45a7-b5bd-1ae06e3c9171,ca8c4c19-9f92-45a7-b5bd-1ae06e3c9171,1,0,9f1c8979-2b3d-4a96-af6c-4577541696a3,9f1c8979-2b3d-4a96-af6c-4577541696a3,1,0,5adaafcf-3d67-418d-b47d-d0d8c65f1f46,5adaafcf-3d67-418d-b47d-d0d8c65f1f46,1,0,8a0f16a1-63c4-4ea4-a2f1-7b08e75efbd5,8a0f16a1-63c4-4ea4-a2f1-7b08e75efbd5,1,0,f68ec923-89c8-4c83-80a2-2d5e096dbbd8,f68ec923-89c8-4c83-80a2-2d5e096dbbd8,1,0,f278bdf8-543a-4427-b2f1-3670c61502ae,f278bdf8-543a-4427-b2f1-3670c61502ae,1,0,00ce0cd2-9840-49a0-b9df-dc64becd3e65,00ce0cd2-9840-49a0-b9df-dc64becd3e65,1,0,db6f11c0-8530-43c1-811a-48797be89ec1,db6f11c0-8530-43c1-811a-48797be89ec1,1,0,c2782a2b-f910-4d4d-ba1b-49ef7854bae0,c2782a2b-f910-4d4d-ba1b-49ef7854bae0,1,0,293cda8c-1cc8-42c0-a68f-d22163aed4f1,293cda8c-1cc8-42c0-a68f-d22163aed4f1,1,0,5e48841c-0a65-457f-8952-fa97aae3207d,5e48841c-0a65-457f-8952-fa97aae3207d,1,0,ee0275e4-a497-4623-9d2f-6308ea2e70ca,ee0275e4-a497-4623-9d2f-6308ea2e70ca,1,0,ec37d236-db36-44ef-afc2-267af1f40c1f,ec37d236-db36-44ef-afc2-267af1f40c1f,1,0,d835f08d-79c6-4e79-a7c1-f00dc05778b9,d835f08d-79c6-4e79-a7c1-f00dc05778b9,1,0,32371dfd-c890-4bed-bd68-45db299c9caf,32371dfd-c890-4bed-bd68-45db299c9caf,1,0,eeb298cf-8df3-41fe-bb48-9c83a24a8206,eeb298cf-8df3-41fe-bb48-9c83a24a8206,1,0,04055821-03ce-4049-af2c-8670c80517f6,04055821-03ce-4049-af2c-8670c80517f6,1,0,0101305d-62eb-4802-9cd4-d615a518d842,0101305d-62eb-4802-9cd4-d615a518d842,1,0,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,1,0,1d429511-9446-4102-95f4-df676125e14c,1d429511-9446-4102-95f4-df676125e14c,1,0,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,1,0,7c424424-9660-462d-9cf2-4c1e6bd284fa,7c424424-9660-462d-9cf2-4c1e6bd284fa,1,0,e118f957-ab2c-473b-ab64-37032f727416,e118f957-ab2c-473b-ab64-37032f727416,1,0,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,1,0,21f64e5f-dc94-4ce9-b836-e75646ae3325,21f64e5f-dc94-4ce9-b836-e75646ae3325,1,0,82e8a180-f2e1-406c-9609-89d33504aff2,82e8a180-f2e1-406c-9609-89d33504aff2,1,0,e7437c81-3d5b-466e-880c-8febe4a68e88,e7437c81-3d5b-466e-880c-8febe4a68e88,1,0,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,1,0,307771e6-bcf7-4016-b369-e1655bbe9e94,307771e6-bcf7-4016-b369-e1655bbe9e94,1,0,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,1,0,38fc6a54-846c-40b0-9254-3261f540bf18,38fc6a54-846c-40b0-9254-3261f540bf18,1,0,d9134d0c-56cd-4b8f-ab11-ae37fc306801,d9134d0c-56cd-4b8f-ab11-ae37fc306801,1,0,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,1,0,8f2af24b-f5fa-4f6d-831e-28453bdedefc,8f2af24b-f5fa-4f6d-831e-28453bdedefc,1,0,d119e21d-0087-4f22-b3bd-b14707b65330,d119e21d-0087-4f22-b3bd-b14707b65330,1,0,dc9b4072-11de-40fe-bf2a-f7b15af0a250,dc9b4072-11de-40fe-bf2a-f7b15af0a250,1,0,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,1,0,aa0e290d-21ab-4197-b8f3-cf1f97ab1b98,aa0e290d-21ab-4197-b8f3-cf1f97ab1b98,1,0,eefa9859-4168-4a10-923f-e4a713c99a3b,eefa9859-4168-4a10-923f-e4a713c99a3b,1,0,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,1,0,932b1c1a-72eb-49cd-8218-d0ced9c454d8,932b1c1a-72eb-49cd-8218-d0ced9c454d8,1,0,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,1,0,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,1,0,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,1,0,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,1,0,5dd336c4-88c5-4f53-acf0-5f86a658c528,5dd336c4-88c5-4f53-acf0-5f86a658c528,1,0,c723112b-286d-46f1-989d-81252062a025,c723112b-286d-46f1-989d-81252062a025,1,0,67e8b47e-4bad-4b2f-b196-8a9708893051,67e8b47e-4bad-4b2f-b196-8a9708893051,1,0,39bddcde-697c-4e77-adfd-e4a77529ea97,39bddcde-697c-4e77-adfd-e4a77529ea97,1,0,a3b15381-bf9b-4b26-96eb-392fa2cc8223,a3b15381-bf9b-4b26-96eb-392fa2cc8223,1,0,a583e53a-3f3c-48c7-8928-37ce40b2bafe,a583e53a-3f3c-48c7-8928-37ce40b2bafe,1,0,a844dd4a-274a-4894-9446-031dbe006084,a844dd4a-274a-4894-9446-031dbe006084,1,0,9a740f81-5437-47af-8ed9-ea62edcb2ea1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,1,0,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,1,0,77bdd30f-4933-4bda-9c7a-b0a097da0910,77bdd30f-4933-4bda-9c7a-b0a097da0910,1,0,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,1,0,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,1,0,8e9eb604-5f15-4ef5-8906-5bcd57b3d099,8e9eb604-5f15-4ef5-8906-5bcd57b3d099,1,0,a682e9e1-284f-4e32-86b2-6736f159f585,a682e9e1-284f-4e32-86b2-6736f159f585,1,0,84f0bd89-9b86-440f-b942-9b685e22233e,84f0bd89-9b86-440f-b942-9b685e22233e,1,0,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,1,0,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,1,0,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,1,0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,1,0,fabf8a0b-366f-4f23-9377-315534bb854b,fabf8a0b-366f-4f23-9377-315534bb854b,1,0,7aac6439-64c9-4492-b866-bf91dda82d06,7aac6439-64c9-4492-b866-bf91dda82d06,1,0,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,1,0,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,1,0,08b86f29-64ef-467a-af1a-d27ffdf621ba,08b86f29-64ef-467a-af1a-d27ffdf621ba,1,0,6483d1ab-c53d-4985-ad7e-b799adbcd9da,6483d1ab-c53d-4985-ad7e-b799adbcd9da,1,0,82f66233-ed13-49ae-ab72-7cf91c88c760,82f66233-ed13-49ae-ab72-7cf91c88c760,1,0,75cddbcd-e960-4164-81d8-ac0a2a36e95b,75cddbcd-e960-4164-81d8-ac0a2a36e95b,1,0,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,1,0,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,1,0,d9151001-a911-45c1-a8e6-dcf0da623ed3,d9151001-a911-45c1-a8e6-dcf0da623ed3,1,0,42f4ad3c-3724-4032-82f0-10c8dbe6cc9f,42f4ad3c-3724-4032-82f0-10c8dbe6cc9f,1,0,bbd8b83d-413a-4ffc-8351-e0ec4f4ae619,bbd8b83d-413a-4ffc-8351-e0ec4f4ae619,1,0,c49cef0d-3b71-4e66-9e35-72b94920dae5,c49cef0d-3b71-4e66-9e35-72b94920dae5,1,0,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,1,0,e589a693-ff50-4c36-ae26-a8fcae966d57,e589a693-ff50-4c36-ae26-a8fcae966d57,1,0,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,1,0,90f023f5-5b48-4f98-bfc6-b704277a355d,90f023f5-5b48-4f98-bfc6-b704277a355d,1,0,99485603-706d-4301-be25-82b1c0ee8f4d,99485603-706d-4301-be25-82b1c0ee8f4d,1,0,e7a28021-c75e-41b2-9974-cf4beee34d28,e7a28021-c75e-41b2-9974-cf4beee34d28,1,0,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,1,0,2a603c61-4cbf-4c6d-a0b2-40c835d36737,2a603c61-4cbf-4c6d-a0b2-40c835d36737,1,0,a8d7f071-401b-499e-957c-d077d8002e54,a8d7f071-401b-499e-957c-d077d8002e54,1,0,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,b6206c73-cf17-4e74-a14d-f2a2ef2b2cc1,1,0,b363f72f-3629-453c-9f7d-9828ef6de733,b363f72f-3629-453c-9f7d-9828ef6de733,1,0,211a539b-4be9-4816-98f6-f756e65eafd8,211a539b-4be9-4816-98f6-f756e65eafd8,1,0,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,1,0,e9b9da80-7806-4c9c-a002-01cfa3109169,e9b9da80-7806-4c9c-a002-01cfa3109169,1,0,a271041d-0203-4ecd-bb39-70256c50192e,a271041d-0203-4ecd-bb39-70256c50192e,1,0,c6c26c3c-de7a-4ed4-944d-ada62cf1ab8f,c6c26c3c-de7a-4ed4-944d-ada62cf1ab8f,1,0,a54872fc-4e7e-4829-8564-1b2e7f0ee134,a54872fc-4e7e-4829-8564-1b2e7f0ee134,1,0,fe10d76e-3f80-4529-83a8-74c452a781f6,fe10d76e-3f80-4529-83a8-74c452a781f6,1,0,e3d1a7f5-ba86-414e-b2d2-89cc9db51667,e3d1a7f5-ba86-414e-b2d2-89cc9db51667,1,0,13333d66-ff04-49ec-973a-1229da8c9f50,13333d66-ff04-49ec-973a-1229da8c9f50,1,0,73eff626-a363-4a5a-879e-61ef6ce0726f,73eff626-a363-4a5a-879e-61ef6ce0726f,1,0,acf15b79-a6c4-4c46-8013-50d3b223baf6,acf15b79-a6c4-4c46-8013-50d3b223baf6,1,0,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,1,0,2d8d5d74-2bc0-4282-af66-e4a37694c147,2d8d5d74-2bc0-4282-af66-e4a37694c147,1,0,cfd31341-287b-4684-9ac0-b28b4e066f15,cfd31341-287b-4684-9ac0-b28b4e066f15,1,0,81de1b0b-7f2d-4098-ae99-061c6a90dc29,81de1b0b-7f2d-4098-ae99-061c6a90dc29,1,0,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,77c8a065-a8aa-4f39-93b6-c88f4c38ec66,1,0,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,366fa6da-d3bf-4bb0-9a55-a307f9edee6a,1,0,dd0610c8-cd87-4fe2-8a1f-70157132785b,dd0610c8-cd87-4fe2-8a1f-70157132785b,1,0,f829e2a9-5bdb-4171-8b32-8d10d5968813,f829e2a9-5bdb-4171-8b32-8d10d5968813,1,0,647ba8f8-57f7-4c19-af59-525517c1e392,647ba8f8-57f7-4c19-af59-525517c1e392,1,0,39062cb3-4ae8-4c0d-889b-038a55179946,39062cb3-4ae8-4c0d-889b-038a55179946,1,0,c62d4212-36ca-4afb-bac9-269b6f64ca51,c62d4212-36ca-4afb-bac9-269b6f64ca51,1,0,5cec5e16-46ad-4f8c-b869-f5b1cc487884,5cec5e16-46ad-4f8c-b869-f5b1cc487884,1,0,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,1,0,7aacdf81-49fd-47a3-a36a-c483f1b05872,7aacdf81-49fd-47a3-a36a-c483f1b05872,1,0,857015e2-afb2-403d-bfb7-7acb5080797b,857015e2-afb2-403d-bfb7-7acb5080797b,1,0,5657286b-114b-41de-ab7d-45d0f0d95e2d,5657286b-114b-41de-ab7d-45d0f0d95e2d,1,0,42a0271e-6783-44db-95c1-09805ae01f58,42a0271e-6783-44db-95c1-09805ae01f58,1,0,8628783e-4fad-4dff-8220-9e0ddc8580f8,8628783e-4fad-4dff-8220-9e0ddc8580f8,1,0,356fc245-3034-42d1-84d0-632c6dc7a3d5,356fc245-3034-42d1-84d0-632c6dc7a3d5,1,0,07462664-6b58-4f5a-9b3f-2e5c376f17df,07462664-6b58-4f5a-9b3f-2e5c376f17df,1,0,6f23e946-f700-424b-b9bf-3a9c8846908d,6f23e946-f700-424b-b9bf-3a9c8846908d,1,0,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,1,0,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,1,0,2aafb1a1-4321-47e9-9783-03ab616a2873,2aafb1a1-4321-47e9-9783-03ab616a2873,1,0,71109997-6da0-4eaf-bbf2-f94fa24f37cc,71109997-6da0-4eaf-bbf2-f94fa24f37cc,1,0,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,1,0,d601281c-379d-4a9d-843e-478fd6567415,d601281c-379d-4a9d-843e-478fd6567415,1,0,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,1,0,427e6f15-334e-42be-9554-895d8f7ebfc6,427e6f15-334e-42be-9554-895d8f7ebfc6,1,0,02abb5e3-9d4e-4c45-af19-71796966ed19,02abb5e3-9d4e-4c45-af19-71796966ed19,1,0,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,1,0,36bc8523-41a5-48ff-9bd0-758d078c4408,36bc8523-41a5-48ff-9bd0-758d078c4408,1,0,94ca1b45-3cf0-4857-8299-999c93f4fb56,94ca1b45-3cf0-4857-8299-999c93f4fb56,1,0,ee8419c6-79ca-4546-9a66-bacaa08d2a73,ee8419c6-79ca-4546-9a66-bacaa08d2a73,1,0,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,1,0,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,1,0,ada11ea2-94d5-4172-a383-a51774599568,ada11ea2-94d5-4172-a383-a51774599568,1,0,50515bbc-43ee-4b00-bfc5-105b7981bd8f,50515bbc-43ee-4b00-bfc5-105b7981bd8f,1,0,1ea080b0-0a11-4152-b8bb-4918bc142a23,1ea080b0-0a11-4152-b8bb-4918bc142a23,1,0,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,1,0,6930e471-7935-4d68-a980-2acde93ba801,6930e471-7935-4d68-a980-2acde93ba801,1,0,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,1,0,5135cc48-c749-4acb-a225-d110f386f482,5135cc48-c749-4acb-a225-d110f386f482,1,0,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,1,0,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,1,0,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,1,0,2e9fa546-96fb-4ecb-b933-7921e131e89b,2e9fa546-96fb-4ecb-b933-7921e131e89b,1,0,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,1,0,637a132b-1a88-44ba-b45f-ed4ed1ac1001,637a132b-1a88-44ba-b45f-ed4ed1ac1001,1,0,c3efa853-cd29-4618-929f-e3bec33dfd65,c3efa853-cd29-4618-929f-e3bec33dfd65,1,0,62185c28-3d24-487a-9441-b309dcf11e31,62185c28-3d24-487a-9441-b309dcf11e31,1,0,9f264aeb-664d-4724-8248-11873d63ef3b,9f264aeb-664d-4724-8248-11873d63ef3b,1,0,b926d058-53a9-4eea-b4f9-98e77f798dd9,b926d058-53a9-4eea-b4f9-98e77f798dd9,1,0,495e2c77-4868-4191-ac18-f94e55a5982e,495e2c77-4868-4191-ac18-f94e55a5982e,1,0,20191a65-322c-457d-85f5-ed1258b6fe8e,20191a65-322c-457d-85f5-ed1258b6fe8e,1,0,d71ca3bc-e41a-44d9-afe4-c68f1211b3a1,d71ca3bc-e41a-44d9-afe4-c68f1211b3a1,1,0,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,1,0,769c60aa-44f4-4c98-a461-d3f5c2b67f61,769c60aa-44f4-4c98-a461-d3f5c2b67f61,1,0,f9809c99-0eaa-4249-967c-a4bef4763277,f9809c99-0eaa-4249-967c-a4bef4763277,1,0,37fa88a0-f2c1-455f-a28d-74165e8b933d,37fa88a0-f2c1-455f-a28d-74165e8b933d,1,0,e4476f09-909b-49f7-8e01-72eea8ceaca6,e4476f09-909b-49f7-8e01-72eea8ceaca6,1,0,2861412c-46f0-454e-b81d-fe081afb5c7a,2861412c-46f0-454e-b81d-fe081afb5c7a,1,0,2b4ece05-b694-42e9-8239-55722fd84294,2b4ece05-b694-42e9-8239-55722fd84294,1,0,6564ce89-134f-4726-8693-fd93aad46180,6564ce89-134f-4726-8693-fd93aad46180,1,0,0d743731-da5d-4c99-b19f-e93c69b77e14,0d743731-da5d-4c99-b19f-e93c69b77e14,1,0,d6f15367-23e2-4766-bc7c-8acd0063aa0c,d6f15367-23e2-4766-bc7c-8acd0063aa0c,1,0,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,1,0,fa4c5665-4d73-4db2-a055-8c1c8a302f82,fa4c5665-4d73-4db2-a055-8c1c8a302f82,1,0,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,1,0,9100b286-8ae9-4de3-b116-5ce0fa95b80c,9100b286-8ae9-4de3-b116-5ce0fa95b80c,1,0,3d315df6-e000-4cbd-810d-0b26c0d1bc54,3d315df6-e000-4cbd-810d-0b26c0d1bc54,1,0,fa429302-ccaf-4c89-8a11-3a1d30817c00,fa429302-ccaf-4c89-8a11-3a1d30817c00,1,0,9b4c49ce-93da-439a-8d67-f3774e92800a,9b4c49ce-93da-439a-8d67-f3774e92800a,1,0,5f8fa827-7017-4b45-b458-3571b8b611f5,5f8fa827-7017-4b45-b458-3571b8b611f5,1,0,79749167-2912-4e06-9deb-7915a1b4390d,79749167-2912-4e06-9deb-7915a1b4390d,1,0,1c93fcd3-53a1-403f-a30b-454fbc941d55,1c93fcd3-53a1-403f-a30b-454fbc941d55,1,0,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,1,0,adec3963-b22f-4463-a3f4-c9ec27d187a8,adec3963-b22f-4463-a3f4-c9ec27d187a8,1,0,d8dae0c8-8e11-44bf-bf60-d316220f3e82,d8dae0c8-8e11-44bf-bf60-d316220f3e82,1,0,12afec4d-1728-4aa8-86e5-23cd2f1572b3,12afec4d-1728-4aa8-86e5-23cd2f1572b3,1,0,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,1,0,ee0c3960-d1bf-411f-a51f-e6e27dabea87,ee0c3960-d1bf-411f-a51f-e6e27dabea87,1,0,d7fb9441-1aef-4257-af3f-7f16340ac85e,d7fb9441-1aef-4257-af3f-7f16340ac85e,1,0,d07c094c-2795-4e0c-b030-bdb82be7ba6d,d07c094c-2795-4e0c-b030-bdb82be7ba6d,1,0,62637860-2013-4f9d-9aed-7cbb0dce8983,62637860-2013-4f9d-9aed-7cbb0dce8983,1,0,331217f6-7ec2-425d-93bd-f2979c5f2e05,331217f6-7ec2-425d-93bd-f2979c5f2e05,1,0,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,7d5b2b73-27e6-4a61-9558-eb2410eb9f2f,1,0,d754ed75-2a32-4b86-a153-7b50c39f9836,d754ed75-2a32-4b86-a153-7b50c39f9836,1,0,b81f3ee1-66f7-4626-a35b-ef85388c678e,b81f3ee1-66f7-4626-a35b-ef85388c678e,1,0,2ad04793-c162-4915-a260-ca4da535cdac,2ad04793-c162-4915-a260-ca4da535cdac,1,0,78942e92-a31c-4824-a614-a6e07ae26171,78942e92-a31c-4824-a614-a6e07ae26171,1,0,6568d853-dfe5-4064-aa73-c1f546e951b4,6568d853-dfe5-4064-aa73-c1f546e951b4,1,0,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,7cee27a7-9827-47f8-96f3-d4f1f3dcabe9,1,0,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,9bfba5cd-551a-4685-99dd-ebfd9f7fd7d1,1,0,bbe718b2-6b4c-4d78-a408-5369d356a1e6,bbe718b2-6b4c-4d78-a408-5369d356a1e6,1,0,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,4ecd85c4-5be7-4e6b-8c53-7dd32bd4d707,1,0,eb7623df-b4e3-4272-9f92-42a9214f9f17,eb7623df-b4e3-4272-9f92-42a9214f9f17,1,0,a5f5bc90-e670-4ee7-95fe-067fe1b129f7,a5f5bc90-e670-4ee7-95fe-067fe1b129f7,1,0,f790f620-2247-4a04-b0ad-8aa591655948,f790f620-2247-4a04-b0ad-8aa591655948,1,0,6d9d9087-91ad-4368-9087-0af8f83fdc9e,6d9d9087-91ad-4368-9087-0af8f83fdc9e,1,0,61fdb27e-b449-40a7-8ecd-7e3e8ae3aa23,61fdb27e-b449-40a7-8ecd-7e3e8ae3aa23,1,0,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,c7e4e97f-fb85-4e95-bfdf-7706e867d89b,1,0,b08fd921-c3d6-44eb-9401-fec5acab5d22,b08fd921-c3d6-44eb-9401-fec5acab5d22,1,0,f4f185af-5507-427c-b82b-515ea71f3fc1,f4f185af-5507-427c-b82b-515ea71f3fc1,1,0,1611855a-abf4-4269-aed3-3f78dce7bea5,1611855a-abf4-4269-aed3-3f78dce7bea5,1,0,c5bd277c-b258-43af-9c80-3e328b1581f5,c5bd277c-b258-43af-9c80-3e328b1581f5,1,0,96dac7e8-5113-4217-ac0a-fffea4acc410,96dac7e8-5113-4217-ac0a-fffea4acc410,1,0,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,d6fa2b86-1c3b-4c14-8a66-b6dbd40bca19,1,0,f9cefef4-2182-42ca-93ef-b6a51d6555cc,f9cefef4-2182-42ca-93ef-b6a51d6555cc,1,0,71e1c7de-7367-424c-ae07-6ec04b408b83,71e1c7de-7367-424c-ae07-6ec04b408b83,1,0,b3956392-199c-4934-80d1-8cdab453d879,b3956392-199c-4934-80d1-8cdab453d879,1,0,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,5e26aeb7-617c-4983-b40d-5a61c77aa6a4,1,0,d1bd7448-aa5f-43fc-9735-224f36960c3e,d1bd7448-aa5f-43fc-9735-224f36960c3e,1,0,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,94dbfc4c-d530-4fbd-b7cf-a58a56289b97,1,0,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,6fa25c57-411d-4f9c-9c3e-c7ea1b1f7195,1,0,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1bfa15cf-222e-4e5b-beb7-7a50f8131799,1,0,8227471b-8ffb-4ba7-b4da-b21570582876,8227471b-8ffb-4ba7-b4da-b21570582876,1,0,ea7ab9fa-5119-4773-b17d-fc74c7479d3d,ea7ab9fa-5119-4773-b17d-fc74c7479d3d,1,0,3e0fe508-87fa-47af-a47f-c0630a186900,3e0fe508-87fa-47af-a47f-c0630a186900,1,0,09740271-b8a8-4949-a116-b64449d80036,09740271-b8a8-4949-a116-b64449d80036,1,0,c8fedc0b-33d6-46a5-b4fc-a3cd728f5fd7,c8fedc0b-33d6-46a5-b4fc-a3cd728f5fd7,1,0,25864028-1a53-4a8d-b6e4-189fa62c62f5,25864028-1a53-4a8d-b6e4-189fa62c62f5,1,0,e923beae-0bd8-4119-a802-fd6bfb729f10,e923beae-0bd8-4119-a802-fd6bfb729f10,1,0,67c1269a-79e6-44d9-9254-671c50fb3974,67c1269a-79e6-44d9-9254-671c50fb3974,1,0,5d455d2a-910d-48c7-bc74-ba5ad7855110,5d455d2a-910d-48c7-bc74-ba5ad7855110,1,0,7cf3feea-75e2-42cc-9c89-4a9182034910,7cf3feea-75e2-42cc-9c89-4a9182034910,1,0,930a0156-feb3-4e14-96a5-cd183a4891f4,930a0156-feb3-4e14-96a5-cd183a4891f4,1,0,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,1,0,e268a337-f576-4ec2-8a22-0500b79b2441,e268a337-f576-4ec2-8a22-0500b79b2441,1,0,eb33a8fa-75a6-4926-a025-05bc0abe4374,eb33a8fa-75a6-4926-a025-05bc0abe4374,1,0,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,1,0,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,1,0,bf480259-6e72-4ad1-ac41-0b0d41a75387,bf480259-6e72-4ad1-ac41-0b0d41a75387,1,0,a41f060a-f0f6-4940-960b-5056082b2c45,a41f060a-f0f6-4940-960b-5056082b2c45,1,0,5d45a926-513f-4bbc-a002-54a2db94b297,5d45a926-513f-4bbc-a002-54a2db94b297,1,0,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,73f5ce9e-d5a7-45c0-965a-8af1d776a98a,1,0,073e14d4-5d43-428b-a9a7-985d173e94c7,073e14d4-5d43-428b-a9a7-985d173e94c7,1,0,61dc318a-c17d-402e-bf64-a0c0a63a1c93,61dc318a-c17d-402e-bf64-a0c0a63a1c93,1,0,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,c4b0c101-8cd9-441c-b94c-9dfa1ad58d45,1,0,2394775b-8910-4667-9c74-e1606e0b13bc,2394775b-8910-4667-9c74-e1606e0b13bc,1,0,43c88ffd-a036-4563-890b-bdc60180e841,43c88ffd-a036-4563-890b-bdc60180e841,1,0,af6e5e8e-6482-4820-a810-9e275ae039bf,af6e5e8e-6482-4820-a810-9e275ae039bf,1,0,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,1,0,7690620b-21d9-463a-8c22-60844927b4a0,7690620b-21d9-463a-8c22-60844927b4a0,1,0,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,1,0,b1db3255-38da-4684-b44e-4e2e9ee1dc35,b1db3255-38da-4684-b44e-4e2e9ee1dc35,1,0,4761f89b-7894-4dca-83b0-3be2d0828781,4761f89b-7894-4dca-83b0-3be2d0828781,1,0,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,1,0,7236d52f-9068-45ad-8b92-a7319e737e08,7236d52f-9068-45ad-8b92-a7319e737e08,1,0,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,1,0,9db23e96-d13a-4847-941a-462f64d0619d,9db23e96-d13a-4847-941a-462f64d0619d,1,0,7575fd54-c91b-4220-a2ef-2cf533f60426,7575fd54-c91b-4220-a2ef-2cf533f60426,1,0,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1,0,26e2c83b-8873-4ad3-9c50-e94421473a43,26e2c83b-8873-4ad3-9c50-e94421473a43,1,0,f0b2ec05-8e01-4ccf-b927-671329a9013b,f0b2ec05-8e01-4ccf-b927-671329a9013b,1,0,ab442b11-2482-4f80-ac82-01966e0657ec,ab442b11-2482-4f80-ac82-01966e0657ec,1,0,14fe4d39-81a1-470e-9724-6642ce34ad89,14fe4d39-81a1-470e-9724-6642ce34ad89,1,0,457578ab-dfe2-4419-8d8a-64283b341f42,457578ab-dfe2-4419-8d8a-64283b341f42,1,0,67ef6671-f537-46bf-88e6-f5bcf34a17a4,67ef6671-f537-46bf-88e6-f5bcf34a17a4,1,0,de778ca7-feaf-4531-80ae-11a534c56928,de778ca7-feaf-4531-80ae-11a534c56928,1,0,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,1,0,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0a76a84d-e883-477e-8b87-7bf984cdc1cf,1,0,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,1,0,86df8648-e195-4661-99ee-6052788eb276,86df8648-e195-4661-99ee-6052788eb276,1,0,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,1,0,35133725-9647-42dc-a76a-2e62b2918ac4,35133725-9647-42dc-a76a-2e62b2918ac4,1,0,c7b883dc-6c26-4eb5-bc19-7919ad57da27,c7b883dc-6c26-4eb5-bc19-7919ad57da27,1,0,7fc37008-c378-4a70-a9a9-07543c7248a6,7fc37008-c378-4a70-a9a9-07543c7248a6,1,0,6410853e-a17e-44db-b8cc-bfefd7c4d239,6410853e-a17e-44db-b8cc-bfefd7c4d239,1,0,df042e4e-01a6-4480-a9c5-c0d7a454bb41,df042e4e-01a6-4480-a9c5-c0d7a454bb41,1,0,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,5a4abb96-8a18-4249-9fbb-7270fe2ba25b,1,0,6852c584-d989-418d-8d18-255492891ef0,6852c584-d989-418d-8d18-255492891ef0,1,0,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,1,0,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,1,0,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,1,0,ff830967-faa9-415f-aa6e-8d27779f91f8,ff830967-faa9-415f-aa6e-8d27779f91f8,1,0,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,1,0,88618d0f-97af-4055-a490-561d4b8065a7,88618d0f-97af-4055-a490-561d4b8065a7,1,0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,1,0,7b816ca0-ba60-4637-8348-23b26ad23e3f,7b816ca0-ba60-4637-8348-23b26ad23e3f,1,0,814a6db4-a43c-44e6-ac44-11983642c5ad,814a6db4-a43c-44e6-ac44-11983642c5ad,1,0,0bd74786-e018-4a66-b994-cdb439c57657,0bd74786-e018-4a66-b994-cdb439c57657,1,0,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,1,0,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,1,0,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,1,0,09502176-c53d-4525-b8ed-32d0a2e21a5d,09502176-c53d-4525-b8ed-32d0a2e21a5d,1,0,75ad984e-d41f-4591-b207-e8a4b05757a7,75ad984e-d41f-4591-b207-e8a4b05757a7,1,0,3f020f90-7aeb-4b21-ad71-4572ac796d4c,3f020f90-7aeb-4b21-ad71-4572ac796d4c,1,0,759e2ba0-2941-4cc1-8409-50b8a3620058,759e2ba0-2941-4cc1-8409-50b8a3620058,1,0,491cf25d-091e-4e09-b145-92d7073326cf,491cf25d-091e-4e09-b145-92d7073326cf,1,0,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,1,0,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,1,0,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,1,0,900bc96e-fbcc-473e-970c-96f561420f8e,900bc96e-fbcc-473e-970c-96f561420f8e,1,0,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,1,0,21d5a0b0-9a2b-4989-a50a-781645513179,21d5a0b0-9a2b-4989-a50a-781645513179,1,0,3255033a-e922-412e-a825-a3e8bd284703,3255033a-e922-412e-a825-a3e8bd284703,1,0,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1,0,f250f992-ad5a-4dab-ad38-240604adb0c4,f250f992-ad5a-4dab-ad38-240604adb0c4,1,0,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,1,0,e63671f6-c96d-4ea4-8300-af7dbd0d016f,e63671f6-c96d-4ea4-8300-af7dbd0d016f,1,0,2c511469-0df6-470f-a808-decb275e8b1a,2c511469-0df6-470f-a808-decb275e8b1a,1,0,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1,0,99b40f9f-f8f1-4779-8afc-59d30612f3d6,99b40f9f-f8f1-4779-8afc-59d30612f3d6,1,0,6131e875-3254-4281-9343-9118564c5451,6131e875-3254-4281-9343-9118564c5451,1,0,69622ff8-8a23-42fc-b63d-5097e3f636ac,69622ff8-8a23-42fc-b63d-5097e3f636ac,1,0,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,1,0,ef326bd8-1570-455e-ae8c-063b5578ad15,ef326bd8-1570-455e-ae8c-063b5578ad15,1,0,efd4e0a3-2f98-40ef-8089-c853cd588fa6,efd4e0a3-2f98-40ef-8089-c853cd588fa6,1,0,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,1,0,cb6d4979-2d70-4ceb-af08-deb2b19daf14,cb6d4979-2d70-4ceb-af08-deb2b19daf14,1,0,bf30b754-84fb-4104-b52b-a4f7df6fba12,bf30b754-84fb-4104-b52b-a4f7df6fba12,1,0,7bbd0835-b3e9-40cb-a424-670828b60bbb,7bbd0835-b3e9-40cb-a424-670828b60bbb,1,0,3e2138ea-48f9-4a60-8f22-53933bea49db,3e2138ea-48f9-4a60-8f22-53933bea49db,1,0,16bda2eb-eab8-4230-b89f-517fb943e009,16bda2eb-eab8-4230-b89f-517fb943e009,1,0,00964512-297f-4b8b-8def-8e4fc0eba991,00964512-297f-4b8b-8def-8e4fc0eba991,1,0,4185fea3-baba-4ba5-8019-9023b3011d4d,4185fea3-baba-4ba5-8019-9023b3011d4d,1,0,ea790035-92d6-445e-9fa3-08e565634d2b,ea790035-92d6-445e-9fa3-08e565634d2b,1,0,cce8900a-51eb-487d-b380-227d1b9d3943,cce8900a-51eb-487d-b380-227d1b9d3943,1,0,c043c36c-90c6-483b-bc20-7c2d85109b90,c043c36c-90c6-483b-bc20-7c2d85109b90,1,0,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,1,0,91d2d40a-c271-412c-b344-1fc98b94ba21,91d2d40a-c271-412c-b344-1fc98b94ba21,1,0,7ce47046-aee8-4809-bac9-a98930a844e1,7ce47046-aee8-4809-bac9-a98930a844e1,1,0,f480b8b9-ecec-4207-a0aa-12c5be4c2250,f480b8b9-ecec-4207-a0aa-12c5be4c2250,1,0,32717d25-6644-4903-8950-03e4c9b1a8fe,32717d25-6644-4903-8950-03e4c9b1a8fe,1,0,3644d8f3-db88-4fce-a851-39c115acfe03,3644d8f3-db88-4fce-a851-39c115acfe03,1,0,4653da74-34b2-47b9-ad88-efd761d6f1e9,4653da74-34b2-47b9-ad88-efd761d6f1e9,1,0,abf8a23d-45c3-4feb-8df2-279b709d7722,abf8a23d-45c3-4feb-8df2-279b709d7722,1,0,b0cd056f-c601-4d07-89c4-f7137b88bab6,b0cd056f-c601-4d07-89c4-f7137b88bab6,1,0,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,1,0,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,1,0,96ed4d39-3bdc-480f-af86-218f22000514,96ed4d39-3bdc-480f-af86-218f22000514,1,0,c9f72e74-22ac-4dc0-8462-0aa7819a9342,c9f72e74-22ac-4dc0-8462-0aa7819a9342,1,0,ca650484-293f-403a-b916-5ec7c3a8969e,ca650484-293f-403a-b916-5ec7c3a8969e,1,0,b71e706d-623e-4039-9bf0-24f151d861d8,b71e706d-623e-4039-9bf0-24f151d861d8,1,0,528f4823-33d8-49bd-a8fe-756a08a107c2,528f4823-33d8-49bd-a8fe-756a08a107c2,1,0,4869095b-b76e-45ca-b77d-0e74f59673f0,4869095b-b76e-45ca-b77d-0e74f59673f0,1,0,bcca2442-448b-4760-923b-cc9621ecb441,bcca2442-448b-4760-923b-cc9621ecb441,1,0,ba7657df-429a-4737-b787-19ef09fdebb2,ba7657df-429a-4737-b787-19ef09fdebb2,1,0,867d72be-f406-45a5-a511-b90459683f11,867d72be-f406-45a5-a511-b90459683f11,1,0,88b22e62-c144-401f-9635-3fb4d914772e,88b22e62-c144-401f-9635-3fb4d914772e,1,0,efeb2914-6604-403a-a11e-5cb995ab2bc9,efeb2914-6604-403a-a11e-5cb995ab2bc9,1,0,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,1,0,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,1,0,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,1,0,8525d945-08aa-4928-8dca-4e172ea94328,8525d945-08aa-4928-8dca-4e172ea94328,1,0,de506523-241a-4845-9259-37066afbf16a,de506523-241a-4845-9259-37066afbf16a,1,0,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0510206f-eef0-4a5e-aeb7-d53c26d34adb,1,0,e616e007-43e7-4740-a083-b85f5435718a,e616e007-43e7-4740-a083-b85f5435718a,1,0,82be906c-bb06-40ea-b908-54574b0b4848,82be906c-bb06-40ea-b908-54574b0b4848,1,0,727da5b1-e054-4832-8e44-f5d5e56f52e5,727da5b1-e054-4832-8e44-f5d5e56f52e5,1,0,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,1,0,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1f8cb390-2cbb-4a88-96ee-b31695b73d78,1,0,6feaad7c-9680-4341-b215-14581e2e2b37,6feaad7c-9680-4341-b215-14581e2e2b37,1,0,d5656a92-adfb-4733-830d-2b1565798b1f,d5656a92-adfb-4733-830d-2b1565798b1f,1,0,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,1,0,b0f6ea83-2849-4151-930d-692866919db3,b0f6ea83-2849-4151-930d-692866919db3,1,0,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,1,0,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,1,0,f66cb2da-3b3c-481f-823a-506f8290f619,f66cb2da-3b3c-481f-823a-506f8290f619,1,0,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,1,0,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,1,0,0bdcf045-5132-4a68-839c-a30515dc569e,0bdcf045-5132-4a68-839c-a30515dc569e,1,0,683861f9-9a5f-47db-8b03-959f839d5a3a,683861f9-9a5f-47db-8b03-959f839d5a3a,1,0,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,1,0,125be5bf-f410-451d-aa96-22fabc6a4d8a,125be5bf-f410-451d-aa96-22fabc6a4d8a,1,0,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,1,0,0a46166a-4562-4a50-b139-39dbe8a1fc84,0a46166a-4562-4a50-b139-39dbe8a1fc84,1,0,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,1,0,6ce64d65-f710-4d3f-a85f-26ce6915451e,6ce64d65-f710-4d3f-a85f-26ce6915451e,1,0,33eb9806-e34f-42a0-9825-3ff2de92c503,33eb9806-e34f-42a0-9825-3ff2de92c503,1,0,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,1,0,bcb58235-7cd7-4c15-a1eb-194ee38259e6,bcb58235-7cd7-4c15-a1eb-194ee38259e6,1,0,e19aefe7-634d-4218-8d40-75802d1691e0,e19aefe7-634d-4218-8d40-75802d1691e0,1,0,b885dbb2-6e18-46a6-929c-3d6d392343ad,b885dbb2-6e18-46a6-929c-3d6d392343ad,1,0,d31e24cf-7493-45dc-ba81-3a00618e53bc,d31e24cf-7493-45dc-ba81-3a00618e53bc,1,0,03f32b08-1b71-47cb-ba1d-965037df4d64,03f32b08-1b71-47cb-ba1d-965037df4d64,1,0,4ec26e3d-6c38-4c90-9f91-c2235f8b4154,4ec26e3d-6c38-4c90-9f91-c2235f8b4154,1,0,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,1,0,f942d212-9be0-4d80-84b6-5b63070e33e4,f942d212-9be0-4d80-84b6-5b63070e33e4,1,0,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,1,0,19a0b881-302e-4d0e-ace0-29a9d8379a48,19a0b881-302e-4d0e-ace0-29a9d8379a48,1,0,64c91eaa-084f-4801-8dbf-4e075c689c2b,64c91eaa-084f-4801-8dbf-4e075c689c2b,1,0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,1,0,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,1,0,3aa12805-823a-439b-b039-fb9940aee312,3aa12805-823a-439b-b039-fb9940aee312,1,0,87d53573-f266-4b74-94af-041ae4b6518f,87d53573-f266-4b74-94af-041ae4b6518f,1,0,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,1,0,801cf1f7-2c65-4126-a3e9-b66abfdde67a,801cf1f7-2c65-4126-a3e9-b66abfdde67a,1,0,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,1,0,29c2bc01-8838-4459-8ac2-79862aa1dbc9,29c2bc01-8838-4459-8ac2-79862aa1dbc9,1,0,ad556c33-6811-48b4-ae90-57700a4d3fd6,ad556c33-6811-48b4-ae90-57700a4d3fd6,1,0,6e0833f4-3b57-4a5f-810f-9e2a492335df,6e0833f4-3b57-4a5f-810f-9e2a492335df,1,0,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,1,0,977bc9d8-9843-4343-85af-11a3d91f9966,977bc9d8-9843-4343-85af-11a3d91f9966,1,0,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,1,0,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,1,0,a6582448-734d-4a4c-a32c-c4755ca1bc93,a6582448-734d-4a4c-a32c-c4755ca1bc93,1,0,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,1,0,53327cc4-22b0-40f9-bae7-db483f85901c,53327cc4-22b0-40f9-bae7-db483f85901c,1,0,098d904d-95c9-459e-86d0-357ba9a40191,098d904d-95c9-459e-86d0-357ba9a40191,1,0,e9ab9d00-6e42-439b-8efc-fcacf727016d,e9ab9d00-6e42-439b-8efc-fcacf727016d,1,0,2d58033f-e15d-4a91-8165-dd311025c7c4,2d58033f-e15d-4a91-8165-dd311025c7c4,1,0,49cb3a36-90b3-4154-b571-265fc5cee21e,49cb3a36-90b3-4154-b571-265fc5cee21e,1,0,10472d2c-18ca-49b0-bd9d-c750db8498c5,10472d2c-18ca-49b0-bd9d-c750db8498c5,1,0,8efe5daf-272d-4255-b5c4-66dca7463b50,8efe5daf-272d-4255-b5c4-66dca7463b50,1,0,65af25a6-f699-4c40-b13e-3b7dff3f16fe,65af25a6-f699-4c40-b13e-3b7dff3f16fe,1,0,c4d2486d-289c-4812-b223-5ccfcd7f29e3,c4d2486d-289c-4812-b223-5ccfcd7f29e3,1,0,f9229c3e-4a47-49a4-8b14-908218012ff7,f9229c3e-4a47-49a4-8b14-908218012ff7,1,0,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,7c8b9203-2808-4a78-a2b1-b7a71b4f13f6,1,0,b9743978-ba6d-4892-bb32-f24d4a47dd50,b9743978-ba6d-4892-bb32-f24d4a47dd50,1,0,c43accb9-f33d-437f-b305-0595f8fe3032,c43accb9-f33d-437f-b305-0595f8fe3032,1,0,084a398b-836e-424c-af93-22aa39d5a15a,084a398b-836e-424c-af93-22aa39d5a15a,1,0,7da57c89-af2c-445a-96f7-39250f70306f,7da57c89-af2c-445a-96f7-39250f70306f,1,0,b5b94d94-25f7-4cfa-b1e9-6009fb848763,b5b94d94-25f7-4cfa-b1e9-6009fb848763,1,0,a2accf54-5966-42e8-ab2e-e56e415963ee,a2accf54-5966-42e8-ab2e-e56e415963ee,1,0,d8eb5329-5900-4b5d-b45e-458513dddfef,d8eb5329-5900-4b5d-b45e-458513dddfef,1,0,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,1,0,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,1,0,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,1,0,eaaed107-69d4-4963-be83-74519e331715,eaaed107-69d4-4963-be83-74519e331715,1,0,38cddf96-8703-4396-8c73-47fb22828a48,38cddf96-8703-4396-8c73-47fb22828a48,1,0,2c2cb793-0177-4983-91ca-9c292c5b10f1,2c2cb793-0177-4983-91ca-9c292c5b10f1,1,0,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,1,0,221fa473-3327-44e6-a033-6fdfd2be713c,221fa473-3327-44e6-a033-6fdfd2be713c,1,0,7a5973f0-7e29-44af-8e7b-70af71f704a4,7a5973f0-7e29-44af-8e7b-70af71f704a4,1,0,2b2bf0f7-0946-4492-bba0-27f007a70e64,2b2bf0f7-0946-4492-bba0-27f007a70e64,1,0,22c9a703-5ed3-4156-8fa6-476b1c1452f1,22c9a703-5ed3-4156-8fa6-476b1c1452f1,1,0,8be10d88-8c37-4444-9c89-6cbbe9913bda,8be10d88-8c37-4444-9c89-6cbbe9913bda,1,0,27089e8e-2c75-431c-b808-5d4dcba3cdca,27089e8e-2c75-431c-b808-5d4dcba3cdca,1,0,9ab3980e-a480-4f90-a8cc-bde99d5ace35,9ab3980e-a480-4f90-a8cc-bde99d5ace35,1,0,ec928563-6e35-4b84-b477-90d2481cec1c,ec928563-6e35-4b84-b477-90d2481cec1c,1,0,5d3e9678-20fe-4128-867a-3f7addaa7831,5d3e9678-20fe-4128-867a-3f7addaa7831,1,0,bb878f73-8a0f-459a-9076-ce57fe7957dc,bb878f73-8a0f-459a-9076-ce57fe7957dc,1,0,cb1d4a41-20a9-4d76-8798-d47d8858bff1,cb1d4a41-20a9-4d76-8798-d47d8858bff1,1,0,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,1,0,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,1,0,9f4b8e36-83ff-4694-8540-b5f47b18395f,9f4b8e36-83ff-4694-8540-b5f47b18395f,1,0,b4c026eb-4271-4366-b529-1cdfe2874563,b4c026eb-4271-4366-b529-1cdfe2874563,1,0,314b0da2-24d3-48cc-8532-d36c45eb3bf8,314b0da2-24d3-48cc-8532-d36c45eb3bf8,1,0,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,1,0,4077e700-ec20-4afa-8155-bf7e516a70cb,4077e700-ec20-4afa-8155-bf7e516a70cb,1,0,5198c6db-2100-4902-82c8-85c8ea555e78,5198c6db-2100-4902-82c8-85c8ea555e78,1,0,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,1,0,f0b1e9f4-2e07-44e6-88d2-c11457135781,f0b1e9f4-2e07-44e6-88d2-c11457135781,1,0,e010c0f9-f770-4fdc-8607-50838c0262ef,e010c0f9-f770-4fdc-8607-50838c0262ef,1,0,f935399f-3554-4c08-b0a6-eba13074e1b7,f935399f-3554-4c08-b0a6-eba13074e1b7,1,0,10008125-3aeb-4912-8ad6-d92d283ea09a,10008125-3aeb-4912-8ad6-d92d283ea09a,1,0,765f9584-fefa-4695-b130-dd54c3b0d79d,765f9584-fefa-4695-b130-dd54c3b0d79d,1,0,dd050ca0-8335-4654-ab5c-7babcb4824ef,dd050ca0-8335-4654-ab5c-7babcb4824ef,1,0,706cbf55-626d-4cab-b589-a2464368f6c1,706cbf55-626d-4cab-b589-a2464368f6c1,1,0,d22a0a50-220d-459e-a23a-39730a1e67c4,d22a0a50-220d-459e-a23a-39730a1e67c4,1,0,2c1c9284-ba8b-4282-a89c-429f02ea41f6,2c1c9284-ba8b-4282-a89c-429f02ea41f6,1,0,8c241467-76f7-4161-a8a1-5da4a6576b75,8c241467-76f7-4161-a8a1-5da4a6576b75,1,0,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1d3b9eff-5d0b-437b-932f-0ec466e092b2,1,0,fd7e5257-024c-46de-9ff3-edd302fadba5,fd7e5257-024c-46de-9ff3-edd302fadba5,1,0,a4168057-d99f-4b55-b762-214f95ae3a30,a4168057-d99f-4b55-b762-214f95ae3a30,1,0,ab4fe549-1c07-42d9-b412-8b89ed115591,ab4fe549-1c07-42d9-b412-8b89ed115591,1,0,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,0335804e-efe5-4fb9-9ae9-2ddca73d77f3,1,0,b49c589d-b45d-4aff-8899-72cfe433e9a6,b49c589d-b45d-4aff-8899-72cfe433e9a6,1,0,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,f71a8d47-6a6c-4b7e-90b3-5b7a3be3ccd3,1,0,273ad3f7-c645-434d-93b0-e832134f3043,273ad3f7-c645-434d-93b0-e832134f3043,1,0,d320803b-1de4-4e66-b455-0afe39be5c41,d320803b-1de4-4e66-b455-0afe39be5c41,1,0,67e85b9a-a138-49ea-b474-04475f0f8c90,67e85b9a-a138-49ea-b474-04475f0f8c90,1,0,5d990585-02dd-4a13-8dfa-920df7d1dbb0,5d990585-02dd-4a13-8dfa-920df7d1dbb0,1,0,788a98e0-194f-466c-b4fa-bafd527aae26,788a98e0-194f-466c-b4fa-bafd527aae26,1,0,07820e9e-9d6b-4c37-909e-90dbd33e30c0,07820e9e-9d6b-4c37-909e-90dbd33e30c0,1,0,364218e0-87ba-4008-a3e3-e2351a5e04b8,364218e0-87ba-4008-a3e3-e2351a5e04b8,1,0,143f6db9-a4dc-4039-90d0-6161394a3e2f,143f6db9-a4dc-4039-90d0-6161394a3e2f,1,0,97e853dc-065f-4c6d-84cb-3d3aff367b22,97e853dc-065f-4c6d-84cb-3d3aff367b22,1,0,2f1fdf47-2627-496f-9e1f-77019abb2104,2f1fdf47-2627-496f-9e1f-77019abb2104,1,0,c996532a-8795-4136-8a40-9bb4b263277c,c996532a-8795-4136-8a40-9bb4b263277c,1,0,64c77788-fc49-4979-8163-949a891bd8b7,64c77788-fc49-4979-8163-949a891bd8b7,1,0,c39750ca-e33f-40c2-b830-119423d9a2ae,c39750ca-e33f-40c2-b830-119423d9a2ae,1,0,9372ff6b-27b6-48f3-a2a2-762e7c485766,9372ff6b-27b6-48f3-a2a2-762e7c485766,1,0,f454595a-4a3d-451b-8e8b-b17aa8314591,f454595a-4a3d-451b-8e8b-b17aa8314591,1,0,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,1,0,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,1,0,bc708da8-7fc6-4da1-8129-9ef6a86667af,bc708da8-7fc6-4da1-8129-9ef6a86667af,1,0,061842fe-4077-4d6e-aefe-de79409da730,061842fe-4077-4d6e-aefe-de79409da730,1,0,86249619-8981-4fc4-85fc-ce30e4b9d542,86249619-8981-4fc4-85fc-ce30e4b9d542,1,0,da6e4bff-9835-4b92-b62b-291a5d6c86fe,da6e4bff-9835-4b92-b62b-291a5d6c86fe,1,0,98aa8a80-29fa-4a54-8d0e-90d413d63da1,98aa8a80-29fa-4a54-8d0e-90d413d63da1,1,0,60af0c11-852e-4b45-afb7-251d75a87150,60af0c11-852e-4b45-afb7-251d75a87150,1,0,37e81463-a558-4b03-b0e4-82ac0e99c80c,37e81463-a558-4b03-b0e4-82ac0e99c80c,1,0,8be35c43-32e6-418d-b3d6-e53ef56babb7,8be35c43-32e6-418d-b3d6-e53ef56babb7,1,0,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,3e4f5fd0-af15-41ae-896e-458ce9fb7e4d,1,0,935d01e1-232b-480e-a6bf-c21c617c6348,935d01e1-232b-480e-a6bf-c21c617c6348,1,0,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,9bc7cc99-1237-4f9c-8a4e-f3ab459186ef,1,0,05c702a1-2c74-45d5-b2ee-fdd795b0945a,05c702a1-2c74-45d5-b2ee-fdd795b0945a,1,0,5ede72fd-2510-4c06-b625-be740bb04e29,5ede72fd-2510-4c06-b625-be740bb04e29,1,0,17f37228-b0cd-420d-bc82-b18dc04c03c9,17f37228-b0cd-420d-bc82-b18dc04c03c9,1,0,3f9b66ea-7db2-434d-8e3b-00df8eb11dbd,3f9b66ea-7db2-434d-8e3b-00df8eb11dbd,1,0,d43fb14b-2051-4ba5-8379-af6996e603b3,d43fb14b-2051-4ba5-8379-af6996e603b3,1,0,cfb01fef-b70d-41ac-82b9-d6d2e9644388,cfb01fef-b70d-41ac-82b9-d6d2e9644388,1,0,91dee0d3-14b5-4aa1-9058-8f949e7df923,91dee0d3-14b5-4aa1-9058-8f949e7df923,1,0,3fadaeb7-2c41-42a4-bfa8-c585602b1028,3fadaeb7-2c41-42a4-bfa8-c585602b1028,1,0,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,1,0,083c709b-ed8c-47e4-a190-421e14259e73,083c709b-ed8c-47e4-a190-421e14259e73,1,0,b98dacc7-29e1-426b-a664-0a988f18186c,b98dacc7-29e1-426b-a664-0a988f18186c,1,0,d678856d-6e7c-443f-a6e3-350bbe8af659,d678856d-6e7c-443f-a6e3-350bbe8af659,1,0,d0979762-22ce-41be-b7a4-5e9ac149d94b,d0979762-22ce-41be-b7a4-5e9ac149d94b,1,0,ae23e70c-479e-47ad-9bfa-58560a903410,ae23e70c-479e-47ad-9bfa-58560a903410,1,0,c0d83781-bbda-43f7-bf0e-5defa3d47143,c0d83781-bbda-43f7-bf0e-5defa3d47143,1,0,21fa5fdd-acbc-403b-9acb-bbf95284bd20,21fa5fdd-acbc-403b-9acb-bbf95284bd20,1,0,576a01e3-4d6d-4241-a3c4-7661ba129bcb,576a01e3-4d6d-4241-a3c4-7661ba129bcb,1,0,9f7290dd-19f4-4163-9795-fe562e84f06d,9f7290dd-19f4-4163-9795-fe562e84f06d,1,0,c3b5c81f-b787-4f63-8cba-79def0921477,c3b5c81f-b787-4f63-8cba-79def0921477,1,0,1f0cb3d4-1344-451b-a257-be3cd854acfd,1f0cb3d4-1344-451b-a257-be3cd854acfd,1,0,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0131fe59-ce47-48b7-8f7e-1544bf0fa031,1,0,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,1,0,372150e2-526e-4424-8c54-e4b16bdd25b5,372150e2-526e-4424-8c54-e4b16bdd25b5,1,0,2f9c347d-ee82-49f2-a5eb-97f55374856f,2f9c347d-ee82-49f2-a5eb-97f55374856f,1,0,752dc569-cf84-42d7-911d-49d455f7214e,752dc569-cf84-42d7-911d-49d455f7214e,1,0,fecab2b9-27e1-44d6-9082-79c3569b7477,fecab2b9-27e1-44d6-9082-79c3569b7477,1,0,07ae092f-8517-47b7-b54c-5dbcb6506929,07ae092f-8517-47b7-b54c-5dbcb6506929,1,0,db4c25bb-d199-43ec-833d-82972de04a41,db4c25bb-d199-43ec-833d-82972de04a41,1,0,43d19685-0794-41f2-9171-bf565133718d,43d19685-0794-41f2-9171-bf565133718d,1,0,b68c15c4-4966-4f13-8912-2d479b65089a,b68c15c4-4966-4f13-8912-2d479b65089a,1,0,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,1,0,a89ee622-6942-411a-8566-f03d139c9e5b,a89ee622-6942-411a-8566-f03d139c9e5b,1,0,f87e3935-dae1-4192-b6a7-05e3c700c590,f87e3935-dae1-4192-b6a7-05e3c700c590,1,0,ee635706-6ee2-4956-8d58-a235f64687f6,ee635706-6ee2-4956-8d58-a235f64687f6,1,0,a5a40ca7-d665-420b-a516-1355019d6901,a5a40ca7-d665-420b-a516-1355019d6901,1,0,198ea989-5001-47ac-86b8-aa2585a5f7d7,198ea989-5001-47ac-86b8-aa2585a5f7d7,1,0,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,4abe448b-a225-4ac2-8cc9-c3c6c0e9b1ac,1,0,fb84c5f7-11da-4b17-979e-41e27a74e789,fb84c5f7-11da-4b17-979e-41e27a74e789,1,0,adf9304c-ccf8-492e-95b1-0754764586a2,adf9304c-ccf8-492e-95b1-0754764586a2,1,0,fd175112-ec8f-4088-9b21-d8135056f0c5,fd175112-ec8f-4088-9b21-d8135056f0c5,1,0,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,1,0,df76a1b7-312a-4e77-bac1-79befadb4495,df76a1b7-312a-4e77-bac1-79befadb4495,1,0,ab39fad8-1039-491e-982a-c49637770ec0,ab39fad8-1039-491e-982a-c49637770ec0,1,0,7d93a6ba-3ca7-45ab-a540-743c79587535,7d93a6ba-3ca7-45ab-a540-743c79587535,1,0,76b58810-0527-4dfc-8858-bac68e7e65f3,76b58810-0527-4dfc-8858-bac68e7e65f3,1,0,aba97fd9-f05e-45cd-8404-ed702070e17a,aba97fd9-f05e-45cd-8404-ed702070e17a,1,0,f5c415cd-429b-469f-9332-c43ab5d1c8d6,f5c415cd-429b-469f-9332-c43ab5d1c8d6,1,0,6de34ed8-5d6c-4bb6-af94-328e692b862e,6de34ed8-5d6c-4bb6-af94-328e692b862e,1,0,e705bde3-45c3-4ffd-a767-0320c6cc8b91,e705bde3-45c3-4ffd-a767-0320c6cc8b91,1,0,504280a1-a451-4547-ae71-e217f8fdf8f6,504280a1-a451-4547-ae71-e217f8fdf8f6,1,0,b071a9fe-0e9f-4ded-8dab-b1388fd12897,b071a9fe-0e9f-4ded-8dab-b1388fd12897,1,0,a2accd5e-e6f5-4d5f-8243-51aadfa88b00,a2accd5e-e6f5-4d5f-8243-51aadfa88b00,1,0,458e9c6b-b828-404b-be5a-c6c0aeea34c9,458e9c6b-b828-404b-be5a-c6c0aeea34c9,1,0,7262eb4d-2d2d-454c-beaa-974645813af7,7262eb4d-2d2d-454c-beaa-974645813af7,1,0,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,1,0,49221b2f-aae2-4bee-9a1a-18263fc74244,49221b2f-aae2-4bee-9a1a-18263fc74244,1,0,da0cd264-da2f-4044-af28-c91d2efe1d5c,da0cd264-da2f-4044-af28-c91d2efe1d5c,1,0,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,1,0,fad26b16-8638-496b-bd12-381fc6f5b71f,fad26b16-8638-496b-bd12-381fc6f5b71f,1,0,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,1,0,324a56c9-02d9-4177-af84-a817b8c41169,324a56c9-02d9-4177-af84-a817b8c41169,1,0,64ed8c1a-6446-4f0d-a2ef-c599e84c4909,64ed8c1a-6446-4f0d-a2ef-c599e84c4909,1,0,52fc85fb-309b-4739-bbd3-c3966657e973,52fc85fb-309b-4739-bbd3-c3966657e973,1,0,87081ab5-bdd5-4daa-88ef-8a2cba8c7d53,87081ab5-bdd5-4daa-88ef-8a2cba8c7d53,1,0,be3cfba8-e6f6-4202-ab0f-96c00fbf7462,be3cfba8-e6f6-4202-ab0f-96c00fbf7462,1,0,64ef1b5c-ec04-45eb-9998-bc573f4038d7,64ef1b5c-ec04-45eb-9998-bc573f4038d7,1,0,4fde5159-8f21-4151-8dbd-b2cd376d9392,4fde5159-8f21-4151-8dbd-b2cd376d9392,1,0,3ea799a6-6642-4388-b0a3-c2962e71ff51,3ea799a6-6642-4388-b0a3-c2962e71ff51,1,0,1e44abfe-c173-4802-b535-96849d384983,1e44abfe-c173-4802-b535-96849d384983,1,0,2751a509-037b-49aa-9ca8-e87057d6d82c,2751a509-037b-49aa-9ca8-e87057d6d82c,1,0,35f62549-eb6a-4284-a6e3-406b0d9df0cf,35f62549-eb6a-4284-a6e3-406b0d9df0cf,1,0,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,1,0,fd66995b-ee76-41d3-983f-33d84bdcbbd4,fd66995b-ee76-41d3-983f-33d84bdcbbd4,1,0,73e97918-b34e-4ad2-8591-4c219eb92f2c,73e97918-b34e-4ad2-8591-4c219eb92f2c,1,0,445cf7eb-35d0-48f8-9579-c2ec574ef324,445cf7eb-35d0-48f8-9579-c2ec574ef324,1,0,1025657e-afd2-4c7b-96d5-ccbedaca4619,1025657e-afd2-4c7b-96d5-ccbedaca4619,1,0,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,1,0,e754ad5c-cf3c-4198-af81-128475924cb0,e754ad5c-cf3c-4198-af81-128475924cb0,1,0,ed65d504-b210-4014-85ec-275ad633ef04,ed65d504-b210-4014-85ec-275ad633ef04,1,0,dc31edb1-273e-4b1a-8e69-32393479ff36,dc31edb1-273e-4b1a-8e69-32393479ff36,1,0,3ab0649b-239f-4466-b897-73c0ab628927,3ab0649b-239f-4466-b897-73c0ab628927,1,0,4c697110-8941-4d6d-ba03-f2b9e96ff82e,4c697110-8941-4d6d-ba03-f2b9e96ff82e,1,0,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,7ea4112d-fc41-4f1e-bd22-f04adeac1d8f,1,0,b172631b-da0d-42f4-ae6b-ae122a46cced,b172631b-da0d-42f4-ae6b-ae122a46cced,1,0,1a25e744-37ae-46ca-a328-ff8eced21a82,1a25e744-37ae-46ca-a328-ff8eced21a82,1,0,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,dddabe54-a93b-4e4b-acbb-cc522e4d7c28,1,0,46169f0b-8514-40a1-9d27-8489cab72503,46169f0b-8514-40a1-9d27-8489cab72503,1,0,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,1,0,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,1,0,c90243af-582c-4f5a-88e7-e0cbc0555fcb,c90243af-582c-4f5a-88e7-e0cbc0555fcb,1,0,14bf4066-15cb-4165-b854-45443ee27da1,14bf4066-15cb-4165-b854-45443ee27da1,1,0,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,a0861dd3-ced5-485e-8719-0ad0bc3adc0d,1,0,5a94a307-3f54-4753-8ef5-ce9f88417827,5a94a307-3f54-4753-8ef5-ce9f88417827,1,0,0f09b6b8-72ac-4461-96c4-683be403e2ff,0f09b6b8-72ac-4461-96c4-683be403e2ff,1,0,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,b73d0f07-9c6e-41b1-9acc-8e83dacd7528,1,0,19d1d74a-de5f-475a-896c-a32b7d28f918,19d1d74a-de5f-475a-896c-a32b7d28f918,1,0,4427cab9-4eea-4415-98ef-6021a447c60c,4427cab9-4eea-4415-98ef-6021a447c60c,1,0,fe46b4da-d865-468f-badd-83644bf88faa,fe46b4da-d865-468f-badd-83644bf88faa,1,0,2851c9d4-4366-4488-926d-a7fcd3b1548c,2851c9d4-4366-4488-926d-a7fcd3b1548c,1,0,31116aa2-cfbc-48e8-886b-45c1c17508fd,31116aa2-cfbc-48e8-886b-45c1c17508fd,1,0,6aa819d3-c56d-4561-a2e4-a1188ab1295a,6aa819d3-c56d-4561-a2e4-a1188ab1295a,1,0,2ddf344d-7065-40d5-9306-23870d8fc04a,2ddf344d-7065-40d5-9306-23870d8fc04a,1,0,c630ab2d-0a20-4136-88b6-220b2cad6a71,c630ab2d-0a20-4136-88b6-220b2cad6a71,1,0,00cd1dea-bc54-475c-956d-dc5221104932,00cd1dea-bc54-475c-956d-dc5221104932,1,0,c343495b-5947-4fe7-a94b-d1f2b2455b4f,c343495b-5947-4fe7-a94b-d1f2b2455b4f,1,0,fbce7316-bb9a-40c1-af3c-352f4b559ab6,fbce7316-bb9a-40c1-af3c-352f4b559ab6,1,0,a3721457-b33b-4742-b6e1-531af10969d1,a3721457-b33b-4742-b6e1-531af10969d1,1,0,9619a603-e578-4f30-bcc6-adfddfa915c0,9619a603-e578-4f30-bcc6-adfddfa915c0,1,0,3807f865-dd2c-44f7-9238-3db191f0a186,3807f865-dd2c-44f7-9238-3db191f0a186,1,0,4a55351b-77e2-4c7c-a7d7-aac213d3c2a7,4a55351b-77e2-4c7c-a7d7-aac213d3c2a7,1,0,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,f79ac41b-6ab2-4afc-aa98-b70b72d78bb4,1,0,2c5a56d3-386e-45df-adc2-4471f52f9bdc,2c5a56d3-386e-45df-adc2-4471f52f9bdc,1,0,8f184df5-bfe8-4df3-bc7c-18218cef7650,8f184df5-bfe8-4df3-bc7c-18218cef7650,1,0,387e273a-889f-454b-8b43-feaa12025fde,387e273a-889f-454b-8b43-feaa12025fde,1,0,22474ca3-565b-4b67-a5b4-b0b959306d10,22474ca3-565b-4b67-a5b4-b0b959306d10,1,0,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1,0,078d1e8f-6d27-4761-9532-b1e7a60e4c13,078d1e8f-6d27-4761-9532-b1e7a60e4c13,1,0,4262193c-58ad-47c6-8088-735d8cd037ea,4262193c-58ad-47c6-8088-735d8cd037ea,1,0,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,1,0,de6d1aad-39eb-46ce-87aa-d29812bb37bf,de6d1aad-39eb-46ce-87aa-d29812bb37bf,1,0,4ad859ec-cc75-4bac-9e89-397798450e48,4ad859ec-cc75-4bac-9e89-397798450e48,1,0,d93ab94c-0f55-4b80-b226-41b44c73b3ea,d93ab94c-0f55-4b80-b226-41b44c73b3ea,1,0,94cbed80-5a35-471f-b354-439a11629210,94cbed80-5a35-471f-b354-439a11629210,1,0,1162cc0a-42e5-47cb-9507-68459579f110,1162cc0a-42e5-47cb-9507-68459579f110,1,0,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,1,0,bb49dc80-4934-4f44-8f27-9a363dca8dc4,bb49dc80-4934-4f44-8f27-9a363dca8dc4,1,0,7338e497-03a7-4ed4-85a2-ca802c065a9f,7338e497-03a7-4ed4-85a2-ca802c065a9f,1,0,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,1,0,5249687b-9ff4-46f5-be15-dbb5d5047fd1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,1,0,d33df51c-3dcd-496c-90f2-7ee05582bdf7,d33df51c-3dcd-496c-90f2-7ee05582bdf7,1,0,24b39ebd-2424-4939-8e3e-d09eb674d409,24b39ebd-2424-4939-8e3e-d09eb674d409,1,0,08c751bb-9e57-4536-901e-bb316c8e96d7,08c751bb-9e57-4536-901e-bb316c8e96d7,1,0,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,1,0,034cdcef-08e5-4751-9885-400aa69e0b94,034cdcef-08e5-4751-9885-400aa69e0b94,1,0,3e44d463-f253-4a64-8d68-631fcb66935c,3e44d463-f253-4a64-8d68-631fcb66935c,1,0,653d6483-029b-4453-a7d0-3a3c6d9d0b05,653d6483-029b-4453-a7d0-3a3c6d9d0b05,1,0,ac507771-50bd-4f8b-b72f-5954562c9131,ac507771-50bd-4f8b-b72f-5954562c9131,1,0,efefebea-2032-4006-b9ca-50a23b7da1ef,efefebea-2032-4006-b9ca-50a23b7da1ef,1,0,4c794d37-3352-4acb-a939-5e90fb682db8,4c794d37-3352-4acb-a939-5e90fb682db8,1,0,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,1,0,008f5068-da9c-4dac-9c0a-a50366d27cbb,008f5068-da9c-4dac-9c0a-a50366d27cbb,1,0,950b3ee3-070f-4946-8b9b-0aa2058de986,950b3ee3-070f-4946-8b9b-0aa2058de986,1,0,bd04a870-0943-4bdb-9e30-50a69daa8a13,bd04a870-0943-4bdb-9e30-50a69daa8a13,1,0,573c2153-7069-4589-8a2a-4517edca877d,573c2153-7069-4589-8a2a-4517edca877d,1,0,0a2f03c1-87d7-4589-9c47-8dd67faa1759,0a2f03c1-87d7-4589-9c47-8dd67faa1759,1,0,d1475ede-879c-4085-9980-2edaaf0eb0e9,d1475ede-879c-4085-9980-2edaaf0eb0e9,1,0,54eac28f-da81-4939-b2f9-924d3c215de5,54eac28f-da81-4939-b2f9-924d3c215de5,1,0,20d34659-1bde-4af0-be2c-da922e4ace6e,20d34659-1bde-4af0-be2c-da922e4ace6e,1,0,dec45aee-a4a8-473c-904e-15d5ff31efc3,dec45aee-a4a8-473c-904e-15d5ff31efc3,1,0,8b9318e5-c6ce-4253-9759-8ddd42468775,8b9318e5-c6ce-4253-9759-8ddd42468775,1,0,31cac1e9-eb16-489c-9322-30d1e27a80b3,31cac1e9-eb16-489c-9322-30d1e27a80b3,1,0,0d100e33-7941-41c1-962d-7672c874e9c5,0d100e33-7941-41c1-962d-7672c874e9c5,1,0,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,c5ac53c9-c9b2-4b90-a21e-10f1daa756c5,1,0,6e61d717-de36-4dce-8af9-b6c14ed76acb,6e61d717-de36-4dce-8af9-b6c14ed76acb,1,0,474518fe-9cb5-4a12-9388-bc7a64511617,474518fe-9cb5-4a12-9388-bc7a64511617,1,0,64337614-b1c9-4931-b576-448721fa4602,64337614-b1c9-4931-b576-448721fa4602,1,0,1d73b59c-0594-4ed3-b584-cf1261941e1d,1d73b59c-0594-4ed3-b584-cf1261941e1d,1,0,8ff2547f-d596-4fa1-9e12-079e1cc4c057,8ff2547f-d596-4fa1-9e12-079e1cc4c057,1,0,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1,0,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,1,0,05507f2b-eed8-4da4-8efc-77d9d8e2daca,05507f2b-eed8-4da4-8efc-77d9d8e2daca,1,0,0440ed06-3f42-48a8-9431-fd608920b577,0440ed06-3f42-48a8-9431-fd608920b577,1,0,37be75c9-bf1a-437a-ab05-f9e3aac6f440,37be75c9-bf1a-437a-ab05-f9e3aac6f440,1,0,b85b3a58-95e4-4698-b1ae-037901ecc1b1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,1,0,b77d748a-d180-432d-91c3-774e6ccf7efa,b77d748a-d180-432d-91c3-774e6ccf7efa,1,0,e5b9c1b0-4690-442c-b160-e6c587e42e57,e5b9c1b0-4690-442c-b160-e6c587e42e57,1,0,e3adb576-6b33-475b-976b-7a6783de3184,e3adb576-6b33-475b-976b-7a6783de3184,1,0,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,1,0,78f5a205-dffb-4009-897a-e8f36372f33c,78f5a205-dffb-4009-897a-e8f36372f33c,1,0,f7597041-f182-42fb-803a-2521c70d627d,f7597041-f182-42fb-803a-2521c70d627d,1,0,ce988b8a-d0c1-400a-9466-aa757501bb58,ce988b8a-d0c1-400a-9466-aa757501bb58,1,0,ab98d665-8da8-406e-9e0e-3e130ab393ef,ab98d665-8da8-406e-9e0e-3e130ab393ef,1,0,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,1,0,ea8beea1-7d80-4613-b2f9-79ee612e977a,ea8beea1-7d80-4613-b2f9-79ee612e977a,1,0,afd62a32-fdbb-429a-9a64-89c61a07e018,afd62a32-fdbb-429a-9a64-89c61a07e018,1,0,027cef43-99bd-48d3-a1a3-2102ac003742,027cef43-99bd-48d3-a1a3-2102ac003742,1,0,00197ea9-de76-4e2a-97bc-93e44053e35e,00197ea9-de76-4e2a-97bc-93e44053e35e,1,0,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,540a47b8-f6d4-4531-ac87-3f7cfbef4c8c,1,0,a51f7c6f-2631-4d23-becc-c0e8b711fddd,a51f7c6f-2631-4d23-becc-c0e8b711fddd,1,0,37806357-d92c-4bea-a5ef-77f138578fda,37806357-d92c-4bea-a5ef-77f138578fda,1,0,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,91b100e6-fbbe-4bb0-8d51-d12595a2a3e8,1,0,0a880538-f97f-448e-a4a9-82b0194dbe28,0a880538-f97f-448e-a4a9-82b0194dbe28,1,0,179868b7-d342-4df0-9386-c114d75faf3a,179868b7-d342-4df0-9386-c114d75faf3a,1,0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,bbc4cc8c-31c2-4fcf-b86c-9ec65b2772b0,1,0,929e9199-dfd5-497d-ad77-6638d20c7336,929e9199-dfd5-497d-ad77-6638d20c7336,1,0,4d1546ee-30ff-4cf7-afd3-60b565e3cb53,4d1546ee-30ff-4cf7-afd3-60b565e3cb53,1,0,aaf51715-f468-4856-b9ae-fd66bc143633,aaf51715-f468-4856-b9ae-fd66bc143633,1,0,e9650eea-d35a-4abc-977c-fb9b2abba0e5,e9650eea-d35a-4abc-977c-fb9b2abba0e5,1,0,b00626a3-5438-40c4-8ca9-5609e9dfe476,b00626a3-5438-40c4-8ca9-5609e9dfe476,1,0,b537f309-f957-4804-9f0f-03a71aedf694,b537f309-f957-4804-9f0f-03a71aedf694,1,0,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,4d72bd30-8d60-4f84-9ad8-83489d9cb3fb,1,0,7e4afed8-5c56-4765-bcd0-a40e6121ba22,7e4afed8-5c56-4765-bcd0-a40e6121ba22,1,0,155660a1-8a63-4562-a715-d75a8af7176b,155660a1-8a63-4562-a715-d75a8af7176b,1,0,878fe826-fa99-44ad-9891-5eada9744017,878fe826-fa99-44ad-9891-5eada9744017,1,0,0d61712a-dfaf-46f1-b728-62993dd94fbe,0d61712a-dfaf-46f1-b728-62993dd94fbe,1,0,3a6cf496-09b9-4947-9df5-06d23b474558,3a6cf496-09b9-4947-9df5-06d23b474558,1,0,625b498a-33d1-4162-9525-fb7790cbb6a8,625b498a-33d1-4162-9525-fb7790cbb6a8,1,0,28223f7b-d15a-4f12-b57c-1f6d08a902f9,28223f7b-d15a-4f12-b57c-1f6d08a902f9,1,0,dd9eb5b7-5aed-4e51-9939-9ff14492d240,dd9eb5b7-5aed-4e51-9939-9ff14492d240,1,0,b2a14899-d589-4990-b85e-7bffb427e8af,b2a14899-d589-4990-b85e-7bffb427e8af,1,0,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0981d114-05bd-4ee1-a8fd-398fa6620d0b,1,0,3210ba40-382e-4917-ad0f-9bd88d23dc25,3210ba40-382e-4917-ad0f-9bd88d23dc25,1,0,835e3ead-d01f-410b-937a-902dd5e66aec,835e3ead-d01f-410b-937a-902dd5e66aec,1,0,40141982-d1d6-416f-844e-19143a407ff9,40141982-d1d6-416f-844e-19143a407ff9,1,0,f5c4d4ad-dda6-4dc3-b112-61f776006f3c,f5c4d4ad-dda6-4dc3-b112-61f776006f3c,1,0,466d9fd7-188e-4f3b-a673-35db9075d537,466d9fd7-188e-4f3b-a673-35db9075d537,1,0,1c2e2c7d-c9d2-46a6-81f9-30078ca511c7,1c2e2c7d-c9d2-46a6-81f9-30078ca511c7,1,0,09d3717a-d6f9-42fd-ae9e-df5658fa3981,09d3717a-d6f9-42fd-ae9e-df5658fa3981,1,0,9b26aa5f-1e77-4261-adf6-6f2f24f5af33,9b26aa5f-1e77-4261-adf6-6f2f24f5af33,1,0,b6b5e6c1-3967-4c2f-b8bc-0acc96afe240,b6b5e6c1-3967-4c2f-b8bc-0acc96afe240,1,0,8819399f-4803-413c-ad5e-7fa2c8878e5f,8819399f-4803-413c-ad5e-7fa2c8878e5f,1,0,99ff834a-f030-4af3-9b7d-f92a03f7c6f4,99ff834a-f030-4af3-9b7d-f92a03f7c6f4,1,0,afea5f32-22ff-4940-8156-3ec8b9c7bbb9,afea5f32-22ff-4940-8156-3ec8b9c7bbb9,1,0,fa01c28c-44d1-4fa9-b167-73d6cecb7730,fa01c28c-44d1-4fa9-b167-73d6cecb7730,1,0,d82c675e-7d38-417c-9cfc-6af0e86addfd,d82c675e-7d38-417c-9cfc-6af0e86addfd,1,0,319c4428-9463-4aa4-a87a-2749c49f4069,319c4428-9463-4aa4-a87a-2749c49f4069,1,0,497deeb7-0630-4f72-bcdb-ebacf8963d79,497deeb7-0630-4f72-bcdb-ebacf8963d79,1,0,ef471953-7c99-40f9-a31d-f50ed8ba3fc5,ef471953-7c99-40f9-a31d-f50ed8ba3fc5,1,0,98393093-7ba6-4b4d-86be-ee5826cd8cd5,98393093-7ba6-4b4d-86be-ee5826cd8cd5,1,0,87de486d-3f35-4432-a7cd-9d3832db63cf,87de486d-3f35-4432-a7cd-9d3832db63cf,1,0,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,1,0,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,1,0,bb7ce04a-8143-4c0b-a196-1b57f1640142,bb7ce04a-8143-4c0b-a196-1b57f1640142,1,0,4872f12c-705c-4dd3-802f-d27496a0d634,4872f12c-705c-4dd3-802f-d27496a0d634,1,0,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,3bacfd93-dfc7-4154-9d3f-b61ddc5c6721,1,0,fc65918a-2ad1-47b1-980d-5afe63579964,fc65918a-2ad1-47b1-980d-5afe63579964,1,0,7ece6efe-16a1-4294-8c28-3fa6427ba9f0,7ece6efe-16a1-4294-8c28-3fa6427ba9f0,1,0,61094d92-b1e6-45b9-9258-38a7bb1d6469,61094d92-b1e6-45b9-9258-38a7bb1d6469,1,0,4791b5d4-3568-4420-8c25-89ecce7c6353,4791b5d4-3568-4420-8c25-89ecce7c6353,1,0,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,1,0,f9ada91a-e673-4821-9bce-cb0dd75ca28b,f9ada91a-e673-4821-9bce-cb0dd75ca28b,1,0,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,1,0,90ce635a-0277-4056-980d-d1a16d91cb30,90ce635a-0277-4056-980d-d1a16d91cb30,1,0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,1,0,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1,0,00605607-03ab-43fc-ba08-9fc32f582d0a,00605607-03ab-43fc-ba08-9fc32f582d0a,1,0,5ab0a910-74ab-4af0-b5a3-40845a789fde,5ab0a910-74ab-4af0-b5a3-40845a789fde,1,0,bb659006-c11e-4427-8d86-229ba43ef679,bb659006-c11e-4427-8d86-229ba43ef679,1,0,766208a3-2780-427b-a7d3-93abe99d236b,766208a3-2780-427b-a7d3-93abe99d236b,1,0,63ce4c3c-5bad-409c-904f-18f34cf1da78,63ce4c3c-5bad-409c-904f-18f34cf1da78,1,0,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,1,0,26ac22f9-0bbb-4671-b446-626e345e2461,26ac22f9-0bbb-4671-b446-626e345e2461,1,0,0d63ee6d-e17f-4a86-b384-adf9793f3331,0d63ee6d-e17f-4a86-b384-adf9793f3331,1,0,f152945b-2a7b-449e-a915-176166af7bac,f152945b-2a7b-449e-a915-176166af7bac,1,0,77f5d86a-7fae-4490-9740-0e31102dab5c,77f5d86a-7fae-4490-9740-0e31102dab5c,1,0,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,1,0,24be43ec-d39e-46aa-9c11-2536b835e515,24be43ec-d39e-46aa-9c11-2536b835e515,1,0,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,1,0,df9af3ee-6a69-4a03-8ff5-0735e9a38013,df9af3ee-6a69-4a03-8ff5-0735e9a38013,1,0,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1,0,7743fe24-b941-4dad-bc76-05fb6b26b1d7,7743fe24-b941-4dad-bc76-05fb6b26b1d7,1,0,5bf2da0d-f318-4036-9234-8a3a6eca88b2,5bf2da0d-f318-4036-9234-8a3a6eca88b2,1,0,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,1,0,c3634571-6fe5-45ab-9362-161305eef661,c3634571-6fe5-45ab-9362-161305eef661,1,0,ec11342f-594f-416f-a10f-bd1bfa695c08,ec11342f-594f-416f-a10f-bd1bfa695c08,1,0,31c3ac44-204e-43fd-bca3-fd18fa091c58,31c3ac44-204e-43fd-bca3-fd18fa091c58,1,0,74f03c35-5da0-406e-a938-e8e5d49975ef,74f03c35-5da0-406e-a938-e8e5d49975ef,1,0,c9ab3890-6d16-431f-ab2b-b5058e6202a4,c9ab3890-6d16-431f-ab2b-b5058e6202a4,1,0,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,5ee9eed7-3c6c-4264-ab9a-6f24f9c80598,1,0,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,3c33adc7-abea-4e0f-9e5d-d8f10abb63df,1,0,4090c6f7-1d25-4b17-9baa-18daa0640b0f,4090c6f7-1d25-4b17-9baa-18daa0640b0f,1,0,26125e58-dfc8-4bbb-a3a4-80616471746e,26125e58-dfc8-4bbb-a3a4-80616471746e,1,0,b1c699cd-efdc-461c-ad37-10bfd4bc9674,b1c699cd-efdc-461c-ad37-10bfd4bc9674,1,0,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,6add1920-5073-4b1e-b7e0-13bf1e65e4c3,1,0,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,f12c946c-98e4-4da6-8a88-c555e9dc3bdd,1,0,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,ec5718b7-1c4d-4bdc-9426-40a339bb29cf,1,0,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,1,0,96661303-1286-4f84-93b7-0e6da2bd7893,96661303-1286-4f84-93b7-0e6da2bd7893,1,0,68076431-36e6-46dc-92cb-e0d8e605bf66,68076431-36e6-46dc-92cb-e0d8e605bf66,1,0,239fa55a-6572-4e5c-9918-c2e14063c76d,239fa55a-6572-4e5c-9918-c2e14063c76d,1,0,8211a1b6-c3b1-466b-8d11-22603fb50c7a,8211a1b6-c3b1-466b-8d11-22603fb50c7a,1,0,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,1,0,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,1,0,a83cb338-5707-42c9-9e88-11f6c68fcc32,a83cb338-5707-42c9-9e88-11f6c68fcc32,1,0,36b15776-5211-4afa-9b6c-c042121218c0,36b15776-5211-4afa-9b6c-c042121218c0,1,0,422a0e10-361f-46ba-b92e-3088d81e12a4,422a0e10-361f-46ba-b92e-3088d81e12a4,1,0,f37b7b25-abd2-4e19-9712-78aafceb4f43,f37b7b25-abd2-4e19-9712-78aafceb4f43,1,0,7cd4c6ea-5795-4bea-a159-1e66650c42fe,7cd4c6ea-5795-4bea-a159-1e66650c42fe,1,0,091fcffa-da7e-4375-bf0b-11cc4950b5ad,091fcffa-da7e-4375-bf0b-11cc4950b5ad,1,0,57e91491-73b6-43f7-b7f8-26efec56ce9e,57e91491-73b6-43f7-b7f8-26efec56ce9e,1,0,f93741c9-ab94-464b-b0d4-4af99c9f92d5,f93741c9-ab94-464b-b0d4-4af99c9f92d5,1,0,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,1,0,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,1,0,c59fd3f8-c734-49d3-90ba-e608a22ac981,c59fd3f8-c734-49d3-90ba-e608a22ac981,1,0,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,1,0,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,1,0,475f76ea-f494-41f1-9b65-f39907e5a427,475f76ea-f494-41f1-9b65-f39907e5a427,1,0,986280d1-41bb-4b15-a5ae-516d6a04c1f4,986280d1-41bb-4b15-a5ae-516d6a04c1f4,1,0,43bfd29a-d254-4c33-8639-200b483578c1,43bfd29a-d254-4c33-8639-200b483578c1,1,0,6a274167-7f80-4613-9890-259ffd8ccfc4,6a274167-7f80-4613-9890-259ffd8ccfc4,1,0,00696255-ea14-4fee-8633-0962f3c441d1,00696255-ea14-4fee-8633-0962f3c441d1,1,0,4e90e1ab-b1ec-4795-ad45-1db151a5492c,4e90e1ab-b1ec-4795-ad45-1db151a5492c,1,0,91791e56-ca80-4d90-b8a8-16145f6a9721,91791e56-ca80-4d90-b8a8-16145f6a9721,1,0,b242c6a2-5ac9-4edb-b5dd-24eda8162151,b242c6a2-5ac9-4edb-b5dd-24eda8162151,1,0,8d080f3c-06ed-48bf-9709-eea73d676741,8d080f3c-06ed-48bf-9709-eea73d676741,1,0,57b31a5d-9fdc-43d2-ae81-67157822c4b6,57b31a5d-9fdc-43d2-ae81-67157822c4b6,1,0,d4e2da66-9a70-459f-a873-cb4ad71d17b2,d4e2da66-9a70-459f-a873-cb4ad71d17b2,1,0,a84a91d2-d326-4bf4-82e6-d573ee35d090,a84a91d2-d326-4bf4-82e6-d573ee35d090,1,0,fef27478-ddfd-4ad9-8161-148761f29698,fef27478-ddfd-4ad9-8161-148761f29698,1,0,39cbda23-db3f-4ddd-8981-8540247406db,39cbda23-db3f-4ddd-8981-8540247406db,1,0,c8a18d99-62ff-45a4-acb5-48e3310c1b53,c8a18d99-62ff-45a4-acb5-48e3310c1b53,1,0,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,1,0,3500c6fa-813a-49dd-a4bf-163500db5b7f,3500c6fa-813a-49dd-a4bf-163500db5b7f,1,0,1d02493a-dd89-4a51-b75e-9c49f9818b95,1d02493a-dd89-4a51-b75e-9c49f9818b95,1,0,2845c5d1-e836-4499-bcae-f3c8fdae75ee,2845c5d1-e836-4499-bcae-f3c8fdae75ee,1,0,fe4e8e4e-9471-4583-b9b3-576007db08ee,fe4e8e4e-9471-4583-b9b3-576007db08ee,1,0,49deaaa8-6d50-4b25-8153-6712d88fb0fb,49deaaa8-6d50-4b25-8153-6712d88fb0fb,1,0,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1,0,46a06de8-06fd-4b49-835f-4f24b832b3c4,46a06de8-06fd-4b49-835f-4f24b832b3c4,1,0,3845a567-4375-4c3a-af61-5b82674060ab,3845a567-4375-4c3a-af61-5b82674060ab,1,0,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,1,0,a835a3a7-989b-4247-b836-d23bba2f391a,a835a3a7-989b-4247-b836-d23bba2f391a,1,0,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,1,0,9b149c20-9328-4e2d-a34b-95c883ae4dcc,9b149c20-9328-4e2d-a34b-95c883ae4dcc,1,0,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,dd6fdc0d-49bb-4fa1-aa17-bd9dc38a0992,1,0,f8dbf226-ea56-4b15-baf1-a41fceba2a32,f8dbf226-ea56-4b15-baf1-a41fceba2a32,1,0,464b0955-c635-488c-8d30-004031f14fcc,464b0955-c635-488c-8d30-004031f14fcc,1,0,fcaecd43-b938-4680-93be-963db5218f35,fcaecd43-b938-4680-93be-963db5218f35,1,0,63415525-46a2-4d70-bdab-665945a9185c,63415525-46a2-4d70-bdab-665945a9185c,1,0,27e37fde-daf0-47fa-865c-3cd86151f5be,27e37fde-daf0-47fa-865c-3cd86151f5be,1,0,b3b63074-984a-48d2-ba5b-d69dd0b8067e,b3b63074-984a-48d2-ba5b-d69dd0b8067e,1,0,fc4a9f03-c81f-4201-814c-c6d5a5029168,fc4a9f03-c81f-4201-814c-c6d5a5029168,1,0,abba612c-137a-4dff-89f3-445945c30859,abba612c-137a-4dff-89f3-445945c30859,1,0,c4753515-a483-453e-a48b-b12d8ef48fd9,c4753515-a483-453e-a48b-b12d8ef48fd9,1,0,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,1,0,98c3bc52-2351-460c-8b8e-0d3f45ca3131,98c3bc52-2351-460c-8b8e-0d3f45ca3131,1,0,d1ade16c-bd56-46e5-874f-3117c5653192,d1ade16c-bd56-46e5-874f-3117c5653192,1,0,339398c0-6407-483c-82f7-266ef08b8657,339398c0-6407-483c-82f7-266ef08b8657,1,0,4f0a8f8c-68cb-4afe-b487-64e7ceeef9ab,4f0a8f8c-68cb-4afe-b487-64e7ceeef9ab,1,0,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,1,0,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,1,0,29645810-44aa-402c-9561-7819d6f4a7ab,29645810-44aa-402c-9561-7819d6f4a7ab,1,0,46bf4911-5200-44ac-9b4d-eb0089c12e34,46bf4911-5200-44ac-9b4d-eb0089c12e34,1,0,6e1685bd-7269-401c-b36e-def6a36b41d5,6e1685bd-7269-401c-b36e-def6a36b41d5,1,0,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,1,0,e03b6592-b597-4795-a78e-775d4f2258db,e03b6592-b597-4795-a78e-775d4f2258db,1,0,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,1,0,3b207d5f-6584-4cf2-9173-20235484f9f4,3b207d5f-6584-4cf2-9173-20235484f9f4,1,0,878d9efe-b0e7-487f-b8f7-83470c131e09,878d9efe-b0e7-487f-b8f7-83470c131e09,1,0,8270573d-8ed6-449d-853b-462d2dabaaa9,8270573d-8ed6-449d-853b-462d2dabaaa9,1,0,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,1,0,f2502463-67e4-4bfe-8ad5-fb80aa73975a,f2502463-67e4-4bfe-8ad5-fb80aa73975a,1,0,59e885e6-d978-40c2-95b6-35fc61074fb4,59e885e6-d978-40c2-95b6-35fc61074fb4,1,0,267dc512-9ee1-4bc1-9034-3effb7fb2949,267dc512-9ee1-4bc1-9034-3effb7fb2949,1,0,0f211e73-5be9-4015-93e7-ccf63e793cb6,0f211e73-5be9-4015-93e7-ccf63e793cb6,1,0,6574d8f4-fb97-4a26-b166-711fad63aa07,6574d8f4-fb97-4a26-b166-711fad63aa07,1,0,fb3eddaf-3241-4d59-8314-97a5ae9258c4,fb3eddaf-3241-4d59-8314-97a5ae9258c4,1,0,a3b0494c-f436-45ea-9577-4c0c86b057c9,a3b0494c-f436-45ea-9577-4c0c86b057c9,1,0,5101c142-b25c-4bef-80e7-7407f2c15c90,5101c142-b25c-4bef-80e7-7407f2c15c90,1,0,6d7872f1-fd54-41c4-8253-5f2b125f31ae,6d7872f1-fd54-41c4-8253-5f2b125f31ae,1,0,0c218200-27a8-4f71-9b09-3632dd453644,0c218200-27a8-4f71-9b09-3632dd453644,1,0,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,1,0,b5d30250-18ab-4af1-b99a-ff5dba334d1f,b5d30250-18ab-4af1-b99a-ff5dba334d1f,1,0,936f1aa5-7516-444b-b451-1162fa5d705f,936f1aa5-7516-444b-b451-1162fa5d705f,1,0,e8d5533e-2669-44f6-9eed-eaedab666d42,e8d5533e-2669-44f6-9eed-eaedab666d42,1,0,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,1,0,9e323b0d-4e3b-45d4-9705-aa30e63014f5,9e323b0d-4e3b-45d4-9705-aa30e63014f5,1,0,5afa798a-958e-4e0c-a380-0104f4c037a7,5afa798a-958e-4e0c-a380-0104f4c037a7,1,0,c0295fd9-c749-41b3-8d0d-6af16f484b1f,c0295fd9-c749-41b3-8d0d-6af16f484b1f,1,0,bd32a863-3090-432d-89c4-356ba86a0bdc,bd32a863-3090-432d-89c4-356ba86a0bdc,1,0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,1,0,ed5465b4-a556-4078-ab18-49fef2afba2e,ed5465b4-a556-4078-ab18-49fef2afba2e,1,0,7368ab8f-59d5-4270-a43b-0f3e422169ed,7368ab8f-59d5-4270-a43b-0f3e422169ed,1,0,eeb0571b-1b74-4889-b8b5-f94186d692d7,eeb0571b-1b74-4889-b8b5-f94186d692d7,1,0,9ef3b72c-caa3-486b-9917-04c00f6689c1,9ef3b72c-caa3-486b-9917-04c00f6689c1,1,0,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,1,0,9245417f-f247-47ba-a1b4-a17ec2e8776c,9245417f-f247-47ba-a1b4-a17ec2e8776c,1,0,a4b721d7-b119-47eb-80e0-7db34c83964f,a4b721d7-b119-47eb-80e0-7db34c83964f,1,0,512629d1-e8b7-4f66-b613-b8c0cb9c250b,512629d1-e8b7-4f66-b613-b8c0cb9c250b,1,0,b7cf4684-4432-4658-9c06-b315d470a3a6,b7cf4684-4432-4658-9c06-b315d470a3a6,1,0,d3bc8211-54d8-47dd-aecf-5da72b65195f,d3bc8211-54d8-47dd-aecf-5da72b65195f,1,0,33f11da8-f670-4ec3-9d40-96fce031c60f,33f11da8-f670-4ec3-9d40-96fce031c60f,1,0,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,1,0,f74c2d41-2433-4bed-8aef-adfeed198252,f74c2d41-2433-4bed-8aef-adfeed198252,1,0,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,1,0,56c9703a-751a-4e6c-81f4-a8756fb040e3,56c9703a-751a-4e6c-81f4-a8756fb040e3,1,0,c3a86eec-1ff5-4392-9904-91a12a2e253a,c3a86eec-1ff5-4392-9904-91a12a2e253a,1,0,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,1,0,f02b7246-dae9-4e15-b4cd-b06133664d34,f02b7246-dae9-4e15-b4cd-b06133664d34,1,0,77f20022-17ce-4e00-8a84-015238bce6f3,77f20022-17ce-4e00-8a84-015238bce6f3,1,0,3734619b-7059-4547-8b97-0b3393389d4d,3734619b-7059-4547-8b97-0b3393389d4d,1,0,a30bf95f-aabd-4da0-8287-61e08f9362fb,a30bf95f-aabd-4da0-8287-61e08f9362fb,1,0,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,1,0,4078867c-2972-47f9-bebd-935a6f1cc667,4078867c-2972-47f9-bebd-935a6f1cc667,1,0,8502fe39-c241-4be5-a313-fd887bbbdfa1,8502fe39-c241-4be5-a313-fd887bbbdfa1,1,0,67a71201-13e5-42a3-902f-fb3a59710dfb,67a71201-13e5-42a3-902f-fb3a59710dfb,1,0,3a79a951-a997-4596-ab62-ba376d67725d,3a79a951-a997-4596-ab62-ba376d67725d,1,0,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,1,0,884c28de-434f-440a-8c63-67e659c097ad,884c28de-434f-440a-8c63-67e659c097ad,1,0,92ead3b5-8c55-4e4d-bd47-009e025b22f8,92ead3b5-8c55-4e4d-bd47-009e025b22f8,1,0,50d8e365-aa58-4b60-8992-01943379d485,50d8e365-aa58-4b60-8992-01943379d485,1,0,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,1,0,b3f7f763-bea9-4f59-9450-df95e5c3d89d,b3f7f763-bea9-4f59-9450-df95e5c3d89d,1,0,9111e28e-c1c7-414b-9288-61bd06a04d04,9111e28e-c1c7-414b-9288-61bd06a04d04,1,0,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,1,0,fec102ea-a3f6-49b5-b4b8-6884b0654129,fec102ea-a3f6-49b5-b4b8-6884b0654129,1,0,246571fb-38c7-4da6-929d-d8b44bc3437c,246571fb-38c7-4da6-929d-d8b44bc3437c,1,0,047fd6d7-5e30-4184-a09a-6525de526cc7,047fd6d7-5e30-4184-a09a-6525de526cc7,1,0,beb44b02-5d5e-4127-aee7-e184a43a4210,beb44b02-5d5e-4127-aee7-e184a43a4210,1,0,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1,0,e24641ed-3e92-46d7-852b-9958ab7bc520,e24641ed-3e92-46d7-852b-9958ab7bc520,1,0,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,1,0,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,1,0,2c61114f-abd7-4415-8cdf-4fe95d9fe354,2c61114f-abd7-4415-8cdf-4fe95d9fe354,1,0,abd7a766-5cc1-48db-8d29-797e9d666a78,abd7a766-5cc1-48db-8d29-797e9d666a78,1,0,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1,0,62eca88f-025d-44de-b92c-46cd8bc7e4a1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,1,0,8fbf9432-77e8-4951-87a1-4368e3a5e117,8fbf9432-77e8-4951-87a1-4368e3a5e117,1,0,fbd5d6d8-05cd-43a3-85da-8dcbeee08333,fbd5d6d8-05cd-43a3-85da-8dcbeee08333,1,0,b0dde395-8498-4469-9507-d290798117d7,b0dde395-8498-4469-9507-d290798117d7,1,0,999616ea-0faa-4ae2-9841-6a6997ea6694,999616ea-0faa-4ae2-9841-6a6997ea6694,1,0,c5f91669-13d8-4f0a-a054-2701078da38a,c5f91669-13d8-4f0a-a054-2701078da38a,1,0,34f9872b-e02e-4093-ba06-3cb5b8995850,34f9872b-e02e-4093-ba06-3cb5b8995850,1,0,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,1,0,3afe11f6-7424-4b41-a42f-91db33756fa3,3afe11f6-7424-4b41-a42f-91db33756fa3,1,0,94e68502-adf1-476e-be2f-8418385959fa,94e68502-adf1-476e-be2f-8418385959fa,1,0,bf80ccc5-f907-4e7f-a007-6030c7ba682e,bf80ccc5-f907-4e7f-a007-6030c7ba682e,1,0,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,134bbd7c-cadd-4395-b7a4-0249dfe7d0b1,1,0,05f1f184-50cb-47c5-b3a8-62be6a9780c1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,1,0,f908b81e-f5ba-46ca-b7c0-8cb43ab23901,f908b81e-f5ba-46ca-b7c0-8cb43ab23901,1,0,3c305f89-e453-46c7-987b-f01dc964efdb,3c305f89-e453-46c7-987b-f01dc964efdb,1,0,1809ff43-2af2-44d1-ac7b-91d5bbe4f0ce,1809ff43-2af2-44d1-ac7b-91d5bbe4f0ce,1,0,58c3936c-4db0-45c8-a22e-b5dd49a61497,58c3936c-4db0-45c8-a22e-b5dd49a61497,1,0,9aa607bc-5870-436a-bbe1-296560393e3b,9aa607bc-5870-436a-bbe1-296560393e3b,1,0,1635be16-4861-4a7d-babc-4caff448a7f7,1635be16-4861-4a7d-babc-4caff448a7f7,1,0,9e399087-c957-4a7a-ab9d-2b689736caab,9e399087-c957-4a7a-ab9d-2b689736caab,1,0,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,1,0,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,1,0,2b7372be-af0d-464e-8d09-8172229790af,2b7372be-af0d-464e-8d09-8172229790af,1,0,d85346db-be25-4dab-a2db-647c3d40dd17,d85346db-be25-4dab-a2db-647c3d40dd17,1,0,c7bafd34-5b15-42ec-b329-0be3002775ad,c7bafd34-5b15-42ec-b329-0be3002775ad,1,0,6feb2278-9149-47f8-a0ec-eb4bd9f44716,6feb2278-9149-47f8-a0ec-eb4bd9f44716,1,0,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,1,0,cd6770d5-cd3c-47af-bc46-c865993adf63,cd6770d5-cd3c-47af-bc46-c865993adf63,1,0,97ec899d-a2a0-4691-83ff-25b78dd49ef6,97ec899d-a2a0-4691-83ff-25b78dd49ef6,1,0,411db885-f761-44e5-bdd1-9fdf9e741ac1,411db885-f761-44e5-bdd1-9fdf9e741ac1,1,0,269ada84-71a9-4b4b-9604-caa40c5b7067,269ada84-71a9-4b4b-9604-caa40c5b7067,1,0,ea13607a-3e05-4468-9932-41b6d51cfedf,ea13607a-3e05-4468-9932-41b6d51cfedf,1,0,9f9936fc-54a0-4812-b12d-2f8f91551440,9f9936fc-54a0-4812-b12d-2f8f91551440,1,0,a5667633-9264-4dfa-9e26-c45e96e61ae3,a5667633-9264-4dfa-9e26-c45e96e61ae3,1,0,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,1,0,43e37533-ed38-4000-a387-5749f8d9aaf3,43e37533-ed38-4000-a387-5749f8d9aaf3,1,0,e93bdb44-64b3-43d8-b15a-c561dbb91974,e93bdb44-64b3-43d8-b15a-c561dbb91974,1,0,928e0e05-b946-48c8-9619-2d93eb94b036,928e0e05-b946-48c8-9619-2d93eb94b036,1,0,99e701f7-9206-4b20-bb32-e60c9a1d570e,99e701f7-9206-4b20-bb32-e60c9a1d570e,1,0,a7c7c835-5402-4bdd-a0e3-d21746174d5a,a7c7c835-5402-4bdd-a0e3-d21746174d5a,1,0,07e81872-afac-4720-86b4-91e7bf4a2881,07e81872-afac-4720-86b4-91e7bf4a2881,1,0,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,1,0,845262f8-8208-4c90-98ec-c85dd5734cf0,845262f8-8208-4c90-98ec-c85dd5734cf0,1,0,532dfa48-39b0-4d0f-9f8c-b51ca27e47a9,532dfa48-39b0-4d0f-9f8c-b51ca27e47a9,1,0,17bc0f34-c35b-4beb-be5f-8e8d8f06c053,17bc0f34-c35b-4beb-be5f-8e8d8f06c053,1,0,f91813e6-b75c-43fb-8da3-a0d958dc6fa0,f91813e6-b75c-43fb-8da3-a0d958dc6fa0,1,0,ad066c0d-4f4c-48af-9cc8-bb835372150a,ad066c0d-4f4c-48af-9cc8-bb835372150a,1,0,a2145e81-239e-4267-8a43-ea3f7babe878,a2145e81-239e-4267-8a43-ea3f7babe878,1,0,39598414-9c1d-46ec-a534-8bd43e622e45,39598414-9c1d-46ec-a534-8bd43e622e45,1,0,b552c510-4fd4-4c16-9022-dc5babcafc52,b552c510-4fd4-4c16-9022-dc5babcafc52,1,0,3892c06d-28f1-4238-a929-201316cac1ed,3892c06d-28f1-4238-a929-201316cac1ed,1,0,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,c13dea2e-17fa-4a5f-a70f-96e623db8a6b,1,0,ecc0ac05-9813-482d-bc39-0be1490d3f8b,ecc0ac05-9813-482d-bc39-0be1490d3f8b,1,0,866f53c8-4f1e-484a-a809-6130f7eef872,866f53c8-4f1e-484a-a809-6130f7eef872,1,0,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,339e8cba-a92e-42f6-8d00-3b8b56ce3b0f,1,0,567c68fd-74c7-4b6e-9119-56ac8d78073c,567c68fd-74c7-4b6e-9119-56ac8d78073c,1,0,3326bbcb-b277-44db-a252-2448119e8146,3326bbcb-b277-44db-a252-2448119e8146,1,0,61cac5f7-320c-4098-9078-44fadcdeb219,61cac5f7-320c-4098-9078-44fadcdeb219,1,0,304304b1-36a4-42bb-8ab9-b23b59795001,304304b1-36a4-42bb-8ab9-b23b59795001,1,0,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,1,0,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,1,0,cd454738-62dd-4f95-af33-b52750678428,cd454738-62dd-4f95-af33-b52750678428,1,0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,1,0,e4abafc6-f859-4d96-9818-5b9bf8d66d69,e4abafc6-f859-4d96-9818-5b9bf8d66d69,1,0,535acd2c-26d2-4f32-9ae6-cc1956317c59,535acd2c-26d2-4f32-9ae6-cc1956317c59,1,0,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,1,0,ac4e0868-ba49-46b4-8872-d42483a5591f,ac4e0868-ba49-46b4-8872-d42483a5591f,1,0,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,1,0,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0493dcf1-5f94-41f9-a4c7-a52e12a29068,1,0,ca4c0299-625a-4b03-be0e-36ffb45c6d08,ca4c0299-625a-4b03-be0e-36ffb45c6d08,1,0,7fa1119b-4321-4b8f-a879-1d940084145a,7fa1119b-4321-4b8f-a879-1d940084145a,1,0,5d9c0841-6ea6-48dc-a53b-9f19894750f8,5d9c0841-6ea6-48dc-a53b-9f19894750f8,1,0,86b5303b-d967-4bc6-b2da-066c5a58613f,86b5303b-d967-4bc6-b2da-066c5a58613f,1,0,853b824d-9377-475f-913e-d02bd60f5f64,853b824d-9377-475f-913e-d02bd60f5f64,1,0,d5a73869-381e-4878-8db7-596643937202,d5a73869-381e-4878-8db7-596643937202,1,0,c91de10a-d370-4495-9d9e-98581e566385,c91de10a-d370-4495-9d9e-98581e566385,1,0,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,3a93f1d2-3e9c-41a9-9d53-314538a96bb2,1,0,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,8bc4bece-027f-460c-ade0-d7c7d3d9a6b7,1,0,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,dd73a8d8-a6db-4d3c-a808-d82bad8876b9,1,0,11a93e3a-3c5b-4242-913c-02474a383344,11a93e3a-3c5b-4242-913c-02474a383344,1,0,ddd2861c-592b-4879-b9de-4b05a22c0b43,ddd2861c-592b-4879-b9de-4b05a22c0b43,1,0,5b383021-a800-4f0b-b8a3-d344389bff6c,5b383021-a800-4f0b-b8a3-d344389bff6c,1,0,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,8fe71bce-a61a-4a2e-bd18-81c7a7bb4456,1,0,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,11e708d8-82f4-4d45-a77d-7b9d23c0ef54,1,0,8a57d427-a34e-4121-84e6-1a86a9f9092d,8a57d427-a34e-4121-84e6-1a86a9f9092d,1,0,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,dbc1bf11-e92a-4f4e-90d4-6a3ccdaec7e5,1,0,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,29ec9423-25ef-4cf2-ad6a-58f854c3e22b,1,0,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,2607e4d1-4fc0-4270-ad45-2c95d4aa04da,1,0,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,b4b4bd5d-a860-4994-90b7-0c60ab680c4e,1,0,68447105-a784-4803-8eb8-3701b0fc819d,68447105-a784-4803-8eb8-3701b0fc819d,1,0,ec892726-dee3-4edb-ad71-020404b09477,ec892726-dee3-4edb-ad71-020404b09477,1,0,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,5fb5320c-cd7c-4f28-ad6a-8670a60a9e11,1,0,59dee70d-aeca-470a-b3c4-e43bb16c5753,59dee70d-aeca-470a-b3c4-e43bb16c5753,1,0,82777e92-0681-44bf-b51e-4d98fcd5d5bd,82777e92-0681-44bf-b51e-4d98fcd5d5bd,1,0,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,2e0b331d-92d4-4250-94c6-9ced8cdcb1e4,1,0,cee126de-d567-44d3-b14c-35da6e501324,cee126de-d567-44d3-b14c-35da6e501324,1,0,4599ef83-5f1e-44af-ae0c-67988656a99e,4599ef83-5f1e-44af-ae0c-67988656a99e,1,0,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,1,0,e1b94dcf-ec37-4b2d-a7af-120eeee40944,e1b94dcf-ec37-4b2d-a7af-120eeee40944,1,0,7d2a37b1-a1a0-435a-846a-95e255655044,7d2a37b1-a1a0-435a-846a-95e255655044,1,0,109db64c-00dc-490e-99a5-4430d9344e99,109db64c-00dc-490e-99a5-4430d9344e99,1,0,85837a55-fed5-4b7b-a622-30d728b9a677,85837a55-fed5-4b7b-a622-30d728b9a677,1,0,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,1,0,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,1,0,325bacdd-793f-47d8-b987-57e9d5f2782b,325bacdd-793f-47d8-b987-57e9d5f2782b,1,0,80395d47-70d7-4d8d-9b18-93283fba80c2,80395d47-70d7-4d8d-9b18-93283fba80c2,1,0,8b621ec9-24c9-4166-90ce-29c5ad30f78b,8b621ec9-24c9-4166-90ce-29c5ad30f78b,1,0,cc98670a-7b18-4973-b211-90261c5c8c10,cc98670a-7b18-4973-b211-90261c5c8c10,1,0,da9821c3-4b16-48b7-9088-d3cf8ac536a6,da9821c3-4b16-48b7-9088-d3cf8ac536a6,1,0,fb36c775-1124-4ba6-8af8-133bf66fcb54,fb36c775-1124-4ba6-8af8-133bf66fcb54,1,0,51f9aff4-71da-4b1b-b48b-04122a17d855,51f9aff4-71da-4b1b-b48b-04122a17d855,1,0,d5142574-a040-4dd0-a482-cdc61c1d86ab,d5142574-a040-4dd0-a482-cdc61c1d86ab,1,0,62957889-503f-4923-a372-29776dc3b5e5,62957889-503f-4923-a372-29776dc3b5e5,1,0,90385850-d37b-4b2e-ac87-95c17f32197c,90385850-d37b-4b2e-ac87-95c17f32197c,1,0,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,1,0,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,1,0,6b28a716-2fb1-47f7-a7d6-f2fe7edb32c3,6b28a716-2fb1-47f7-a7d6-f2fe7edb32c3,1,0,e849e46c-2ce6-427b-92bc-06d7997f59bf,e849e46c-2ce6-427b-92bc-06d7997f59bf,1,0,5a971dc0-28bf-4426-9426-9f456aea080a,5a971dc0-28bf-4426-9426-9f456aea080a,1,0,f480ac52-e2f1-4ed0-a0b1-20a622f77302,f480ac52-e2f1-4ed0-a0b1-20a622f77302,1,0,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,1,0,b9b0fbdc-8fda-46d1-bb3e-561a03604971,b9b0fbdc-8fda-46d1-bb3e-561a03604971,1,0,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,1,0,672c2936-9771-4e32-a970-7ac7f12a21e8,672c2936-9771-4e32-a970-7ac7f12a21e8,1,0,73afaad8-dfa9-43e3-bdaf-543c3545d788,73afaad8-dfa9-43e3-bdaf-543c3545d788,1,0,c264441d-4805-4968-baa2-37b8970049c7,c264441d-4805-4968-baa2-37b8970049c7,1,0,4f0bda80-2246-43be-95f8-ae8480682cd5,4f0bda80-2246-43be-95f8-ae8480682cd5,1,0,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,ac4fa2a4-93a1-4aa6-986a-5f576457fc8a,1,0,6f683f46-9eef-4e78-bc2f-7174238bf53c,6f683f46-9eef-4e78-bc2f-7174238bf53c,1,0,7d1ed38b-98cf-4a0e-a605-680bb580d904,7d1ed38b-98cf-4a0e-a605-680bb580d904,1,0,b769eda0-11de-401c-a68b-4fce4555d4fc,b769eda0-11de-401c-a68b-4fce4555d4fc,1,0,fd7a668f-3099-4e15-956a-92c6295dd4d5,fd7a668f-3099-4e15-956a-92c6295dd4d5,1,0,afcbd830-ec5f-4865-a176-ea3014dff908,afcbd830-ec5f-4865-a176-ea3014dff908,1,0,dc5fc801-14e4-42e8-b396-76eb30b69eea,dc5fc801-14e4-42e8-b396-76eb30b69eea,1,0,485b9f00-475a-49e5-ade2-b2e05d94ecf0,485b9f00-475a-49e5-ade2-b2e05d94ecf0,1,0,310aef5a-84d9-4a68-af78-d623beff8a88,310aef5a-84d9-4a68-af78-d623beff8a88,1,0,398bf9d1-c353-461e-a1be-683047dcbe41,398bf9d1-c353-461e-a1be-683047dcbe41,1,0,f36150de-33af-4410-8a4c-8c9f4b545793,f36150de-33af-4410-8a4c-8c9f4b545793,1,0,62f97480-7d4a-48f3-9d1d-612909b242c9,62f97480-7d4a-48f3-9d1d-612909b242c9,1,0,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,1,0,3068be84-a401-4701-8ac9-411fae130f84,3068be84-a401-4701-8ac9-411fae130f84,1,0,957394a7-e5b8-47fc-8680-1e71efe2be7d,957394a7-e5b8-47fc-8680-1e71efe2be7d,1,0,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,1,0,4f25ef45-c8d9-401d-b0e8-2217ac310f04,4f25ef45-c8d9-401d-b0e8-2217ac310f04,1,0,504ca240-b5ae-433e-ae5f-d818263eea23,504ca240-b5ae-433e-ae5f-d818263eea23,1,0,32461819-9437-417d-8d1e-851c9a2dcee2,32461819-9437-417d-8d1e-851c9a2dcee2,1,0,74228950-8a4b-4dd6-a053-8650de202521,74228950-8a4b-4dd6-a053-8650de202521,1,0,6b9ce91e-08b9-4972-9878-1724c67b68ec,6b9ce91e-08b9-4972-9878-1724c67b68ec,1,0,640814f2-6082-475e-8006-25fd5b24afdb,640814f2-6082-475e-8006-25fd5b24afdb,1,0,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,1,0,569047c2-0879-4fba-a814-44812d21043b,569047c2-0879-4fba-a814-44812d21043b,1,0,0c3c4494-c037-431e-9eeb-9b6cfd7372c3,0c3c4494-c037-431e-9eeb-9b6cfd7372c3,1,0,80512d95-5458-4934-98ae-a7b58099196b,80512d95-5458-4934-98ae-a7b58099196b,1,0,6f2354cd-4a34-4921-96bb-b786486f85cf,6f2354cd-4a34-4921-96bb-b786486f85cf,1,0,f1b66ea8-262d-4b38-a039-b83a843f6ee8,f1b66ea8-262d-4b38-a039-b83a843f6ee8,1,0,bcae6e05-f1fd-413e-9eef-2e1cee42a962,bcae6e05-f1fd-413e-9eef-2e1cee42a962,1,0,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,1,0,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,1,0,91562fe8-e630-4bcb-a14e-c0e1e129141a,91562fe8-e630-4bcb-a14e-c0e1e129141a,1,0,c261abfd-3828-47b5-aa32-dfdd3a1636ad,c261abfd-3828-47b5-aa32-dfdd3a1636ad,1,0,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,1,0,1db1cb24-f364-4b91-bc96-c216764207a0,1db1cb24-f364-4b91-bc96-c216764207a0,1,0,64d7c8a7-1c15-4afb-ad97-abf8729c604e,64d7c8a7-1c15-4afb-ad97-abf8729c604e,1,0,a3cbbc8a-4afd-48c5-91d4-4849d18905c1,a3cbbc8a-4afd-48c5-91d4-4849d18905c1,1,0,5d6b29dc-38af-4dce-b79c-ce8f23afb3b1,5d6b29dc-38af-4dce-b79c-ce8f23afb3b1,1,0,c04b685a-0d2d-404c-a74a-775ffab298ce,c04b685a-0d2d-404c-a74a-775ffab298ce,1,0,5fe6967d-e333-464b-a89e-8c868c0ce37d,5fe6967d-e333-464b-a89e-8c868c0ce37d,1,0,5aef2892-7a87-4d3b-bb46-8340a7fb97a8,5aef2892-7a87-4d3b-bb46-8340a7fb97a8,1,0,8efa4c12-b5ba-4dfd-bdc9-e824402fc4b1,8efa4c12-b5ba-4dfd-bdc9-e824402fc4b1,1,0,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,1,0,9155c95b-6afb-41bb-bd0b-d37e503fc163,9155c95b-6afb-41bb-bd0b-d37e503fc163,1,0,d917c19e-be15-41cc-9c8a-a97c8de85309,d917c19e-be15-41cc-9c8a-a97c8de85309,1,0,54b5b44c-5f24-4b2a-982c-4489b18db7f0,54b5b44c-5f24-4b2a-982c-4489b18db7f0,1,0,5bc04a9a-6a0a-4607-b8eb-743b87143ae7,5bc04a9a-6a0a-4607-b8eb-743b87143ae7,1,0,e8045f52-7b27-48b0-b009-d488718b3bef,e8045f52-7b27-48b0-b009-d488718b3bef,1,0,1796bcbb-a629-4509-95c9-78562689f809,1796bcbb-a629-4509-95c9-78562689f809,1,0,cd9799c9-f5bf-4537-8885-06fb6e6b8f93,cd9799c9-f5bf-4537-8885-06fb6e6b8f93,1,0,d19e8fcc-62cc-4ce4-81bc-ead33a2714df,d19e8fcc-62cc-4ce4-81bc-ead33a2714df,1,0,e057e428-99c1-419d-a169-697c1e825e94,e057e428-99c1-419d-a169-697c1e825e94,1,0,784a60bd-4070-476d-9b8b-f607c76dc52b,784a60bd-4070-476d-9b8b-f607c76dc52b,1,0,904d5bd0-3843-4aaa-86a3-f8e12282e5c0,904d5bd0-3843-4aaa-86a3-f8e12282e5c0,1,0,90420fe9-f75a-4bcc-8e1a-9d665a61ecef,90420fe9-f75a-4bcc-8e1a-9d665a61ecef,1,0,47907538-9357-4885-8b50-17f2e16c260f,47907538-9357-4885-8b50-17f2e16c260f,1,0,17e1840f-fef3-4f17-8476-273e6af24cb4,17e1840f-fef3-4f17-8476-273e6af24cb4,1,0,a64566fa-b706-49bc-8277-4531145c400e,a64566fa-b706-49bc-8277-4531145c400e,1,0,a8f32b13-249c-4ce6-a521-f06a87f2e670,a8f32b13-249c-4ce6-a521-f06a87f2e670,1,0,815775e4-cfb7-495b-87c4-d134b90d93d4,815775e4-cfb7-495b-87c4-d134b90d93d4,1,0,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,1,0,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,1,0,7a27b378-89ac-4cad-8c69-a0cd14812d7e,7a27b378-89ac-4cad-8c69-a0cd14812d7e,1,0,d2433a11-8e1d-4e4c-966d-37cde6283f72,d2433a11-8e1d-4e4c-966d-37cde6283f72,1,0,59eb5919-3c33-48bf-b322-ec78018e4142,59eb5919-3c33-48bf-b322-ec78018e4142,1,0,63f308a5-b955-48a5-8052-50c5bede65d0,63f308a5-b955-48a5-8052-50c5bede65d0,1,0,1b614b97-5c1d-497a-9574-40114059f836,1b614b97-5c1d-497a-9574-40114059f836,1,0,477dfea4-e401-4cf0-b0a8-2df7c3836c58,477dfea4-e401-4cf0-b0a8-2df7c3836c58,1,0,294c000f-6979-4ed1-bbc7-7402facd9185,294c000f-6979-4ed1-bbc7-7402facd9185,1,0,db607fbc-f785-47d5-9550-577424aa3fe9,db607fbc-f785-47d5-9550-577424aa3fe9,1,0,b7111ddf-a623-4bae-90aa-636148492ca2,b7111ddf-a623-4bae-90aa-636148492ca2,1,0,905d9dcd-5793-4362-8fe8-2edce8c35e32,905d9dcd-5793-4362-8fe8-2edce8c35e32,1,0,a96cb6fd-54e0-4514-9210-7f4636acd336,a96cb6fd-54e0-4514-9210-7f4636acd336,1,0,3580e7a7-95d1-4a8e-bc12-a1449fe03757,3580e7a7-95d1-4a8e-bc12-a1449fe03757,1,0,13759790-6c70-4323-9321-a68b90c51663,13759790-6c70-4323-9321-a68b90c51663,1,0,d9704b20-c29c-4e7f-b777-0ac9080a5631,d9704b20-c29c-4e7f-b777-0ac9080a5631,1,0,c1372891-0f55-4868-ab97-906eff52be0e,c1372891-0f55-4868-ab97-906eff52be0e,1,0,33e96bda-1708-4ee4-8d4d-3b919bda3e38,33e96bda-1708-4ee4-8d4d-3b919bda3e38,1,0,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,1,0,93fcaa62-2a19-468b-9128-c7930583fbfd,93fcaa62-2a19-468b-9128-c7930583fbfd,1,0,2d885109-4c96-41c0-a996-785bfd793c2d,2d885109-4c96-41c0-a996-785bfd793c2d,1,0,e870a1bd-0c08-4d1e-832a-357922983c19,e870a1bd-0c08-4d1e-832a-357922983c19,1,0,9f71aeac-f889-40dc-91bd-d670da4efd2b,9f71aeac-f889-40dc-91bd-d670da4efd2b,1,0,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,62f8a9b2-9e56-4d5c-a7e2-a85f5b27a5b7,1,0,614ef0bd-3298-408b-bf71-37df8ee60702,614ef0bd-3298-408b-bf71-37df8ee60702,1,0,26ff1be6-f72a-456a-9dce-302029752603,26ff1be6-f72a-456a-9dce-302029752603,1,0,db850a08-0c99-4a57-9b04-38be64bd38fb,db850a08-0c99-4a57-9b04-38be64bd38fb,1,0,abeca127-5ae9-46af-a5e8-d6438fd68367,abeca127-5ae9-46af-a5e8-d6438fd68367,1,0,bce81631-9f6d-42b3-b4b6-2199afb08f2f,bce81631-9f6d-42b3-b4b6-2199afb08f2f,1,0,67d6878f-3e47-4142-8f98-c5a207f0b8a8,67d6878f-3e47-4142-8f98-c5a207f0b8a8,1,0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,7f4b872f-0e50-49dd-984d-f5fc3ac3f2f0,1,0,68636657-4d46-4c2a-9b2f-11521a55dfb4,68636657-4d46-4c2a-9b2f-11521a55dfb4,1,0,18a83f43-dc84-4f8a-9580-681b19f571c4,18a83f43-dc84-4f8a-9580-681b19f571c4,1,0,01c588b0-d0ce-4978-b04d-084e6a00fcc7,01c588b0-d0ce-4978-b04d-084e6a00fcc7,1,0,a23642d9-8c4f-44a5-8865-bfb286e47c55,a23642d9-8c4f-44a5-8865-bfb286e47c55,1,0,7b37e038-dcef-41e1-b6e7-ed73c6958415,7b37e038-dcef-41e1-b6e7-ed73c6958415,1,0,24df2d14-5ebf-4ded-ba14-5daee7a0c536,24df2d14-5ebf-4ded-ba14-5daee7a0c536,1,0,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,13d6e2e9-b268-4c1b-8b8b-30c5296cfe4c,1,0,03bb028a-ee8c-411e-8382-653046f803c6,03bb028a-ee8c-411e-8382-653046f803c6,1,0,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,c4fa80ca-32d6-4a44-9fe2-7ffd67e1cb30,1,0,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,8aa73dfd-41ac-4f79-bf73-cd2da51b1232,1,0,38d5ed93-133b-44fe-827a-69a6cfc0461d,38d5ed93-133b-44fe-827a-69a6cfc0461d,1,0,436a9c94-55f6-4463-becd-573189753ee7,436a9c94-55f6-4463-becd-573189753ee7,1,0,50bf4050-390c-419c-8f55-82a540093ab1,50bf4050-390c-419c-8f55-82a540093ab1,1,0,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,1,0,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,1,0,5148d263-de26-4c92-b090-ae59f42dfb05,5148d263-de26-4c92-b090-ae59f42dfb05,1,0,dbefe81f-85cf-4d84-9600-b359598c2543,dbefe81f-85cf-4d84-9600-b359598c2543,1,0,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1,0,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,1,0,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,1,0,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1,0,d5967e0f-03cd-4190-a702-7e9290eae1eb,d5967e0f-03cd-4190-a702-7e9290eae1eb,1,0,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,1,0,8eb18de5-8283-4d0c-bb11-b882e78181d5,8eb18de5-8283-4d0c-bb11-b882e78181d5,1,0,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,1,0,7059b117-714c-4710-aebe-76f88c4d41d5,7059b117-714c-4710-aebe-76f88c4d41d5,1,0,ea050453-4947-40dc-aa2a-503ddd1a235a,ea050453-4947-40dc-aa2a-503ddd1a235a,1,0,37d0e6d4-702e-46f5-ae87-4d393fa0c701,37d0e6d4-702e-46f5-ae87-4d393fa0c701,1,0,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1,0,3a62d88e-9298-42c0-bd87-c749ecd01d19,3a62d88e-9298-42c0-bd87-c749ecd01d19,1,0,abbf064e-c6ea-4712-930b-a9fef42e0ee1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,1,0,fc13dd80-ce44-4ed1-a9d7-dae44602b954,fc13dd80-ce44-4ed1-a9d7-dae44602b954,1,0,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,1,0,433b23a1-a863-4775-b2f2-1384e8f3cbbb,433b23a1-a863-4775-b2f2-1384e8f3cbbb,1,0,a1677c47-b9a4-427a-972d-9bb2293445b6,a1677c47-b9a4-427a-972d-9bb2293445b6,1,0,e4a328c0-e73b-465d-ae36-38e5a71690fa,e4a328c0-e73b-465d-ae36-38e5a71690fa,1,0,bf66612b-aec4-414b-bee6-9bcab145c7cc,bf66612b-aec4-414b-bee6-9bcab145c7cc,1,0,811f356f-554a-4a63-90b6-dedb5fec7c05,811f356f-554a-4a63-90b6-dedb5fec7c05,1,0,85bebd81-a355-4010-889b-cff6f72dafcb,85bebd81-a355-4010-889b-cff6f72dafcb,1,0,49521f36-fd1b-47dd-81cc-48b6fb651e22,49521f36-fd1b-47dd-81cc-48b6fb651e22,1,0,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1,0,bc946e21-53bb-4332-8c63-7b0aa78826eb,bc946e21-53bb-4332-8c63-7b0aa78826eb,1,0,4be2bdad-9a43-4593-acbc-a02e9144a89f,4be2bdad-9a43-4593-acbc-a02e9144a89f,1,0,64a86d5d-f925-45ee-82da-76df1cc20729,64a86d5d-f925-45ee-82da-76df1cc20729,1,0,eb4455f2-a5a0-44fb-8302-7312bc32df66,eb4455f2-a5a0-44fb-8302-7312bc32df66,1,0,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,1,0,9f20e59e-7db8-466f-b965-7045fc3f1489,9f20e59e-7db8-466f-b965-7045fc3f1489,1,0,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,1,0,89ac3d39-1915-4e67-a4e4-5a67a155cb75,89ac3d39-1915-4e67-a4e4-5a67a155cb75,1,0,d27b637d-5a51-49ff-bf73-343891534586,d27b637d-5a51-49ff-bf73-343891534586,1,0,b5a073a2-54e2-47c9-b533-f75fd2c9f343,b5a073a2-54e2-47c9-b533-f75fd2c9f343,1,0,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0c8571be-f9b6-4292-add9-980cfe7fa2ec,1,0,989b8ccd-bc05-48c1-9969-b3733028b65f,989b8ccd-bc05-48c1-9969-b3733028b65f,1,0,6c70b13d-f9d0-459f-8d38-c01c11f356f1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,1,0,45ca19df-90f3-4143-a659-bc0cb97efee9,45ca19df-90f3-4143-a659-bc0cb97efee9,1,0,6fe997a3-d729-420b-b2b2-558e9a1031ee,6fe997a3-d729-420b-b2b2-558e9a1031ee,1,0,4e1b48b1-c998-4f99-94e7-50af22059bfa,4e1b48b1-c998-4f99-94e7-50af22059bfa,1,0,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,1,0,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,1,0,83ae9b22-20ff-4e94-9282-19daf2274328,83ae9b22-20ff-4e94-9282-19daf2274328,1,0,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,1,0,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,1,0,a92b2b70-7e69-49d1-b921-c9d1b0718f94,a92b2b70-7e69-49d1-b921-c9d1b0718f94,1,0,d57a3300-0f9f-4fe5-b627-01c96b723053,d57a3300-0f9f-4fe5-b627-01c96b723053,1,0,ccfdf89b-f63e-4e46-b942-0d145695fdc6,ccfdf89b-f63e-4e46-b942-0d145695fdc6,1,0,6d40a555-9c20-4643-b689-2f61df772f78,6d40a555-9c20-4643-b689-2f61df772f78,1,0,19f690a3-d27b-43c1-94b7-585fc628da05,19f690a3-d27b-43c1-94b7-585fc628da05,1,0,d375fac5-098c-42b5-a0bd-9a4ae7516ada,d375fac5-098c-42b5-a0bd-9a4ae7516ada,1,0,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,1,0,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,ce65563d-03dc-46d8-96d4-c2d4ae2a2960,1,0,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,5079f17e-dfd6-43f4-83fa-6ac408e5bd3b,1,0,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,7a4346c3-f1aa-4ce0-886e-76cd9abf563c,1,0,cf783265-a4cb-436f-963a-1ff8220ae246,cf783265-a4cb-436f-963a-1ff8220ae246,1,0,3560f949-48f9-4fca-9fe2-81efc1ec0eee,3560f949-48f9-4fca-9fe2-81efc1ec0eee,1,0,662078f0-b75d-4c44-896f-7b7f74fd1ed4,662078f0-b75d-4c44-896f-7b7f74fd1ed4,1,0,4fa11304-fbd4-4c90-909d-5024283a6868,4fa11304-fbd4-4c90-909d-5024283a6868,1,0,207290c2-5221-48ad-99aa-bb0f7955df3f,207290c2-5221-48ad-99aa-bb0f7955df3f,1,0,162137ef-dea2-4ace-9e67-897dad0e7c3d,162137ef-dea2-4ace-9e67-897dad0e7c3d,1,0,d91a016e-cca9-4976-9c53-2c96fa95cf1a,d91a016e-cca9-4976-9c53-2c96fa95cf1a,1,0,012fb2f1-1c15-4800-8968-78a90c2a1348,012fb2f1-1c15-4800-8968-78a90c2a1348,1,0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,a29a36aa-3c90-4be9-8ffc-20237721d1d0,1,0,aec8f9e6-d177-45f5-ba55-2d662428c2ae,aec8f9e6-d177-45f5-ba55-2d662428c2ae,1,0,b0bf8af5-d824-459c-bc40-17495406af3c,b0bf8af5-d824-459c-bc40-17495406af3c,1,0,7dfdd08b-7cd9-480c-829d-97f5e7152eec,7dfdd08b-7cd9-480c-829d-97f5e7152eec,1,0,64752b64-80ae-4537-986a-d61423dc546b,64752b64-80ae-4537-986a-d61423dc546b,1,0,2c37e123-ea35-4501-93e1-2fa295444bec,2c37e123-ea35-4501-93e1-2fa295444bec,1,0,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,c8bd3ac8-3b49-46bb-aadd-7270ad2868fc,1,0,a997a430-3ea8-4fde-9f53-7b507a04c215,a997a430-3ea8-4fde-9f53-7b507a04c215,1,0,f648e19d-026b-4fa7-8e70-1866b27b94f8,f648e19d-026b-4fa7-8e70-1866b27b94f8,1,0,d32081fc-47d3-4e66-837e-705c94ba8ca8,d32081fc-47d3-4e66-837e-705c94ba8ca8,1,0,69c207c2-7699-4467-b127-286ecd6d0f29,69c207c2-7699-4467-b127-286ecd6d0f29,1,0,70a06a02-8fb8-4a39-9e50-b7c27c41f49f,70a06a02-8fb8-4a39-9e50-b7c27c41f49f,1,0,810755ad-e921-4250-a0d3-af77fe1b6c79,810755ad-e921-4250-a0d3-af77fe1b6c79,1,0,f0f2f6de-b5ca-416c-b2e7-70a2df0993a1,f0f2f6de-b5ca-416c-b2e7-70a2df0993a1,1,0,99a40d71-f47a-4c04-9137-d297eda2fad9,99a40d71-f47a-4c04-9137-d297eda2fad9,1,0,33fa908a-5516-43c8-94d3-28c60eba8d66,33fa908a-5516-43c8-94d3-28c60eba8d66,1,0,f3750ea4-5f9e-4ab3-9495-3f182ecff407,f3750ea4-5f9e-4ab3-9495-3f182ecff407,1,0,14002d51-87d4-4647-92ef-a9b1935cb666,14002d51-87d4-4647-92ef-a9b1935cb666,1,0,e941a39d-1f3c-4e6e-af17-75f92a15dd40,e941a39d-1f3c-4e6e-af17-75f92a15dd40,1,0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,1,0,72c695c3-66f6-4aa8-8a39-737ec6967a1d,72c695c3-66f6-4aa8-8a39-737ec6967a1d,1,0,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,1,0,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,1,0,d5d11480-d5c7-4569-80c1-f872655ff084,d5d11480-d5c7-4569-80c1-f872655ff084,1,0,b1e45d36-08e9-430e-976b-03e6e3320c6a,b1e45d36-08e9-430e-976b-03e6e3320c6a,1,0,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,1,0,8e21374f-5a65-406c-856d-2040607da4bc,8e21374f-5a65-406c-856d-2040607da4bc,1,0,7904d64a-2c30-4434-8924-b4817b727db9,7904d64a-2c30-4434-8924-b4817b727db9,1,0,c550a43a-1240-4f29-9045-a262f37f703a,c550a43a-1240-4f29-9045-a262f37f703a,1,0,86b1feed-ed65-4672-a49a-c52282b40be3,86b1feed-ed65-4672-a49a-c52282b40be3,1,0,85ac42d7-400a-4469-8fcd-e6a14f258792,85ac42d7-400a-4469-8fcd-e6a14f258792,1,0,ec681c28-661c-43e3-9285-9fc606f2d24c,ec681c28-661c-43e3-9285-9fc606f2d24c,1,0,be0fbbfc-5873-41a6-80ef-35ed1b8adb4c,be0fbbfc-5873-41a6-80ef-35ed1b8adb4c,1,0,413c2d03-f717-4503-9723-c605114b2799,413c2d03-f717-4503-9723-c605114b2799,1,0,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1,0,3e5f5167-8978-4191-b0f6-6a262b848b95,3e5f5167-8978-4191-b0f6-6a262b848b95,1,0,ae3aef9e-df3b-4ebc-912d-2bc581063745,ae3aef9e-df3b-4ebc-912d-2bc581063745,1,0,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,1,0,a8c09e65-6e10-4772-b264-6ead83d52fe3,a8c09e65-6e10-4772-b264-6ead83d52fe3,1,0,797f4377-ee0f-4a2d-be90-a74ac10ef682,797f4377-ee0f-4a2d-be90-a74ac10ef682,1,0,f401c5be-2698-452d-8908-08faad120a47,f401c5be-2698-452d-8908-08faad120a47,1,0,98de52ae-dfab-480b-a167-4cf2a3962ed1,98de52ae-dfab-480b-a167-4cf2a3962ed1,1,0,efa5c204-b827-4860-aadd-3737c8fc5f6b,efa5c204-b827-4860-aadd-3737c8fc5f6b,1,0,ef438c21-9d10-4116-8fc7-03927062db59,ef438c21-9d10-4116-8fc7-03927062db59,1,0,7ffa25d5-5199-4e08-af76-969c17709ad4,7ffa25d5-5199-4e08-af76-969c17709ad4,1,0,a93180c6-fcb7-4b28-b954-d2f2831f1832,a93180c6-fcb7-4b28-b954-d2f2831f1832,1,0,b46fff37-cc0e-4ff4-8fde-6bd9d9b895ec,b46fff37-cc0e-4ff4-8fde-6bd9d9b895ec,1,0,eeeede5e-9534-498e-b820-87a5f919c068,eeeede5e-9534-498e-b820-87a5f919c068,1,0,8b1f81e0-1eb0-4aae-9bb6-b25d97a6c9c2,8b1f81e0-1eb0-4aae-9bb6-b25d97a6c9c2,1,0,55ecc3a2-3d94-4201-8a29-06469e0b1a17,55ecc3a2-3d94-4201-8a29-06469e0b1a17,1,0,4123c760-0e30-48d0-8211-1db84f53314b,4123c760-0e30-48d0-8211-1db84f53314b,1,0,a086da23-29d8-4d02-846b-5d171e14d730,a086da23-29d8-4d02-846b-5d171e14d730,1,0,9ec76352-5e4a-485d-bd93-eb739869e406,9ec76352-5e4a-485d-bd93-eb739869e406,1,0,6d3619e3-d125-44b6-9b51-ebf9505b04d2,6d3619e3-d125-44b6-9b51-ebf9505b04d2,1,0,9d2c802c-c946-44e5-b9bc-13ef534968cd,9d2c802c-c946-44e5-b9bc-13ef534968cd,1,0,8046b46e-d855-4a80-8270-72a104e4a941,8046b46e-d855-4a80-8270-72a104e4a941,1,0,4524e15c-4c35-4e1d-910f-5859b5702dff,4524e15c-4c35-4e1d-910f-5859b5702dff,1,0,e200002c-9f3a-49d9-bba1-dca11555511d,e200002c-9f3a-49d9-bba1-dca11555511d,1,0,efa0f74a-7ec0-42f4-a948-7ce3890559d8,efa0f74a-7ec0-42f4-a948-7ce3890559d8,1,0,97e11b91-9590-44b3-afcd-f465ce23e509,97e11b91-9590-44b3-afcd-f465ce23e509,1,0,301c1fc5-ca0a-4fac-ac51-c2e42fb3c2a8,301c1fc5-ca0a-4fac-ac51-c2e42fb3c2a8,1,0,6f2d0c99-3354-4924-959c-59320e1b0063,6f2d0c99-3354-4924-959c-59320e1b0063,1,0,aee8df57-983b-440d-9c02-cace7e632f15,aee8df57-983b-440d-9c02-cace7e632f15,1,0,6e9648dd-388f-4563-88b0-feddc6e9ce8e,6e9648dd-388f-4563-88b0-feddc6e9ce8e,1,0,eb975d96-d230-4454-8f14-6bf5522e06d2,eb975d96-d230-4454-8f14-6bf5522e06d2,1,0,6aa6513c-6f3b-4897-96fd-4a08aeb9eb1e,6aa6513c-6f3b-4897-96fd-4a08aeb9eb1e,1,0,c29d3ae4-9458-46b8-a09b-012e5d435d43,c29d3ae4-9458-46b8-a09b-012e5d435d43,1,0,dad62d28-168c-4659-a800-e484772d9003,dad62d28-168c-4659-a800-e484772d9003,1,0,4cada7d2-f1b1-4914-95fc-c5e1431c13a7,4cada7d2-f1b1-4914-95fc-c5e1431c13a7,1,0,ecbe1ead-4e4b-49db-b7f1-c097c9df2fb9,ecbe1ead-4e4b-49db-b7f1-c097c9df2fb9,1,0,be026f77-285b-4470-8a4e-c68f6e9859e2,be026f77-285b-4470-8a4e-c68f6e9859e2,1,0,a9d54a18-9c35-471b-ad8b-44ba743b7977,a9d54a18-9c35-471b-ad8b-44ba743b7977,1,0,4f75014c-831f-4de5-8b6e-94874ce274ce,4f75014c-831f-4de5-8b6e-94874ce274ce,1,0,c9f74923-95e1-4f5c-8649-3543fae6b116,c9f74923-95e1-4f5c-8649-3543fae6b116,1,0,b00616bb-406d-4e8e-80a0-f0c14cc850c0,b00616bb-406d-4e8e-80a0-f0c14cc850c0,1,0,d60aae4f-7c61-416c-bbc9-e7c95d757848,d60aae4f-7c61-416c-bbc9-e7c95d757848,1,0,c8a0da4e-0b0f-4def-a61e-5f6e04468e01,c8a0da4e-0b0f-4def-a61e-5f6e04468e01,1,0,62f9c12c-1837-4320-99b0-8f7ae44af735,62f9c12c-1837-4320-99b0-8f7ae44af735,1,0,ae352e0c-9f89-4ed9-ab45-f4e9040f7858,ae352e0c-9f89-4ed9-ab45-f4e9040f7858,1,0,853a5fdc-3621-442c-abd3-2fd266fddd84,853a5fdc-3621-442c-abd3-2fd266fddd84,1,0,daaff4d7-bc0b-4ab5-a277-fc02472f76ed,daaff4d7-bc0b-4ab5-a277-fc02472f76ed,1,0,33c9ebee-7b42-4010-a5c9-71ca7479d95c,33c9ebee-7b42-4010-a5c9-71ca7479d95c,1,0,cf202dca-e0ee-45c8-8792-46fc2f126e68,cf202dca-e0ee-45c8-8792-46fc2f126e68,1,0,be150cca-e977-4663-af19-79d8b0f91b3d,be150cca-e977-4663-af19-79d8b0f91b3d,1,0,f12857d7-bcae-4c6c-9169-2a0b1f9e9e6a,f12857d7-bcae-4c6c-9169-2a0b1f9e9e6a,1,0,1c13d12d-5c96-4d96-a07d-ec4a766c86ac,1c13d12d-5c96-4d96-a07d-ec4a766c86ac,1,0,6279f4bc-b77f-4618-9ce3-d50efc798871,6279f4bc-b77f-4618-9ce3-d50efc798871,1,0,fb05b40b-8cf5-4821-afcb-f00a77458a9b,fb05b40b-8cf5-4821-afcb-f00a77458a9b,1,0,37c68cb5-6aaf-4e57-b68c-1a5b5db252b7,37c68cb5-6aaf-4e57-b68c-1a5b5db252b7,1,0,3967bec7-9af5-40bf-9e22-a0f6b13cc795,3967bec7-9af5-40bf-9e22-a0f6b13cc795,1,0,eab9da25-07b6-4c60-9a83-08e8277d0ae7,eab9da25-07b6-4c60-9a83-08e8277d0ae7,1,0,b79ed991-f5d9-42b6-8f0b-0df49e550ced,b79ed991-f5d9-42b6-8f0b-0df49e550ced,1,0,ac50e8d6-fe0b-45a4-b0dd-cc81d7fd7357,ac50e8d6-fe0b-45a4-b0dd-cc81d7fd7357,1,0,f58a3df1-ddf3-45c8-b470-cc026cb0537f,f58a3df1-ddf3-45c8-b470-cc026cb0537f,1,0,c4e9954b-59d8-46e3-ada8-bda66e8aaceb,c4e9954b-59d8-46e3-ada8-bda66e8aaceb,1,0,568c16cf-c3fc-4e16-8f05-e00be8e136c2,568c16cf-c3fc-4e16-8f05-e00be8e136c2,1,0,b36ad726-fb8f-4974-986a-33f997e3fc64,b36ad726-fb8f-4974-986a-33f997e3fc64,1,0,e196c73e-c09b-4aed-b403-2b97a8bf6e47,e196c73e-c09b-4aed-b403-2b97a8bf6e47,1,0,27fdab52-f1ab-48d3-b117-06afcf319eaa,27fdab52-f1ab-48d3-b117-06afcf319eaa,1,0,bf3530c3-3244-4528-a846-ea175af53804,bf3530c3-3244-4528-a846-ea175af53804,1,0,5bdfff5e-f04c-4fe3-ae92-10a99da3a6a8,5bdfff5e-f04c-4fe3-ae92-10a99da3a6a8,1,0,3d0ae989-2d16-42df-a442-7bde817ec1b2,3d0ae989-2d16-42df-a442-7bde817ec1b2,1,0,f3d1adac-197a-4194-89fe-7178f8ccd788,f3d1adac-197a-4194-89fe-7178f8ccd788,1,0,7077b04e-75c0-414d-b295-d28aeda2bdd4,7077b04e-75c0-414d-b295-d28aeda2bdd4,1,0,c8330995-22f4-4be6-beff-64f87c6f09ed,c8330995-22f4-4be6-beff-64f87c6f09ed,1,0,56b6b570-764b-4220-9b5f-70753b0fadbd,56b6b570-764b-4220-9b5f-70753b0fadbd,1,0,588f481e-4486-4649-b584-08f7e3ab8cde,588f481e-4486-4649-b584-08f7e3ab8cde,1,0,5dfe90e2-cb1a-4510-b22c-af94ca06dd7b,5dfe90e2-cb1a-4510-b22c-af94ca06dd7b,1,0,70c217b8-ddf0-4b7c-80b0-f5a76dbbcec7,70c217b8-ddf0-4b7c-80b0-f5a76dbbcec7,1,0,74e3e5c4-7dec-4fde-975b-01e7f4002a87,74e3e5c4-7dec-4fde-975b-01e7f4002a87,1,0,689b382f-308e-4558-817c-819ceb59f61e,689b382f-308e-4558-817c-819ceb59f61e,1,0,ed96d8d2-3164-4a85-8408-06d9a1f0c2ce,ed96d8d2-3164-4a85-8408-06d9a1f0c2ce,1,0,2482e800-50c9-4c7c-909f-18ba2e30ff31,2482e800-50c9-4c7c-909f-18ba2e30ff31,1,0,fdb20bf0-6dc5-4ce6-acdc-4def1cc23a67,fdb20bf0-6dc5-4ce6-acdc-4def1cc23a67,1,0,b528d506-be3f-47f2-880b-af7093c71649,b528d506-be3f-47f2-880b-af7093c71649,1,0,7f3f55d5-b1f5-4b6b-b189-ff5715341489,7f3f55d5-b1f5-4b6b-b189-ff5715341489,1,0,5a32d342-8b80-4069-98c3-cf392f473b06,5a32d342-8b80-4069-98c3-cf392f473b06,1,0,888c5a1f-5329-40da-9102-eac26657a7d9,888c5a1f-5329-40da-9102-eac26657a7d9,1,0,0b2c1689-22ba-4ed6-80f3-10475f11db1a,0b2c1689-22ba-4ed6-80f3-10475f11db1a,1,0,46bbfede-5b4d-44fc-90ec-f6f3598340c4,46bbfede-5b4d-44fc-90ec-f6f3598340c4,1,0,acc6358f-be29-4931-8ed2-b769a48cee08,acc6358f-be29-4931-8ed2-b769a48cee08,1,0,51c58d33-32f7-401a-84d4-5a942129fbd5,51c58d33-32f7-401a-84d4-5a942129fbd5,1,0,07d5174e-8422-471f-a435-bf51d5af1bf0,07d5174e-8422-471f-a435-bf51d5af1bf0,1,0,e58672f5-84c9-462f-b5a6-7f15a6f2f797,e58672f5-84c9-462f-b5a6-7f15a6f2f797,1,0,4fbb189a-ecf0-483f-a904-0c34b1c23433,4fbb189a-ecf0-483f-a904-0c34b1c23433,1,0,2a34c9e8-eb4f-4600-988e-594ac7399abc,2a34c9e8-eb4f-4600-988e-594ac7399abc,1,0,256618cc-0956-4cda-9691-e4ced68a791f,256618cc-0956-4cda-9691-e4ced68a791f,1,0,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,1,0,4b9771a7-b924-4e61-8468-4633e3c54706,4b9771a7-b924-4e61-8468-4633e3c54706,1,0,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,1,0,667de710-cee5-4a97-8434-641d199f3b68,667de710-cee5-4a97-8434-641d199f3b68,1,0,e9a2320b-71a1-4974-8b5a-1990062ec7df,e9a2320b-71a1-4974-8b5a-1990062ec7df,1,0,2e459a7c-c448-4db4-ae21-e59646527030,2e459a7c-c448-4db4-ae21-e59646527030,1,0,891194d9-9f02-4b22-89cd-941181c83ecb,891194d9-9f02-4b22-89cd-941181c83ecb,1,0,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,a4d3b738-9ae3-46a9-ac21-7ac3d081c727,1,0,f6e85eeb-d81b-4526-9a33-ab77bd447236,f6e85eeb-d81b-4526-9a33-ab77bd447236,1,0,470e37fe-d149-4007-b397-12fc84f93041,470e37fe-d149-4007-b397-12fc84f93041,1,0,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,1,0,7175cfa0-885c-4807-98ec-af255dcd55d9,7175cfa0-885c-4807-98ec-af255dcd55d9,1,0,f5b66759-8102-4cba-a3fd-ee96db5bc809,f5b66759-8102-4cba-a3fd-ee96db5bc809,1,0,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,af6bccbb-a6cb-41ee-bc4e-f2d6a5e0f419,1,0,d08679db-f83f-476e-b8c4-f3f52c3cf6fd,d08679db-f83f-476e-b8c4-f3f52c3cf6fd,1,0,fad0898f-5769-46ab-bc5e-301924b851a0,fad0898f-5769-46ab-bc5e-301924b851a0,1,0,e0227e4b-be22-4614-8980-5d573fae705d,e0227e4b-be22-4614-8980-5d573fae705d,1,0,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,7a7b7882-a4c1-40c8-a807-cb2d71d054cc,1,0,6f36007b-04dc-4007-abf7-e20fbd126b97,6f36007b-04dc-4007-abf7-e20fbd126b97,1,0,791dbdee-56f6-4fe3-ada4-965c9111d69e,791dbdee-56f6-4fe3-ada4-965c9111d69e,1,0,66ef1631-277b-4c22-99d7-1434b4dbbb3f,66ef1631-277b-4c22-99d7-1434b4dbbb3f,1,0,aa6444a8-6c17-4207-a623-9b734e08e30e,aa6444a8-6c17-4207-a623-9b734e08e30e,1,0,898535ff-50cd-464a-aadc-5e4f9de15b04,898535ff-50cd-464a-aadc-5e4f9de15b04,1,0,385e209d-65aa-43b1-8591-f92544882740,385e209d-65aa-43b1-8591-f92544882740,1,0,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,1,0,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,1,0,737f6f1b-9ffc-4916-b378-7321eab1f886,737f6f1b-9ffc-4916-b378-7321eab1f886,1,0,8381bc76-0e0f-4196-9911-ec05730cb1c9,8381bc76-0e0f-4196-9911-ec05730cb1c9,1,0,01dedf5b-2cce-4d24-81ea-2e3af82f5794,01dedf5b-2cce-4d24-81ea-2e3af82f5794,1,0,771a1900-46be-49fe-a02d-584780de8363,771a1900-46be-49fe-a02d-584780de8363,1,0,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,1,0,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,1,0,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,1,0,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,1,0,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,1,0,ef257b20-da10-4cda-8b9d-7de2d68a2f71,ef257b20-da10-4cda-8b9d-7de2d68a2f71,1,0,de0d41b7-acc0-4ebc-8933-d6b5ad351860,de0d41b7-acc0-4ebc-8933-d6b5ad351860,1,0,acd30e63-68dc-4ab2-a6fe-16eb69d09271,acd30e63-68dc-4ab2-a6fe-16eb69d09271,1,0,04013c34-8d59-4f87-b272-732d5a6dd675,04013c34-8d59-4f87-b272-732d5a6dd675,1,0,f9df9b6b-5051-46ef-bb1f-1974f41054a7,f9df9b6b-5051-46ef-bb1f-1974f41054a7,1,0,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,1,0,1a354069-07ea-40e0-bbac-e1b6232750c2,1a354069-07ea-40e0-bbac-e1b6232750c2,1,0,df31548b-0b8e-412b-999a-761970ae3c23,df31548b-0b8e-412b-999a-761970ae3c23,1,0,05135747-43e7-4b61-bc30-57b3289ea923,05135747-43e7-4b61-bc30-57b3289ea923,1,0,6d63728d-3384-4131-b890-1b82d14a04b7,6d63728d-3384-4131-b890-1b82d14a04b7,1,0,13b3c973-6be3-4898-89d5-20852cd14e46,13b3c973-6be3-4898-89d5-20852cd14e46,1,0,d978d078-4fd8-40b9-90c2-047cdaf94cba,d978d078-4fd8-40b9-90c2-047cdaf94cba,1,0,8640eacd-e6f9-4b0b-8511-c6ad2336ec6c,8640eacd-e6f9-4b0b-8511-c6ad2336ec6c,1,0,b374e22f-17f3-4186-af1f-fa35d1a7e559,b374e22f-17f3-4186-af1f-fa35d1a7e559,1,0,53555ee4-f99d-4935-a884-89313aa3ca6a,53555ee4-f99d-4935-a884-89313aa3ca6a,1,0,f38bb317-8a59-4786-be76-e1d4e534628d,f38bb317-8a59-4786-be76-e1d4e534628d,1,0,25741b39-1c6b-4851-8584-9711d25ef05a,25741b39-1c6b-4851-8584-9711d25ef05a,1,0,f4554046-493e-4960-94df-0a8b9d02f474,f4554046-493e-4960-94df-0a8b9d02f474,1,0,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,06abad33-2d69-4e8b-a16c-8aa0d4422d5a,1,0,9222a6c0-b785-4811-bfb6-44ac44a55925,9222a6c0-b785-4811-bfb6-44ac44a55925,1,0,ea84021d-2431-44ad-a446-f1fb979c9e96,ea84021d-2431-44ad-a446-f1fb979c9e96,1,0,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,d86acdeb-fa70-4d1c-bd0c-1b4ea30c03dd,1,0,8fa21575-177f-4b7c-94b5-dfeefe737cb4,8fa21575-177f-4b7c-94b5-dfeefe737cb4,1,0,6da034af-0481-4a3c-aff9-c50ced6f21d4,6da034af-0481-4a3c-aff9-c50ced6f21d4,1,0,d07016c8-7d97-42cd-865b-85b49075adfb,d07016c8-7d97-42cd-865b-85b49075adfb,1,0,491a2337-1bf9-45c1-8ae6-95605ef41992,491a2337-1bf9-45c1-8ae6-95605ef41992,1,0,c3f2a760-610a-40e0-945b-1f9f6369444d,c3f2a760-610a-40e0-945b-1f9f6369444d,1,0,9202335d-50bb-4282-9438-24c7fb9cf637,9202335d-50bb-4282-9438-24c7fb9cf637,1,0,a62906e5-27f8-4e72-8769-9a3eed6997d7,a62906e5-27f8-4e72-8769-9a3eed6997d7,1,0,6c5d0ac3-6086-434c-812b-1c1158ecc574,6c5d0ac3-6086-434c-812b-1c1158ecc574,1,0,783536d7-c0db-44c9-96e8-58b57804d7c8,783536d7-c0db-44c9-96e8-58b57804d7c8,1,0,a8295435-c2c4-4aff-874b-7412556aa76d,a8295435-c2c4-4aff-874b-7412556aa76d,1,0,f6c4e24b-172b-4ba3-8e3e-988306ade660,f6c4e24b-172b-4ba3-8e3e-988306ade660,1,0,9baab24c-a5a3-46f4-ad17-a28d4a49f851,9baab24c-a5a3-46f4-ad17-a28d4a49f851,1,0,d1952319-0e42-4684-a386-fbe7c24526c2,d1952319-0e42-4684-a386-fbe7c24526c2,1,0,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,1,0,83b47a9d-d44b-4c40-becd-df74f9cb2e91,83b47a9d-d44b-4c40-becd-df74f9cb2e91,1,0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,1,0,86e2a2eb-160f-4e93-a449-b2f726286d1b,86e2a2eb-160f-4e93-a449-b2f726286d1b,1,0,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,1,0,364184c2-ec71-44be-b40c-ba719b4ab0e1,364184c2-ec71-44be-b40c-ba719b4ab0e1,1,0,7ef46c54-ec0c-4211-a750-e5949956b593,7ef46c54-ec0c-4211-a750-e5949956b593,1,0,04823681-875e-459a-b3cf-051c89527f38,04823681-875e-459a-b3cf-051c89527f38,1,0,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,1,0,38265f08-3301-40d1-b630-a319c983e826,38265f08-3301-40d1-b630-a319c983e826,1,0,5175c496-bac7-4c57-9628-793b727aecd0,5175c496-bac7-4c57-9628-793b727aecd0,1,0,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1,0,fc42df4a-93f0-461f-acfe-fea09158030f,fc42df4a-93f0-461f-acfe-fea09158030f,1,0,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,1,0,6d002aef-00c9-4069-80df-153151218831,6d002aef-00c9-4069-80df-153151218831,1,0,4fec3a6c-5a99-4763-aa07-d5de8712559e,4fec3a6c-5a99-4763-aa07-d5de8712559e,1,0,968a1202-d271-43e0-bfd4-d38e49ceadd4,968a1202-d271-43e0-bfd4-d38e49ceadd4,1,0,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,1,0,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,1,0,ea61e442-273e-4ce4-a806-8090893729ba,ea61e442-273e-4ce4-a806-8090893729ba,1,0,aef03c0b-2846-43b7-b382-9a51ec783e85,aef03c0b-2846-43b7-b382-9a51ec783e85,1,0,e7100f2b-d169-4635-ab87-7a2225ff12ee,e7100f2b-d169-4635-ab87-7a2225ff12ee,1,0,c0804a4a-64d5-457f-a542-8e5badccbdf1,c0804a4a-64d5-457f-a542-8e5badccbdf1,1,0,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,1,0,4a2d2790-debf-4dc2-8216-878d8808d161,4a2d2790-debf-4dc2-8216-878d8808d161,1,0,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,1,0,4507a92e-abb6-4329-88b2-3429bc694bc6,4507a92e-abb6-4329-88b2-3429bc694bc6,1,0,2694c1b4-536b-4187-adf6-0f8757aaae76,2694c1b4-536b-4187-adf6-0f8757aaae76,1,0,e523f88b-b3de-476e-a3cc-592970492dec,e523f88b-b3de-476e-a3cc-592970492dec,1,0,0e2107e2-8648-4b2e-9dfb-c23b1ff5b007,0e2107e2-8648-4b2e-9dfb-c23b1ff5b007,1,0,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,1,0,ea0843f4-60fb-4d44-abf4-0021867c636b,ea0843f4-60fb-4d44-abf4-0021867c636b,1,0,59aadc03-adbc-481f-89bc-d7f391789522,59aadc03-adbc-481f-89bc-d7f391789522,1,0,254f6ccd-0451-4231-91c9-4abe57b647be,254f6ccd-0451-4231-91c9-4abe57b647be,1,0,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1,0,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0dcc537b-76b3-4e73-b060-6cbdcf6345db,1,0,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,1,0,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,1,0,7601fa7e-079a-4347-abea-e161b2d00783,7601fa7e-079a-4347-abea-e161b2d00783,1,0,ee84cb40-f82d-4558-91be-229d68ad9f4a,ee84cb40-f82d-4558-91be-229d68ad9f4a,1,0,101a7eff-9556-4165-879a-a7c8a852e236,101a7eff-9556-4165-879a-a7c8a852e236,1,0,01775932-3603-4efc-9235-abdb97490dea,01775932-3603-4efc-9235-abdb97490dea,1,0,7637844b-4059-4f8a-8436-b4f4e8cb4f74,7637844b-4059-4f8a-8436-b4f4e8cb4f74,1,0,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,1,0,0ee5b788-61dc-464b-86da-f985df7704b6,0ee5b788-61dc-464b-86da-f985df7704b6,1,0,1c2da2ac-e797-11e6-0489-a8667f21fde4,1c2da2ac-e797-11e6-0489-a8667f21fde4,1,0,2375c6a8-9799-4b7c-a48d-091a90c67693,2375c6a8-9799-4b7c-a48d-091a90c67693,1,0,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,1,0,df7892fe-e796-11e6-0489-a8667f21fde4,df7892fe-e796-11e6-0489-a8667f21fde4,1,0,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,1,0,63c6522f-be04-422a-b4f4-0f55f58b09a8,63c6522f-be04-422a-b4f4-0f55f58b09a8,1,0,be919dc1-a377-43e1-82e6-ce946cabdd55,be919dc1-a377-43e1-82e6-ce946cabdd55,1,0,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,1,0,9ded532e-9e60-4895-a4c5-4ea6697aa83c,9ded532e-9e60-4895-a4c5-4ea6697aa83c,1,0,106c5159-ffc7-4059-b3e3-acf74326a44f,106c5159-ffc7-4059-b3e3-acf74326a44f,1,0,d39fd717-1a69-4fd3-889e-4fa9abefea1c,d39fd717-1a69-4fd3-889e-4fa9abefea1c,1,0,fae8b26c-e796-11e6-0489-a8667f21fde4,fae8b26c-e796-11e6-0489-a8667f21fde4,1,0,5b85e6df-7493-4201-97ad-2aea14de6006,5b85e6df-7493-4201-97ad-2aea14de6006,1,0,061e6c0f-ba52-40ec-96ad-2eba3eee3097,061e6c0f-ba52-40ec-96ad-2eba3eee3097,1,0,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,1,0,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,1,0,4840753b-e2e1-4e67-b35f-2f5eab7754f5,4840753b-e2e1-4e67-b35f-2f5eab7754f5,1,0,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,1,0,6ffd9c17-d90b-4d19-b337-0fbc2c717557,6ffd9c17-d90b-4d19-b337-0fbc2c717557,1,0,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,1,0,3bb83275-7a0e-420f-8c6b-028038f11a8c,3bb83275-7a0e-420f-8c6b-028038f11a8c,1,0,e1950a23-f6e7-48af-b78a-77aa61f08ece,e1950a23-f6e7-48af-b78a-77aa61f08ece,1,0,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1,0,0a7d282e-45bb-4a87-b325-1659519867fb,0a7d282e-45bb-4a87-b325-1659519867fb,1,0,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,1,0,5d726fa3-bde0-4d97-a577-415857bbb5c1,5d726fa3-bde0-4d97-a577-415857bbb5c1,1,0,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,1,0,49068231-202c-4ac6-a39a-69207cb597dd,49068231-202c-4ac6-a39a-69207cb597dd,1,0,5a470575-e012-42ad-9ad7-53930a8e843f,5a470575-e012-42ad-9ad7-53930a8e843f,1,0,5872d4ed-6503-422d-bcf9-63a8df3e777d,5872d4ed-6503-422d-bcf9-63a8df3e777d,1,0,e21cda29-2579-485e-a207-20b76f719c80,e21cda29-2579-485e-a207-20b76f719c80,1,0,1b232a57-2833-42c6-b318-38dae2af1ab2,1b232a57-2833-42c6-b318-38dae2af1ab2,1,0,007ade8c-b102-408b-b877-b531e046560b,007ade8c-b102-408b-b877-b531e046560b,1,0,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,1,0,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,1,0,eb69c41a-392d-43bb-9b67-a0adcb651b1e,eb69c41a-392d-43bb-9b67-a0adcb651b1e,1,0,93b01c88-48a2-4753-b443-0e9892395a8f,93b01c88-48a2-4753-b443-0e9892395a8f,1,0,0b7f8e05-bb34-47cc-9775-04362e814316,0b7f8e05-bb34-47cc-9775-04362e814316,1,0,e71e0297-3709-4247-933e-18a6350cbf39,e71e0297-3709-4247-933e-18a6350cbf39,1,0,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0b32e372-c6ad-4dda-acd1-8b5d58537d37,1,0,602dac6f-abe6-407a-92d3-7f1613e5dda6,602dac6f-abe6-407a-92d3-7f1613e5dda6,1,0,db03a88b-2804-45c2-9089-7ddb87ef2f18,db03a88b-2804-45c2-9089-7ddb87ef2f18,1,0,df6417d1-c722-4a87-a543-5d2c31795b20,df6417d1-c722-4a87-a543-5d2c31795b20,1,0,526a85c9-3a8d-4044-adb9-fd0689c70601,526a85c9-3a8d-4044-adb9-fd0689c70601,1,0,c4203772-580c-4db1-9bde-8925faa90688,c4203772-580c-4db1-9bde-8925faa90688,1,0,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,f64a91c4-f5cb-4e8e-8387-9f242ce6de44,1,0,dc024d33-1715-40da-9c00-443d25a31ebc,dc024d33-1715-40da-9c00-443d25a31ebc,1,0,d029aa93-fea4-40e4-8cfb-2dc96544829b,d029aa93-fea4-40e4-8cfb-2dc96544829b,1,0,f8f585d1-01a0-4892-8852-c692ffaa1344,f8f585d1-01a0-4892-8852-c692ffaa1344,1,0,35c237a7-71e1-415c-809d-e99babee4e0e,35c237a7-71e1-415c-809d-e99babee4e0e,1,0,2116119f-7637-45a1-8e59-c9149619413b,2116119f-7637-45a1-8e59-c9149619413b,1,0,43882a2c-b625-4cfb-8220-3d12bfee09e4,43882a2c-b625-4cfb-8220-3d12bfee09e4,1,0,90639fdb-144d-495a-a097-76c45107fc97,90639fdb-144d-495a-a097-76c45107fc97,1,0,c076b7fd-7e17-4811-82e7-047e2bf43bb0,c076b7fd-7e17-4811-82e7-047e2bf43bb0,1,0,84b28732-9001-4798-b613-35ea65c26cce,84b28732-9001-4798-b613-35ea65c26cce,1,0,77d8285f-a87b-4a4e-b6ee-85bcd54dee12,77d8285f-a87b-4a4e-b6ee-85bcd54dee12,1,0,f2ec9416-3830-4607-90f3-f77fc53c9c70,f2ec9416-3830-4607-90f3-f77fc53c9c70,1,0,3057de81-eb41-4161-9dc2-5445699906af,3057de81-eb41-4161-9dc2-5445699906af,1,0,984ed6c0-e25b-46ff-9b3c-6bc0370071da,984ed6c0-e25b-46ff-9b3c-6bc0370071da,1,0,f660bf92-7de1-4a22-9cea-777069e4679d,f660bf92-7de1-4a22-9cea-777069e4679d,1,0,54f3fbe7-ac93-44f6-ba6e-37cb99f3569c,54f3fbe7-ac93-44f6-ba6e-37cb99f3569c,1,0,20feb794-eb05-46a6-90e7-ca4e2376d7b2,20feb794-eb05-46a6-90e7-ca4e2376d7b2,1,0,8deb4f57-18fc-4db0-ad0f-82d60af3d80b,8deb4f57-18fc-4db0-ad0f-82d60af3d80b,1,0,2f484aa4-452a-46af-a707-a5a6917bc0db,2f484aa4-452a-46af-a707-a5a6917bc0db,1,0,fd6ff934-6f11-4182-b0cb-6926902d33c0,fd6ff934-6f11-4182-b0cb-6926902d33c0,1,0,315af891-2075-4833-a404-6c0f2004ee53,315af891-2075-4833-a404-6c0f2004ee53,1,0,5725db77-bfbf-4d85-9565-163b309a53ee,5725db77-bfbf-4d85-9565-163b309a53ee,1,0,99a7142c-b3c7-4221-abf8-6831a3cbc16e,99a7142c-b3c7-4221-abf8-6831a3cbc16e,1,0,d367a1a1-5a54-4bf9-96c7-d55667e2fb16,d367a1a1-5a54-4bf9-96c7-d55667e2fb16,1,0,2e09abe1-0934-42ae-970f-5e001c35c31a,2e09abe1-0934-42ae-970f-5e001c35c31a,1,0,587d48a3-5627-4481-b13e-c22740b57d8a,587d48a3-5627-4481-b13e-c22740b57d8a,1,0,1f3e3089-1e04-4147-8ece-aa96a76467dd,1f3e3089-1e04-4147-8ece-aa96a76467dd,1,0,22a213b5-ed72-4181-8ff8-89f860c87aa1,22a213b5-ed72-4181-8ff8-89f860c87aa1,1,0,4c56cbff-653e-4f16-b702-c77190d7eb7f,4c56cbff-653e-4f16-b702-c77190d7eb7f,1,0,172ff335-c7ae-4905-b705-2a1475b95713,172ff335-c7ae-4905-b705-2a1475b95713,1,0,db4c311d-ee62-4d47-ac31-5a20cadb7ed1,db4c311d-ee62-4d47-ac31-5a20cadb7ed1,1,0,1d852dc0-90c9-4568-84f9-b1d822573b6b,1d852dc0-90c9-4568-84f9-b1d822573b6b,1,0,24f85dbd-59be-4b8d-bea8-7ff8ddb7486a,24f85dbd-59be-4b8d-bea8-7ff8ddb7486a,1,0,c997f56c-ef9c-434e-bc4e-7fc5f885aaba,c997f56c-ef9c-434e-bc4e-7fc5f885aaba,1,0,37c8f5e1-3513-47f8-896d-a54d11b83dcd,37c8f5e1-3513-47f8-896d-a54d11b83dcd,1,0,9e07733c-39f0-491b-91e1-bf2782d957dd,9e07733c-39f0-491b-91e1-bf2782d957dd,1,0,cc584a1d-dc91-4693-a5c9-6e8c6607e9d8,cc584a1d-dc91-4693-a5c9-6e8c6607e9d8,1,0,5902d979-1235-4d5a-ace7-93261bdeb725,5902d979-1235-4d5a-ace7-93261bdeb725,1,0,5a090286-7969-44c9-815b-fc58aeb5d8d3,5a090286-7969-44c9-815b-fc58aeb5d8d3,1,0,8e87cf35-af54-4fa2-9428-460b765b282b,8e87cf35-af54-4fa2-9428-460b765b282b,1,0,73380bb1-bee3-4b73-a3df-1dbea99011d2,73380bb1-bee3-4b73-a3df-1dbea99011d2,1,0,8be29533-38de-413d-b420-7dac2e80af6c,8be29533-38de-413d-b420-7dac2e80af6c,1,0,82a77018-8e38-41dd-9d1f-3130bc29a707,82a77018-8e38-41dd-9d1f-3130bc29a707,1,0,4d75aaef-532e-4ed3-8153-083f04f05cc1,4d75aaef-532e-4ed3-8153-083f04f05cc1,1,0,3854a0ba-e156-4ba3-a301-b1a41ac386c4,3854a0ba-e156-4ba3-a301-b1a41ac386c4,1,0,f8136f59-ef0c-4c0f-8207-f7a4000e4f0c,f8136f59-ef0c-4c0f-8207-f7a4000e4f0c,1,0,c2321963-cd86-45ec-b323-3fdb5932da3a,c2321963-cd86-45ec-b323-3fdb5932da3a,1,0,d5af38bf-6261-4177-8f74-998a85f0ef39,d5af38bf-6261-4177-8f74-998a85f0ef39,1,0,42bbd9f7-ef72-440f-9eb1-fcb3bdc1d91e,42bbd9f7-ef72-440f-9eb1-fcb3bdc1d91e,1,0,c6a4d03d-f3b2-449c-8a2b-deb542dd2c99,c6a4d03d-f3b2-449c-8a2b-deb542dd2c99,1,0,4b714d9c-26f4-46e8-ac79-471522b3853b,4b714d9c-26f4-46e8-ac79-471522b3853b,1,0,411489de-f907-4d60-a776-64bb0aa12a0e,411489de-f907-4d60-a776-64bb0aa12a0e,1,0,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,1,0,9c47670e-9eb9-49ec-876c-cd545aaa093c,9c47670e-9eb9-49ec-876c-cd545aaa093c,1,0,f57e74e6-75e8-4136-911e-86793036a077,f57e74e6-75e8-4136-911e-86793036a077,1,0,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,1,0,3ba8c378-ef3d-4646-90b3-6d8078aa623e,3ba8c378-ef3d-4646-90b3-6d8078aa623e,1,0,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,1,0,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,5ac38b5a-92e5-47eb-b956-24d9f010cb9f,1,0,d61ca454-505b-4fd6-be15-d7ed948a5ff6,d61ca454-505b-4fd6-be15-d7ed948a5ff6,1,0,2dd7eb87-8130-425a-be13-85235508cde6,2dd7eb87-8130-425a-be13-85235508cde6,1,0,8a62c997-4fda-4464-90bd-ab719161949f,8a62c997-4fda-4464-90bd-ab719161949f,1,0,28af52dd-3144-428b-956d-b6f27863ec4a,28af52dd-3144-428b-956d-b6f27863ec4a,1,0,8ac94328-2300-4681-9c35-fd7e2f830310,8ac94328-2300-4681-9c35-fd7e2f830310,1,0,da0ee165-1917-466b-ac5c-16c28e2318bb,da0ee165-1917-466b-ac5c-16c28e2318bb,1,0,4868cb2e-0892-42bc-9de1-73cb8a15a96f,4868cb2e-0892-42bc-9de1-73cb8a15a96f,1,0,e8b80879-33b3-4c45-ad68-1acabcf91faf,e8b80879-33b3-4c45-ad68-1acabcf91faf,1,0,4a87fafc-7ca7-478e-bb31-358c2b85fa92,4a87fafc-7ca7-478e-bb31-358c2b85fa92,1,0,239601eb-e8de-4d58-a32a-01ee52f6e698,239601eb-e8de-4d58-a32a-01ee52f6e698,1,0,11370667-bec5-4a2d-8aa1-97f4d795718f,11370667-bec5-4a2d-8aa1-97f4d795718f,1,0,2032162d-fbb5-4e6a-be72-cda79869b9ff,2032162d-fbb5-4e6a-be72-cda79869b9ff,1,0,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,1,0,10543f9a-4e3f-427a-b36a-9c66709dd6fb,10543f9a-4e3f-427a-b36a-9c66709dd6fb,1,0,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,1,0,96ab5424-7be1-416d-b74d-d0c815726b1f,96ab5424-7be1-416d-b74d-d0c815726b1f,1,0,3714e794-ddef-4ad9-a933-6130bbc84545,3714e794-ddef-4ad9-a933-6130bbc84545,1,0,282b089c-7411-40d6-9a0a-ceaf6abb5586,282b089c-7411-40d6-9a0a-ceaf6abb5586,1,0,678188aa-76e7-49bc-a4be-1c55ccd625b1,678188aa-76e7-49bc-a4be-1c55ccd625b1,1,0,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,1,0,b3415b4a-d8de-4536-aa4b-82e75fd986ee,b3415b4a-d8de-4536-aa4b-82e75fd986ee,1,0,acc996ab-672a-4602-b7ad-8eee83557e61,acc996ab-672a-4602-b7ad-8eee83557e61,1,0,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,1,0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,1,0,97745768-ed35-44f1-beba-abb8b28a29ae,97745768-ed35-44f1-beba-abb8b28a29ae,1,0,69364942-bcd1-4b06-9b57-fa59b4e7c552,69364942-bcd1-4b06-9b57-fa59b4e7c552,1,0,ab201c5f-4134-42cf-a528-c1c4df02f2d7,ab201c5f-4134-42cf-a528-c1c4df02f2d7,1,0,303fb7b5-6a23-40ea-ae12-b54f4ebae026,303fb7b5-6a23-40ea-ae12-b54f4ebae026,1,0,634cd26b-78f1-4446-8aad-b96ed16e5329,634cd26b-78f1-4446-8aad-b96ed16e5329,1,0,d8e62f1a-92ca-4971-9609-e79da798c083,d8e62f1a-92ca-4971-9609-e79da798c083,1,0,61892a62-9381-401d-af31-9073ef2509fb,61892a62-9381-401d-af31-9073ef2509fb,1,0,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,1,0,d5e1806b-9827-40ab-9cfa-23c22456d137,d5e1806b-9827-40ab-9cfa-23c22456d137,1,0,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,1,0,d24170d7-5477-4ec8-acd2-0de8bd2067d6,d24170d7-5477-4ec8-acd2-0de8bd2067d6,1,0,f047da82-7574-4da4-b54e-480195280a11,f047da82-7574-4da4-b54e-480195280a11,1,0,a469f018-da26-485f-87c3-f580321a34f0,a469f018-da26-485f-87c3-f580321a34f0,1,0,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,adcb0dca-d810-461e-8f45-1d3cd6ffad4d,1,0,388f7571-8f1b-45c5-a8b8-45d648f2f5dd,388f7571-8f1b-45c5-a8b8-45d648f2f5dd,1,0,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,9e16edb6-d841-48fa-bfe1-f9aabdcf9e46,1,0,628de771-c19c-4474-989f-8fb6cd7756a2,628de771-c19c-4474-989f-8fb6cd7756a2,1,0,6b0ddefa-ee70-4b27-989f-e23c734ab943,6b0ddefa-ee70-4b27-989f-e23c734ab943,1,0,ee873280-28ea-41fb-af52-c10c2018cbe4,ee873280-28ea-41fb-af52-c10c2018cbe4,1,0,6789e57b-1293-442c-97d0-b8007367602e,6789e57b-1293-442c-97d0-b8007367602e,1,0,0f193c89-b664-448e-bed3-2147430367f7,0f193c89-b664-448e-bed3-2147430367f7,1,0,4c9b2506-75a8-47d3-a5d5-d946088ba14a,4c9b2506-75a8-47d3-a5d5-d946088ba14a,1,0,36eacaa1-2efd-49c0-82de-2f8972535bf2,36eacaa1-2efd-49c0-82de-2f8972535bf2,1,0,c35a643d-fe3a-4293-93c0-074fa68a31e3,c35a643d-fe3a-4293-93c0-074fa68a31e3,1,0,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,9f7b9fd8-4bdd-4492-abf7-09b3f7f23e16,1,0,72ee9a03-a320-4e60-be04-0ee813ea567f,72ee9a03-a320-4e60-be04-0ee813ea567f,1,0,f6f52cc8-23a3-4402-b1eb-0e41584c802a,f6f52cc8-23a3-4402-b1eb-0e41584c802a,1,0,8398e065-8b4b-4901-b057-2a048776bafe,8398e065-8b4b-4901-b057-2a048776bafe,1,0,073c56ca-bf45-422d-957a-f9c57aeee4d0,073c56ca-bf45-422d-957a-f9c57aeee4d0,1,0,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,d73e084f-9201-40c8-8ad4-f61b6cbb47c9,1,0,52f065fe-556a-47cd-82b1-c56d7894df30,52f065fe-556a-47cd-82b1-c56d7894df30,1,0,186efec4-1343-4234-a9b6-c8d8096faf76,186efec4-1343-4234-a9b6-c8d8096faf76,1,0,68598d98-0c59-4cda-b0b2-6901d3aff88b,68598d98-0c59-4cda-b0b2-6901d3aff88b,1,0,219c1375-f26e-4698-aa82-4b9d735df783,219c1375-f26e-4698-aa82-4b9d735df783,1,0,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,ff5121c1-7f11-48cd-a9df-3588cf9f6d21,1,0,32012b27-1b43-49be-b9af-df0c877e7a4c,32012b27-1b43-49be-b9af-df0c877e7a4c,1,0,e97d5152-9e58-4a91-a691-b4d358f1c89d,e97d5152-9e58-4a91-a691-b4d358f1c89d,1,0,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1,0,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,1,0,296c478b-4103-46cb-9d14-97f59034ffd4,296c478b-4103-46cb-9d14-97f59034ffd4,1,0,fb918a68-f86d-46c0-9078-61d2b32b5aef,fb918a68-f86d-46c0-9078-61d2b32b5aef,1,0,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,1,0,1ddfc773-4f3c-4764-978e-585aab4666de,1ddfc773-4f3c-4764-978e-585aab4666de,1,0,e424d122-1dbb-4545-975c-177997129f2e,e424d122-1dbb-4545-975c-177997129f2e,1,0,c83bc626-dfdd-4451-92b0-b53eed40f534,c83bc626-dfdd-4451-92b0-b53eed40f534,1,0,7b9b1d11-4f78-4113-8fca-1a3a30953aef,7b9b1d11-4f78-4113-8fca-1a3a30953aef,1,0,7f84cb85-c3e4-4b53-b829-3b1e216f978a,7f84cb85-c3e4-4b53-b829-3b1e216f978a,1,0,7e621ecc-7d2b-42bf-a502-f8e59de56b63,7e621ecc-7d2b-42bf-a502-f8e59de56b63,1,0,798fd445-d02e-4e97-890a-0283f33317cf,798fd445-d02e-4e97-890a-0283f33317cf,1,0,095583ca-010d-43ad-8c7a-8938fa4cb761,095583ca-010d-43ad-8c7a-8938fa4cb761,1,0,178d210c-e847-4805-a8d4-31acdf4983af,178d210c-e847-4805-a8d4-31acdf4983af,1,0,aa214d9f-23b1-4996-8a43-9010dceeb53d,aa214d9f-23b1-4996-8a43-9010dceeb53d,1,0,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,1,0,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,1,0,d9d103bd-1dd6-48a9-8869-6c8485705393,d9d103bd-1dd6-48a9-8869-6c8485705393,1,0,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,1,0,ff0e8487-bdbf-4b21-877e-00008c81bc09,ff0e8487-bdbf-4b21-877e-00008c81bc09,1,0,39c9f8ac-56a0-4057-8359-7228bf97184a,39c9f8ac-56a0-4057-8359-7228bf97184a,1,0,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,1,0,2c0dd892-1d3e-4497-850b-080bdb9c59d8,2c0dd892-1d3e-4497-850b-080bdb9c59d8,1,0,3b727d49-c9ed-4d9e-af61-c13b9a170c75,3b727d49-c9ed-4d9e-af61-c13b9a170c75,1,0,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1,0,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,1,0,37bde288-8e02-4127-bd80-de8ae7590a14,37bde288-8e02-4127-bd80-de8ae7590a14,1,0,a9b8e517-78cd-4428-b2fc-9e16af0069d7,a9b8e517-78cd-4428-b2fc-9e16af0069d7,1,0,5c592024-c009-4674-bbb8-283669e673ef,5c592024-c009-4674-bbb8-283669e673ef,1,0,e76f16b9-77a0-4033-90d0-6e04e4494747,e76f16b9-77a0-4033-90d0-6e04e4494747,1,0,cfb221fc-8639-4e15-9a78-f7837d657a99,cfb221fc-8639-4e15-9a78-f7837d657a99,1,0,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,1,0,022147c1-1ebe-4c8d-b367-4c47115b101d,022147c1-1ebe-4c8d-b367-4c47115b101d,1,0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,1,0,fca6b230-a38e-4791-9cc5-3d215f79dc6f,fca6b230-a38e-4791-9cc5-3d215f79dc6f,1,0,04e87de4-940a-4533-8c81-8f145b201dc0,04e87de4-940a-4533-8c81-8f145b201dc0,1,0,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,1,0,fa488af9-a5ec-47d8-8661-fa5058a60a6b,fa488af9-a5ec-47d8-8661-fa5058a60a6b,1,0,97cc84c6-3565-474c-a028-83acb5390446,97cc84c6-3565-474c-a028-83acb5390446,1,0,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,1,0,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,1,0,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,1,0,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1,0,b366d7eb-626c-4c0c-b4cc-c392763e6e94,b366d7eb-626c-4c0c-b4cc-c392763e6e94,1,0,4c7e24aa-726a-4595-82ad-ef1e525b14fa,4c7e24aa-726a-4595-82ad-ef1e525b14fa,1,0,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,aed2ceeb-cc0f-4bdc-bb94-2e15cd68aa96,1,0,04b5ae71-7fa4-4a64-b406-59dc603b80c5,04b5ae71-7fa4-4a64-b406-59dc603b80c5,1,0,f23a2023-f776-40db-8689-1fc3f7ebc482,f23a2023-f776-40db-8689-1fc3f7ebc482,1,0,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1,0,ab178a93-8570-43b6-ae42-f34a7cc4f359,ab178a93-8570-43b6-ae42-f34a7cc4f359,1,0,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,1,0,168e3189-2676-4cdb-bc9d-78d85df51faf,168e3189-2676-4cdb-bc9d-78d85df51faf,1,0,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,1,0,470bbff8-20d0-475c-a61a-1a09ac14c2db,470bbff8-20d0-475c-a61a-1a09ac14c2db,1,0,6ea25680-c4db-4717-9498-62420ca16970,6ea25680-c4db-4717-9498-62420ca16970,1,0,14e20d48-635e-4c52-9099-e743323fc190,14e20d48-635e-4c52-9099-e743323fc190,1,0,c37a660e-16c5-495e-9486-e61bcb693fa0,c37a660e-16c5-495e-9486-e61bcb693fa0,1,0,8f44ebad-1160-474e-a566-fb9da55ffcba,8f44ebad-1160-474e-a566-fb9da55ffcba,1,0,11cf336e-7890-4972-bf71-32d7416ff647,11cf336e-7890-4972-bf71-32d7416ff647,1,0,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,1,0,14bd3392-36cd-4ed0-8847-44375d6fb861,14bd3392-36cd-4ed0-8847-44375d6fb861,1,0,759ede7a-e832-44e6-9b11-5bfb3c507820,759ede7a-e832-44e6-9b11-5bfb3c507820,1,0,64484611-b32c-4155-a063-7df5a3f924dd,64484611-b32c-4155-a063-7df5a3f924dd,1,0,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,1,0,821b93bd-f0dd-4468-972a-d9b2b4de72f1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,1,0,56900066-90e3-40c0-b64a-8f7964a4dfc1,56900066-90e3-40c0-b64a-8f7964a4dfc1,1,0,56f0c4d6-9b13-486a-9586-05e657dca8be,56f0c4d6-9b13-486a-9586-05e657dca8be,1,0,c795c0d3-6a0d-4311-9821-df320663727e,c795c0d3-6a0d-4311-9821-df320663727e,1,0,512b8d89-8798-4549-9e79-b9c3f7d9098f,512b8d89-8798-4549-9e79-b9c3f7d9098f,1,0,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,1,0,7f356abf-9045-4a76-89f3-8b52d467122a,7f356abf-9045-4a76-89f3-8b52d467122a,1,0,625a61ac-4ad0-4b31-aa67-9f864154b9c4,625a61ac-4ad0-4b31-aa67-9f864154b9c4,1,0,51fa8d01-44a1-4e75-9b04-6a2504972f08,51fa8d01-44a1-4e75-9b04-6a2504972f08,1,0,73dae482-a1ee-4c57-8859-2dd8e8635a49,73dae482-a1ee-4c57-8859-2dd8e8635a49,1,0,e4ea640f-e3a4-44ad-b17d-51f32136372e,e4ea640f-e3a4-44ad-b17d-51f32136372e,1,0,7dca913d-e37a-4740-8e3d-677d379605ee,7dca913d-e37a-4740-8e3d-677d379605ee,1,0,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,1,0,e62845df-704f-4ad5-b227-e0128877a814,e62845df-704f-4ad5-b227-e0128877a814,1,0,4f1393e4-9db5-43d6-b47e-caa1aad9b35c,4f1393e4-9db5-43d6-b47e-caa1aad9b35c,1,0,e62e60ea-9f0c-4a7e-869f-4639f31f826c,e62e60ea-9f0c-4a7e-869f-4639f31f826c,1,0,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,1,0,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,1,0,4cd4694f-17f8-43ba-8940-07628bd937fe,4cd4694f-17f8-43ba-8940-07628bd937fe,1,0,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,9b9e81f9-e23f-4c77-bf6f-edbce8ebabfa,1,0,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,fb5e93bb-e1ff-47a6-a362-ea94e6cbac65,1,0,7df6c94b-3cfe-4764-988e-858d733e35d9,7df6c94b-3cfe-4764-988e-858d733e35d9,1,0,8b251c7d-2d55-4734-a1da-7f1115d95080,8b251c7d-2d55-4734-a1da-7f1115d95080,1,0,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,1,0,5a8c3621-595a-4168-8bba-a7f8d499e47e,5a8c3621-595a-4168-8bba-a7f8d499e47e,1,0,fc4cfed6-e492-4420-b357-8143a8c2a41a,fc4cfed6-e492-4420-b357-8143a8c2a41a,1,0,4311a250-64af-443e-a711-93b7c41175cf,4311a250-64af-443e-a711-93b7c41175cf,1,0,804b6c57-1d7b-4927-be5b-84b7959fe55e,804b6c57-1d7b-4927-be5b-84b7959fe55e,1,0,f2655d85-79ea-4736-8f41-94a4f9b2b998,f2655d85-79ea-4736-8f41-94a4f9b2b998,1,0,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,1,0,a8eb5ed9-df99-405b-afad-eeaa98956eee,a8eb5ed9-df99-405b-afad-eeaa98956eee,1,0,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,1,0,26a1279f-91f0-4632-ad7c-21cf2f524208,26a1279f-91f0-4632-ad7c-21cf2f524208,1,0,bf751ed0-ee47-4eaf-81bd-f0da00bef343,bf751ed0-ee47-4eaf-81bd-f0da00bef343,1,0,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,1,0,1f1def7c-e0ee-4963-afea-1751bf1b812c,1f1def7c-e0ee-4963-afea-1751bf1b812c,1,0,9a4c0898-ab56-425c-8191-5ab90f4e12bf,9a4c0898-ab56-425c-8191-5ab90f4e12bf,1,0,6841ec47-7a84-441a-b975-69d089072ce7,6841ec47-7a84-441a-b975-69d089072ce7,1,0,ead4001a-0d8a-4b95-8212-2a40e5aa6659,ead4001a-0d8a-4b95-8212-2a40e5aa6659,1,0,22165c8a-2179-4cd5-b195-bd2721e9e232,22165c8a-2179-4cd5-b195-bd2721e9e232,1,0,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,1,0,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,1,0,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,1,0,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,1,0,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,1,0,9d9debfd-4a10-4f09-9d09-2aa5e058b525,9d9debfd-4a10-4f09-9d09-2aa5e058b525,1,0,fc19586c-d89c-495c-b473-6f85967ed48e,fc19586c-d89c-495c-b473-6f85967ed48e,1,0,2ac7c701-a281-4e77-a5f8-294526021e2d,2ac7c701-a281-4e77-a5f8-294526021e2d,1,0,979df549-889d-496a-b6ce-c56d54c771b5,979df549-889d-496a-b6ce-c56d54c771b5,1,0,91b320d8-3426-44d3-97d7-c200287d7343,91b320d8-3426-44d3-97d7-c200287d7343,1,0,b9297f72-b40a-4adb-9975-bb693d4834a4,b9297f72-b40a-4adb-9975-bb693d4834a4,1,0,41cf3916-216f-4c4e-a587-82777f4263e0,41cf3916-216f-4c4e-a587-82777f4263e0,1,0,2ce3a350-86f1-4275-8299-3c3693ca11fa,2ce3a350-86f1-4275-8299-3c3693ca11fa,1,0,59f0ed15-c84c-4f41-bdd4-26317e4e914d,59f0ed15-c84c-4f41-bdd4-26317e4e914d,1,0,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,1,0,8fef790c-a3f4-460c-9093-5065cbdba196,8fef790c-a3f4-460c-9093-5065cbdba196,1,0,79bd24d0-61a9-4558-90ac-4e726066789c,79bd24d0-61a9-4558-90ac-4e726066789c,1,0,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,1,0,ef356548-51a4-4b09-b37d-ede5b8f3edb6,ef356548-51a4-4b09-b37d-ede5b8f3edb6,1,0,53c0d900-5e96-4381-a1ed-4424a5799608,53c0d900-5e96-4381-a1ed-4424a5799608,1,0,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,1,0,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,1,0,45ca9e20-1246-4400-a019-ffb521af6ea7,45ca9e20-1246-4400-a019-ffb521af6ea7,1,0,73eed854-5c3a-4a10-9bfa-793fd517f303,73eed854-5c3a-4a10-9bfa-793fd517f303,1,0,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,1,0,9134dc40-a8f1-4c60-9431-27cb98be5ecd,9134dc40-a8f1-4c60-9431-27cb98be5ecd,1,0,16c4622a-33af-4a95-b44e-0861a6df21d2,16c4622a-33af-4a95-b44e-0861a6df21d2,1,0,d8cac67b-cce2-4a00-a8df-c6570c50153f,d8cac67b-cce2-4a00-a8df-c6570c50153f,1,0,37213c65-bf26-4e50-a2fa-58eb45439b58,37213c65-bf26-4e50-a2fa-58eb45439b58,1,0,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,1,0,b6b31892-73ee-4c9b-92b0-2735536c4938,b6b31892-73ee-4c9b-92b0-2735536c4938,1,0,deb8b883-142e-47d0-a722-7c734a0cf9b3,deb8b883-142e-47d0-a722-7c734a0cf9b3,1,0,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,1,0,29233058-ccb1-4110-a9bc-cdb4c531f35a,29233058-ccb1-4110-a9bc-cdb4c531f35a,1,0,cf3729b2-9ee6-437c-81df-83966793be50,cf3729b2-9ee6-437c-81df-83966793be50,1,0,429d08b7-0b98-4f9b-a053-d04dd84a7026,429d08b7-0b98-4f9b-a053-d04dd84a7026,1,0,b64fd964-cee8-4619-872f-82d2fdc14240,b64fd964-cee8-4619-872f-82d2fdc14240,1,0,5ce7846d-9806-40f5-8631-4e14deb8bc95,5ce7846d-9806-40f5-8631-4e14deb8bc95,1,0,79528a0e-1e48-4d14-bd28-756fd5db57b9,79528a0e-1e48-4d14-bd28-756fd5db57b9,1,0,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,1,0,d9426219-4b37-4776-8d5d-acab5825e789,d9426219-4b37-4776-8d5d-acab5825e789,1,0,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,1,0,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,1,0,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,1,0,29e7299a-ce80-497a-8102-615d0a001ea8,29e7299a-ce80-497a-8102-615d0a001ea8,1,0,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,1,0,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,1,0,adc2cc11-b647-453f-a98e-8a73b7c368c7,adc2cc11-b647-453f-a98e-8a73b7c368c7,1,0,905b787b-c638-4703-af70-416a2ce43b50,905b787b-c638-4703-af70-416a2ce43b50,1,0,d7ea882a-6ef9-407f-b0e9-7bb42cf5ef17,d7ea882a-6ef9-407f-b0e9-7bb42cf5ef17,1,0,4522c564-61da-40da-a749-5312121a331d,4522c564-61da-40da-a749-5312121a331d,1,0,9394c709-6cbe-4ef6-bc8c-cba8af65821e,9394c709-6cbe-4ef6-bc8c-cba8af65821e,1,0,2943b572-7411-4f92-a6cc-7ee552b85223,2943b572-7411-4f92-a6cc-7ee552b85223,1,0,28478e7a-e8aa-40aa-866c-a3624f903141,28478e7a-e8aa-40aa-866c-a3624f903141,1,0,f692ab21-a8de-4feb-914f-4beef350543a,f692ab21-a8de-4feb-914f-4beef350543a,1,0,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,1,0,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,1,0,dabb3395-6100-4f53-913d-e0230e81b494,dabb3395-6100-4f53-913d-e0230e81b494,1,0,e0a3fae1-1582-4c7a-acd8-870b558acec4,e0a3fae1-1582-4c7a-acd8-870b558acec4,1,0,4f06c867-6fec-4a4d-a360-6d8e98e4e7a4,4f06c867-6fec-4a4d-a360-6d8e98e4e7a4,1,0,34ee9617-9935-425f-9637-bdffd5a64042,34ee9617-9935-425f-9637-bdffd5a64042,1,0,3e6160f4-eed6-4dd6-a8fb-96c1a90d39be,3e6160f4-eed6-4dd6-a8fb-96c1a90d39be,1,0,778cd9f9-7afd-4eb7-bd4e-90ff7d9cf4f0,778cd9f9-7afd-4eb7-bd4e-90ff7d9cf4f0,1,0,fb8f3edd-bf12-4312-8ffe-7bbd627fa52b,fb8f3edd-bf12-4312-8ffe-7bbd627fa52b,1,0,6ddad5e2-b2c3-47bc-b339-54ccd7391e33,6ddad5e2-b2c3-47bc-b339-54ccd7391e33,1,0,761ca1c1-c843-47a1-bacc-2f9d1d68634d,761ca1c1-c843-47a1-bacc-2f9d1d68634d,1,0,af4a815b-d9d4-4fe6-9b2b-3932381e7346,af4a815b-d9d4-4fe6-9b2b-3932381e7346,1,0,9dbca72a-fb38-4d86-a3ff-83f7edc0fdb4,9dbca72a-fb38-4d86-a3ff-83f7edc0fdb4,1,0,fab77796-a103-40a6-95bd-238979fc345d,fab77796-a103-40a6-95bd-238979fc345d,1,0,6fad175b-eaf0-4e45-aaa1-c1ebc98e0ed0,6fad175b-eaf0-4e45-aaa1-c1ebc98e0ed0,1,0,0ef5e38c-6f7c-46e7-9c14-4fde6814f93f,0ef5e38c-6f7c-46e7-9c14-4fde6814f93f,1,0,f306dafa-350e-4ff9-bfe2-211be647afe8,f306dafa-350e-4ff9-bfe2-211be647afe8,1,0,6d447b01-21ae-4cc1-9262-4ec4ed5e04f5,6d447b01-21ae-4cc1-9262-4ec4ed5e04f5,1,0,dcd64d40-e57f-4cb5-9ccd-67b27ac546d4,dcd64d40-e57f-4cb5-9ccd-67b27ac546d4,1,0,8d0ad48c-6e27-44c2-87f6-62eef78b6427,8d0ad48c-6e27-44c2-87f6-62eef78b6427,1,0,e4fb3b42-60f6-4413-bba8-6e507b13d5d3,e4fb3b42-60f6-4413-bba8-6e507b13d5d3,1,0,a5e3b305-392c-40a2-9b66-7fdc72c041a3,a5e3b305-392c-40a2-9b66-7fdc72c041a3,1,0,266d41c0-92a1-4d42-bf5b-60a1bddb8912,266d41c0-92a1-4d42-bf5b-60a1bddb8912,1,0,1aad9f99-422a-40e8-83da-6e29b8a4e85a,1aad9f99-422a-40e8-83da-6e29b8a4e85a,1,0,d9010dc7-b0de-4079-944d-fbec7ba5997f,d9010dc7-b0de-4079-944d-fbec7ba5997f,1,0,5defd7f7-cc7d-4e7b-83e3-755f8a2514ea,5defd7f7-cc7d-4e7b-83e3-755f8a2514ea,1,0,744ca01b-41b6-4c30-a280-85e44ad456ba,744ca01b-41b6-4c30-a280-85e44ad456ba,1,0,779856af-2c4a-4643-9bea-a04aa24ee488,779856af-2c4a-4643-9bea-a04aa24ee488,1,0,5c6f12f3-7cb6-4b10-9859-7b72bae3fc76,5c6f12f3-7cb6-4b10-9859-7b72bae3fc76,1,0,d00313c8-ee4a-4463-8d5b-7e87e4e14986,d00313c8-ee4a-4463-8d5b-7e87e4e14986,1,0,6db400f2-873a-44a2-9274-2cd7883bfd87,6db400f2-873a-44a2-9274-2cd7883bfd87,1,0,3b925fd2-adb8-451a-8675-7b081fc7c570,3b925fd2-adb8-451a-8675-7b081fc7c570,1,0,70e9e13d-8f87-4a5b-9c80-49d2cff1a290,70e9e13d-8f87-4a5b-9c80-49d2cff1a290,1,0,04b7e8b2-6bc1-49dc-9476-7eadf94b9188,04b7e8b2-6bc1-49dc-9476-7eadf94b9188,1,0,135c86fc-2979-4833-9107-38d749a9f82f,135c86fc-2979-4833-9107-38d749a9f82f,1,0,78288ff9-d838-4970-84bd-9a6b229e6ef0,78288ff9-d838-4970-84bd-9a6b229e6ef0,1,0,8310f927-1123-4b4b-a65e-0ff29be73329,8310f927-1123-4b4b-a65e-0ff29be73329,1,0,80a9df2d-593d-483d-8d69-28b1c08ec648,80a9df2d-593d-483d-8d69-28b1c08ec648,1,0,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,1,0,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,1,0,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,1,0,ecbe625a-55eb-437a-8dee-33fb034d4c0d,ecbe625a-55eb-437a-8dee-33fb034d4c0d,1,0,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,1,0,948b10b3-0d7c-4dca-8816-75eb86e7881b,948b10b3-0d7c-4dca-8816-75eb86e7881b,1,0,9de91b5a-98e4-414b-b650-b669b0159b49,9de91b5a-98e4-414b-b650-b669b0159b49,1,0,3de3948d-40ff-4e0d-8445-9bf49c916161,3de3948d-40ff-4e0d-8445-9bf49c916161,1,0,73a093ea-1927-483b-b6f5-8f0cbd253753,73a093ea-1927-483b-b6f5-8f0cbd253753,1,0,345f04c0-0274-4e79-b523-f1fa3cf0d92a,345f04c0-0274-4e79-b523-f1fa3cf0d92a,1,0,f3a14787-de1b-4b65-8cb1-bc33a785821c,f3a14787-de1b-4b65-8cb1-bc33a785821c,1,0,ec61075e-fbcb-494a-b790-81548a212d2b,ec61075e-fbcb-494a-b790-81548a212d2b,1,0,0c444045-302b-4dbd-a9a3-81fd40004948,0c444045-302b-4dbd-a9a3-81fd40004948,1,0,f9c0862c-34a2-41a3-ae46-b6a8e1ad1b08,f9c0862c-34a2-41a3-ae46-b6a8e1ad1b08,1,0,1528b799-1c0f-4244-85e8-e738b827934a,1528b799-1c0f-4244-85e8-e738b827934a,1,0,45d79e4d-8c2a-432b-abb8-fb9046abea40,45d79e4d-8c2a-432b-abb8-fb9046abea40,1,0,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,1,0,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,1,0,bd0f9ec3-156a-4a6f-a52b-1213ec825bc0,bd0f9ec3-156a-4a6f-a52b-1213ec825bc0,1,0,71e52f63-04db-4336-ace6-b143d0a7d250,71e52f63-04db-4336-ace6-b143d0a7d250,1,0,afe79ef0-7830-43ce-85f3-c4c97831aa67,afe79ef0-7830-43ce-85f3-c4c97831aa67,1,0,0d7c3192-b15b-4d40-83f9-b76c6f8e654f,0d7c3192-b15b-4d40-83f9-b76c6f8e654f,1,0,fe07f268-bcfd-40c6-adf3-79df859ff731,fe07f268-bcfd-40c6-adf3-79df859ff731,1,0,1a1c88ff-b0c4-42c3-bf10-ebdf4de935b7,1a1c88ff-b0c4-42c3-bf10-ebdf4de935b7,1,0,15e90374-99d9-48f7-b7d6-ec160cdb378f,15e90374-99d9-48f7-b7d6-ec160cdb378f,1,0,ad5b6b8e-c2b5-45aa-8e07-50ae8877ac8f,ad5b6b8e-c2b5-45aa-8e07-50ae8877ac8f,1,0,6c470f57-c920-435a-a013-ff83a737cf3a,6c470f57-c920-435a-a013-ff83a737cf3a,1,0,a5e13e12-72b7-477d-8d80-06015fa5dece,a5e13e12-72b7-477d-8d80-06015fa5dece,1,0,d9c47acd-b5ee-4ea1-b247-7cc09a13eb82,d9c47acd-b5ee-4ea1-b247-7cc09a13eb82,1,0,4a81906a-7db7-4e7d-a95e-79b07a43e573,4a81906a-7db7-4e7d-a95e-79b07a43e573,1,0,0bcabdf4-3348-405d-ba75-7bcc106f9e7f,0bcabdf4-3348-405d-ba75-7bcc106f9e7f,1,0,5f2980ca-3f1c-4680-a6e9-477825442782,5f2980ca-3f1c-4680-a6e9-477825442782,1,0,40fd6b4a-2180-4403-b7e6-48b42d8285b7,40fd6b4a-2180-4403-b7e6-48b42d8285b7,1,0,ef098c52-fcfa-4f0f-85b0-aba0d5aa46b2,ef098c52-fcfa-4f0f-85b0-aba0d5aa46b2,1,0,a671cb1e-b27a-44bb-a8ca-1388f099de2e,a671cb1e-b27a-44bb-a8ca-1388f099de2e,1,0,6cff6b09-91b5-4f2b-89aa-23d2f83f9d89,6cff6b09-91b5-4f2b-89aa-23d2f83f9d89,1,0,a4b6920e-3e25-4798-809a-27d7bfae4ee7,a4b6920e-3e25-4798-809a-27d7bfae4ee7,1,0,981f6e35-64b8-4d63-b383-32ea71fcd025,981f6e35-64b8-4d63-b383-32ea71fcd025,1,0,9a7b964d-1c06-44af-8d25-f84493c70a42,9a7b964d-1c06-44af-8d25-f84493c70a42,1,0,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,f9f021ca-8b3e-4d10-9538-1bce7e851fdd,1,0,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,bb7cf0f8-56b0-4c0d-b206-79051ba83f6d,1,0,ab057ce4-ac51-4465-8aad-eadc9088c62d,ab057ce4-ac51-4465-8aad-eadc9088c62d,1,0,8842c0e3-2e20-4f37-ae7c-f5449004994b,8842c0e3-2e20-4f37-ae7c-f5449004994b,1,0,5b2cc44b-69cb-495c-a26b-003a495df40b,5b2cc44b-69cb-495c-a26b-003a495df40b,1,0,30250d93-10ff-45c9-920b-5fed3f9d8093,30250d93-10ff-45c9-920b-5fed3f9d8093,1,0,fc959221-6313-45d9-b2c4-85befaede226,fc959221-6313-45d9-b2c4-85befaede226,1,0,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,1,0,5206d407-ac91-477e-80e7-97c312da934c,5206d407-ac91-477e-80e7-97c312da934c,1,0,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,1,0,ccb8a530-260a-4488-b1d9-c67325c69bf4,ccb8a530-260a-4488-b1d9-c67325c69bf4,1,0,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,c869c1b7-3c04-4e5e-a033-d3f2fb0af03c,1,0,23f93492-59f5-491b-8708-45096934c7e6,23f93492-59f5-491b-8708-45096934c7e6,1,0,30f5471a-17fb-4184-9798-4f8e3ef0cccb,30f5471a-17fb-4184-9798-4f8e3ef0cccb,1,0,27abda4c-a43c-49b4-90cd-db780afe0c45,27abda4c-a43c-49b4-90cd-db780afe0c45,1,0,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,450a36cb-9bc1-4c5b-ae21-0e023f3eb951,1,0,1a28db16-d410-4101-bf31-21cefa880dae,1a28db16-d410-4101-bf31-21cefa880dae,1,0,2b85bcf6-85b0-4efb-bada-b65414a8d264,2b85bcf6-85b0-4efb-bada-b65414a8d264,1,0,cf027de4-59c9-4b8f-9695-b1d4d16548fe,cf027de4-59c9-4b8f-9695-b1d4d16548fe,1,0,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,d33ceaee-a374-40a3-9406-cbcbf82fd8ae,1,0,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0b13cad5-91ae-4cd1-a620-9a315ae8024c,1,0,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,1,0,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,1,0,81dd61e5-fe02-4272-a525-affda9b606ca,81dd61e5-fe02-4272-a525-affda9b606ca,1,0,8de7b423-b7d1-46fe-b1dc-fb936736b864,8de7b423-b7d1-46fe-b1dc-fb936736b864,1,0,f565876c-0326-4b12-895e-c248b9e64115,f565876c-0326-4b12-895e-c248b9e64115,1,0,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,1,0,88cefe4a-a6c5-4753-935e-f956d9de9f77,88cefe4a-a6c5-4753-935e-f956d9de9f77,1,0,882e78b7-90bd-4b95-8852-146bdb51ec15,882e78b7-90bd-4b95-8852-146bdb51ec15,1,0,ae4435c3-62c0-4f08-b526-7f9571eed8ae,ae4435c3-62c0-4f08-b526-7f9571eed8ae,1,0,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,91a1bd81-e6fa-476c-85e6-317a91f6c8bc,1,0,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,f799e1d1-bb78-4a7a-bb1a-d79ba29acd0c,1,0,c7b46558-d688-4c42-ae52-f98de7923176,c7b46558-d688-4c42-ae52-f98de7923176,1,0,31fdbb46-1df1-4b74-a54e-b922260dcca6,31fdbb46-1df1-4b74-a54e-b922260dcca6,1,0,ee494dc9-549b-4595-97d1-ca73bacff954,ee494dc9-549b-4595-97d1-ca73bacff954,1,0,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,1,0,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,1,0,80c23bf0-cef0-4d07-a017-d90635f8041d,80c23bf0-cef0-4d07-a017-d90635f8041d,1,0,47a24216-3299-470b-a18c-d8c1258fff24,47a24216-3299-470b-a18c-d8c1258fff24,1,0,72dcfd46-491e-4f88-a0ea-57919f8fbdea,72dcfd46-491e-4f88-a0ea-57919f8fbdea,1,0,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,1,0,8317ac49-890d-4921-8c0d-1bfc676f0b40,8317ac49-890d-4921-8c0d-1bfc676f0b40,1,0,f9161bc3-9a1c-4870-8681-8e97d8ce838a,f9161bc3-9a1c-4870-8681-8e97d8ce838a,1,0,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,1,0,c3b3805b-3501-47a7-b280-46180049b235,c3b3805b-3501-47a7-b280-46180049b235,1,0,29af05c2-37de-495b-b3cf-477d452abe5e,29af05c2-37de-495b-b3cf-477d452abe5e,1,0,0c732569-a50f-4be3-a214-0843c6a3da47,0c732569-a50f-4be3-a214-0843c6a3da47,1,0,f55d74bf-5824-4228-9683-31f7c7fdf74d,f55d74bf-5824-4228-9683-31f7c7fdf74d,1,0,5e922083-0ceb-449a-8201-7dd27a46f2fc,5e922083-0ceb-449a-8201-7dd27a46f2fc,1,0,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,0d142fcd-a596-4cdf-a3f6-c31becdb7b59,1,0,c30c6860-befb-497e-b432-3dba0f86c540,c30c6860-befb-497e-b432-3dba0f86c540,1,0,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,1,0,e757303e-c61a-4e42-9829-c5a36dba9414,e757303e-c61a-4e42-9829-c5a36dba9414,1,0,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,cb3bb725-ed7a-4cde-a0ac-26a0b168c0ea,1,0,091de87c-0801-4bd3-aaaa-ed37bc4cd161,091de87c-0801-4bd3-aaaa-ed37bc4cd161,1,0,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,1,0,b53c545c-3b1c-4315-a213-4f2b2c7128aa,b53c545c-3b1c-4315-a213-4f2b2c7128aa,1,0,02a84df9-2171-43e6-8135-a74edd384826,02a84df9-2171-43e6-8135-a74edd384826,1,0,ff36356d-cb1d-4316-896a-c6ae83b92437,ff36356d-cb1d-4316-896a-c6ae83b92437,1,0,465cce6a-7064-4b0a-932c-40f842042f33,465cce6a-7064-4b0a-932c-40f842042f33,1,0,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,1,0,e67dff00-92e2-4f58-a950-d5bbca9291c5,e67dff00-92e2-4f58-a950-d5bbca9291c5,1,0,e1964724-804a-4ecc-be9e-5b84e58f2b84,e1964724-804a-4ecc-be9e-5b84e58f2b84,1,0,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,46e961c2-cd45-4d76-a6ad-c1d5c8dc95cc,1,0,bf3cb513-2856-472b-8713-7bf8ba70cdce,bf3cb513-2856-472b-8713-7bf8ba70cdce,1,0,de4815c8-0853-47e0-862b-b60119c674f6,de4815c8-0853-47e0-862b-b60119c674f6,1,0,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,dbe02a79-3179-42bb-a8e8-dd9bf3ff705c,1,0,8f17ec3f-6d62-46b8-baef-b20430e948ce,8f17ec3f-6d62-46b8-baef-b20430e948ce,1,0,ea1298d0-9396-4a50-b83e-24064e8dd99d,ea1298d0-9396-4a50-b83e-24064e8dd99d,1,0,038dbb00-e4c6-4e64-b861-3a0764f54ab3,038dbb00-e4c6-4e64-b861-3a0764f54ab3,1,0,1c291f7d-a493-4297-8aaa-912896800066,1c291f7d-a493-4297-8aaa-912896800066,1,0,69149801-a825-4ed2-b077-c26660dff271,69149801-a825-4ed2-b077-c26660dff271,1,0,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,1,0,518ab687-b84a-40c8-8547-aee4257c1b71,518ab687-b84a-40c8-8547-aee4257c1b71,1,0,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,1,0,7732ef07-16eb-46a0-9645-7de95c5482af,7732ef07-16eb-46a0-9645-7de95c5482af,1,0,75dac536-b316-4b04-a57b-03656c678bec,75dac536-b316-4b04-a57b-03656c678bec,1,0,a07d6c85-159d-4d09-b117-561a1e20329f,a07d6c85-159d-4d09-b117-561a1e20329f,1,0,8a2f9733-4f83-41f2-9d74-dca7161a4b41,8a2f9733-4f83-41f2-9d74-dca7161a4b41,1,0,fbd2d900-1e0d-48f3-9793-0186ee49915c,fbd2d900-1e0d-48f3-9793-0186ee49915c,1,0,436b558e-6547-4ba6-8cee-954fe36743ea,436b558e-6547-4ba6-8cee-954fe36743ea,1,0,6120bb6e-b177-48bf-b467-02bab0d4cc0d,6120bb6e-b177-48bf-b467-02bab0d4cc0d,1,0,a5af4715-6c4f-484b-9599-5b1b9147713f,a5af4715-6c4f-484b-9599-5b1b9147713f,1,0,307b6e66-6fef-4777-b20a-37898928932f,307b6e66-6fef-4777-b20a-37898928932f,1,0,a69494c0-dcce-4359-aa82-c1cfae8a43eb,a69494c0-dcce-4359-aa82-c1cfae8a43eb,1,0,2b243d49-5500-403a-b177-ac1c70bb889d,2b243d49-5500-403a-b177-ac1c70bb889d,1,0,51c040c6-e7a4-4e0e-b479-039636fdb6ec,51c040c6-e7a4-4e0e-b479-039636fdb6ec,1,0,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,8ede4c18-ebf0-4c39-9e82-c59df8d62ca7,1,0,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,b2c200a7-b9cc-4d84-b839-e69f2a14a8f5,1,0,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,8a50e7f2-97a9-4ed8-a46f-6413f7fcf8cd,1,0,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,1,0,3a36e0f5-a645-47f1-99ae-5b0493d604ad,3a36e0f5-a645-47f1-99ae-5b0493d604ad,1,0,57f762f7-b8e4-498b-a3dc-3d40c94855ec,57f762f7-b8e4-498b-a3dc-3d40c94855ec,1,0,ca7d4086-de35-40fd-af65-73369d452135,ca7d4086-de35-40fd-af65-73369d452135,1,0,563c0f5c-e0b4-4229-a3f6-183091060aa4,563c0f5c-e0b4-4229-a3f6-183091060aa4,1,0,bf967588-ea8f-49a3-9331-af2331ffa162,bf967588-ea8f-49a3-9331-af2331ffa162,1,0,d59c2725-5d98-495e-9f86-f5d38dbfad90,d59c2725-5d98-495e-9f86-f5d38dbfad90,1,0,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,1,0,0ba68198-983d-409b-be27-96f1572b3f12,0ba68198-983d-409b-be27-96f1572b3f12,1,0,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,1,0,decb27a8-7dd3-4601-a694-30429e638b39,decb27a8-7dd3-4601-a694-30429e638b39,1,0,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,1,0,d7a128e4-f31f-4b09-8424-e816ab59d5c3,d7a128e4-f31f-4b09-8424-e816ab59d5c3,1,0,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,1,0,aa9513b4-f575-4030-a7f9-ac09aa319e98,aa9513b4-f575-4030-a7f9-ac09aa319e98,1,0,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,1,0,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,1,0,d03f66b1-48a3-434b-bb58-9fd53c183514,d03f66b1-48a3-434b-bb58-9fd53c183514,1,0,a469e55e-d7ca-4c27-b350-fafe7364c18f,a469e55e-d7ca-4c27-b350-fafe7364c18f,1,0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,b4dde44e-57d5-4c3a-bb9b-643787ce07b0,1,0,d2160866-78ca-424a-92b9-d389fb341ee0,d2160866-78ca-424a-92b9-d389fb341ee0,1,0,73b36823-72a4-4286-8ee2-02b2f086d5ea,73b36823-72a4-4286-8ee2-02b2f086d5ea,1,0,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,1,0,4378ab20-5467-476b-8f04-4b6876efdee6,4378ab20-5467-476b-8f04-4b6876efdee6,1,0,55e47901-c79c-41c5-9d7f-6b6846ed2782,55e47901-c79c-41c5-9d7f-6b6846ed2782,1,0,c013a650-bd4b-4e14-97cc-05df17dbb0d5,c013a650-bd4b-4e14-97cc-05df17dbb0d5,1,0,00bc2e99-c7c9-4a4b-b0bc-c9babe17deda,00bc2e99-c7c9-4a4b-b0bc-c9babe17deda,1,0,18ba2c0c-d606-47ee-9409-66acb24bd794,18ba2c0c-d606-47ee-9409-66acb24bd794,1,0,9f24891c-3846-455a-bf95-be3b186f4342,9f24891c-3846-455a-bf95-be3b186f4342,1,0,ddc332d9-1d60-40fe-87fd-7f2164db1edf,ddc332d9-1d60-40fe-87fd-7f2164db1edf,1,0,d0e3c3a5-e74c-4c0a-8679-77e6a097eb36,d0e3c3a5-e74c-4c0a-8679-77e6a097eb36,1,0,20c43755-49cc-4f11-bd2f-52a9e53547ef,20c43755-49cc-4f11-bd2f-52a9e53547ef,1,0,7dbed991-4883-444c-8ce2-96c203a905f2,7dbed991-4883-444c-8ce2-96c203a905f2,1,0,bbadd00d-6410-41ec-a7d8-4dbd52986cc2,bbadd00d-6410-41ec-a7d8-4dbd52986cc2,1,0,d5f66278-4ab2-407a-abef-eb7636e9ba95,d5f66278-4ab2-407a-abef-eb7636e9ba95,1,0,61e51391-c412-46a5-8290-d5183ad0db83,61e51391-c412-46a5-8290-d5183ad0db83,1,0,e9dfdaa2-4094-4501-a38a-3811e7e4c708,e9dfdaa2-4094-4501-a38a-3811e7e4c708,1,0,0a62947e-848a-47fa-a239-95aee6b955d4,0a62947e-848a-47fa-a239-95aee6b955d4,1,0,beaef14b-175f-4ebe-b387-9c922a42c99e,beaef14b-175f-4ebe-b387-9c922a42c99e,1,0,13daaad0-2726-4065-8158-47059865452a,13daaad0-2726-4065-8158-47059865452a,1,0,a7829dfb-adb9-4401-a609-ca9a0f2376b3,a7829dfb-adb9-4401-a609-ca9a0f2376b3,1,0,26f1076a-8100-4cf4-9539-29637a5e9137,26f1076a-8100-4cf4-9539-29637a5e9137,1,0,3ad5d8a7-3071-46aa-aebf-306bdb67983b,3ad5d8a7-3071-46aa-aebf-306bdb67983b,1,0,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,1,0,cb954476-c551-4a06-9bcd-18d67ba47dc8,cb954476-c551-4a06-9bcd-18d67ba47dc8,1,0,79201015-bfae-463e-81f1-0ae2d3066f3f,79201015-bfae-463e-81f1-0ae2d3066f3f,1,0,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,bed8af4e-fa3a-4b25-ba6e-5b7b4a6cd363,1,0,951927d4-7bfc-4edb-b97f-dcc29a937400,951927d4-7bfc-4edb-b97f-dcc29a937400,1,0,71309e88-d514-40f3-a329-b2a420e75504,71309e88-d514-40f3-a329-b2a420e75504,1,0,1ea3178b-73dd-4063-9140-c61687a4b1b8,1ea3178b-73dd-4063-9140-c61687a4b1b8,1,0,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,1,0,696723be-7b4f-4321-956e-eff07ea9f5fa,696723be-7b4f-4321-956e-eff07ea9f5fa,1,0,616c27dc-5c59-4469-97a7-27e0752bd3a7,616c27dc-5c59-4469-97a7-27e0752bd3a7,1,0,f7323121-74bc-441c-a3e9-dd5cb4f0accd,f7323121-74bc-441c-a3e9-dd5cb4f0accd,1,0,5225b4da-431e-469d-a30c-31fa434b7e86,5225b4da-431e-469d-a30c-31fa434b7e86,1,0,68dcbdd5-c1fd-472f-873c-359d3a237b8c,68dcbdd5-c1fd-472f-873c-359d3a237b8c,1,0,3c6e831c-c934-46bb-8040-edd6de81ba1b,3c6e831c-c934-46bb-8040-edd6de81ba1b,1,0,3c737aff-9581-409a-9a6e-d5e3c133d8df,3c737aff-9581-409a-9a6e-d5e3c133d8df,1,0,916a9ea9-309d-4a7a-9ded-63bda01a39d4,916a9ea9-309d-4a7a-9ded-63bda01a39d4,1,0,0fdbd1ab-716d-46b5-aa75-fb09812ced5b,0fdbd1ab-716d-46b5-aa75-fb09812ced5b,1,0,b26ab92b-9739-4eb4-b855-be6850274432,b26ab92b-9739-4eb4-b855-be6850274432,1,0,17944416-85a5-49e4-9fa8-652c671c3df0,17944416-85a5-49e4-9fa8-652c671c3df0,1,0,b7936cda-654e-4707-af76-385a63243cdf,b7936cda-654e-4707-af76-385a63243cdf,1,0,192844c3-7cb9-4477-a4af-0edb8ce5129d,192844c3-7cb9-4477-a4af-0edb8ce5129d,1,0,33324481-55d1-475f-9f12-7542a05429a2,33324481-55d1-475f-9f12-7542a05429a2,1,0,07b7591f-dcfc-483f-85f6-b5a08d952fe2,07b7591f-dcfc-483f-85f6-b5a08d952fe2,1,0,866c418f-332e-415a-bb8e-794d38f15080,866c418f-332e-415a-bb8e-794d38f15080,1,0,a34b8fdc-e756-4065-b68a-12a07fa7c40e,a34b8fdc-e756-4065-b68a-12a07fa7c40e,1,0,b853debb-d715-4296-9070-45cc5dae571d,b853debb-d715-4296-9070-45cc5dae571d,1,0,fc406b50-f267-44b8-a833-ba7e8880903e,fc406b50-f267-44b8-a833-ba7e8880903e,1,0,6517bf8b-d2fd-4b6b-a4a5-b3086ebad8de,6517bf8b-d2fd-4b6b-a4a5-b3086ebad8de,1,0,391a1891-85a2-45b8-a747-3ecd705fc75b,391a1891-85a2-45b8-a747-3ecd705fc75b,1,0,05681509-254d-4232-af69-62a63ed05716,05681509-254d-4232-af69-62a63ed05716,1,0,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,cc815221-3d2a-4ea3-b1e6-6cb9fb410bd9,1,0,b9ef62f6-9b1d-4d13-8016-73ed531d195a,b9ef62f6-9b1d-4d13-8016-73ed531d195a,1,0,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,742ed6d8-0f8d-4569-b30f-9ff3804cc3b7,1,0,229fe764-87f5-4d19-b042-c31fef5cddd6,229fe764-87f5-4d19-b042-c31fef5cddd6,1,0,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,74cd7504-d34f-42ff-90ff-7abcd54e8b6c,1,0,e932800c-fd81-417d-a601-c774b888d66a,e932800c-fd81-417d-a601-c774b888d66a,1,0,a2335b6f-1dbb-4722-979b-8bed83aa8c94,a2335b6f-1dbb-4722-979b-8bed83aa8c94,1,0,211cf921-d880-4f74-b8ee-5312dea28613,211cf921-d880-4f74-b8ee-5312dea28613,1,0,2fd3a396-b8ae-409e-9373-02a039393a80,2fd3a396-b8ae-409e-9373-02a039393a80,1,0,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,61ae74be-64b2-4bf2-aa63-8fe3dc7ed47d,1,0,346ef414-b20b-4095-86fe-18ca21c9887f,346ef414-b20b-4095-86fe-18ca21c9887f,1,0,c01ab97b-4964-4f7d-b749-56c0b94feb93,c01ab97b-4964-4f7d-b749-56c0b94feb93,1,0,0cc63813-cf16-4a99-b3bd-18a773091230,0cc63813-cf16-4a99-b3bd-18a773091230,1,0,4fc00971-c980-468a-9690-5cd520d12eb0,4fc00971-c980-468a-9690-5cd520d12eb0,1,0,85972c27-4f39-4982-9307-7877e87ef87b,85972c27-4f39-4982-9307-7877e87ef87b,1,0,96afdffb-7595-4c49-9e86-8296f50bd2f5,96afdffb-7595-4c49-9e86-8296f50bd2f5,1,0,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,823d5b5e-e9bf-40f0-9dcd-579bb53847bb,1,0,e125d3e0-950f-42ee-8904-bd26091afa55,e125d3e0-950f-42ee-8904-bd26091afa55,1,0,2b4797a5-074a-4a01-b99f-1c5590cfde40,2b4797a5-074a-4a01-b99f-1c5590cfde40,1,0,718e53d2-24ec-40fb-9def-825441ada46c,718e53d2-24ec-40fb-9def-825441ada46c,1,0,4c0a7fd6-8f09-41d6-949f-65ce708c1256,4c0a7fd6-8f09-41d6-949f-65ce708c1256,1,0,792abc06-b52a-4691-ba92-96ed73ca702a,792abc06-b52a-4691-ba92-96ed73ca702a,1,0,148dbe44-86d1-4362-b9db-8ff68cd2b34d,148dbe44-86d1-4362-b9db-8ff68cd2b34d,1,0,1fbc893e-3000-4fac-88f5-c82251835d65,1fbc893e-3000-4fac-88f5-c82251835d65,1,0,05852816-63ec-4179-abca-66372bbfb04c,05852816-63ec-4179-abca-66372bbfb04c,1,0,0165f721-b011-4524-bfd5-81e35092f2be,0165f721-b011-4524-bfd5-81e35092f2be,1,0,e74925d4-1979-4600-8560-0932d26450ad,e74925d4-1979-4600-8560-0932d26450ad,1,0,aa108131-151d-4356-8a24-345e4ec74281,aa108131-151d-4356-8a24-345e4ec74281,1,0,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,284b77a8-d9f4-44c4-a2dc-91c1f8bd5808,1,0,e3251f1a-3c80-4c86-9960-270920bd512f,e3251f1a-3c80-4c86-9960-270920bd512f,1,0,3c3d5474-977b-4df9-88de-042e997bd10d,3c3d5474-977b-4df9-88de-042e997bd10d,1,0,4b88d172-5a44-4011-bb38-e94bf7a9c879,4b88d172-5a44-4011-bb38-e94bf7a9c879,1,0,3bced2d4-e3d7-4489-a26d-f84620b096f4,3bced2d4-e3d7-4489-a26d-f84620b096f4,1,0,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,e8c048fc-0f39-4778-aaf3-d6bff5acb06a,1,0,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,c7efb89b-f9e5-4b58-b7a0-502cea8cf1d4,1,0,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,cd133f15-aa45-4ec9-93c2-2f0f66baf3f3,1,0,18436045-1008-4114-8032-274fea0f4627,18436045-1008-4114-8032-274fea0f4627,1,0,cad93727-cffb-44a6-aaee-be73a078e802,cad93727-cffb-44a6-aaee-be73a078e802,1,0,c034f410-ff8e-45d7-925f-94448f88a7af,c034f410-ff8e-45d7-925f-94448f88a7af,1,0,0027727b-3917-4010-9953-1649266e8ed7,0027727b-3917-4010-9953-1649266e8ed7,1,0,b088786a-046f-458c-8e7a-5bebf8df8b34,b088786a-046f-458c-8e7a-5bebf8df8b34,1,0,6d015113-1e32-4f5e-aacd-8134d7307125,6d015113-1e32-4f5e-aacd-8134d7307125,1,0,58230238-d2f2-422e-90cb-de355996eb19,58230238-d2f2-422e-90cb-de355996eb19,1,0,3d907678-628d-4fb2-85c2-149839024c08,3d907678-628d-4fb2-85c2-149839024c08,1,0,71384d10-6acf-4139-b766-cb8b5796f1a7,71384d10-6acf-4139-b766-cb8b5796f1a7,1,0,a8f149d7-e9bc-4695-b4f4-88434e31aafb,a8f149d7-e9bc-4695-b4f4-88434e31aafb,1,0,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,10dcbcc6-7793-4da7-a9a5-e4f124209d3e,1,0,11ba510f-cb57-43d0-9897-c49e10b67ccd,11ba510f-cb57-43d0-9897-c49e10b67ccd,1,0,9d92af67-c88d-4429-9e85-0b5bf04c4b79,9d92af67-c88d-4429-9e85-0b5bf04c4b79,1,0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,b009bc99-ea12-46db-a7f8-cb3e285b20d0,1,0,43523bbb-c923-4a20-bcb5-50d30cc826ee,43523bbb-c923-4a20-bcb5-50d30cc826ee,1,0,c89d9aad-3364-45df-88b5-b23ae76edbba,c89d9aad-3364-45df-88b5-b23ae76edbba,1,0,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,9a2f2cd1-4c9f-460b-b3b7-64706a0164ab,1,0,7e4b9dce-e332-4d35-8b5f-d3f88918989d,7e4b9dce-e332-4d35-8b5f-d3f88918989d,1,0,d7a72321-5f1f-427e-a54d-f308dab1b9c4,d7a72321-5f1f-427e-a54d-f308dab1b9c4,1,0,b183eb38-a96e-4e12-9220-4b4027ae875c,b183eb38-a96e-4e12-9220-4b4027ae875c,1,0,07f7e1b5-07b0-4017-bb91-31759c4ffed1,07f7e1b5-07b0-4017-bb91-31759c4ffed1,1,0,6de76d43-40d5-494f-8d30-2ef80c79bc7e,6de76d43-40d5-494f-8d30-2ef80c79bc7e,1,0,60146806-ee46-44d5-8a7a-2ed48741e1c1,60146806-ee46-44d5-8a7a-2ed48741e1c1,1,0,96fe619a-b819-4f96-9788-e1f4ef57833a,96fe619a-b819-4f96-9788-e1f4ef57833a,1,0,94dff2da-f721-411a-9fc0-5d013b685dcc,94dff2da-f721-411a-9fc0-5d013b685dcc,1,0,9343fc5f-7b08-4be5-8cd5-dbed635b819d,9343fc5f-7b08-4be5-8cd5-dbed635b819d,1,0,99e87e66-1b07-451b-a476-f5213cbd7150,99e87e66-1b07-451b-a476-f5213cbd7150,1,0,c3317f75-f6ad-41f6-97f1-77074c3ff62a,c3317f75-f6ad-41f6-97f1-77074c3ff62a,1,0,8800dec9-84f8-4643-8742-1d76fe575f58,8800dec9-84f8-4643-8742-1d76fe575f58,1,0,62903794-3b41-4d21-b800-1c26dbeda3ce,62903794-3b41-4d21-b800-1c26dbeda3ce,1,0,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,1,0,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,4ba2e55e-29bc-4fbe-83e8-8bfa36abfdab,1,0,93de88de-0069-4aa8-96b2-d5709e4def2f,93de88de-0069-4aa8-96b2-d5709e4def2f,1,0,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,1,0,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,1,0,3a8d9010-8785-4d8d-b908-b821d7d681c9,3a8d9010-8785-4d8d-b908-b821d7d681c9,1,0,2568a935-ea49-4b99-aa9c-de27de6a0e81,2568a935-ea49-4b99-aa9c-de27de6a0e81,1,0,de2bdd4f-93f2-4341-86d6-7082fc286a5c,de2bdd4f-93f2-4341-86d6-7082fc286a5c,1,0,ba96ec0e-931e-45be-a782-e68ba4fedddb,ba96ec0e-931e-45be-a782-e68ba4fedddb,1,0,9af5882f-3a42-4fae-83df-6aa8de577112,9af5882f-3a42-4fae-83df-6aa8de577112,1,0,79bc5e39-3017-48bf-8e42-fa34e8b581ef,79bc5e39-3017-48bf-8e42-fa34e8b581ef,1,0,fe6e207f-d306-4470-8441-ffd3f3710d31,fe6e207f-d306-4470-8441-ffd3f3710d31,1,0,7451af80-7387-4e8d-a3da-2ae0540c3fd4,7451af80-7387-4e8d-a3da-2ae0540c3fd4,1,0,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1,0,df459525-4e4d-4819-b996-5a6379b22a88,df459525-4e4d-4819-b996-5a6379b22a88,1,0,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,1,0,e67b4a32-4bac-450e-be6d-88c262383f31,e67b4a32-4bac-450e-be6d-88c262383f31,1,0,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,1,0,6c4c3eca-8b02-451b-af52-93073c3da146,6c4c3eca-8b02-451b-af52-93073c3da146,1,0,095c281c-3903-465d-baea-af1e6abf8019,095c281c-3903-465d-baea-af1e6abf8019,1,0,440d115d-a769-427e-891a-88d65fba2057,440d115d-a769-427e-891a-88d65fba2057,1,0,f7932210-027e-4fad-b7f7-3530789ce803,f7932210-027e-4fad-b7f7-3530789ce803,1,0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,1,0,4975d3d6-b5a2-41c6-973b-6817013a388d,4975d3d6-b5a2-41c6-973b-6817013a388d,1,0,18ebc799-9724-4ffb-855e-b09a0723869e,18ebc799-9724-4ffb-855e-b09a0723869e,1,0,a06b8ef5-83e6-4fc6-91e1-256004134d69,a06b8ef5-83e6-4fc6-91e1-256004134d69,1,0,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1,0,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,1,0,5b663988-3599-46dc-8d59-4c82ceac537c,5b663988-3599-46dc-8d59-4c82ceac537c,1,0,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0f5f136c-688b-491e-a72b-3d9c2e609f0e,1,0,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,1,0,679cc0df-df5c-4c33-8c64-c0b6cee39116,679cc0df-df5c-4c33-8c64-c0b6cee39116,1,0,b156752b-f25c-4f35-9474-8ac3636597f5,b156752b-f25c-4f35-9474-8ac3636597f5,1,0,bdc51d67-5fc2-4d28-8875-69e33e625be6,bdc51d67-5fc2-4d28-8875-69e33e625be6,1,0,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,1,0,b494ca7b-6548-4fa2-932c-acdf8c62a78a,b494ca7b-6548-4fa2-932c-acdf8c62a78a,1,0,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,1,0,f335aa38-4e9e-4653-9a76-b6d4ae178c93,f335aa38-4e9e-4653-9a76-b6d4ae178c93,1,0,a62894bc-fab4-4ed4-a57d-cbe725527198,a62894bc-fab4-4ed4-a57d-cbe725527198,1,0,d4e567c7-55f1-4564-b066-f5b2355ad82c,d4e567c7-55f1-4564-b066-f5b2355ad82c,1,0,89cf2cd8-dc43-4742-af5a-5975e9546786,89cf2cd8-dc43-4742-af5a-5975e9546786,1,0,089ae618-cd90-482a-b4a2-45a04aaecc0c,089ae618-cd90-482a-b4a2-45a04aaecc0c,1,0,d1beef4e-9c78-49f5-9e52-1568fadf861d,d1beef4e-9c78-49f5-9e52-1568fadf861d,1,0,e6032a40-6195-4889-99f5-f7f4c74d4e8f,e6032a40-6195-4889-99f5-f7f4c74d4e8f,1,0,f9f12c11-04e8-4999-b1ab-ddea896638a2,f9f12c11-04e8-4999-b1ab-ddea896638a2,1,0,47ae26c4-1c47-4d9d-a0b8-a9899d08a4ce,47ae26c4-1c47-4d9d-a0b8-a9899d08a4ce,1,0,83245a76-8502-47a4-98ae-2ffadb78a029,83245a76-8502-47a4-98ae-2ffadb78a029,1,0,c9d5a41d-a2d9-4ec6-9a51-e4d254df1927,c9d5a41d-a2d9-4ec6-9a51-e4d254df1927,1,0,b5bb5376-27a6-43f2-9e91-bf7c913b89fd,b5bb5376-27a6-43f2-9e91-bf7c913b89fd,1,0,24861cd2-2be0-4454-8154-2201e63be266,24861cd2-2be0-4454-8154-2201e63be266,1,0,2e364599-aad9-4d1d-a4df-6cbd3ed768e7,2e364599-aad9-4d1d-a4df-6cbd3ed768e7,1,0,b1dd4569-6ed9-49f4-b05b-359229afb7a5,b1dd4569-6ed9-49f4-b05b-359229afb7a5,1,0,c14cac09-820e-47ae-81bb-eb497950d40c,c14cac09-820e-47ae-81bb-eb497950d40c,1,0,201cd431-6027-466c-abec-09ff65f42244,201cd431-6027-466c-abec-09ff65f42244,1,0,1018c5d8-8aed-49ba-a27c-a44bddd96144,1018c5d8-8aed-49ba-a27c-a44bddd96144,1,0,a81e5d20-9c42-462d-83a3-f86522c473f5,a81e5d20-9c42-462d-83a3-f86522c473f5,1,0,1ce4440e-3709-4cb1-8505-2379d5146be3,1ce4440e-3709-4cb1-8505-2379d5146be3,1,0,81c1f13c-e4ac-46b8-a205-c4f695ddf667,81c1f13c-e4ac-46b8-a205-c4f695ddf667,1,0,a26d8489-88a8-438e-bb58-c7b5a742a243,a26d8489-88a8-438e-bb58-c7b5a742a243,1,0,4b700bfd-5179-4504-b710-fd65036dded7,4b700bfd-5179-4504-b710-fd65036dded7,1,0,b046cb0b-f88b-4fb1-b08d-bb02b20dee74,b046cb0b-f88b-4fb1-b08d-bb02b20dee74,1,0,67dc31fa-cc64-4d29-96aa-65a7fd480790,67dc31fa-cc64-4d29-96aa-65a7fd480790,1,0,17f0e86d-8661-492c-85fa-2ce3cd1a57d5,17f0e86d-8661-492c-85fa-2ce3cd1a57d5,1,0,17aadd5f-cda2-4785-a07f-3ab4b04434a6,17aadd5f-cda2-4785-a07f-3ab4b04434a6,1,0,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,1,0,1832336e-32f6-42c4-9087-8614ead52bb3,1832336e-32f6-42c4-9087-8614ead52bb3,1,0,ff9f7b5c-70f4-4eed-8216-64448e7da76f,ff9f7b5c-70f4-4eed-8216-64448e7da76f,1,0,44ac2869-990d-4cac-a14b-c1a28854341e,44ac2869-990d-4cac-a14b-c1a28854341e,1,0,d5df31c3-89f9-469c-80a9-fb4706d30bc4,d5df31c3-89f9-469c-80a9-fb4706d30bc4,1,0,65ad33ce-edab-4f8b-8f44-1a5634d87191,65ad33ce-edab-4f8b-8f44-1a5634d87191,1,0,bcd727b5-4678-41e9-85d5-98d4157cdd77,bcd727b5-4678-41e9-85d5-98d4157cdd77,1,0,38c6dd83-2a70-4c4a-9f29-3b2b54a15501,38c6dd83-2a70-4c4a-9f29-3b2b54a15501,1,0,f403fcb3-a4f8-479d-9fa1-85d458b9a4b5,f403fcb3-a4f8-479d-9fa1-85d458b9a4b5,1,0,c56d3cfe-6ae1-4fe3-abdc-2d845049ddde,c56d3cfe-6ae1-4fe3-abdc-2d845049ddde,1,0,66f1dc54-f28c-4fb7-a6c9-f839d656e87c,66f1dc54-f28c-4fb7-a6c9-f839d656e87c,1,0,b8e3d08d-d442-4ffa-83d8-f372a7d2d340,b8e3d08d-d442-4ffa-83d8-f372a7d2d340,1,0,ebba727b-8155-4dd8-8ea0-207ca396566b,ebba727b-8155-4dd8-8ea0-207ca396566b,1,0,e4166141-f18f-4d27-beb5-9e30fe30f842,e4166141-f18f-4d27-beb5-9e30fe30f842,1,0,b62434ac-ef9f-4fe7-8279-357e0dd760ac,b62434ac-ef9f-4fe7-8279-357e0dd760ac,1,0,eb1c7d02-f5fc-4b37-9b32-7dd828958d76,eb1c7d02-f5fc-4b37-9b32-7dd828958d76,1,0,db2f20a7-e01f-4c03-9343-a815e1b46b50,db2f20a7-e01f-4c03-9343-a815e1b46b50,1,0,cf122ec9-d781-434c-9742-300e701317d6,cf122ec9-d781-434c-9742-300e701317d6,1,0,2aa2a968-2cac-4883-9bc8-5a3ccbd2e7a9,2aa2a968-2cac-4883-9bc8-5a3ccbd2e7a9,1,0,7d1361af-c5d3-4312-ab5e-ba00bf3418f2,7d1361af-c5d3-4312-ab5e-ba00bf3418f2,1,0,d7fdb3d5-3c18-4d9c-938a-2fbe8a96e877,d7fdb3d5-3c18-4d9c-938a-2fbe8a96e877,1,0,b8658e11-42b6-41bb-b384-5380e2228338,b8658e11-42b6-41bb-b384-5380e2228338,1,0,40c0919f-2c53-4502-af06-745dfa47fd8e,40c0919f-2c53-4502-af06-745dfa47fd8e,1,0,b01e4e7f-1b01-4c19-ab4b-7a8c1f6b0d22,b01e4e7f-1b01-4c19-ab4b-7a8c1f6b0d22,1,0,662a2803-da19-40c7-a906-e20d0843f67f,662a2803-da19-40c7-a906-e20d0843f67f,1,0,327c0731-1496-4463-837f-8f9c3e4c1a49,327c0731-1496-4463-837f-8f9c3e4c1a49,1,0,d74a37c2-7f50-40da-b7f8-29f79ae7230c,d74a37c2-7f50-40da-b7f8-29f79ae7230c,1,0,37a677e7-6661-41b5-ba68-740361168ccf,37a677e7-6661-41b5-ba68-740361168ccf,1,0,2a41d20d-d57a-4ce8-832f-c1b83099e563,2a41d20d-d57a-4ce8-832f-c1b83099e563,1,0,a0701ad3-572a-4806-91c0-6c5fff8dd350,a0701ad3-572a-4806-91c0-6c5fff8dd350,1,0,c9f268d1-6d2a-47d5-9371-f951b95d24a6,c9f268d1-6d2a-47d5-9371-f951b95d24a6,1,0,86b155be-d611-46b4-8275-bb19a2fa20ba,86b155be-d611-46b4-8275-bb19a2fa20ba,1,0,fedb2d36-bb2e-49dd-9d52-afcc41f3636b,fedb2d36-bb2e-49dd-9d52-afcc41f3636b,1,0,5d74d2d1-a2af-4a52-a884-a60e6b07ffac,5d74d2d1-a2af-4a52-a884-a60e6b07ffac,1,0,69e67507-e063-4221-9b84-2ee9d8903c1a,69e67507-e063-4221-9b84-2ee9d8903c1a,1,0,a649cb56-2a53-4508-8bf4-9aa01373ede2,a649cb56-2a53-4508-8bf4-9aa01373ede2,1,0,7e572d75-3a89-43c0-ad68-18498d67f8ca,7e572d75-3a89-43c0-ad68-18498d67f8ca,1,0,3c159a42-d9f9-4de4-a86f-893b1fc65b46,3c159a42-d9f9-4de4-a86f-893b1fc65b46,1,0,545cd0e7-4125-48f1-9123-0bc39e436e5e,545cd0e7-4125-48f1-9123-0bc39e436e5e,1,0,9a17eec6-b517-4133-8d25-bb953d84461f,9a17eec6-b517-4133-8d25-bb953d84461f,1,0,a0a61d7f-879d-4e92-98a3-5291c834c341,a0a61d7f-879d-4e92-98a3-5291c834c341,1,0,7bf60016-2edc-443b-98b4-0864b548c482,7bf60016-2edc-443b-98b4-0864b548c482,1,0,74139209-f345-4fd9-9ade-15cc4d399836,74139209-f345-4fd9-9ade-15cc4d399836,1,0,e39de1c5-b43b-4f71-aa32-c03b8afd6f65,e39de1c5-b43b-4f71-aa32-c03b8afd6f65,1,0,d5b6aad4-b1bd-464b-aca0-f8455d6388b4,d5b6aad4-b1bd-464b-aca0-f8455d6388b4,1,0,033ab408-fa51-4af2-a82c-f3167de00681,033ab408-fa51-4af2-a82c-f3167de00681,1,0,f7267120-f367-4d47-be5e-e2aa7a2ada46,f7267120-f367-4d47-be5e-e2aa7a2ada46,1,0,911b4ba4-1902-4c69-a4c9-963ab93d35b0,911b4ba4-1902-4c69-a4c9-963ab93d35b0,1,0,70cf60eb-a5f8-4573-a28b-6844721459de,70cf60eb-a5f8-4573-a28b-6844721459de,1,0,e2666bd9-bf44-408b-98fa-b9be26bde33f,e2666bd9-bf44-408b-98fa-b9be26bde33f,1,0,9151fa13-6612-4c4c-a264-3fd669205de7,9151fa13-6612-4c4c-a264-3fd669205de7,1,0,fee8fd9d-be7d-4560-9b96-819ffd497c88,fee8fd9d-be7d-4560-9b96-819ffd497c88,1,0,c86135b4-063c-4ca8-99e2-35c61026b43f,c86135b4-063c-4ca8-99e2-35c61026b43f,1,0,186792a9-0a07-4b6d-a9a0-337221f6b009,186792a9-0a07-4b6d-a9a0-337221f6b009,1,0,49163bf6-4a6a-4da9-a0ed-257c22224b47,49163bf6-4a6a-4da9-a0ed-257c22224b47,1,0,74c71abe-90eb-4c05-a4a6-375a93e7b99c,74c71abe-90eb-4c05-a4a6-375a93e7b99c,1,0,d36efd98-34a7-41b4-99b6-34c09e71525a,d36efd98-34a7-41b4-99b6-34c09e71525a,1,0,e73a6a9d-8ddd-4531-9f17-745117d9da9b,e73a6a9d-8ddd-4531-9f17-745117d9da9b,1,0,9dd4e17c-d10b-435e-8665-08997edc3e7e,9dd4e17c-d10b-435e-8665-08997edc3e7e,1,0,cafd44e1-8509-4550-8329-ff8cab0c31ae,cafd44e1-8509-4550-8329-ff8cab0c31ae,1,0,ee0412d3-58e7-4715-8774-d49778e1ef73,ee0412d3-58e7-4715-8774-d49778e1ef73,1,0,ea31df21-1402-417a-9788-b17a7116e842,ea31df21-1402-417a-9788-b17a7116e842,1,0,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,7a93efb9-62bb-437a-8095-b26a2c8ce8ed,1,0,e964753f-7f4c-4f9f-bd17-cdac317c1d35,e964753f-7f4c-4f9f-bd17-cdac317c1d35,1,0,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,20c2aba0-e2b2-4e4f-9d48-1515c0ae7b4d,1,0,43c22498-3fd6-4038-a291-05f0db9ab66a,43c22498-3fd6-4038-a291-05f0db9ab66a,1,0,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,4ffc9d16-c450-4ecb-b8f6-9ec6fe37fc75,1,0,ee6e5e56-5848-46b6-89bf-b9345a57d94c,ee6e5e56-5848-46b6-89bf-b9345a57d94c,1,0,8817c872-bdee-4577-bcc3-4046edc72803,8817c872-bdee-4577-bcc3-4046edc72803,1,0,5b88c214-4e4e-45c2-b8c5-14eb852e9900,5b88c214-4e4e-45c2-b8c5-14eb852e9900,1,0,105cd740-1f60-45e1-871c-adeecd291b0d,105cd740-1f60-45e1-871c-adeecd291b0d,1,0,95aec7d2-179b-4ea3-a3df-3d737b713564,95aec7d2-179b-4ea3-a3df-3d737b713564,1,0,4bd1cae4-d5b5-444e-9cf5-67a969714293,4bd1cae4-d5b5-444e-9cf5-67a969714293,1,0,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,1,0,f279a625-b88f-43b4-bce9-de1186fe7d7e,f279a625-b88f-43b4-bce9-de1186fe7d7e,1,0,a2f19cb2-9f2e-442b-b9f2-e5253c70871c,a2f19cb2-9f2e-442b-b9f2-e5253c70871c,1,0,0c67453e-038b-46f3-8c13-2786e8622ad8,0c67453e-038b-46f3-8c13-2786e8622ad8,1,0,8ff1dc4d-b46c-4519-80fe-19448e620e74,8ff1dc4d-b46c-4519-80fe-19448e620e74,1,0,7cd5ca8c-cc97-4664-964e-152fdcb5bdef,7cd5ca8c-cc97-4664-964e-152fdcb5bdef,1,0,be0a5f9a-ffab-41d8-b55a-a61355f5d269,be0a5f9a-ffab-41d8-b55a-a61355f5d269,1,0,9286105d-9aa9-44f9-ae63-bbbcec64eade,9286105d-9aa9-44f9-ae63-bbbcec64eade,1,0,99fc224a-2a61-441a-85e9-d69df6aa8b5e,99fc224a-2a61-441a-85e9-d69df6aa8b5e,1,0,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,1,0,d009782b-d73e-42d1-9979-2cbaf20ee98e,d009782b-d73e-42d1-9979-2cbaf20ee98e,1,0,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1,0,88d8edf7-654f-4627-b68d-c7e929726da6,88d8edf7-654f-4627-b68d-c7e929726da6,1,0,483720db-6c9e-4179-b5c7-56159c9b6073,483720db-6c9e-4179-b5c7-56159c9b6073,1,0,1725c619-9c4a-40ac-9044-00fee71945a4,1725c619-9c4a-40ac-9044-00fee71945a4,1,0,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,1,0,e95b126d-797d-4071-b7b4-b14aaf595f2d,e95b126d-797d-4071-b7b4-b14aaf595f2d,1,0,9241ea3c-633f-4469-9e70-c5a20e464da8,9241ea3c-633f-4469-9e70-c5a20e464da8,1,0,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,1,0,961ae0fb-7f7b-414d-8fbf-32b893b41085,961ae0fb-7f7b-414d-8fbf-32b893b41085,1,0,10adf8c8-6f5f-477f-b244-4452b774b766,10adf8c8-6f5f-477f-b244-4452b774b766,1,0,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,1,0,04ec5e44-8469-4e9c-8021-83d258f2ec54,04ec5e44-8469-4e9c-8021-83d258f2ec54,1,0,cff36ede-0bd1-424b-8c75-b9695133f32e,cff36ede-0bd1-424b-8c75-b9695133f32e,1,0,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,1,0,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,1,0,58b33683-1916-4aef-9b98-5569ef7782ed,58b33683-1916-4aef-9b98-5569ef7782ed,1,0,d3e1f622-f438-4cad-94ae-0272f51610f7,d3e1f622-f438-4cad-94ae-0272f51610f7,1,0,8569cd73-d40d-4d92-83e0-8ece0c03a86a,8569cd73-d40d-4d92-83e0-8ece0c03a86a,1,0,9ebe2809-be6b-4c91-9443-b237fb7ad43c,9ebe2809-be6b-4c91-9443-b237fb7ad43c,1,0,bf29c091-de15-4cd4-be0e-a9785f97d444,bf29c091-de15-4cd4-be0e-a9785f97d444,1,0,060b2bb4-ca03-4da9-930f-7f91f6299a35,060b2bb4-ca03-4da9-930f-7f91f6299a35,1,0,394b1a1c-a7ae-41b7-a346-4bac99fa567d,394b1a1c-a7ae-41b7-a346-4bac99fa567d,1,0,9a5fa511-59e8-4a1b-a101-f276f0b7b261,9a5fa511-59e8-4a1b-a101-f276f0b7b261,1,0,ccfe4e36-80b6-419f-8bb3-c1046203d023,ccfe4e36-80b6-419f-8bb3-c1046203d023,1,0,94b2e060-53b7-4b40-af05-30bea3520330,94b2e060-53b7-4b40-af05-30bea3520330,1,0,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,1,0,41b0dabd-85a3-4819-84dd-371eaf4f996e,41b0dabd-85a3-4819-84dd-371eaf4f996e,1,0,86a5ba4d-0681-4ddc-a505-0f537528e1a3,86a5ba4d-0681-4ddc-a505-0f537528e1a3,1,0,12d936f5-932b-4561-b934-c8444808a450,12d936f5-932b-4561-b934-c8444808a450,1,0,2ccb06ca-9bb7-4b74-9a96-c109bb117984,2ccb06ca-9bb7-4b74-9a96-c109bb117984,1,0,ac1a661d-db18-4576-80a9-a19d4140c05e,ac1a661d-db18-4576-80a9-a19d4140c05e,1,0,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,1,0,aa114d56-2faf-4925-8319-f0aa3993e9ee,aa114d56-2faf-4925-8319-f0aa3993e9ee,1,0,c3ffeb09-121b-4d77-9c15-def4648b4f3c,c3ffeb09-121b-4d77-9c15-def4648b4f3c,1,0,c2de0724-04c1-4adb-b62a-b7ba727dbe67,c2de0724-04c1-4adb-b62a-b7ba727dbe67,1,0,4ae26777-69ff-4a55-942b-0bad8ab7a70a,4ae26777-69ff-4a55-942b-0bad8ab7a70a,1,0,a0d8fb0a-0e90-4140-8687-e249b153dc66,a0d8fb0a-0e90-4140-8687-e249b153dc66,1,0,917c6f60-2a07-4587-9496-d393aff93953,917c6f60-2a07-4587-9496-d393aff93953,1,0,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,1,0,9fe72d73-4c95-47e0-bf92-dcb714d747c6,9fe72d73-4c95-47e0-bf92-dcb714d747c6,1,0,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,1,0,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,1,0,2b94076d-39ee-45ad-9ba5-435115cf5d4f,2b94076d-39ee-45ad-9ba5-435115cf5d4f,1,0,72ace16c-e90a-4d05-bc23-4351d4c87683,72ace16c-e90a-4d05-bc23-4351d4c87683,1,0,bd86e378-84bb-486a-be7b-319a3fe3b70b,bd86e378-84bb-486a-be7b-319a3fe3b70b,1,0,ef3bc279-6721-4949-8dc0-f96141f7f05c,ef3bc279-6721-4949-8dc0-f96141f7f05c,1,0,f81c7e21-48ad-4b64-975d-e62d34c7235a,f81c7e21-48ad-4b64-975d-e62d34c7235a,1,0,d0523c14-585e-45d3-9735-891235631004,d0523c14-585e-45d3-9735-891235631004,1,0,b6f8bc3e-f0cd-43ef-b060-d701cd446197,b6f8bc3e-f0cd-43ef-b060-d701cd446197,1,0,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,1,0,b94e805f-e1ab-4870-b855-98aa401864b2,b94e805f-e1ab-4870-b855-98aa401864b2,1,0,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,1,0,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,1,0,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,1,0,45af8f5d-d505-466b-a798-19f2219a180c,45af8f5d-d505-466b-a798-19f2219a180c,1,0,8a8229bc-f70a-4434-bacc-8a81fc58154b,8a8229bc-f70a-4434-bacc-8a81fc58154b,1,0,6324ad14-82ca-467b-b6b7-8d5f6049ca65,6324ad14-82ca-467b-b6b7-8d5f6049ca65,1,0,273446f0-f28b-4ce2-874c-3c6a57299b71,273446f0-f28b-4ce2-874c-3c6a57299b71,1,0,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,eb2f7449-ee42-43ec-b59c-3e07a6e3c139,1,0,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,f8a7913a-2c64-47e1-8ae9-622fc6e9477e,1,0,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,9b46a2b4-223d-4527-a94e-37ecd4fe72d7,1,0,7a4e17bf-3649-4982-a9c6-5982390f1f1d,7a4e17bf-3649-4982-a9c6-5982390f1f1d,1,0,722be6e0-2698-431b-9206-777a36e6742f,722be6e0-2698-431b-9206-777a36e6742f,1,0,75bb0122-26bd-40be-8de8-7a57680c85ae,75bb0122-26bd-40be-8de8-7a57680c85ae,1,0,28dd22df-07cc-4e6d-89b2-b15a13f76615,28dd22df-07cc-4e6d-89b2-b15a13f76615,1,0,0c98b025-5adb-44dc-ab14-4c6517cc230b,0c98b025-5adb-44dc-ab14-4c6517cc230b,1,0,da2f09bd-109f-43aa-a90b-f033d17ed689,da2f09bd-109f-43aa-a90b-f033d17ed689,1,0,c4b3cb31-356e-4868-921c-f6710349def8,c4b3cb31-356e-4868-921c-f6710349def8,1,0,f98a7b6d-f364-4b84-9aeb-8dd822ef582f,f98a7b6d-f364-4b84-9aeb-8dd822ef582f,1,0,44526cb1-561d-4b87-a628-d79cc64ccdec,44526cb1-561d-4b87-a628-d79cc64ccdec,1,0,5e4dbba3-07df-4e30-be14-d9244f5ec21c,5e4dbba3-07df-4e30-be14-d9244f5ec21c,1,0,c8116351-4487-40f3-ae04-1e0741cc5df6,c8116351-4487-40f3-ae04-1e0741cc5df6,1,0,a6be80f7-d6aa-4371-a180-3d355080d849,a6be80f7-d6aa-4371-a180-3d355080d849,1,0,b37722c3-e29f-4a40-b4eb-0317919fc7a5,b37722c3-e29f-4a40-b4eb-0317919fc7a5,1,0,b1b1cd90-094d-428b-a6bc-156521c1c54d,b1b1cd90-094d-428b-a6bc-156521c1c54d,1,0,4f79ef7c-79be-4a69-acc0-bd591c712d03,4f79ef7c-79be-4a69-acc0-bd591c712d03,1,0,a0dd2129-d3a1-4bca-b555-72b065be1c13,a0dd2129-d3a1-4bca-b555-72b065be1c13,1,0,dc5e8229-e301-477c-846e-2e7078e3ee5f,dc5e8229-e301-477c-846e-2e7078e3ee5f,1,0,24836e44-8fdd-44bd-91d8-4ddab2caf485,24836e44-8fdd-44bd-91d8-4ddab2caf485,1,0,3727bcfe-4d75-4270-86e7-4a66ab14866c,3727bcfe-4d75-4270-86e7-4a66ab14866c,1,0,870a4708-0b5a-4fa3-9978-d94b161d289a,870a4708-0b5a-4fa3-9978-d94b161d289a,1,0,30e9f89d-7b94-488e-9963-886c271b1af7,30e9f89d-7b94-488e-9963-886c271b1af7,1,0,91af7a52-0825-4af5-94df-cc501e0123cd,91af7a52-0825-4af5-94df-cc501e0123cd,1,0,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1,0,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,1,0,9693cc78-852e-445b-a7d2-f1689fa9eeec,9693cc78-852e-445b-a7d2-f1689fa9eeec,1,0,eb33e555-db41-462a-a45d-c7e0945cece8,eb33e555-db41-462a-a45d-c7e0945cece8,1,0,9cfd517c-1008-483a-9f65-7d15feb2cefc,9cfd517c-1008-483a-9f65-7d15feb2cefc,1,0,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,1,0,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,1,0,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,1,0,1d76f613-f4f6-4772-8c16-d97b3104a553,1d76f613-f4f6-4772-8c16-d97b3104a553,1,0,3e58d607-b906-449f-b044-9c130a487b86,3e58d607-b906-449f-b044-9c130a487b86,1,0,7a911212-7fde-4ea8-a1fa-229116b60895,7a911212-7fde-4ea8-a1fa-229116b60895,1,0,f4580043-5bc2-4295-8523-909302009b44,f4580043-5bc2-4295-8523-909302009b44,1,0,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,1,0,81936ac2-32fe-4e14-897b-0aba92b90c05,81936ac2-32fe-4e14-897b-0aba92b90c05,1,0,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,1,0,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,2e233e3c-687c-4516-87c6-5d6c5f9f04a2,1,0,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,2afdcde7-46ef-4624-8b84-c6381ff2f3a4,1,0,2d279d24-1953-4a2f-8206-77481d2fd718,2d279d24-1953-4a2f-8206-77481d2fd718,1,0,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,aa6abffe-1b09-48f9-9aee-4f234db6b2a2,1,0,0a920200-77d0-42ea-abf6-0d40d63289b0,0a920200-77d0-42ea-abf6-0d40d63289b0,1,0,c850bafc-4073-44ef-b148-194f87c46f0e,c850bafc-4073-44ef-b148-194f87c46f0e,1,0,6d1dd726-815d-476e-b668-95cff4182e54,6d1dd726-815d-476e-b668-95cff4182e54,1,0,12f4a0ed-4798-4467-8834-de3eb385e22d,12f4a0ed-4798-4467-8834-de3eb385e22d,1,0,5710809e-4c41-42ab-952f-f7778fe9be0f,5710809e-4c41-42ab-952f-f7778fe9be0f,1,0,0811f6c2-6bb3-43b8-9944-910adc4c6f23,0811f6c2-6bb3-43b8-9944-910adc4c6f23,1,0,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,c1646df4-9fce-44f0-9cc3-a5dab0bbef2e,1,0,c86b02ab-3532-4f4c-b993-e237ed0d4d12,c86b02ab-3532-4f4c-b993-e237ed0d4d12,1,0,83c860a2-d0d7-4b7c-a127-78d86b155cfa,83c860a2-d0d7-4b7c-a127-78d86b155cfa,1,0,06e45039-8bc4-44dd-8a93-2cec34ad51ee,06e45039-8bc4-44dd-8a93-2cec34ad51ee,1,0,46e01647-cbdd-4387-affc-29b92ede8644,46e01647-cbdd-4387-affc-29b92ede8644,1,0,faa44953-118b-4027-a913-c485bca7a93f,faa44953-118b-4027-a913-c485bca7a93f,1,0,c9bd0dcd-98ec-4dc9-869a-e735fd269046,c9bd0dcd-98ec-4dc9-869a-e735fd269046,1,0,d039bfa4-39a0-43d4-ab6a-0697f9d2b375,d039bfa4-39a0-43d4-ab6a-0697f9d2b375,1,0,09072c75-75c7-4050-b674-9454558a1f87,09072c75-75c7-4050-b674-9454558a1f87,1,0,f0c8d2d2-d597-4f09-8257-0fa7524f1e44,f0c8d2d2-d597-4f09-8257-0fa7524f1e44,1,0,3e2f75ab-4143-48ca-83db-3006cb2a8584,3e2f75ab-4143-48ca-83db-3006cb2a8584,1,0,91a82492-5e27-46b6-b1a8-48e89a437715,91a82492-5e27-46b6-b1a8-48e89a437715,1,0,53bc7bfd-8786-464f-a615-ceae2971cbc9,53bc7bfd-8786-464f-a615-ceae2971cbc9,1,0,aa77817b-bd2f-4757-99b0-5e67a1b032d3,aa77817b-bd2f-4757-99b0-5e67a1b032d3,1,0,8cc27936-976d-4f31-91c6-644d15b69c55,8cc27936-976d-4f31-91c6-644d15b69c55,1,0,cf9de063-89f4-4632-b7a1-0cfbea6df643,cf9de063-89f4-4632-b7a1-0cfbea6df643,1,0,ee3bab2c-bd6a-4a33-89a2-78b4dd89bb88,ee3bab2c-bd6a-4a33-89a2-78b4dd89bb88,1,0,2478fb43-57a3-4348-b3d4-61f015e4e231,2478fb43-57a3-4348-b3d4-61f015e4e231,1,0,daa99b45-b2d2-47bc-9d7e-2d21b1a3dfd8,daa99b45-b2d2-47bc-9d7e-2d21b1a3dfd8,1,0,0449c160-01e5-4fe4-8759-5b93c484b467,0449c160-01e5-4fe4-8759-5b93c484b467,1,0,0684e4ba-28c7-4032-a43f-a3a4a37ec50b,0684e4ba-28c7-4032-a43f-a3a4a37ec50b,1,0,bcac012d-b4a9-49bb-9c54-722c741d183c,bcac012d-b4a9-49bb-9c54-722c741d183c,1,0,5370d079-975f-4f7c-95c3-7868147ecc76,5370d079-975f-4f7c-95c3-7868147ecc76,1,0,4dd66f76-e4e0-4f84-9fad-bb922cd51503,4dd66f76-e4e0-4f84-9fad-bb922cd51503,1,0,e76a411a-121b-4791-a785-dd54795eaa7f,e76a411a-121b-4791-a785-dd54795eaa7f,1,0,66844ae3-f098-462c-aef8-1fd38c403760,66844ae3-f098-462c-aef8-1fd38c403760,1,0,be96718a-223d-4597-bccf-2fb7d16dbbcc,be96718a-223d-4597-bccf-2fb7d16dbbcc,1,0,eb551461-ae0d-41dd-89fa-2f6e7f3c4840,eb551461-ae0d-41dd-89fa-2f6e7f3c4840,1,0,acec1961-a953-4f7b-b42b-baa1b8b3be14,acec1961-a953-4f7b-b42b-baa1b8b3be14,1,0,eb6394d4-1679-4494-8d23-419f5a714cdc,eb6394d4-1679-4494-8d23-419f5a714cdc,1,0,ffb3c2e4-bb9b-4d12-80bb-79e3c6d5700d,ffb3c2e4-bb9b-4d12-80bb-79e3c6d5700d,1,0,7e9fadd6-d0ad-4856-a195-1058f00bf488,7e9fadd6-d0ad-4856-a195-1058f00bf488,1,0,76d0c5ee-5b85-4670-ba1c-8fdaa7ba872a,76d0c5ee-5b85-4670-ba1c-8fdaa7ba872a,1,0,84f67d35-ca48-4fff-94e4-5f4beb7e3c08,84f67d35-ca48-4fff-94e4-5f4beb7e3c08,1,0,2972c142-0aac-4e36-b34e-4e73f18ba9cb,2972c142-0aac-4e36-b34e-4e73f18ba9cb,1,0,d6915227-4ede-4cd2-9e7c-d23dc409936e,d6915227-4ede-4cd2-9e7c-d23dc409936e,1,0,46c3341c-352c-43fb-b338-15c8ad487fbf,46c3341c-352c-43fb-b338-15c8ad487fbf,1,0,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,1,0,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,1,0,f9450d6a-849c-4621-b528-9cafc4819b44,f9450d6a-849c-4621-b528-9cafc4819b44,1,0,5b7cac99-2fca-4dbb-8d49-b84f310a2496,5b7cac99-2fca-4dbb-8d49-b84f310a2496,1,0,a4673d5c-9dae-48f7-9c91-53c1302a266a,a4673d5c-9dae-48f7-9c91-53c1302a266a,1,0,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,1,0,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,1,0,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,1,0,3f410b53-e762-41fe-9469-d538dfec3a9a,3f410b53-e762-41fe-9469-d538dfec3a9a,1,0,bb11c22e-0fbd-4985-be67-0866df7f7e61,bb11c22e-0fbd-4985-be67-0866df7f7e61,1,0,92ea60c0-1027-4337-9130-40028951f09b,92ea60c0-1027-4337-9130-40028951f09b,1,0,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,1,0,d64f18a4-ff93-4284-9eca-085109eafd24,d64f18a4-ff93-4284-9eca-085109eafd24,1,0,6381b8d2-7722-45c7-8800-19f6574d7d7a,6381b8d2-7722-45c7-8800-19f6574d7d7a,1,0,bf428e7a-2970-4bab-8c8e-35ea16151c0e,bf428e7a-2970-4bab-8c8e-35ea16151c0e,1,0,232dbd5f-b7f1-4463-946c-b8fbf93ac466,232dbd5f-b7f1-4463-946c-b8fbf93ac466,1,0,a1a74b34-4174-4769-8f03-bd4a32e83418,a1a74b34-4174-4769-8f03-bd4a32e83418,1,0,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,1,0,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,1,0,7086199b-20ec-4a74-a52f-71824134e8c5,7086199b-20ec-4a74-a52f-71824134e8c5,1,0,1731708f-53cb-4b00-b90e-f581b4baa845,1731708f-53cb-4b00-b90e-f581b4baa845,1,0,d4b0feca-c00a-4d48-9f23-d92277ea6483,d4b0feca-c00a-4d48-9f23-d92277ea6483,1,0,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,1,0,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,1,0,23cb5bc2-9638-4d1c-b4bc-d5297e271570,23cb5bc2-9638-4d1c-b4bc-d5297e271570,1,0,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,1,0,04b7389d-697d-4b0d-a239-ac8c674cc46f,04b7389d-697d-4b0d-a239-ac8c674cc46f,1,0,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,1,0,864cad61-8280-415d-8fe1-bcb39d56670a,864cad61-8280-415d-8fe1-bcb39d56670a,1,0,b106bd29-5dc7-44d7-94d0-00f61499392e,b106bd29-5dc7-44d7-94d0-00f61499392e,1,0,a4febff8-0566-4977-bf55-1d574568fe9f,a4febff8-0566-4977-bf55-1d574568fe9f,1,0,5199cc65-bed1-40b9-96fe-cf6d855a8b91,5199cc65-bed1-40b9-96fe-cf6d855a8b91,1,0,f518add9-5c26-4dac-ab2e-b30fe3fbd347,f518add9-5c26-4dac-ab2e-b30fe3fbd347,1,0,23f53317-7aa8-4816-8a69-3d39d5e76da0,23f53317-7aa8-4816-8a69-3d39d5e76da0,1,0,9ade5155-fa6d-4999-b019-a5e7e235a158,9ade5155-fa6d-4999-b019-a5e7e235a158,1,0,8b302c5e-b255-4cb5-94d9-0dfef4250097,8b302c5e-b255-4cb5-94d9-0dfef4250097,1,0,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,08eb74b6-1e1c-4004-a0f8-b6f1fdfc68ef,1,0,d4eb3e9a-feb5-42d9-841b-ff20288228b6,d4eb3e9a-feb5-42d9-841b-ff20288228b6,1,0,49d713b8-6a61-4bd1-9650-0de1869967d2,49d713b8-6a61-4bd1-9650-0de1869967d2,1,0,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,1,0,bd0e4aeb-19f9-48fc-b838-38d785004360,bd0e4aeb-19f9-48fc-b838-38d785004360,1,0,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,1,0,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,0f2ec7ac-6d3f-4fcf-af3d-b0bfaa187a4b,1,0,6d351276-2c04-4198-a3e4-865881c12f5c,6d351276-2c04-4198-a3e4-865881c12f5c,1,0,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,73b1d2e2-0eeb-45dc-8ca3-3bda594d6823,1,0,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,5c4abd61-2f29-499e-a2ca-d133e9eeeaea,1,0,8e07a76d-db30-491c-b296-181c8e689382,8e07a76d-db30-491c-b296-181c8e689382,1,0,4f1752ae-42d0-477d-854b-de143c428a85,4f1752ae-42d0-477d-854b-de143c428a85,1,0,29674b66-c542-4a34-8caa-8e57a51bd190,29674b66-c542-4a34-8caa-8e57a51bd190,1,0,1a41acdd-3503-4c69-b93b-eb1cb6749712,1a41acdd-3503-4c69-b93b-eb1cb6749712,1,0,0e45c53e-7571-49bf-b673-cff53d32af89,0e45c53e-7571-49bf-b673-cff53d32af89,1,0,169b0670-8fa7-48d1-b6b1-2cf581b18390,169b0670-8fa7-48d1-b6b1-2cf581b18390,1,0,2e239650-973b-4908-b91e-477062046528,2e239650-973b-4908-b91e-477062046528,1,0,4692eeee-5b73-42f3-ad39-794141af9e2b,4692eeee-5b73-42f3-ad39-794141af9e2b,1,0,0ddeed48-b98a-47c3-84a2-2eac065be06c,0ddeed48-b98a-47c3-84a2-2eac065be06c,1,0,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,1,0,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,1,0,47714327-dd28-4e32-a1c9-20ee47d9afd0,47714327-dd28-4e32-a1c9-20ee47d9afd0,1,0,4d76ef7a-f1a6-4147-84f4-6e1717dfd77e,4d76ef7a-f1a6-4147-84f4-6e1717dfd77e,1,0,d1eb0aa7-b485-4f3a-846d-be069ca807c0,d1eb0aa7-b485-4f3a-846d-be069ca807c0,1,0,afde7867-15d3-43fa-b439-6d9e40df580b,afde7867-15d3-43fa-b439-6d9e40df580b,1,0,a676ff94-a0d1-4de9-8690-ec67f2c891d8,a676ff94-a0d1-4de9-8690-ec67f2c891d8,1,0,012bf716-3672-462e-b390-7bb4384ab4b1,012bf716-3672-462e-b390-7bb4384ab4b1,1,0,65342599-ff37-4f99-8e40-f05d87403bcf,65342599-ff37-4f99-8e40-f05d87403bcf,1,0,3a3f505a-7a50-4111-8029-5b9057fed232,3a3f505a-7a50-4111-8029-5b9057fed232,1,0,1d66cd80-fd61-4bf2-a7f9-34b33443e1ea,1d66cd80-fd61-4bf2-a7f9-34b33443e1ea,1,0,7b638691-416d-4484-81f4-e4c796a92818,7b638691-416d-4484-81f4-e4c796a92818,1,0,03ab92e2-81a3-4e38-84a8-85c1d78d51e9,03ab92e2-81a3-4e38-84a8-85c1d78d51e9,1,0,ef09e296-af08-44ff-8303-4833b23a12c3,ef09e296-af08-44ff-8303-4833b23a12c3,1,0,8984f28e-8c83-499a-838c-5f51410d7b0e,8984f28e-8c83-499a-838c-5f51410d7b0e,1,0,73bf8c40-76ee-4c61-b56a-898bcd6da1ca,73bf8c40-76ee-4c61-b56a-898bcd6da1ca,1,0,434a0471-1389-4764-a901-69249e1fdc38,434a0471-1389-4764-a901-69249e1fdc38,1,0,7b6c1d9f-968e-4126-990e-fa2787ad83b2,7b6c1d9f-968e-4126-990e-fa2787ad83b2,1,0,b89108a9-8b4e-4b34-8f72-4eb502963743,b89108a9-8b4e-4b34-8f72-4eb502963743,1,0,398b93b1-620d-4942-ba44-7ea0f9cc14f0,398b93b1-620d-4942-ba44-7ea0f9cc14f0,1,0,7b06537e-d818-41b3-acc5-b6b63b543be8,7b06537e-d818-41b3-acc5-b6b63b543be8,1,0,74226c30-5f9b-4e47-b7cc-35e92139cbfa,74226c30-5f9b-4e47-b7cc-35e92139cbfa,1,0,09f812cb-770c-4f85-87f0-db35952c764e,09f812cb-770c-4f85-87f0-db35952c764e,1,0,8bbbcfd9-b6da-41f6-b543-863b12b9fb59,8bbbcfd9-b6da-41f6-b543-863b12b9fb59,1,0,eb48f8a9-1644-432d-a8a8-e63bc013a2fe,eb48f8a9-1644-432d-a8a8-e63bc013a2fe,1,0,36951804-70a4-45fa-9fad-1c37fd3ce7b7,36951804-70a4-45fa-9fad-1c37fd3ce7b7,1,0,d0031774-fa35-469f-9f8a-3aaa920928a0,d0031774-fa35-469f-9f8a-3aaa920928a0,1,0,6da02618-2454-48fe-b1dc-399d0d40d043,6da02618-2454-48fe-b1dc-399d0d40d043,1,0,5a080203-ecd2-4f40-ac64-c8024eda595e,5a080203-ecd2-4f40-ac64-c8024eda595e,1,0,3eabcb69-398b-43f5-bf53-c20f90bee5c4,3eabcb69-398b-43f5-bf53-c20f90bee5c4,1,0,9c33639e-529a-490f-9365-80778b54c3f7,9c33639e-529a-490f-9365-80778b54c3f7,1,0,561b97a0-9d42-4735-a606-8d5b5862689f,561b97a0-9d42-4735-a606-8d5b5862689f,1,0,10d5c0c2-301f-4477-a88f-254f99a30fa0,10d5c0c2-301f-4477-a88f-254f99a30fa0,1,0,84ba4ba7-2743-438a-8b65-cc14090f8a92,84ba4ba7-2743-438a-8b65-cc14090f8a92,1,0,cdc4312c-b1af-407c-bfc3-28db04915aa6,cdc4312c-b1af-407c-bfc3-28db04915aa6,1,0,97b76ee8-c73f-456b-9008-b453bd376317,97b76ee8-c73f-456b-9008-b453bd376317,1,0,ee305e39-978b-4069-a4e6-05e761a5d6ae,ee305e39-978b-4069-a4e6-05e761a5d6ae,1,0,965650ae-8a6e-469a-869a-0ce821818058,965650ae-8a6e-469a-869a-0ce821818058,1,0,00fde8e2-3eb3-484a-a960-a390cbdaa16a,00fde8e2-3eb3-484a-a960-a390cbdaa16a,1,0,c7a82aa5-043c-46a2-9f5a-cba098ca36bd,c7a82aa5-043c-46a2-9f5a-cba098ca36bd,1,0,94744edd-61d0-4329-95d8-fc19dc7c6af1,94744edd-61d0-4329-95d8-fc19dc7c6af1,1,0,43bbf87f-8f21-49b9-be2f-eceb64c2c650,43bbf87f-8f21-49b9-be2f-eceb64c2c650,1,0,69db1a1c-3e9d-4e3c-b31e-731f2b8635b9,69db1a1c-3e9d-4e3c-b31e-731f2b8635b9,1,0,621b1881-9a7f-4fa4-a373-46467743e29c,621b1881-9a7f-4fa4-a373-46467743e29c,1,0,932ef5a0-4bad-424d-9772-ad8393c12006,932ef5a0-4bad-424d-9772-ad8393c12006,1,0,35dbc542-3ad9-4a72-9863-229a67cda425,35dbc542-3ad9-4a72-9863-229a67cda425,1,0,8e4277e9-983a-4d43-b08e-a4f918df87bf,8e4277e9-983a-4d43-b08e-a4f918df87bf,1,0,110e76d3-26ad-4392-9f82-255d792478a1,110e76d3-26ad-4392-9f82-255d792478a1,1,0,9117730e-1d3f-47b6-84fc-7a02377f86a0,9117730e-1d3f-47b6-84fc-7a02377f86a0,1,0,0a7eec2f-41c6-4d77-98a4-5e0bfc698997,0a7eec2f-41c6-4d77-98a4-5e0bfc698997,1,0,ec06e6a7-7894-4411-9b54-f811837b8a2e,ec06e6a7-7894-4411-9b54-f811837b8a2e,1,0,f43f3a1b-7f71-4a4f-9ec2-5f4d7d77efca,f43f3a1b-7f71-4a4f-9ec2-5f4d7d77efca,1,0,0947bd87-9542-4d2b-8439-9f6ccdb2c9cc,0947bd87-9542-4d2b-8439-9f6ccdb2c9cc,1,0,c0e2673a-1846-4ae5-933a-4e33b73a866b,c0e2673a-1846-4ae5-933a-4e33b73a866b,1,0,3996aff6-b6ce-4f6b-a2f3-1b0bf8b1d0c2,3996aff6-b6ce-4f6b-a2f3-1b0bf8b1d0c2,1,0,f5fadf27-b8ca-421b-8a73-c3f10aef248b,f5fadf27-b8ca-421b-8a73-c3f10aef248b,1,0,006fa20c-ba4b-4003-a743-b47c4b7bd815,006fa20c-ba4b-4003-a743-b47c4b7bd815,1,0,4ecd2da3-4d0c-416b-ae97-66f6f753226b,4ecd2da3-4d0c-416b-ae97-66f6f753226b,1,0,ec680d71-eb28-4b42-a664-c6137c259eaa,ec680d71-eb28-4b42-a664-c6137c259eaa,1,0,efa1d27f-0620-4b3a-b058-12f160008478,efa1d27f-0620-4b3a-b058-12f160008478,1,0,2dd0ec2e-457d-4147-b806-ff3d6fa091fb,2dd0ec2e-457d-4147-b806-ff3d6fa091fb,1,0,005d4afc-7d09-4cef-acaa-50d49e455df0,005d4afc-7d09-4cef-acaa-50d49e455df0,1,0,d773673e-992d-4f22-9fb3-acfb8863217d,d773673e-992d-4f22-9fb3-acfb8863217d,1,0,6cf00002-d685-4340-a873-196126a19664,6cf00002-d685-4340-a873-196126a19664,1,0,e422c08d-f54f-4a49-b0c5-a50bf63973c9,e422c08d-f54f-4a49-b0c5-a50bf63973c9,1,0,8288078e-0d2f-47c5-8e58-c5a17a76cc11,8288078e-0d2f-47c5-8e58-c5a17a76cc11,1,0,82abcc34-c8aa-42a0-b2fe-f66b7cafc2a0,82abcc34-c8aa-42a0-b2fe-f66b7cafc2a0,1,0,304feda3-6d33-466c-9e0d-9cea97d763be,304feda3-6d33-466c-9e0d-9cea97d763be,1,0,ecaf5d2f-0cea-4ad0-8550-51be37cead5c,ecaf5d2f-0cea-4ad0-8550-51be37cead5c,1,0,448e7386-cc56-4578-9c57-ef270980a0ff,448e7386-cc56-4578-9c57-ef270980a0ff,1,0,c2cdc60c-157d-450f-b3ba-2b6242459ebb,c2cdc60c-157d-450f-b3ba-2b6242459ebb,1,0,186f87ca-b9d5-48fa-b196-eed2794bade4,186f87ca-b9d5-48fa-b196-eed2794bade4,1,0,b87d9e04-9e12-42a5-b9fd-ea9a9bab59eb,b87d9e04-9e12-42a5-b9fd-ea9a9bab59eb,1,0,65b653b7-1298-40e4-9d69-2ce7810d5985,65b653b7-1298-40e4-9d69-2ce7810d5985,1,0,5fd170a9-44fc-4d18-9e51-2dbf09ca902e,5fd170a9-44fc-4d18-9e51-2dbf09ca902e,1,0,66359bb1-8692-415a-86d9-f40545f88d3a,66359bb1-8692-415a-86d9-f40545f88d3a,1,0,83be7bdf-e915-440f-a39f-1bb74db34b3e,83be7bdf-e915-440f-a39f-1bb74db34b3e,1,0,190b6efe-e67e-4274-abb9-263178a6ec4a,190b6efe-e67e-4274-abb9-263178a6ec4a,1,0,1363523a-929e-49ac-ae39-d43acf9f0478,1363523a-929e-49ac-ae39-d43acf9f0478,1,0,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,f6ff0bb8-c1fd-4eae-b919-6d10d4504f0c,1,0,2876c476-8280-426d-8bf9-c93beda0ddd5,2876c476-8280-426d-8bf9-c93beda0ddd5,1,0,963e0813-4f6b-4d31-b66d-77125c47ce19,963e0813-4f6b-4d31-b66d-77125c47ce19,1,0,a720abc8-dcf0-4684-8d94-22d394a8e4df,a720abc8-dcf0-4684-8d94-22d394a8e4df,1,0,e40f53de-c27b-4e74-8241-f784d7ca5c84,e40f53de-c27b-4e74-8241-f784d7ca5c84,1,0,ef38b84d-277e-48c2-8826-330132eb6807,ef38b84d-277e-48c2-8826-330132eb6807,1,0,67a50910-059a-4724-84e0-c21bc3ac74c2,67a50910-059a-4724-84e0-c21bc3ac74c2,1,0,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,1,0,d9f76f2f-2b32-4986-8987-a585f831d951,d9f76f2f-2b32-4986-8987-a585f831d951,1,0,b1a96083-1c12-43f4-ba61-3a0588fc7310,b1a96083-1c12-43f4-ba61-3a0588fc7310,1,0,2e37c7d0-b97f-4c72-821e-b2bb77fb3140,2e37c7d0-b97f-4c72-821e-b2bb77fb3140,1,0,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,1,0,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,1,0,2c0d11fc-b927-4b5d-a16c-d60e69580824,2c0d11fc-b927-4b5d-a16c-d60e69580824,1,0,ee49981d-91f6-4002-9205-b8a53e6f54e0,ee49981d-91f6-4002-9205-b8a53e6f54e0,1,0,64a74365-ca32-4b7d-af8e-695624e3dcb6,64a74365-ca32-4b7d-af8e-695624e3dcb6,1,0,5251e744-666e-48a0-a5b4-9cef313c7631,5251e744-666e-48a0-a5b4-9cef313c7631,1,0,d3aca87c-2b47-48da-82dd-18ca867c8463,d3aca87c-2b47-48da-82dd-18ca867c8463,1,0,669b81a6-6526-4b5c-aafa-1988ae5253ce,669b81a6-6526-4b5c-aafa-1988ae5253ce,1,0,ab138a0c-71fe-4ca2-9d82-21f5830dde24,ab138a0c-71fe-4ca2-9d82-21f5830dde24,1,0,ffa6c000-ec84-4749-8ffe-42b0599751cd,ffa6c000-ec84-4749-8ffe-42b0599751cd,1,0,740bde9c-9fe1-4183-ab01-3fbe91d33b61,740bde9c-9fe1-4183-ab01-3fbe91d33b61,1,0,e8e19542-c5c8-418b-8a83-20336fd9075a,e8e19542-c5c8-418b-8a83-20336fd9075a,1,0,ebedc283-5eb0-459b-b686-f8643666b8b8,ebedc283-5eb0-459b-b686-f8643666b8b8,1,0,6a6afffd-cfed-4801-8b59-34d27e46565c,6a6afffd-cfed-4801-8b59-34d27e46565c,1,0,a469b12d-4537-419c-91e0-37abc9d31505,a469b12d-4537-419c-91e0-37abc9d31505,1,0,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,6f312bda-1f4d-48a6-bd95-f23f34f0ea4b,1,0,82c42232-531e-403f-8599-cc21a248fa2c,82c42232-531e-403f-8599-cc21a248fa2c,1,0,9104b791-9ac4-41ba-a7f0-9e609db3b578,9104b791-9ac4-41ba-a7f0-9e609db3b578,1,0,2d3721d1-816f-4e84-9df1-863cb269d83d,2d3721d1-816f-4e84-9df1-863cb269d83d,1,0,eaa11272-8cc2-4f82-808f-e4f641748574,eaa11272-8cc2-4f82-808f-e4f641748574,1,0,9dfd78a7-74ba-4c7a-8842-4baf4ffd5e4f,9dfd78a7-74ba-4c7a-8842-4baf4ffd5e4f,1,0,7d422da3-8ec4-4bc8-94ba-88d92625d4c7,7d422da3-8ec4-4bc8-94ba-88d92625d4c7,1,0,8035e1ce-a36a-4628-8196-1f04f50e230a,8035e1ce-a36a-4628-8196-1f04f50e230a,1,0,51f08b3c-2f03-408e-89d5-53ccbaec4e74,51f08b3c-2f03-408e-89d5-53ccbaec4e74,1,0,920ebc04-3018-4948-bae2-16de8f0f0c9a,920ebc04-3018-4948-bae2-16de8f0f0c9a,1,0,4c4fc449-05a5-4223-bd28-c73d27780a9b,4c4fc449-05a5-4223-bd28-c73d27780a9b,1,0,0b09cf2f-1759-4362-b997-29e09ac00445,0b09cf2f-1759-4362-b997-29e09ac00445,1,0,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,1,0,828ddf5d-ca09-4baf-897f-77d569e02a6b,828ddf5d-ca09-4baf-897f-77d569e02a6b,1,0,8856015c-a695-4b1a-99ef-770263f9dc4a,8856015c-a695-4b1a-99ef-770263f9dc4a,1,0,183ec2b5-e173-4885-9e26-1098ffa15020,183ec2b5-e173-4885-9e26-1098ffa15020,1,0,74702fdf-bfc5-4658-ba58-e39bcfbaa647,74702fdf-bfc5-4658-ba58-e39bcfbaa647,1,0,2f436ec3-6a04-4d2c-998a-c60ea875ca86,2f436ec3-6a04-4d2c-998a-c60ea875ca86,1,0,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,1,0,ae641a80-4ada-4592-ace9-29a82e6700e4,ae641a80-4ada-4592-ace9-29a82e6700e4,1,0,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,1,0,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,1,0,703453e8-cb49-491b-8e19-a17b89894d1e,703453e8-cb49-491b-8e19-a17b89894d1e,1,0,f0b0608c-178f-4dea-b461-0d8f00d79d30,f0b0608c-178f-4dea-b461-0d8f00d79d30,1,0,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,ed2dba0c-7fe3-4d24-b6a6-b104beadc286,1,0,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,a4c98768-c9fc-4f95-b89b-bb1cb0e8fade,1,0,5546b9a9-a4fe-4a2b-9492-883bcb37a210,5546b9a9-a4fe-4a2b-9492-883bcb37a210,1,0,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,6fb76c5f-844f-4cbc-ae7c-4ac834fddfc9,1,0,275a5772-8428-497a-81ef-c919f15fcccd,275a5772-8428-497a-81ef-c919f15fcccd,1,0,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,8df6e7e6-2a1e-4cf3-bdc9-60e52ea3f625,1,0,b5278cbd-1771-4739-9013-a28682689778,b5278cbd-1771-4739-9013-a28682689778,1,0,a52f2de4-f414-4837-9b1a-6d8f282e1327,a52f2de4-f414-4837-9b1a-6d8f282e1327,1,0,82573440-0ef5-4c07-bb1e-fe90295981d2,82573440-0ef5-4c07-bb1e-fe90295981d2,1,0,804be484-09cf-45a4-bd1f-c8850067e2b2,804be484-09cf-45a4-bd1f-c8850067e2b2,1,0,f1a145ce-a199-475c-ab8a-065c11a27277,f1a145ce-a199-475c-ab8a-065c11a27277,1,0,8d509c4e-fcea-4ccd-aec4-e146f2d4319b,8d509c4e-fcea-4ccd-aec4-e146f2d4319b,1,0,d126a11e-c770-4309-941f-cbcdd5cbad5d,d126a11e-c770-4309-941f-cbcdd5cbad5d,1,0,f4d88096-bff9-416a-8f75-9143ede1213f,f4d88096-bff9-416a-8f75-9143ede1213f,1,0,6b0721fe-d27f-4d1a-b377-26fce2ed1687,6b0721fe-d27f-4d1a-b377-26fce2ed1687,1,0,25c97480-330c-42f2-a2a5-031062a3a683,25c97480-330c-42f2-a2a5-031062a3a683,1,0,a2fb1bf9-d29a-4bfe-95f1-10883fa019b3,a2fb1bf9-d29a-4bfe-95f1-10883fa019b3,1,0,6adc3aa8-8784-467d-8e12-b60418a5c729,6adc3aa8-8784-467d-8e12-b60418a5c729,1,0,265206ed-4d41-497e-a483-c14052134500,265206ed-4d41-497e-a483-c14052134500,1,0,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,bf070420-9eb7-4372-96a6-b0d00ac3ce8c,1,0,10336352-f3a1-4bc3-bdec-1a2eef15f176,10336352-f3a1-4bc3-bdec-1a2eef15f176,1,0,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,cacabf2f-6d1c-4c33-80c7-c27a5e757cc9,1,0,3b7c713e-81ae-4adc-9519-99c936599ef7,3b7c713e-81ae-4adc-9519-99c936599ef7,1,0,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1c8ffbbd-035c-45cf-8ec8-dc5d26d7f673,1,0,ecda2c4b-6411-4b47-ab59-1918bad5acdd,ecda2c4b-6411-4b47-ab59-1918bad5acdd,1,0,a9a05a66-0a1c-4e53-9d09-1abe8f45e354,a9a05a66-0a1c-4e53-9d09-1abe8f45e354,1,0,2c811ee8-f50d-4c39-82ee-0492feb1c431,2c811ee8-f50d-4c39-82ee-0492feb1c431,1,0,399f679b-f48a-4d4e-b890-5eab9e4598c3,399f679b-f48a-4d4e-b890-5eab9e4598c3,1,0,da9ca4c4-c291-4f8b-accd-bc1b123ed4f8,da9ca4c4-c291-4f8b-accd-bc1b123ed4f8,1,0,9ad1ea04-1aee-4a80-b4df-60526cdf3ad0,9ad1ea04-1aee-4a80-b4df-60526cdf3ad0,1,0,0a92df3d-fb51-4fba-938c-55846929bd5f,0a92df3d-fb51-4fba-938c-55846929bd5f,1,0,1d005a8d-aaac-4442-a7dc-12634d03f6f3,1d005a8d-aaac-4442-a7dc-12634d03f6f3,1,0,348d0ad2-f64e-4ea0-8b8e-11bbc10926f7,348d0ad2-f64e-4ea0-8b8e-11bbc10926f7,1,0,7f7eb00d-7a38-4025-8853-9d1cf2dab1e3,7f7eb00d-7a38-4025-8853-9d1cf2dab1e3,1,0,36221881-a9c8-4b91-acac-44f7c065c05a,36221881-a9c8-4b91-acac-44f7c065c05a,1,0,3fdcf013-38e0-4a30-9ae8-19100e6704ba,3fdcf013-38e0-4a30-9ae8-19100e6704ba,1,0,876e31ff-ab7b-4ea4-b491-161963727dd1,876e31ff-ab7b-4ea4-b491-161963727dd1,1,0,bb43995b-68b4-41a1-8458-e10a2d8925f1,bb43995b-68b4-41a1-8458-e10a2d8925f1,1,0,61730dd9-fed7-43ce-8f38-724cac8f3d08,61730dd9-fed7-43ce-8f38-724cac8f3d08,1,0,e6a494b8-27e7-46a6-9435-7be6e150a69e,e6a494b8-27e7-46a6-9435-7be6e150a69e,1,0,133dc852-59d3-4351-934d-8845f8a38431,133dc852-59d3-4351-934d-8845f8a38431,1,0,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,1,0,b67914a8-d483-4bed-bd4d-a4aadd4998a4,b67914a8-d483-4bed-bd4d-a4aadd4998a4,1,0,707a8a49-fec5-454c-9e80-c3da829d395c,707a8a49-fec5-454c-9e80-c3da829d395c,1,0,b5ea4aff-11be-4232-94a2-cb92801b6c49,b5ea4aff-11be-4232-94a2-cb92801b6c49,1,0,6f630213-c16c-421c-a160-09e3c729ab26,6f630213-c16c-421c-a160-09e3c729ab26,1,0,878c638c-7c84-4914-896a-d4fdf0d759ef,878c638c-7c84-4914-896a-d4fdf0d759ef,1,0,6065653e-b7a9-4033-9617-f64430c57d89,6065653e-b7a9-4033-9617-f64430c57d89,1,0,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,1,0,00d1d85b-c258-4f10-9d13-a99375a29fc1,00d1d85b-c258-4f10-9d13-a99375a29fc1,1,0,f6d79449-eca9-4d13-9ddc-8b36ae9e729e,f6d79449-eca9-4d13-9ddc-8b36ae9e729e,1,0,b9d56dc6-3a10-4795-9ca3-dbf69310813e,b9d56dc6-3a10-4795-9ca3-dbf69310813e,1,0,f4b53ce1-8c1b-4f57-b5de-acb4692a37d8,f4b53ce1-8c1b-4f57-b5de-acb4692a37d8,1,0,9b18e04f-036d-43ae-b949-9432f96d71d9,9b18e04f-036d-43ae-b949-9432f96d71d9,1,0,e99a1f54-4001-45ee-81e3-472656c05f57,e99a1f54-4001-45ee-81e3-472656c05f57,1,0,b104e7b9-8a41-4154-a84b-d1bb12fab939,b104e7b9-8a41-4154-a84b-d1bb12fab939,1,0,86b835c4-341e-4b0d-99e5-2369684ff3f4,86b835c4-341e-4b0d-99e5-2369684ff3f4,1,0,55c48fa8-8d12-4378-97a0-c0ed683f6b83,55c48fa8-8d12-4378-97a0-c0ed683f6b83,1,0,b0f74a92-f5e4-4859-9a72-643ddb5315cb,b0f74a92-f5e4-4859-9a72-643ddb5315cb,1,0,1864093d-62ac-4b12-ad16-c460432c99f6,1864093d-62ac-4b12-ad16-c460432c99f6,1,0,6eb78c87-24ed-43a8-800d-ccde02358b32,6eb78c87-24ed-43a8-800d-ccde02358b32,1,0,787d5fec-c476-4519-884b-f62492fc8396,787d5fec-c476-4519-884b-f62492fc8396,1,0,59ebd5fb-d782-46ea-b693-7885d2ababa8,59ebd5fb-d782-46ea-b693-7885d2ababa8,1,0,39a39567-43d8-47c5-9f17-0a11f31e129a,39a39567-43d8-47c5-9f17-0a11f31e129a,1,0,b24e8ff0-eb86-4ce6-84f5-49134b48f031,b24e8ff0-eb86-4ce6-84f5-49134b48f031,1,0,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,1,0,e983f539-e369-491e-9cee-510518187870,e983f539-e369-491e-9cee-510518187870,1,0,876b23bf-2f48-4916-ad0f-4de8306e1864,876b23bf-2f48-4916-ad0f-4de8306e1864,1,0,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,1,0,e7c63a25-c804-4bc4-a6f1-81009dd889e2,e7c63a25-c804-4bc4-a6f1-81009dd889e2,1,0,e99a1b17-0e37-489a-bc39-3dd2e23b0861,e99a1b17-0e37-489a-bc39-3dd2e23b0861,1,0,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,1,0,4c1576c4-b327-4ec1-87bc-662c5aba343b,4c1576c4-b327-4ec1-87bc-662c5aba343b,1,0,70e710c5-42df-465f-a9c5-8345c87e1f19,70e710c5-42df-465f-a9c5-8345c87e1f19,1,0,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,1,0,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,1,0,4492ac73-eb91-41f8-98f1-54c2b3ad212a,4492ac73-eb91-41f8-98f1-54c2b3ad212a,1,0,869b43fb-968f-4fe0-b945-5030c90a38f2,869b43fb-968f-4fe0-b945-5030c90a38f2,1,0,af071a52-212b-4131-98e6-81f6048a70e6,af071a52-212b-4131-98e6-81f6048a70e6,1,0,37210dde-9a2f-475c-8341-578ac99f0e17,37210dde-9a2f-475c-8341-578ac99f0e17,1,0,e5094d4f-ee61-4142-a97b-d96172350f65,e5094d4f-ee61-4142-a97b-d96172350f65,1,0,3a8fffb6-a732-440c-afb9-d1c699ea53b6,3a8fffb6-a732-440c-afb9-d1c699ea53b6,1,0,b0650787-8ff5-4407-b491-bcdc2f61fd58,b0650787-8ff5-4407-b491-bcdc2f61fd58,1,0,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,1,0,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,1,0,9aadad98-69f5-41ce-ad1c-0afd8c610d86,9aadad98-69f5-41ce-ad1c-0afd8c610d86,1,0,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,1,0,3d662173-e19d-4077-9a08-8c8899226e24,3d662173-e19d-4077-9a08-8c8899226e24,1,0,69fd1e6e-7302-4ca8-8419-ec567ae66bef,69fd1e6e-7302-4ca8-8419-ec567ae66bef,1,0,0eee931a-57bb-4844-8e6e-eaca342640a0,0eee931a-57bb-4844-8e6e-eaca342640a0,1,0,20c57e30-5856-4801-9e77-8006471d89f8,20c57e30-5856-4801-9e77-8006471d89f8,1,0,64eff9f4-c57b-40a0-bd83-7e371fd010ce,64eff9f4-c57b-40a0-bd83-7e371fd010ce,1,0,4a3fe393-8aea-4394-8c10-a234f1f191ad,4a3fe393-8aea-4394-8c10-a234f1f191ad,1,0,6f9a3d00-d935-4fa6-9fd2-14700226daff,6f9a3d00-d935-4fa6-9fd2-14700226daff,1,0,d792831c-698d-40c6-96c2-dd0ae6f30707,d792831c-698d-40c6-96c2-dd0ae6f30707,1,0,a1d91c5f-1acd-4b46-887e-d06e7260dd20,a1d91c5f-1acd-4b46-887e-d06e7260dd20,1,0,3fd26019-c464-4c73-b18e-0888740b1747,3fd26019-c464-4c73-b18e-0888740b1747,1,0,a21989bd-a57f-4969-be3b-d8b39ead4145,a21989bd-a57f-4969-be3b-d8b39ead4145,1,0,c4aee120-cdbb-4b48-a1c7-99cccbafb120,c4aee120-cdbb-4b48-a1c7-99cccbafb120,1,0,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,1,0,a3667b25-7c18-446d-a318-685a4fe4bf89,a3667b25-7c18-446d-a318-685a4fe4bf89,1,0,fd271670-bde6-4351-abec-eb82548c6c98,fd271670-bde6-4351-abec-eb82548c6c98,1,0,498b012b-bb63-490e-8100-1d33dc84b400,498b012b-bb63-490e-8100-1d33dc84b400,1,0,8103f12c-ed50-4052-8117-33b6d11ef620,8103f12c-ed50-4052-8117-33b6d11ef620,1,0,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,4f8653e4-3f58-4bad-8ded-424fe7b1d18a,1,0,799b3dda-fbfc-4dea-a577-30321e64f4d5,799b3dda-fbfc-4dea-a577-30321e64f4d5,1,0,7c7857b6-90e8-4b3f-9902-fd81bf68d133,7c7857b6-90e8-4b3f-9902-fd81bf68d133,1,0,617de19c-bf01-4900-832a-c169e9faeb79,617de19c-bf01-4900-832a-c169e9faeb79,1,0,70b73fd0-f5dc-411e-9bbb-10a538e8281b,70b73fd0-f5dc-411e-9bbb-10a538e8281b,1,0,758f44ad-54da-4f72-accf-0afecc4f4827,758f44ad-54da-4f72-accf-0afecc4f4827,1,0,05ee4a7c-63e6-4587-8be7-e206345e3471,05ee4a7c-63e6-4587-8be7-e206345e3471,1,0,98d5e98b-0382-4b28-a5d9-24392925664a,98d5e98b-0382-4b28-a5d9-24392925664a,1,0,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,1,0,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,2a77eb39-0487-4fb0-8d5b-d4a27592ea60,1,0,19a18193-c5d3-4e56-86c5-5a81c525e9ad,19a18193-c5d3-4e56-86c5-5a81c525e9ad,1,0,c208fcc0-d7b2-435b-963a-e18c97727f8f,c208fcc0-d7b2-435b-963a-e18c97727f8f,1,0,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,ac5db038-8bc3-45ff-9e8d-04ea9fef6d43,1,0,bf11f7b1-6332-4499-ba48-b94bc10ef869,bf11f7b1-6332-4499-ba48-b94bc10ef869,1,0,4de445f0-7c27-4540-a5a8-9c3ca2a13fd2,4de445f0-7c27-4540-a5a8-9c3ca2a13fd2,1,0,2977fedd-2c56-4d21-8eb1-a424e1b17cb3,2977fedd-2c56-4d21-8eb1-a424e1b17cb3,1,0,0b8a2936-07c5-4b90-80e6-5a058e546de6,0b8a2936-07c5-4b90-80e6-5a058e546de6,1,0,34524248-668e-48e5-a801-f489cd664de8,34524248-668e-48e5-a801-f489cd664de8,1,0,ae0891ae-ecd2-4072-8d2b-0556030c9dfd,ae0891ae-ecd2-4072-8d2b-0556030c9dfd,1,0,e8f36bca-738b-471c-b8d3-8a484978934a,e8f36bca-738b-471c-b8d3-8a484978934a,1,0,05c27c89-2c26-4252-842d-9aa43ba0ea2f,05c27c89-2c26-4252-842d-9aa43ba0ea2f,1,0,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,7c1e16c2-201d-4a3f-b0f4-9d66f5f8a68b,1,0,f092729c-6b5d-4709-8b28-15e06129731d,f092729c-6b5d-4709-8b28-15e06129731d,1,0,c03be2f7-d681-417d-975a-5c8c7b716659,c03be2f7-d681-417d-975a-5c8c7b716659,1,0,fca7af5f-bdc0-4264-be68-5e5e38545368,fca7af5f-bdc0-4264-be68-5e5e38545368,1,0,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,a3fc0bce-a87e-4c15-b57b-f285a694bcdf,1,0,ae124745-edfb-11e6-4681-a8667f21fde4,ae124745-edfb-11e6-4681-a8667f21fde4,1,0,f6fcf9c2-edfb-11e6-4681-a8667f21fde4,f6fcf9c2-edfb-11e6-4681-a8667f21fde4,1,0,ec70cf10-edfb-11e6-4681-a8667f21fde4,ec70cf10-edfb-11e6-4681-a8667f21fde4,1,0,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,7c47f039-1ca9-4c6f-ac36-f4cb59b48b65,1,0,0b7cee9b-3870-49f5-a58e-063cf5353467,0b7cee9b-3870-49f5-a58e-063cf5353467,1,0,d392a791-af74-40c9-ab20-6ed6aeabe864,d392a791-af74-40c9-ab20-6ed6aeabe864,1,0,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,974d2430-1ff6-4be9-a5aa-aa896e9a66d4,1,0,1612570d-b069-405a-9dd3-80b8175fb468,1612570d-b069-405a-9dd3-80b8175fb468,1,0,3c429fe8-e663-4a58-817f-8f8382697dbb,3c429fe8-e663-4a58-817f-8f8382697dbb,1,0,c37be0c3-d2db-4e63-a8cb-7956a5396650,c37be0c3-d2db-4e63-a8cb-7956a5396650,1,0,83180e0d-fc4b-41ec-9a17-5af555a4776f,83180e0d-fc4b-41ec-9a17-5af555a4776f,1,0,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,27c52afc-7127-41e1-af8a-1b1bd2c9bfa8,1,0,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,1,0,561ed574-617d-4a46-b32b-f022e07846c8,561ed574-617d-4a46-b32b-f022e07846c8,1,0,cba706bf-a9a7-4dda-9c5a-a26e85119396,cba706bf-a9a7-4dda-9c5a-a26e85119396,1,0,159a4eb5-00cd-426c-86e3-09cd3f569f22,159a4eb5-00cd-426c-86e3-09cd3f569f22,1,0,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,1,0,3e8c6546-416c-4437-8c85-2cf591b4fc3f,3e8c6546-416c-4437-8c85-2cf591b4fc3f,1,0,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,1,0,9a0b27db-e4ac-496b-b6de-876b90381527,9a0b27db-e4ac-496b-b6de-876b90381527,1,0,2ded5135-b6c3-46dd-b563-7b6fab986d23,2ded5135-b6c3-46dd-b563-7b6fab986d23,1,0,14215720-ccb3-4e5a-8345-cd42c96a3e77,14215720-ccb3-4e5a-8345-cd42c96a3e77,1,0,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,24fa0604-b6a5-49ad-9d03-b2cf8e81dad8,1,0,0690a5c7-bc25-4101-afa5-69c095d415c2,0690a5c7-bc25-4101-afa5-69c095d415c2,1,0,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,2ad7b509-4cd1-456a-a6ae-94649fdf8c3e,1,0,79013bba-a0f2-481c-a63e-095a54ee52aa,79013bba-a0f2-481c-a63e-095a54ee52aa,1,0,8523c346-f144-41b8-a702-2d588e7097c2,8523c346-f144-41b8-a702-2d588e7097c2,1,0,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,93969a30-d9d7-4f2f-85fa-57a4eb7495bf,1,0,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,9fb73c9b-05de-4474-8a28-7e3fd5b2b143,1,0,fa2bd6a6-bb46-4e21-8684-248578310164,fa2bd6a6-bb46-4e21-8684-248578310164,1,0,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,f7cf3b42-39c0-48db-b8ca-fe9ea267a45a,1,0,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,3a0c06eb-f6d5-46c3-b0b9-c8d98e572093,1,0,88ccac36-169d-48f8-bc68-15e3bb775b79,88ccac36-169d-48f8-bc68-15e3bb775b79,1,0,a1640988-bd60-43b3-86f1-184b9db275c6,a1640988-bd60-43b3-86f1-184b9db275c6,1,0,300a02f7-8062-4843-b11e-0321f8b40f4d,300a02f7-8062-4843-b11e-0321f8b40f4d,1,0,c8015ae6-31a7-49f4-a9e6-5d13774f64e5,c8015ae6-31a7-49f4-a9e6-5d13774f64e5,1,0,970430c4-37fc-476c-a3f6-5f6bebd2e663,970430c4-37fc-476c-a3f6-5f6bebd2e663,1,0,4cddde4a-42d5-44d0-a693-ea90eab9b169,4cddde4a-42d5-44d0-a693-ea90eab9b169,1,0,d9d612bb-6d04-4186-b243-f99aded0ba43,d9d612bb-6d04-4186-b243-f99aded0ba43,1,0,15db8b7b-59f5-4551-b2bd-b24801f056b5,15db8b7b-59f5-4551-b2bd-b24801f056b5,1,0,88d2236b-794b-485a-b075-f1a54cadcd3a,88d2236b-794b-485a-b075-f1a54cadcd3a,1,0,b7f9553f-6219-4401-a6f4-9debd47186d2,b7f9553f-6219-4401-a6f4-9debd47186d2,1,0,26a7e044-a583-40af-9daa-5aea628c8f19,26a7e044-a583-40af-9daa-5aea628c8f19,1,0,548717ca-0645-49b4-9580-c77cd4d03ebb,548717ca-0645-49b4-9580-c77cd4d03ebb,1,0,29c337bd-9811-4fce-91bb-20c253d2d14a,29c337bd-9811-4fce-91bb-20c253d2d14a,1,0,b451f2fc-ced2-418a-a803-4fe99488b394,b451f2fc-ced2-418a-a803-4fe99488b394,1,0,62269222-67a7-489e-ba59-4294902275bc,62269222-67a7-489e-ba59-4294902275bc,1,0,fed1b714-a2c9-42cf-9ced-35ed895e4167,fed1b714-a2c9-42cf-9ced-35ed895e4167,1,0,6f334263-10c8-4187-9a84-d2fd1afadc48,6f334263-10c8-4187-9a84-d2fd1afadc48,1,0,f5674a0d-a106-4cc0-a402-b378280eab3d,f5674a0d-a106-4cc0-a402-b378280eab3d,1,0,fa99302b-3e86-4330-b9ff-c38d933f81f0,fa99302b-3e86-4330-b9ff-c38d933f81f0,1,0,8db2b1d8-c415-4846-bd1a-9fec1b105ff0,8db2b1d8-c415-4846-bd1a-9fec1b105ff0,1,0,9a68a81b-c6bd-4353-baf4-da8a21f98fb9,9a68a81b-c6bd-4353-baf4-da8a21f98fb9,1,0,3ed20a3b-031c-4f2b-a66a-14cceed80407,3ed20a3b-031c-4f2b-a66a-14cceed80407,1,0,3831a5d8-12d5-4730-ac2e-e11f084dc684,3831a5d8-12d5-4730-ac2e-e11f084dc684,1,0,b6dce793-c652-48de-b2da-1dc3e89e1521,b6dce793-c652-48de-b2da-1dc3e89e1521,1,0,2e6a596c-c203-48b3-af11-bf0aef0f70a1,2e6a596c-c203-48b3-af11-bf0aef0f70a1,1,0,82eb7d08-12ad-42a2-9257-91b93f7cc890,82eb7d08-12ad-42a2-9257-91b93f7cc890,1,0,93070fc1-4204-43b7-b8eb-1bf905f5fa3f,93070fc1-4204-43b7-b8eb-1bf905f5fa3f,1,0,50754c7d-9c8a-497c-a4c8-76d7400b3412,50754c7d-9c8a-497c-a4c8-76d7400b3412,1,0,193f2d79-83a7-4044-89c6-0b5d7c7cf80a,193f2d79-83a7-4044-89c6-0b5d7c7cf80a,1,0,3bcce139-d42e-45c2-ace8-28aa34e01a38,3bcce139-d42e-45c2-ace8-28aa34e01a38,1,0,d29ba846-bc42-4364-b69d-4b56532920e0,d29ba846-bc42-4364-b69d-4b56532920e0,1,0,83239cd4-50cb-4281-8be3-fd89e410c15c,83239cd4-50cb-4281-8be3-fd89e410c15c,1,0,fb9c08ee-92e9-4bd9-8794-ef0f221eee99,fb9c08ee-92e9-4bd9-8794-ef0f221eee99,1,0,e4cd44e6-1255-490f-96d9-f805ac92cf67,e4cd44e6-1255-490f-96d9-f805ac92cf67,1,0,8ae9be37-cda5-4b66-8a97-5e77d2a2c75f,8ae9be37-cda5-4b66-8a97-5e77d2a2c75f,1,0,5a9011fc-c023-47fb-a999-2c6ca33a04b9,5a9011fc-c023-47fb-a999-2c6ca33a04b9,1,0,ab574fa5-0730-4456-b741-111e5ea8a896,ab574fa5-0730-4456-b741-111e5ea8a896,1,0,b8d5adf0-dc2f-4041-bc97-cb2442f00054,b8d5adf0-dc2f-4041-bc97-cb2442f00054,1,0,398199c4-4830-48e9-89c5-45c2c5a30ee6,398199c4-4830-48e9-89c5-45c2c5a30ee6,1,0,546ba3bb-4614-423f-954c-466530f42784,546ba3bb-4614-423f-954c-466530f42784,1,0,e5bc54f0-d7d0-471c-adda-a0e73e0dd3cf,e5bc54f0-d7d0-471c-adda-a0e73e0dd3cf,1,0,af447f33-ef41-4eda-96ec-5bac26fff33e,af447f33-ef41-4eda-96ec-5bac26fff33e,1,0,f0c83fc5-6e9a-4185-ab43-2b419ace7909,f0c83fc5-6e9a-4185-ab43-2b419ace7909,1,0,4bd15718-6a0e-4a86-921a-09d38ba4be4c,4bd15718-6a0e-4a86-921a-09d38ba4be4c,1,0,32586ba6-8922-4321-b134-70d1b77a16a4,32586ba6-8922-4321-b134-70d1b77a16a4,1,0,a21cf522-d657-49ba-a198-01ff1de5e3f0,a21cf522-d657-49ba-a198-01ff1de5e3f0,1,0,4dc698da-8471-4b3f-816d-f1467cd2e5f1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,1,0,7ceb2f18-4dae-4b13-a5be-e949be165b4e,7ceb2f18-4dae-4b13-a5be-e949be165b4e,1,0,c4f94f6d-e33f-4226-bf47-c4b544098082,c4f94f6d-e33f-4226-bf47-c4b544098082,1,0,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,1,0,fc67b510-3fb4-4305-92d2-c252bc718f03,fc67b510-3fb4-4305-92d2-c252bc718f03,1,0,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,ed98a7b2-ad31-401f-a65e-dfbcc8e5a4a8,1,0,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,9a5e3d2c-ab69-4f9d-a56f-20bb5f0be1e2,1,0,cf1f7915-94ad-47e7-8676-73271d0cf71e,cf1f7915-94ad-47e7-8676-73271d0cf71e,1,0,fceb6e4a-bd51-4193-a542-70d2317af669,fceb6e4a-bd51-4193-a542-70d2317af669,1,0,f9f991a6-ddf3-4953-8a1f-e6c0e1a7f4e9,f9f991a6-ddf3-4953-8a1f-e6c0e1a7f4e9,1,0,80847d57-1795-46c7-a106-926e1f43ac1e,80847d57-1795-46c7-a106-926e1f43ac1e,1,0,38685415-dc87-48b4-8cc4-f85b438f2ec2,38685415-dc87-48b4-8cc4-f85b438f2ec2,1,0,110eff8b-aeec-4ba5-b710-fefc1bd60284,110eff8b-aeec-4ba5-b710-fefc1bd60284,1,0,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,0a8a6bb9-8b6a-43cf-9d46-b18a8a9591d8,1,0,75eca481-002b-4046-898d-dfac9357611f,75eca481-002b-4046-898d-dfac9357611f,1,0,0110decc-d06e-43cf-9d01-30d412edcdd7,0110decc-d06e-43cf-9d01-30d412edcdd7,1,0,3ea32a24-d37b-4fad-937a-9d1357d649a9,3ea32a24-d37b-4fad-937a-9d1357d649a9,1,0,2856ee9a-0fea-4684-b7b8-4844773eae07,2856ee9a-0fea-4684-b7b8-4844773eae07,1,0,84e09840-8d67-416f-87a2-7f03c04180c9,84e09840-8d67-416f-87a2-7f03c04180c9,1,0,0388f22d-f91d-45c9-a8ae-900a24cbfe67,0388f22d-f91d-45c9-a8ae-900a24cbfe67,1,0,60fa2562-4914-46d6-a00a-1bb6e2803263,60fa2562-4914-46d6-a00a-1bb6e2803263,1,0,0d61a8d4-2dc8-435e-a238-416d7640576f,0d61a8d4-2dc8-435e-a238-416d7640576f,1,0,5ea899d4-e076-4a1c-838c-e369abc4705f,5ea899d4-e076-4a1c-838c-e369abc4705f,1,0,f2bf5f4a-e53b-4300-bbc7-97ac2e06f3c2,f2bf5f4a-e53b-4300-bbc7-97ac2e06f3c2,1,0,ab2e75f0-8da7-4b38-8f30-537424b719db,ab2e75f0-8da7-4b38-8f30-537424b719db,1,0,db344a42-61b8-4544-9aa1-8840ab8a70f0,db344a42-61b8-4544-9aa1-8840ab8a70f0,1,0,bd029e3f-a6bd-4be9-81f3-f3ea84f424ce,bd029e3f-a6bd-4be9-81f3-f3ea84f424ce,1,0,043bd776-5a7b-45ff-8b4a-5eed2bba0054,043bd776-5a7b-45ff-8b4a-5eed2bba0054,1,0,6a708860-e3b6-46ea-bea5-0d3e426c72f6,6a708860-e3b6-46ea-bea5-0d3e426c72f6,1,0,7c9e30d0-4a25-4d1d-a5ad-c48b231f453c,7c9e30d0-4a25-4d1d-a5ad-c48b231f453c,1,0,f53a3a46-edad-4cc0-8814-3755c2ea2c03,f53a3a46-edad-4cc0-8814-3755c2ea2c03,1,0,0a60b201-23f7-483b-ac16-5d270f32344e,0a60b201-23f7-483b-ac16-5d270f32344e,1,0,78058cd3-eb56-483c-96f5-1bf8883abc76,78058cd3-eb56-483c-96f5-1bf8883abc76,1,0,cd1fbfdd-d05e-4c22-aa04-83e9d36fb557,cd1fbfdd-d05e-4c22-aa04-83e9d36fb557,1,0,b67fb4f8-e895-4a8e-9230-31bc5cde4953,b67fb4f8-e895-4a8e-9230-31bc5cde4953,1,0,f3c9fde1-6d0e-4319-a798-ed8e330750de,f3c9fde1-6d0e-4319-a798-ed8e330750de,1,0,50d1bd75-3523-41c0-8da1-500731c0872b,50d1bd75-3523-41c0-8da1-500731c0872b,1,0,1a8d3872-6e19-4a49-b0ea-b120b6c09d7f,1a8d3872-6e19-4a49-b0ea-b120b6c09d7f,1,0,ab1efcef-f81b-45e5-893d-56e75c1e0a6f,ab1efcef-f81b-45e5-893d-56e75c1e0a6f,1,0,bbefbf22-6d11-4639-b53e-b72e94ff307c,bbefbf22-6d11-4639-b53e-b72e94ff307c,1,0,dca6a730-8a3f-4b78-926b-2287e21a25a1,dca6a730-8a3f-4b78-926b-2287e21a25a1,1,0,bdec80e6-4aef-4603-98dc-3332abda955c,bdec80e6-4aef-4603-98dc-3332abda955c,1,0,8be7adcd-b49a-4192-9f62-e0b0089b0386,8be7adcd-b49a-4192-9f62-e0b0089b0386,1,0,e4e8e36b-6060-43f3-8b05-bbbf61c3decc,e4e8e36b-6060-43f3-8b05-bbbf61c3decc,1,0,a53447c8-0299-4cf0-a6f9-5a3af423be38,a53447c8-0299-4cf0-a6f9-5a3af423be38,1,0,4f8a2980-bdb4-4a4f-82ec-2822dc1adc49,4f8a2980-bdb4-4a4f-82ec-2822dc1adc49,1,0,91b5a3ca-5f7b-462d-b322-ab8e938add40,91b5a3ca-5f7b-462d-b322-ab8e938add40,1,0,8db8d80c-bf04-4252-8371-46a1dd7e2720,8db8d80c-bf04-4252-8371-46a1dd7e2720,1,0,6fdb4b65-1caf-4472-8135-c6a479bda6d4,6fdb4b65-1caf-4472-8135-c6a479bda6d4,1,0,b5a8b32f-8f8d-4e13-9113-94e66f5c9621,b5a8b32f-8f8d-4e13-9113-94e66f5c9621,1,0,9b8cf6f0-2b56-4954-b982-db18ad78c5ef,9b8cf6f0-2b56-4954-b982-db18ad78c5ef,1,0,1e869478-9bff-4854-9f9c-699b7d1c8faa,1e869478-9bff-4854-9f9c-699b7d1c8faa,1,0,b8fe43d1-b9a7-4ec1-94bd-1e7fad424f8d,b8fe43d1-b9a7-4ec1-94bd-1e7fad424f8d,1,0,f64089ee-72dd-4fcf-8926-31e95c6fcf77,f64089ee-72dd-4fcf-8926-31e95c6fcf77,1,0,5d93aea8-3f41-4e77-bed5-4b2377cbfe0e,5d93aea8-3f41-4e77-bed5-4b2377cbfe0e,1,0,e1e151cc-7b8a-4125-804f-c902a522ed81,e1e151cc-7b8a-4125-804f-c902a522ed81,1,0,f475494e-fe94-4902-b2da-3ade01eba5bb,f475494e-fe94-4902-b2da-3ade01eba5bb,1,0,fbb814b2-cb2f-474d-9c96-5571cef3030e,fbb814b2-cb2f-474d-9c96-5571cef3030e,1,0,4e892154-3279-492c-9eae-124304225c5d,4e892154-3279-492c-9eae-124304225c5d,1,0,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,1,0,575a135a-6ffd-4ae8-a597-7e584df9bac4,575a135a-6ffd-4ae8-a597-7e584df9bac4,1,0,693a7196-f525-4bd2-a417-e902977f21cb,693a7196-f525-4bd2-a417-e902977f21cb,1,0,9bb39184-08b7-440e-a8f8-5caf0083ba0f,9bb39184-08b7-440e-a8f8-5caf0083ba0f,1,0,d48e817e-f6a4-47e5-a052-35d09e066490,d48e817e-f6a4-47e5-a052-35d09e066490,1,0,7bf36370-3761-4fd5-bea5-90fa142a9d57,7bf36370-3761-4fd5-bea5-90fa142a9d57,1,0,3b81427f-cf64-4a5e-adb3-5415d515fecd,3b81427f-cf64-4a5e-adb3-5415d515fecd,1,0,e9f2b604-7181-476d-8b34-3a544cbb353d,e9f2b604-7181-476d-8b34-3a544cbb353d,1,0,73773919-d01c-41dd-bb31-9c66648ac0ff,73773919-d01c-41dd-bb31-9c66648ac0ff,1,0,5d1afad0-3d7e-4214-b52a-72c184490084,5d1afad0-3d7e-4214-b52a-72c184490084,1,0,5f7901a1-f992-42fa-9ddb-d63574da3b56,5f7901a1-f992-42fa-9ddb-d63574da3b56,1,0,26abd45a-12b3-4312-88fb-53c90a6e6679,26abd45a-12b3-4312-88fb-53c90a6e6679,1,0,1541ad74-3e73-4699-bccf-c13313fbedfe,1541ad74-3e73-4699-bccf-c13313fbedfe,1,0,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1037ecb7-6819-4ba2-8c93-eccbbdf825be,1,0,1f03420b-0480-451a-9263-8431ff0b0c73,1f03420b-0480-451a-9263-8431ff0b0c73,1,0,2bf547e4-d295-4f69-9dbf-9a9d91b2db98,2bf547e4-d295-4f69-9dbf-9a9d91b2db98,1,0,46506a80-495e-4f06-a191-54ccf5d6cc3f,46506a80-495e-4f06-a191-54ccf5d6cc3f,1,0,b9788ea3-b910-4b5b-96c3-921d62745b6e,b9788ea3-b910-4b5b-96c3-921d62745b6e,1,0,0646de72-49fd-466d-af0f-843bfa527049,0646de72-49fd-466d-af0f-843bfa527049,1,0,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,7c3463c8-ea36-415a-8e9d-dc7bd927b9d1,1,0,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,260f4fb1-02cb-4c32-ba4b-5aa202cd0311,1,0,be2b4dba-e77e-4947-bd2f-0710b357ca2a,be2b4dba-e77e-4947-bd2f-0710b357ca2a,1,0,df750e63-50fc-4085-b8b8-f05e4751ff51,df750e63-50fc-4085-b8b8-f05e4751ff51,1,0,86182e9a-89e0-40d7-b2d7-fcd92ee42942,86182e9a-89e0-40d7-b2d7-fcd92ee42942,1,0,091cb921-c7e3-4a5f-97b7-34e625159b9c,091cb921-c7e3-4a5f-97b7-34e625159b9c,1,0,f6118cdd-1dcd-464e-a49d-e95c69466750,f6118cdd-1dcd-464e-a49d-e95c69466750,1,0,39932897-959b-41a6-94ad-61426abfdbd9,39932897-959b-41a6-94ad-61426abfdbd9,1,0,c56ea6f3-1032-4b7a-a20e-e912196da1cd,c56ea6f3-1032-4b7a-a20e-e912196da1cd,1,0,b69b611d-18d3-4e78-8a09-f010bcf9c261,b69b611d-18d3-4e78-8a09-f010bcf9c261,1,0,e8e087c1-9131-4037-8562-8bce8c38f78c,e8e087c1-9131-4037-8562-8bce8c38f78c,1,0,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,1,0,6adaef8e-82b6-4664-9748-4f41b170d91a,6adaef8e-82b6-4664-9748-4f41b170d91a,1,0,20d655a7-788c-48bc-83ae-25003106bedb,20d655a7-788c-48bc-83ae-25003106bedb,1,0,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,1,0,68a72014-4b2e-4347-aaa7-54d95b8eb919,68a72014-4b2e-4347-aaa7-54d95b8eb919,1,0,379c9295-d0d5-418d-82f3-5ae19985cc53,379c9295-d0d5-418d-82f3-5ae19985cc53,1,0,25830f5b-27e2-4eff-9728-b21eb498727d,25830f5b-27e2-4eff-9728-b21eb498727d,1,0,af02f534-8508-4f9f-bcc1-0c6f3d696971,af02f534-8508-4f9f-bcc1-0c6f3d696971,1,0,dd345cfb-ea0c-4ea8-9b35-22547b000275,dd345cfb-ea0c-4ea8-9b35-22547b000275,1,0,a71d9c41-7510-4d38-90df-1034977b8f45,a71d9c41-7510-4d38-90df-1034977b8f45,1,0,86a871da-3725-43a1-a7c3-98acd187011b,86a871da-3725-43a1-a7c3-98acd187011b,1,0,2447cfeb-d877-4222-8ac2-b0026b85f932,2447cfeb-d877-4222-8ac2-b0026b85f932,1,0,fb94e9cb-1f27-42a6-a701-18bbe5888e70,fb94e9cb-1f27-42a6-a701-18bbe5888e70,1,0,2e26e32e-a0c6-4460-99de-865622202166,2e26e32e-a0c6-4460-99de-865622202166,1,0,c9489a6e-45af-4877-9788-158071571a0a,c9489a6e-45af-4877-9788-158071571a0a,1,0,23959912-f8fc-42bc-9ec2-1d520ebc5dad,23959912-f8fc-42bc-9ec2-1d520ebc5dad,1,0,4770398f-8013-4d43-93ce-ec1165e40c4e,4770398f-8013-4d43-93ce-ec1165e40c4e,1,0,9a706997-90cb-430d-972c-d2bad87c4a79,9a706997-90cb-430d-972c-d2bad87c4a79,1,0,6f661660-b9c4-41d4-99a8-e08006cfe9c8,6f661660-b9c4-41d4-99a8-e08006cfe9c8,1,0,199e79fa-54d6-4748-aaaa-9c55283582a3,199e79fa-54d6-4748-aaaa-9c55283582a3,1,0,5ef026c2-2ef4-45d6-9792-5ba0d298714b,5ef026c2-2ef4-45d6-9792-5ba0d298714b,1,0,45d61391-4cf7-4f45-8775-ada582c42400,45d61391-4cf7-4f45-8775-ada582c42400,1,0,78b2a913-2ab9-455d-85a3-504f0f468468,78b2a913-2ab9-455d-85a3-504f0f468468,1,0,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,1,0,560b5b12-4dee-4c69-ab6b-7680757a2797,560b5b12-4dee-4c69-ab6b-7680757a2797,1,0,3cfb1ce0-de42-4914-85c0-807d0c10f77e,3cfb1ce0-de42-4914-85c0-807d0c10f77e,1,0,a27244c2-ac65-423f-afce-42efd288a83d,a27244c2-ac65-423f-afce-42efd288a83d,1,0,d4002184-8e08-4dcc-9070-62f595e82e23,d4002184-8e08-4dcc-9070-62f595e82e23,1,0,62163fda-1a09-4d4f-b290-76ff324042ab,62163fda-1a09-4d4f-b290-76ff324042ab,1,0,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,1,0,6e6a1557-06fa-45c0-ad98-c43809553cd7,6e6a1557-06fa-45c0-ad98-c43809553cd7,1,0,179f7436-e328-42b8-9382-19ee6f10c768,179f7436-e328-42b8-9382-19ee6f10c768,1,0,2093344a-47d4-43ac-98df-29c4dff7fca9,2093344a-47d4-43ac-98df-29c4dff7fca9,1,0,3343cb0c-0f80-4ef9-9871-3db9f2299186,3343cb0c-0f80-4ef9-9871-3db9f2299186,1,0,791d7289-b188-4120-a5f5-f5eb1fd675bf,791d7289-b188-4120-a5f5-f5eb1fd675bf,1,0,e996d749-1aa5-4fe5-b87b-3d8d06144d93,e996d749-1aa5-4fe5-b87b-3d8d06144d93,1,0,6613153f-4f81-4bac-8144-7562cce67f55,6613153f-4f81-4bac-8144-7562cce67f55,1,0,488ce902-b60e-4255-8aec-92dafd1d5dd0,488ce902-b60e-4255-8aec-92dafd1d5dd0,1,0,411779cc-de2c-4731-acc0-631a01367eb5,411779cc-de2c-4731-acc0-631a01367eb5,1,0,30794af1-3180-4ed5-b11d-ca139acb22fa,30794af1-3180-4ed5-b11d-ca139acb22fa,1,0,39aeb27d-62d2-480a-aa6b-33e2363194d1,39aeb27d-62d2-480a-aa6b-33e2363194d1,1,0,e69be74a-0e2c-4a7b-8814-ab15ab28f948,e69be74a-0e2c-4a7b-8814-ab15ab28f948,1,0,60410722-dca9-4c3a-a9c4-33fcd45fe584,60410722-dca9-4c3a-a9c4-33fcd45fe584,1,0,3f200f5a-01bd-4304-9c57-18703cac9ec9,3f200f5a-01bd-4304-9c57-18703cac9ec9,1,0,aa89881f-f111-4384-911c-847b04bb56dd,aa89881f-f111-4384-911c-847b04bb56dd,1,0,444d9e3b-c702-4ad6-a929-a220eff0f6e7,444d9e3b-c702-4ad6-a929-a220eff0f6e7,1,0,022c4519-1cdb-45b6-a699-89fd6688999c,022c4519-1cdb-45b6-a699-89fd6688999c,1,0,fb5b79a2-caec-4c6e-a112-27e78a184d5e,fb5b79a2-caec-4c6e-a112-27e78a184d5e,1,0,fa523958-ce1e-42e1-ae00-2dcb401b7eda,fa523958-ce1e-42e1-ae00-2dcb401b7eda,1,0,1518bca2-a004-4566-8991-7c60e6745a49,1518bca2-a004-4566-8991-7c60e6745a49,1,0,ed8618e2-3ce6-4956-856a-9f40279b4da6,ed8618e2-3ce6-4956-856a-9f40279b4da6,1,0,733f6bc2-544d-4fac-bca8-11b981b95a03,733f6bc2-544d-4fac-bca8-11b981b95a03,1,0,3d140a17-40b4-46a7-a846-78f2f77d49f2,3d140a17-40b4-46a7-a846-78f2f77d49f2,1,0,965646a5-5e5b-49cd-864a-c3870844cfdb,965646a5-5e5b-49cd-864a-c3870844cfdb,1,0,27c88cf7-c0ed-44af-bb70-f14269ce1e87,27c88cf7-c0ed-44af-bb70-f14269ce1e87,1,0,0333cd9e-392d-40b2-869d-ad47119e0384,0333cd9e-392d-40b2-869d-ad47119e0384,1,0,82cc8820-0b92-4bb7-b097-7ac79e922f01,82cc8820-0b92-4bb7-b097-7ac79e922f01,1,0,25451a36-c842-44a5-94f4-7e540050b825,25451a36-c842-44a5-94f4-7e540050b825,1,0,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,8e0340c9-6469-4fc9-b19a-4be4e0e6ee82,1,0,f2267d6c-6972-4621-b677-87798056363b,f2267d6c-6972-4621-b677-87798056363b,1,0,243d201b-3714-4700-b410-c74c9093e6f6,243d201b-3714-4700-b410-c74c9093e6f6,1,0,e1e9862e-c87b-400f-bca1-b1380cb98ddc,e1e9862e-c87b-400f-bca1-b1380cb98ddc,1,0,de3cb50c-ef99-419e-b922-c6a453da6a5b,de3cb50c-ef99-419e-b922-c6a453da6a5b,1,0,d4ca4802-756a-494c-bab3-e77e0777a3fa,d4ca4802-756a-494c-bab3-e77e0777a3fa,1,0,134c1054-8d65-405f-ba3b-5beeca803a72,134c1054-8d65-405f-ba3b-5beeca803a72,1,0,cfa1669b-5310-4171-83fd-4dff3c6ac345,cfa1669b-5310-4171-83fd-4dff3c6ac345,1,0,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,1,0,aec7df6a-21a1-495d-b0a9-3769e1069888,aec7df6a-21a1-495d-b0a9-3769e1069888,1,0,463b98bf-b4d4-4edb-995d-0a75ff29b60d,463b98bf-b4d4-4edb-995d-0a75ff29b60d,1,0,317f88a7-12a4-4d21-b637-3050525406f4,317f88a7-12a4-4d21-b637-3050525406f4,1,0,2d9d2319-68fb-436d-b431-98858b88a75a,2d9d2319-68fb-436d-b431-98858b88a75a,1,0,0db78226-37d0-4016-b4c9-5134af1aabc7,0db78226-37d0-4016-b4c9-5134af1aabc7,1,0,8d6b4d23-a260-4352-9975-c13ce3e05220,8d6b4d23-a260-4352-9975-c13ce3e05220,1,0,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,e0be0bc7-def6-4ae9-9a33-9689aa829b5e,1,0,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,97d4ffd0-07ef-4dc2-8fbc-449c3c8453ef,1,0,6f5ac40b-ea22-47cf-acf2-614406669a72,6f5ac40b-ea22-47cf-acf2-614406669a72,1,0,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,b6caaa9e-a9d1-4519-a61f-7fa0ab0ff201,1,0,488d2644-6fef-488a-af38-40f59c0e0d8c,488d2644-6fef-488a-af38-40f59c0e0d8c,1,0,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,5d76a28c-5d6c-49cb-8b91-2527e8d06aba,1,0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,688d86cd-1044-4b77-bb63-2c05aaafbcd0,1,0,f1efef30-8651-4728-becd-abe3f9026a43,f1efef30-8651-4728-becd-abe3f9026a43,1,0,c2612e22-4f0d-4713-b4eb-decd9780d088,c2612e22-4f0d-4713-b4eb-decd9780d088,1,0,11b1410f-8e14-4b2f-8890-177f4875020e,11b1410f-8e14-4b2f-8890-177f4875020e,1,0,2276b2b0-1705-4014-956f-5087e9dd5c1e,2276b2b0-1705-4014-956f-5087e9dd5c1e,1,0,f72b9d4b-7196-45a3-9349-e32fc91e875a,f72b9d4b-7196-45a3-9349-e32fc91e875a,1,0,6c509dcc-4529-4ac3-86fe-26f807991b1c,6c509dcc-4529-4ac3-86fe-26f807991b1c,1,0,529c8887-f691-4ba8-aeaf-937858d61c30,529c8887-f691-4ba8-aeaf-937858d61c30,1,0,43435d30-8c25-4757-9a29-9173415959ff,43435d30-8c25-4757-9a29-9173415959ff,1,0,4aef5419-7cf5-4443-b773-9273c983844f,4aef5419-7cf5-4443-b773-9273c983844f,1,0,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,b090cfa5-1bd8-43aa-84d6-6e04375c4b57,1,0,2bb5c23c-ad87-4b66-b766-d2e3f82715bd,2bb5c23c-ad87-4b66-b766-d2e3f82715bd,1,0,d01871bb-492e-4ab8-ada9-e9d8ec1adbce,d01871bb-492e-4ab8-ada9-e9d8ec1adbce,1,0,dd931c85-8c19-42a8-a39e-7af0c5bd346c,dd931c85-8c19-42a8-a39e-7af0c5bd346c,1,0,4fa153eb-1efb-43e5-ac09-e5431d4800df,4fa153eb-1efb-43e5-ac09-e5431d4800df,1,0,ada760f3-6a9f-4b81-afc1-98eb164af747,ada760f3-6a9f-4b81-afc1-98eb164af747,1,0,262dea64-4ccd-4b97-ac7e-ec1dbdd9ac98,262dea64-4ccd-4b97-ac7e-ec1dbdd9ac98,1,0,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,1,0,8e9f9baf-8d12-46cc-915f-f6f290af5512,8e9f9baf-8d12-46cc-915f-f6f290af5512,1,0,a8e14d2e-911d-4096-9027-deb7a08838e0,a8e14d2e-911d-4096-9027-deb7a08838e0,1,0,c51d8ae2-66fe-4052-8ee4-980855b1f90c,c51d8ae2-66fe-4052-8ee4-980855b1f90c,1,0,27610803-846f-40bd-b817-f73708f1fdb7,27610803-846f-40bd-b817-f73708f1fdb7,1,0,4e2a3873-0317-44be-8dbb-e4cefc0361a8,4e2a3873-0317-44be-8dbb-e4cefc0361a8,1,0,5808331f-9ab4-4a23-a592-1f65087f3214,5808331f-9ab4-4a23-a592-1f65087f3214,1,0,9316738d-3d38-4068-818e-a001355b19fb,9316738d-3d38-4068-818e-a001355b19fb,1,0,d86d766f-021a-4c11-b9e8-403af08918cc,d86d766f-021a-4c11-b9e8-403af08918cc,1,0,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,1,0,29200d04-d7da-435a-89e6-858c11a1a98c,29200d04-d7da-435a-89e6-858c11a1a98c,1,0,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,1,0,6c119ef2-d24b-4c3d-ad07-611bed89cab1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,1,0,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,1,0,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,1,0,27df6c22-85d7-4cb6-be19-82af76c84bf9,27df6c22-85d7-4cb6-be19-82af76c84bf9,1,0,d5b23aac-ea1c-497e-bed7-8685bb682e36,d5b23aac-ea1c-497e-bed7-8685bb682e36,1,0,2b37c085-7c70-4004-93d3-24418b7b3ef2,2b37c085-7c70-4004-93d3-24418b7b3ef2,1,0,6da15163-dd4c-4981-82e8-ad3bd2f516aa,6da15163-dd4c-4981-82e8-ad3bd2f516aa,1,0,e3000fff-aaba-4396-8026-768108ea8f2b,e3000fff-aaba-4396-8026-768108ea8f2b,1,0,1fc05949-c1ba-4363-8353-6902bc041021,1fc05949-c1ba-4363-8353-6902bc041021,1,0,d6e61d59-fe83-4a9e-aa15-e072a39fd8fd,d6e61d59-fe83-4a9e-aa15-e072a39fd8fd,1,0,614fc08c-78b6-4d49-9488-05fcf9b76d58,614fc08c-78b6-4d49-9488-05fcf9b76d58,1,0,d983cae8-edbb-4f26-9c0a-2f701cb11046,d983cae8-edbb-4f26-9c0a-2f701cb11046,1,0,40e2fb30-bb03-4178-a8eb-ddf48337ef23,40e2fb30-bb03-4178-a8eb-ddf48337ef23,1,0,1026fbcb-acd8-40dc-b638-6e02c6378c55,1026fbcb-acd8-40dc-b638-6e02c6378c55,1,0,dc9e2ba6-f4f1-493f-9054-cac633f239dd,dc9e2ba6-f4f1-493f-9054-cac633f239dd,1,0,7b95d0b1-c7b2-43b4-9119-320cb8912032,7b95d0b1-c7b2-43b4-9119-320cb8912032,1,0,004582b7-00aa-405e-8e24-ce76c945edae,004582b7-00aa-405e-8e24-ce76c945edae,1,0,97a9b005-a836-4308-8e63-0e00f6890baa,97a9b005-a836-4308-8e63-0e00f6890baa,1,0,98c34ada-0b78-41db-9183-6d7b9e466bde,98c34ada-0b78-41db-9183-6d7b9e466bde,1,0,fb688339-918e-40a1-8721-a26f3077973e,fb688339-918e-40a1-8721-a26f3077973e,1,0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1,0,b50f3157-3c3a-4553-a16a-7fcd660e2824,b50f3157-3c3a-4553-a16a-7fcd660e2824,1,0,19858faf-2bc5-4cfb-b258-cb101ab66e87,19858faf-2bc5-4cfb-b258-cb101ab66e87,1,0,f779f4a1-1fab-46d4-8043-ac25c247d361,f779f4a1-1fab-46d4-8043-ac25c247d361,1,0,308358bc-773a-43fa-adff-dcc5884a2bd4,308358bc-773a-43fa-adff-dcc5884a2bd4,1,0,ed541a1c-a842-40a9-b357-612db71ec32c,ed541a1c-a842-40a9-b357-612db71ec32c,1,0,b0e37495-7d9e-41d0-8225-652f9ac328cf,b0e37495-7d9e-41d0-8225-652f9ac328cf,1,0,3bd2e1c8-9ef3-449b-acf6-397b90669c49,3bd2e1c8-9ef3-449b-acf6-397b90669c49,1,0,cb334191-2ff3-439e-bdaf-4b8fe6561c3b,cb334191-2ff3-439e-bdaf-4b8fe6561c3b,1,0,f9865a2a-50e3-4f9c-a509-319be62dc468,f9865a2a-50e3-4f9c-a509-319be62dc468,1,0,5f3a30b0-1ba8-423c-9bc2-f9a87cafe818,5f3a30b0-1ba8-423c-9bc2-f9a87cafe818,1,0,766d8852-3bb4-4a6c-81c0-911722af4e8e,766d8852-3bb4-4a6c-81c0-911722af4e8e,1,0,f6dae699-06eb-41ef-878b-3fdfe1b1f213,f6dae699-06eb-41ef-878b-3fdfe1b1f213,1,0,fe6de86a-54c9-4ae2-9f17-cfce38b7b560,fe6de86a-54c9-4ae2-9f17-cfce38b7b560,1,0,911f8810-e96e-4f02-9377-47e49919f87e,911f8810-e96e-4f02-9377-47e49919f87e,1,0,cde46d6d-9f8a-45b6-98a7-9411030ccd72,cde46d6d-9f8a-45b6-98a7-9411030ccd72,1,0,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,ff1a4c30-03ff-4bdd-9df2-a2579aeb4157,1,0,224b9439-4b30-4b64-8edf-e7718ee90a7d,224b9439-4b30-4b64-8edf-e7718ee90a7d,1,0,74dc2374-daf1-4a8a-ba10-d3aced96af3b,74dc2374-daf1-4a8a-ba10-d3aced96af3b,1,0,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,15f1a3a8-5d42-486d-95f9-3d43ff1d5d56,1,0,e28e953f-93b3-4d4d-9ee4-c56df26037eb,e28e953f-93b3-4d4d-9ee4-c56df26037eb,1,0,578e0fd2-997c-437a-befc-33d128097a7e,578e0fd2-997c-437a-befc-33d128097a7e,1,0,14089231-31a8-4471-b85b-064836794ff3,14089231-31a8-4471-b85b-064836794ff3,1,0,014de276-fb2f-4deb-873f-475729be0f66,014de276-fb2f-4deb-873f-475729be0f66,1,0,40a60ff7-96ca-485b-a2d9-640a208a7de6,40a60ff7-96ca-485b-a2d9-640a208a7de6,1,0,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,03e6caa4-eaa2-43aa-bdd1-768f9cce7848,1,0,ac028c56-b2a8-4a9b-a325-554c636f838e,ac028c56-b2a8-4a9b-a325-554c636f838e,1,0,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,1,0,f99e98ac-cd94-4989-8c02-ef8b323c6815,f99e98ac-cd94-4989-8c02-ef8b323c6815,1,0,e2562347-4549-4111-862e-86c20a6daade,e2562347-4549-4111-862e-86c20a6daade,1,0,b270fc64-15c6-41ed-ad09-44c833ca7c41,b270fc64-15c6-41ed-ad09-44c833ca7c41,1,0,4c3312fd-5613-4e9b-ae7c-572fa1887ded,4c3312fd-5613-4e9b-ae7c-572fa1887ded,1,0,6c8c9618-287a-41ab-890c-60250925ad52,6c8c9618-287a-41ab-890c-60250925ad52,1,0,55b9650e-098b-4d44-9fb5-d525b46f014b,55b9650e-098b-4d44-9fb5-d525b46f014b,1,0,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,1,0,bc55dc06-a769-40be-9c99-0794bdd2dbea,bc55dc06-a769-40be-9c99-0794bdd2dbea,1,0,feb5f490-e791-11e6-508c-a8667f21fde4,feb5f490-e791-11e6-508c-a8667f21fde4,1,0,7861e179-96d2-422f-a7c2-b38b59074956,7861e179-96d2-422f-a7c2-b38b59074956,1,0,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,1,0,6962f838-e792-11e6-508c-a8667f21fde4,6962f838-e792-11e6-508c-a8667f21fde4,1,0,3797b4c6-e336-4cbe-8d0b-0902e1247b42,3797b4c6-e336-4cbe-8d0b-0902e1247b42,1,0,67ebc493-d29a-4614-890a-feb8b5bd884b,67ebc493-d29a-4614-890a-feb8b5bd884b,1,0,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,1,0,dba6cb38-79c6-4060-87c5-a993548f36c4,dba6cb38-79c6-4060-87c5-a993548f36c4,1,0,6b44227a-e226-4bcb-8638-06b49f830669,6b44227a-e226-4bcb-8638-06b49f830669,1,0,f2406400-87e9-4df2-bcd3-8f1e3ad62088,f2406400-87e9-4df2-bcd3-8f1e3ad62088,1,0,4f2b6bf8-e792-11e6-508c-a8667f21fde4,4f2b6bf8-e792-11e6-508c-a8667f21fde4,1,0,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,1,0,a5623e87-3102-4521-b4ab-c41bf2403a1a,a5623e87-3102-4521-b4ab-c41bf2403a1a,1,0,599b1692-5f4e-42ef-ae1a-822ff527a415,599b1692-5f4e-42ef-ae1a-822ff527a415,1,0,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,1,0,4bb7372a-87a9-426e-b09f-fc0110455b10,4bb7372a-87a9-426e-b09f-fc0110455b10,1,0,ac853a0f-c185-4cdb-9f09-c921770937b5,ac853a0f-c185-4cdb-9f09-c921770937b5,1,0,920a7940-4d12-476d-a909-2231787839a9,920a7940-4d12-476d-a909-2231787839a9,1,0,168fce48-2413-45fc-ad21-9b465121d81b,168fce48-2413-45fc-ad21-9b465121d81b,1,0,d65c8992-aabc-4b67-9893-01862231ebe1,d65c8992-aabc-4b67-9893-01862231ebe1,1,0,23f70675-6a05-4b50-ad68-c55ddc93e857,23f70675-6a05-4b50-ad68-c55ddc93e857,1,0,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,1,0,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,1,0,3370d43e-8e97-4411-8123-2bb2bcf60a75,3370d43e-8e97-4411-8123-2bb2bcf60a75,1,0,d9d377c9-406f-4bc9-8076-1f049348b816,d9d377c9-406f-4bc9-8076-1f049348b816,1,0,dcfcb108-3761-43d9-ad2a-29633bd1ae47,dcfcb108-3761-43d9-ad2a-29633bd1ae47,1,0,bac41d45-249f-40b4-a013-008e261369c8,bac41d45-249f-40b4-a013-008e261369c8,1,0,84e34b4a-02e8-4676-8b81-771ddf3c2931,84e34b4a-02e8-4676-8b81-771ddf3c2931,1,0,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0aa6a024-66ae-4592-87d6-f7cb2a59f906,1,0,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,1,0,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,1,0,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,1,0,f71ac535-74a5-4001-a613-455a9e1bf734,f71ac535-74a5-4001-a613-455a9e1bf734,1,0,55a42b83-b6d2-409b-a8ff-7849b08e07ed,55a42b83-b6d2-409b-a8ff-7849b08e07ed,1,0,61889399-ecc2-442c-a790-a8b27a7a540c,61889399-ecc2-442c-a790-a8b27a7a540c,1,0,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,1,0,079ba95c-8293-47e2-b8bd-7acf73c2d880,079ba95c-8293-47e2-b8bd-7acf73c2d880,1,0,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,1,0,a5f264a8-a547-4653-abb1-eb1666d527dc,a5f264a8-a547-4653-abb1-eb1666d527dc,1,0,dabae379-6356-497a-aab5-cf102f16a72a,dabae379-6356-497a-aab5-cf102f16a72a,1,0,337370e0-1021-4887-9d38-6c3833c90a5b,337370e0-1021-4887-9d38-6c3833c90a5b,1,0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,1,0,d6f01f1c-801b-4776-ae11-48236103f76a,d6f01f1c-801b-4776-ae11-48236103f76a,1,0,b6fe68cf-657b-40e0-af2e-247607a86519,b6fe68cf-657b-40e0-af2e-247607a86519,1,0,9b0b8191-94b7-428f-be86-e9e4cd24a72f,9b0b8191-94b7-428f-be86-e9e4cd24a72f,1,0,a923dbcb-7146-4445-ad17-f4a32c16a837,a923dbcb-7146-4445-ad17-f4a32c16a837,1,0,41dec792-1d1a-4e06-a54b-a86193b98225,41dec792-1d1a-4e06-a54b-a86193b98225,1,0,52257beb-3e0c-4681-b430-9690398cd13a,52257beb-3e0c-4681-b430-9690398cd13a,1,0,135e637c-c28e-4547-8da2-d897dca54cb2,135e637c-c28e-4547-8da2-d897dca54cb2,1,0,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,1,0,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,56d97df6-9c8b-4fc5-a7a6-52107d38dcd5,1,0,a0be938b-139e-41bd-b067-f5241ff68c90,a0be938b-139e-41bd-b067-f5241ff68c90,1,0,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,1,0,5356543a-db9a-4265-b83f-31d45544c8e6,5356543a-db9a-4265-b83f-31d45544c8e6,1,0,857dd311-9c6d-4dba-82d8-283d7b05b09e,857dd311-9c6d-4dba-82d8-283d7b05b09e,1,0,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1,0,8064eb3a-d56c-4517-9db0-b7300149c7c4,8064eb3a-d56c-4517-9db0-b7300149c7c4,1,0,fe926c88-d792-4db3-abcf-3c94dfdcc407,fe926c88-d792-4db3-abcf-3c94dfdcc407,1,0,b1c3a6c1-5245-4a65-8a45-13948be6f6a1,b1c3a6c1-5245-4a65-8a45-13948be6f6a1,1,0,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,1,0,e0c51555-1614-4aa7-a075-c5e1251579ba,e0c51555-1614-4aa7-a075-c5e1251579ba,1,0,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,c75a1c6d-fa33-4b57-b359-6253aff5f3e7,1,0,af88ea84-5742-4c9f-9a02-6d0f25186f72,af88ea84-5742-4c9f-9a02-6d0f25186f72,1,0,51363236-c8eb-4eb7-9692-5c18edc9a5a8,51363236-c8eb-4eb7-9692-5c18edc9a5a8,1,0,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,1,0,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,1,0,8adebe50-a946-40c2-9258-b17efe787e0e,8adebe50-a946-40c2-9258-b17efe787e0e,1,0,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,1,0,81ef02df-498d-4af0-8254-dc6730cbf140,81ef02df-498d-4af0-8254-dc6730cbf140,1,0,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,1,0,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,1,0,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1,0,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,1,0,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,f237a21e-066a-48e6-a5c4-5dc2487c7a3b,1,0,d6b72e00-018a-4fdc-b6a4-06dcecf89809,d6b72e00-018a-4fdc-b6a4-06dcecf89809,1,0,9f816562-57f0-473f-8c85-14f7521ffd7f,9f816562-57f0-473f-8c85-14f7521ffd7f,1,0,14077038-2e41-4a05-a476-99f6f88a5c29,14077038-2e41-4a05-a476-99f6f88a5c29,1,0,917b0acc-88fe-4afc-b19b-6da69e060393,917b0acc-88fe-4afc-b19b-6da69e060393,1,0,a091b76e-8ba4-4534-bbb0-9990e69b8603,a091b76e-8ba4-4534-bbb0-9990e69b8603,1,0,867ee5d2-7566-4052-a311-b56e7e46b90d,867ee5d2-7566-4052-a311-b56e7e46b90d,1,0,8f51328b-73a8-46fb-b6db-7b7a84c05c2a,8f51328b-73a8-46fb-b6db-7b7a84c05c2a,1,0,0f0f5b42-2407-44e6-85d7-26ace96b2cd9,0f0f5b42-2407-44e6-85d7-26ace96b2cd9,1,0,ffec426d-2556-46d6-b313-aeca43581865,ffec426d-2556-46d6-b313-aeca43581865,1,0,f32e0941-2061-4e12-bdae-fcb65f91ac28,f32e0941-2061-4e12-bdae-fcb65f91ac28,1,0,6f0e0f44-db5a-4a13-9131-866b77b90f14,6f0e0f44-db5a-4a13-9131-866b77b90f14,1,0,9415e0aa-391f-4798-ad7d-3b854a756de8,9415e0aa-391f-4798-ad7d-3b854a756de8,1,0,f82d5bd6-4c74-4c23-978c-565aae3d752a,f82d5bd6-4c74-4c23-978c-565aae3d752a,1,0,7fba41a5-4faa-412b-b367-b30ced0314c0,7fba41a5-4faa-412b-b367-b30ced0314c0,1,0,37333d0b-3589-4b8b-bf6c-e605e0287b66,37333d0b-3589-4b8b-bf6c-e605e0287b66,1,0,1813c469-da20-46a6-8947-6815b66f64c1,1813c469-da20-46a6-8947-6815b66f64c1,1,0,64e702e9-8934-4356-a1b2-be0e8b390630,64e702e9-8934-4356-a1b2-be0e8b390630,1,0,74880ac4-bdd3-48e6-82a0-a2103da42723,74880ac4-bdd3-48e6-82a0-a2103da42723,1,0,ad083c26-7461-4e94-b524-0174242fbd91,ad083c26-7461-4e94-b524-0174242fbd91,1,0,5ce39370-f918-493f-bb24-53346b6fd836,5ce39370-f918-493f-bb24-53346b6fd836,1,0,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,1,0,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0e3d2750-bb4c-42b9-9829-60f1480ced9c,1,0,ddc6761c-a32a-41e1-b110-fdc39ad440d3,ddc6761c-a32a-41e1-b110-fdc39ad440d3,1,0,0b322ee2-b018-4d00-8f05-62ee16e519ff,0b322ee2-b018-4d00-8f05-62ee16e519ff,1,0,0866e282-055a-49bb-9aa5-b1af7c74c344,0866e282-055a-49bb-9aa5-b1af7c74c344,1,0,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,1,0,a76b1fd1-ba00-40e6-8756-f17fee449818,a76b1fd1-ba00-40e6-8756-f17fee449818,1,0,5c913626-48d1-4e0a-a423-64078ce59c7b,5c913626-48d1-4e0a-a423-64078ce59c7b,1,0,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,1,0,7b0ec304-1904-413e-a9c6-ff62e87107dd,7b0ec304-1904-413e-a9c6-ff62e87107dd,1,0,d4dd8c96-914d-496f-b735-ef85ec473605,d4dd8c96-914d-496f-b735-ef85ec473605,1,0,62517db4-59e6-4945-bcd6-b3f1845572bf,62517db4-59e6-4945-bcd6-b3f1845572bf,1,0,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,1,0,f0f72149-0e7f-441a-b70d-8f47d4977927,f0f72149-0e7f-441a-b70d-8f47d4977927,1,0,776efc3e-ac27-4550-bafd-6e91aa987af2,776efc3e-ac27-4550-bafd-6e91aa987af2,1,0,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,1,0,cc438366-85ea-48be-8b74-d05cddb1fc51,cc438366-85ea-48be-8b74-d05cddb1fc51,1,0,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,1,0,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,1,0,3271b800-1825-422f-97bb-757baf403e90,3271b800-1825-422f-97bb-757baf403e90,1,0,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,1,0,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,1,0,a040c756-4687-4bfd-a690-b122d3c490e5,a040c756-4687-4bfd-a690-b122d3c490e5,1,0,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,1,0,961a9801-3956-4ea0-b0d3-908f09bf4929,961a9801-3956-4ea0-b0d3-908f09bf4929,1,0,6fac5c14-e126-4342-9078-edf1d0efcbf2,6fac5c14-e126-4342-9078-edf1d0efcbf2,1,0,0a3325a1-21c4-4997-882f-4ac2edc175f0,0a3325a1-21c4-4997-882f-4ac2edc175f0,1,0,71102d3f-f020-4d6f-9582-9a7eefb4e797,71102d3f-f020-4d6f-9582-9a7eefb4e797,1,0,53ef6849-a3f3-4171-9167-f349f2d6a736,53ef6849-a3f3-4171-9167-f349f2d6a736,1,0,3f588bd3-d461-42b7-8ab1-386af6399d56,3f588bd3-d461-42b7-8ab1-386af6399d56,1,0,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,c04ff85e-b4af-4a9f-b0e9-c5c65e3d10a1,1,0,8c576405-29c1-46b1-ab2e-40e52c21cab0,8c576405-29c1-46b1-ab2e-40e52c21cab0,1,0,b33a89da-8589-4902-83fa-6545e5fce23e,b33a89da-8589-4902-83fa-6545e5fce23e,1,0,f0620d5a-e1fe-419f-af37-e0f462f97e8d,f0620d5a-e1fe-419f-af37-e0f462f97e8d,1,0,3e2f2ae1-c809-43fc-8276-b0a16a92858c,3e2f2ae1-c809-43fc-8276-b0a16a92858c,1,0,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,1,0,1a7c7427-bead-4655-9dd6-df6e722663c5,1a7c7427-bead-4655-9dd6-df6e722663c5,1,0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,1,0,fd96c8ab-602a-4735-b168-52b501e80351,fd96c8ab-602a-4735-b168-52b501e80351,1,0,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,1,0,370f0c75-d2c5-4be5-a633-4bcc77998ece,370f0c75-d2c5-4be5-a633-4bcc77998ece,1,0,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,1,0,2139532c-f6cb-4393-936e-cc912e5adca9,2139532c-f6cb-4393-936e-cc912e5adca9,1,0,755c3eca-4956-4a44-9b38-c11dae00b87f,755c3eca-4956-4a44-9b38-c11dae00b87f,1,0,f57c558c-2c94-4b9d-8697-448d0548ab1a,f57c558c-2c94-4b9d-8697-448d0548ab1a,1,0,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,1,0,c32db021-eca1-4b67-aa85-3d6e28c51b53,c32db021-eca1-4b67-aa85-3d6e28c51b53,1,0,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,1,0,02466dcf-02a1-4853-814f-a913a9baba45,02466dcf-02a1-4853-814f-a913a9baba45,1,0,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,1,0,62b75eb2-42e1-4484-a77f-b676dd36f3d4,62b75eb2-42e1-4484-a77f-b676dd36f3d4,1,0,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,1,0,856510ee-74f5-44e9-a3c0-1c60cfb7a787,856510ee-74f5-44e9-a3c0-1c60cfb7a787,1,0,28b761c6-c286-4125-a4ed-da602e49950f,28b761c6-c286-4125-a4ed-da602e49950f,1,0,4ac66a22-c736-4e06-a8aa-ef4a71788c65,4ac66a22-c736-4e06-a8aa-ef4a71788c65,1,0,9cfe9281-8840-4077-824d-a2c9cbb0b730,9cfe9281-8840-4077-824d-a2c9cbb0b730,1,0,76389fa9-b9e0-492e-9c93-24b5f3bf094c,76389fa9-b9e0-492e-9c93-24b5f3bf094c,1,0,23e3de37-9315-45e6-bbfd-60aae28c25ae,23e3de37-9315-45e6-bbfd-60aae28c25ae,1,0,a9957f43-8b6f-4d98-a2d8-77b78047494c,a9957f43-8b6f-4d98-a2d8-77b78047494c,1,0,e470e15d-1b06-43cb-a9f9-ba489e2f596f,e470e15d-1b06-43cb-a9f9-ba489e2f596f,1,0,0408002c-9255-43a2-8022-82f02ee0e8f4,0408002c-9255-43a2-8022-82f02ee0e8f4,1,0,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,1,0,1851afd4-5324-45c1-b754-54e65943f945,1851afd4-5324-45c1-b754-54e65943f945,1,0,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,1,0,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,1,0,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,1,0,c322dc4a-30f3-4d23-9824-4a01c496408d,c322dc4a-30f3-4d23-9824-4a01c496408d,1,0,dcff004c-1b61-4a19-b977-ea21bf688614,dcff004c-1b61-4a19-b977-ea21bf688614,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1} \ No newline at end of file diff --git a/SSL/src/Constants/ЗагрузитьРасширенияИзменяющиеСтруктуруДанных/ЗагрузитьРасширенияИзменяющиеСтруктуруДанных.mdo b/SSL/src/Constants/ЗагрузитьРасширенияИзменяющиеСтруктуруДанных/ЗагрузитьРасширенияИзменяющиеСтруктуруДанных.mdo new file mode 100644 index 000000000..83ae56630 --- /dev/null +++ b/SSL/src/Constants/ЗагрузитьРасширенияИзменяющиеСтруктуруДанных/ЗагрузитьРасширенияИзменяющиеСтруктуруДанных.mdo @@ -0,0 +1,20 @@ + + + + + + + + ЗагрузитьРасширенияИзменяющиеСтруктуруДанных + + ru + Загрузить расширения изменяющие структуру данных + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ИспользоватьСервисОблачнойПодписи/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьСервисОблачнойПодписи/ValueManagerModule.bsl new file mode 100644 index 000000000..a22c383da --- /dev/null +++ b/SSL/src/Constants/ИспользоватьСервисОблачнойПодписи/ValueManagerModule.bsl @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ОбработчикиСобытий + +Процедура ПередЗаписью(Отказ) + + Если ОбменДанными.Загрузка Тогда + + Возврат; + + КонецЕсли; + + ЗначениеКонстанты = Константы.ИспользоватьСервисОблачнойПодписи.Получить(); + ДополнительныеСвойства.Вставить("ТекущееЗначение", ЗначениеКонстанты); + +КонецПроцедуры + +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + + Возврат; + + КонецЕсли; + + Если ДополнительныеСвойства.ТекущееЗначение <> Значение Тогда + + ОбновитьПовторноИспользуемыеЗначения(); + + Если Значение Тогда + СервисКриптографииDSSПереопределяемый.ПриВключенииСервисаОблачнойПодписи(); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Иначе +ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Constants/ИспользоватьСервисОблачнойПодписи/ИспользоватьСервисОблачнойПодписи.mdo b/SSL/src/Constants/ИспользоватьСервисОблачнойПодписи/ИспользоватьСервисОблачнойПодписи.mdo new file mode 100644 index 000000000..7858cc9a5 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьСервисОблачнойПодписи/ИспользоватьСервисОблачнойПодписи.mdo @@ -0,0 +1,20 @@ + + + + + + + + ИспользоватьСервисОблачнойПодписи + + ru + Использовать сервис облачной подписи + + + Boolean + + true + + + Managed + diff --git a/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl b/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl index 118200675..482a74119 100644 --- a/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl +++ b/SSL/src/Constants/ОграничиватьДоступНаУровнеЗаписей/ValueManagerModule.bsl @@ -43,22 +43,51 @@ Если ОграничениеДоступаНаУровнеЗаписейИзменено Тогда УправлениеДоступомСлужебный.ПриИзмененииОграниченияДоступаНаУровнеЗаписей( ОграничениеДоступаНаУровнеЗаписейВключено); - - Если УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально(Истина) Тогда - - ПараметрыПланирования = УправлениеДоступомСлужебный.ПараметрыПланированияОбновленияДоступа(); - ПараметрыПланирования.ЭтоПродолжениеОбновления = Истина; - ПараметрыПланирования.Описание = "ОграничиватьДоступНаУровнеЗаписейПриЗаписи"; - УправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступа(, ПараметрыПланирования); - - УправлениеДоступомСлужебный.УстановитьОбновлениеДоступа(Истина); - КонецЕсли; КонецЕсли; КонецПроцедуры #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +// Только для внутреннего использования. +Процедура ЗарегистрироватьИзменениеПриЗагрузке(ЭлементДанных) Экспорт + + СтароеЗначение = Константы.ОграничиватьДоступНаУровнеЗаписей.Получить(); + + Если СтароеЗначение = ЭлементДанных.Значение Тогда + Возврат; + КонецЕсли; + + ОграничениеДоступаНаУровнеЗаписейВключено = СтароеЗначение И Не ЭлементДанных.Значение; + + Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("ОграничиватьДоступНаУровнеЗаписей", + ОграничениеДоступаНаУровнеЗаписейВключено); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОбработатьИзменениеЗарегистрированноеПриЗагрузке() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + // Изменение настроек прав в АРМ заблокированы и не загружаются в область данных. + Возврат; + КонецЕсли; + + Изменения = Справочники.ГруппыДоступа.ЗарегистрированныеСсылки("ОграничиватьДоступНаУровнеЗаписей"); + Если Изменения.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + УправлениеДоступомСлужебный.ПриИзмененииОграниченияДоступаНаУровнеЗаписей(Изменения[0]); + + Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("ОграничиватьДоступНаУровнеЗаписей", Null); + +КонецПроцедуры + +#КонецОбласти + #Иначе ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); #КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl index 37b0e172c..c06b7dd9b 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/БлокировкаСоединенийСИнформационнойБазой/Module.bsl @@ -507,7 +507,7 @@ "e1cib/app/Обработка.БлокировкаРаботыПользователей", ?(Объект.ЗапретитьРаботуПользователей, НСтр("ru = 'Блокировка установлена.'"), НСтр("ru = 'Блокировка снята.'")), БиблиотекаКартинок.Информация32); - СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Объект.ЗапретитьРаботуПользователей); + СоединенияИБКлиент.УстановитьРежимЗавершенияРаботыПользователей(Объект.ЗапретитьРаботуПользователей); Если Объект.ЗапретитьРаботуПользователей Тогда Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.СтраницаСостоянияБлокировки; @@ -537,7 +537,7 @@ Возврат; КонецЕсли; - СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Ложь); + СоединенияИБКлиент.УстановитьРежимЗавершенияРаботыПользователей(Ложь); ПоказатьПредупреждение(,НСтр("ru = 'Завершение работы активных пользователей отменено.'")); КонецПроцедуры diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl index e92a651a0..7e5e3540f 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl @@ -84,7 +84,7 @@ // Задание параметров блокировки ИБ. ПроверитьМонопольныйРежим(); УстановитьБлокировкуФайловойБазы(); - СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Истина); + СоединенияИБКлиент.УстановитьРежимЗавершенияРаботыПользователей(Истина); ПодключитьОбработчикОжидания("ОжидатьЗавершенияРаботыПользователей", 60); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Module.bsl index 68206df0a..a3f2408b9 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Module.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдресаВСвободнойФорме/Module.bsl @@ -174,7 +174,7 @@ &НаКлиенте Процедура АдресНаДатуАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - Если СтрСравнить(Текст, НСтр("ru = 'начало учета'")) = 0 Или ПустаяСтрока(Текст) Тогда + Если СтрСравнить(Текст, НачалоУчета()) = 0 Или ПустаяСтрока(Текст) Тогда Элементы.АдресНаДату.ФорматРедактирования = ""; КонецЕсли; КонецПроцедуры @@ -210,7 +210,7 @@ АдресДействуетС = АдресНаДату; КонецЕсли; - ТекстНачалаУчета = НСтр("ru = 'начало учета'"); + ТекстНачалаУчета = НачалоУчета(); Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + ТекстНачалаУчета + """'"); КонецПроцедуры @@ -724,7 +724,7 @@ КонецЕсли; Элементы.ТекстПроДатуДействия.Заголовок = ТекстИсторическийАдрес; - Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + НСтр("ru = 'начало учета'") + """'"); + Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + НачалоУчета() + """'"); КонецПроцедуры @@ -934,4 +934,11 @@ Возврат Форма.ВидКонтактнойИнформации; КонецФункции +&НаКлиентеНаСервереБезКонтекста +Функция НачалоУчета() + + Возврат НСтр("ru = 'начало учета'"); + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ManagerModule.bsl b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ManagerModule.bsl index 7308c1de1..6d15958f9 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ManagerModule.bsl @@ -10,116 +10,14 @@ #Область СлужебныйПрограммныйИнтерфейс -// Заполняет массив типов, для которых при выгрузке необходимо использовать аннотацию -// ссылок в файлах выгрузки. -// -// Параметры: -// Типы - Массив из ОбъектМетаданных -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт Типы.Добавить(Метаданные.Справочники.Пользователи); КонецПроцедуры -// Вызывается при регистрации произвольных обработчиков выгрузки данных. -// -// Параметры: -// ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется -// дополнить эту таблицу значений информацией о регистрируемых произвольных -// обработчиках выгрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных - при выгрузке данных которого должен -// вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль - общий модуль, в котором реализован произвольный -// обработчик выгрузки данных. Набор экспортных процедур, которые должны -// быть реализованы в обработчике, зависит от установки значений следующих -// колонок таблицы значений, -// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных, -// поддерживаемого обработчиком, -// ПередВыгрузкойТипа - Булево - флаг необходимости вызова обработчика перед -// выгрузкой всех объектов информационной базы, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередВыгрузкойТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПередВыгрузкойТипа() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных - перед выгрузкой данных которого -// был вызван обработчик, -// Отказ - Булево - если в процедуре ПередВыгрузкойТипа() установить значение -// данного параметра равным Истина - выгрузка объектов, соответствующих -// текущему объекту метаданных, выполняться не будет. -// ПередВыгрузкойОбъекта - Булево - флаг необходимости вызова обработчика перед -// выгрузкой конкретного объекта информационной базы. Если присвоено значение -// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура -// ПередВыгрузкойОбъекта(), поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы - -// менеджер выгрузки текущего объекта. Подробнее см. комментарий к программному интерфейсу обработки -// ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы. Параметр передается только при вызове -// процедур обработчиков, для которых при регистрации указана версия не ниже 1.0.0.1, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПередВыгрузкойОбъекта() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// Объект - КонстантаМенеджерЗначения.* -// - СправочникОбъект.* -// - ДокументОбъект.* -// - БизнесПроцессОбъект.* -// - ЗадачаОбъект.* -// - ПланСчетовОбъект.* -// - ПланОбменаОбъект.* -// - ПланВидовХарактеристикОбъект.* -// - ПланВидовРасчетаОбъект.* -// - РегистрСведенийНаборЗаписей.* -// - РегистрНакопленияНаборЗаписей.* -// - РегистрБухгалтерииНаборЗаписей.* -// - РегистрРасчетаНаборЗаписей.* -// - ПоследовательностьНаборЗаписей.* -// - ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, перед выгрузкой которого был вызван обработчик. -// Значение, переданное в процедуру ПередВыгрузкойОбъекта() в качестве значения параметра -// Объект может быть модифицировано внутри обработчика ПередВыгрузкойОбъекта(), при -// этом внесенные изменения будут отражены в сериализации объекта в файлах выгрузки, но -// не будут зафиксированы в информационной базе -// Артефакты - Массив из ОбъектXDTO - набор дополнительной информации, логически неразрывно -// связанной с объектом, но не являющейся его частью (артефакты объекта). Артефакты должны -// сформированы внутри обработчика ПередВыгрузкойОбъекта() и добавлены в массив, переданный -// в качестве значения параметра Артефакты. Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. В дальнейшем -// артефакты, сформированные в процедуре ПередВыгрузкойОбъекта(), будут доступны в процедурах -// обработчиков загрузки данных (см. комментарий к процедуре ПриРегистрацииОбработчиковЗагрузкиДанных(). -// Отказ - Булево - если в процедуре ПередВыгрузкойОбъекта() установить значение -// данного параметра равным Истина - выгрузка объекта, для которого был вызван обработчик, -// выполняться не будет. -// ПослеВыгрузкиТипа() - Булево - флаг необходимости вызова обработчика после выгрузки всех -// объектов информационной базы, относящихся к данному объекту метаданных. Если присвоено значение -// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура -// ПослеВыгрузкиТипа(), поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПослеВыгрузкиТипа() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных - после выгрузки данных которого -// был вызван обработчик. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт ОбъектОбработчика = Создать(); @@ -134,144 +32,7 @@ КонецПроцедуры -// Вызывается при регистрации произвольных обработчиков загрузки данных. -// -// Параметры: -// ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется -// дополнить эту таблицу значений информацией о регистрируемых произвольных -// обработчиках загрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных - при загрузке данных которого должен -// вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль - общий модуль, в котором реализован произвольный -// обработчик загрузки данных. Набор экспортных процедур, которые должны -// быть реализованы в обработчике, зависит от установки значений следующих -// колонок таблицы значений, -// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных, -// поддерживаемого обработчиком, -// ПередСопоставлениемСсылок - Булево - флаг необходимости вызова обработчика перед -// сопоставлением ссылок (в исходной ИБ и в текущей), относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередСопоставлениемСсылок(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных - перед сопоставлением ссылок которого -// был вызван обработчик, -// СтандартнаяОбработка - Булево - если процедуре ПередСопоставлениемСсылок() -// установить значение данного параметра равным Ложь, вместо стандартного -// сопоставления ссылок (поиск объектов в текущей ИБ с теми же значениями -// естественного ключа, которые были выгружены из ИБ-источника) будет -// вызвана функция СопоставитьСсылки() общего модуля, в процедуре -// ПередСопоставлениемСсылок() которого значение параметра СтандартнаяОбработка -// было установлено равным Ложь. -// Параметры функции СопоставитьСсылки(): -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// ТаблицаИсходныхСсылок - ТаблицаЗначений - содержащая информацию о ссылках, -// выгруженных из исходной ИБ. Колонки: -// ИсходнаяСсылка - ЛюбаяСсылка - ссылка объекта исходной ИБ, которую требуется -// сопоставить c ссылкой в текущей ИБ, -// Остальные колонки равным полям естественного ключа объекта, которые в -// процессе выгрузки данных были переданы в функцию -// Обработка.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы.ТребуетсяСопоставитьСсылкуПриЗагрузке() -// Возвращаемое значение функции СопоставитьСсылки() - ТаблицаЗначений, колонки: -// ИсходнаяСсылка - ЛюбаяСсылка - ссылка объекта, выгруженная из исходной ИБ, -// Ссылка - ЛюбаяСсылка - сопоставленная исходной ссылка в текущей ИБ. -// Отказ - Булево - если в процедуре ПередСопоставлениемСсылок() установить значение -// данного параметра равным Истина - сопоставление ссылок, соответствующих -// текущему объекту метаданных, выполняться не будет. -// ПередЗагрузкойТипа - Булево - флаг необходимости вызова обработчика перед -// загрузкой всех объектов данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередЗагрузкойТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных - перед загрузкой всех данных которого -// был вызван обработчик, -// Отказ - Булево - если в процедуре ПередЗагрузкойТипа() установить значение данного -// параметра равным Истина - загрузка всех объектов данных соответствующих текущему -// объекту метаданных выполняться не будет. -// ПередЗагрузкойОбъекта - Булево - флаг необходимости вызова обработчика перед -// загрузкой объекта данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередЗагрузкойОбъекта(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.* -// - СправочникОбъект.* -// - ДокументОбъект.* -// - БизнесПроцессОбъект.* -// - ЗадачаОбъект.* -// - ПланСчетовОбъект.* -// - ПланОбменаОбъект.* -// - ПланВидовХарактеристикОбъект.* -// - ПланВидовРасчетаОбъект.* -// - РегистрСведенийНаборЗаписей.* -// - РегистрНакопленияНаборЗаписей.* -// - РегистрБухгалтерииНаборЗаписей.* -// - РегистрРасчетаНаборЗаписей.* -// - ПоследовательностьНаборЗаписей.* -// - ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, перед загрузкой которого был вызван обработчик. -// Значение, переданное в процедуру ПередЗагрузкойОбъекта() в качестве значения параметра -// Объект может быть модифицировано внутри процедуры обработчика ПередЗагрузкойОбъекта(). -// Артефакты - Массив из ОбъектXDTO - дополнительные данные, логически неразрывно связанные -// с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах -// ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре -// ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. -// Отказ - Булево - если в процедуре ПередЗагрузкойОбъекта() установить значение данного -// параметра равным Истина - загрузка объекта данных выполняться не будет. -// ПослеЗагрузкиОбъекта - Булево - флаг необходимости вызова обработчика после -// загрузки объекта данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПослеЗагрузкиОбъекта(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.* -// - СправочникОбъект.* -// - ДокументОбъект.* -// - БизнесПроцессОбъект.* -// - ЗадачаОбъект.* -// - ПланСчетовОбъект.* -// - ПланОбменаОбъект.* -// - ПланВидовХарактеристикОбъект.* -// - ПланВидовРасчетаОбъект.* -// - РегистрСведенийНаборЗаписей.* -// - РегистрНакопленияНаборЗаписей.* -// - РегистрБухгалтерииНаборЗаписей.* -// - РегистрРасчетаНаборЗаписей.* -// - ПоследовательностьНаборЗаписей.* -// - ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, после загрузки которого был вызван обработчик. -// Артефакты - Массив из ОбъектXDTO - дополнительные данные, логически неразрывно связанные -// с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах -// ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре -// ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. -// ПослеЗагрузкиТипа - Булево - флаг необходимости вызова обработчика после -// загрузки всех объектов данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПослеЗагрузкиТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных - после загрузки всех объектов которого -// был вызван обработчик. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковЗагрузкиДанных. Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт ОбъектОбработчика = Создать(); diff --git a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl index 219f6129a..09483685f 100644 --- a/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ВыгрузкаЗагрузкаДанныхСверткаСсылокНаПользователейВРазделенныхДанных/ObjectModule.bsl @@ -440,7 +440,8 @@ // ИмяФайла - Строка - путь к файлу. // // Возвращаемое значение: -// Объект +// СправочникОбъект.Пользователи +// Неопределено // Функция ПрочитатьОбъектИзФайла(Знач ИмяФайла) @@ -462,7 +463,8 @@ // ПотокЧтения - ЧтениеXML - поток чтения. // // Возвращаемое значение: -// Объект +// СправочникОбъект.Пользователи +// Неопределено // Функция ПрочитатьОбъектИзПотока(ПотокЧтения) diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form index 4282918c2..a13852c18 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form @@ -3,6 +3,140 @@ ВыполнениеОбменаДанными 1 + + СтраницаСинхронизацияДанныхНедоступна + 202 + + Группа2 + 204 + + СинхронизацияДанныхНедоступна + 206 + + <key>ru</key> + <value>Синхронизация данных недоступна</value> + + true + true + + true + + + СинхронизацияДанныхНедоступнаРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + + СинхронизацияДанныхНедоступнаКонтекстноеМеню + 207 + true + + true + true + + + CommonPicture.СинхронизацияДанныхНедоступна + + + + + СтатусНедоступностьСинхронизации + 209 + + <key>ru</key> + <value> +Невозможно запустить синхронизацию данных. +Повторите попытку позже или <link ОжидатьВозможностьСинхронизации>ожидайте</><link ОжидатьВозможностьСинхронизации> </><link ОжидатьВозможностьСинхронизации>такую</><link ОжидатьВозможностьСинхронизации> </><link ОжидатьВозможностьСинхронизации>возможность...</></value> + + true + true + + true + + + СтатусНедоступностьСинхронизацииРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + + СтатусНедоступностьСинхронизацииКонтекстноеМеню + 210 + true + + true + Label + 3 + true + + + URLProcessing + СтатусНедоступностьСинхронизацииОбработкаНавигационнойСсылки + + Left + Center + + + true + true + + true + + + Группа2РасширеннаяПодсказка + 205 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Синхронизация данных недоступна</value> + + + СтраницаСинхронизацияДанныхНедоступнаРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + ОжиданиеЗапускаСинхронизации 192 @@ -1818,6 +1952,111 @@ false + + ОшибкаНазначениеИдентификатораДляУзла + 212 + + КартинкаОшибкаНазначениеИдентификатораДляУзла + 214 + + <key>ru</key> + <value>Картинка ошибка назначение идентификатора для узла</value> + + true + true + + true + + + КартинкаОшибкаНазначениеИдентификатораДляУзлаРасширеннаяПодсказка + 216 + Label + true + true + + Left + + + + КартинкаОшибкаНазначениеИдентификатораДляУзлаКонтекстноеМеню + 215 + true + + true + true + + + CommonPicture.Предупреждение32 + + + + + ДекорацияОшибкаНазначениеИдентификатораДляУзла + 217 + + <key>ru</key> + <value>Обнаружено дублирование настроек синхронизации данных. + +Способ исправления приведен в <link 1>инструкции</> +</value> + + true + true + + true + + + ДекорацияОшибкаНазначениеИдентификатораДляУзлаРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + + ДекорацияОшибкаНазначениеИдентификатораДляУзлаКонтекстноеМеню + 218 + true + + true + Label + true + + + URLProcessing + ДекорацияОшибкаНазначениеИдентификатораДляУзлаОбработкаНавигационнойСсылки + + Left + + + true + true + + true + + + <key>ru</key> + <value>Ошибка назначение идентификатора для узла</value> + + + ОшибкаНазначениеИдентификатораДляУзлаРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + Page + + HorizontalIfPossible + auto + false + + true true @@ -3002,6 +3241,32 @@ true + + ОжидатьВозможностьВыполнитьСинхронизацию + 48 + + Boolean + + + true + + + true + + + + ОшибкаНазначенияИдентификатораДляУзла + 49 + + Boolean + + + true + + + true + + ПерейтиВЖурналРегистрации diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl index 60c317906..d1226e5e1 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl @@ -123,7 +123,17 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - УстановитьПорядковыйНомерПерехода(1); + Если БлокировкаУзлаУстановлена Тогда + + Шаг = 2; + + Иначе + + Шаг = 1; + + КонецЕсли; + + УстановитьПорядковыйНомерПерехода(Шаг); КонецПроцедуры @@ -726,12 +736,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// РАЗДЕЛ ОБРАБОТЧИКОВ СОБЫТИЙ ПЕРЕХОДОВ - -//////////////////////////////////////////////////////////////////////////////// -// Общие страницы обмена - &НаКлиенте Функция Подключаемый_ОжиданиеЗапускаСинхронизации_ОбработкаДлительнойОперации(Отказ, ПерейтиДалее) @@ -972,6 +976,10 @@ Элементы.ТекстТребуетсяОбновлениеОграниченныеПрава.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( Элементы.ТекстТребуетсяОбновлениеОграниченныеПрава.Заголовок, НаименованиеКорреспондента); + + ИначеЕсли ОшибкаНазначенияИдентификатораДляУзла Тогда + + Элементы.СтатусЗавершенияОбмена.ТекущаяСтраница = Элементы.ОшибкаНазначениеИдентификатораДляУзла; Иначе @@ -1326,6 +1334,12 @@ ДатаНачалаОперации, СообщениеОбОшибке); УстановитьПривилегированныйРежим(Ложь); + + ТекстОшибки = НСтр("ru = 'Обнаружено дублирование настроек синхронизации данных'", ОбщегоНазначения.КодОсновногоЯзыка()); + Если Не ПустаяСтрока(ТекстОшибки) И СтрНайти(СообщениеОбОшибке, ТекстОшибки) > 0 Тогда + ОшибкаНазначенияИдентификатораДляУзла = Истина; + КонецЕсли; + Иначе РезультатВыполненияВФоне = ПолучитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища); @@ -1422,6 +1436,7 @@ ТаблицаПереходов.Очистить(); + ТаблицаПереходовНоваяСтрока("СтраницаСинхронизацияДанныхНедоступна", ""); ТаблицаПереходовНоваяСтрока("ОжиданиеЗапускаСинхронизации", "", Истина, "ОжиданиеЗапускаСинхронизации_ОбработкаДлительнойОперации"); // Инициализируем текущий сценарий работы обмена. @@ -1476,4 +1491,34 @@ КонецПроцедуры +&НаКлиенте +Процедура ДекорацияОшибкаНазначениеИдентификатораДляУзлаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ОткрытьФорму("ОбщаяФорма.ДополнительноеОписание", Новый Структура("Заголовок,ИмяМакета", + НСтр("ru = 'Установка кода для предопределенного узла'"), "ИнструкцияДляУстановкиКодаДляПредопределенногоУзла_ru")); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// РАЗДЕЛ ОБРАБОТЧИКОВ СОБЫТИЙ ПЕРЕХОДОВ + +//////////////////////////////////////////////////////////////////////////////// +// Общие страницы обмена + +&НаКлиенте +Процедура СтатусНедоступностьСинхронизацииОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Если НавигационнаяСсылкаФорматированнойСтроки = "ОжидатьВозможностьСинхронизации" Тогда + + Шаг = ПорядковыйНомерПерехода + 1; + УстановитьПорядковыйНомерПерехода(Шаг); + + КонецЕсли; + +КонецПроцедуры + + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl index d6a626124..6ce06c280 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ВыбранныеЭлементы/Module.bsl @@ -12,7 +12,7 @@ Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ВыбранныеТипы = Параметры.ВыбранныеТипы; - КлючНазначенияИспользования = ВыбранныеТипы; + КлючНазначенияИспользования = СократитьСтрокуКонтрольнойСуммой(ВыбранныеТипы, 128); ОбъектОбработка = РеквизитФормыВЗначение("Объект"); ТекстЗапроса = ОбъектОбработка.ТекстЗапроса(ВыбранныеТипы); @@ -221,4 +221,16 @@ Возврат СтрокаПодстановки; КонецФункции +&НаСервере +Функция СократитьСтрокуКонтрольнойСуммой(Строка, МаксимальнаяДлина) + Результат = Строка; + Если СтрДлина(Строка) > МаксимальнаяДлина Тогда + Результат = Лев(Строка, МаксимальнаяДлина - 32); + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); + ХешированиеДанных.Добавить(Сред(Строка, МаксимальнаяДлина - 32 + 1)); + Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); + КонецЕсли; + Возврат Результат; +КонецФункции + #КонецОбласти diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl index 0a8ebd5cc..dbf713e33 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/РедактированиеФормулы/Module.bsl @@ -493,6 +493,7 @@ КонецЕсли; Попытка + //@skip-warning РезультатРасчета = Вычислить(ТекстРасчета); Исключение ТекстОшибки = НСтр("ru = 'В формуле обнаружены ошибки. Проверьте формулу. diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl index 97474a90d..b1e86aca8 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/Форма/Module.bsl @@ -273,6 +273,9 @@ КонецЕсли; Если НазначениеКнопки = "Прервать" Тогда + Если ТекущееСостояниеИзменения = Неопределено Или ДлительнаяОперация = Неопределено Тогда + Возврат; + КонецЕсли; ТекущееСостояниеИзменения.ПрерватьИзменение = Истина; Элементы.ФормаИзменить.Доступность = Ложь; Если Не ДлительнаяОперация.Статус = "Выполнено" Тогда @@ -633,6 +636,7 @@ Возврат; КонецЕсли; + ТекущееСостояниеИзменения = Неопределено; УстановитьКнопкиНаВремяИзменения(Истина); ПерейтиНаСтраницуИзмененияОбъектов(); ОбъектыКоторыеНеУдалосьИзменить.Очистить(); @@ -2057,14 +2061,14 @@ &НаСервере Функция ФильтруемыеРеквизиты() - Результат = Новый Массив; + Если Объект.ПоказыватьСлужебныеРеквизиты Тогда - Возврат Результат; + Возврат Новый Массив; КонецЕсли; Для Каждого ИмяТипа Из СтрРазделить(ВидыИзменяемыхОбъектов, ",", Ложь) Цикл ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяТипа); - ФильтруемыеРеквизиты = ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных); + ФильтруемыеРеквизиты = ФильтрРедактированияПоТипу(ОбъектМетаданных); ЗакрытыеФункциональнымиОпциями = Новый ТаблицаЗначений; ЗакрытыеФункциональнымиОпциями.Колонки.Добавить("ИмяРеквизита", Новый ОписаниеТипов("Строка")); @@ -2099,17 +2103,17 @@ ЗакрытыеФункциональнымиОпциями.Свернуть("ИмяРеквизита"); - Для Каждого ЗакрытыйФО Из ЗакрытыеФункциональнымиОпциями Цикл - ФильтруемыеРеквизиты.Добавить(ЗакрытыйФО.ИмяРеквизита); + Для Каждого РеквизитЗакрытыйФункциональнымиОпциями Из ЗакрытыеФункциональнымиОпциями Цикл + ФильтруемыеРеквизиты[РеквизитЗакрытыйФункциональнымиОпциями.ИмяРеквизита] = Истина; КонецЦикла; - Для Каждого Реквизит Из ФильтруемыеРеквизиты Цикл - Если Результат.Найти(Реквизит) = Неопределено Тогда - Результат.Добавить(Реквизит); - КонецЕсли; - КонецЦикла; КонецЦикла; + Результат = Новый Массив; + Для Каждого Реквизит Из ФильтруемыеРеквизиты Цикл + Результат.Добавить(Реквизит.Ключ); + КонецЦикла; + Возврат Результат; КонецФункции @@ -2704,55 +2708,196 @@ КонецПроцедуры -// Получает массив реквизитов, редактирование которых не предусмотрено -// на уровне конфигурации. +&НаСервере +Функция ФильтрРеквизитов() + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("ТипОбъекта", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(80))); + Результат.Колонки.Добавить("Реквизит", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(80))); + + // Все объекты. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "*"; + Фильтр.Реквизит = "Наименование"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "*"; + Фильтр.Реквизит = "ПометкаУдаления"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "*"; + Фильтр.Реквизит = "Ссылка"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "*"; + Фильтр.Реквизит = "ДополнительныеРеквизиты.*"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "*"; + Фильтр.Реквизит = "КонтактнаяИнформация.*"; + + // Справочники. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Справочники"; + Фильтр.Реквизит = "ИмяПредопределенныхДанных"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Справочники"; + Фильтр.Реквизит = "Код"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Справочники"; + Фильтр.Реквизит = "Предопределенный"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Справочники"; + Фильтр.Реквизит = "ЭтоГруппа"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Справочники"; + Фильтр.Реквизит = "РеквизитДопУпорядочивания"; + + // Документы. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Документы"; + Фильтр.Реквизит = "Номер"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Документы"; + Фильтр.Реквизит = "Проведен"; + + // Планы видов характеристик. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовХарактеристик"; + Фильтр.Реквизит = "ИмяПредопределенныхДанных"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовХарактеристик"; + Фильтр.Реквизит = "Код"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовХарактеристик"; + Фильтр.Реквизит = "Предопределенный"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовХарактеристик"; + Фильтр.Реквизит = "ЭтоГруппа"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовХарактеристик"; + Фильтр.Реквизит = "ТипЗначения"; + + // Планы счетов. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыСчетов"; + Фильтр.Реквизит = "ИмяПредопределенныхДанных"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыСчетов"; + Фильтр.Реквизит = "Код"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыСчетов"; + Фильтр.Реквизит = "Предопределенный"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыСчетов"; + Фильтр.Реквизит = "Порядок"; + + // Планы видов расчета. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовРасчета"; + Фильтр.Реквизит = "ИмяПредопределенныхДанных"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовРасчета"; + Фильтр.Реквизит = "Код"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовРасчета"; + Фильтр.Реквизит = "Предопределенный"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыВидовРасчета"; + Фильтр.Реквизит = "ПериодДействияБазовый"; + + // Задачи. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "Задачи"; + Фильтр.Реквизит = "Номер"; + + // Бизнес-процессы. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "БизнесПроцессы"; + Фильтр.Реквизит = "Номер"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "БизнесПроцессы"; + Фильтр.Реквизит = "Дата"; + + // Планы обмена. + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыОбмена"; + Фильтр.Реквизит = "Код"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыОбмена"; + Фильтр.Реквизит = "НомерОтправленного"; + + Фильтр = Результат.Добавить(); + Фильтр.ТипОбъекта = "ПланыОбмена"; + Фильтр.Реквизит = "НомерПринятого"; + + Результат.Индексы.Добавить("ТипОбъекта"); + + Возврат Результат; +КонецФункции + +// Получает массив реквизитов, редактирование которых не предусмотрено на уровне конфигурации. // // Параметры: // ОбъектМетаданных - ОбъектМетаданных +// // Возвращаемое значение: -// Массив +// Соответствие // &НаСервере -Функция ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных) +Функция ФильтрРедактированияПоТипу(ОбъектМетаданных) - ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); - ФильтрXML = ОбработкаОбъект.ПолучитьМакет("ФильтрРеквизитов").ПолучитьТекст(); - - ФильтрТаблица = ПрочитатьXMLВТаблицу(ФильтрXML).Данные; + ФильтрТаблица = ФильтрРеквизитов(); // Реквизиты, блокируемые для любого типа объектов метаданных. - ОбщийФильтр = ФильтрТаблица.НайтиСтроки(Новый Структура("ObjectType", "*")); + ОбщийФильтр = ФильтрТаблица.НайтиСтроки(Новый Структура("ТипОбъекта", "*")); // Реквизиты, блокируемые для указанного типа объектов метаданных. - ФильтрПоТипуОМ = ФильтрТаблица.НайтиСтроки( - Новый Структура("ObjectType", - ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных))); + ФильтрПоТипуОбъекта = ФильтрТаблица.НайтиСтроки(Новый Структура("ТипОбъекта", + ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных))); - ФильтруемыеРеквизиты = Новый Массив; + ФильтруемыеРеквизиты = Новый Соответствие; Для Каждого СтрокаОписание Из ОбщийФильтр Цикл - ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); + ФильтруемыеРеквизиты[СтрокаОписание.Реквизит] = Истина; КонецЦикла; - Для Каждого СтрокаОписание Из ФильтрПоТипуОМ Цикл - ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); + Для Каждого СтрокаОписание Из ФильтрПоТипуОбъекта Цикл + ФильтруемыеРеквизиты[СтрокаОписание.Реквизит] = Истина; КонецЦикла; ПрефиксУдаляемыхРеквизитов = "Удалить"; - ОписаниеРеквизитов = ОбъектМетаданных.Реквизиты;// Массив из ОбъектМетаданныхРеквизит + ОписаниеРеквизитов = ОбъектМетаданных.Реквизиты; // Массив из ОбъектМетаданныхРеквизит Для Каждого Реквизит Из ОписаниеРеквизитов Цикл Если НРег(Лев(Реквизит.Имя, СтрДлина(ПрефиксУдаляемыхРеквизитов))) = НРег(ПрефиксУдаляемыхРеквизитов) Тогда - ФильтруемыеРеквизиты.Добавить(Реквизит.Имя); + ФильтруемыеРеквизиты[Реквизит.Имя] = Истина; КонецЕсли; КонецЦикла; Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл Если НРег(Лев(ТабличнаяЧасть.Имя, СтрДлина(ПрефиксУдаляемыхРеквизитов))) = НРег(ПрефиксУдаляемыхРеквизитов) Тогда - ФильтруемыеРеквизиты.Добавить(ТабличнаяЧасть.Имя + ".*"); + ФильтруемыеРеквизиты[ТабличнаяЧасть.Имя + ".*"] = Истина; Иначе - ОписаниеРеквизитовТабличнойЧасти = ТабличнаяЧасть.Реквизиты;// Массив из ОбъектМетаданныхРеквизит + ОписаниеРеквизитовТабличнойЧасти = ТабличнаяЧасть.Реквизиты; // Массив из ОбъектМетаданныхРеквизит Для Каждого Реквизит Из ОписаниеРеквизитовТабличнойЧасти Цикл Если НРег(Лев(Реквизит.Имя, СтрДлина(ПрефиксУдаляемыхРеквизитов))) = НРег(ПрефиксУдаляемыхРеквизитов) Тогда - ФильтруемыеРеквизиты.Добавить(ТабличнаяЧасть.Имя + "." + Реквизит.Имя); + ФильтруемыеРеквизиты[ТабличнаяЧасть.Имя + "." + Реквизит.Имя] = Истина; КонецЕсли; КонецЦикла; КонецЕсли; @@ -3366,7 +3511,7 @@ // например, "Справочник.Организации". // // Возвращаемое значение: -// СправочникМенеджер, ДокументМенеджер, ... +// СправочникМенеджер, ДокументМенеджер, ОбработкаМенеджер, РегистрСведенийМенеджер - менеджер объекта. // &НаСервереБезКонтекста Функция МенеджерОбъектаПоПолномуИмени(ПолноеИмя) @@ -3474,7 +3619,7 @@ // Не обрабатываются точки маршрутов бизнес-процессов. // // Параметры: -// Ссылка - ссылка на объект - элемент справочника, документ, ... +// Ссылка - ЛюбаяСсылка - элемент справочника, документ, ... // // Возвращаемое значение: // Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... @@ -3491,7 +3636,7 @@ // Не обрабатываются точки маршрутов бизнес-процессов. // // Параметры: -// Тип - тип прикладного объекта, определенный в конфигурации. +// ТипОбъекта - Тип - тип прикладного объекта, определенный в конфигурации. // // Возвращаемое значение: // Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... @@ -3533,10 +3678,13 @@ КонецФункции -// Проверяет является ли объект группой элементов. +// Проверяет, является ли объект группой элементов. // // Параметры: -// Объект - объект, Ссылка, ДанныеФормыСтруктура по типу Объект. +// Объект - СправочникОбъект +// - ДокументОбъект +// - ЛюбаяСсылка +// - ДанныеФормыСтруктура // // Возвращаемое значение: // Булево @@ -3613,7 +3761,7 @@ // Проверить, что значение имеет ссылочный тип данных. // // Параметры: -// Значение - ссылка на объект - элемент справочника, документ, ... +// Значение - Произвольный - проверяемое значение. // // Возвращаемое значение: // Булево - Истина, если тип значения ссылочный. @@ -3966,7 +4114,7 @@ // то следует использовать предварительный переход в привилегированный режим. // // Параметры: -// Ссылка - ссылка на объект - элемент справочника, документ, ... +// Ссылка - ЛюбаяСсылка - элемент справочника, документ, ... // // Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате // требований к свойствам структуры. @@ -4049,7 +4197,7 @@ // то следует использовать предварительный переход в привилегированный режим. // // Параметры: -// Ссылка - ссылка на объект - элемент справочника, документ, ... +// Ссылка - ЛюбаяСсылка - элемент справочника, документ, ... // ИмяРеквизита - Строка - например, "Код". // // Возвращаемое значение: @@ -4213,99 +4361,6 @@ КонецФункции -// Преобразует текст формата XML в таблицу значений, -// при этом колонки таблицы формируются на основе описания в XML. -// -// Параметры: -// XML - текст в формате XML или ЧтениеXML. -// -// Схема XML: -// <?xml version="1.0" encoding="utf-8"?> -// <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> -// <xs:element name="Items"> -// <xs:complexType> -// <xs:sequence> -// <xs:element maxOccurs="unbounded" name="Item"> -// <xs:complexType> -// <xs:attribute name="Code" type="xs:integer" use="required" /> -// <xs:attribute name="Name" type="xs:string" use="required" /> -// <xs:attribute name="Socr" type="xs:string" use="required" /> -// <xs:attribute name="Index" type="xs:string" use="required" /> -// </xs:complexType> -// </xs:element> -// </xs:sequence> -// <xs:attribute name="Description" type="xs:string" use="required" /> -// <xs:attribute name="Columns" type="xs:string" use="required" /> -// </xs:complexType> -// </xs:element> -// </xs:schema> -// -// Примеры XML-файлов см. в демонстрационной конфигурации. -// -// Пример использования: -// КлассификаторТаблица = ПрочитатьXMLВТаблицу(РегистрыСведений.АдресныйКлассификатор. -// ПолучитьМакет("КлассификаторАдресныхОбъектовРоссии").ПолучитьТекст()); -// -// Возвращаемое значение: -// Структура: -// ИмяТаблицы - Строка -// Данные - ТаблицаЗначений. -// -&НаСервереБезКонтекста -Функция ПрочитатьXMLВТаблицу(Знач XML) - - Если ТипЗнч(XML) <> Тип("ЧтениеXML") Тогда - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(XML); - Иначе - Чтение = XML; - КонецЕсли; - - // Прочитаем первый узел и проверим его. - Если Не Чтение.Прочитать() Тогда - ВызватьИсключение НСтр("ru = 'Пустой XML'"); - ИначеЕсли Чтение.Имя <> "Items" Тогда - ВызватьИсключение НСтр("ru = 'Ошибка в структуре XML'"); - КонецЕсли; - - // Получим описание таблицы и создадим ее. - ИмяТаблицы = Чтение.ПолучитьАтрибут("Description"); - ИменаКолонок = СтрЗаменить(Чтение.ПолучитьАтрибут("Columns"), ",", Символы.ПС); - Колонок = СтрЧислоСтрок(ИменаКолонок); - - ТаблицаЗначений = Новый ТаблицаЗначений; - Для Сч = 1 По Колонок Цикл - ТаблицаЗначений.Колонки.Добавить(СтрПолучитьСтроку(ИменаКолонок, Сч), Новый ОписаниеТипов("Строка")); - КонецЦикла; - - // Заполним значения в таблице. - Пока Чтение.Прочитать() Цикл - - Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "Items" Тогда - Прервать; - ИначеЕсли Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда - Продолжить; - ИначеЕсли Чтение.Имя <> "Item" Тогда - ВызватьИсключение НСтр("ru = 'Ошибка в структуре XML'"); - КонецЕсли; - - новСтр = ТаблицаЗначений.Добавить(); - Для Сч = 1 По Колонок Цикл - ИмяКолонки = СтрПолучитьСтроку(ИменаКолонок, Сч); - новСтр[Сч-1] = Чтение.ПолучитьАтрибут(ИмяКолонки); - КонецЦикла; - - КонецЦикла; - - // Заполним результат - Результат = Новый Структура; - Результат.Вставить("ИмяТаблицы", ИмяТаблицы); - Результат.Вставить("Данные", ТаблицаЗначений); - - Возврат Результат; - -КонецФункции - // Преобразует таблицу значений в массив. // Может использоваться для передачи на клиента данных, полученных // на сервере в виде таблицы значений в том случае, если таблица @@ -4319,7 +4374,8 @@ // с большим количеством строк. // // Параметры: -// ТаблицаЗначений +// ТаблицаЗначений - ТаблицаЗначений +// // Возвращаемое значение: // Массив // @@ -4435,10 +4491,10 @@ // Параметры: // Шаблон - Строка - строка, содержит перечисленные через точку с запятой 6 форм строки // для каждой категории числительного: -// - %1 обозначает позицию числа; +// %1 обозначает позицию числа; // Число - Число - число, которое будет подставлено в строку вместо параметра "%1". // Вид - ВидЧисловогоЗначения - определяет вид числового значения, для которого формируется представление. -// - количественное (по умолчанию) или Порядковое. +// Количественное (по умолчанию) или Порядковое. // ФорматнаяСтрока - Строка - строка параметров форматирования. См. аналогичный параметр в СтрокаСЧислом. // // Возвращаемое значение: diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl index b1679b1e4..fc1fc7b2b 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ObjectModule.bsl @@ -94,7 +94,9 @@ |)"; КонецЦикла; - ТекстЗапроса = "ВЫБРАТЬ " + ?(ОграничитьВыборку, "ПЕРВЫЕ 1001 ", "") + ТекстЗапроса + Символы.ПС + " + ТекстЗапроса = "ВЫБРАТЬ " + ?(ОграничитьВыборку, "ПЕРВЫЕ 1001 ", "") //@query-part + + ТекстЗапроса + Символы.ПС + " + |ИЗ | "+ ОбъектМетаданных.ПолноеИмя() + " КАК " + ПсевдонимТаблицы; @@ -996,10 +998,10 @@ // Не обрабатываются точки маршрутов бизнес-процессов. // // Параметры: -// Ссылка - ссылка на объект - элемент справочника, документ, ... +// Ссылка - ЛюбаяСсылка // // Возвращаемое значение: -// Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... +// Строка // Функция ВидОбъектаПоСсылке(Ссылка) Экспорт @@ -1098,10 +1100,10 @@ // Проверить, что значение имеет ссылочный тип данных. // // Параметры: -// Значение - ссылка на объект - элемент справочника, документ, ... +// Значение - ЛюбаяСсылка // // Возвращаемое значение: -// Булево - Истина, если тип значения ссылочный. +// Булево // Функция ЗначениеСсылочногоТипа(Значение) Экспорт @@ -1161,7 +1163,7 @@ // то следует использовать предварительный переход в привилегированный режим. // // Параметры: -// Ссылка - ссылка на объект - элемент справочника, документ, ... +// Ссылка - ЛюбаяСсылка // // Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате // требований к свойствам структуры. @@ -1243,7 +1245,7 @@ // то следует использовать предварительный переход в привилегированный режим. // // Параметры: -// Ссылка - ссылка на объект - элемент справочника, документ, ... +// Ссылка - ЛюбаяСсылка // ИмяРеквизита - Строка - например, "Код". // // Возвращаемое значение: diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Templates/ФильтрРеквизитов/Template.txt b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Templates/ФильтрРеквизитов/Template.txt deleted file mode 100644 index b4907f8b7..000000000 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Templates/ФильтрРеквизитов/Template.txt +++ /dev/null @@ -1,43 +0,0 @@ -<Items Description="Реквизиты, не редактируемые для всех объектов" Columns="ObjectType,Attribute"> - - <Item ObjectType="*" Attribute="Наименование"/> - <Item ObjectType="*" Attribute="ПометкаУдаления"/> - <Item ObjectType="*" Attribute="Ссылка"/> - <Item ObjectType="*" Attribute="ДополнительныеРеквизиты.*"/> - <Item ObjectType="*" Attribute="КонтактнаяИнформация.*"/> - - <Item ObjectType="Справочники" Attribute="ИмяПредопределенныхДанных"/> - <Item ObjectType="Справочники" Attribute="Код"/> - <Item ObjectType="Справочники" Attribute="Предопределенный"/> - <Item ObjectType="Справочники" Attribute="ЭтоГруппа"/> - <Item ObjectType="Справочники" Attribute="РеквизитДопУпорядочивания"/> - - <Item ObjectType="Документы" Attribute="Номер"/> - <Item ObjectType="Документы" Attribute="Проведен"/> - - <Item ObjectType="ПланыВидовХарактеристик" Attribute="ИмяПредопределенныхДанных"/> - <Item ObjectType="ПланыВидовХарактеристик" Attribute="Код"/> - <Item ObjectType="ПланыВидовХарактеристик" Attribute="Предопределенный"/> - <Item ObjectType="ПланыВидовХарактеристик" Attribute="ЭтоГруппа"/> - <Item ObjectType="ПланыВидовХарактеристик" Attribute="ТипЗначения"/> - - <Item ObjectType="ПланыСчетов" Attribute="ИмяПредопределенныхДанных"/> - <Item ObjectType="ПланыСчетов" Attribute="Код"/> - <Item ObjectType="ПланыСчетов" Attribute="Предопределенный"/> - <Item ObjectType="ПланыСчетов" Attribute="Порядок"/> - - <Item ObjectType="ПланыВидовРасчета" Attribute="ИмяПредопределенныхДанных"/> - <Item ObjectType="ПланыВидовРасчета" Attribute="Код"/> - <Item ObjectType="ПланыВидовРасчета" Attribute="Предопределенный"/> - <Item ObjectType="ПланыВидовРасчета" Attribute="ПериодДействияБазовый"/> - - <Item ObjectType="Задачи" Attribute="Номер"/> - - <Item ObjectType="БизнесПроцессы" Attribute="Номер"/> - <Item ObjectType="БизнесПроцессы" Attribute="Дата"/> - - <Item ObjectType="ПланыОбмена" Attribute="Код"/> - <Item ObjectType="ПланыОбмена" Attribute="НомерОтправленного"/> - <Item ObjectType="ПланыОбмена" Attribute="НомерПринятого"/> - -</Items> diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ГрупповоеИзменениеРеквизитов.mdo b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ГрупповоеИзменениеРеквизитов.mdo index a23a76800..e32e81be3 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ГрупповоеИзменениеРеквизитов.mdo +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/ГрупповоеИзменениеРеквизитов.mdo @@ -224,14 +224,6 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> - <templates uuid="778e79ee-eb1a-4d52-8a31-58e781c78fe4"> - <name>ФильтрРеквизитов</name> - <synonym> - <key>ru</key> - <value>Фильтр реквизитов</value> - </synonym> - <templateType>TextDocument</templateType> - </templates> <commands uuid="90385850-d37b-4b2e-ac87-95c17f32197c"> <name>ГрупповоеИзменениеРеквизитов</name> <synonym> diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl index d5719ad93..ba0fee8c4 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/Событие/Module.bsl @@ -61,7 +61,7 @@ Если Событие = "_$Access$_.Access" Тогда Элементы.ПредставленияДанных.ТекущаяСтраница = Элементы.ДанныеДоступа; Элементы.ДанныеДоступа.Видимость = Истина; - ДанныеСобытия = ДанныеСобытий[Параметры.АдресДанных]; + ДанныеСобытия = ДанныеСобытий[Параметры.АдресДанных]; // Структура Если ДанныеСобытия <> Неопределено Тогда СоздатьТаблицуФормы("ТаблицаДанныхДоступа", "ТаблицаДанных", ДанныеСобытия.Данные); КонецЕсли; @@ -69,7 +69,7 @@ Элементы.Комментарий.Высота = 1; ИначеЕсли Событие = "_$Access$_.AccessDenied" Тогда - ДанныеСобытия = ДанныеСобытий[Параметры.АдресДанных]; + ДанныеСобытия = ДанныеСобытий[Параметры.АдресДанных]; // Структура Если ДанныеСобытия <> Неопределено Тогда Если ДанныеСобытия.Свойство("Право") Тогда diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form index 311a60d2e..a390d9e08 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form @@ -1899,6 +1899,37 @@ <orientation>Vertical</orientation> </extInfo> </items> + <items xsi:type="form:Decoration"> + <name>ОтступСопоставление</name> + <id>684</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ОтступСопоставлениеРасширеннаяПодсказка</name> + <id>686</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ОтступСопоставлениеКонтекстноеМеню</name> + <id>685</id> + <autoFill>true</autoFill> + </contextMenu> + <type>Label</type> + <width>2</width> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </items> <items xsi:type="form:FormField"> <name>СоздаватьЕслиНеСопоставлено</name> <id>423</id> @@ -1914,6 +1945,7 @@ <dataPath xsi:type="form:DataPath"> <segments>СоздаватьЕслиНеСопоставлено</segments> </dataPath> + <shortcut>F5</shortcut> <extendedTooltip> <name>СоздаватьЕслиНеСопоставленоРасширеннаяПодсказка</name> <id>425</id> @@ -1997,6 +2029,7 @@ <key>ru</key> <value>Итого не сопоставленных</value> + false ГруппаИтогоНеСопоставленныхРасширеннаяПодсказка 422 diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl index f3d0c8b3d..3dd62056b 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl @@ -697,7 +697,7 @@ &НаСервере Процедура УстановитьВидимостьЭлементовФормы() - ЭтотОбъект.Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), НСтр("ru = 'Загрузка данных в справочник'"), Параметры.Заголовок); + Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), НСтр("ru = 'Загрузка данных в справочник'"), Параметры.Заголовок); Если ОбщегоНазначения.ЭтоВебКлиент() Тогда Элементы.СтраницаВариантЗаполнениеТаблицы.Видимость = Ложь; @@ -805,18 +805,29 @@ КонецЕсли; ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию("РежимЗапуска.ЗагрузкаВСправочник." + ИмяОбъектаСопоставления,, ТипЗагрузки); - Если ТипЗнч(ОписаниеСтрокиВыбора) = Тип("Структура") И ОписаниеСтрокиВыбора.Свойство("Представление") Тогда - ЭтотОбъект.Заголовок = НСтр("ru = 'Загрузка данных в справочник'") + " """ +ОписаниеСтрокиВыбора.Представление + """"; - Иначе - ЭтотОбъект.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка данных в справочник ""%1""'"), ПредставлениеСправочника(ИмяОбъектаСопоставления)); - КонецЕсли; - СформироватьМакетПоТипуЗагрузки(); СоздатьТаблицуСопоставленияПоИнформацииОКолонках(); ПоказатьИнформационнуюСтрокуПроОбязательныеКолонки(); + Если ТипЗнч(ОписаниеСтрокиВыбора) = Тип("Структура") И ОписаниеСтрокиВыбора.Свойство("Представление") Тогда + ЗаголовокОкна = ОписаниеСтрокиВыбора.Представление; + Иначе + ЗаголовокОкна = ПараметрыЗагрузкиНаФорме().Заголовок; + КонецЕсли; + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка данных в справочник ""%1""'"), ЗаголовокОкна); + КонецПроцедуры +// Возвращает параметры загрузки, которые хранятся в реквизите формы. +// +// Возвращаемое значение: +// см. ЗагрузкаДанныхИзФайла.ПараметрыЗагрузкиИзФайла +// +&НаСервере +Функция ПараметрыЗагрузкиНаФорме() + Возврат ПараметрыЗагрузки; +КонецФункции + &НаСервере Процедура СформироватьМакетПоТипуЗагрузки() @@ -883,9 +894,9 @@ ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам"); Если ТипЗагрузки = "ТабличнаяЧасть" Тогда - АдресЗагруженныхДанных = ""; + АдресЗагруженныхДанных = ""; АдресКопииТабличнойЧасти = ""; - СписокНеоднозначностей = СоздатьТаблицуСоСпискомНеоднозначностей(); + СписокНеоднозначностей = ЗагрузкаДанныхИзФайла.НовыйСписокНеоднозначностей(); Обработки.ЗагрузкаДанныхИзФайла.ТабличныйДокументВТаблицуЗначений(ШаблонСДанными, ТаблицаИнформацияПоКолонкам, АдресЗагруженныхДанных); @@ -908,15 +919,6 @@ КонецПроцедуры -&НаСервере -Функция СоздатьТаблицуСоСпискомНеоднозначностей() - СписокНеоднозначностей = Новый ТаблицаЗначений; - СписокНеоднозначностей.Колонки.Добавить("Идентификатор"); - СписокНеоднозначностей.Колонки.Добавить("Колонка"); - - Возврат СписокНеоднозначностей; -КонецФункции - &НаСервере Процедура ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеСопоставленияНаСервере(АдресРезультата) @@ -924,14 +926,24 @@ Если ТипЗагрузки = "ПрикладнаяЗагрузка" Тогда СопоставитьДанныеПрикладнаяЗагрузка(ТаблицаСопоставления); - Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок = СтрЗаменить(Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок, "%1", - ПредставлениеСправочника(ИмяОбъектаСопоставления)); ИначеЕсли ТипЗагрузки = "ВнешняяЗагрузка" Тогда СопоставитьДанныеВнешняяОбработка(ТаблицаСопоставления); КонецЕсли; - Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок = СтрЗаменить(Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок, "%1", - ПредставлениеСправочника(ИмяОбъектаСопоставления)); + Отбор = Новый Структура("РезультатСопоставленияСтроки", "СтрокаСопоставлена"); + Результат = ТаблицаСопоставления.НайтиСтроки(Отбор); + + Если Результат.Количество() = ТаблицаСопоставления.Количество() Тогда + Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Данные сопоставлены. При необходимости возможно сопоставить данные вручную, заполнив колонку ""%1"".'"), + ПараметрыЗагрузки.ПредставлениеОбъекта); + ФильтрТаблицаСопоставления = Элементы.ФильтрТаблицаСопоставления.СписокВыбора.НайтиПоЗначению(""); + Иначе + Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок, ПараметрыЗагрузки.ПредставлениеОбъекта); + КонецЕсли; + + Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок = Пояснение; ЗначениеВРеквизитФормы(ТаблицаСопоставления, "ТаблицаСопоставленияДанных"); @@ -1039,12 +1051,12 @@ ДоступностьКнопокКомандойПанели(Ложь); - ИмяОбъекта = ПредставлениеСправочника(ИмяОбъектаСопоставления); + ПредставлениеОбъекта = ПараметрыЗагрузки.ПредставлениеОбъекта; Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Заголовок, - ИмяОбъекта); + ПредставлениеОбъекта); Элементы.ПояснениеОтчетаОЗагрузке.Заголовок = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ПояснениеОтчетаОЗагрузке.Заголовок, ИмяОбъекта); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ПояснениеОтчетаОЗагрузке.Заголовок, ПредставлениеОбъекта); Если ТипЗагрузки <> "УниверсальнаяЗагрузка" Тогда СсылкиНаОбъектыОповещения = Новый Массив; @@ -1377,43 +1389,53 @@ ТаблицаИнформацияПоКолонкам = ИнформацияПоКолонкам(); ТаблицаИнформацияПоКолонкам.Очистить(); - Индекс = 1; + Для каждого Колонка Из КолонкиМакета Цикл Если Колонка.Позиция <> Неопределено Тогда Строка = ТаблицаИнформацияПоКолонкам.Добавить(); Строка.ИмяКолонки = Колонка.Имя; Строка.Ширина = ?(ЗначениеЗаполнено(Колонка.Ширина), Колонка.Ширина, 20); Строка.Примечание = Колонка.Подсказка; - Если Колонка.Позиция = 0 Тогда - Строка.Позиция = Индекс; - Индекс = Индекс + 1; - Иначе - Строка.Позиция = Колонка.Позиция; - Индекс = Колонка.Позиция + 1; - КонецЕсли; - ЗаполнитьЗначенияСвойств(Строка, Колонка); + ЗаполнитьЗначенияСвойств(Строка, Колонка,, "Ширина"); Строка.Видимость = Истина; Строка.ПредставлениеКолонки = Колонка.Заголовок; Строка.ТипКолонки = Колонка.Тип; КонецЕсли; КонецЦикла; + + КорректировкаПозицийКолонок(ТаблицаИнформацияПоКолонкам); + +КонецПроцедуры + +&НаСервере +Процедура КорректировкаПозицийКолонок(ТаблицаИнформацияПоКолонкам) + + ТаблицаИнформацияПоКолонкам.Сортировать("Позиция"); + Позиция = 1; + + Для Каждого ИнформацияОКолонке Из ТаблицаИнформацияПоКолонкам Цикл + + ИнформацияОКолонке.Позиция = Позиция; + Позиция = Позиция + 1; + + КонецЦикла; КонецПроцедуры // Возвращаемое значение: -// ТаблицаЗначений: -// ИмяКолонки - Строка -// ПредставлениеКолонки - Строка -// ТипКолонки - Произвольный -// ОбязательнаДляЗаполнения - Булево -// Позиция - Число -// Группа - Строка -// Родитель - Строка -// Видимость - Булево -// Примечание - Строка -// Ширина - Число -// Синоним - Строка -// +// ТаблицаЗначений: +// * ИмяКолонки - Строка +// * ПредставлениеКолонки - Строка +// * ТипКолонки - Произвольный +// * ОбязательнаДляЗаполнения - Булево +// * Позиция - Число +// * Группа - Строка +// * Родитель - Строка +// * Видимость - Булево +// * Примечание - Строка +// * Ширина - Число +// * Синоним - Строка +// &НаСервере Функция ИнформацияПоКолонкам() @@ -1558,10 +1580,10 @@ &НаСервере Функция УсловияПоВыбраннымКолонкам(ИмяСправочника) - РазделительИ = ""; - ТипСравнения = " = "; - сГде = ""; - СтрокаУсловие = ""; + РазделительИ = ""; + ТипСравнения = " = "; + ОтборГде = ""; + СтрокаУсловие = ""; ТабличнаяЧасть = ""; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда @@ -1587,7 +1609,7 @@ Если НайденныеВиды <> Неопределено Тогда СтрокаУсловие = СтрокаУсловие + " И СправочникСопоставления.Вид.Наименование = """ + НайденныеВиды.Ссылка.Наименование + """"; КонецЕсли; - сГДЕ = сГДЕ + " И СправочникСопоставления.Представление <> """""; + ОтборГде = ОтборГде + " И СправочникСопоставления.Представление <> """""; РазделительИ = " И "; Продолжить; @@ -1603,7 +1625,7 @@ ОбъектаТипаКолонки = Метаданные.НайтиПоТипу(ТипКолонки); Если ОбъектаТипаКолонки <> Неопределено Тогда - сГДЕ = сГДЕ + " И СправочникСопоставления.Значение <> ЗНАЧЕНИЕ(" + ОбъектаТипаКолонки.ПолноеИмя() + ".ПустаяСсылка)"; + ОтборГде = ОтборГде + " И СправочникСопоставления.Значение <> ЗНАЧЕНИЕ(" + ОбъектаТипаКолонки.ПолноеИмя() + ".ПустаяСсылка)"; КонецЕсли; РазделительИ = " И "; Продолжить; @@ -1616,11 +1638,11 @@ Если Колонка.ТипКолонки.КвалификаторыСтроки.Длина = 0 Тогда СтрокаУсловие = СтрокаУсловие + РазделительИ + "ВЫРАЗИТЬ(СправочникСопоставления." + ИмяКолонкиСправочника + " КАК Строка(500)) = ВЫРАЗИТЬ(ТаблицаСопоставления." + Колонка.ИмяКолонки + " КАК Строка(500))"; - сГДЕ = сГДЕ + " И СправочникСопоставления." + ИмяКолонкиСправочника + " <> """""; + ОтборГде = ОтборГде + " И СправочникСопоставления." + ИмяКолонкиСправочника + " <> """""; Иначе СтрокаУсловие = СтрокаУсловие + РазделительИ + "СправочникСопоставления." + ИмяКолонкиСправочника + " = ТаблицаСопоставления." + Колонка.ИмяКолонки; - сГДЕ = сГДЕ + " И СправочникСопоставления." + ИмяКолонкиСправочника + " <> """""; + ОтборГде = ОтборГде + РазделительИ + " СправочникСопоставления." + ИмяКолонкиСправочника + " <> """""; КонецЕсли; ИначеЕсли ТипКолонки = Тип("Число") Тогда СтрокаУсловие = СтрокаУсловие + РазделительИ + "СправочникСопоставления." + ИмяКолонкиСправочника + " = ТаблицаСопоставления." + Колонка.ИмяКолонки; @@ -1658,7 +1680,7 @@ Условия = Новый Структура("УсловиеОбъединения , Где, ТабличнаяЧасть"); Условия.УсловиеОбъединения = СтрокаУсловие; - Условия.Где = сГДЕ; + Условия.Где = ОтборГде; Условия.ТабличнаяЧасть = ТабличнаяЧасть; Возврат Условия; @@ -1871,11 +1893,6 @@ Возврат ПоместитьВоВременноеХранилище(ТаблицаДляТЧ); КонецФункции -&НаСервереБезКонтекста -Функция ПредставлениеСправочника(ПолноеИмяОбъектаМетаданных) - Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных).Представление(); -КонецФункции - &НаСервереБезКонтекста Функция МенеджерОбъекта(ИмяОбъектаСопоставления) МассивОбъекта = Обработки.ЗагрузкаДанныхИзФайла.РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления); @@ -1979,9 +1996,11 @@ КонецЕсли; Отказ = Ложь; - ПараметрыЗагрузки = Новый Структура(); - ПараметрыЗагрузки.Вставить("СоздаватьНовые", СоздаватьЕслиНеСопоставлено); - ПараметрыЗагрузки.Вставить("ОбновлятьСуществующие", ОбновлятьСуществующие); + + ПараметрыЗагрузки= ЗагрузкаДанныхИзФайла.НастройкиЗагрузкиДанных(); + ПараметрыЗагрузки.СоздаватьНовые = СоздаватьЕслиНеСопоставлено; + ПараметрыЗагрузки.ОбновлятьСуществующие = ОбновлятьСуществующие; + ВнешнийОбъект.ЗагрузитьИзФайла(ИдентификаторКоманды, СопоставленныеДанные, ПараметрыЗагрузки, Отказ); КонецПроцедуры @@ -1996,9 +2015,11 @@ МенеджерОбъекта = МенеджерОбъекта(ИмяОбъектаСопоставления); Отказ = Ложь; - ПараметрыЗагрузки = Новый Структура(); - ПараметрыЗагрузки.Вставить("СоздаватьНовые", СоздаватьЕслиНеСопоставлено); - ПараметрыЗагрузки.Вставить("ОбновлятьСуществующие", ОбновлятьСуществующие); + + ПараметрыЗагрузки= ЗагрузкаДанныхИзФайла.НастройкиЗагрузкиДанных(); + ПараметрыЗагрузки.СоздаватьНовые = СоздаватьЕслиНеСопоставлено; + ПараметрыЗагрузки.ОбновлятьСуществующие = ОбновлятьСуществующие; + МенеджерОбъекта.ЗагрузитьИзФайла(СопоставленныеДанные, ПараметрыЗагрузки, Отказ) КонецПроцедуры @@ -2035,10 +2056,12 @@ // &НаСервере Функция ОписаниеТабличнойЧасти() - Перем ДанныеДляТабличнойЧасти; + ДанныеДляТабличнойЧасти = Новый ТаблицаЗначений; ДанныеДляТабличнойЧасти.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Число"), "Идентификатор"); - Возврат ДанныеДляТабличнойЧасти + + Возврат ДанныеДляТабличнойЧасти; + КонецФункции #КонецОбласти @@ -2106,6 +2129,7 @@ Если ДобавитьИдентификатор Тогда ВременнаяТЗ.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Число"), НСтр("ru = 'п/п'")); КонецЕсли; + Если ЗначениеЗаполнено(СтруктураОбъектаСопоставления) Тогда Если Не ЗначениеЗаполнено(СтруктураОбъектаСопоставления.Синоним) Тогда ЗаголовокКолонки = ""; @@ -2120,6 +2144,7 @@ КонецЕсли; ВременнаяТЗ.Колонки.Добавить("ОбъектСопоставления", СтруктураОбъектаСопоставления.ОписаниеТипаОбъектаСопоставления, ЗаголовокКолонки); КонецЕсли; + Если ДобавитьРезультатСопоставленияСтроки Тогда ВременнаяТЗ.Колонки.Добавить("РезультатСопоставленияСтроки", Новый ОписаниеТипов("Строка"), НСтр("ru = 'Результат'")); КонецЕсли; @@ -2131,10 +2156,11 @@ ТипСЗ = Новый ОписаниеТипов("СписокЗначений"); ВременнаяТЗ.Колонки.Добавить("СписокНеоднозначностей", ТипСЗ, "СписокНеоднозначностей"); КонецЕсли; + КонецПроцедуры &НаСервере -Процедура ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, СтруктураОбъектаСопоставления , ДобавитьИдентификатор, +Процедура ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, ОписаниеТипаОбъектаСопоставления , ДобавитьИдентификатор, ДобавитьОписаниеОшибки, ДобавитьРезультатСопоставленияСтроки, ДобавитьСписокНеоднозначностей) ТипСтрока = Новый ОписаниеТипов("Строка"); @@ -2142,8 +2168,9 @@ ТипЧисло = Новый ОписаниеТипов("Число"); МассивРеквизитов.Добавить(Новый РеквизитФормы("Идентификатор", ТипЧисло, "ТаблицаСопоставленияДанных", "Идентификатор")); КонецЕсли; - Если ЗначениеЗаполнено(СтруктураОбъектаСопоставления) Тогда - МассивРеквизитов.Добавить(Новый РеквизитФормы("ОбъектСопоставления", СтруктураОбъектаСопоставления.ОписаниеТипаОбъектаСопоставления, "ТаблицаСопоставленияДанных", ИмяОбъектаСопоставления)); + + Если ЗначениеЗаполнено(ОписаниеТипаОбъектаСопоставления) Тогда + МассивРеквизитов.Добавить(Новый РеквизитФормы("ОбъектСопоставления", ОписаниеТипаОбъектаСопоставления, "ТаблицаСопоставленияДанных", ИмяОбъектаСопоставления)); КонецЕсли; Если ДобавитьРезультатСопоставленияСтроки Тогда @@ -2168,9 +2195,11 @@ ВременнаяТЗ = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных"); ВременнаяТЗ.Колонки.Очистить(); - СтруктураОбъектаСопоставления = Новый Структура("ОписаниеТипаОбъектаСопоставления, Синоним", ОписаниеТипаОбъектаСопоставления, ""); + СтруктураОбъектаСопоставления = ОписаниеОбъектаСопоставления(); + СтруктураОбъектаСопоставления.ОписаниеТипаОбъектаСопоставления = ОписаниеТипаОбъектаСопоставления; + ДобавитьСтандартныеКолонкиВТаблицуСопоставления(ВременнаяТЗ, СтруктураОбъектаСопоставления, Истина, Ложь, Истина, Истина); - ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, СтруктураОбъектаСопоставления, Истина, Ложь, Истина, Истина); + ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, ОписаниеТипаОбъектаСопоставления, Истина, Ложь, Истина, Истина); Для каждого Колонка Из ИнформацияПоКолонкам Цикл ВременнаяТЗ.Колонки.Добавить(Колонка.ИмяКолонки, Колонка.ТипКолонки, Колонка.ПредставлениеКолонки); @@ -2181,6 +2210,7 @@ ЗначениеВРеквизитФормы(ВременнаяТЗ, "ТаблицаСопоставленияДанных"); + Картинка = БиблиотекаКартинок.Изменить; Для Каждого Колонка Из ВременнаяТЗ.Колонки Цикл НовыйЭлемент = Элементы.Добавить("ТаблицаСопоставленияДанных_" + Колонка.Имя, Тип("ПолеФормы"), Элементы.ТаблицаСопоставленияДанных); // РасширениеПоляФормыДляПоляВвода НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; @@ -2196,7 +2226,7 @@ Если Колонка.Имя = "ОбъектСопоставления" Тогда НовыйЭлемент.ФиксацияВТаблице = ФиксацияВТаблице.Лево; НовыйЭлемент.ЦветФона = ЦветаСтиля.ФонУправляющегоПоля; - НовыйЭлемент.КартинкаШапки = БиблиотекаКартинок.Изменить; + НовыйЭлемент.КартинкаШапки = Картинка; НовыйЭлемент.ТолькоПросмотр = Ложь; НовыйЭлемент.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; @@ -2216,6 +2246,22 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * ОписаниеТипаОбъектаСопоставления - Строка +// * Синоним - Строка +// +&НаСервереБезКонтекста +Функция ОписаниеОбъектаСопоставления() + + СтруктураОбъектаСопоставления = Новый Структура; + СтруктураОбъектаСопоставления.Вставить("ОписаниеТипаОбъектаСопоставления", ""); + СтруктураОбъектаСопоставления.Вставить("Синоним", ""); + + Возврат СтруктураОбъектаСопоставления; + +КонецФункции + &НаСервере Процедура СоздатьТаблицуСопоставленияПоИнформацииОКолонках() @@ -2227,10 +2273,11 @@ ВременнаяТЗ = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных"); ВременнаяТЗ.Колонки.Очистить(); - Синоним = ОбъектМетаданных.Синоним; - СтруктураОбъектаСопоставления = Новый Структура("ОписаниеТипаОбъектаСопоставления, Синоним", ОписаниеТипаОбъектаСопоставления, Синоним); - ДобавитьСтандартныеКолонкиВТаблицуСопоставления(ВременнаяТЗ, СтруктураОбъектаСопоставления, Истина, Истина, Истина, Истина); - ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, СтруктураОбъектаСопоставления, Истина, Истина, Истина, Истина); + Синоним = ?(ЗначениеЗаполнено(ПараметрыЗагрузки.ПредставлениеОбъекта), + ПараметрыЗагрузки.ПредставлениеОбъекта, ОбъектМетаданных.Представление()); + + ВременнаяТЗ = ЗагрузкаДанныхИзФайла.ОписаниеЗагружаемыхДанныхДляСправочников(ВременнаяТЗ, ОписаниеТипаОбъектаСопоставления, Синоним); + ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, ОписаниеТипаОбъектаСопоставления, Истина, Истина, Истина, Истина); Для каждого Колонка Из ИнформацияПоКолонкам Цикл Если ВременнаяТЗ.Колонки.Найти(Колонка.ИмяКолонки) = Неопределено Тогда @@ -2242,6 +2289,7 @@ ИзменитьРеквизиты(МассивРеквизитов); + Картинка = БиблиотекаКартинок.Изменить; Для Каждого Колонка Из ВременнаяТЗ.Колонки Цикл НовыйЭлемент = Элементы.Добавить("ТаблицаСопоставленияДанных_" + Колонка.Имя, Тип("ПолеФормы"), Элементы.ТаблицаСопоставленияДанных); // РасширениеПоляФормыДляПоляВвода НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; @@ -2256,7 +2304,7 @@ Если Колонка.Имя = "ОбъектСопоставления" Тогда НовыйЭлемент.ФиксацияВТаблице = ФиксацияВТаблице.Лево; НовыйЭлемент.ЦветФона = ЦветаСтиля.ФонУправляющегоПоля; - НовыйЭлемент.КартинкаШапки = БиблиотекаКартинок.Изменить; + НовыйЭлемент.КартинкаШапки = Картинка; НовыйЭлемент.ТолькоПросмотр = Ложь; НовыйЭлемент.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; НовыйЭлемент.РежимВыбораНезаполненного = РежимВыбораНезаполненного.ПриАктивизации; @@ -2290,7 +2338,7 @@ ДобавитьСтандартныеКолонкиВТаблицуСопоставления(ВременнаяТЗ, Неопределено, Истина, Истина, Истина, Ложь); ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, Неопределено, Истина, Истина, Истина, Ложь); - + ОбязательныеКолонки = Новый Массив; КолонкиСодержащиеСвязиПараметровВыбора = Новый Соответствие; ОбъектРеквизитыТЧ = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаСопоставления); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент @@ -2327,6 +2375,7 @@ ГруппаКолонокЗагружаемыеДанные = Элементы.Добавить("ЗагружаемыеДанные", Тип("ГруппаФормы"), Элементы.ТаблицаСопоставленияДанных); ГруппаКолонокЗагружаемыеДанные.Группировка = ГруппировкаКолонок.Горизонтальная; + Картинка = БиблиотекаКартинок.Изменить; Для Каждого Колонка Из ВременнаяТЗ.Колонки Цикл @@ -2370,7 +2419,7 @@ Если СтрНачинаетсяС(Колонка.Имя, "ТЧ_") Тогда ТипКолонки = Метаданные.НайтиПоТипу(Колонка.ТипЗначения.Типы()[0]); Если ТипКолонки <> Неопределено И СтрНайти(ТипКолонки.ПолноеИмя(), "Справочник") > 0 Тогда - НовыйЭлемент.КартинкаШапки = БиблиотекаКартинок.Изменить; + НовыйЭлемент.КартинкаШапки = Картинка; КонецЕсли; КолонкаСвязьПараметровВыбора = КолонкиСодержащиеСвязиПараметровВыбора.Получить(Сред(Колонка.Имя, 4)); diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl index 5f4cb4bd9..49bbf9c68 100644 --- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl @@ -15,9 +15,7 @@ // Параметры: // ИмяКоманды - Строка - имя команды (Идентификатор). // СсылкаНаОбработку - ЛюбаяСсылка - ссылка на обработку. -// ПараметрыЗагрузки - Структура -// Возвращаемое значение -// Структура - содержит структуру со свойствами: +// ПараметрыЗагрузки - Структура: // * Представление - Строка - представление в списке вариантов загрузки. // * ИмяМакетаСШаблоном - Строка - название макета со структурой данных(необязательный // параметр, значение по умолчанию - "ЗагрузкаДанныхИзФайла"). @@ -112,14 +110,34 @@ КонецЕсли; СписокСправочниковДляЗагрузки.Очистить(); - Для каждого строка Из ИнформацияОСправочниках Цикл - СписокСправочниковДляЗагрузки.Добавить(Строка.ИнформацияОТипеЗагрузки, Строка.Представление); + Для каждого ИнформацияОСправочнике Из ИнформацияОСправочниках Цикл + + Если ИнформацияОСправочнике.ПрикладнаяЗагрузка Тогда + Представление = ПредставлениеСправочника(ИнформацияОСправочнике.ПолноеИмя); + Если ПустаяСтрока(Представление) Тогда + Представление = ИнформацияОСправочнике.Представление; + КонецЕсли; + Иначе + Представление = ИнформацияОСправочнике.Представление; + КонецЕсли; + + СписокСправочниковДляЗагрузки.Добавить(ИнформацияОСправочнике.ИнформацияОТипеЗагрузки, Представление); + КонецЦикла; СписокСправочниковДляЗагрузки.СортироватьПоПредставлению(); КонецПроцедуры +Функция ПредставлениеСправочника(ИмяОбъектаСопоставления) + + ПараметрыЗагрузкиПоУмолчанию = ЗагрузкаДанныхИзФайла.ПараметрыЗагрузкиИзФайла(ИмяОбъектаСопоставления); + МенеджерОбъекта(ИмяОбъектаСопоставления).ОпределитьПараметрыЗагрузкиДанныхИзФайла(ПараметрыЗагрузкиПоУмолчанию); + + Возврат ПараметрыЗагрузкиПоУмолчанию.Заголовок; + +КонецФункции + Функция СправочникСодержитРеквизитИсключение(Справочник) Для каждого Реквизит Из Справочник.ТабличныеЧасти Цикл @@ -351,11 +369,11 @@ | &ИмяТаблицы КАК ТаблицаДанных |ГДЕ | &Условия"; - ТекстШаблон = СтрЗаменить(ТекстШаблон, "&Условия", ТекстГде); - ТекстШаблон = СтрЗаменить(ТекстШаблон, "&ИмяТаблицы", ТипОбъекта + "." + ИмяОбъекта); + ТекстШаблон = СтрЗаменить(ТекстШаблон, "&Условия", ТекстГде); + ТекстШаблон = СтрЗаменить(ТекстШаблон, "&ИмяТаблицы", ТипОбъекта + "." + ИмяОбъекта); Если Не ПустаяСтрока(ТекстЗапроса) Тогда - ТекстШаблон = СтрЗаменить(ТекстШаблон, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; + ТекстШаблон = СтрЗаменить(ТекстШаблон, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1, @query-part-2 + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; // @query-part-1 КонецЕсли; ТекстЗапроса = ТекстЗапроса + ТекстШаблон; КонецЕсли; @@ -745,6 +763,22 @@ Если ИнформацияПоКолонкам.Количество() = 0 Тогда ОпределитьИнформацияПоКолонкамТабличнаяЧасть(ИнформацияПоКолонкам, Макет, ОбластьЗаголовокТаблицы, ПараметрыЗагрузки); Иначе + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПараметрыЗагрузки.ПолноеИмяОбъекта); + + Если ОбъектМетаданных = Неопределено Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка данных из файла в табличную часть не поддерживается для объекта с типом: %1'"), + ПараметрыЗагрузки.ПолноеИмяОбъекта); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Если ОбъектМетаданных.Родитель().Макеты.Найти(ПараметрыЗагрузки.Макет) = Неопределено Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка данных из файла в табличную часть не поддерживается, т.к. отсутствует макет %1 у объекта с типом: %2'"), + ПараметрыЗагрузки.Макет, ПараметрыЗагрузки.ПолноеИмяОбъекта); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Макет = МенеджерОбъекта(ПараметрыЗагрузки.ПолноеИмяОбъекта).ПолучитьМакет(ПараметрыЗагрузки.Макет); ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(Макет); КонецЕсли; @@ -874,6 +908,8 @@ ИспользуетсяГруппировка = Ложь; КонецЕсли; + ПредопределенныеОбластиМакета = ПредопределенныеОбластиМакета(); + Для НомерКолонки = 1 По ОбластьЗаголовокТаблицы.ШиринаТаблицы Цикл Ячейка = ОбластьЗаголовокТаблицы.ПолучитьОбласть(ВысотаШапки, НомерКолонки, ВысотаШапки, НомерКолонки).ТекущаяОбласть; @@ -887,13 +923,13 @@ Родитель = ?(ЗначениеЗаполнено(Ячейка.ПараметрРасшифровки), Ячейка.ПараметрРасшифровки, Ячейка.Имя); КонецЕсли; - Если ПредставлениеРеквизита = НСтр("ru = '<Дополнительные реквизиты>'") Тогда + Если СтрСравнить(ПредставлениеРеквизита, ПредопределенныеОбластиМакета.ДополнительныеРеквизиты) = 0 Тогда МетаданныеСправочника = Метаданные.НайтиПоПолномуИмени(ПараметрыЗагрузкиИзФайла.ПолноеИмяОбъекта); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам); КонецЕсли; - ИначеЕсли ПредставлениеРеквизита = НСтр("ru = '<Контактная информация>'") Тогда + ИначеЕсли СтрСравнить(ПредставлениеРеквизита, ПредопределенныеОбластиМакета.КонтактнаяИнформация) = 0 Тогда МетаданныеСправочника = Метаданные.НайтиПоПолномуИмени(ПараметрыЗагрузкиИзФайла.ПолноеИмяОбъекта); Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); @@ -944,6 +980,21 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * ДополнительныеРеквизиты - Строка +// * КонтактнаяИнформация - Строка +// +Функция ПредопределенныеОбластиМакета() + + ПредопределенныеОбластиМакета = Новый Структура(); + ПредопределенныеОбластиМакета.Вставить("ДополнительныеРеквизиты", НСтр("ru = '<Дополнительные реквизиты>'")); + ПредопределенныеОбластиМакета.Вставить("КонтактнаяИнформация", НСтр("ru = '<Контактная информация>'")); + + Возврат ПредопределенныеОбластиМакета + +КонецФункции + Функция ШиринаКолонкиПоТипу(Тип) ШиринаКолонки = 20; @@ -1273,7 +1324,10 @@ // Возвращает имя объекта в виде структуры. // // Параметры: -// ПолноеИмяОбъекта - Структура: +// ПолноеИмяОбъекта - Строка +// +// Возвращаемое значение: +// Структура: // * ТипОбъекта - Строка - тип объекта. // * НазваниеОбъекта - Строка - название объекта. // * ИмяТабличнойЧасти - Строка - имя табличной части. diff --git a/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ЗагрузкаКлассификатораБанков.mdo b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ЗагрузкаКлассификатораБанков.mdo index c4b28ea41..dbfa2227b 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ЗагрузкаКлассификатораБанков.mdo +++ b/SSL/src/DataProcessors/ЗагрузкаКлассификатораБанков/ЗагрузкаКлассификатораБанков.mdo @@ -25,7 +25,7 @@ ru Загрузка Справочника БИК - Открывает помощник загрузки справочника БИК + // АПК:58 ActionsPanelTools Auto diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl index 049ed3eb0..7ebbf1d10 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/ManagerModule.bsl @@ -105,8 +105,8 @@ // * НачалоПериода - Дата - начало периода загрузки; // * КонецПериода - Дата - конец периода загрузки; // * СписокВалют - ТаблицаЗначений: -// ** Валюта - СправочникСсылка.Валюты; -// ** КодВалюты - Строка. +// ** Валюта - СправочникСсылка.Валюты +// ** КодВалюты - Строка // АдресРезультата - Строка - адрес во временном хранилище для помещения результатов загрузки. // Процедура ЗагрузитьАктуальныйКурс(ПараметрыЗагрузки = Неопределено, АдресРезультата = Неопределено) Экспорт @@ -250,8 +250,8 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий -Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт - Зависимость = Зависимости.Добавить(); +Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт + Зависимость = Настройки.Добавить(); Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют; Зависимость.ДоступноВМоделиСервиса = Ложь; Зависимость.ДоступноВАвтономномРабочемМесте = Ложь; @@ -260,17 +260,17 @@ // Процедура для загрузки курсов валют по определенному периоду. // // Параметры: -// Валюты - любая коллекция - со следующими полями: -// КодВалюты - числовой код валюты. -// Валюта - ссылка на валюту. +// Валюты - Массив из Структура: +// * КодВалюты - Число - числовой код валюты. +// * Валюта - СправочникСсылка.Валюты // НачалоПериодаЗагрузки - Дата - начало периода загрузки курсов. // ОкончаниеПериодаЗагрузки - Дата - окончание периода загрузки курсов. // // Возвращаемое значение: -// Массив состояния загрузки - каждый элемент - структура с полями. -// Валюта - загружаемая валюта. -// СтатусОперации - завершилась ли загрузка успешно. -// Сообщение - пояснение о загрузке (текст сообщения об ошибке или поясняющее сообщение). +// Массив из Структура: +// Валюта - СправочникСсылка.Валюты - загружаемая валюта. +// СтатусОперации - Булево - завершилась ли загрузка успешно. +// Сообщение - Строка - текст сообщения об ошибке или поясняющее сообщение. // Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки, ПриЗагрузкеВозниклиОшибки = Ложь) @@ -519,9 +519,24 @@ Процедура ОтключитьЗагрузкуКурсаВалюты643ИзИнтернета(Параметры) Экспорт Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.Валюты"); Пока Выборка.Следующий() Цикл - Валюта = Выборка.Ссылка.ПолучитьОбъект(); - Валюта.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Валюта); + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.Валюты"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + Валюта = Выборка.Ссылка.ПолучитьОбъект(); + Валюта.СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РучнойВвод; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Валюта); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЦикла; Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.Валюты"); diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl index 43af75076..64365da5f 100644 --- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl +++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl @@ -348,21 +348,6 @@ //////////////////////////////////////////////////////////////////////////////// // Программный интерфейс мастера -// Инициализирует структуры мастера. -// В реквизит формы НастройкиПошаговогоМастера записывается следующее значение: -// Структура - Описание настроек мастера. -// Общедоступные настройки мастера: -// * Шаги - Массив - Описание шагов мастера. Только для чтения. -// Для добавления шагов следует использовать функцию ДобавитьШагМастера. -// * ТекущийШаг - Структура - Текущий шаг мастера. Только для чтения. -// * ПоказатьДиалогПередЗакрытием - Булево - Если Истина, то перед закрытием формы будет показано предупреждение. -// Для изменения. -// Служебные настройки мастера: -// * ГруппаСтраниц - Строка - Имя элемента формы, переданного в параметре ГруппаСтраниц. -// * КнопкаДалее - Строка - Имя элемента формы, переданного в параметре КнопкаДалее. -// * КнопкаНазад - Строка - Имя элемента формы, переданного в параметре КнопкаНазад. -// * КнопкаОтмена - Строка - Имя элемента формы, переданного в параметре КнопкаОтмена. -// &НаСервере Процедура ИнициализироватьНастройкиПошаговогоМастера() НастройкиМастера = Новый Структура; diff --git a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl index 907da3f1a..e288e6038 100644 --- a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/ManagerModule.bsl @@ -45,7 +45,7 @@ Функция ВерсияКалендарей() Экспорт - Возврат 26; + Возврат 27; КонецФункции @@ -57,7 +57,7 @@ Функция ВерсияОбновленияДанныхПроизводственныхКалендарей() Экспорт - Возврат "3.1.4.288"; + Возврат "3.1.5.104"; КонецФункции @@ -203,6 +203,11 @@ ДобавитьПраздничныйДень(ПраздничныеДни, 5, 4, НомерГода); КонецЕсли; + // 5 июля - День Республики Калмыкия. + Если НомерГода >= 2020 Тогда + ДобавитьПраздничныйДень(ПраздничныеДни, 5, 7, НомерГода); + КонецЕсли; + // 28 декабря - День памяти жертв депортации калмыцкого народа. ДобавитьПраздничныйДень(ПраздничныеДни, 28, 12, НомерГода, Ложь, Ложь, Истина); @@ -328,26 +333,6 @@ КонецПроцедуры -Процедура ЗаполнитьПраздничныеДниЗабайкальскогоКрая(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни) - - Если КодПроизводственногоКалендаря <> "75" Тогда - Возврат; - КонецЕсли; - - ДобавитьПраздникЦаганСар(ПраздничныеДни, НомерГода); - -КонецПроцедуры - -Процедура ЗаполнитьПраздничныеДниУстьОрдынскогоБурятскогоОкругаИркутскойОбласти(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни) - - Если КодПроизводственногоКалендаря <> "85" Тогда - Возврат; - КонецЕсли; - - ДобавитьПраздникЦаганСар(ПраздничныеДни, НомерГода); - -КонецПроцедуры - Процедура ЗаполнитьПраздничныеДниПензенскойОбласти(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни) Если КодПроизводственногоКалендаря <> "58" Тогда @@ -368,6 +353,26 @@ КонецПроцедуры +Процедура ЗаполнитьПраздничныеДниЗабайкальскогоКрая(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни) + + Если КодПроизводственногоКалендаря <> "75" Тогда + Возврат; + КонецЕсли; + + ДобавитьПраздникЦаганСар(ПраздничныеДни, НомерГода); + +КонецПроцедуры + +Процедура ЗаполнитьПраздничныеДниУстьОрдынскогоБурятскогоОкругаИркутскойОбласти(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни) + + Если КодПроизводственногоКалендаря <> "85" Тогда + Возврат; + КонецЕсли; + + ДобавитьПраздникЦаганСар(ПраздничныеДни, НомерГода); + +КонецПроцедуры + Процедура ЗаполнитьПраздничныеДниРеспубликиКрым(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни) Если КодПроизводственногоКалендаря <> "91" Тогда @@ -479,12 +484,12 @@ Функция ДатаПраздникаРадоница(НомерГода) ТекстовыйДокумент = ПолучитьМакет("ДатыРадоница"); - ДатыЦаганСар = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ТекстовыйДокумент.ПолучитьТекст()).Данные; + ДатыРадоницы = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ТекстовыйДокумент.ПолучитьТекст()).Данные; ОтборСтрок = Новый Структура("Year"); ОтборСтрок.Year = Формат(НомерГода, "ЧГ="); - НайденныеСтроки = ДатыЦаганСар.НайтиСтроки(ОтборСтрок); + НайденныеСтроки = ДатыРадоницы.НайтиСтроки(ОтборСтрок); Если НайденныеСтроки.Количество() > 0 Тогда Возврат Дата(НайденныеСтроки[0]["Date"]); КонецЕсли; @@ -498,14 +503,14 @@ // * Номер - Число // * Период - СтандартныйПериод // * Основание - Произвольный -// * Даты - Массив +// * Даты - Массив из Дата // * Представление - Строка // Функция ОписаниеПериодаНерабочихДней(Начало, Окончание, Основание = "", Номер = 0) ОбщегоНазначенияКлиентСервер.Проверить(Начало <= Окончание, НСтр("ru = 'Начало периода позже его завершения'")); - ОписаниеПериода = Новый Структура("Номер, Период, Основание, Даты, Представление"); + ОписаниеПериода = Новый Структура("Номер, Период, Основание, Даты, Представление"); // см. ОписаниеПериодаНерабочихДней ОписаниеПериода.Номер = Номер; ОписаниеПериода.Период = Новый СтандартныйПериод(Начало, Окончание); ОписаниеПериода.Основание = Основание; diff --git a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ДанныеПроизводственныхКалендарей/Template.txt b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ДанныеПроизводственныхКалендарей/Template.txt index 56feec880..995d7f10f 100644 --- a/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ДанныеПроизводственныхКалендарей/Template.txt +++ b/SSL/src/DataProcessors/ЗаполнениеКалендарныхГрафиков/Templates/ДанныеПроизводственныхКалендарей/Template.txt @@ -27,6 +27,8 @@ + + @@ -74,6 +76,8 @@ + + @@ -85,6 +89,8 @@ + + @@ -150,6 +156,10 @@ + + + + @@ -223,6 +233,10 @@ + + + + @@ -277,6 +291,11 @@ + + + + + @@ -312,6 +331,8 @@ + + @@ -322,6 +343,7 @@ + @@ -345,6 +367,10 @@ + + + + @@ -387,6 +413,9 @@ + + + @@ -438,6 +467,11 @@ + + + + + @@ -509,6 +543,11 @@ + + + + + @@ -521,6 +560,8 @@ + + @@ -531,9 +572,13 @@ + + + + @@ -544,6 +589,8 @@ + + @@ -554,6 +601,8 @@ + + @@ -565,6 +614,8 @@ + + @@ -576,6 +627,8 @@ + + @@ -618,6 +671,8 @@ + + @@ -1121,4 +1176,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form index 1575e20ba..f9f2fd580 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Form.form @@ -104,7 +104,6 @@ true UserCmds Auto - InCommandBarAndInAdditionalSubmenu true true diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl index 2bccde65d..fcd507475 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Forms/Форма/Module.bsl @@ -4656,13 +4656,22 @@ ПараметрыПодключения.ТекстПояснения = Контекст.НазначениеВнешнейКомпонентыКриптографии; // Объект создается на одно действие до исключения, кэширование на время сеанса не подходит. ПараметрыПодключения.Кэшировать = Ложь; - ПараметрыПодключения.ИдентификаторыСозданияОбъектов.Добавить("BinaryDataS"); - ПараметрыПодключения.ИдентификаторыСозданияОбъектов.Добавить("CryptS"); + + ПолноеИмяМакета = ""; + УстановитьПараметрыКомпоненты(ПолноеИмяМакета, ПараметрыПодключения); ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета( Новый ОписаниеОповещения("СоздатьОбъектКриптографииПослеПодключенияКомпоненты", ЭтотОбъект, Контекст), - Неопределено, "Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Макет.КомпонентаОбмена", - ПараметрыПодключения); + Неопределено, ПолноеИмяМакета, ПараметрыПодключения); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьПараметрыКомпоненты(ПолноеИмяМакета, ПараметрыПодключения) + + ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты(); + ПолноеИмяМакета = ОписаниеКомпоненты.ПолноеИмяМакета; + ПараметрыПодключения.ИдентификаторыСозданияОбъектов.Добавить(ОписаниеКомпоненты.ИмяОбъекта); КонецПроцедуры @@ -4689,14 +4698,24 @@ Возврат; КонецЕсли; - РаботаСДвоичнымиДанными = Результат.ПодключаемыйМодуль.Получить("BinaryDataS"); - Криптография = Результат.ПодключаемыйМодуль.Получить("CryptS"); + УстановитьПодключенныеМодули(РаботаСДвоичнымиДанными, Криптография, Результат); + Криптография.НачатьУстановкуНеВыводитьСообщенияОбОшибках( Новый ОписаниеОповещения("СоздатьОбъектКриптографииПослеУстановкиНеВыводитьСообщенияОбОшибках", ЭтотОбъект, Контекст), Истина); КонецПроцедуры +&НаКлиенте +Процедура УстановитьПодключенныеМодули(РаботаСДвоичнымиДанными, Криптография, РезультатПодключения) + + ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты(); + ОбъектКомпоненты = РезультатПодключения.ПодключаемыйМодуль.Получить(ОписаниеКомпоненты.ИмяОбъекта); + РаботаСДвоичнымиДанными = ОбъектКомпоненты; + Криптография = ОбъектКомпоненты; + +КонецПроцедуры + &НаКлиенте Процедура СоздатьОбъектКриптографииПослеУстановкиНеВыводитьСообщенияОбОшибках(Контекст) Экспорт diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl index f4a42cf5e..77d7528fd 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ManagerModule.bsl @@ -109,6 +109,14 @@ КонецПроцедуры +Процедура ДополнитьЗапросСостояниемВСпискеСертификатов(ТекстЗапроса) Экспорт + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, + "&ДополнительноеПоле", + "СертификатыПереопределяемый.СостояниеЗаявления"); + +КонецПроцедуры + // Параметры: // НеРедактируемыеРеквизиты - Массив // diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/КомпонентаОбмена/Template.addin b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/КомпонентаОбмена/Template.addin deleted file mode 100644 index 27d0c9aa1..000000000 Binary files a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Templates/КомпонентаОбмена/Template.addin and /dev/null differ diff --git a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.mdo b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.mdo index e25ba8e6e..0aceb5c7e 100644 --- a/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.mdo +++ b/SSL/src/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.mdo @@ -84,14 +84,6 @@ Дата актуальности - 24.03.2014 (http://www.gnivc.ru/inf_provision/classifiers_reference/ssrf/) TextDocument - - КомпонентаОбмена - - ru - Компонента обмена - - AddIn - Соглашение diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html index bf4f07019..6358ed8f9 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html @@ -6,4 +6,4 @@

      Нажмите Сохранить. Последняя отправка сохраняется автоматически.

      См. также:

      \ No newline at end of file +
    • Синхронизация данных.
    • \ No newline at end of file diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Help/ru.html b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Help/ru.html index 2b5b95b56..fbb57d262 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Help/ru.html +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Help/ru.html @@ -1,7 +1,7 @@

      Отчет предназначен для выдачи статистики по составу отправляемых данных при синхронизации. 

      Отчет можно посмотреть по ссылке Отчет о составе отправляемых данных из Помощника интерактивной синхронизации. Формируется автоматически.

      -

      В заголовке отчета выводится наименование программы, с которой производится синхронизация данных, а также дата и время формирования отчета.

      +

      В заголовке отчета выводится наименование программы, с которой производится синхронизация данных, а также дата и время формирования отчета.

      Состоит из колонок:

      • Данные - перечень объектов программы (списков и документов), которые участвуют в синхронизации.
      • Выбрано: diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Help/ru.html b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Help/ru.html index d75741a23..fb67a217d 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Help/ru.html +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Help/ru.html @@ -1,5 +1,5 @@ -

        Предназначена для отбора данных, которые будут отправлены при синхронизации данных в другую программу.

        +

        Предназначена для отбора данных, которые будут отправлены при синхронизации данных в другую программу.

        Открыть список можно, нажав на ссылку в поле С отбором для добавления данных на странице Данные для отправки Помощника интерактивной синхронизации данных. 

        Отправляемые данные

        • Нажмите Подобрать, для того чтобы выбрать данные для отправки и заполнить список. Объекты программы для выбора выводятся в виде дерева. Выделите нужные, нажмите Выбрать. Данные размещаются в списке для отправки. diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form index 84355106b..766db89b4 100644 --- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form @@ -93,10 +93,6 @@ true - - <key>ru</key> - <value>Без подменю</value> - БезПодменюExtendedTooltip 12 diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl index 810ed088e..25149642c 100644 --- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl @@ -344,8 +344,8 @@ &НаСервере Процедура РазместитьСтраницыПакета(ПакетСтраниц, ФайлыПакета) - Колонка = ФайлыПакета.Картинки.Колонки; // КолонкаТаблицыЗначений - Колонка.Добавить("Адрес", Новый ОписаниеТипов("Строка")); + Колонки = ФайлыПакета.Картинки.Колонки; // КоллекцияКолонокТаблицыЗначений + Колонки.Добавить("Адрес", Новый ОписаниеТипов("Строка")); // Регистрация картинок и ссылок на страницы встроенной справки. Для Каждого ВебСтраница Из ФайлыПакета.ВебСтраницы Цикл diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl index 834cc654d..6a4cbc1ba 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl @@ -213,10 +213,23 @@ ОбменДаннымиXDTOСервер.ИнициализироватьВедениеПротоколаОбмена(КомпонентыОбмена, ИмяФайлаПротоколаОбмена); КонецЕсли; + Отказ = Ложь; + Если УстановитьБлокировкуУзлаПланаОбмена + И КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда + + ОбменДаннымиСервер.ЗаблокироватьУзелОбмена(КомпонентыОбмена.УзелКорреспондента, Отказ); + + КонецЕсли; + + Если Отказ = Истина Тогда + + Возврат; + + КонецЕсли; + // Открываем файл обмена. ОбменДаннымиXDTOСервер.ОткрытьФайлВыгрузки(КомпонентыОбмена, ИмяФайлаОбмена); - Отказ = Ложь; Попытка ПослеОткрытияФайлаВыгрузки(Отказ); // ВЫГРУЗКА ДАННЫХ @@ -278,6 +291,13 @@ КонецЕсли; КонецЕсли; + Если УстановитьБлокировкуУзлаПланаОбмена + И КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда + + ОбменДаннымиСервер.РазблокироватьУзелОбмена(КомпонентыОбмена.УзелКорреспондента, Отказ); + + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -329,6 +349,12 @@ Отказ = Ложь; ПослеОткрытияФайлаЗагрузки(Отказ); + Если УстановитьБлокировкуУзлаПланаОбмена + И КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда + + ОбменДаннымиСервер.ЗаблокироватьУзелОбмена(КомпонентыОбмена.УзелКорреспондента, Отказ); + + КонецЕсли; Если Отказ Тогда Возврат; @@ -399,6 +425,13 @@ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена); + Если УстановитьБлокировкуУзлаПланаОбмена + И КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда + + ОбменДаннымиСервер.РазблокироватьУзелОбмена(КомпонентыОбмена.УзелКорреспондента, Отказ); + + КонецЕсли; + КонецПроцедуры // Выполняет загрузку данных из файла сообщения обмена в Информационную Базу только заданных типов объектов. @@ -788,11 +821,32 @@ И ОбменДаннымиXDTOСервер.ПоддерживаетсяВерсияСИдентификаторомОбменаДанными(УзелИнформационнойБазы) Тогда УзелОбменаОбъект = УзелИнформационнойБазы.ПолучитьОбъект(); - УзелОбменаОбъект.Код = РезультатАнализаДанныхКЗагрузке.NewFrom; - УзелОбменаОбъект.ОбменДанными.Загрузка = Истина; - УзелОбменаОбъект.Записать(); - УзелКорреспондентаПерекодирован = Истина; + НовыйУзелСсылка = ПланыОбмена[УзелИнформационнойБазы.Метаданные().Имя].НайтиПоКоду(РезультатАнализаДанныхКЗагрузке.NewFrom); + СоздаватьНовыйУзел = НовыйУзелСсылка.Пустая(); + + Если СоздаватьНовыйУзел Тогда + + УзелОбменаОбъект.Код = РезультатАнализаДанныхКЗагрузке.NewFrom; + УзелОбменаОбъект.ОбменДанными.Загрузка = Истина; + УзелОбменаОбъект.Записать(); + + УзелКорреспондентаПерекодирован = Истина; + + Иначе + + ТекстИсключения = НСтр("ru = 'Обнаружено дублирование настроек синхронизации данных. + |Для исправления ошибки перейдите в корреспондирующую информационную базу. + |Откройте форму ""Настройки синхронизации данных"". + |В меню ""Еще"" выберите ""Новый код предопределенного узла..."". + |Выберите план обмена, который необходимо исправить. + |Ознакомьтесь с информацией на форме и нажмите ""Установить новый код"". + |После этого повторите синхронизацию (или создайте новую настройку обмена).'"); + + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + КонецЕсли; Иначе УзелКорреспондентаПерекодирован = Истина; diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/КонвертацияОбъектовXDTO.mdo b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/КонвертацияОбъектовXDTO.mdo index b44bb6281..ac1be78d6 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/КонвертацияОбъектовXDTO.mdo +++ b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/КонвертацияОбъектовXDTO.mdo @@ -280,4 +280,16 @@ + + УстановитьБлокировкуУзлаПланаОбмена + + ru + Установить блокировку узла плана обмена непосредственно при выгрузке/загрузке + + + Boolean + + + + diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl index e20240393..382b050cd 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl @@ -4423,7 +4423,30 @@ КонецЕсли; // Фиксируем событие в журнале регистрации. - ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщенияОбОшибке(), УровеньЖР); + СтрокаСообщенияОбОшибке = СтрокаСообщенияОбОшибке(); + ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщенияОбОшибке, УровеньЖР); + + ПараметрыЗаписи = Новый Структура("ПроблемныйОбъект, ТипПроблемы"); + ПараметрыЗаписи.Вставить("УзелИнформационнойБазы", УзелДляОбмена); + ПараметрыЗаписи.Вставить("Причина", СтрокаСообщенияОбОшибке); + + Если ЗначениеЗаполнено(СсылкаДляПереходаПриВозникновенииОшибки) Тогда + + ПараметрыЗаписи.ПроблемныйОбъект = СсылкаДляПереходаПриВозникновенииОшибки; + + КонецЕсли; + + Если РежимОбмена = "Выгрузка" Тогда + + ПараметрыЗаписи.ТипПроблемы = Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных; + + ИначеЕсли РежимОбмена = "Загрузка" Тогда + + ПараметрыЗаписи.ТипПроблемы = Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных; + + КонецЕсли; + + РегистрыСведений.РезультатыОбменаДанными.ДобавитьЗаписьОРезультатахОбмена(ПараметрыЗаписи); Возврат СтрокаСообщенияОбОшибке(); @@ -10347,7 +10370,7 @@ ИначеЕсли РежимЗаписи = "ОтменаПроведения" Тогда - РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения; + РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения; ИначеЕсли РежимЗаписи = "Запись" Тогда @@ -17628,6 +17651,20 @@ Иначе + Попытка + + СсылкаДляПереходаПриВозникновенииОшибки = Данные.Ссылка; + + Исключение + + Если Ложь Тогда // Для работы АПК + + ВызватьИсключение; + + КонецЕсли; + + КонецПопытки; + // выгрузка ссылочных типов ВыгрузкаОбъектаВыборки(Данные, ПравилоВыгрузкиДанных, , ИсходящиеДанные, НеВыгружатьОбъектыПоСсылкам); diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo index 0389cef2f..190865669 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo +++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/КонвертацияОбъектовИнформационныхБаз.mdo @@ -554,6 +554,16 @@ + + СсылкаДляПереходаПриВозникновенииОшибки + + ru + Ссылка для перехода при возникновении ошибки + + + + + Форма diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl index da7804138..7d549e9e8 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl @@ -33,7 +33,9 @@ И ОбменДаннымиСервер.ЭтоПодчиненныйУзелРИБ() И (ОбменДаннымиСлужебный.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() Или Не ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском( - "СообщениеПолученоИзКэша")); + "СообщениеПолученоИзКэша") + Или ОбменДаннымиСлужебный.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском( + "ЗагрузкаРасширений")); РезультатАнализаДанныхКЗагрузке = ОбменДаннымиСервер.РезультатАнализаДанныхКЗагрузке(ИмяФайлаСообщенияОбмена(), Ложь, Истина); РазмерФайлаСообщенияОбмена = РезультатАнализаДанныхКЗагрузке.РазмерФайлаСообщенияОбмена; @@ -152,7 +154,7 @@ Если ЗагрузитьТолькоПараметры Тогда Если ЗагрузитьМетаданные Тогда - + Попытка УстановитьПривилегированныйРежим(Истина); @@ -210,8 +212,12 @@ Иначе + Если ЕстьРасширениеВСообщениеОбмена(ЧтениеСообщения) Тогда + ОбменДаннымиСлужебный.ВключитьЗагрузкуРасширенийИзменяющиеСтруктуруДанных(); + КонецЕсли; + Попытка - + // Получаем изменения конфигурации и изменения данных из сообщения обмена. ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции); @@ -220,7 +226,17 @@ // Сообщение считаем принятым ЧтениеСообщения.ЗакончитьЧтение(); + + // Если сообщение обмена принято без ошибок, то нет необходимости в загрузке расширений + ОбменДаннымиСлужебный.ОтключитьЗагрузкуРасширенийИзменяющихСтруктуруДанных(); + Исключение + + // Если расширения были изменены динамически, то есть необходимость только в перезагрузке сеанса, но не в обновлении + Если Справочники.ВерсииРасширений.РасширенияИзмененыДинамически() Тогда + ОбменДаннымиСлужебный.ОтключитьЗагрузкуРасширенийИзменяющихСтруктуруДанных(); + КонецЕсли; + ЧтениеСообщения.ПрерватьЧтение(); СообщениеОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаЧтенияФайлаСообщенияОбмена()); @@ -228,7 +244,7 @@ КонецПопытки; КонецЕсли; - + // Запись общих данных узлов выполняется после чтения сообщения. Если УзелОбщихДанных <> Неопределено Тогда @@ -815,6 +831,49 @@ КонецФункции +Функция ЕстьРасширениеВСообщениеОбмена(ЧтениеСообщения) + + Если НЕ УзелИнформационнойБазы.Метаданные().ВключатьРасширенияКонфигурации + Или Не ОбменДаннымиСервер.ЭтоПодчиненныйУзелРИБ() + Или ОбщегоНазначения.РазделениеВключено() Тогда + Возврат Ложь; + КонецЕсли; + + ФайлОбмена = Новый ЧтениеXML; + + ФайлОбмена.ОткрытьФайл(ЧтениеСообщения.ЧтениеXML.БазовыйURI); + + Пока ФайлОбмена.Прочитать() Цикл + + Если ФайлОбмена.Имя = "v8de:ConfigurationExtensions" Тогда + + Пока ФайлОбмена.Прочитать() Цикл + + Если ФайлОбмена.Имя = "v8md:Metadata" Или ФайлОбмена.Имя = "v8de:ConfigurationExtensionDeletion" Тогда + + Возврат Истина; + + ИначеЕсли ФайлОбмена.ЛокальноеИмя = "v8de:ConfigurationExtensions" + И ФайлОбмена.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + + Возврат Ложь; + + КонецЕсли; + + КонецЦикла; + + ИначеЕсли ФайлОбмена.Имя = "v8de:Data" Тогда + + Возврат Ложь; + + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + #КонецОбласти #Иначе diff --git a/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Form.form b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Form.form new file mode 100644 index 000000000..feb1147b0 --- /dev/null +++ b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Form.form @@ -0,0 +1,411 @@ + + + + ПредставлениеФормулы + 289 + + <key>ru</key> + <value>Формула</value> + + true + true + + true + + + ПредставлениеФормулы + + None + + ПредставлениеФормулыРасширеннаяПодсказка + 291 + Label + true + true + + Left + + + + ПредставлениеФормулыКонтекстноеМеню + 290 + true + + TextDocumentField + Enter + true + Left + true + + 50 + true + 5 + true + true + true + + + + ГруппаПоляИОператоры + 551 + + ГруппаДоступныеПоля + 326 + true + true + + true + + + <key>ru</key> + <value>Операнды</value> + + + ГруппаДоступныеПоляРасширеннаяПодсказка + 327 + Label + true + true + + Left + + + UsualGroup + + Vertical + Center + Auto + + ru + Доступные поля + + Button + true + Auto + Auto + + + + ГруппаОператорыИФункции + 543 + true + true + + true + + + <key>ru</key> + <value>Операторы и функции</value> + + + ГруппаОператорыИФункцииРасширеннаяПодсказка + 544 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Поля и операторы</value> + + + ГруппаПоляИОператорыРасширеннаяПодсказка + 552 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + Наименование + 560 + true + true + + true + + + Наименование + + + НаименованиеРасширеннаяПодсказка + 562 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 561 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ФормаЗавершитьРедактирование + 556 + true + true + + true + + + ФормаЗавершитьРедактированиеРасширеннаяПодсказка + 557 + Label + true + true + + Left + + + Form.Command.ЗавершитьРедактирование + Auto + true + true + true + UserCmds + Auto + + + ФормаПроверитьФормулу + 558 + true + true + + true + + + ФормаПроверитьФормулуРасширеннаяПодсказка + 559 + Label + true + true + + Left + + + Form.Command.ПроверитьФормулу + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + Use + true + true + true + Vertical + true + true + true + UseIfNecessary + auto + true + + Формула + 12 + + String + + + + true + + + true + + + + ПредставлениеФормулы + + <key>ru</key> + <value>Представление формулы</value> + + 1 + + String + + + + true + + + true + + true + + + Наименование + + <key>ru</key> + <value>Наименование</value> + + 13 + + String + + + + true + + + true + + true + + + ЗавершитьРедактирование + + <key>ru</key> + <value>Завершить редактирование</value> + + 15 + + ru + Завершить редактирование + + + true + + + + ЗавершитьРедактирование + + + Auto + Auto + + + ПроверитьФормулу + + <key>ru</key> + <value>Проверить формулу</value> + + 1 + + ru + Проверить формулу + + + true + + + CommonPicture.ПроверитьФормулу + + + + ПроверитьФормулу + + + TextPicture + Auto + Auto + + + Операнды + + String + + + + + Операторы + + String + + + + + Формула + + String + + + + + ИмяКоллекцииСКДОперандов + + String + + + + + Наименование + + + + ИмяКоллекцииСКДОператоров + + String + + + + + + + + diff --git a/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Module.bsl b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Module.bsl new file mode 100644 index 000000000..b117b33fc --- /dev/null +++ b/SSL/src/DataProcessors/КонструкторФормул/Forms/РедактированиеФормулы/Module.bsl @@ -0,0 +1,326 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПараметрыДобавленияСпискаПолей = КонструкторФормулСлужебный.ПараметрыДобавленияСпискаПолей(); + ПараметрыДобавленияСпискаПолей.ИмяСписка = ИмяСпискаОперандов(); + ПараметрыДобавленияСпискаПолей.КоллекцииПолей.Добавить(ПрочитатьСписокОперандов()); + ПараметрыДобавленияСпискаПолей.МестоРазмещенияСписка = Элементы.ГруппаДоступныеПоля; + ПараметрыДобавленияСпискаПолей.ПодсказкаВводаСтрокиПоиска = НСтр("ru = 'Найти операнд...'"); + ПараметрыДобавленияСпискаПолей.ИспользоватьИдентификаторыДляФормул = Истина; + ПараметрыДобавленияСпискаПолей.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор"); + КонструкторФормулСлужебный.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавленияСпискаПолей); + + ПараметрыДобавленияСпискаПолей = КонструкторФормулСлужебный.ПараметрыДобавленияСпискаПолей(); + ПараметрыДобавленияСпискаПолей.ИмяСписка = ИмяСпискаОператоров(); + ПараметрыДобавленияСпискаПолей.КоллекцииПолей.Добавить(СписокОператоров()); + ПараметрыДобавленияСпискаПолей.МестоРазмещенияСписка = Элементы.ГруппаОператорыИФункции; + ПараметрыДобавленияСпискаПолей.ПодсказкаВводаСтрокиПоиска = НСтр("ru = 'Найти оператор или функцию...'"); + ПараметрыДобавленияСпискаПолей.СкобкиПредставлений = Ложь; + ПараметрыДобавленияСпискаПолей.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор"); + ПараметрыДобавленияСпискаПолей.ОбработчикиСписка.Вставить("НачалоПеретаскивания", "Подключаемый_ОператорыНачалоПеретаскивания"); + ПараметрыДобавленияСпискаПолей.ОбработчикиСписка.Вставить("ОкончаниеПеретаскивания", "Подключаемый_ОператорыОкончаниеПеретаскивания"); + КонструкторФормулСлужебный.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавленияСпискаПолей); + + ПредставлениеФормулы = КонструкторФормулСлужебный.ПредставлениеФормулы(ЭтотОбъект, Параметры.Формула); + + Элементы.Наименование.Видимость = Параметры.Наименование <> Неопределено; + Наименование = Параметры.Наименование; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + ОписаниеОповещения = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(ОписаниеОповещения, Отказ, ЗавершениеРаботы); + + Если Модифицированность Или ЗавершениеРаботы Тогда + Возврат; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗавершитьРедактирование(Команда) + + ПодключитьОбработчикОжидания("ЗакрытьФорму", 0.1, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьФормулу(Команда) + + ШаблонСообщения = НСтр("ru = 'Проверяемое выражение: + |%1 + | + |Результат проверки: + |%2'"); + + Выражение = ВыражениеДляПроверки(); + Попытка + Результат = Вычислить(Выражение); + Исключение + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, Выражение, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстСообщения; + КонецПопытки; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, Выражение, Результат); + + ПоказатьПредупреждение(, НСтр("ru = 'Проверка выполнена успешно.'") + Символы.ПС + Символы.ПС + ТекстСообщения); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + ЗакрытьФорму(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму() + + Модифицированность = Ложь; + Закрыть(ОписаниеФормулы()); + +КонецПроцедуры + +&НаСервере +Функция ПрочитатьСписокОперандов() + + СписокОперандов = Параметры.Операнды; + Если ЭтоАдресВременногоХранилища(СписокОперандов) Тогда + СписокОперандов = ПолучитьИзВременногоХранилища(СписокОперандов); + КонецЕсли; + + Если СписокОперандов = Неопределено Тогда + СписокОперандов = КонструкторФормулСлужебный.ТаблицаПолей(); + КонецЕсли; + + Возврат КонструкторФормулСлужебный.КоллекцияПолей(СписокОперандов, , Параметры.ИмяКоллекцииСКДОперандов); + +КонецФункции + +&НаКлиенте +Функция ОписаниеФормулы() + + ОписаниеФормулы = Новый Структура; + ОписаниеФормулы.Вставить("Формула", ФормулаИзПредставления()); + ОписаниеФормулы.Вставить("ПредставлениеФормулы", ПредставлениеФормулы); + Если Элементы.Наименование.Видимость Тогда + ОписаниеФормулы.Вставить("Наименование", Наименование); + КонецЕсли; + + Возврат ОписаниеФормулы; + +КонецФункции + +&НаСервере +Функция ФормулаИзПредставления() + + Возврат КонструкторФормулСлужебный.ФормулаИзПредставления(ЭтотОбъект, ПредставлениеФормулы); + +КонецФункции + +#Область ПодключаемыйСписокПолей + +&НаКлиенте +Процедура Подключаемый_СписокПолейПередРазворачиванием(Элемент, Строка, Отказ) + + КонструкторФормулКлиент.СписокПолейПередРазворачиванием(ЭтотОбъект, Элемент, Строка, Отказ); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_РазвернутьТекущийЭлементСпискаПолей() + + КонструкторФормулКлиент.РазвернутьТекущийЭлементСпискаПолей(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения) Экспорт // АПК:78 - вызывается из КонструкторФормулКлиент + + ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения) + + КонструкторФормулСлужебный.ЗаполнитьСписокДоступныхПолей(ЭтотОбъект, ПараметрыЗаполнения); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СписокПолейНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение) + + КонструкторФормулКлиент.СписокПолейНачалоПеретаскивания(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, Выполнение); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) + + КонструкторФормулКлиент.СтрокаПоискаИзменениеТекстаРедактирования(ЭтотОбъект, Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ВыполнитьПоискВСпискеПолей() + + ВыполнитьПоискВСпискеПолей(); + +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьПоискВСпискеПолей() + + КонструкторФормулСлужебный.ВыполнитьПоискВСпискеПолей(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка) + + КонструкторФормулКлиент.СтрокаПоискаОчистка(ЭтотОбъект, Элемент, СтандартнаяОбработка); + +КонецПроцедуры + +#КонецОбласти + +#Область ДополнительныеОбработчикиПодключаемыхСписков + +// Параметры: +// Элемент - ТаблицаФормы +// +&НаКлиенте +Процедура Подключаемый_СписокПолейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ВыбранноеПоле = КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект); + Если Элемент.Имя = ИмяСпискаОперандов() Тогда + ПредставлениеФормулы = СокрП(ПредставлениеФормулы) + " [" + ВыбранноеПоле.ПредставлениеПутиКДанным + "]"; + Иначе + ПредставлениеФормулы = СокрП(ПредставлениеФормулы) + " " + ВыражениеДляВставки(ВыбранноеПоле); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОператорыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение) + + Оператор = КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров()); + ПараметрыПеретаскивания.Значение = ВыражениеДляВставки(Оператор); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОператорыОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) + + Если КонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров()).ПутьКДанным = "Формат" Тогда + ФорматСтроки = Новый КонструкторФорматнойСтроки; + ФорматСтроки.Показать(Новый ОписаниеОповещения("ОператорыОкончаниеПеретаскиванияЗавершение", ЭтотОбъект, Новый Структура("ФорматСтроки", ФорматСтроки))); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОператорыОкончаниеПеретаскиванияЗавершение(Текст, ДополнительныеПараметры) Экспорт + + ФорматСтроки = ДополнительныеПараметры.ФорматСтроки; + + Если ЗначениеЗаполнено(ФорматСтроки.Текст) Тогда + ТекстДляВставки = "Формат( , """ + ФорматСтроки.Текст + """)"; + Элементы.ПредставлениеФормулы.ВыделенныйТекст = ТекстДляВставки; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +&НаКлиентеНаСервереБезКонтекста +Функция ИмяСпискаОперандов() + + Возврат "СписокОперандов"; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ИмяСпискаОператоров() + + Возврат "СписокОператоров"; + +КонецФункции + +&НаСервере +Функция СписокОператоров() + + СписокОператоров = Параметры.Операторы; + Если Не ЗначениеЗаполнено(СписокОператоров) Тогда + СписокОператоров = КонструкторФормулСлужебный.СписокОператоров(); + КонецЕсли; + + Возврат КонструкторФормулСлужебный.КоллекцияПолей(СписокОператоров, , Параметры.ИмяКоллекцииСКДОператоров); + +КонецФункции + +&НаКлиенте +Функция ВыражениеДляВставки(Оператор) + + Результат = Оператор.Заголовок + "("; + + Если Не ЗначениеЗаполнено(Оператор.Родитель) Тогда + Возврат ""; + КонецЕсли; + + Если Оператор.Родитель.Имя = "Разделители" Тогда + Результат = "+ """ + Оператор.Заголовок + """ +"; + Если Оператор.Имя = "[ ]" Тогда + Результат = "+ "" "" +"; + КонецЕсли; + КонецЕсли; + + Если Оператор.Родитель.Имя = "ЛогическиеОператорыИКонстанты" + Или Оператор.Родитель.Имя = "Операторы" Тогда + Результат = Оператор.Заголовок; + КонецЕсли; + + Если Оператор.Родитель.Имя = "ПрочиеФункции" Тогда + Если Оператор.Имя = "[?]" Или Оператор.Имя = "Формат" Тогда + Результат = Оператор.Заголовок + "(,,)"; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ВыражениеДляПроверки() + + Возврат КонструкторФормулСлужебный.ВыражениеДляПроверки(ЭтотОбъект, ПредставлениеФормулы, ИмяСпискаОперандов()); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/DataProcessors/КонструкторФормул/КонструкторФормул.mdo b/SSL/src/DataProcessors/КонструкторФормул/КонструкторФормул.mdo new file mode 100644 index 000000000..dd97d9dd9 --- /dev/null +++ b/SSL/src/DataProcessors/КонструкторФормул/КонструкторФормул.mdo @@ -0,0 +1,22 @@ + + + + + + + КонструкторФормул + + ru + Конструктор формул + + true + + РедактированиеФормулы + + ru + Редактирование формулы + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl index 153493bbe..d8a0bd017 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ManagerModule.bsl @@ -281,7 +281,7 @@ КонецЕсли; Для Каждого Менеджер Из Менеджеры Цикл - Набор = Менеджер.СоздатьНаборЗаписей(); + Набор = Менеджер.СоздатьНаборЗаписей(); // РегистрСведенийНаборЗаписей.РазрешенияНаИспользованиеВнешнихРесурсов Если ПрограммныйМодуль <> Неопределено Тогда СвойстваПрограммногоМодуля = РаботаВБезопасномРежимеСлужебный.СвойстваДляРегистраРазрешений(ПрограммныйМодуль); Набор.Отбор.ТипПрограммногоМодуля.Установить(СвойстваПрограммногоМодуля.Тип); @@ -319,7 +319,8 @@ // ДобавитьПриОтсутствии - Булево // // Возвращаемое значение: -// СтрокаТаблицыЗначений, Неопределено +// - СтрокаТаблицыЗначений +// - Неопределено // Функция СтрокаТаблицыРазрешений(Знач ТаблицаРазрешений, Знач Отбор, Знач ДобавитьПриОтсутствии = Истина) Экспорт diff --git a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl index 5c779adce..6e2925ae4 100644 --- a/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/НастройкаРазрешенийНаИспользованиеВнешнихРесурсов/ObjectModule.bsl @@ -15,16 +15,15 @@ // Перем ИдентификаторыЗапросов; -// ТаблицаЗначений - план выполнения операций администрирования при применении запросов на использование внешних -// ресурсов. Колонки: +// План выполнения операций администрирования при применении запросов на использование внешних ресурсов. +Перем ОперацииАдминистрирования; // ТаблицаЗначений: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных - // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор - // * Операция - ПеречислениеСсылка.ОперацииАдминистрированияПрофилейБезопасности - // * Имя - Строка - имя профиля безопасности. -// -Перем ОперацииАдминистрирования; -// Структура - текущий план применения запросов на использование внешних ресурсов. Поля структуры: +// Текущий план применения запросов на использование внешних ресурсов. +Перем ПланПримененияЗапросов; // Структура: // * Замещаемые - ТаблицаЗначений - операции замещения существующих разрешений на использование внешних ресурсов: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных, // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор, @@ -60,10 +59,9 @@ // РазрешенияНаИспользованиеВнешнихРесурсов), // * Значение - см. функцию ДополнениеРазрешения в модуле менеджера регистра. // РазрешенияНаИспользованиеВнешнихРесурсов). -// -Перем ПланПримененияЗапросов; -// ТаблицаЗначений - исходный срез разрешений (в разрезе владельцев разрешений). Колонки: +// Исходный срез разрешений (в разрезе владельцев разрешений). +Перем ИсходныйСрезРазрешенийВРазрезеВладельцев; // ТаблицаЗначений: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных, // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор, // * ТипВладельца - СправочникСсылка.ИдентификаторыОбъектовМетаданных, @@ -78,10 +76,9 @@ // РазрешенияНаИспользованиеВнешнихРесурсов), // * Значение - см. функцию ДополнениеРазрешения в модуле менеджера регистра. // РазрешенияНаИспользованиеВнешнихРесурсов). -// -Перем ИсходныйСрезРазрешенийВРазрезеВладельцев; // ТаблицаЗначений -// Таблица значений - исходный срез разрешений (без учета владельцев разрешений). Колонки: +// Исходный срез разрешений (без учета владельцев разрешений). +Перем ИсходныйСрезРазрешенийБезУчетаВладельцев; // ТаблицаЗначений: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных, // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор, // * Тип - Строка - имя XDTO-типа, описывающего разрешения, @@ -94,11 +91,9 @@ // РазрешенияНаИспользованиеВнешнихРесурсов), // * Значение - см. функцию ДополнениеРазрешения в модуле менеджера регистра. // РазрешенияНаИспользованиеВнешнихРесурсов). -// -Перем ИсходныйСрезРазрешенийБезУчетаВладельцев; -// ТаблицаЗначений - срез разрешений в результате применения запросов (в разрезе владельцев разрешений). -// Колонки: +// Срез разрешений в результате применения запросов (в разрезе владельцев разрешений). +Перем РезультатПримененияЗапросовВРазрезеВладельцев; // ТаблицаЗначений: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных, // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор, // * ТипВладельца - СправочникСсылка.ИдентификаторыОбъектовМетаданных, @@ -113,11 +108,9 @@ // РазрешенияНаИспользованиеВнешнихРесурсов), // * Значение - см. функцию ДополнениеРазрешения в модуле менеджера регистра. // РазрешенияНаИспользованиеВнешнихРесурсов). -// -Перем РезультатПримененияЗапросовВРазрезеВладельцев; -// ТаблицаЗначений - срез разрешений в результате применения запросов (в разрезе владельцев разрешений). -// Колонки: +// Срез разрешений в результате применения запросов (в разрезе владельцев разрешений). +Перем РезультатПримененияЗапросовБезУчетаВладельцев; // ТаблицаЗначений: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных, // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор, // * Тип - Строка - имя XDTO-типа, описывающего разрешения, @@ -130,10 +123,9 @@ // РазрешенияНаИспользованиеВнешнихРесурсов), // * Значение - см. функцию ДополнениеРазрешения в модуле менеджера регистра. // РазрешенияНаИспользованиеВнешнихРесурсов). -// -Перем РезультатПримененияЗапросовБезУчетаВладельцев; -// Структура - дельта между исходным и результирующим срезами разрешений (в разрезе владельцев разрешений): +// Дельта между исходным и результирующим срезами разрешений (в разрезе владельцев разрешений). +Перем ДельтаВРазрезеВладельцев; // Структура: // * Добавляемые - ТаблицаЗначений - описание добавляемых разрешений, колонки: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных, // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор, @@ -164,10 +156,9 @@ // РазрешенияНаИспользованиеВнешнихРесурсов), // * Значение - см. функцию ДополнениеРазрешения в модуле менеджера регистра. // РазрешенияНаИспользованиеВнешнихРесурсов). -// -Перем ДельтаВРазрезеВладельцев; -// Структура - дельта между исходным и результирующим срезами разрешений (без учета владельцев разрешений): +// Дельта между исходным и результирующим срезами разрешений (без учета владельцев разрешений). +Перем ДельтаБезУчетаВладельцев; // Структура: // * Добавляемые - ТаблицаЗначений - описание добавляемых разрешений, колонки: // * ТипПрограммногоМодуля - СправочникСсылка.ИдентификаторыОбъектовМетаданных, // * ИдентификаторПрограммногоМодуля - УникальныйИдентификатор, @@ -194,12 +185,9 @@ // РазрешенияНаИспользованиеВнешнихРесурсов), // * Значение - см. функцию ДополнениеРазрешения в модуле менеджера регистра. // РазрешенияНаИспользованиеВнешнихРесурсов). -// -Перем ДельтаБезУчетаВладельцев; -// Булево - флаг выполнения очистки информации о предоставленных разрешениях перед применением разрешений. -// -Перем ОчисткаРазрешенийПередПрименением; +// Флаг выполнения очистки информации о предоставленных разрешениях перед применением разрешений. +Перем ОчисткаРазрешенийПередПрименением; // Булево #КонецОбласти diff --git a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl index af5145c59..cca97a9cc 100644 --- a/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкаСтандартногоИнтерфейсаOData/ManagerModule.bsl @@ -273,7 +273,7 @@ // Возвращаемое значение: // Соответствие из КлючИЗначение: // * Ключ - ОбъектМетаданных - объект метаданных, -// * Значение - Массив(Строка) - массив названий прав доступа, +// * Значение - Массив из Строка - массив названий прав доступа, // которые должны быть разрешены для данного объекта // метаданных в роли. // diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form index 48cf94c08..f034bd954 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form @@ -333,10 +333,6 @@ true - - <key>ru</key> - <value>Скопировать другим выделенные</value> - СкопироватьДругимВыделенныеExtendedTooltip 131 @@ -433,6 +429,32 @@ UserCmds Auto + + ОчиститьУстаревшиеНастройки + 233 + true + true + + true + + + ОчиститьУстаревшиеНастройкиРасширеннаяПодсказка + 234 + Label + true + true + + Left + + + Form.Command.ОчиститьУстаревшиеНастройки + Normal + Auto + true + true + UserCmds + Auto + ОчиститьНастройкиОтчетовИВнешнегоВида 100 @@ -516,15 +538,38 @@ Auto InAdditionalSubmenu + + ОчиститьУстаревшиеНастройкиВсехПользователей + 235 + true + true + + true + + + ОчиститьУстаревшиеНастройкиВсехПользователейРасширеннаяПодсказка + 236 + Label + true + true + + Left + + + Form.Command.ОчиститьУстаревшиеНастройкиВсехПользователей + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + true true true - - <key>ru</key> - <value>Очистить выделенные</value> - ОчиститьВыделенныеExtendedTooltip 136 @@ -1159,10 +1204,6 @@ true - - <key>ru</key> - <value>Внешний вид контекстное меню прочее</value> - ВнешнийВидКонтекстноеМенюПрочееExtendedTooltip 146 @@ -1643,10 +1684,6 @@ true - - <key>ru</key> - <value>Настройки отчетов дерево контекстное меню прочее</value> - НастройкиОтчетовДеревоКонтекстноеМенюПрочееExtendedTooltip 158 @@ -2124,10 +2161,6 @@ true - - <key>ru</key> - <value>Прочие настройки контекстное меню прочее</value> - ПрочиеНастройкиКонтекстноеМенюПрочееExtendedTooltip 170 @@ -3473,6 +3506,51 @@ DontUse Auto + + ОчиститьУстаревшиеНастройки + + <key>ru</key> + <value>Устаревшие настройки</value> + + 18 + + ru + Очистить устаревшие настройки + + + true + + + + ОчиститьУстаревшиеНастройки + + + DontUse + Auto + + + ОчиститьУстаревшиеНастройкиВсехПользователей + + <key>ru</key> + <value>Устаревшие настройки у всех пользователей</value> + + 19 + + ru + Очистить устаревшие настройки у всех пользователей + + + true + + + + ОчиститьУстаревшиеНастройкиВсехПользователей + + + TextPicture + DontUse + Auto + Пользователь diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl index ede279fbc..f4d28ea10 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl @@ -388,6 +388,22 @@ КонецПроцедуры +&НаКлиенте +Процедура ОчиститьУстаревшиеНастройки(Команда) + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Очистить устаревшие настройки у пользователя ""%1""?'"), Строка(ПользовательСсылка)); + + КнопкиВопроса = Новый СписокЗначений; + КнопкиВопроса.Добавить("Очистить", НСтр("ru = 'Очистить'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru = 'Отмена'")); + + Оповещение = Новый ОписаниеОповещения("ОчиститьУстаревшиеНастройкиЗавершение", ЭтотОбъект); + + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); + +КонецПроцедуры + &НаКлиенте Процедура ОчиститьНастройкиОтчетовИВнешнегоВида(Команда) @@ -429,6 +445,22 @@ КонецПроцедуры +&НаКлиенте +Процедура ОчиститьУстаревшиеНастройкиВсехПользователей(Команда) + + ТекстВопроса = + НСтр("ru = 'Сейчас будут очищены устаревшие настройки всех пользователей. + |Продолжить?'"); + + КнопкиВопроса = Новый СписокЗначений; + КнопкиВопроса.Добавить("ОчиститьВсе", НСтр("ru = 'Очистить все'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru = 'Отмена'")); + + Оповещение = Новый ОписаниеОповещения("ОчиститьУстаревшиеНастройкиВсехПользователейЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); + +КонецПроцедуры + &НаКлиенте Процедура СкопироватьОт(Команда) @@ -743,13 +775,23 @@ КонецПроцедуры &НаСервере -Процедура ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки) +Процедура ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки, ОчиститьВсе = Ложь) МассивПользователей = Новый Массив; МассивПользователей.Добавить(ПользовательСсылка); Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(ОчищаемыеНастройки, - МассивПользователей, ТаблицаПользовательскихВариантовОтчетов); + МассивПользователей, ТаблицаПользовательскихВариантовОтчетов, ОчиститьВсе); + +КонецПроцедуры + +&НаСервере +Процедура ОчиститьУстаревшиеНастройкиНаСервере() + + МассивПользователей = Новый Массив; + МассивПользователей.Добавить(ПользовательСсылка); + + Обработки.НастройкиПользователей.УдалитьУстаревшиеНастройкиПользователей(МассивПользователей); КонецПроцедуры @@ -777,7 +819,14 @@ МассивПользователей.Добавить(СтрокаТаблицы.Пользователь); КонецЦикла; - Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(ОчищаемыеНастройки, МассивПользователей); + Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(ОчищаемыеНастройки, МассивПользователей,, Истина); + +КонецПроцедуры + +&НаСервере +Процедура ОчиститьУстаревшиеНастройкиВсехПользователейНаСервере() + + Обработки.НастройкиПользователей.УдалитьУстаревшиеНастройкиПользователей(Неопределено); КонецПроцедуры @@ -986,6 +1035,21 @@ КонецПроцедуры +&НаКлиенте +Процедура ОчиститьУстаревшиеНастройкиВсехПользователейЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = "Отмена" Тогда + Возврат; + КонецЕсли; + + ОчиститьУстаревшиеНастройкиВсехПользователейНаСервере(); + ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); + + ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , + НСтр("ru = 'Очищены устаревшие настройки всех пользователя'"), БиблиотекаКартинок.Информация32); + +КонецПроцедуры + &НаКлиенте Процедура ОчиститьВсеНастройкиЗавершение(Ответ, ДополнительныеПараметры) Экспорт @@ -1002,7 +1066,7 @@ ОчищаемыеНастройки.Добавить("НастройкиПечати"); ОчищаемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки"); - ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки); + ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки, Истина); ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); ОбновитьСписокНастроек(); @@ -1012,6 +1076,23 @@ КонецПроцедуры +&НаКлиенте +Процедура ОчиститьУстаревшиеНастройкиЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = "Отмена" Тогда + Возврат; + КонецЕсли; + + ОчиститьУстаревшиеНастройкиНаСервере(); + ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы(); + ОбновитьСписокНастроек(); + + ТекстПояснения = НСтр("ru = 'Очищены устаревшие настройки пользователя ""%1""'"); + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПользовательСсылка); + ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + +КонецПроцедуры + &НаКлиенте Процедура ОчиститьНастройкиОтчетовИВнешнегоВидаЗавершение(Ответ, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form index 1e4f8e5ab..5ef0632cf 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form @@ -191,6 +191,15 @@ ОчиститьВсе + + + ru + Устаревшие настройки + + + УстаревшиеНастройки + + ru diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl index cf097caed..d03fb703e 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl @@ -59,18 +59,12 @@ &НаКлиенте Процедура ПереключательКомуОчищатьНастройкиПриИзменении(Элемент) - Если ПереключательОчищаемыеНастройки = "ВыбраннымПользователям" - И КоличествоПользователей > 1 - Или ПереключательКомуОчищатьНастройки = "ВсемПользователям" Тогда - ПереключательОчищаемыеНастройки = "ОчиститьВсе"; - КонецЕсли; - Если ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям" - И КоличествоПользователей = 1 - Или ПереключательКомуОчищатьНастройки = "ВсемПользователям" Тогда - Элементы.ГруппаОчищаемыеНастройки.Доступность = Истина; - Иначе + И КоличествоПользователей = 0 Тогда Элементы.ГруппаОчищаемыеНастройки.Доступность = Ложь; + Иначе + Элементы.ГруппаОчищаемыеНастройки.Доступность = Истина; + ПереключательОчищаемыеНастройкиПриИзменении(Элементы.ПереключательОчищаемыеНастройки); КонецЕсли; КонецПроцедуры @@ -78,16 +72,17 @@ &НаКлиенте Процедура ПереключательОчищаемыеНастройкиПриИзменении(Элемент) - Если ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям" - И КоличествоПользователей > 1 - Или ПереключательКомуОчищатьНастройки = "ВсемПользователям" Тогда - ПереключательОчищаемыеНастройки = "ОчиститьВсе"; - Элементы.ВыбратьНастройки.Доступность = Ложь; - ПоказатьПредупреждение(,НСтр("ru = 'Очистка отдельных настроек доступна только при выборе одного пользователя.'")); - ИначеЕсли ПереключательОчищаемыеНастройки = "ОчиститьВсе" Тогда - Элементы.ВыбратьНастройки.Доступность = Ложь; + Если ПереключательОчищаемыеНастройки = "ОтдельныеНастройки" Тогда + Если ПереключательКомуОчищатьНастройки <> "ВыбраннымПользователям" + Или КоличествоПользователей <> 1 Тогда + ПереключательОчищаемыеНастройки = "ОчиститьВсе"; + Элементы.ВыбратьНастройки.Доступность = Ложь; + ПоказатьПредупреждение(,НСтр("ru = 'Очистка отдельных настроек доступна только при выборе одного пользователя.'")); + Иначе + Элементы.ВыбратьНастройки.Доступность = Истина; + КонецЕсли; Иначе - Элементы.ВыбратьНастройки.Доступность = Истина; + Элементы.ВыбратьНастройки.Доступность = Ложь; КонецЕсли; КонецПроцедуры @@ -275,12 +270,20 @@ КонецЕсли; ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + ИначеЕсли ПереключательОчищаемыеНастройки = "ОчиститьВсе" Тогда ОчиститьВсеНастройки(); ТекстПояснения = НСтр("ru = 'Очищены все настройки %1'"); ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПояснениеУКогоОчищеныНастройки); ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + + ИначеЕсли ПереключательОчищаемыеНастройки = "УстаревшиеНастройки" Тогда + ОчиститьУстаревшиеНастройки(); + + ТекстПояснения = НСтр("ru = 'Очищены устаревшие настройки %1'"); + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПояснениеУКогоОчищеныНастройки); + ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); КонецЕсли; КоличествоНастроек = 0; @@ -357,7 +360,20 @@ КонецЕсли; - Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(МассивНастроек, Источники); + Обработки.НастройкиПользователей.УдалитьНастройкиПользователей(МассивНастроек, Источники,, Истина); + +КонецПроцедуры + +&НаСервере +Процедура ОчиститьУстаревшиеНастройки() + + Если ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям" Тогда + Источники = ПользователиКоторымОчищаютсяНастройки.МассивПользователей; + Иначе + Источники = Неопределено; + КонецЕсли; + + Обработки.НастройкиПользователей.УдалитьУстаревшиеНастройкиПользователей(Источники); КонецПроцедуры diff --git a/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl index bb16bd944..e66cde900 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/ManagerModule.bsl @@ -66,9 +66,9 @@ Функция ФормыОбъектовМетаданных() СписокФорм = Новый СписокЗначений; - + КартинкаФорма = БиблиотекаКартинок.Форма; Для Каждого Форма Из Метаданные.ОбщиеФормы Цикл - СписокФорм.Добавить("ОбщаяФорма." + Форма.Имя, Форма.Синоним, Ложь, БиблиотекаКартинок.Форма); + СписокФорм.Добавить("ОбщаяФорма." + Форма.Имя, Форма.Синоним, Ложь, КартинкаФорма); КонецЦикла; ИменаСтандартныхФорм = Новый СписокЗначений; @@ -329,8 +329,11 @@ // очистить. Например, НастройкиОтчетов или НастройкиВнешнегоВида. // Источники - Массив - где элемент массива - Справочник.ПользовательСсылка. Массив пользователей, // у которых необходимо очистить настройки. +// ТаблицаПользовательскихВариантовОтчетов - ТаблицаЗначений +// ОчиститьВсе - Булево // -Процедура УдалитьНастройкиПользователей(ОчищаемыеНастройки, Источники, ТаблицаПользовательскихВариантовОтчетов = Неопределено) Экспорт +Процедура УдалитьНастройкиПользователей(ОчищаемыеНастройки, Источники, + ТаблицаПользовательскихВариантовОтчетов = Неопределено, ОчиститьВсе = Ложь) Экспорт СоответствиеНастройкаХранилище = Новый Соответствие; СоответствиеНастройкаХранилище.Вставить("НастройкиОтчетов", ХранилищеПользовательскихНастроекОтчетов); @@ -358,9 +361,10 @@ Для Каждого ПрочаяНастройка Из ПрочиеНастройкиПользователей Цикл ПрочиеНастройкиСтруктура = Новый Структура; Если ПрочаяНастройка.Ключ = "НастройкаБыстрогоДоступа" Тогда - СписокНастроек = ПрочаяНастройка.Значение.СписокНастроек; + СписокНастроек = ПрочаяНастройка.Значение.СписокНастроек; // ТаблицаЗначений Для Каждого Элемент Из СписокНастроек Цикл - Ключи.Добавить(Элемент.Объект, Элемент.Идентификатор); + Идентификатор = Элемент.Идентификатор; // Строка + Ключи.Добавить(Элемент.Объект, Идентификатор); КонецЦикла; ПрочиеНастройкиСтруктура.Вставить("ИдентификаторНастройки", "НастройкаБыстрогоДоступа"); ПрочиеНастройкиСтруктура.Вставить("ЗначениеНастройки", Ключи); @@ -411,9 +415,12 @@ НастройкиИзХранилища = СписокНастроек(ПользовательИБ, МенеджерНастроек, ОчищаемаяНастройка); УдалитьНастройки(МенеджерНастроек, НастройкиИзХранилища, ПользовательИБ); + Если ОчиститьВсе Тогда + ХранилищеСистемныхНастроек.Удалить(Неопределено, Неопределено, ПользовательИБ); + КонецЕсли; + ПользователиСлужебный.УстановитьНачальныеНастройки(ПользовательИБ, ТипЗнч(Источник) = Тип("СправочникСсылка.ВнешниеПользователи")); - КонецЦикла; КонецЦикла; @@ -430,6 +437,123 @@ КонецПроцедуры +// Удаляет настройки пользователей из хранилища. +// +// Параметры: +// Источники - Массив - где элемент массива - Справочник.ПользовательСсылка. Массив пользователей, +// у которых необходимо очистить настройки. +// +Процедура УдалитьУстаревшиеНастройкиПользователей(Источники = Неопределено) Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("ИменаОбъектов", Новый Соответствие); + Контекст.Вставить("ИменаТиповОбъектов", ИменаТиповОбъектов()); + + Хранилище = ХранилищеСистемныхНастроек; + + Если Источники = Неопределено Тогда + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + ИменаПользователейИБ = Новый Соответствие; + ИменаПользователейИБ.Вставить("", Истина); + Для Каждого ПользовательИБ Из ПользователиИБ Цикл + ИменаПользователейИБ.Вставить(ВРег(ПользовательИБ.Имя), Истина); + КонецЦикла; + Выборка = Хранилище.Выбрать(); + Пока СледующаяНастройка(Выборка, "ПриОшибкеУдалить", Хранилище) Цикл + Если ИменаПользователейИБ.Получить(ВРег(Выборка.Пользователь)) = Неопределено Тогда + Хранилище.Удалить(Выборка.КлючОбъекта, Выборка.КлючНастроек, Выборка.Пользователь); + Продолжить; + КонецЕсли; + УдалитьУстаревшуюНастройку(Выборка, Хранилище, Контекст); + КонецЦикла; + Иначе + Для Каждого Источник Из Источники Цикл + ИмяПользователяИБ = ИмяПользователяИБ(Источник); + Отбор = Новый Структура("Пользователь", ИмяПользователяИБ); + Выборка = Хранилище.Выбрать(Отбор); + Пока СледующаяНастройка(Выборка, "ПриОшибкеУдалить", Хранилище) Цикл + УдалитьУстаревшуюНастройку(Выборка, Хранилище, Контекст); + КонецЦикла; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Для процедуры УдалитьУстаревшиеНастройкиПользователей. +Функция ИменаТиповОбъектов() + + ИменаТиповРусский = "ПланОбмена,КритерийОтбора,Константа,Справочник, + |Последовательность,Документ,ЖурналДокументов,Перечисление,ПланВидовХарактеристик, + |ПланСчетов,ПланВидовРасчета,РегистрСведений,РегистрНакопления, + |РегистрБухгалтерии,РегистрРасчета,БизнесПроцесс,Задача"; // @Non-NLS + + ИменаТиповАнглийский = "ExchangePlan,FilterCriterion,Constant,Catalog, + |Sequence,Document,DocumentJournal,Enum,ChartOfCharacteristicTypes, + |ChartOfAccounts,ChartOfCalculationTypes,InformationRegister,AccumulationRegister, + |AccountingRegister,CalculationRegister,BusinessProcess,Task"; + + Имена = Новый Соответствие; + + ЯзыкРусский = Метаданные.ВариантВстроенногоЯзыка + = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский; + + ДобавитьИменаТиповОбъектов(Имена, ИменаТиповРусский, ЯзыкРусский); + ДобавитьИменаТиповОбъектов(Имена, ИменаТиповАнглийский, Не ЯзыкРусский); + + Возврат Имена; + +КонецФункции + +// Для функции ИменаТиповОбъектов. +Процедура ДобавитьИменаТиповОбъектов(Имена, СтрокаИмен, Значение) + + ИменаИзСтроки = СтрРазделить(СтрокаИмен, ",", Ложь); + Для Каждого Имя Из ИменаИзСтроки Цикл + Имена.Вставить(ВРег(Имя), Значение); + КонецЦикла; + +КонецПроцедуры + +// Для процедуры УдалитьУстаревшиеНастройкиПользователей. +Процедура УдалитьУстаревшуюНастройку(Выборка, Хранилище, Контекст) + + ПолноеИмяОбъекта = СтрРазделить(Выборка.КлючОбъекта, "/")[0]; + ЧастиИмени = СтрРазделить(ПолноеИмяОбъекта, ".", Ложь); + Если ЧастиИмени.Количество() < 2 Тогда + Возврат; + КонецЕсли; + + ТипОбъектовПоддерживается = Контекст.ИменаТиповОбъектов.Получить(ВРег(ЧастиИмени[0])); + Если ТипОбъектовПоддерживается = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ЧастиИмени.Количество() > 3 + И ( ВРег(ЧастиИмени[2]) = ВРег("Форма") // @Non-NLS + Или ВРег(ЧастиИмени[2]) = ВРег("Form")) Тогда + + ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1] + + "." + ЧастиИмени[2] + "." + ЧастиИмени[3]; + + ИначеЕсли ЧастиИмени.Количество() > 2 Тогда + ПолноеИмяОбъекта = ЧастиИмени[0] + "." + ЧастиИмени[1]; + КонецЕсли; + + Если ТипОбъектовПоддерживается Тогда + ИмяОбъектаКорректно = Контекст.ИменаОбъектов.Получить(ВРег(ПолноеИмяОбъекта)); + Если ИмяОбъектаКорректно = Неопределено Тогда + ИмяОбъектаКорректно = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта) <> Неопределено; + Контекст.ИменаОбъектов.Вставить(ВРег(ПолноеИмяОбъекта), ИмяОбъектаКорректно); + КонецЕсли; + Если ИмяОбъектаКорректно Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Хранилище.Удалить(Выборка.КлючОбъекта, Выборка.КлючНастроек, Выборка.Пользователь); + +КонецПроцедуры + // Выполняет копирование настроек пользователя с возвратом признака о наличии настроек. // // Параметры: @@ -477,9 +601,10 @@ Для Каждого ПрочаяНастройка Из ПрочиеНастройкиПользователей Цикл ПрочиеНастройкиСтруктура = Новый Структура; Если ПрочаяНастройка.Ключ = "НастройкаБыстрогоДоступа" Тогда - СписокНастроек = ПрочаяНастройка.Значение.СписокНастроек; + СписокНастроек = ПрочаяНастройка.Значение.СписокНастроек; // ТаблицаЗначений Для Каждого Элемент Из СписокНастроек Цикл - Ключи.Добавить(Элемент.Объект, Элемент.Идентификатор); + Идентификатор = Элемент.Идентификатор; // Строка + Ключи.Добавить(Элемент.Объект, Идентификатор); КонецЦикла; ПрочиеНастройкиСтруктура.Вставить("ИдентификаторНастройки", "НастройкаБыстрогоДоступа"); ПрочиеНастройкиСтруктура.Вставить("ЗначениеНастройки", Ключи); @@ -582,12 +707,7 @@ ВыборкаНастроек = МенеджерНастроек.Выбрать(Отбор); - Пропустить = Ложь; - Пока СледующаяНастройка(ВыборкаНастроек, Пропустить) Цикл - - Если Пропустить Тогда - Продолжить; - КонецЕсли; + Пока СледующаяНастройка(ВыборкаНастроек) Цикл Если Не ПолучитьИзбранное И СтрНайти(ВыборкаНастроек.КлючОбъекта, "ИзбранноеРаботыПользователя") <> 0 Тогда @@ -641,16 +761,35 @@ КонецФункции -Функция СледующаяНастройка(ВыборкаНастроек, Пропустить) +Функция СледующаяНастройка(Выборка, ОбработкаОшибок = "ПриОшибкеПропустить", Хранилище = Неопределено) - Попытка - Пропустить = Ложь; - Возврат ВыборкаНастроек.Следующий(); + ТекущийКлюч = Выборка.КлючОбъекта + " " + Выборка.КлючНастроек; + + ЕстьОшибка = Ложь; + Попытка + ЕстьСледующий = Выборка.Следующий(); Исключение - Пропустить = Истина; - Возврат Истина; + ЕстьОшибка = Истина; КонецПопытки; + СледующийКлюч = Выборка.КлючОбъекта + " " + Выборка.КлючНастроек; + Если ЕстьОшибка Тогда + ЕстьСледующий = ТекущийКлюч <> СледующийКлюч; + КонецЕсли; + + Если Не ЕстьСледующий Или Не ЕстьОшибка Тогда + Возврат ЕстьСледующий; + КонецЕсли; + + Если ОбработкаОшибок = "ПриОшибкеПропустить" Тогда + Возврат СледующаяНастройка(Выборка, ОбработкаОшибок, Хранилище); + ИначеЕсли ОбработкаОшибок = "ПриОшибкеУдалить" Тогда + Хранилище.Удалить(Выборка.КлючОбъекта, Выборка.КлючНастроек, Выборка.Пользователь); + Возврат СледующаяНастройка(Выборка, ОбработкаОшибок, Хранилище); + КонецЕсли; + + Возврат ЕстьСледующий; + КонецФункции // Копирует пользовательские настройки. @@ -1689,13 +1828,8 @@ Отбор = Новый Структура; Отбор.Вставить("Пользователь", Пользователь); - Пропустить = Ложь; ВыборкаНастроек = МенеджерНастроек.Выбрать(Отбор); - Пока СледующаяНастройка(ВыборкаНастроек, Пропустить) Цикл - - Если Пропустить Тогда - Продолжить; - КонецЕсли; + Пока СледующаяНастройка(ВыборкаНастроек) Цикл НоваяСтрока = Настройки.Добавить(); НоваяСтрока.КлючОбъекта = ВыборкаНастроек.КлючОбъекта; @@ -1912,6 +2046,8 @@ ХранилищеПользовательскихНастроекОтчетов, Параметры.ПользовательИнформационнойБазы); ТекущийОбъект = Неопределено; + КартинкаОтчет = БиблиотекаКартинок.Отчет; + КартинкаФорма = БиблиотекаКартинок.Форма; Для Каждого Настройка Из Настройки Цикл НастройкаОбъект = Настройка.КлючОбъекта; @@ -1951,7 +2087,7 @@ Если ТекущийОбъект <> ПредставлениеВариантаОтчета Тогда НоваяСтрокаВариантОтчета = Параметры.НастройкиОтчетовДерево.Строки.Добавить(); НоваяСтрокаВариантОтчета.Настройка = ПредставлениеВариантаОтчета; - НоваяСтрокаВариантОтчета.Картинка = БиблиотекаКартинок.Отчет; + НоваяСтрокаВариантОтчета.Картинка = КартинкаОтчет; НоваяСтрокаВариантОтчета.Тип = ?(НайденныйВариантОтчета <> Неопределено, ?(Не НайденныйВариантОтчета.СтандартнаяОбработка, "ВариантЛичный", "СтандартныйВариантЛичный"), "СтандартныйВариантОтчета"); @@ -1960,7 +2096,7 @@ // Заполняем строку настройки НоваяСтрокаНастройка = НоваяСтрокаВариантОтчета.Строки.Добавить(); НоваяСтрокаНастройка.Настройка = ?(Не ПустаяСтрока(НазваниеНастройки), НазваниеНастройки, ПредставлениеВариантаОтчета); - НоваяСтрокаНастройка.Картинка = БиблиотекаКартинок.Форма; + НоваяСтрокаНастройка.Картинка = КартинкаФорма; НоваяСтрокаНастройка.Тип = ?(НайденныйВариантОтчета <> Неопределено, ?(Не НайденныйВариантОтчета.СтандартнаяОбработка, "НастройкаЛичная", "СтандартнаяНастройкаЛичная"), "НастройкаСтандартногоОтчета"); @@ -1996,7 +2132,7 @@ НоваяСтрокаВариантОтчета = Параметры.НастройкиОтчетовДерево.Строки.Добавить(); // СтрокаДереваЗначений НоваяСтрокаВариантОтчета.Настройка = ВариантОтчета.Представление; - НоваяСтрокаВариантОтчета.Картинка = БиблиотекаКартинок.Отчет; + НоваяСтрокаВариантОтчета.Картинка = КартинкаОтчет; НоваяСтрокаВариантОтчета.Ключи.Добавить(ВариантОтчета.КлючОбъекта + "/" + ВариантОтчета.КлючВарианта); НоваяСтрокаВариантОтчета.Тип = ?(Не ВариантОтчета.СтандартнаяОбработка, "ВариантЛичный", "СтандартныйВариантЛичный"); НоваяСтрокаВариантОтчета.ТипСтроки = "Отчет" + ВариантОтчета.Представление; @@ -2017,6 +2153,7 @@ ТекущийОбъект = Неопределено; НастройкиФорм = НастройкиВсехФорм(Параметры.ПользовательИнформационнойБазы); + КартинкаФорма = БиблиотекаКартинок.Форма; Для Каждого НастройкаФормы Из НастройкиФорм Цикл ИмяОбъектаМетаданных = СтрРазделить(НастройкаФормы.Значение, ".", Ложь); @@ -2033,14 +2170,14 @@ Если ИмяОбъектаМетаданных[0] = "ОбщаяФорма" Тогда НоваяСтрокаОбщиеФормы = Параметры.НастройкиВнешнегоВида.Строки.Добавить(); НоваяСтрокаОбщиеФормы.Настройка = НастройкаФормы.Представление; - НоваяСтрокаОбщиеФормы.Картинка = БиблиотекаКартинок.Форма; + НоваяСтрокаОбщиеФормы.Картинка = КартинкаФорма; ОбъединитьСпискиЗначений(НоваяСтрокаОбщиеФормы.Ключи, НастройкаФормы.СписокКлючей); НоваяСтрокаОбщиеФормы.Тип = "НастройкаВнешнегоВида"; НоваяСтрокаОбщиеФормы.ТипСтроки = "ОбщаяФорма" + ИмяОбъектаМетаданных[1]; ИначеЕсли ИмяОбъектаМетаданных[0] = "ХранилищеНастроек" Тогда НоваяСтрокаХранилищеНастроек = Параметры.НастройкиВнешнегоВида.Строки.Добавить(); НоваяСтрокаХранилищеНастроек.Настройка = НастройкаФормы.Представление; - НоваяСтрокаХранилищеНастроек.Картинка = БиблиотекаКартинок.Форма; + НоваяСтрокаХранилищеНастроек.Картинка = КартинкаФорма; ОбъединитьСпискиЗначений(НоваяСтрокаХранилищеНастроек.Ключи, НастройкаФормы.СписокКлючей); НоваяСтрокаХранилищеНастроек.ТипСтроки = "ХранилищеНастроек" + ИмяОбъектаМетаданных[2]; НоваяСтрокаХранилищеНастроек.Тип = "НастройкаВнешнегоВида"; @@ -2058,7 +2195,7 @@ // Элемент дерева настроек НоваяСтрокаВнешнегоВидаФорм = НоваяСтрокаОбъектМетаданных.Строки.Добавить(); НоваяСтрокаВнешнегоВидаФорм.Настройка = ПредставлениеОбъектаМетаданных[1]; - НоваяСтрокаВнешнегоВидаФорм.Картинка = БиблиотекаКартинок.Форма; + НоваяСтрокаВнешнегоВидаФорм.Картинка = КартинкаФорма; НоваяСтрокаВнешнегоВидаФорм.ТипСтроки = ИмяОбъектаМетаданных[1] + ИмяОбъектаМетаданных[2]; НоваяСтрокаВнешнегоВидаФорм.Тип = "НастройкаВнешнегоВида"; ОбъединитьСпискиЗначений(НоваяСтрокаВнешнегоВидаФорм.Ключи, НастройкаФормы.СписокКлючей); @@ -2090,7 +2227,7 @@ Иначе НоваяСтрокаВнешнегоВидаФорм.Настройка = ПредставлениеОбъектаМетаданных[1]; КонецЕсли; - НоваяСтрокаВнешнегоВидаФорм.Картинка = БиблиотекаКартинок.Форма; + НоваяСтрокаВнешнегоВидаФорм.Картинка = КартинкаФорма; НоваяСтрокаВнешнегоВидаФорм.ТипСтроки = ИмяОбъектаМетаданных[1] + ИмяФормы; НоваяСтрокаВнешнегоВидаФорм.Тип = "НастройкаВнешнегоВида"; ОбъединитьСпискиЗначений(НоваяСтрокаВнешнегоВидаФорм.Ключи, НастройкаФормы.СписокКлючей); @@ -2119,6 +2256,8 @@ Процедура ЗаполнитьСписокПрочихНастроек(Параметры) + // АПК:1391-выкл Поиск по представлению настройки, описываемой в коде. + Параметры.ПрочиеНастройкиДерево.Строки.Очистить(); Настройки = ЧтениеНастроекИзХранилища(ХранилищеОбщихНастроек, Параметры.ПользовательИнформационнойБазы); Ключи = Новый СписокЗначений; @@ -2224,7 +2363,7 @@ Ключи = Новый СписокЗначений; Если ПрочиеНастройки <> Неопределено Тогда - + КартинкаПрочиеПользовательскиеНастройки = БиблиотекаКартинок.ПрочиеПользовательскиеНастройки; Для Каждого ПрочаяНастройка Из ПрочиеНастройки Цикл Результат = ПрочаяНастройка.Значение; @@ -2253,7 +2392,7 @@ Настройка = Результат.НазваниеНастройки; Если Результат.КартинкаНастройки = "" Тогда - Картинка = БиблиотекаКартинок.ПрочиеПользовательскиеНастройки; + Картинка = КартинкаПрочиеПользовательскиеНастройки; Иначе Картинка = Результат.КартинкаНастройки; КонецЕсли; @@ -2288,6 +2427,8 @@ ДобавитьСтрокуДерева(Параметры.ПрочиеНастройкиДерево, Настройка, Картинка, ПрочиеКлючи, ТипНастройки); КонецЕсли; + // АПК:1391-вкл + КонецПроцедуры // Добавляет настройки. @@ -2298,12 +2439,16 @@ // Процедура ДобавитьНастройкиРабочегоСтолаИКомандногоИнтерфейса(Параметры, ДеревоНастроек) + // АПК:1391-выкл Поиск по представлению настройки, описываемой в коде. + Если Не ПустаяСтрока(Параметры.Поиск) Тогда Если СтрНайти(ВРег(НСтр("ru = 'Командный интерфейс и начальная страница'")), ВРег(Параметры.Поиск)) = 0 Тогда Возврат; КонецЕсли; КонецЕсли; + // АПК:1391-вкл + Настройки = ЧтениеНастроекИзХранилища(ХранилищеСистемныхНастроек, Параметры.ПользовательИнформационнойБазы); КлючиНастроекРабочегоСтола = Новый СписокЗначений; КлючиНастроекИнтерфейса = Новый СписокЗначений; diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl index 219320430..71babdbe2 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl @@ -11,8 +11,6 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - МакетПорядокОбновления = Неопределено; - БазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); Если БазаФайловая Тогда ИмяМакета = "ПорядокОбновленияДляФайловойБазы"; @@ -29,18 +27,12 @@ ЛокализованноеИмяМакета = ИмяМакета; КонецЕсли; - Макет = КоллекцияМакетов.Найти(ЛокализованноеИмяМакета); - Если Макет <> Неопределено Тогда - МакетПорядокОбновления = Обработки.НерекомендуемаяВерсияПлатформы.ПолучитьМакет(ЛокализованноеИмяМакета); - КонецЕсли; - + МакетПорядокОбновления = Обработки.НерекомендуемаяВерсияПлатформы.ПолучитьМакет(ЛокализованноеИмяМакета); Иначе МакетПорядокОбновления = Обработки.НерекомендуемаяВерсияПлатформы.ПолучитьМакет("ПорядокОбновленияДляКлиентСервернойБазы"); КонецЕсли; - Если МакетПорядокОбновления <> Неопределено Тогда - ПорядокОбновленияПлатформы = МакетПорядокОбновления.ПолучитьТекст(); - КонецЕсли; + ПорядокОбновленияПлатформы = МакетПорядокОбновления.ПолучитьТекст(); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl index 23dddb6c2..674b1b3ec 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Forms/ФормаВыбораИдентификаторовОбъектовМетаданных/Module.bsl @@ -11,7 +11,6 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - Параметры.ТекущаяСтрока = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту("ПолноеИмя", Параметры.ТекущаяСтрока); ТекстЗапроса = "ВЫБРАТЬ | СправочникИдентификаторыОбъектовМетаданных.Ссылка КАК Ссылка, diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Templates/cut_tags/Template.txt b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Templates/cut_tags/Template.txt index d19926d4c..5d66bbcf6 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Templates/cut_tags/Template.txt +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/Templates/cut_tags/Template.txt @@ -3,7 +3,7 @@ tags: - id: ИмяТэга description: Все что не входит в конфигурацию - begin: //++ ИмяТэга #как выглядит начало тэга в коде + begin: //++ ИмяТэга # как выглядит начало тэга в коде end: //-- ИмяТэга #как выглядит конец тэга в коде # Описание конфигураций для которых нужно вырезать, контролировать правильность расстановки и расставлять в коде @@ -13,7 +13,7 @@ tags: configurations: <КраткоеИмя>: - description: Вырезка конфигурации <КраткоеИмя> # произвольное имя конфигурации + description: Вырезка конфигурации <КраткоеИмя> # краткое описание конфигурации или произвольное имя конфигурации name: ИмяКонфигурации # имя конфигурации как в процедуре ОбновлениеИнформационнойБазы<КраткоеИмя>.ПриДобавленииПодсистемы module: ОбновлениеИнформационнойБазы<КраткоеИмя> # модуль обновления в котором размещена процедура ПриДобавленииОбработчиков diff --git a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo index f0025c335..118595f24 100644 --- a/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo +++ b/SSL/src/DataProcessors/ОписаниеОбработчиковОбновления/ОписаниеОбработчиковОбновления.mdo @@ -1322,7 +1322,7 @@ cut_tags ru - Cut tags + Cut_tags TextDocument diff --git a/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Form.form b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Form.form new file mode 100644 index 000000000..84b2057cb --- /dev/null +++ b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Form.form @@ -0,0 +1,454 @@ + + + + <key>ru</key> + <value>Запись узла</value> + + + ПанельОсновная + 1 + + СтраницаОжидание + 3 + + ГруппаОжидание + 17 + + Декорация1 + 33 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 34 + true + + true + true + + + CommonPicture.ДлительнаяОперация48 + + AsFileRef + + + + Декорация2 + 22 + + <key>ru</key> + <value>Выполняется запись узла синхронизации. +Пожалуйста, подождите...</value> + + true + true + + true + + + Декорация2РасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 23 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Ожидание</value> + + + ГруппаОжиданиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + Auto + WeakSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Страница ожидание</value> + + + СтраницаОжиданиеРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаОкончание + 5 + + ГруппаОкончание + 9 + + Декорация3 + 11 + true + true + + true + + + Декорация3РасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 12 + true + + 6 + true + 2 + true + + + CommonPicture.Успешно32 + + + + + ДекорацияУзелЗаписан + 14 + + <key>ru</key> + <value>Запись узла синхронизации выполнена</value> + + true + true + + true + + + ДекорацияУзелЗаписанРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ДекорацияУзелЗаписанКонтекстноеМеню + 15 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Окончание</value> + + + ГруппаОкончаниеРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + Auto + true + true + Auto + Auto + + + + КоманднаяПанельГотово + 36 + + КомандаГотово + 7 + + <key>ru</key> + <value>Готово</value> + + true + true + + true + + + КомандаГотовоРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.КомандаГотово + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель готово</value> + + + КоманднаяПанельГотовоРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Страница окончание</value> + + + СтраницаОкончаниеРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Панель основная</value> + + + ПанельОсновнаяРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + Pages + + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 40 + DontBlock + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.ОтложеннаяЗаписьУзла + + + true + + + true + +
          true
          +
          + + Узел + 2 + + ExchangePlanRef + + + true + + + true + + + + АдресСтруктурыУзла + 3 + + String + + + + true + + + true + + + + ЭтоУзелАРМ + 4 + + Boolean + + + true + + + true + + + + КомандаГотово + + <key>ru</key> + <value>Команда готово</value> + + 1 + + ru + Команда готово + + + true + + + + КомандаГотово + + + Auto + Auto + + + + + + +
          diff --git a/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Module.bsl new file mode 100644 index 000000000..2b6f50510 --- /dev/null +++ b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/Forms/Форма/Module.bsl @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Узел = Параметры.Узел; + АдресСтруктурыУзла = Параметры.АдресСтруктурыУзла; + + ЭтоУзелАРМ = ОбменДаннымиПовтИсп.ЭтоУзелАвтономногоРабочегоМеста(Узел); + + ШаблонЗаголовка = НСтр("ru = 'Запись узла ""%1""'"); + Заголовок = СтрШаблон(ШаблонЗаголовка, Строка(Узел)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ДлительнаяОперация = НачатьВыполнениеПроцедуры(); + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультат", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания()); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура КомандаГотово(Команда) + Закрыть(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Функция ПараметрыОжидания() + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ТекстСообщения = ""; + ПараметрыОжидания.ВыводитьПрогрессВыполнения = Ложь; + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ПараметрыОжидания.ВыводитьСообщения = Ложь; + Возврат ПараметрыОжидания; + +КонецФункции + +&НаСервере +Функция НачатьВыполнениеПроцедуры() + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры(); + ШаблонНаименования = НСтр("ru = '""Длительная запись узла """"%1""""'"); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = СтрШаблон(ШаблонНаименования, Строка(Узел)); + ПараметрыВыполнения.КлючФоновогоЗадания = "ОтложеннаяЗаписьУзла"; + + СтруктураУзла = ПолучитьИзВременногоХранилища(АдресСтруктурыУзла); + Возврат ДлительныеОперации.ВыполнитьПроцедуру(ПараметрыВыполнения, "Обработки.ОтложеннаяЗаписьУзла.ЗаписатьУзел", Узел, СтруктураУзла); + +КонецФункции + +&НаКлиенте +Процедура ОбработатьРезультат(Результат, ДополнительныеПараметры) Экспорт + + Если Результат.Статус = "Выполнено" Тогда + + Элементы.ПанельОсновная.ТекущаяСтраница = Элементы.СтраницаОкончание; + + Если ЭтоУзелАРМ Тогда + Оповестить("Запись_АвтономноеРабочееМесто"); + Иначе + Оповестить("Запись_УзелПланаОбмена"); + КонецЕсли; + + ИначеЕсли Результат.Статус = "Ошибка" Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(Результат.КраткоеПредставлениеОшибки); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/ManagerModule.bsl b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/ManagerModule.bsl new file mode 100644 index 000000000..bb39430f1 --- /dev/null +++ b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/ManagerModule.bsl @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +Процедура ЗаписатьУзел(Узел, УзелПередЗаписью) Экспорт + + УзелОбъект = Узел.ПолучитьОбъект(); + + Для Каждого КлючИЗначение Из УзелПередЗаписью Цикл + + Ключ = КлючИЗначение.Ключ; + Значение = КлючИЗначение.Значение; + + Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда + УзелОбъект[Ключ].Загрузить(Значение); + Иначе + УзелОбъект[Ключ] = Значение; + КонецЕсли; + + КонецЦикла; + + НачатьТранзакцию(); + + Попытка + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(Узел)); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Узел); + Блокировка.Заблокировать(); + + УзелОбъект.ДополнительныеСвойства.Вставить("ОтложеннаяЗаписьУзла"); + УзелОбъект.Записать(); + + Отказ = Ложь; + ОбменДаннымиСервер.ФормаУзлаПриЗаписиНаСервере(УзелОбъект, Отказ); + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; + +КонецПроцедуры + + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/ОтложеннаяЗаписьУзла.mdo b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/ОтложеннаяЗаписьУзла.mdo new file mode 100644 index 000000000..e2d9f785e --- /dev/null +++ b/SSL/src/DataProcessors/ОтложеннаяЗаписьУзла/ОтложеннаяЗаписьУзла.mdo @@ -0,0 +1,23 @@ + + + + + + + ОтложеннаяЗаписьУзла + + ru + Отложенная запись узла + + true + DataProcessor.ОтложеннаяЗаписьУзла.Form.Форма + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl index 0225cd67f..d20cd871f 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl @@ -259,7 +259,7 @@ // Сохраняет настройки регламентного задания. // // Параметры: -// Задание - РегламентноеЗадание.ЭкспортОценкиПроизводительности. +// Задание - ОбъектМетаданныхРегламентноеЗадание // &НаСервереБезКонтекста Процедура ЗафиксироватьРегламентноеЗадание(Задание) diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Module.bsl deleted file mode 100644 index 4f8fed253..000000000 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Module.bsl +++ /dev/null @@ -1,66 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2021, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - КлючеваяОперация = Параметры.НастройкиИстории.КлючеваяОперация; - ДатаНачала = Параметры.НастройкиИстории.ДатаНачала; - ДатаОкончания = Параметры.НастройкиИстории.ДатаОкончания; - Приоритет = КлючеваяОперация.Приоритет; - ЦелевоеВремя = КлючеваяОперация.ЦелевоеВремя; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("КлючеваяОперация", КлючеваяОперация); - Запрос.УстановитьПараметр("ДатаНачала", (ДатаНачала - Дата(1,1,1)) * 1000); - Запрос.УстановитьПараметр("ДатаОкончания", (ДатаОкончания - Дата(1,1,1)) * 1000); - - Запрос.Текст = - "ВЫБРАТЬ - | ЗамерыВремени.Пользователь КАК Пользователь, - | ЗамерыВремени.ВремяВыполнения КАК Длительность, - | ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1), СЕКУНДА, (ЗамерыВремени.ДатаНачалаЗамера/1000) - 63555667200) КАК ВремяОкончания - |ИЗ - | РегистрСведений.ЗамерыВремени КАК ЗамерыВремени - |ГДЕ - | ЗамерыВремени.КлючеваяОперация = &КлючеваяОперация - | И ЗамерыВремени.ДатаНачалаЗамера МЕЖДУ &ДатаНачала И &ДатаОкончания - |УПОРЯДОЧИТЬ ПО - | ВремяОкончания"; - - Результат = Запрос.Выполнить(); - Выборка = Результат.Выбрать(); - КоличествоЗамеровЧисло = Выборка.Количество(); - КоличествоЗамеров = Строка(КоличествоЗамеровЧисло) + ?(КоличествоЗамеровЧисло < 100, " (недостаточно)", ""); - - Пока Выборка.Следующий() Цикл - - СтрокаИстории = История.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаИстории, Выборка); - - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыИстория - -// Запрещает редактирование ключевой операции из формы обработки -// т.к. могут пострадать внутренние механизмы. -// -&НаКлиенте -Процедура КлючеваяОперацияОткрытие(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Form.form deleted file mode 100644 index 66d97c283..000000000 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Form.form +++ /dev/null @@ -1,1371 +0,0 @@ - - - - Настройки - 57 - - НастройкаПериода - 99 - - ДатаНачала - 69 - true - true - - true - - - Объект.ДатаНачала - - - ДатаНачалаExtendedTooltip - 78 - Label - true - true - - Left - - - - ДатаНачалаКонтекстноеМеню - 70 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - ДатаОкончания - 71 - true - true - - true - - - Объект.ДатаОкончания - - - ДатаОкончанияExtendedTooltip - 79 - Label - true - true - - Left - - - - ДатаОкончанияКонтекстноеМеню - 72 - true - - InputField - Enter - true - Left - true - - - ChoiceProcessing - ДатаОкончанияОбработкаВыбора - - true - true - true - true - true - true - Normal - - - - Шаг - 4 - true - true - - true - - - Объект.Шаг - - - ШагExtendedTooltip - 80 - Label - true - true - - Left - - - - ШагКонтекстноеМеню - 5 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - true - true - - - Час - - - - - День - - - - - Неделя - - - - - ru - Месяц (30 дней) - - - Месяц - - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Настройка периода</value> - - - НастройкаПериодаРасширеннаяПодсказка - 100 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - WeakSeparation - true - true - Auto - - - - НастройкаКомментарий - 101 - - Комментарий - 103 - true - true - - true - - - Объект.Комментарий - - - КомментарийРасширеннаяПодсказка - 105 - Label - true - true - - Left - - - - КомментарийКонтекстноеМеню - 104 - true - - InputField - Enter - true - Left - true - - - StartChoice - КомментарийНачалоВыбора - - - ChoiceProcessing - КомментарийОбработкаВыбора - - true - true - true - true - true - true - true - Normal - - - - ВариантФильтраКомментарий - 106 - - <key>ru</key> - <value>Вариант фильтра</value> - - true - true - - true - - - Объект.ВариантФильтраКомментарий - - - ВариантФильтраКомментарийРасширеннаяПодсказка - 108 - Label - true - true - - Left - - - - ВариантФильтраКомментарийКонтекстноеМеню - 107 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - - - ru - Не фильтровать - - - НеФильтровать - - - - - ru - Равен - - - Равен - - - - - ru - Содержит - - - Содержит - - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Настройка комментарий</value> - - - НастройкаКомментарийРасширеннаяПодсказка - 102 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - WeakSeparation - true - true - Auto - - - true - true - - true - - - <key>ru</key> - <value>Настройки отбора замеров</value> - - - НастройкиExtendedTooltip - 77 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - WeakSeparation - true - true - auto - Auto - Auto - - - - Форма - 18 - - СтраницаТаблица - 19 - - Производительность - 23 - - <key>ru</key> - <value>Производительность</value> - - true - true - - true - - - Объект.Производительность - - None - Add - CancelSearch - Change - Copy - CopyToClipboard - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - КлючеваяОперация - 28 - - <key>ru</key> - <value>Ключевая операция</value> - - true - true - - true - - - Объект.Производительность.КлючеваяОперация - - - КлючеваяОперацияExtendedTooltip - 88 - Label - true - true - - Left - - - - КлючеваяОперацияКонтекстноеМеню - 29 - true - - InputField - true - false - Auto - true - Left - true - - true - true - true - false - false - true - true - true - Normal - - - - Приоритет - 67 - true - true - - true - - - Объект.Производительность.Приоритет - - - ПриоритетExtendedTooltip - 89 - Label - true - true - - Left - - - - ПриоритетКонтекстноеМеню - 68 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ЦелевоеВремя - 30 - - <key>ru</key> - <value>Целевое время</value> - - true - true - - true - - - Объект.Производительность.ЦелевоеВремя - - - OnChange - ЦелевоеВремяПриИзменении - - - ЦелевоеВремяExtendedTooltip - 90 - Label - true - true - - Left - - - - ЦелевоеВремяКонтекстноеМеню - 31 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПроизводительностьКоманднаяПанель - 25 - - ПроизводительностьДобавитьКлючевуюОперацию - 95 - true - true - - true - - - ПроизводительностьДобавитьКлючевуюОперациюРасширеннаяПодсказка - 96 - Label - true - true - - Left - - - Form.Command.ДобавитьКлючевуюОперацию - Normal - Picture - true - true - UserCmds - - StdPicture.CreateListItem - - Auto - - - ПроизводительностьУдалитьКлючевуюОперацию - 97 - true - true - - true - - - ПроизводительностьУдалитьКлючевуюОперациюРасширеннаяПодсказка - 98 - Label - true - true - - Left - - - Form.Command.УдалитьКлючевуюОперацию - Normal - Auto - true - true - UserCmds - - StdPicture.Delete - - Auto - - - ПроизводительностьПереместитьВверх - 63 - true - true - - true - - - ПроизводительностьПереместитьВверхExtendedTooltip - 84 - Label - true - true - - Left - - - Form.Command.ПереместитьВверх - Normal - Picture - true - true - UserCmds - - StdPicture.MoveUp - - Auto - - - ПроизводительностьПереместитьВниз - 64 - true - true - - true - - - ПроизводительностьПереместитьВнизExtendedTooltip - 85 - Label - true - true - - Left - - - Form.Command.ПереместитьВниз - Normal - Picture - true - true - UserCmds - - StdPicture.MoveDown - - Auto - - - ПроизводительностьУстановитьОтбор - 74 - true - true - - true - - - ПроизводительностьУстановитьОтборExtendedTooltip - 86 - Label - true - true - - Left - - - Form.Command.УстановитьОтбор - Normal - Auto - true - true - UserCmds - - StdPicture.FilterCriterion - - Auto - - Left - true - - - Selection - ПроизводительностьВыбор - - - OnStartEdit - ПроизводительностьПриНачалеРедактирования - - - ПроизводительностьSearchString - 109 - - ПроизводительностьSearchStringExtendedTooltip - 111 - Label - true - true - - Left - - - - ПроизводительностьSearchStringContextMenu - 110 - true - - Производительность - - true - - - - ПроизводительностьViewStatus - 112 - - ПроизводительностьViewStatusExtendedTooltip - 114 - Label - true - true - - Left - - - - ПроизводительностьViewStatusContextMenu - 113 - true - - ViewStatusAddition - Производительность - - true - - - - ПроизводительностьSearchControl - 115 - - ПроизводительностьSearchControlExtendedTooltip - 117 - Label - true - true - - Left - - - - ПроизводительностьSearchControlContextMenu - 116 - true - - SearchControlAddition - Производительность - - true - - - - ПроизводительностьExtendedTooltip - 87 - Label - true - true - - Left - - - - ПроизводительностьКонтекстноеМеню - 24 - - ПроизводительностьКонтекстноеМенюУказатьAPDEX - 73 - - <key>ru</key> - <value>Вычислить целевое время из APDEX</value> - - true - true - - true - - - ПроизводительностьКонтекстноеМенюУказатьAPDEXExtendedTooltip - 83 - Label - true - true - - Left - - - Form.Command.УказатьAPDEX - Normal - PictureAndText - true - true - UserCmds - - StdPicture.ReportSettings - - Auto - - - true - true - true - true -
          true
          - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - -
          - true - true - - true - - - <key>ru</key> - <value>Таблица</value> - - - СтраницаТаблицаExtendedTooltip - 82 - Label - true - true - - Left - - - Page - - Vertical - auto - false - -
          - - СтраницаДиаграмма - 20 - - Диаграмма - 21 - - <key>ru</key> - <value>Диаграмма:</value> - - true - true - - true - - - Объект.Диаграмма - - - ДиаграммаExtendedTooltip - 92 - Label - true - true - - Left - - - - ДиаграммаКонтекстноеМеню - 22 - true - - ChartField - Enter - true - Left - true - - 50 - true - 10 - true - true - true - - - true - true - - true - - - <key>ru</key> - <value>Диаграмма</value> - - - СтраницаДиаграммаExtendedTooltip - 91 - Label - true - true - - Left - - - Page - - Vertical - auto - false - - - true - true - - true - - - <key>ru</key> - <value>Форма</value> - - - ФормаExtendedTooltip - 81 - Label - true - true - - Left - - - Pages - - - OnCurrentPageChange - ФормаПриСменеСтраницы - - TabsOnTop - Auto - -
          - - ФормаКоманднаяПанель - -1 - - ПроизводительностьОбновить - 39 - - <key>ru</key> - <value>Обновить показатели производительности</value> - - true - true - - true - - - ПроизводительностьОбновитьExtendedTooltip - 75 - Label - true - true - - Left - - - Form.Command.Обновить - PictureAndText - true - true - true - UserCmds - - StdPicture.Refresh - - Auto - - - ФормаНастройка - 66 - - <key>ru</key> - <value>Настройка...</value> - - true - true - - true - - - ФормаНастройкаExtendedTooltip - 76 - Label - true - true - - Left - - - Form.Command.Настройка - Normal - Auto - true - true - UserCmds - - StdPicture.ListSettings - - Auto - InAdditionalSubmenu - - - ФормаЭкспортЗамеров - 118 - true - true - - true - - - ФормаЭкспортЗамеровРасширеннаяПодсказка - 119 - Label - true - true - - Left - - - Form.Command.ЭкспортЗамеров - Normal - Auto - true - true - UserCmds - - StdPicture.CreateInitialImage - - Auto - InAdditionalSubmenu - - Left - true - - - ChoiceProcessing - ОбработкаВыбора - - - OnOpen - ПриОткрытии - - - OnCreateAtServer - ПриСозданииНаСервере - - RestoreValues - SaveValues - DontBlock - Use - UseList - true - true - true - Vertical - true - auto - true - - Объект - 1 - - DataProcessorObject.ОценкаПроизводительности - - - true - - - true - - - Объект.ВариантФильтраКомментарий - - - Объект.ДатаНачала - - - Объект.ДатаОкончания - - - Объект.Комментарий - - - Объект.Шаг - -
          true
          -
          - - ТаблицаОбновлена - 2 - - Boolean - - - true - - - true - - - - ДиаграммаОбновлена - 3 - - Boolean - - - true - - - true - - - - ЕстьБСП - 4 - - Boolean - - - true - - - true - - - - Обновить - - <key>ru</key> - <value>Обновить</value> - - 1 - - ru - Обновить - - - true - - - - Обновить - - - DontUse - Auto - - - ПереместитьВверх - - <key>ru</key> - <value>Переместить вверх</value> - - 2 - - ru - Переместить вверх - - - true - - - - ПереместитьВверх - - - DontUse - Auto - - - ПереместитьВниз - - <key>ru</key> - <value>Переместить вниз</value> - - 3 - - ru - Переместить вниз - - - true - - - - ПереместитьВниз - - - DontUse - Auto - - - Настройка - - <key>ru</key> - <value>Настройка</value> - - 5 - - ru - Настройка - - - true - - - - Настройка - - - DontUse - Auto - - - УказатьAPDEX - - <key>ru</key> - <value>Указать APDEX</value> - - 6 - - ru - Указать APDEX - - - true - - - - УказатьAPDEX - - - DontUse - Auto - - - УстановитьОтбор - - <key>ru</key> - <value>Установить отбор</value> - - 7 - - ru - Установить отбор - - - true - - - - УстановитьОтбор - - - DontUse - Auto - - - ДобавитьКлючевуюОперацию - - <key>ru</key> - <value>Добавить ключевую операцию</value> - - 8 - - ru - Добавить ключевую операцию - - - true - - - - ДобавитьКлючевуюОперацию - - - DontUse - Auto - - - УдалитьКлючевуюОперацию - - <key>ru</key> - <value>Удалить ключевую операцию</value> - - 9 - - ru - Удалить ключевую операцию - - - true - - - - УдалитьКлючевуюОперацию - - - DontUse - Auto - - - ЭкспортЗамеров - - <key>ru</key> - <value>Экспорт замеров</value> - - 4 - - ru - Экспорт замеров - - - true - - - - ЭкспортЗамеров - - - DontUse - Auto - - - - - - -
          diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl deleted file mode 100644 index 6f614239c..000000000 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl +++ /dev/null @@ -1,1298 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2021, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область ОбработчикиСобытийФормы - -// Процедура загружает настройки ТЧ, если это первое открытие -// то в ТЧ добавляются все ключевые операции из справочника. -// -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если НЕ ОценкаПроизводительностиСлужебный.ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда - ЕстьБСП = Ложь; - Иначе - ЕстьБСП = Истина; - КонецЕсли; - - ОбщаяПроизводительностьСистемы = ОценкаПроизводительностиСлужебный.ПолучитьЭлементОбщаяПроизводительностьСистемы(); - Если ОбщаяПроизводительностьСистемы.Пустая() Тогда - Объект.ОбщаяПроизводительностьСистемы = НСтр("ru = 'Общая производительность системы'"); - Иначе - Объект.ОбщаяПроизводительностьСистемы = ОбщаяПроизводительностьСистемы; - КонецЕсли; - - Попытка - ЗагружаемаяНастройка = ЗагрузитьКлючевыеОперации(Объект.ОбщаяПроизводительностьСистемы); - Объект.Производительность.Загрузить(ЗагружаемаяНастройка); - Исключение - ТекстСообщения = НСтр("ru = 'Не удалось загрузить настройки.'"); - ОценкаПроизводительностиСлужебный.СообщитьПользователю(ТекстСообщения); - КонецПопытки; - - Если ПустаяСтрока(Объект.ВариантФильтраКомментарий) Тогда - Объект.ВариантФильтраКомментарий = "НеФильтровать"; - КонецЕсли; - - УстановитьУсловноеОформление(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - ТаблицаОбновлена = Ложь; - ДиаграммаОбновлена = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.ОценкаПроизводительности.Форма.ФормаОтбора") Тогда - - Если ВыбранноеЗначение <> Неопределено Тогда - ОбновитьПоказатели(ВыбранноеЗначение); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура ПроизводительностьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) - - Если НЕ НоваяСтрока Тогда - Возврат; - КонецЕсли; - - ОткрытьФормуВыбора(); - -КонецПроцедуры - -&НаКлиенте -Процедура ФормаПриСменеСтраницы(Элемент, ТекущаяСтраница) - - Если Не ТаблицаОбновлена Или Не ДиаграммаОбновлена Тогда - Если Элементы.Форма.ТекущаяСтраница.Имя = "СтраницаДиаграмма" Тогда - ДиаграммаОбновлена = Истина; - ИначеЕсли Элементы.Форма.ТекущаяСтраница.Имя = "СтраницаТаблица" Тогда - ТаблицаОбновлена = Истина; - КонецЕсли; - ОбновитьПоказатели(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЦелевоеВремяПриИзменении(Элемент) - - ТД = Элементы.Производительность.ТекущиеДанные; - Если ТД = Неопределено Тогда - Возврат; - КонецЕсли; - - ИзменитьЦелевоеВремя(ТД.КлючеваяОперация, ТД.ЦелевоеВремя); - ОбновитьПоказатели(); - -КонецПроцедуры - -// Отображение истории выполнения ключевой операции. -// -&НаКлиенте -Процедура ПроизводительностьВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - СтрокаТЧ = Объект.Производительность.НайтиПоИдентификатору(ВыбраннаяСтрока); - - Если Не СтрНачинаетсяС(Поле.Имя, "Производительность") - Или СтрокаТЧ.КлючеваяОперация = Объект.ОбщаяПроизводительностьСистемы Тогда - Возврат; - КонецЕсли; - СтандартнаяОбработка = Ложь; - - НачалоПериода = 0; - ОкончаниеПериода = 0; - ИндексПериода = Число(Сред(Поле.Имя, 19)); - Если Не ВычислитьДатыВременногоОтрезка(НачалоПериода, ОкончаниеПериода, ИндексПериода) Тогда - Возврат; - КонецЕсли; - - НастройкиИстории = Новый Структура("КлючеваяОперация, ДатаНачала, ДатаОкончания", СтрокаТЧ.КлючеваяОперация, НачалоПериода, ОкончаниеПериода); - - ПараметрыОткрытия = Новый Структура("НастройкиИстории", НастройкиИстории); - ОткрытьФорму("Обработка.ОценкаПроизводительности.Форма.ИсторияВыполнения", ПараметрыОткрытия, ЭтотОбъект); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура Обновить(Команда) - - ОбновитьПоказатели(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПереместитьВверх(Команда) - - ТД = Элементы.Производительность.ТекущиеДанные; - Если ТД = Неопределено Тогда - Возврат; - КонецЕсли; - - Врем = Объект.Производительность; - ТекущийИндекс = Врем.Индекс(ТД); - - Если Врем.Количество() <= 1 - ИЛИ ТекущийИндекс = 0 - ИЛИ Врем[ТекущийИндекс - 1].КлючеваяОперация = Объект.ОбщаяПроизводительностьСистемы - ИЛИ ТД.КлючеваяОперация = Объект.ОбщаяПроизводительностьСистемы Тогда - Возврат; - КонецЕсли; - - НаправлениеСдвига = -1; - ВыполнитьСдвигСтроки(НаправлениеСдвига, ТекущийИндекс); - -КонецПроцедуры - -&НаКлиенте -Процедура ПереместитьВниз(Команда) - - ТД = Элементы.Производительность.ТекущиеДанные; - Если ТД = Неопределено Тогда - Возврат; - КонецЕсли; - - Врем = Объект.Производительность; - ТекущийИндекс = Врем.Индекс(ТД); - - Если Врем.Количество() <= 1 - ИЛИ ТекущийИндекс = Врем.Количество() - 1 - ИЛИ Врем[ТекущийИндекс + 1].КлючеваяОперация = Объект.ОбщаяПроизводительностьСистемы - ИЛИ ТД.КлючеваяОперация = Объект.ОбщаяПроизводительностьСистемы Тогда - Возврат; - КонецЕсли; - - НаправлениеСдвига = 1; - ВыполнитьСдвигСтроки(НаправлениеСдвига, ТекущийИндекс); - -КонецПроцедуры - -&НаКлиенте -Процедура Настройка(Команда) - - ОткрытьФорму("Обработка.ОценкаПроизводительности.Форма.АвтоматическийЭкспортЗамеровПроизводительности", , ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); - -КонецПроцедуры - -&НаКлиенте -Процедура УказатьAPDEX(Команда) - - СтрокаТЧ = Объект.Производительность.НайтиПоИдентификатору(Элементы.Производительность.ТекущаяСтрока); - Элемент = Элементы.Производительность.ТекущийЭлемент; - - Если Не СтрНачинаетсяС(Элемент.Имя, "Производительность") - ИЛИ СтрокаТЧ.КлючеваяОперация = Объект.ОбщаяПроизводительностьСистемы Тогда - Возврат; - КонецЕсли; - - Если СтрокаТЧ[Элемент.Имя] = 0 Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Отсутствуют замеры производительности. - |Рассчитать целевое время невозможно.'")); - Возврат; - КонецЕсли; - - Оповещение = Новый ОписаниеОповещения("УказатьAPDEXЗавершение", ЭтотОбъект); - Подсказка = НСтр("ru = 'Введите желаемое значение APDEX'"); - ЗначениеAPDEX = 0; - ПоказатьВводЧисла(Оповещение, ЗначениеAPDEX, Подсказка, 3, 2); - -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьОтбор(Команда) - - ОткрытьФорму("Обработка.ОценкаПроизводительности.Форма.ФормаОтбора", , ЭтотОбъект); - -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьКлючевуюОперацию(Команда) - ОткрытьФормуВыбора(); -КонецПроцедуры - -&НаКлиенте -Процедура УдалитьКлючевуюОперацию(Команда) - УдалитьКлючевуюОперациюНаСервере(); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервере -Процедура УстановитьУсловноеОформление() - - УсловноеОформление.Элементы.Очистить(); - - // - - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Приоритет.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Производительность.НомерСтроки"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; - ОтборЭлемента.ПравоеЗначение = 0; - - Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); - - // - - Элемент = УсловноеОформление.Элементы.Добавить(); - - ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); - ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЦелевоеВремя.Имя); - - ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Производительность.КлючеваяОперация"); - ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборЭлемента.ПравоеЗначение = Объект.ОбщаяПроизводительностьСистемы; - - Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура УказатьAPDEXЗавершение(Знач ЗначениеAPDEX, Знач ДополнительныеПараметры) Экспорт - - Если ЗначениеAPDEX = Неопределено Тогда - Возврат; - КонецЕсли; - - Если 0 > ЗначениеAPDEX Или ЗначениеAPDEX > 1 Тогда - ПоказатьПредупреждение(,НСтр("ru = 'Введен неправильный показатель APDEX. - |Допустимые значения от 0 до 1.'")); - Возврат; - КонецЕсли; - - ЗначениеAPDEX = ?(ЗначениеAPDEX = 0, 0.001, ЗначениеAPDEX); - - СтрокаТЧ = Объект.Производительность.НайтиПоИдентификатору(Элементы.Производительность.ТекущаяСтрока); - Элемент = Элементы.Производительность.ТекущийЭлемент; - СтрокаТЧ[Элемент.Имя] = ЗначениеAPDEX; - - ИндексПериода = Число(Сред(Элемент.Имя, 19)); - ЦелевоеВремя = РассчитатьЦелевоеВремя(СтрокаТЧ.КлючеваяОперация, ЗначениеAPDEX, ИндексПериода); - - СтрокаТЧ.ЦелевоеВремя = ЦелевоеВремя; - ЦелевоеВремяПриИзменении(Элемент); -КонецПроцедуры - -// Процедура рассчитывает показатели производительности. -// -&НаСервере -Процедура ОбновитьПоказатели(ЗначенияОтбора = Неопределено) - - Если Элементы.Форма.ТекущаяСтраница.Имя = "СтраницаДиаграмма" Тогда - ДиаграммаОбновлена = Истина; - ТаблицаОбновлена = Ложь; - ИначеЕсли Элементы.Форма.ТекущаяСтраница.Имя = "СтраницаТаблица" Тогда - ТаблицаОбновлена = Истина; - ДиаграммаОбновлена = Ложь; - КонецЕсли; - - ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); - - Если Не НастройкаВыполнена() Тогда - Возврат; - КонецЕсли; - - // Получение итоговой ТаблицаКлючевыхОпераций которая будет выведена пользователю. - ТаблицаКлючевыхОпераций = ОбработкаОбъект.ПоказателиПроизводительности(); - Если ТаблицаКлючевыхОпераций = Неопределено Тогда - ОценкаПроизводительностиСлужебный.СообщитьПользователю(НСтр("ru = 'Период установлен не верно.'")); - Возврат; - КонецЕсли; - - Если ТаблицаКлючевыхОпераций.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Если ЗначенияОтбора <> Неопределено Тогда - УстановитьОтборТаблицаКлючевыхОпераций(ТаблицаКлючевыхОпераций, ЗначенияОтбора); - КонецЕсли; - - Если Элементы.Форма.ТекущаяСтраница.Имя = "СтраницаДиаграмма" Тогда - - ОбновитьДиаграмму(ТаблицаКлючевыхОпераций); - - ИначеЕсли Элементы.Форма.ТекущаяСтраница.Имя = "СтраницаТаблица" Тогда - - ОбработатьРеквизитыОбъекта(ТаблицаКлючевыхОпераций.Колонки); - Объект.Производительность.Загрузить(ТаблицаКлючевыхОпераций); - - КонецЕсли; - -КонецПроцедуры - -// Вычисляет целевое время для указанного значения APDEX. -// -// Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, ключевая операция, для которой следует рассчитать целевое время. -// ЗначениеAPDEX - Число - APDEX, для которого необходимо подобрать целевое время. -// ИндексПериода - Число - индекс периода, для которого будет вычислено целевое время. -// -// Возвращаемое значение: -// Число - целевое время, при котором APDEX будет равен указанному значению. -// -&НаСервере -Функция РассчитатьЦелевоеВремя(КлючеваяОперация, ЗначениеAPDEX, ИндексПериода) - - ТаблицаКлючевыхОпераций = ТаблицаКлючевыхОперацийДляВычисленияAPDEX(); - СтрокаТаблицаКлючевыхОпераций = ТаблицаКлючевыхОпераций.Добавить(); - СтрокаТаблицаКлючевыхОпераций.КлючеваяОперация = КлючеваяОперация; - СтрокаТаблицаКлючевыхОпераций.Приоритет = 1; - - ЭтаОбработка = РеквизитФормыВЗначение("Объект"); - - ШагЧисло = 0; - КоличествоШагов = 0; - Если Не ЭтаОбработка.ПериодичностьДиаграммы(ШагЧисло, КоличествоШагов) Тогда - Возврат Ложь; - КонецЕсли; - - НачалоПериода = Объект.ДатаНачала + (ШагЧисло * ИндексПериода); - ОкончаниеПериода = НачалоПериода + ШагЧисло - 1; - - ПараметрыВычисления = ЭтаОбработка.СтруктураПараметровДляРасчетаАпдекса(); - ПараметрыВычисления.ШагЧисло = ШагЧисло; - ПараметрыВычисления.КоличествоШагов = 1; - ПараметрыВычисления.ДатаНачала = НачалоПериода; - ПараметрыВычисления.ДатаОкончания = ОкончаниеПериода; - ПараметрыВычисления.ВыводитьИтоги = Ложь; - - ЦелевоеВремя = 0.01; - ПредыдущееЦелевоеВремя = ЦелевоеВремя; - ШагСекунд = 1; - Пока Истина Цикл - - ТаблицаКлючевыхОпераций[0].ЦелевоеВремя = ЦелевоеВремя; - ПараметрыВычисления.ТаблицаКлючевыхОпераций = ТаблицаКлючевыхОпераций; - - ТаблицаКлючевыхОперацийРассчитанная = ЭтаОбработка.ВычислитьAPDEX(ПараметрыВычисления); - ЗначениеAPDEXРассчитанное = ТаблицаКлючевыхОперацийРассчитанная[0][3]; - - Если ЗначениеAPDEXРассчитанное < ЗначениеAPDEX Тогда - - ПредыдущееЦелевоеВремя = ЦелевоеВремя; - ЦелевоеВремя = ЦелевоеВремя + ШагСекунд; - - ИначеЕсли ЗначениеAPDEXРассчитанное > ЗначениеAPDEX Тогда - - Если ШагСекунд = 0.01 Или ЦелевоеВремя = 0.01 Тогда - Прервать; - КонецЕсли; - - ШагСекунд = ШагСекунд / 10; - ЦелевоеВремя = ПредыдущееЦелевоеВремя + ШагСекунд; - - ИначеЕсли ЗначениеAPDEXРассчитанное = ЗначениеAPDEX Тогда - - Прервать; - - КонецЕсли; - - КонецЦикла; - - Возврат ЦелевоеВремя; - -КонецФункции - -// Обрабатывает реквизиты табличной части "Производительность". -// -// Параметры: -// КолонкиТаблицаКлючевыхОпераций - КоллекцияКолонокТаблицыЗначений, из них вычисляется какие реквизиты удалить, а -// какие оставить. -// -&НаСервере -Процедура ОбработатьРеквизитыОбъекта(КолонкиТаблицаКлючевыхОпераций) - - РеквизитыОбъекта = ПолучитьРеквизиты("Объект.Производительность"); - УдаляемыеРеквизиты = УдаляемыеРеквизиты(РеквизитыОбъекта); - - // Колонки "Ключевая операция", "Приоритет" и "Целевое время". - КоличествоПредопределенныхКолонок = 3; - - // Меняется состав колонок - Если УдаляемыеРеквизиты.Количество() <> (КолонкиТаблицаКлючевыхОпераций.Количество() - КоличествоПредопределенныхКолонок) Тогда - - ИзменитьСоставРеквизитовОбъекта(КолонкиТаблицаКлючевыхОпераций, УдаляемыеРеквизиты); - - // Формирование списков полей для условного оформления. - ПоляОтбора = Новый Массив; - ПоляОформления = Новый Массив; - Для Каждого КолонкаТаблицаКлючевыхОпераций Из КолонкиТаблицаКлючевыхОпераций Цикл - Если КолонкиТаблицаКлючевыхОпераций.Индекс(КолонкаТаблицаКлючевыхОпераций) < КоличествоПредопределенныхКолонок Тогда - Продолжить; - КонецЕсли; - ПоляОтбора.Добавить("Объект.Производительность." + КолонкаТаблицаКлючевыхОпераций.Имя); - ПоляОформления.Добавить(КолонкаТаблицаКлючевыхОпераций.Имя); - КонецЦикла; - - УстановитьУсловноеОформлениеТЧ(ПоляОтбора, ПоляОформления, УсловноеОформление, Объект.ОбщаяПроизводительностьСистемы); - - // Меняются только заголовки колонок. - Иначе - - Сч = -1; - Для Каждого Элемент Из Элементы.Производительность.ПодчиненныеЭлементы Цикл - Сч = Сч + 1; - // Пропускаем первые 3 элемента, чтобы не менять заголовки у колонок "Ключевая операция", "Приоритет" и "Целевое время". - Если Сч < КоличествоПредопределенныхКолонок Тогда - Продолжить; - КонецЕсли; - Элемент.Заголовок = КолонкиТаблицаКлючевыхОпераций[Сч].Заголовок; - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -// Изменяются реквизиты формы ненужные удаляются нужные добавляются. -// -// Параметры: -// КолонкиТаблицаКлючевыхОпераций - КоллекцияКолонокТаблицыЗначений, из них вычисляется какие реквизиты удалить, а -// какие оставить. -// УдаляемыеРеквизиты - Массив - список полных имен удаляемых реквизитов -// имена в формате Объект.Производительность.ПроизводительностьN, где N номер. -// -&НаСервере -Процедура ИзменитьСоставРеквизитовОбъекта(КолонкиТаблицаКлючевыхОпераций, УдаляемыеРеквизиты) - - // Удаление колонок из табличной части "Производительность". - Для ИндексРеквизита = 0 По УдаляемыеРеквизиты.Количество() - 1 Цикл - - // Имена удаляемых реквизитов Объект.Производительность.ПроизводительностьN - // где N номер, это выражение получает строку вида ПроизводительностьN. - Элемент = Элементы.Найти(Сред(УдаляемыеРеквизиты[ИндексРеквизита], 27)); - Если Элемент <> Неопределено Тогда - Элементы.Удалить(Элемент); - КонецЕсли; - - КонецЦикла; - - ДобавляемыеРеквизиты = ДобавляемыеРеквизиты(КолонкиТаблицаКлючевыхОпераций); - ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты); - - // Добавление колонок в табличную часть "Производительность". - РеквизитыОбъекта = ПолучитьРеквизиты("Объект.Производительность"); - Для Каждого РеквизитОбъекта Из РеквизитыОбъекта Цикл - - ИмяРеквизита = РеквизитОбъекта.Имя; - Если СтрНачинаетсяС(ИмяРеквизита, "Производительность") Тогда - Элемент = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Элементы.Производительность); - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.ПутьКДанным = "Объект.Производительность." + ИмяРеквизита; - Элемент.Заголовок = РеквизитОбъекта.Заголовок; - Элемент.ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложениеЭлемента.Центр; - Элемент.Формат = "ЧЦ=5; ЧДЦ=2; ЧН="; - Элемент.ТолькоПросмотр = Истина; - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -// Функция создает массив реквизитов формы(колонки ТЧ "Производительность"), которые надо добавить. -// -// Параметры: -// КолонкиТаблицаКлючевыхОпераций - КоллекцияКолонокТаблицыЗначений, список колонок, которые необходимо создать. -// -// Возвращаемое значение: -// Массив - массив реквизитов формы. -// -&НаСервереБезКонтекста -Функция ДобавляемыеРеквизиты(КолонкиТаблицаКлючевыхОпераций) - - ДобавляемыеРеквизиты = Новый Массив; - ТипЧисло63 = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(6, 3, ДопустимыйЗнак.Неотрицательный)); - - Для Каждого КолонкаТаблицаКлючевыхОпераций Из КолонкиТаблицаКлючевыхОпераций Цикл - - Если КолонкиТаблицаКлючевыхОпераций.Индекс(КолонкаТаблицаКлючевыхОпераций) < 3 Тогда - Продолжить; - КонецЕсли; - - НовыйРеквизитФормы = Новый РеквизитФормы(КолонкаТаблицаКлючевыхОпераций.Имя, ТипЧисло63, "Объект.Производительность", КолонкаТаблицаКлючевыхОпераций.Заголовок); - ДобавляемыеРеквизиты.Добавить(НовыйРеквизитФормы); - - КонецЦикла; - - Возврат ДобавляемыеРеквизиты; - -КонецФункции - -// Функция создает массив реквизитов формы(колонки ТЧ "Производительность"), которые надо удалить -// и удаляет элементы формы связанные с реквизитами. -// -// Возвращаемое значение: -// Массив - массив реквизитов формы. -// -&НаСервереБезКонтекста -Функция УдаляемыеРеквизиты(РеквизитыОбъекта) - - УдаляемыеРеквизиты = Новый Массив; - - ИндексРеквизита = 0; - Пока ИндексРеквизита < РеквизитыОбъекта.Количество() Цикл - - ИмяРеквизита = РеквизитыОбъекта[ИндексРеквизита].Имя; - Если СтрНачинаетсяС(ИмяРеквизита, "Производительность") Тогда - УдаляемыеРеквизиты.Добавить("Объект.Производительность." + ИмяРеквизита); - КонецЕсли; - ИндексРеквизита = ИндексРеквизита + 1; - - КонецЦикла; - - Возврат УдаляемыеРеквизиты; - -КонецФункции - -// Процедура устанавливает условное оформление ТЧ "Производительность". -// -&НаСервереБезКонтекста -Процедура УстановитьУсловноеОформлениеТЧ(ПоляОтбора, ПоляОформления, УсловноеОформление, ОбщаяПроизводительностьСистемы); - - УсловноеОформление.Элементы.Очистить(); - - // Убрать приоритет у ключевой операции ОбщаяПроизводительностьСистемы. - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - // Вид оформления - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", ""); - // Условие для оформления - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Производительность.КлючеваяОперация"); - ЭлементОтбора.ПравоеЗначение = ОбщаяПроизводительностьСистемы; - // Оформляемое поле - ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); - ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Приоритет"); - - // Только просмотр колонки Приоритет. - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - // Вид оформления - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); - // Условие для оформления - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Производительность.НомерСтроки"); - ЭлементОтбора.ПравоеЗначение = 0; - // Оформляемое поле - ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); - ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Приоритет"); - - // Только просмотр целевого времени у ключевой операции ОбщаяПроизводительностьСистемы. - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - // Вид оформления - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); - // Условие для оформления - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Производительность.КлючеваяОперация"); - ЭлементОтбора.ПравоеЗначение = ОбщаяПроизводительностьСистемы; - // Оформляемое поле - ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); - ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ЦелевоеВремя"); - - // Отметка незаполненного целевого времени у всех кроме ОбщаяПроизводительностьСистемы. - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - // Вид оформления - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина); - // Условие для оформления - ГруппаОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); - ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; - // - ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Производительность.КлючеваяОперация"); - ЭлементОтбора.ПравоеЗначение = ОбщаяПроизводительностьСистемы; - // - ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Производительность.ЦелевоеВремя"); - ЭлементОтбора.ПравоеЗначение = 0; - // Оформляемое поле - ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); - ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ЦелевоеВремя"); - - КоличествоПолей = ПоляОтбора.Количество() - 1; - - // Оформление если операция не выполнялась. - Для ИндексПоля = 0 По КоличествоПолей Цикл - - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - - // Вид оформления - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", " "); - // Условие для оформления - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[ИндексПоля]); - ЭлементОтбора.ПравоеЗначение = 0; - // Оформляемое поле - ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); - ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПоляОформления[ИндексПоля]); - - КонецЦикла; - - // Оформление для показателей производительности. - Соответствие = СоответствиеЦветовУровнюАпдекса(); - Для Каждого КлючЗначение Из Соответствие Цикл - - Для ИндексПоля = 0 По КоличествоПолей Цикл - - ЭлементОформления = УсловноеОформление.Элементы.Добавить(); - - // Вид оформления - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", КлючЗначение.Значение.Цвет); - // Условие для оформления - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[ИндексПоля]); - ЭлементОтбора.ПравоеЗначение = КлючЗначение.Значение.От; - // Условие для оформления - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[ИндексПоля]); - ЭлементОтбора.ПравоеЗначение = КлючЗначение.Значение.До; - // Оформляемое поле - ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); - ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПоляОформления[ИндексПоля]); - - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -// Выполняет обновление диаграммы. -// -// Параметры: -// ТаблицаКлючевыхОпераций - ТаблицаЗначений - данные, по которым будет обновлена диаграмма. -// -&НаСервере -Процедура ОбновитьДиаграмму(ТаблицаКлючевыхОпераций) - - Диаграмма = Объект.Диаграмма; - - Диаграмма.Обновление = Ложь; - - Диаграмма.АвтоМаксимальноеЗначение = Ложь; - Диаграмма.АвтоМинимальноеЗначение = Ложь; - Диаграмма.МаксимальноеЗначение = 1; - Диаграмма.МинимальноеЗначение = 0; - Диаграмма.БазовоеЗначение = 0; - Диаграмма.ПропускатьБазовоеЗначение = Истина; - - Диаграмма.Очистить(); - - ТекстЗаголовка = НСтр("ru = 'Диаграмма производительности с %1 по %2 - шаг: %3'"); - ТекстЗаголовка = СтрЗаменить(ТекстЗаголовка, "%1", Формат(Объект.ДатаНачала, "ДЛФ=D")); - ТекстЗаголовка = СтрЗаменить(ТекстЗаголовка, "%2", Формат(Объект.ДатаОкончания, "ДЛФ=D")); - ТекстЗаголовка = СтрЗаменить(ТекстЗаголовка, "%3", Строка(Объект.Шаг)); - Элементы.Диаграмма.Заголовок = ТекстЗаголовка; - - ТаблицаКлючевыхОпераций.Колонки.Удалить(1); // Приоритет - ТаблицаКлючевыхОпераций.Колонки.Удалить(1); // ЦелевоеВремя - - Для Каждого СтрокаТаблицаКлючевыхОпераций Из ТаблицаКлючевыхОпераций Цикл - - Серия = Диаграмма.Серии.Добавить(СтрокаТаблицаКлючевыхОпераций.КлючеваяОперация); - Серия.Текст = СтрокаТаблицаКлючевыхОпераций.КлючеваяОперация; - - КонецЦикла; - - ТаблицаКлючевыхОпераций.Колонки.Удалить(0); // КлючеваяОперация - - Для Каждого КолонкаТаблицаКлючевыхОпераций Из ТаблицаКлючевыхОпераций.Колонки Цикл - - Точка = Диаграмма.Точки.Добавить(КолонкаТаблицаКлючевыхОпераций.Имя); - Точка.Текст = ?(Объект.Шаг = "Час", Лев(КолонкаТаблицаКлючевыхОпераций.Заголовок, 2), КолонкаТаблицаКлючевыхОпераций.Заголовок); //Для отображения только часов если шаг Час. - Строка = 0; - Столбец = ТаблицаКлючевыхОпераций.Колонки.Индекс(КолонкаТаблицаКлючевыхОпераций); - Для Каждого Серия Из Диаграмма.Серии Цикл - - ЗначениеТочки = ТаблицаКлючевыхОпераций[Строка][Столбец]; - Если ЗначениеТочки <> Неопределено И ЗначениеТочки <> Null Тогда - Диаграмма.УстановитьЗначение(Точка, Серия, ?(ЗначениеТочки = 0.001 ИЛИ ЗначениеТочки = 0, ЗначениеТочки, ЗначениеТочки - 0.001)); - КонецЕсли; - Строка = Строка + 1; - - КонецЦикла; - - КонецЦикла; - - Диаграмма.ТипДиаграммы = ТипДиаграммы.График; - - Диаграмма.Обновление = Истина; - -КонецПроцедуры - -/////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Сдвигает строки табличной части и меняет приоритеты ключевых операций. -// -// Параметры: -// НаправлениеСдвига - Число, -// -1, сдвиг вверх -// 1, сдвиг вниз -// ТекущийИндекс - Число - индекс сдвигаемой строки. -// -&НаКлиенте -Процедура ВыполнитьСдвигСтроки(НаправлениеСдвига, ТекущийИндекс) - - Врем = Объект.Производительность; - - Приоритет1 = Врем[ТекущийИндекс].Приоритет; - Приоритет2 = Врем[ТекущийИндекс + НаправлениеСдвига].Приоритет; - - ОбменятьПриоритеты( - Врем[ТекущийИндекс].КлючеваяОперация, - Приоритет1, - Врем[ТекущийИндекс + НаправлениеСдвига].КлючеваяОперация, - Приоритет2); - - Врем[ТекущийИндекс].Приоритет = Приоритет2; - Врем[ТекущийИндекс + НаправлениеСдвига].Приоритет = Приоритет1; - - Врем.Сдвинуть(ТекущийИндекс, НаправлениеСдвига); - -КонецПроцедуры - -// Устанавливает исключительную управляемую блокировку на ссылку. -// -&НаСервереБезКонтекста -Процедура ЗаблокироватьСсылку(Ссылка) - - БлокировкаДанных = Новый БлокировкаДанных; - ЭлементБлокировки = БлокировкаДанных.Добавить(Ссылка.Метаданные().ПолноеИмя()); - ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка); - БлокировкаДанных.Заблокировать(); - -КонецПроцедуры - -// Начинает транзакцию и устанавливает исключительную -// управляемую блокировку по значению ссылки. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - ссылка, которую надо заблокировать. -// -// Возвращаемое значение: -// Объект - объект полученный из ссылки. -// -&НаСервереБезКонтекста -Функция НачатьИзменениеОбъекта(Ссылка) - - ЗаблокироватьСсылку(Ссылка); - - Объект = Ссылка.ПолучитьОбъект(); - - Возврат Объект; - -КонецФункции - -// Фиксирует транзакцию и записывает объект. -// -// Параметры: -// Объект - Произвольный - объект, изменения которого следует зафиксировать. -// Записывать - Булево - необходимость записи объекта перед фиксацией транзакции. -// -&НаСервереБезКонтекста -Процедура ЗафиксироватьИзменениеОбъекта(Объект, Записывать = Истина) - - Если Записывать Тогда - Объект.Записать(); - КонецЕсли; - -КонецПроцедуры - -// Выполняет обмен приоритетами ключевых операций. -// -// Параметры: -// КлючеваяОперация1 - СправочникСсылка.КлючевыеОперации -// Приоритет1 - Число - будет присвоен КлючеваяОперация2. -// КлючеваяОперация2 - СправочникСсылка.КлючевыеОперации -// Приоритет2 - Число - будет присвоен КлючеваяОперация1. -// -&НаСервере -Процедура ОбменятьПриоритеты(КлючеваяОперация1, Приоритет1, КлючеваяОперация2, Приоритет2) - - НачатьТранзакцию(); - - Попытка - ОбъектКлючевойОперации = НачатьИзменениеОбъекта(КлючеваяОперация1); - ОбъектКлючевойОперации.Приоритет = Приоритет2; - ОбъектКлючевойОперации.ДополнительныеСвойства.Вставить(ОценкаПроизводительностиКлиентСервер.НеПроверятьПриоритет()); - ЗафиксироватьИзменениеОбъекта(ОбъектКлючевойОперации); - - ОбъектКлючевойОперации = НачатьИзменениеОбъекта(КлючеваяОперация2); - ОбъектКлючевойОперации.Приоритет = Приоритет1; - ЗафиксироватьИзменениеОбъекта(ОбъектКлючевойОперации); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Процедура открывает форму выбора справочника КлючевыеОперации -// и устанавливает отбор, чтобы в списке не было операций которые уже выбраны. -// -&НаКлиенте -Процедура ОткрытьФормуВыбора() - - ТЧ = Объект.Производительность; - - Отбор = Новый Массив; - Для ИндексТЧ = 0 По ТЧ.Количество() - 1 Цикл - Отбор.Добавить(ТЧ[ИндексТЧ].КлючеваяОперация); - КонецЦикла; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Отбор", Отбор); - ПараметрыФормы.Вставить("РежимВыбора", Истина); - - Оповещение = Новый ОписаниеОповещения( - "ДобавитьКлючевуюОперациюЗавершение", - ЭтотОбъект); - - ОткрытьФорму( - "Справочник.КлючевыеОперации.ФормаВыбора", - ПараметрыФормы, - ЭтотОбъект, - ,,, - Оповещение, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); - -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьКлючевуюОперациюЗавершение(ПараметрыКлючевойОперации, Параметры) Экспорт - - Если ПараметрыКлючевойОперации = Неопределено Тогда - Возврат; - КонецЕсли; - ДобавитьКлючевуюОперациюСервер(ПараметрыКлючевойОперации); - -КонецПроцедуры - -&НаСервере -Процедура ДобавитьКлючевуюОперациюСервер(ПараметрыКлючевойОперации) - - НоваяСтрока = Объект.Производительность.Добавить(); - НоваяСтрока.КлючеваяОперация = ПараметрыКлючевойОперации.КлючеваяОперация; - НоваяСтрока.ЦелевоеВремя = ПараметрыКлючевойОперации.ЦелевоеВремя; - НоваяСтрока.Приоритет = ПараметрыКлючевойОперации.Приоритет; - - Объект.Производительность.Сортировать("Приоритет"); - -КонецПроцедуры - -// Вычисляет точные дату начала и окончания на выбранном отрезке. -// -// Параметры: -// ДатаНачала [OUT] - Дата - дата начала выбранного периода. -// ДатаОкончания [OUT] - Дата - дата окончания выбранного периода. -// ИндексПериода [IN] - Число - индекс выбранного периода. -// -// Возвращаемое значение: -// Булево - -// Истина, даты рассчитаны -// Ложь, даты не рассчитаны -// -&НаСервере -Функция ВычислитьДатыВременногоОтрезка(ДатаНачала, ДатаОкончания, ИндексПериода) - - ЭтаОбработка = РеквизитФормыВЗначение("Объект"); - - ШагЧисло = 0; - КоличествоШагов = 0; - Если Не ЭтаОбработка.ПериодичностьДиаграммы(ШагЧисло, КоличествоШагов) Тогда - Возврат Ложь; - КонецЕсли; - - Если КоличествоШагов <= ИндексПериода Тогда - ВызватьИсключение НСтр("ru = 'Количество шагов не может быть меньше индекса.'"); - КонецЕсли; - - ДатаНачала = Объект.ДатаНачала + (ШагЧисло * ИндексПериода); - Если ШагЧисло <> 0 Тогда - ДатаОкончания = ДатаНачала + ШагЧисло - 1; - Иначе - ДатаОкончания = КонецДня(Объект.ДатаОкончания); - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Создает таблицу значения, которая необходима для расчета APDEX. -// -// Возвращаемое значение: -// ТаблицаЗначений - таблица значений со структурой необходимой для расчета APDEX. -// -&НаСервереБезКонтекста -Функция ТаблицаКлючевыхОперацийДляВычисленияAPDEX() - - ТаблицаКлючевыхОпераций = Новый ТаблицаЗначений; - ТаблицаКлючевыхОпераций.Колонки.Добавить( - "КлючеваяОперация", - Новый ОписаниеТипов("СправочникСсылка.КлючевыеОперации")); - ТаблицаКлючевыхОпераций.Колонки.Добавить( - "Приоритет", - Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 0, ДопустимыйЗнак.Неотрицательный))); - ТаблицаКлючевыхОпераций.Колонки.Добавить( - "ЦелевоеВремя", - Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Неотрицательный))); - - Возврат ТаблицаКлючевыхОпераций; - -КонецФункции - -/////////////////////////////////////////////////////////////////////// -// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ (ОФОРМЛЕНИЕ, НАСТРОЙКИ) - -// Функция возвращает цвет значения Неприемлемо. -// -// Возвращаемое значение: -// Цвет - цвет значения -// -&НаСервереБезКонтекста -Функция ЦветНеприемлемо() - - Возврат Новый Цвет(187, 187, 187); - -КонецФункции - -// Функция возвращает цвет значения Плохо. -// -// Возвращаемое значение: -// Цвет - цвет значения -// -&НаСервереБезКонтекста -Функция ЦветПлохо() - - Возврат Новый Цвет(255, 212, 171); - -КонецФункции - -// Функция возвращает цвет значения Удовлетворительно. -// -// Возвращаемое значение: -// Цвет - цвет значения -// -&НаСервереБезКонтекста -Функция ЦветУдовлетворительно() - - Возврат Новый Цвет(255, 255, 153); - -КонецФункции - -// Функция возвращает цвет значения Хорошо. -// -// Возвращаемое значение: -// Цвет - цвет значения -// -&НаСервереБезКонтекста -Функция ЦветХорошо() - - Возврат Новый Цвет(204, 255, 204); - -КонецФункции - -// Функция возвращает цвет значения Отлично. -// -// Возвращаемое значение: -// Цвет - цвет значения -// -&НаСервереБезКонтекста -Функция ЦветОтлично() - - Возврат Новый Цвет(204, 255, 255); - -КонецФункции - -// Функция возвращает соответствие, в котором. -// Ключ - Строка, оценка производительности. -// Значение - Структура, параметры оценки. -// -// Возвращаемое значение: -// Соответствие -// -&НаСервереБезКонтекста -Функция СоответствиеЦветовУровнюАпдекса() - - Соответствие = Новый Соответствие; - - Значения = Новый Структура("От, До, Цвет"); - Значения.От = 0.001; // 0 означает что операция не выполнялась вообще. - Значения.До = 0.5; - Значения.Цвет = ЦветНеприемлемо(); - Соответствие.Вставить("Неприемлемо", Значения); - - Значения = Новый Структура("От, До, Цвет"); - Значения.От = 0.5; - Значения.До = 0.7; - Значения.Цвет = ЦветПлохо(); - Соответствие.Вставить("Плохо", Значения); - - Значения = Новый Структура("От, До, Цвет"); - Значения.От = 0.7; - Значения.До = 0.85; - Значения.Цвет = ЦветУдовлетворительно(); - Соответствие.Вставить("Удовлетворительно", Значения); - - Значения = Новый Структура("От, До, Цвет"); - Значения.От = 0.85; - Значения.До = 0.94; - Значения.Цвет = ЦветХорошо(); - Соответствие.Вставить("Хорошо", Значения); - - Значения = Новый Структура("От, До, Цвет"); - Значения.От = 0.94; - Значения.До = 1.002; // т.к. в условном оформлении к значению "До" применяется условие "Меньше", а не "МеньшеИлиРавно". - Значения.Цвет = ЦветОтлично(); - Соответствие.Вставить("Отлично", Значения); - - Возврат Соответствие; - -КонецФункции - -// Функция проверяет правильность настроек формы. -// -// Возвращаемое значение: -// Булево - Истина - настройки верны -// Ложь - настройки не верны -// -&НаСервере -Функция НастройкаВыполнена() - - Выполнена = Истина; - Для Каждого СтрокаТЧ Из Объект.Производительность Цикл - - Если СтрокаТЧ.ЦелевоеВремя = 0 - И СтрокаТЧ.КлючеваяОперация <> Объект.ОбщаяПроизводительностьСистемы Тогда - - ОценкаПроизводительностиСлужебный.СообщитьПользователю( - НСтр("ru = 'Целевое время обязательно должно быть заполнено.'"), - , - "Производительность[" + Формат(Объект.Производительность.Индекс(СтрокаТЧ),"ЧГ=0") + "].ЦелевоеВремя", - "Объект"); - - Выполнена = Ложь; - Прервать; - КонецЕсли; - - КонецЦикла; - - Возврат Выполнена; - -КонецФункции - -// Процедура при первом открытии формы обработки заполняет. -// ТЧ "Производительность" из справочника "КлючевыеОперации". -// -&НаСервереБезКонтекста -Функция ЗагрузитьКлючевыеОперации(ОбщаяПроизводительностьСистемы) - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | КлючевыеОперации.Ссылка КАК КлючеваяОперация, - | КлючевыеОперации.Приоритет КАК Приоритет, - | КлючевыеОперации.ЦелевоеВремя КАК ЦелевоеВремя - |ИЗ - | Справочник.КлючевыеОперации КАК КлючевыеОперации - |ГДЕ - | НЕ КлючевыеОперации.ПометкаУдаления - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | &ОбщаяПроизводительностьСистемы, - | 0, - | 0 - |ГДЕ - | ТИПЗНАЧЕНИЯ(&ОбщаяПроизводительностьСистемы) <> ТИП(Справочник.КлючевыеОперации) - | - |УПОРЯДОЧИТЬ ПО - | Приоритет - |АВТОУПОРЯДОЧИВАНИЕ"; - Запрос.УстановитьПараметр("ОбщаяПроизводительностьСистемы", ОбщаяПроизводительностьСистемы); - Результат = Запрос.Выполнить(); - - Если Результат.Пустой() Тогда - Возврат Новый ТаблицаЗначений; - КонецЕсли; - - Возврат Результат.Выгрузить(); - -КонецФункции - -// Меняет целевое время ключевой операции. -// -// Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, операция, у которой необходимо изменить целевое время. -// ЦелевоеВремя - Число - новое целевое время. -// -&НаСервере -Процедура ИзменитьЦелевоеВремя(КлючеваяОперация, ЦелевоеВремя) - - НачатьТранзакцию(); - - Попытка - КлючеваяОперацияОбъект = НачатьИзменениеОбъекта(КлючеваяОперация); - КлючеваяОперацияОбъект.ЦелевоеВремя = ЦелевоеВремя; - ЗафиксироватьИзменениеОбъекта(КлючеваяОперацияОбъект); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Удаляет из таблицы значений строки не подходящие под отбор. -// -// Параметры: -// ТаблицаКлючевыхОпераций - ТаблицаЗначений - таблица, которую нужно отфильтровать. -// ЗначенияОтбора - Массив - массив строк со значениями отбора. -// -&НаСервереБезКонтекста -Процедура УстановитьОтборТаблицаКлючевыхОпераций(ТаблицаКлючевыхОпераций, ЗначенияОтбора) - - Если ЗначенияОтбора.Направление > 0 Тогда - Если ВРег(ЗначенияОтбора.Состояние) = "ХОРОШО" Тогда - Предел = 0.93; - ИначеЕсли ВРег(ЗначенияОтбора.Состояние) = "УДОВЛЕТВОРИТЕЛЬНО" Тогда - Предел = 0.84; - ИначеЕсли ВРег(ЗначенияОтбора.Состояние) = "ПЛОХО" Тогда - Предел = 0.69; - КонецЕсли; - ИначеЕсли ЗначенияОтбора.Направление < 0 Тогда - Если ВРег(ЗначенияОтбора.Состояние) = "ХОРОШО" Тогда - Предел = 0.85; - ИначеЕсли ВРег(ЗначенияОтбора.Состояние) = "УДОВЛЕТВОРИТЕЛЬНО" Тогда - Предел = 0.7; - ИначеЕсли ВРег(ЗначенияОтбора.Состояние) = "ПЛОХО" Тогда - Предел = 0.5; - КонецЕсли; - КонецЕсли; - - Сч = 0; - Удалять = Ложь; - Пока Сч < ТаблицаКлючевыхОпераций.Количество() Цикл - - Для Каждого КолонкаТаблицаКлючевыхОпераций Из ТаблицаКлючевыхОпераций.Колонки Цикл - Если (Лев(КолонкаТаблицаКлючевыхОпераций.Имя, 18) <> "Производительность") Или (ТаблицаКлючевыхОпераций[Сч][КолонкаТаблицаКлючевыхОпераций.Имя] = 0) Тогда - Продолжить; - КонецЕсли; - - Если ЗначенияОтбора.Направление > 0 Тогда - Если ТаблицаКлючевыхОпераций[Сч][КолонкаТаблицаКлючевыхОпераций.Имя] > Предел Тогда - Удалять = Ложь; - Прервать; - Иначе - Удалять = Истина; - КонецЕсли; - ИначеЕсли ЗначенияОтбора.Направление < 0 Тогда - Если ТаблицаКлючевыхОпераций[Сч][КолонкаТаблицаКлючевыхОпераций.Имя] < Предел Тогда - Удалять = Ложь; - Прервать; - Иначе - Удалять = Истина; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Если Удалять Тогда - ТаблицаКлючевыхОпераций.Удалить(Сч); - Иначе - Сч = Сч + 1; - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура УдалитьКлючевуюОперациюНаСервере() - - ИдентификаторСтроки = Элементы.Производительность.ТекущаяСтрока; - Если ИдентификаторСтроки = Неопределено Тогда - Возврат; - КонецЕсли; - - ДинамикаПроизводительностиДанные = Объект.Производительность; - АктивнаяСтрока = ДинамикаПроизводительностиДанные.НайтиПоИдентификатору(ИдентификаторСтроки); - Если АктивнаяСтрока <> Неопределено Тогда - ДинамикаПроизводительностиДанные.Удалить(ДинамикаПроизводительностиДанные.Индекс(АктивнаяСтрока)); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - Комментарии = ПолучитьПоследниеКомментарии(); - ДанныеВыбора = Новый СписокЗначений; - Для Каждого Комментарий Из Комментарии Цикл - ДанныеВыбора.Добавить(Комментарий); - КонецЦикла; - - СтандартнаяОбработка = Ложь; -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ПолучитьПоследниеКомментарии() - Возврат РегистрыСведений.ЗамерыВремени.ПолучитьПоследниеКомментарии(); -КонецФункции - -&НаКлиенте -Процедура КомментарийОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - Если НЕ ПустаяСтрока(ВыбранноеЗначение) И Объект.ВариантФильтраКомментарий = "НеФильтровать" Тогда - Объект.ВариантФильтраКомментарий = "Равен"; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ДатаОкончанияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - Объект.ДатаОкончания = КонецДня(ВыбранноеЗначение); - СтандартнаяОбработка = Ложь; -КонецПроцедуры - -&НаКлиенте -Процедура ЭкспортЗамеров(Команда) - ОткрытьФорму("Обработка.ОценкаПроизводительности.Форма.ЭкспортЗамеровПроизводительности", , ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Form.form b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Form.form deleted file mode 100644 index b198cfef8..000000000 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Form.form +++ /dev/null @@ -1,493 +0,0 @@ - - - - Группа1 - 20 - - Надпись1 - 14 - - <key>ru</key> - <value>Отобрать</value> - - true - true - - true - - - Надпись1 - - - Надпись1ExtendedTooltip - 27 - Label - true - true - - Left - - - - Надпись1КонтекстноеМеню - 15 - true - - LabelField - Enter - true - Left - true - - true - true - - - - Направление - 12 - true - true - - true - - - Направление - - None - - OnChange - НаправлениеПриИзменении - - - НаправлениеExtendedTooltip - 28 - Label - true - true - - Left - - - - НаправлениеКонтекстноеМеню - 13 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Лучше - - - 1 - - - - - ru - Хуже - - - -1 - - - Vertical - - - - Надпись2 - 16 - - <key>ru</key> - <value>чем</value> - - true - true - - true - - - Надпись2 - - - Надпись2ExtendedTooltip - 29 - Label - true - true - - Left - - - - Надпись2КонтекстноеМеню - 17 - true - - LabelField - Enter - true - Left - true - - true - true - - - - Состояние - 18 - true - true - - true - - - Состояние - - None - - OnChange - СостояниеПриИзменении - - - СостояниеExtendedTooltip - 30 - Label - true - true - - Left - - - - СостояниеКонтекстноеМеню - 19 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Хорошо - - - Хорошо - - - - - ru - Удовлетворительно - - - Удовлетворительно - - - - - ru - Плохо - - - Плохо - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Группа параметры</value> - - - Группа1ExtendedTooltip - 26 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - true - true - Auto - - - - Условие - 21 - true - true - - true - - - Условие - - - УсловиеExtendedTooltip - 31 - Label - true - true - - Left - - - - УсловиеКонтекстноеМеню - 22 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - Bottom - true - - ФормаКоманднаяПанель - -1 - - ОК - 1 - true - true - - true - - - ОКExtendedTooltip - 24 - Label - true - true - - Left - - - Form.Command.ОК - Auto - true - true - true - UserCmds - Auto - - - ФормаОтмена - 23 - true - true - - true - - - ФормаОтменаExtendedTooltip - 25 - Label - true - true - - Left - - - Form.StandardCommand.Cancel - Normal - Auto - true - true - UserCmds - Auto - - Right - - LockOwner - true - true - true - Vertical - true - true - true - auto - true - - Объект - 1 - - DataProcessorObject.ОценкаПроизводительности - - - true - - - true - -
          true
          -
          - - Направление - - <key>ru</key> - <value>Направление</value> - - 7 - - Number - - 15 - - - - true - - - true - - - - Надпись1 - - <key>ru</key> - <value>Надпись1</value> - - 2 - - String - - 1 - - - - true - - - true - - - - Надпись2 - - <key>ru</key> - <value>Надпись2</value> - - 3 - - String - - 1 - - - - true - - - true - - - - Состояние - - <key>ru</key> - <value>Состояние</value> - - 4 - - String - - 20 - - - - true - - - true - - - - Условие - - <key>ru</key> - <value>Условие</value> - - 5 - - String - - 20 - - - - true - - - true - - - - ОК - - <key>ru</key> - <value>ОК</value> - - 1 - - ru - ОК - - - true - - - - ОК - - - DontUse - Auto - - - - - - -
          diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Module.bsl deleted file mode 100644 index d3e019ffb..000000000 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ФормаОтбора/Module.bsl +++ /dev/null @@ -1,69 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2021, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -&НаКлиенте -Процедура НаправлениеПриИзменении(Элемент) - - СформироватьУсловие(); - -КонецПроцедуры - -&НаКлиенте -Процедура СостояниеПриИзменении(Элемент) - - СформироватьУсловие(); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура ОК(Команда) - - РезультатВыбора = Новый Структура("Направление, Состояние"); - РезультатВыбора.Направление = Направление; - РезультатВыбора.Состояние = Состояние; - - ОповеститьОВыборе(РезультатВыбора); - -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаКлиенте -Процедура СформироватьУсловие() - - Если Направление > 0 Тогда - Если ВРег(Состояние) = "ХОРОШО" Тогда - Предел = 0.93; - ИначеЕсли ВРег(Состояние) = "УДОВЛЕТВОРИТЕЛЬНО" Тогда - Предел = 0.84; - ИначеЕсли ВРег(Состояние) = "ПЛОХО" Тогда - Предел = 0.69; - КонецЕсли; - Условие = "apdex > " + Предел; - ИначеЕсли Направление < 0 Тогда - Если ВРег(Состояние) = "ХОРОШО" Тогда - Предел = 0.85; - ИначеЕсли ВРег(Состояние) = "УДОВЛЕТВОРИТЕЛЬНО" Тогда - Предел = 0.7; - ИначеЕсли ВРег(Состояние) = "ПЛОХО" Тогда - Предел = 0.5; - КонецЕсли; - Условие = "apdex < " + Предел; - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl index 6b8a04631..e69de29bb 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl @@ -1,442 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) 2021, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -/////////////////////////////////////////////////////////////////////////////////////////////////////// - -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -#Область СлужебныйПрограммныйИнтерфейс - -// Функция формирует таблицу значений которая будет выведена пользователю. -// -// Возвращаемое значение: -// ТаблицаЗначений - итоговая таблица значений. -// -Функция ПоказателиПроизводительности() Экспорт - - ПараметрыВычисления = СтруктураПараметровДляРасчетаАпдекса(); - - ШагЧисло = 0; - КоличествоШагов = 0; - Если Не ПериодичностьДиаграммы(ШагЧисло, КоличествоШагов) Тогда - Возврат Неопределено; - КонецЕсли; - - ПараметрыВычисления.ШагЧисло = ШагЧисло; - ПараметрыВычисления.КоличествоШагов = КоличествоШагов; - ПараметрыВычисления.ДатаНачала = ДатаНачала; - ПараметрыВычисления.ДатаОкончания = ДатаОкончания; - ПараметрыВычисления.ТаблицаКлючевыхОпераций = Производительность.Выгрузить(, "КлючеваяОперация, Приоритет, ЦелевоеВремя"); - Если Не ЗначениеЗаполнено(ОбщаяПроизводительностьСистемы) Или Производительность.Найти(ОбщаяПроизводительностьСистемы, "КлючеваяОперация") = Неопределено Тогда - ПараметрыВычисления.ВыводитьИтоги = Ложь - Иначе - ПараметрыВычисления.ВыводитьИтоги = Истина; - КонецЕсли; - ПараметрыВычисления.Комментарий = Комментарий; - Если НЕ ПустаяСтрока(Комментарий) Тогда - ПараметрыВычисления.ВариантФильтраКомментарий = ВариантФильтраКомментарий; - Иначе - ПараметрыВычисления.ВариантФильтраКомментарий = "НеФильтровать"; - КонецЕсли; - - Возврат ВычислитьAPDEX(ПараметрыВычисления); - -КонецФункции - -// Функция динамически формирует запрос и получает APDEX. -// -// Параметры: -// ПараметрыВычисления - Структура: -// * ШагЧисло - Число - размер шага в секундах. -// * КоличествоШагов - Число - количество шагов в периоде. -// * ДатаНачала - Дата - дата начала замеров. -// * ДатаОкончания - Дата - дата окончания замеров. -// * ТаблицаКлючевыхОпераций - ТаблицаЗначений - содержит данные для выбора. Колонки: -// ** КлючеваяОперация - СправочникСсылка.КлючевыеОперации - ключевая операция. -// ** НомерСтроки - Число - приоритет ключевой операции. -// ** Целевое время - Число - целевое время ключевой операции. -// * ВыводитьИтоги - Булево -// -// Возвращаемое значение: -// ТаблицаЗначений - в таблице возвращается ключевая операция и -// показатель производительности за определенный период времени. -// -Функция ВычислитьAPDEX(ПараметрыВычисления) Экспорт - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ТаблицаКлючевыхОпераций", ПараметрыВычисления.ТаблицаКлючевыхОпераций); - Запрос.УстановитьПараметр("НачалоПериода", (ПараметрыВычисления.ДатаНачала - Дата(1,1,1))* 1000); - Запрос.УстановитьПараметр("КонецПериода", (ПараметрыВычисления.ДатаОкончания - Дата(1,1,1)) * 1000); - Запрос.УстановитьПараметр("КлючеваяОперацияИтого", ОбщаяПроизводительностьСистемы); - - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - Запрос.Текст = - "ВЫБРАТЬ - | КлючевыеОперации.КлючеваяОперация КАК КлючеваяОперация, - | КлючевыеОперации.Приоритет КАК Приоритет, - | КлючевыеОперации.ЦелевоеВремя КАК ЦелевоеВремя - |ПОМЕСТИТЬ КлючевыеОперации - |ИЗ - | &ТаблицаКлючевыхОпераций КАК КлючевыеОперации"; - Запрос.Выполнить(); - - ТекстЗапроса = - "ВЫБРАТЬ - | КлючевыеОперации.КлючеваяОперация КАК КлючеваяОперация, - | КлючевыеОперации.Приоритет КАК Приоритет, - | КлючевыеОперации.ЦелевоеВремя КАК ЦелевоеВремя - | //%Колонки% - |ИЗ - | КлючевыеОперации КАК КлючевыеОперации - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.ЗамерыВремени КАК ЗамерыВремени - |ПО - | КлючевыеОперации.КлючеваяОперация = ЗамерыВремени.КлючеваяОперация - | И ЗамерыВремени.ДатаНачалаЗамера МЕЖДУ &НачалоПериода И &КонецПериода - | //%УсловиеКомментарий% - |ГДЕ - | НЕ КлючевыеОперации.КлючеваяОперация = &КлючеваяОперацияИтого - | - |СГРУППИРОВАТЬ ПО - | КлючевыеОперации.КлючеваяОперация, - | КлючевыеОперации.Приоритет, - | КлючевыеОперации.ЦелевоеВремя - |//%Итоги%"; - - Выражение = - " - | ВЫБОР - | КОГДА - | // Нет записей в периоде о замере по этой ключевой операции - | НЕ 1 В ( - | ВЫБРАТЬ ПЕРВЫЕ 1 - | 1 - | ИЗ - | РегистрСведений.ЗамерыВремени КАК ЗамерыВремениВнутр - | ГДЕ - | ЗамерыВремениВнутр.КлючеваяОперация = КлючевыеОперации.КлючеваяОперация - | И ЗамерыВремениВнутр.КлючеваяОперация <> &КлючеваяОперацияИтого - | И ЗамерыВремениВнутр.ДатаНачалаЗамера МЕЖДУ &НачалоПериода И &КонецПериода - | И ЗамерыВремениВнутр.ДатаНачалаЗамера >= &НачалоПериода%Номер% - | И ЗамерыВремениВнутр.ДатаНачалаЗамера <= &КонецПериода%Номер% - | %УсловиеКомментарийВнутр% - | ) - | ТОГДА 0 - | - | ИНАЧЕ (ВЫРАЗИТЬ((СУММА(ВЫБОР - | КОГДА ЗамерыВремени.ДатаНачалаЗамера >= &НачалоПериода%Номер% - | И ЗамерыВремени.ДатаНачалаЗамера <= &КонецПериода%Номер% - | ТОГДА ВЫБОР - | КОГДА ЗамерыВремени.ВремяВыполнения <= КлючевыеОперации.ЦелевоеВремя - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ - | ИНАЧЕ 0 - | КОНЕЦ) + СУММА(ВЫБОР - | КОГДА ЗамерыВремени.ДатаНачалаЗамера >= &НачалоПериода%Номер% - | И ЗамерыВремени.ДатаНачалаЗамера <= &КонецПериода%Номер% - | ТОГДА ВЫБОР - | КОГДА ЗамерыВремени.ВремяВыполнения > КлючевыеОперации.ЦелевоеВремя - | И ЗамерыВремени.ВремяВыполнения <= КлючевыеОперации.ЦелевоеВремя * 4 - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ - | ИНАЧЕ 0 - | КОНЕЦ) / 2) / СУММА(ВЫБОР - | КОГДА ЗамерыВремени.ДатаНачалаЗамера >= &НачалоПериода%Номер% - | И ЗамерыВремени.ДатаНачалаЗамера <= &КонецПериода%Номер% - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) + 0.001 КАК ЧИСЛО(6, 3))) - | КОНЕЦ КАК Производительность%Номер%"; - - ВыражениеДляИтогов = - " - | СУММА(ВЫБОР - | КОГДА ЗамерыВремени.ДатаНачалаЗамера >= &НачалоПериода%Номер% - | И ЗамерыВремени.ДатаНачалаЗамера <= &КонецПериода%Номер% - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК ВремВсего%Номер%, - | СУММА(ВЫБОР - | КОГДА ЗамерыВремени.ДатаНачалаЗамера >= &НачалоПериода%Номер% - | И ЗамерыВремени.ДатаНачалаЗамера <= &КонецПериода%Номер% - | ТОГДА ВЫБОР - | КОГДА ЗамерыВремени.ВремяВыполнения <= КлючевыеОперации.ЦелевоеВремя - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ - | ИНАЧЕ 0 - | КОНЕЦ) КАК ВремДоТ%Номер%, - | СУММА(ВЫБОР - | КОГДА ЗамерыВремени.ДатаНачалаЗамера >= &НачалоПериода%Номер% - | И ЗамерыВремени.ДатаНачалаЗамера <= &КонецПериода%Номер% - | ТОГДА ВЫБОР - | КОГДА ЗамерыВремени.ВремяВыполнения > КлючевыеОперации.ЦелевоеВремя - | И ЗамерыВремени.ВремяВыполнения <= КлючевыеОперации.ЦелевоеВремя * 4 - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ - | ИНАЧЕ 0 - | КОНЕЦ) КАК ВремМеждуТ4Т%Номер%"; - - Итог = - " - | МАКСИМУМ(ВремВсего%Номер%)"; - - ПоОбщие = - " - |ПО - | ОБЩИЕ"; - - ЗаголовкиКолонок = Новый Массив; - Колонки = ""; - Итоги = ""; - НачалоПериода = ПараметрыВычисления.ДатаНачала; - Для ТекШаг = 0 По ПараметрыВычисления.КоличествоШагов - 1 Цикл - - КонецПериода = ?(ТекШаг = ПараметрыВычисления.КоличествоШагов - 1, ПараметрыВычисления.ДатаОкончания, НачалоПериода + ПараметрыВычисления.ШагЧисло - 1); - - ИндексШага = Формат(ТекШаг, "ЧН=0; ЧГ=0"); - Запрос.УстановитьПараметр("НачалоПериода" + ИндексШага, (НачалоПериода - Дата(1,1,1)) * 1000); - Запрос.УстановитьПараметр("КонецПериода" + ИндексШага, (КонецПериода - Дата(1,1,1)) * 1000); - - ЗаголовкиКолонок.Добавить(ЗаголовокКолонки(НачалоПериода)); - - НачалоПериода = НачалоПериода + ПараметрыВычисления.ШагЧисло; - - Колонки = Колонки + ?(ПараметрыВычисления.ВыводитьИтоги, "," + ВыражениеДляИтогов, "") + "," + Выражение; - Колонки = СтрЗаменить(Колонки, "%Номер%", ИндексШага); - - Если ПараметрыВычисления.ВыводитьИтоги Тогда - Итоги = Итоги + Итог + ?(ТекШаг = ПараметрыВычисления.КоличествоШагов - 1, "", ","); - Итоги = СтрЗаменить(Итоги, "%Номер%", ИндексШага); - КонецЕсли; - - КонецЦикла; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%Колонки%", Колонки); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%Итоги%", ?(ПараметрыВычисления.ВыводитьИтоги, "ИТОГИ" + Итоги, "")); - ТекстЗапроса = ТекстЗапроса + ?(ПараметрыВычисления.ВыводитьИтоги, ПоОбщие, ""); - - Если ПараметрыВычисления.ВариантФильтраКомментарий = "НеФильтровать" Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%УсловиеКомментарий%", ""); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%УсловиеКомментарийВнутр%", ""); - ИначеЕсли ПараметрыВычисления.ВариантФильтраКомментарий = "Равен" Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%УсловиеКомментарий%", "И ЗамерыВремени.Комментарий = &Комментарий"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%УсловиеКомментарийВнутр%", "И ЗамерыВремениВнутр.Комментарий = &Комментарий"); - Запрос.УстановитьПараметр("Комментарий", ПараметрыВычисления.Комментарий); - ИначеЕсли ПараметрыВычисления.ВариантФильтраКомментарий = "Содержит" Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%УсловиеКомментарий%", "И ЗамерыВремени.Комментарий ПОДОБНО &Комментарий"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//%УсловиеКомментарийВнутр%", "И ЗамерыВремениВнутр.Комментарий ПОДОБНО &Комментарий"); - Запрос.УстановитьПараметр("Комментарий", "%" + ПараметрыВычисления.Комментарий + "%"); - КонецЕсли; - - Запрос.Текст = ТекстЗапроса; - Результат = Запрос.Выполнить(); - - Если Результат.Пустой() Тогда - Возврат Новый ТаблицаЗначений; - Иначе - ТаблицаКлючевыхОпераций = Результат.Выгрузить(); - - ТаблицаКлючевыхОпераций.Сортировать("Приоритет"); - Если ПараметрыВычисления.ВыводитьИтоги Тогда - ТаблицаКлючевыхОпераций[0][0] = ОбщаяПроизводительностьСистемы; - ВычислитьИтоговыйAPDEX(ТаблицаКлючевыхОпераций); - КонецЕсли; - - ИндексКолонки = 0; - ИндексМассива = 0; - Пока ИндексКолонки <= ТаблицаКлючевыхОпераций.Колонки.Количество() - 1 Цикл - - КолонкаТаблицаКлючевыхОпераций = ТаблицаКлючевыхОпераций.Колонки[ИндексКолонки]; - Если СтрНачинаетсяС(КолонкаТаблицаКлючевыхОпераций.Имя, "Врем") Тогда - ТаблицаКлючевыхОпераций.Колонки.Удалить(КолонкаТаблицаКлючевыхОпераций); - Продолжить; - КонецЕсли; - - Если ИндексКолонки < 3 Тогда - ИндексКолонки = ИндексКолонки + 1; - Продолжить; - КонецЕсли; - КолонкаТаблицаКлючевыхОпераций.Заголовок = ЗаголовкиКолонок[ИндексМассива]; - - ИндексМассива = ИндексМассива + 1; - ИндексКолонки = ИндексКолонки + 1; - - КонецЦикла; - - Возврат ТаблицаКлючевыхОпераций; - КонецЕсли; - -КонецФункции - -// Создает структуру параметров необходимую для расчета APDEX. -// -// Возвращаемое значение: -// Структура: -// ШагЧисло - Число - указывается размер шага в секундах. -// КоличествоШагов - Число - количество шагов в периоде. -// ДатаНачала - Дата - дата начала замеров. -// ДатаОкончания - Дата - дата окончания замеров. -// ТаблицаКлючевыхОпераций - ТаблицаЗначений: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации, ключевая операция. -// НомерСтроки - Число - приоритет ключевой операции. -// ЦелевоеВремя - Число - целевое время ключевой операции. -// ВыводитьИтоги - Булево, -// Истина, вычислять итоговую производительность -// Ложь, не вычислять итоговую производительность. -// -Функция СтруктураПараметровДляРасчетаАпдекса() Экспорт - СтруктураПараметров = Новый Структура; - - СтруктураПараметров.Вставить("ШагЧисло"); - СтруктураПараметров.Вставить("КоличествоШагов"); - СтруктураПараметров.Вставить("ДатаНачала"); - СтруктураПараметров.Вставить("ДатаОкончания"); - СтруктураПараметров.Вставить("ТаблицаКлючевыхОпераций"); - СтруктураПараметров.Вставить("ВыводитьИтоги"); - СтруктураПараметров.Вставить("Комментарий"); - СтруктураПараметров.Вставить("ВариантФильтраКомментарий"); - - Возврат СтруктураПараметров; -КонецФункции - -// Вычисляет размер и количество шагов на заданном интервале. -// -// Параметры: -// ШагЧисло - Число - количество секунд, которое надо прибавить к дате начала чтобы выполнить следующий шаг. -// КоличествоШагов - Число - количество шагов на заданном интервале. -// -// Возвращаемое значение: -// Булево - -// Истина, параметры рассчитаны -// Ложь, параметры не рассчитаны. -// -Функция ПериодичностьДиаграммы(ШагЧисло, КоличествоШагов) Экспорт - РазницаВремени = ДатаОкончания - ДатаНачала + 1; - - Если РазницаВремени <= 0 Тогда - Возврат Ложь; - КонецЕсли; - - // КоличествоШагов - целое число, округленное вверх. - КоличествоШагов = 0; - Если Шаг = "Час" Тогда - ШагЧисло = 86400 / 24; - КоличествоШагов = РазницаВремени / ШагЧисло; - КоличествоШагов = Цел(КоличествоШагов) + ?(КоличествоШагов - Цел(КоличествоШагов) > 0, 1, 0); - ИначеЕсли Шаг = "День" Тогда - ШагЧисло = 86400; - КоличествоШагов = РазницаВремени / ШагЧисло; - КоличествоШагов = Цел(КоличествоШагов) + ?(КоличествоШагов - Цел(КоличествоШагов) > 0, 1, 0); - ИначеЕсли Шаг = "Неделя" Тогда - ШагЧисло = 86400 * 7; - КоличествоШагов = РазницаВремени / ШагЧисло; - КоличествоШагов = Цел(КоличествоШагов) + ?(КоличествоШагов - Цел(КоличествоШагов) > 0, 1, 0); - ИначеЕсли Шаг = "Месяц" Тогда - ШагЧисло = 86400 * 30; - Врем = КонецДня(ДатаНачала); - Пока Врем <= ДатаОкончания Цикл - Врем = ДобавитьМесяц(Врем, 1); - КоличествоШагов = КоличествоШагов + 1; - КонецЦикла; - Иначе - ШагЧисло = 0; - КоличествоШагов = 1; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Процедура рассчитывает итоговое значение APDEX. -// -// Параметры: -// ТаблицаКлючевыхОпераций - ТаблицаЗначений - результат запроса рассчитавшего APDEX. -// -Процедура ВычислитьИтоговыйAPDEX(ТаблицаКлючевыхОпераций) - - // Начинаем с 4 колонки первые 3 это КлючеваяОперация, Приоритет, ЦелевоеВремя. - ИндексНачальнойКолонки = 3; - ИндексСтрокиИтогов = 0; - ИндексКолонкиПриоритет = 1; - ИндексПоследнейСтроки = ТаблицаКлючевыхОпераций.Количество() - 1; - ИндексПоследнейКолонки = ТаблицаКлючевыхОпераций.Колонки.Количество() - 1; - МинимальныйПриоритет = ТаблицаКлючевыхОпераций[ИндексПоследнейСтроки][ИндексКолонкиПриоритет]; - - // Обнуление строки итогов - Для Колонка = ИндексКолонкиПриоритет По ИндексПоследнейКолонки Цикл - Если НЕ ЗначениеЗаполнено(ТаблицаКлючевыхОпераций[ИндексСтрокиИтогов][Колонка]) Тогда - ТаблицаКлючевыхОпераций[ИндексСтрокиИтогов][Колонка] = 0; - КонецЕсли; - КонецЦикла; - - Если МинимальныйПриоритет < 1 Тогда - МинимальныйПриоритет = 1; - КонецЕсли; - - Колонка = ИндексНачальнойКолонки; - Пока Колонка < ИндексПоследнейКолонки Цикл - НН = 0; - НС = 0; - НТ = 0; - - МаксимальноеКоличествоОперацийЗаПериод = ТаблицаКлючевыхОпераций[ИндексСтрокиИтогов][Колонка]; - - // с 1 т.к. 0 это строка итогов. - Для Строка = 1 По ИндексПоследнейСтроки Цикл - - ПриоритетТекущейОперации = ТаблицаКлючевыхОпераций[Строка][ИндексКолонкиПриоритет]; - КоличествоТекущейОперации = ТаблицаКлючевыхОпераций[Строка][Колонка]; - - Коэффициент = ?(КоличествоТекущейОперации = 0, 0, - МаксимальноеКоличествоОперацийЗаПериод / КоличествоТекущейОперации * (1 - (ПриоритетТекущейОперации - 1) / МинимальныйПриоритет)); - - ТаблицаКлючевыхОпераций[Строка][Колонка] = ТаблицаКлючевыхОпераций[Строка][Колонка] * Коэффициент; - ТаблицаКлючевыхОпераций[Строка][Колонка + 1] = ТаблицаКлючевыхОпераций[Строка][Колонка + 1] * Коэффициент; - ТаблицаКлючевыхОпераций[Строка][Колонка + 2] = ТаблицаКлючевыхОпераций[Строка][Колонка + 2] * Коэффициент; - - НН = НН + ТаблицаКлючевыхОпераций[Строка][Колонка]; - НС = НС + ТаблицаКлючевыхОпераций[Строка][Колонка + 1]; - НТ = НТ + ТаблицаКлючевыхОпераций[Строка][Колонка + 2]; - КонецЦикла; - - Если НН = 0 Тогда - ИтоговыйAPDEX = 0; - ИначеЕсли НС = 0 И НТ = 0 И НН <> 0 Тогда - ИтоговыйAPDEX = 0.001; - Иначе - ИтоговыйAPDEX = (НС + НТ / 2) / НН; - КонецЕсли; - ТаблицаКлючевыхОпераций[ИндексСтрокиИтогов][Колонка + 3] = ИтоговыйAPDEX; - - Колонка = Колонка + 4; - - КонецЦикла; - -КонецПроцедуры - -Функция ЗаголовокКолонки(НачалоПериода) - - Если Шаг = "Час" Тогда - ЗаголовокКолонки = Формат(НачалоПериода, "ДЛФ=T"); - Иначе - ЗаголовокКолонки = Формат(НачалоПериода, "ДЛФ=D"); - КонецЕсли; - Возврат ЗаголовокКолонки; - -КонецФункции - -#КонецОбласти - -#Иначе -ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); -#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/ОценкаПроизводительности.mdo b/SSL/src/DataProcessors/ОценкаПроизводительности/ОценкаПроизводительности.mdo index 7131521ca..d0f0658f0 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/ОценкаПроизводительности.mdo +++ b/SSL/src/DataProcessors/ОценкаПроизводительности/ОценкаПроизводительности.mdo @@ -247,15 +247,6 @@ - - ИсторияВыполнения - - ru - История выполнения - - PersonalComputer - MobileDevice - АвтоматическийЭкспортЗамеровПроизводительности @@ -270,24 +261,6 @@ PersonalComputer MobileDevice - - Форма - - ru - Форма - - PersonalComputer - MobileDevice - - - ФормаОтбора - - ru - Форма отбора - - PersonalComputer - MobileDevice - ЭкспортЗамеровПроизводительности diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form index ed303b6a9..62a23df5b 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Обслуживание/Form.form @@ -3079,7 +3079,7 @@ <key>ru</key> - <value>Детализировать обновление ИБВ журнале регистрации</value> + <value>Детализировать обновление ИБ в журнале регистрации</value> 43 false diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form index ac80ef3e2..acfe23a3b 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Form.form @@ -1377,7 +1377,7 @@ ГруппаЭлектроннаяПодписьИШифрование 1949 - ГруппаИспользоватьЭлектроннуюПодписьИШифрование + ГруппаЭлектроннаяПодпись 1951 ГоризонтальнаяГруппа @@ -1476,6 +1476,8 @@ Горизонтальная группа ShowBottom + 43 + false ГоризонтальнаяГруппаРасширеннаяПодсказка 1954 @@ -1492,7 +1494,7 @@ UsualGroup - HorizontalIfPossible + AlwaysHorizontal Auto true true @@ -1500,40 +1502,6 @@ Auto - true - true - - true - - - <key>ru</key> - <value>Использовать электронную подпись и шифрование</value> - - 43 - false - - ГруппаИспользоватьЭлектроннуюПодписьИШифрованиеРасширеннаяПодсказка - 1952 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНастройкиЭлектроннойПодписиИШифрования - 1964 НастройкиЭлектроннойПодписиИШифрования 2049 @@ -1572,13 +1540,186 @@ <key>ru</key> - <value>Настройки электронной подписи и шифрования</value> + <value>Электронная подпись</value> - 43 false - ГруппаНастройкиЭлектроннойПодписиИШифрованияРасширеннаяПодсказка - 1965 + ГруппаЭлектроннаяПодписьРасширеннаяПодсказка + 1952 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаОблачнаяПодпись + 2113 + + ИспользоватьСервисОблачнойПодписи + 2115 + true + true + + true + + + НаборКонстант.ИспользоватьСервисОблачнойПодписи + + Right + ShowBottom + + OnChange + Подключаемый_ПриИзмененииРеквизита + + + ИспользоватьСервисОблачнойПодписиРасширеннаяПодсказка + 2117 + + <key>ru</key> + <value>Разрешить использовать для подписания сервисы облачной подписи.</value> + + Label + true + true + + Left + + + + ИспользоватьСервисОблачнойПодписиКонтекстноеМеню + 2116 + true + + CheckBoxField + Enter + true + Left + true + + + + ГруппаОблачнаяПодписьНастройки + 2118 + + ОбработкаУправлениеПодключениемDSSСерверыОблачнойПодписи + 2120 + true + true + + true + + + ОбработкаУправлениеПодключениемDSSСерверыОблачнойПодписиРасширеннаяПодсказка + 2121 + + <key>ru</key> + <value>Настройка серверов облачной подписи, +необходимо для организации подключения.</value> + + Label + 28 + true + + Left + + + Hyperlink + DataProcessor.УправлениеПодключениемDSS.Command.СерверыОблачнойПодписи + Normal + Auto + 43 + true + true + true + UserCmds + ShowBottom + Auto + + + ОбработкаУправлениеПодключениемDSSУчетныеЗаписиОблачнойПодписи + 2122 + true + true + + true + + + ОбработкаУправлениеПодключениемDSSУчетныеЗаписиОблачнойПодписиРасширеннаяПодсказка + 2123 + + <key>ru</key> + <value>Настройка учетных записей используемые для выполнения операций</value> + + Label + true + true + + Left + + + Hyperlink + DataProcessor.УправлениеПодключениемDSS.Command.УчетныеЗаписиОблачнойПодписи + Normal + Auto + true + true + UserCmds + ShowBottom + Auto + + true + true + + true + + + <key>ru</key> + <value>Облачная подпись настройки</value> + + + ГруппаОблачнаяПодписьНастройкиРасширеннаяПодсказка + 2119 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Облачная подпись</value> + + + ГруппаОблачнаяПодписьРасширеннаяПодсказка + 2114 Label true true @@ -1617,7 +1758,7 @@ UsualGroup - HorizontalIfPossible + Vertical Collapsible true Button diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html index 5a13d3f8b..cf90843f5 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html @@ -4,14 +4,13 @@ TD { VERTICAL-ALIGN: top } - +

          В данной панели осуществляется настройка основных параметров программы.

          • Заголовок программы - введите текст, который будет отображаться в заголовке окна программы.
          • -
          • Региональные настройки - с помощью ссылки можно перейти к настройкам:
          • -
            • Часовой пояс - часовой пояс, в котором ведется учет в программе. Все даты документов и других данных в программе хранятся в этом часовом поясе. +
            • Часовой пояс - часовой пояс, в котором ведется учет в программе. Все даты документов и других данных в программе хранятся в этом часовом поясе.
            • -
            • Время текущего сеанса - с помощью этой команды можно узнать, насколько время клиента отличается от времени сервера с поправкой на часовой пояс.

          Публикация информационной базы

          +
        • Время текущего сеанса - с помощью этой команды можно узнать, насколько время клиента отличается от времени сервера с поправкой на часовой пояс.

        Публикация информационной базы

        • Настройки программы Адрес в интернете и Локальный адрес предназначены для формирования ссылок на объекты информационной базы в зависимости от вида подключения пользователей к информационной базе.
        • @@ -21,40 +20,38 @@ TD {
        • Параметры доступа в Интернет - настройки параметров прокси-сервера на сервере 1С:Предприятие.
        • -
        • Использование профилей безопасности - использование профилей безопасности для контроля за использованием программой внешних (относительно кластера серверов 1С:Предприятия) ресурсов.

        Контактная информация

        +
      • Использование профилей безопасности - использование профилей безопасности для контроля за использованием программой внешних (относительно кластера серверов 1С:Предприятия) ресурсов.
      +

      Контактная информация

      +
      • Виды контактной информации - добавление и настройка видов контактной информации различных объектов программы, например, партнеров, контрагентов, сотрудников и т.д.

      Дополнительные реквизиты и сведения

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

        История изменений

        +
      • Реквизиты и сведения с общим списком значений - включите флажок, для того чтобы разрешить добавление реквизитов, у которых общий список значений с другими реквизитами (команда Добавить - Из другого набора - Сделать копию по образцу). +
      • +
      • Общие реквизиты и сведения - включите флажок, для того чтобы разрешить добавление реквизитов сразу к нескольким объектам программы одновременно (команда Добавить - Из другого набора - Сделать реквизит общим и добавить в набор). +
      • +
      • Дополнительные реквизиты - настройка состава дополнительных реквизитов для справочников и документов. +
      • +
      • Дополнительные сведения - настройка состава дополнительных сведений для справочников и документов.

      История изменений

      Программа позволяет вести историю изменения списков, просматривать любую версию объекта или сравнивать любые версии объекта между собой.

      • Хранить историю изменений - Включите флажок для ведения истории изменения объектов программы. После этого становится доступной команда:
      • -
      • Настроить - Настройка хранения и очистка версий документов и справочников.

      Поиск данных

      - +
    • Настроить - Настройка хранения и очистка версий документов и справочников.
    • +

      Поиск данных

      +
      • Полнотекстовый поиск данных - Включите флажок, после этого становится доступной команда:
      • -
      • Настроить - Настройка полнотекстового поиска и поддержка индекса полнотекстового поиска в актуальном состоянии.

      Электронная подпись и шифрование

      -
      • -Электронная подпись - включите флажок, для того чтобы разрешить использовать электронные подписи и проверять отсутствие изменений файла с момента формирования электронной подписи. +
      • Настроить - Настройка полнотекстового поиска и поддержка индекса полнотекстового поиска в актуальном состоянии.
      +

      Электронная подпись и шифрование

      +
      • Электронная подпись - включите флажок, для того чтобы разрешить использовать электронные подписи и проверять отсутствие изменений файла с момента формирования электронной подписи.
      • Шифрование - включите флажок, для того чтобы разрешить шифрование файлов.
      • -
      • - -Настройки электронной подписи и шифрования - переход к настройке параметров подключения средств криптографии: электронной подписи и шифрования. 

      - - -

      Удаление помеченных объектов

      -
      - - -
      • Автоматически удалять помеченные - включите флажок, для того чтобы выполнять удаление помеченных объектов по расписанию. После этого становится доступной ссылка:
      • -
      • Настроить расписание - переход к настройке расписания автоматического удаления помеченных объектов.
      • -
      • Посмотреть помеченные на удаление - открыть рабочее место для удаления помеченных объектов. -
      -

      -

      См. также:

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

      \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl index 37aa96934..d42233a88 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Module.bsl @@ -44,6 +44,13 @@ Элементы.ГруппаДополнительныеРеквизитыИСведения.Видимость = Ложь; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + ЭтоАдминистратор = Пользователи.ЭтоПолноправныйПользователь(, Истина); + Элементы.ИспользоватьСервисОблачнойПодписи.Видимость = ЭтоАдминистратор И ОбщегоНазначения.РазделениеВключено(); + Иначе + Элементы.ГруппаОблачнаяПодпись.Видимость = Ложь; + КонецЕсли; + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда Элементы.ГруппаВерсионирование.Видимость = Ложь; КонецЕсли; @@ -418,7 +425,7 @@ Или РеквизитПутьКДанным = "НаборКонстант.ИспользоватьШифрование" Или РеквизитПутьКДанным = "") И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - Элементы.ГруппаНастройкиЭлектроннойПодписиИШифрования.Доступность = + Элементы.НастройкиЭлектроннойПодписиИШифрования.Доступность = НаборКонстант.ИспользоватьЭлектронныеПодписи Или НаборКонстант.ИспользоватьШифрование; КонецЕсли; @@ -440,6 +447,20 @@ "Видимость", Не ДоступностьНастройкиПроксиНаСервере); КонецЕсли; + Если (РеквизитПутьКДанным = "НаборКонстант.ИспользоватьЭлектронныеПодписи" + ИЛИ РеквизитПутьКДанным = "НаборКонстант.ИспользоватьШифрование" + ИЛИ РеквизитПутьКДанным = "НаборКонстант.ИспользоватьСервисОблачнойПодписи" + ИЛИ РеквизитПутьКДанным = "") + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяОблачнаяПодпись") Тогда + + ДоступностьОблачнойПодписи = (НаборКонстант.ИспользоватьЭлектронныеПодписи ИЛИ НаборКонстант.ИспользоватьШифрование) + И (НаборКонстант.ИспользоватьСервисОблачнойПодписи); + + Элементы.ОбработкаУправлениеПодключениемDSSСерверыОблачнойПодписи.Доступность = ДоступностьОблачнойПодписи; + Элементы.ОбработкаУправлениеПодключениемDSSУчетныеЗаписиОблачнойПодписи.Доступность = ДоступностьОблачнойПодписи; + + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html index e5acfaed2..763693330 100644 --- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html +++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html @@ -9,7 +9,7 @@ TD {
      • Синхронизация данных - включите флажок, для того чтобы стали доступными раздел программы Синхронизация данных и команды:
          -
        • Настройки синхронизации данных - переход к настройке и выполнению синхронизации данных с другими программами (например, с 1С:Бухгалтерия предприятия, редакция 3.0), а также организации совместной работы в распределенной информационной базе.
        • +
        • Настройки синхронизации данных - переход к настройке и выполнению синхронизации данных с другими программами (например, с 1С:Бухгалтерия предприятия, редакция 3.0), а также организации совместной работы в распределенной информационной базе.
        • Даты запрета загрузки - включите флажок, для того чтобы использовать возможность запрета загрузки данных прошлых периодов из других программ.
        • См. также: Даты запрета изменения в подразделе Общие настройки.
          • После этого становится доступной команда: diff --git a/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl index 148a3ab65..b4f9b105d 100644 --- a/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПереносФайлов/Forms/Форма/Module.bsl @@ -329,10 +329,6 @@ КонецПроцедуры -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - &НаСервере Процедура ПеренестиМеждуТомами(ФайлОбъект, СвойстваТома) СвойстваФайла = РаботаСФайламиВТомахСлужебный.СвойстваФайлаВТоме(); @@ -494,6 +490,8 @@ | ВерсииФайлов.Автор КАК Автор, | ВерсииФайлов.Владелец.ВладелецФайла КАК ВладелецФайла, | ВерсииФайлов.ДатаСоздания КАК ДатаСоздания, + | ВерсииФайлов.Владелец.Зашифрован КАК Зашифрован, + | ВерсииФайлов.Владелец.ПодписанЭП КАК ПодписанЭП, | &Служебный КАК Служебный, | ВерсииФайлов.Владелец.Изменил КАК Изменил, | ВерсииФайлов.Размер КАК Размер, @@ -548,6 +546,8 @@ | СправочникФайлов.Автор, | СправочникФайлов.ВладелецФайла, | СправочникФайлов.ДатаСоздания, + | СправочникФайлов.Зашифрован, + | СправочникФайлов.ПодписанЭП, | &Служебный, | СправочникФайлов.Изменил, | СправочникФайлов.Размер, diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl index cbe294c5b..7754ba737 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаВКонтакте/Module.bsl @@ -25,7 +25,7 @@ КонецЕсли; Если ОписаниеИнтеграции.Использование Тогда - Элементы.Закрыть.Заголовок = "Изменить"; + Элементы.Закрыть.Заголовок = НСтр("ru='Изменить'"); Элементы.Отключить.Видимость = Истина; КонецЕсли; diff --git a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl index 6f322b487..da5769f8d 100644 --- a/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl +++ b/SSL/src/DataProcessors/ПодключениеОбсуждений/Forms/СозданиеБотаТелеграм/Module.bsl @@ -25,7 +25,7 @@ КонецЕсли; Если ОписаниеИнтеграции.Использование Тогда - Элементы.Закрыть.Заголовок = "Изменить"; + Элементы.Закрыть.Заголовок = НСтр("ru='Изменить'"); Элементы.Отключить.Видимость = Истина; КонецЕсли; diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form index d61574c8d..0221aac3b 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Form.form @@ -437,10 +437,6 @@ true - - <key>ru</key> - <value>Установить снять флажки</value> - ГруппаУстановитьСнятьФлажкиРасширеннаяПодсказка 462 @@ -515,10 +511,6 @@ true - - <key>ru</key> - <value>Свернуть развернуть</value> - ГруппаСвернутьРазвернутьРасширеннаяПодсказка 460 @@ -1121,10 +1113,6 @@ true - - <key>ru</key> - <value>Найденные дубли контекстное меню группа изменить</value> - НайденныеДублиКонтекстноеМенюГруппаИзменитьРасширеннаяПодсказка 423 @@ -1223,10 +1211,6 @@ true - - <key>ru</key> - <value>Найденные дубли контекстное меню группа изменить форму</value> - НайденныеДублиКонтекстноеМенюГруппаИзменитьФормуРасширеннаяПодсказка 427 @@ -2908,10 +2892,6 @@ true - - <key>ru</key> - <value>Необработанные дубли контекстное меню группа открыть</value> - НеобработанныеДублиКонтекстноеМенюГруппаОткрытьРасширеннаяПодсказка 443 @@ -3010,10 +2990,6 @@ true - - <key>ru</key> - <value>Необработанные дубли контекстное меню группа изменить форму</value> - НеобработанныеДублиКонтекстноеМенюГруппаИзменитьФормуРасширеннаяПодсказка 441 diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl index 064b89a9c..5005ee6db 100644 --- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl +++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/Forms/ПоискДублей/Module.bsl @@ -1246,7 +1246,7 @@ ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - НаборДанных.Запрос = "ВЫБРАТЬ " + ДоступныеРеквизитыОтбора(ОбъектМетаданных) + " ИЗ " + ОбластьПоискаДублей; // @query-part-2 + НаборДанных.Запрос = "ВЫБРАТЬ " + ДоступныеРеквизитыОтбора(ОбъектМетаданных) + " ИЗ " + ОбластьПоискаДублей; // @query-part-1 @query-part-2 НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; АдресСхемыКомпоновки = ПоместитьВоВременноеХранилище(СхемаКомпоновки, УникальныйИдентификатор); diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form index 06d0d69c3..74f454ac3 100644 --- a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/ВыборОбластиПоиска/Form.form @@ -129,10 +129,6 @@ true - - <key>ru</key> - <value>Команды</value> - КомандыРасширеннаяПодсказка 34 diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl index fa9607a52..8078b44b5 100644 --- a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl +++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/УправлениеПолнотекстовымПоискомИИзвлечениемТекстов/Module.bsl @@ -183,7 +183,7 @@ &НаКлиенте Процедура РегламентныеЗаданияГиперссылкаНажатие(ИмяПредопределенного) - Сведения = СведенияОРегламентныхЗаданиях[ИмяПредопределенного]; + Сведения = СведенияОРегламентномЗаданииКлиент(ИмяПредопределенного); Если Сведения.Идентификатор = Неопределено Тогда Возврат; КонецЕсли; @@ -266,7 +266,7 @@ &НаСервере Процедура РегламентныеЗаданияСохранить(ИмяПредопределенного, Изменения, УстановитьВидимостьДоступность) - Сведения = СведенияОРегламентныхЗаданиях[ИмяПредопределенного]; + Сведения = СведенияОРегламентномЗадании(ИмяПредопределенного); Если Сведения.Идентификатор = Неопределено Тогда Возврат; КонецЕсли; @@ -389,7 +389,7 @@ Элементы.РедактироватьРегламентноеЗадание.Доступность = НаборКонстант.ИзвлекатьТекстыФайловНаСервере; Элементы.ЗапуститьИзвлечениеТекстов.Доступность = Не НаборКонстант.ИзвлекатьТекстыФайловНаСервере; Если НаборКонстант.ИзвлекатьТекстыФайловНаСервере Тогда - Сведения = СведенияОРегламентныхЗаданиях["ИзвлечениеТекста"]; + Сведения = СведенияОРегламентномЗадании("ИзвлечениеТекста"); РасписаниеПредставление = Строка(Сведения.Расписание); РасписаниеПредставление = ВРег(Лев(РасписаниеПредставление, 1)) + Сред(РасписаниеПредставление, 2); Иначе @@ -402,7 +402,7 @@ &НаСервере Процедура ЗаполнитьСведенияОРегламентномЗадании(ИмяПредопределенного) - Сведения = Новый Структура("Идентификатор, Использование, Расписание"); + Сведения = НовыеСведенияОРегламентномЗадании(); СведенияОРегламентныхЗаданиях.Вставить(ИмяПредопределенного, Сведения); Задание = РегламентныеЗаданияНайтиПредопределенное(ИмяПредопределенного); Если Задание = Неопределено Тогда @@ -413,6 +413,33 @@ Сведения.Расписание = Задание.Расписание; КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * Идентификатор - УникальныйИдентификатор +// * Использование - Булево +// * Расписание - РасписаниеРегламентногоЗадания +// +&НаСервере +Функция НовыеСведенияОРегламентномЗадании() + Возврат Новый Структура("Идентификатор, Использование, Расписание"); +КонецФункции + +// Возвращаемое значение: +// см. НовыеСведенияОРегламентномЗадании +// +&НаСервере +Функция СведенияОРегламентномЗадании(ИмяПредопределенного) + Возврат СведенияОРегламентныхЗаданиях[ИмяПредопределенного]; +КонецФункции + +// Возвращаемое значение: +// см. НовыеСведенияОРегламентномЗадании +// +&НаКлиенте +Функция СведенияОРегламентномЗаданииКлиент(ИмяПредопределенного) + Возврат СведенияОРегламентныхЗаданиях[ИмяПредопределенного]; +КонецФункции + &НаСервере Функция РегламентныеЗаданияНайтиПредопределенное(ИмяПредопределенного) Фильтр = Новый Структура("Метаданные", ИмяПредопределенного); diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form index 9bd8bda2a..cd0366d40 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Form.form @@ -1188,10 +1188,6 @@ true - - <key>ru</key> - <value>Команда загрузки</value> - ГруппаКомандаЗагрузкиРасширеннаяПодсказка 759 @@ -1266,10 +1262,6 @@ true - - <key>ru</key> - <value>Команды списка</value> - ГруппаКомандыСпискаРасширеннаяПодсказка 761 @@ -1317,10 +1309,6 @@ true - - <key>ru</key> - <value>Команда обновления</value> - ГруппаКомандаОбновленияРасширеннаяПодсказка 764 @@ -1933,10 +1921,6 @@ true - - <key>ru</key> - <value>Дерево информации статистики контекстное меню группа 1</value> - ДеревоИнформацииСтатистикиКонтекстноеМенюГруппа1ExtendedTooltip 767 @@ -2009,10 +1993,6 @@ true - - <key>ru</key> - <value>Информация статистики группа 2</value> - ИнформацияСтатистикиГруппа2ExtendedTooltip 769 diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl index ada0c276b..6392dd16d 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl @@ -154,7 +154,7 @@ Если (ЗакончитьСопоставлениеДанных И Не ПропуститьПолучениеДанных) Или (РезультатЗагрузкиДанных = "Предупреждение_СообщениеОбменаБылоРанееПринято") Или УдалитьСообщениеДляСопоставления Тогда - УдалитьСообщениеДляСопоставленияДанных(Объект.УзелИнформационнойБазы); + УдалитьСообщениеДляСопоставленияДанных(Объект.УзелИнформационнойБазы, Объект.ВидТранспортаСообщенийОбмена); КонецЕсли; КонецЕсли; @@ -1591,7 +1591,7 @@ КонецПроцедуры &НаСервереБезКонтекста -Процедура УдалитьСообщениеДляСопоставленияДанных(УзелОбмена) +Процедура УдалитьСообщениеДляСопоставленияДанных(УзелОбмена, ВидТранспортаСообщенийОбмена = Неопределено) УстановитьПривилегированныйРежим(Истина); @@ -1600,7 +1600,10 @@ Если ЗначениеЗаполнено(ОбщиеНастройки.СообщениеДляСопоставленияДанных) Тогда - ИмяФайлаСообщенияВХранилище = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ОбщиеНастройки.СообщениеДляСопоставленияДанных); + WSПассивныйРежимФайловаяИБ = ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим + И ОбщегоНазначения.ИнформационнаяБазаФайловая(); + + ИмяФайлаСообщенияВХранилище = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ОбщиеНастройки.СообщениеДляСопоставленияДанных, WSПассивныйРежимФайловаяИБ); Файл = Новый Файл(ИмяФайлаСообщенияВХранилище); Если Файл.Существует() И Файл.ЭтоФайл() Тогда @@ -1925,7 +1928,9 @@ Процедура ОбработатьСтатусВыполненияФоновогоЗадания(ВыполняемоеДействие = Неопределено) ЗафиксироватьЗавершение = Ложь; - Если РезультатВыполненияФоновогоЗадания.Статус = "Ошибка" Тогда + Если ТипЗнч(РезультатВыполненияФоновогоЗадания) <> Тип("Структура") Тогда + Возврат; + ИначеЕсли РезультатВыполненияФоновогоЗадания.Статус = "Ошибка" Тогда СообщениеОбОшибке = РезультатВыполненияФоновогоЗадания.ПодробноеПредставлениеОшибки; ЗафиксироватьЗавершение = Истина; ИначеЕсли РезультатВыполненияФоновогоЗадания.Статус = "Отменено" Тогда @@ -2304,9 +2309,9 @@ КонецФункции &НаКлиенте -Процедура ЗавершениеАнализаДанных() +Процедура ЗавершениеАнализаДанных() Экспорт - ОбработатьСтатусВыполненияФоновогоЗадания(); + ОбработатьСтатусВыполненияФоновогоЗадания("ЗагрузкаДанных"); Если Не ПропуститьПолучениеДанных И ЗначениеЗаполнено(СообщениеОбОшибке) Тогда ПропуститьПолучениеДанных = Истина; @@ -2538,7 +2543,7 @@ Если (ЗакончитьСопоставлениеДанных И Не ПропуститьПолучениеДанных) Или (ТекущийРезультатЗагрузкиДанных = "Предупреждение_СообщениеОбменаБылоРанееПринято") Тогда - УдалитьСообщениеДляСопоставленияДанных(Объект.УзелИнформационнойБазы); + УдалитьСообщениеДляСопоставленияДанных(Объект.УзелИнформационнойБазы, Объект.ВидТранспортаСообщенийОбмена); КонецЕсли; КонецЕсли; diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html index f11c28eb4..d776df2f0 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html @@ -1,7 +1,7 @@

            Помощник интерактивной синхронизации данных предназначен для выполнения синхронизации данных с возможностью предварительного просмотра и сопоставления загружаемых данных. Помощник позволяет выполнять сопоставление объектов двух информационных баз, между которыми настроена синхронизация данных. После выполнения сопоставления выполняется загрузка данных и последующая выгрузка данных.

            Режим интерактивной синхронизации данных следует использовать в случае, когда до начала синхронизации один и тот же объект мог быть введен независимо в обеих обменивающихся ИБ. Другими словами, интерактивный режим синхронизации данных следует выбирать при первой синхронизации данных между ИБ, учет в которых уже ведется. Поскольку вероятность существования в таких ИБ одних и тех же объектов очень высока. В этом случае интерактивный режим позволит такие объекты сопоставить вручную.

            -

            Открыть помощник можно, нажав кнопку  Запустить синхронизацию в списке Синхронизация данных.

            +

            Открыть помощник можно, нажав кнопку  Запустить синхронизацию в списке Синхронизация данных.

            Параметры подключения

            • На первой странице помощника следует выбрать вид транспорта сообщений обмена (можно изменить уже имеющийся вариант подключения, он указан на этой странице), для этого нажмите  Настроить, при необходимости можно перейти в каталог обмена информацией и убедиться в физическом существовании требуемых файлов или проверить параметры транспорта сообщений обмена.
            • Для перехода к следующей странице нажмите кнопку Далее.

            Сопоставление данных

            @@ -48,4 +48,4 @@
          • Не удалось отправить данные или Данные успешно отправлены и т.д.
          • По ссылке Подробно можно перейти в журнал регистрации и просмотреть, как проходил процесс синхронизации, узнать об ошибках.
        • При необходимости можно настроить расписание для синхронизации данных в автоматическом режиме (в том случае, если текущая синхронизация данных еще не включена ни в одно из существующих расписаний выполнения синхронизации). Нажмите Настроить.
        • Для завершения работы с помощником нажмите Готово.

        См. также:

        - \ No newline at end of file + \ No newline at end of file diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl index e106bc6e2..dffcd41c9 100644 --- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ManagerModule.bsl @@ -45,9 +45,13 @@ ИмяВременногоФайла = ""; Если ЗначениеЗаполнено(ОбщиеНастройки.СообщениеДляСопоставленияДанных) Тогда - ИмяВременногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ОбщиеНастройки.СообщениеДляСопоставленияДанных); + + WSПассивныйРежимФайловаяИБ = ОбщегоНазначения.ИнформационнаяБазаФайловая() + И Параметры.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим; + + ИмяВременногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ОбщиеНастройки.СообщениеДляСопоставленияДанных, WSПассивныйРежимФайловаяИБ); - Файл = Новый Файл(ИмяВременногоФайла); + Файл = Новый Файл(ИмяВременногоФайла); Если Файл.Существует() И Файл.ЭтоФайл() Тогда // Помещаем информацию о сообщении для сопоставления обратно в хранилище, // на случай аварийного завершения процесса анализа данных, для возможности повторной работы с сообщением. diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form index 6aaaf18f6..b918f8097 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Form.form @@ -4613,6 +4613,255 @@ Auto + + ГруппаДублированиеНастроекСинхронизации + 806 + + Группа4 + 819 + + Декорация20 + 808 + true + true + + true + + + Декорация20РасширеннаяПодсказка + 810 + Label + true + true + + Left + + + + Декорация20КонтекстноеМеню + 809 + true + + true + true + + + CommonPicture.Предупреждение32 + + AsFileRef + + + + Группа5 + 821 + + Декорация3 + 780 + + <key>ru</key> + <value>Уже существует настроенная синхронизация между информационными базами.</value> + + true + true + + true + + + Декорация3РасширеннаяПодсказка + 782 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 781 + true + + Label + 60 + true + true + + Left + + + + ИсправитьДублированиеНастроекСинхронизации + 823 + + <key>ru</key> + <value>Исправить</value> + + true + true + + true + + + ИсправитьДублированиеНастроекСинхронизации + + Right + ShowBottom + + OnChange + ИсправитьДублированиеНастроекСинхронизацииПриИзменении + + + ИсправитьДублированиеНастроекСинхронизацииРасширеннаяПодсказка + 825 + Label + 50 + true + true + + Left + + + + ИсправитьДублированиеНастроекСинхронизацииКонтекстноеМеню + 824 + true + + CheckBoxField + Enter + true + Left + true + + + + Декорация18 + 798 + + <key>ru</key> + <value><color #ff0000>Внимание!</> +Данная операция необратима и предназначена только для устранения ошибки синхронизации, связанной с дублированием настроек обмена в информационных базах, которые были получены путем копирования. + +Не рекомендуется применять для работающих синхронизаций.</value> + + true + true + + true + + + Декорация18РасширеннаяПодсказка + 800 + Label + true + true + + Left + + + + Декорация18КонтекстноеМеню + 799 + true + + true + Label + 70 + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа5</value> + + + Группа5РасширеннаяПодсказка + 822 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа4</value> + + + Группа4РасширеннаяПодсказка + 820 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + WeakSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Дублирование настроек синхронизации</value> + + + ГруппаДублированиеНастроекСинхронизацииРасширеннаяПодсказка + 807 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + NormalSeparation + true + true + auto + Auto + Auto + + true true @@ -7190,6 +7439,75 @@ true + + ИсправитьДублированиеНастроекСинхронизации + + <key>ru</key> + <value>Исправить дублирование настроек синхронизации</value> + + 39 + + Boolean + + + true + + + true + + + + УзелКорреспондентаЕстьВЭтойБазе + 19 + + Boolean + + + true + + + true + + + + ЭтотУзелЕстьВКорреспонденте + 40 + + Boolean + + + true + + + true + + + + УзелДляУдаления + 41 + + ExchangePlanRef + + + true + + + true + + + + ИсправитьДублированиеНастроекСинхронизации1 + 20 + + Boolean + + + true + + + true + + КомандаНазад diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl index 2c4461cf1..66dd98008 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаПодключения/Module.bsl @@ -5,7 +5,6 @@ // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// - #Область ОбработчикиСобытийФормы &НаСервере @@ -212,6 +211,31 @@ КонецПроцедуры +&НаКлиенте +Процедура ИсправитьДублированиеНастроекСинхронизацииПриИзменении(Элемент) + + Если ИсправитьДублированиеНастроекСинхронизации И УзелКорреспондентаЕстьВЭтойБазе Тогда + + ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеУдаленияРазрешений", ЭтотОбъект, УзелОбмена); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда + Запросы = ОбменДаннымиВызовСервера.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(УзелОбмена); + МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент"); + МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, Неопределено, ОповещениеОЗакрытии); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеУдаленияРазрешений(Результат, УзелИнформационнойБазы) Экспорт + + Если НЕ Результат = КодВозвратаДиалога.ОК Тогда + ИсправитьДублированиеНастроекСинхронизации = Ложь; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиКомандФормы @@ -690,13 +714,18 @@ Если Не ПроверкаПодключенияВыполнена И Не ПустаяСтрока(СтатусЗавершения.Результат.СообщениеОбОшибке) Тогда - СообщениеОбОшибке = СтатусЗавершения.Результат.СообщениеОбОшибке; + СообщениеОбОшибке = СтатусЗавершения.Результат.СообщениеОбОшибке; КонецЕсли; Если ПроверкаПодключенияВыполнена И СтатусЗавершения.Результат.ПараметрыКорреспондентаПолучены Тогда ЗаполнитьПараметрыКорреспондента(СтатусЗавершения.Результат.ПараметрыКорреспондента); КонецЕсли; + + ЭтотУзелЕстьВКорреспонденте = СтатусЗавершения.Результат.ЭтотУзелЕстьВКорреспонденте; + УзелКорреспондентаЕстьВЭтойБазе = СтатусЗавершения.Результат.УзелКорреспондентаЕстьВЭтойБазе; + УзелДляУдаления = СтатусЗавершения.Результат.УзелДляУдаления; + КонецЕсли; КонецПроцедуры @@ -1186,6 +1215,10 @@ СтруктураНастроекПомощника.Вставить("ПарольАрхиваСообщенияОбмена", ОбычныеКаналыСвязиПарольАрхива); + СтруктураНастроекПомощника.Вставить("ИсправитьДублированиеНастроекСинхронизации", ИсправитьДублированиеНастроекСинхронизации); + СтруктураНастроекПомощника.Вставить("УзелКорреспондентаЕстьВЭтойБазе", УзелКорреспондентаЕстьВЭтойБазе); + СтруктураНастроекПомощника.Вставить("ЭтотУзелЕстьВКорреспонденте", ЭтотУзелЕстьВКорреспонденте); + КонецПроцедуры &НаСервере @@ -2377,6 +2410,31 @@ КонецЕсли; + Если УзелКорреспондентаЕстьВЭтойБазе Или ЭтотУзелЕстьВКорреспонденте Тогда + + Элементы.ГруппаДублированиеНастроекСинхронизации.Видимость = Истина; + + Подсказки = Новый Массив; + + Если ЭтотУзелЕстьВКорреспонденте Тогда + ТекстПодсказки = НСтр("ru = '- Новый код для текущего узла информационной базы'"); + Подсказки.Добавить(ТекстПодсказки); + КонецЕсли; + + Если УзелКорреспондентаЕстьВЭтойБазе Тогда + ТекстПодсказки = НСтр("ru = '- Удаление узла ""%1""'"); + ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПодсказки, УзелДляУдаления); + Подсказки.Добавить(ТекстПодсказки); + КонецЕсли; + + Элементы.ИсправитьДублированиеНастроекСинхронизации.РасширеннаяПодсказка.Заголовок = СтрСоединить(Подсказки, Символы.ПС); + + Иначе + + Элементы.ГруппаДублированиеНастроекСинхронизации.Видимость = Ложь; + + КонецЕсли; + Возврат Неопределено; КонецФункции diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl index 6f10ec256..4494cb159 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НастройкаСинхронизации/Module.bsl @@ -233,7 +233,7 @@ &НаКлиенте Процедура ВыполнитьНачальнуюВыгрузкуДанных(Команда) - + Отказ = Ложь; ПередВыполнениемНачальнойВыгрузки(Отказ); diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Form.form new file mode 100644 index 000000000..6e2ff9e27 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Form.form @@ -0,0 +1,226 @@ +<?xml version="1.0" encoding="UTF-8"?> +<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form"> + <title> + <key>ru</key> + <value>Новый код предопределенного узла</value> + + + ГруппаПредупреждение + 3 + + КартинкаПредупреждение + 5 + + <key>ru</key> + <value>Картинка предупреждение</value> + + true + true + + true + + + КартинкаПредупреждениеРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + КартинкаПредупреждениеКонтекстноеМеню + 6 + true + + true + true + + + CommonPicture.Предупреждение32 + + + + + ДекорацияПредупреждение + 8 + + <key>ru</key> + <value><colorstyle -16>Внимание!</> +Данная операция необратима и предназначена только для устранения ошибки синхронизации, +связанной с дублированием настроек обмена в информационных базах, +которые были получены путем копирования. + +Не рекомендуется применять для работающих синхронизаций.</value> + + true + true + + true + + + ДекорацияПредупреждениеРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ДекорацияПредупреждениеКонтекстноеМеню + 9 + true + + true + Label + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Предупреждение</value> + + + ГруппаПредупреждениеРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + WeakSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ФормаУстановитьНовыйКод + 11 + true + true + + true + + + ФормаУстановитьНовыйКодРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + Form.Command.УстановитьНовыйКод + Auto + true + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.ВыполнениеОбменаДанными + + + true + + + true + +
        true
        +
        + + УзелИнформационнойБазы + 2 + + ExchangePlanRef + + + true + + + true + + + + ИмяПланаОбмена + 3 + + String + + + + true + + + true + + + + УстановитьНовыйКод + + <key>ru</key> + <value>Установить новый код</value> + + 1 + + ru + Установить новый код + + + true + + + + УстановитьНовыйКод + + + Auto + Auto + + + + + + + diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Module.bsl new file mode 100644 index 000000000..e6bd8d633 --- /dev/null +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/НовыйКодПредопределенногоУзла/Module.bsl @@ -0,0 +1,67 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ИмяПланаОбмена = Параметры.ИмяПланаОбмена; + УзелИнформационнойБазы = ПланыОбмена[ИмяПланаОбмена].ЭтотУзел(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура УстановитьНовыйКод(Команда) + + Если УстановитьНовыйКодСервере() Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция УстановитьНовыйКодСервере() + + НачатьТранзакцию(); + Попытка + + БлокировкаДанных = Новый БлокировкаДанных; + + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("ПланОбмена." + ИмяПланаОбмена); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", УзелИнформационнойБазы); + + БлокировкаДанных.Заблокировать(); + + УзелОбменаОбъект = УзелИнформационнойБазы.ПолучитьОбъект(); + УзелОбменаОбъект.Код = Строка(Новый УникальныйИдентификатор); + УзелОбменаОбъект.ОбменДанными.Загрузка = Истина; + УзелОбменаОбъект.Записать(); + + ЗафиксироватьТранзакцию(); + + Возврат Истина; + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; + + Возврат Ложь; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html index 2e6d818d1..cbfd3698b 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html @@ -1,5 +1,5 @@ -

        Предназначен для настройки синхронизации данных. Возможна настройка синхронизации данных между двумя программами по правилам обмена, без использования правил обмена или организация совместной работы в распределенной информационной базе (РИБ).

        +

        Предназначен для настройки синхронизации данных. Возможна настройка синхронизации данных между двумя программами по правилам обмена, без использования правил обмена или организация совместной работы в распределенной информационной базе (РИБ).

        Выбор типа синхронизации данных

        Выберите нужный раздел списка:

        • Обмен данных с другими программами; diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl index 7a46e241b..9d297ee92 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ManagerModule.bsl @@ -764,6 +764,10 @@ РезультатПроверки.Вставить("ПараметрыКорреспондентаПолучены", Ложь); РезультатПроверки.Вставить("ПараметрыКорреспондента", Неопределено); + РезультатПроверки.Вставить("ЭтотУзелЕстьВКорреспонденте", Ложь); + РезультатПроверки.Вставить("УзелКорреспондентаЕстьВЭтойБазе", Ложь); + РезультатПроверки.Вставить("УзелДляУдаления", Неопределено); + Если НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.COM Тогда Результат = ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(НастройкиПодключения); @@ -784,7 +788,7 @@ СообщениеОбОшибке = ""; ПараметрыИнформационнойБазы = ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ПолучитьПараметрыИнформационнойБазы_2_0_1_6( - НастройкиПодключения.ИмяПланаОбмена, "", СообщениеОбОшибке); + НастройкиПодключения.ИмяПланаОбмена, НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника, СообщениеОбОшибке); ПараметрыКорреспондента = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПараметрыИнформационнойБазы); Если Не ПараметрыКорреспондента.ПланОбменаСуществует Тогда @@ -798,7 +802,7 @@ ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата); Возврат; КонецЕсли; - + РезультатПроверки.ПараметрыКорреспондентаПолучены = Истина; РезультатПроверки.ПараметрыКорреспондента = ПараметрыКорреспондента; @@ -827,6 +831,8 @@ Возврат; КонецЕсли; + ПроверитьДублированиеСинхронизаций(НастройкиПодключения, ПараметрыКорреспондента, РезультатПроверки, АдресРезультата); + РезультатПроверки.ПодключениеРазрешено = Истина; ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.WS Тогда @@ -879,9 +885,9 @@ РезультатПроверки.ПодключениеУстановлено = Истина; Если РезультатПроверки.ВерсииИнтерфейса.Найти("3.0.1.1") <> Неопределено Тогда - + СообщениеОбОшибке = ""; - ПараметрыИнформационнойБазы = WSПрокси.GetIBParameters(НастройкиПодключения.ИмяПланаОбмена, "", СообщениеОбОшибке); + ПараметрыИнформационнойБазы = WSПрокси.GetIBParameters(НастройкиПодключения.ИмяПланаОбмена, НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника, СообщениеОбОшибке); ПараметрыКорреспондента = СериализаторXDTO.ПрочитатьXDTO(ПараметрыИнформационнойБазы); Если Не ПараметрыКорреспондента.ПланОбменаСуществует Тогда @@ -895,7 +901,7 @@ ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата); Возврат; КонецЕсли; - + РезультатПроверки.ПараметрыКорреспондентаПолучены = Истина; РезультатПроверки.ПараметрыКорреспондента = ПараметрыКорреспондента; @@ -924,6 +930,8 @@ Возврат; КонецЕсли; + ПроверитьДублированиеСинхронизаций(НастройкиПодключения, ПараметрыКорреспондента, РезультатПроверки, АдресРезультата); + РезультатПроверки.ПодключениеРазрешено = Истина; ИначеЕсли НастройкиПодключения.ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE @@ -953,6 +961,35 @@ КонецПроцедуры +Процедура ПроверитьДублированиеСинхронизаций(НастройкиПодключения, ПараметрыКорреспондента, РезультатПроверки, АдресРезультата) + + Если НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника = "" Тогда + Возврат; + КонецЕсли; + + МенеджерПланаОбмена = ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена]; + ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); + Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(ЭтотУзел) + И ОбменДаннымиXDTOСервер.ПоддерживаетсяВерсияСИдентификаторомОбменаДанными(ЭтотУзел) Тогда + + УзелСсылка = МенеджерПланаОбмена.НайтиПоКоду(ПараметрыКорреспондента.КодЭтогоУзла); + + Если НЕ УзелСсылка.Пустая() Тогда + РезультатПроверки.УзелКорреспондентаЕстьВЭтойБазе = Истина;; + РезультатПроверки.УзелДляУдаления = УзелСсылка; + КонецЕсли; + + РезультатПроверки.ЭтотУзелЕстьВКорреспонденте = ПараметрыКорреспондента.УзелСуществует; + + Если РезультатПроверки.ЭтотУзелЕстьВКорреспонденте + Или РезультатПроверки.УзелКорреспондентаЕстьВЭтойБазе Тогда + РезультатПроверки.СообщениеОбОшибке = НСтр("ru = 'Обнаружено дублирование настроек синхронизации'"); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + Процедура СохранитьНастройкиПодключения(Параметры, АдресРезультата) Экспорт НастройкиПодключения = Неопределено; @@ -965,8 +1002,90 @@ Результат.Вставить("СообщениеОбОшибке", ""); Результат.Вставить("СтрокаНастроекПодключенияXML", ""); - // 1. Сохранение узла и настроек подключения в ИБ. Отказ = Ложь; + + // Исправление дублирования настроек синхронизации + Если НастройкиПодключения.ИсправитьДублированиеНастроекСинхронизации Тогда + + МенеджерПланаОбмена = ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена]; + + Если НастройкиПодключения.ЭтотУзелЕстьВКорреспонденте Тогда + + НачатьТранзакцию(); + Попытка + + ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел(); + + БлокировкаДанных = Новый БлокировкаДанных; + + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("ПланОбмена." + НастройкиПодключения.ИмяПланаОбмена); + ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ЭтотУзел); + + БлокировкаДанных.Заблокировать(); + + НовыйКод = Строка(Новый УникальныйИдентификатор); + + УзелОбменаОбъект = ЭтотУзел.ПолучитьОбъект(); + УзелОбменаОбъект.Код = НовыйКод; + УзелОбменаОбъект.ОбменДанными.Загрузка = Истина; + УзелОбменаОбъект.Записать(); + + НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника = НовыйКод; + НастройкиПодключения.КодПредопределенногоУзла = НовыйКод; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + Отказ = Истина; + + Информация = ИнформацияОбОшибке(); + Результат.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + + КонецПопытки; + + КонецЕсли; + + УзелСсылка = МенеджерПланаОбмена.НайтиПоКоду(НастройкиПодключения.ИдентификаторИнформационнойБазыПриемника); + УзелСуществуетВЭтойБазе = НЕ УзелСсылка.Пустая(); + + Если УзелСуществуетВЭтойБазе И НастройкиПодключения.УзелКорреспондентаЕстьВЭтойБазе Тогда + + Попытка + + ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(УзелСсылка); + + Исключение + + Отказ = Истина; + + Информация = ИнформацияОбОшибке(); + Результат.СообщениеОбОшибке = КраткоеПредставлениеОшибки(Информация); + + ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(Информация)); + + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + Если Отказ Тогда + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + Возврат; + КонецЕсли; + + // 1. Сохранение узла и настроек подключения в ИБ. Попытка ВыполнитьДействияПоНастройкеОбменаДанными(НастройкиПодключения); Исключение @@ -2167,12 +2286,20 @@ Если СтруктураНастроек.Свойство("ИспользоватьПараметрыТранспортаEMAIL") И СтруктураНастроек.ИспользоватьПараметрыТранспортаEMAIL Тогда - // Зачитываем узел УчетнаяЗаписьЭлектроннойПочты. - ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {НачалоЭлемента} - - СтруктураНастроек.Вставить("УчетнаяЗаписьЭлектроннойПочты", ПрочитатьXML(ЧтениеXML)); - - ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {КонецЭлемента} + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + + // Зачитываем узел УчетнаяЗаписьЭлектроннойПочты. + ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {НачалоЭлемента} + + СчитатьДанныеЭлектроннойПочты(СтруктураНастроек, ЧтениеXML); + + ЧтениеXML.Прочитать(); // УчетнаяЗаписьЭлектроннойПочты {КонецЭлемента} + + Иначе + + ЧтениеXML.Пропустить(); + + КонецЕсли; КонецЕсли; @@ -2199,6 +2326,71 @@ КонецПроцедуры +Процедура СчитатьДанныеЭлектроннойПочты(СтруктураНастроек, ЧтениеXML) + + СтруктураУчетнойЗаписиЭлектроннойПочты = Новый Структура; + + СтандартныеРеквизиты = Новый Структура; + СтандартныеРеквизиты.Вставить("Description","Наименование"); + СтандартныеРеквизиты.Вставить("PredefinedDataName","ИмяПредопределенныхДанных"); + + Пока Истина Цикл + + Ключ = ""; + Значение = ""; + + Пока ЧтениеXML.Прочитать() Цикл + + Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + + Ключ = ЧтениеXML.Имя; + + Если СтандартныеРеквизиты.Свойство(Ключ) Тогда + Ключ = СтандартныеРеквизиты[Ключ]; + КонецЕсли; + + ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда + + Значение = ЧтениеXML.Значение; + + ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если ЧтениеXML.Имя = "CatalogObject.УчетныеЗаписиЭлектроннойПочты" И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда + Прервать; + КонецЕсли; + + СтруктураУчетнойЗаписиЭлектроннойПочты.Вставить(Ключ, Значение); + + КонецЦикла; + + ИмяСправочника = "УчетныеЗаписиЭлектроннойПочты"; + Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник." + ИмяСправочника); + УчетнаяЗаписьЭлектроннойПочты = Менеджер.СоздатьЭлемент(); + УчетнаяЗаписьЭлектроннойПочты.Наименование = СтруктураУчетнойЗаписиЭлектроннойПочты.Наименование; + Если СтруктураУчетнойЗаписиЭлектроннойПочты.Свойство("ИмяПредопределенныхДанных") Тогда + УчетнаяЗаписьЭлектроннойПочты.ИмяПредопределенныхДанных = СтруктураУчетнойЗаписиЭлектроннойПочты.ИмяПредопределенныхДанных; + КонецЕсли; + + Для Каждого Реквизит Из Метаданные.Справочники[ИмяСправочника].Реквизиты Цикл + + Если СтруктураУчетнойЗаписиЭлектроннойПочты.Свойство(Реквизит.Имя) = Неопределено Тогда + Возврат; + КонецЕсли; + + УчетнаяЗаписьЭлектроннойПочты[Реквизит.Имя] = СтруктураУчетнойЗаписиЭлектроннойПочты[Реквизит.Имя]; + + КонецЦикла; + + СтруктураНастроек.Вставить("УчетнаяЗаписьЭлектроннойПочты", УчетнаяЗаписьЭлектроннойПочты); + +КонецПроцедуры + Функция НастройкиXDTOКорреспондентаИзXML(ИмяФайлаСтрокаXML, ЭтоФайл, УзелОбмена) Экспорт ЧтениеXML = Новый ЧтениеXML; diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo index a390c622b..e7da68d27 100644 --- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo +++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo @@ -939,4 +939,13 @@ PersonalComputer MobileDevice + + НовыйКодПредопределенногоУзла + + ru + Новый код предопределенного узла + + PersonalComputer + MobileDevice + diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl index fbf56e14c..8a98dbe88 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ГруппаФайлов/Module.bsl @@ -249,10 +249,7 @@ Модифицированность = Ложь; ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); - - Оповестить("Запись_Файл", - Новый Структура("ЭтоНовый", ФайлБылСоздан), - ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура("ЭтоНовый", ФайлБылСоздан), ЭтотОбъект.Объект.Ссылка); Возврат Истина; diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl index 6b584210f..345859559 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныеФайлы/Module.bsl @@ -420,6 +420,7 @@ &НаКлиенте Процедура СписокПриИзменении(Элемент) + ОповеститьОбИзменении(ВладелецФайла); Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), Элемент.ВыделенныеСтроки); КонецПроцедуры @@ -586,13 +587,7 @@ &НаКлиенте Процедура Печать(Команда) - Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов возможна только в Windows.'")); - Возврат; - КонецЕсли; - ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; - Если ВыделенныеСтроки.Количество() > 0 Тогда РаботаСФайламиКлиент.НапечататьФайлы(ВыделенныеСтроки, ЭтотОбъект.УникальныйИдентификатор); КонецЕсли; diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl index 5e2d9fda0..8d175ccfe 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ПрисоединенныйФайл/Module.bsl @@ -304,15 +304,9 @@ &НаКлиенте Процедура Печать(Команда) - Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда - ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов возможна только в Windows.'")); - Возврат; - КонецЕсли; - - Если ЗначениеЗаполнено(ТекущаяСсылкаНаФайл()) - Или ОбработатьКомандуЗаписиФайла() Тогда - - ПечатьФайла(); + Если ЗначениеЗаполнено(ТекущаяСсылкаНаФайл()) Или ОбработатьКомандуЗаписиФайла() Тогда + Файлы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекущаяСсылкаНаФайл()); + РаботаСФайламиКлиент.НапечататьФайлы(Файлы, ЭтотОбъект.УникальныйИдентификатор); КонецЕсли; КонецПроцедуры @@ -798,8 +792,8 @@ Процедура УстановитьВидимостьКомандФормы() Для Каждого Команда Из ИменаКомандИзмененияДанныхФайла() Цикл - Для каждого КоманаФормы Из Команда.Значение Цикл - Элементы[КоманаФормы].Видимость = НЕ ТолькоЧтениеДанныхФайла И Элементы[КоманаФормы].Видимость; + Для каждого КомандаФормы Из Команда.Значение Цикл + Элементы[КомандаФормы].Видимость = НЕ ТолькоЧтениеДанныхФайла И Элементы[КомандаФормы].Видимость; КонецЦикла; КонецЦикла; @@ -949,6 +943,13 @@ КонецПроцедуры +// Параметры: +// Форма - ФормаКлиентскогоПриложения: +// * Объект - ДанныеФормыСтруктура: +// ** Расширение - Строка +// ** ПодписанЭП - Булево +// Элементы - ВсеЭлементыФормы +// &НаКлиентеНаСервереБезКонтекста Процедура УстановитьДоступностьКнопок(Форма, Элементы) @@ -977,7 +978,7 @@ КонецЕсли; КонецЦикла; - ДоступнаПечатьСоШтампом = Форма["Объект"].Расширение = "mxl" И Форма["Объект"].ПодписанЭП; + ДоступнаПечатьСоШтампом = Форма.Объект.Расширение = "mxl" И Форма.Объект.ПодписанЭП; Элементы.ПечатьСоШтампом.Видимость = ДоступнаПечатьСоШтампом; @@ -1308,10 +1309,9 @@ Модифицированность = Ложь; ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.ВладелецФайла); - Оповестить("Запись_Файл", - Новый Структура("ЭтоНовый, Событие", ФайлБылСоздан, "Запись"), - ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_Файл", Новый Структура("ЭтоНовый, Событие", ФайлБылСоздан, "Запись"), ЭтотОбъект.Объект.Ссылка); УстановитьДоступностьКомандСпискаЭП(); УстановитьДоступностьКомандСпискаШифрования(); @@ -1423,16 +1423,6 @@ КонецПроцедуры -// Печать - -&НаКлиенте -Процедура ПечатьФайла() - - Файлы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТекущаяСсылкаНаФайл()); - РаботаСФайламиКлиент.НапечататьФайлы(Файлы, ЭтотОбъект.УникальныйИдентификатор); - -КонецПроцедуры - // Продолжение процедуры ПодписатьФайлЭП. // Вызывается из подсистемы ЭлектроннаяПодпись после подписания данных для нестандартного // способа добавления подписи в объект. diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Module.bsl index 0855ea080..32e9c9772 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/РедактируемыеФайлы/Module.bsl @@ -327,7 +327,7 @@ | |ОБЪЕДИНИТЬ ВСЕ |"; - ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); // @query-part-1 @query-part-2 КонецЕсли; ТекстЗапроса = ТекстЗапроса + ФрагментЗапроса; diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Module.bsl index 920f6b473..9796efb13 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/СписокЗанятыхСВопросом/Module.bsl @@ -278,10 +278,10 @@ | |ОБЪЕДИНИТЬ ВСЕ | - | ВЫБРАТЬ"; + | ВЫБРАТЬ"; //@query-part Иначе ТекстЗапроса = ТекстЗапроса + " - | ВЫБРАТЬ РАЗРЕШЕННЫЕ"; + | ВЫБРАТЬ РАЗРЕШЕННЫЕ"; //@query-part КонецЕсли; ТекстЗапроса = ТекстЗапроса + " diff --git a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl index 05cf00e46..60f9156a3 100644 --- a/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl +++ b/SSL/src/DataProcessors/РаботаСФайлами/Forms/ФормаЭкспортаПапки/Module.bsl @@ -257,9 +257,6 @@ ОбработчикЗавершения = Новый ОписаниеОповещения("ОбойтиДеревоФайлов2", ЭтотОбъект); РаботаСФайламиСлужебныйКлиент.ЗарегистрироватьОбработчикЗавершения(ПараметрыВыполнения, ОбработчикЗавершения); - // Переменные. - ПараметрыВыполнения.Вставить("ЗаписьФайла", Неопределено); - // Запуск цикла. ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения); КонецПроцедуры @@ -277,6 +274,7 @@ // * ВГраница - Число // * Индекс - Число // * ТребуетсяЗапускЦикла - Булево +// * ЗаписьФайла - СправочникСсылка.Файлы // &НаКлиенте Функция ПараметрыВыполнения(Знач ОбработчикРезультата, Знач ТаблицаФайлов, Знач БазовыйКаталогСохранения, Знач РодительскаяПапка, Знач ОбщиеПараметры) @@ -295,6 +293,9 @@ ПараметрыВыполнения.Вставить("ВГраница", ПараметрыВыполнения.Элементы.Количество()-1); ПараметрыВыполнения.Вставить("Индекс", -1); ПараметрыВыполнения.Вставить("ТребуетсяЗапускЦикла", Истина); + + ПараметрыВыполнения.Вставить("ЗаписьФайла", Неопределено); + Возврат ПараметрыВыполнения КонецФункции @@ -555,6 +556,9 @@ ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения); КонецПроцедуры +// Параметры: +// ПараметрыВыполнения - см. ПараметрыВыполнения +// &НаКлиенте Процедура ОбойтиДеревоФайлов11(ПараметрыВыполнения) Если ПараметрыВыполнения.Результат = КодВозвратаДиалога.Отмена Тогда diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl index 709a5f501..0bc282338 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl @@ -495,17 +495,18 @@ &НаКлиенте Процедура СтроениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - Если ЗначениеЗаполнено(Текст) - И (ЗначениеЗаполнено(ЭтотОбъект.ИдентификаторНаселенногоПункта) - ИЛИ ЗначениеЗаполнено(ЭтотОбъект.ИдентификаторУлицы)) Тогда - Идентификатор = ?(ЗначениеЗаполнено(ИдентификаторУлицы), - ИдентификаторУлицы, ИдентификаторНаселенногоПункта); - - ДанныеВыбора = СписокАвтоподбораВариантовДомов(Идентификатор, Дом); - Если ДанныеВыбора.Количество() > 1 Тогда - СтандартнаяОбработка = Ложь; + Если ЗначениеЗаполнено(Текст) Тогда + + Идентификатор = ИдентификаторАдреса(НаселенныйПунктДетально, Истина); + + Если ЗначениеЗаполнено(Идентификатор) Тогда + ДанныеВыбора = СписокАвтоподбораВариантовДомов(Идентификатор, Дом); + Если ДанныеВыбора.Количество() > 1 Тогда + СтандартнаяОбработка = Ложь; + КонецЕсли; КонецЕсли; - КонецЕсли; + + КонецЕсли; КонецПроцедуры @@ -859,7 +860,7 @@ &НаКлиенте Процедура АдресНаДатуАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) - Если СтрСравнить(Текст, НСтр("ru = 'начало учета'")) = 0 Или ПустаяСтрока(Текст) Тогда + Если СтрСравнить(Текст, НачалоУчета()) = 0 Или ПустаяСтрока(Текст) Тогда Элементы.АдресНаДату.ФорматРедактирования = ""; КонецЕсли; КонецПроцедуры @@ -895,7 +896,7 @@ АдресДействуетС = АдресНаДату; КонецЕсли; - ТекстНачалаУчета = НСтр("ru = 'начало учета'"); + ТекстНачалаУчета = НачалоУчета(); Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + ТекстНачалаУчета + """'"); КонецПроцедуры @@ -1012,7 +1013,7 @@ Процедура ВвестиАдресВСвободнойФорме(Команда) ЭтоНациональныйАдрес = РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.AddressType) - Или ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType); + Или РаботаСАдресамиКлиент.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType); Если РазрешитьВводАдресаВСвободнойФорме Тогда ПереключитьНаСтруктурированныйВвод(); @@ -1256,7 +1257,7 @@ Функция ЭтоРФАдрес() Возврат РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType) - Или РаботаСАдресамиКлиентСервер.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType); + Или РаботаСАдресамиКлиент.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType); КонецФункции @@ -2229,18 +2230,6 @@ КонецПроцедуры -&НаСервере -Процедура УдалитьГруппуЭлементов(Группа) - Пока Группа.ПодчиненныеЭлементы.Количество()>0 Цикл - Элемент = Группа.ПодчиненныеЭлементы[0]; - Если ТипЗнч(Элемент)=Тип("ГруппаФормы") Тогда - УдалитьГруппуЭлементов(Элемент); - КонецЕсли; - Элементы.Удалить(Элемент); - КонецЦикла; - Элементы.Удалить(Группа); -КонецПроцедуры - &НаСервере Функция ДобавитьПолеСтроенияИлиПомещения(Идентификатор, Тип, Значение) @@ -2524,7 +2513,7 @@ КонецЕсли; Элементы.ТекстПроДатуДействия.Заголовок = ТекстИсторическийАдрес; - Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + НСтр("ru = 'начало учета'") + """'"); + Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + НачалоУчета() + """'"); КонецПроцедуры @@ -3147,8 +3136,8 @@ Если ТипЗнч(Параметры.Страна) = Тип("СправочникСсылка.СтраныМира") Тогда Если ЗначениеЗаполнено(Параметры.Страна) Тогда - Страна = Параметры.Страна; - НаселенныйПунктДетально.Country = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Страна, "Наименование"); + Страна = Параметры.Страна; // СправочникСсылка.СтраныМира + НаселенныйПунктДетально.Country = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Страна, "Наименование"); Иначе Страна = РаботаСАдресамиКлиентСервер.ОсновнаяСтрана(); НаселенныйПунктДетально.Country = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Страна, "Наименование"); @@ -3532,7 +3521,8 @@ XDTOКонтактная = УправлениеКонтактнойИнформациейСлужебный.АдресXMLВXDTO(ЗначенияПолей, Параметры.Представление, ); Если Параметры.Свойство("Страна") И ЗначениеЗаполнено(Параметры.Страна) Тогда Если ТипЗнч(Параметры.Страна) = ТипЗнч(Справочники.СтраныМира.ПустаяСсылка()) Тогда - XDTOКонтактная.Состав.Страна = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.Страна, "Наименование"); + СтранаСсылка = Параметры.Страна; // СправочникСсылка.СтраныМира + XDTOКонтактная.Состав.Страна = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтранаСсылка , "Наименование"); Иначе XDTOКонтактная.Состав.Страна = Строка(Параметры.Страна); КонецЕсли; @@ -3643,7 +3633,7 @@ Если ЭлементыАдреса.Количество() > 0 Тогда ЗначениеПоля = СокрЛП(ЭлементыАдреса[0]); Позиция = СтрНайти(ЗначениеПоля, " ", НаправлениеПоиска.СКонца); - Если Позиция > 0 И НЕ РаботаСАдресамиКлиентСервер.ПредставлениеУровняБезСокращения(ИменаУровнейАдреса[ИндексАдреса]) Тогда + Если Позиция > 0 И НЕ РаботаСАдресамиКлиент.ПредставлениеУровняБезСокращения(ИменаУровнейАдреса[ИндексАдреса]) Тогда НаселенныйПунктДетально[ИменаУровнейАдреса[ИндексАдреса]] = СокрЛП(Лев(ЗначениеПоля, Позиция)); НаселенныйПунктДетально[ИменаУровнейАдреса[ИндексАдреса] + "Type"] = СокрЛП(Сред(ЗначениеПоля, Позиция +1)); Иначе @@ -3695,7 +3685,7 @@ ИначеЕсли РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаМуниципальныйАдрес; Элементы.НужнаПомощь.Видимость = Истина; - ИначеЕсли ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда + ИначеЕсли РаботаСАдресамиКлиент.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаАдминистративноТерриториальныйАдрес; Элементы.НужнаПомощь.Видимость = Истина; Иначе @@ -3802,7 +3792,7 @@ Элементы.МуниципальноеДеление.Пометка = Истина; Элементы.АдминистративноТерриториальноеДеление.Пометка = Ложь; Элементы.ПроверитьЗаполнениеАдреса.Доступность = Истина; - ИначеЕсли ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда + ИначеЕсли РаботаСАдресамиКлиент.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда Элементы.АдресВСвободнойФорме.Пометка = Ложь; Элементы.МуниципальноеДеление.Пометка = Ложь; Элементы.АдминистративноТерриториальноеДеление.Пометка = Истина; @@ -3934,11 +3924,6 @@ КонецФункции -&НаКлиенте -Функция ЭтоАдминистративноТерриториальныйАдрес(ТипАдреса) - Возврат СтрСравнить(ТипАдреса, РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес()) = 0; -КонецФункции - &НаКлиенте Процедура ОткрытьФормуЗагрузкиКлассификатора() @@ -4059,4 +4044,11 @@ КонецФункции +&НаКлиентеНаСервереБезКонтекста +Функция НачалоУчета() + + Возврат НСтр("ru = 'начало учета'"); + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl index 5f66465d9..dc8c23d1f 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl @@ -127,14 +127,15 @@ &НаКлиенте Процедура НайтиАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + Если ИспользуетсяВебСервис Тогда + Найти = Текст; + ПодключитьОбработчикОжидания("НайтиАдресныеОбъекты", 0.1, Истина); + Возврат; + КонецЕсли; + Если ЗначениеЗаполнено(Текст) Тогда - Если ИспользуетсяВебСервис Тогда - Найти = Текст; - ПодключитьОбработчикОжидания("НайтиАдресныеОбъекты", 0.1, Истина); - Иначе - Фильтр = Новый ФиксированнаяСтруктура("Представление", Текст); - Элементы.ВариантыАдреса.ОтборСтрок = Фильтр; - КонецЕсли; + Фильтр = Новый ФиксированнаяСтруктура("Представление", Текст); + Элементы.ВариантыАдреса.ОтборСтрок = Фильтр; Иначе Элементы.ВариантыАдреса.ОтборСтрок = Неопределено; КонецЕсли; @@ -274,7 +275,15 @@ &НаКлиенте Процедура НайтиОчистка(Элемент, СтандартнаяОбработка) + + Если ИспользуетсяВебСервис Тогда + Найти = ""; + ПодключитьОбработчикОжидания("НайтиАдресныеОбъекты", 0.1, Истина); + Возврат; + КонецЕсли; + Элементы.ВариантыАдреса.ОтборСтрок = Неопределено; + КонецПроцедуры &НаКлиенте diff --git a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl index c1b2b45c1..abf1ce1e4 100644 --- a/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl +++ b/SSL/src/DataProcessors/РасширенныйВводКонтактнойИнформации/ManagerModule.bsl @@ -290,9 +290,8 @@ // // Параметры: // Родитель - УникальныйИдентификатор - родительский объект. -// Уровень - Число - требуемый уровень данных. 1-7, 90, 91 - адресные объекты, -1 -// - ориентиры. -// ДополнительныеПараметры - Структура - описание настройке поиска. Поля: +// Уровень - Число - требуемый уровень данных (по ФИАС от 1 до 7). +// ДополнительныеПараметры - Структура - описание настроек поиска: // * СкрыватьНеактуальные - Булево - флаг исключения из выборки неактуальных адресов. По умолчанию // Ложь. // * ФорматАдреса - Строка - тип используемого классификатора. @@ -1295,7 +1294,7 @@ // // Возвращаемое значение: // Массив - содержит структуры с полями: -// * ТипОшибки - Строка - идентификатор группы ошибки. Может принимать значение: +// * ТипОшибки - Строка - идентификатор группы ошибки. Может принимать значение // "ПредставлениеНеСоответствуетНаборуПолей", // "НеЗаполненыОбязательныеПоля" // "НеУказаныСокращенияПолей" @@ -1303,8 +1302,8 @@ // "НеСоответствуетДлинаПолей". // * Сообщение - Строка - подробный текст ошибки. // * Поля - Массив из Структура: -// ** ИмяПоля - внутренний идентификатор ошибочного поля. -// ** Сообщение - подробный текст ошибки для поля. +// ** ИмяПоля - Строка - внутренний идентификатор ошибочного поля. +// ** Сообщение - Строка- подробный текст ошибки для поля. // Функция ОбщиеГруппыОшибокЗаполненияАдреса(Знач ДанныеАдреса, Знач ВидИнформации) Результат = Новый Массив; @@ -1352,7 +1351,7 @@ КонецЕсли; // Район - Район = СокрЛП(ДанныеАдреса.District + " " + ДанныеАдреса.DistrictType); + Район = УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(ДанныеАдреса.District, ДанныеАдреса.DistrictType); Если Не ПустаяСтрока(Район) Тогда Поле = "Район"; Если ПустаяСтрока(ДанныеАдреса.DistrictType) Тогда @@ -1366,7 +1365,7 @@ КонецЕсли; // Город - Город = СокрЛП(ДанныеАдреса.City + " " + ДанныеАдреса.CityType); + Город = УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(ДанныеАдреса.City, ДанныеАдреса.CityType); Если Не ПустаяСтрока(Город) Тогда Поле = "Город"; Если ПустаяСтрока(ДанныеАдреса.CityType) Тогда @@ -1380,7 +1379,7 @@ КонецЕсли; // Населенный пункт - НаселенныйПункт = СокрЛП(ДанныеАдреса.Locality + " " + ДанныеАдреса.LocalityType); + НаселенныйПункт = УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(ДанныеАдреса.Locality, ДанныеАдреса.LocalityType); Если Не ПустаяСтрока(НаселенныйПункт) Тогда Поле = "НаселПункт"; Если ПустаяСтрока(ДанныеАдреса.LocalityType) Тогда @@ -1396,7 +1395,7 @@ КонецЕсли; // Улица - Улица = СокрЛП(ДанныеАдреса.Street + " " + ДанныеАдреса.StreetType); + Улица = УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(ДанныеАдреса.Street, ДанныеАдреса.StreetType); Если Не ПустаяСтрока(Улица) Тогда Поле = "Улица"; Если ПустаяСтрока(ДанныеАдреса.StreetType) Тогда diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl index ba330407c..4ba8f7498 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Форма/Module.bsl @@ -394,9 +394,52 @@ Возврат; КонецЕсли; СтруктураПараметров = Новый Структура("Ключ, ТолькоПросмотр", ТекущаяСсылка, Истина); - ОткрытьФорму(СписокСсылокИмяТаблицы + ".ФормаОбъекта", СтруктураПараметров, ЭтотОбъект); + Если ЭтоГруппа(ТекущаяСсылка) Тогда + ОткрытьФорму(СписокСсылокИмяТаблицы + ".ФормаГруппы", СтруктураПараметров, ЭтотОбъект); + Иначе + ОткрытьФорму(СписокСсылокИмяТаблицы + ".ФормаОбъекта", СтруктураПараметров, ЭтотОбъект); + КонецЕсли; + КонецПроцедуры +&НаСервере +Функция ЭтоГруппа(Ссылка) + + ОбъектМетаданных = Ссылка.ПолучитьОбъект().Метаданные(); + + Если Метаданные.Справочники.Содержит(ОбъектМетаданных) + И ОбъектМетаданных.Иерархический Тогда + ИмяТаблицы = "Справочник." + ОбъектМетаданных.Имя; + ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) + И ОбъектМетаданных.Иерархический Тогда + ИмяТаблицы = "ПланВидовХарактеристик." + ОбъектМетаданных.Имя; + Иначе + Возврат Ложь; + КонецЕсли; + + ТекстЗапроса = "ВЫБРАТЬ + | Таблица.Ссылка КАК Ссылка + |ИЗ + | #Таблица КАК Таблица + |ГДЕ + | Таблица.ЭтоГруппа + | И Таблица.Ссылка = &Ссылка"; + + ТекстЗапрос = СтрЗаменить(ТекстЗапроса, "#Таблица", ИмяТаблицы); + + Запрос = Новый Запрос(ТекстЗапрос); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + &НаКлиенте Процедура СписокСсылокОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) ОбработкаВыбораДанных(Элемент, ВыбранноеЗначение); diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html index 725f81710..4c9a33d72 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html @@ -1,6 +1,6 @@

          Предназначена для регистрации изменений данных в программе. Это необходимо для последующей отправки данных при синхронизации в другие программы.

          -

          Список можно открыть с помощью кнопки  или по команде Еще - Состав отправляемых данных из списка Синхронизации данных.

          +

          Список можно открыть с помощью кнопки  или по команде Еще - Состав отправляемых данных из списка Синхронизации данных.

          Ведется регистрация номеров сообщений. Нажмите на ссылку с номерами сообщений, чтобы просмотреть их или исправить.

          Список состоит из двух частей:

          • левая часть состоит из двух колонок: diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl index 99bda1a04..c2dc7b151 100644 --- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl +++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/ObjectModule.bsl @@ -503,10 +503,10 @@ // СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки -// Служебное для регистрации в подключаемых обработках. +// Возвращает сведения о внешней обработке. // // Возвращаемое значение: -// Структура - содержит сведения об обработке. +// см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке // Функция СведенияОВнешнейОбработке() Экспорт diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl index f4d6dca2a..340fde748 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl @@ -177,14 +177,16 @@ КоличествоСеансовИнформационнойБазы = ПроверитьНаличиеБлокирующихСеансов(); - СоединенияИБВызовСервера.УстановитьБлокировкуСоединений(НСтр("ru = 'Выполняется восстановление информационной базы.'"), "РезервноеКопирование"); + СоединенияИБВызовСервера.УстановитьБлокировкуСоединений( + НСтр("ru = 'Выполняется восстановление информационной базы.'"), + "РезервноеКопирование"); Если КоличествоСеансовИнформационнойБазы = 1 Тогда СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Истина); СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Истина); НачатьВосстановлениеДанных(); Иначе - СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Истина); + СоединенияИБКлиент.УстановитьРежимЗавершенияРаботыПользователей(Истина); УстановитьОбработчикОжиданияНачалаРезервногоКопирования(); УстановитьОбработчикОжиданияИстеченияТаймаутаРезервногоКопирования(); КонецЕсли; @@ -481,7 +483,8 @@ Текст.УдалитьСтроку(1); Текст.УдалитьСтроку(Текст.КоличествоСтрок()); - Возврат ВставитьПараметрыСкрипта(Скрипт.ПолучитьТекст(), ПараметрыСкрипта) + Текст.ПолучитьТекст(); + Возврат ВставитьПараметрыСкрипта(Скрипт.ПолучитьТекст(), ПараметрыСкрипта) + + ВставитьПараметрыСкрипта(Текст.ПолучитьТекст(), ПараметрыСкрипта); КонецФункции @@ -506,9 +509,10 @@ ПараметрыТекста["[ЗаголовокЗаставки]"] = НСтр("ru = 'Восстановление данных из резервной копии...'"); ПараметрыТекста["[ТекстЗаставки]"] = НСтр("ru = 'Пожалуйста, подождите. - |
            Выполняется восстановление базы данных - |
            из резервной копии. - |
            Не рекомендуется останавливать процесс.'"); + |
            Выполняется восстановление базы данных + |
            из резервной копии. + |
            Не рекомендуется останавливать процесс.'"); + ПараметрыТекста["[Шаг1Инициализация]"] = НСтр("ru = 'Инициализация'"); ПараметрыТекста["[Шаг2ВосстановлениеДанных]"] = НСтр("ru = 'Восстановление данных'"); ПараметрыТекста["[Шаг3ОжиданиеЗавершения]"] = НСтр("ru = 'Ожидание завершения восстановления данных'"); @@ -517,6 +521,8 @@ ПараметрыТекста["[ПроцессПрерван]"] = НСтр("ru = 'Внимание: процесс восстановления данных был прерван, и информационная база осталась заблокированной.'"); ПараметрыТекста["[ПроцессПрерванПодсказка]"] = НСтр("ru = 'Для разблокирования информационной базы воспользуйтесь консолью кластера серверов или запустите ""1С:Предприятие"".'"); + РезервноеКопированиеИБСервер.УстановитьОбщиеПараметрыЗаставки(ПараметрыТекста); + Возврат РезервноеКопированиеИБСервер.ПодставитьПараметрыВТекст(ШаблонТекста, ПараметрыТекста);; КонецФункции diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl index 32bc75a48..dd13e7d31 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl @@ -278,14 +278,16 @@ Элементы.Далее.Доступность = Ложь; УстановитьЗаголовокКнопкиДалее(Истина); - СоединенияИБВызовСервера.УстановитьБлокировкуСоединений(НСтр("ru = 'Выполняется восстановление информационной базы.'"), "РезервноеКопирование"); + СоединенияИБВызовСервера.УстановитьБлокировкуСоединений( + НСтр("ru = 'Выполняется восстановление информационной базы.'"), + "РезервноеКопирование"); Если КоличествоСеансовИнформационнойБазы = 1 Тогда СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Истина); СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Истина); НачатьРезервноеКопирование(); Иначе - СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Истина); + СоединенияИБКлиент.УстановитьРежимЗавершенияРаботыПользователей(Истина); УстановитьОбработчикОжиданияНачалаРезервногоКопирования(); УстановитьОбработчикОжиданияИстеченияТаймаутаРезервногоКопирования(); КонецЕсли; @@ -657,7 +659,8 @@ Текст.УдалитьСтроку(1); Текст.УдалитьСтроку(Текст.КоличествоСтрок()); - Возврат ВставитьПараметрыСкрипта(Скрипт.ПолучитьТекст(), ПараметрыСкрипта) + Текст.ПолучитьТекст(); + Возврат ВставитьПараметрыСкрипта(Скрипт.ПолучитьТекст(), ПараметрыСкрипта) + + ВставитьПараметрыСкрипта(Текст.ПолучитьТекст(), ПараметрыСкрипта); КонецФункции @@ -685,8 +688,9 @@ ПараметрыТекста["[ЗаголовокЗаставки]"] = НСтр("ru = 'Резервное копирование информационной базы...'"); ПараметрыТекста["[ТекстЗаставки]"] = НСтр("ru = 'Пожалуйста, подождите. - |
            Выполняется резервное копирование базы. + |
            Выполняется резервное копирование базы. |
            Не рекомендуется останавливать процесс.'"); + ПараметрыТекста["[Шаг1Инициализация]"] = НСтр("ru = 'Инициализация'"); ПараметрыТекста["[Шаг2СозданиеРезервнойКопии]"] = НСтр("ru = 'Создание резервной копии информационной базы'"); ПараметрыТекста["[Шаг3ОжиданиеЗавершения]"] = НСтр("ru = 'Ожидание завершения резервного копирования'"); @@ -695,6 +699,8 @@ ПараметрыТекста["[ПроцессПрерван]"] = НСтр("ru = 'Внимание: процесс резервного копирования был прерван, и информационная база осталась заблокированной.'"); ПараметрыТекста["[ПроцессПрерванПодсказка]"] = НСтр("ru = 'Для разблокирования информационной базы воспользуйтесь консолью кластера серверов или запустите ""1С:Предприятие"".'"); + РезервноеКопированиеИБСервер.УстановитьОбщиеПараметрыЗаставки(ПараметрыТекста); + Возврат РезервноеКопированиеИБСервер.ПодставитьПараметрыВТекст(ШаблонТекста, ПараметрыТекста);; КонецФункции diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt index 3f93b3999..241266a46 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаВосстановления/Template.txt @@ -81,11 +81,14 @@ if (finish) { return } - + + document.getElementById('ProductNameText').innerHTML = '[НаименованиеПродукта]' + document.getElementById('copyrightText').innerHTML = '[Копирайт]' + // Если предыдущий шаг завершился неудачно... if (ret !== 0 && ret !== -1) { if (errStep === 0) { - log(format('Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.', ret), true) + log(format('[СообщениеЗаставкиОшибкаШага]', ret), true) finalize() runEnterprise() self.close() @@ -148,6 +151,14 @@ position: absolute; left: 10px; top: 240px;">  
      +
      +   +
      +
      +   +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt index dea1e8e9a..38795ba1b 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt @@ -82,10 +82,14 @@ if (finish) { return } + + document.getElementById('ProductNameText').innerHTML = '[НаименованиеПродукта]' + document.getElementById('copyrightText').innerHTML = '[Копирайт]' + // Если предыдущий шаг завершился неудачно... if (ret !== 0 && ret !== -1) { if (errStep === 0) { - log(format('Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.', ret), true) + log(format('[СообщениеЗаставкиОшибкаШага]', ret), true) finalize() runEnterprise() self.close() @@ -146,6 +150,14 @@ position: absolute; left: 10px; top: 240px;">   +
      +   +
      +
      +   +
      diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаЗагрузкаИБ/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаЗагрузкаИБ/Template.txt index 1a5ebc523..edb74bc7f 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаЗагрузкаИБ/Template.txt +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаЗагрузкаИБ/Template.txt @@ -72,19 +72,19 @@ function runApp (sFilePath, sFileArgs, show, bWaitOnReturn) { sFileArgs = '' } var ret = -1 - log(format('Запускается: {0}; параметры: {1}; окно: {2}; ожидание: {3}', + log(format('[СообщениеНачалоЗапуска]', sFilePath, sFileArgs, SWtoString(show), bWaitOnReturn)) if (oFileSystemObject.FileExists(sFilePath)) { try { ret = oShell.Run(format('"{0}" {1}', sFilePath, sFileArgs), show, bWaitOnReturn) } catch (e) { - log(format('Исключение в runApp: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеДеталиИсключения]', e.name, e.message), true) return -1 } - log(format('Код возврата: {0}', ret), ret !== 0) + log(format('[СообщениеРезультатЗапуска]', ret), ret !== 0) return ret } else { - log(format("Запускаемый файл не существует: {0}", sFilePath), true) + log(format("[СообщениеОтказЗапуска]", sFilePath), true) } return ret } @@ -170,7 +170,7 @@ function log1CInternal (connection, text, failed) { connection.WriteLogEvent(eventLogID, eventLogLevel, null, null, text, connection.EventLogEntryTransactionMode.Independent) } catch (e) { - log(format('Исключение в log1CInternal: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеЛогирование1С]', e.name, e.message), true) return } } finally { @@ -182,7 +182,7 @@ function log1CInternal (connection, text, failed) { function initialize () { clearLogFile() appendLog() - log(format('Файл скрипта: {0}', thisFileName)) + log(format('[СообщениеПутьКФайлуСкрипта]', thisFileName)) return 0 } @@ -216,7 +216,7 @@ function createConnection () { } try { - log('Начат сеанс внешнего соединения с ИБ', false) + log('[СообщениеНачалоСеансаСоединенияСБазой]', false) var logstep = 'new ActiveXObject COMConnector' var ComConnector = new ActiveXObject(comConnectorName) logstep = 'comConnector.Connect' @@ -228,7 +228,7 @@ function createConnection () { logstep = 'SystemInfo.PlatformType' var platformType = systemInfo.PlatformType logstep = 'Проверка ComConnection.PlatformType' - var platformTypeString = '<Неопределена>' + var platformTypeString = '[СообщениеРазрядностьОСНеопределена]' if (platformType === ComConnection.PlatformType.Windows_x86) { platformTypeString = '32 bit' } @@ -238,7 +238,7 @@ function createConnection () { log(format('Версия comcntr: {0} {1}', appVersion, platformTypeString), false) return ComConnection } catch (e) { - log(format('Исключение в createConnection на шаге: {0}, {1}, {2}', logstep, e.name, e.message), true) + log(format('[СообщениеОтказСоединенияСБазой]', logstep, e.name, e.message), true) return null } } @@ -267,7 +267,7 @@ function write1CEventLog () { log1CInternal(connection, text, failed) } } catch (e) { - log(format('Исключение в write1CEventLog: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказЛогирования1С]', e.name, e.message), true) return } finally { connection = null @@ -283,7 +283,7 @@ function doSetResult (success) { try { connection.РезервноеКопированиеИБСервер.ЗавершитьВосстановление(success) } catch (e) { - log(format('Исключение при вызове РезервноеКопированиеИБСервер.ЗавершитьВосстановление: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказПриВызовеЗавершитьВосстановление]', e.name, e.message), true) res = 2 } return res @@ -302,17 +302,17 @@ function writeEventLog (success) { var eventKind = success ? EVENT_SUCCESS : EVENT_CRITICAL var message if (success) { - message = 'Восстановление информационной базы прошло успешно.'; + message = '[СообщениеРезультатВосстановленияБазы]'; } else { - message = 'Ошибка при восстановлении информационной базы.'; + message = '[СообщениеОтказВосстановленияБазы]'; } - message += format(' Параметры информационной базы: {0}.', infoBasePath) + message += format(' [СообщениеПараметрыБазы]', infoBasePath) if (!success) { - message += ' Протокол восстановления сохранен в журнал регистрации.'; + message += ' [СообщениеВосстановлениеЛогирование1С]'; } oShell.LogEvent(eventKind, message) } catch (e) { - log(format('Исключение в writeEventLog: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказЛогирования]', e.name, e.message), true) } } @@ -329,15 +329,15 @@ function restoreDB () { retryCount++ CollectGarbage() // предотвращает исключение out of memory if (retryCount > 5) { - log(format('Ошибка переноса файла базы во временный каталог (возможно к файлу базы подключены активные сеансы): {0}, {1}.', e.name, e.message), true) + log(format('СообщениеОтказПереносаФайлаБазыВоВременныйКаталог', e.name, e.message), true) return 1 } else { - log(format('Попытка переноса файла базы во временный каталог ({0} из 5): {1}, {2}.', retryCount, e.name, e.message)) + log(format('[СообщениеПопыткаПереносаФайлаБазыВоВременныйКаталог]', retryCount, e.name, e.message)) return -1 } } - log(format('Файл резервной копии: {0}', backupFileName)) + log(format('[СообщениеПутьКФайлуРезервнойКопии]', backupFileName)) var ret = 0 try { if (backupFileName.toLowerCase().lastIndexOf('.zip') === backupFileName.length - 4) { @@ -350,10 +350,10 @@ function restoreDB () { oFileSystemObject.CopyFile(backupFileName, BaseFileName, true) } - log('Восстановление базы данных проведено успешно') + log('[СообщениеРезультатВосстановленияБазы]') } catch (e) { CollectGarbage() // предотвращает исключение out of memory - log(format('Исключение при восстановлении базы из резервной копии: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказВосстановленияБазыПодробно]', e.name, e.message), true) ret = 1 var FileObject = oFileSystemObject.GetFile(TempCatalog + '1Cv8.1CD') FileObject.Move(BaseFileName) @@ -383,7 +383,7 @@ function doAllowConnections () { try { oFileSystemObject.DeleteFile(BaseFileName + '1Cv8.cdn') } catch (e) { - log(format('Ошибка при удалении файла блокировок 1Cv8.cdn: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОшибкаУдаленияФайлаБлокировок]', e.name, e.message), true) return 3 } } diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt index e85cdb039..691393fdc 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt +++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt @@ -75,19 +75,19 @@ function runApp (sFilePath, sFileArgs, show, bWaitOnReturn) { sFileArgs = '' } var ret = 1 - log(format('Запускается: {0}; параметры: {1}; окно: {2}; ожидание: {3}', + log(format('[СообщениеНачалоЗапуска]', sFilePath, sFileArgs, SWtoString(show), bWaitOnReturn)) if (oFileSystemObject.FileExists(sFilePath)) { try { ret = oShell.Run(format('"{0}" {1}', sFilePath, sFileArgs), show, bWaitOnReturn) } catch (e) { - log(format('Исключение в runApp: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеДеталиИсключения]', e.name, e.message), true) return 1 } - log(format('Код возврата: {0}', ret), ret !== 0) + log(format('[СообщениеРезультатЗапуска]', ret), ret !== 0) return ret } else { - log(format('Запускаемый файл не существует: {0}', sFilePath), true) + log(format('[СообщениеОтказЗапуска]', sFilePath), true) } return ret } @@ -173,7 +173,7 @@ function log1CInternal (connection, text, failed) { connection.WriteLogEvent(eventLogID, eventLogLevel, null, null, text, connection.EventLogEntryTransactionMode.Independent) } catch (e) { - log(format('Исключение в log1CInternal: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеЛогирование1С]', e.name, e.message), true) return } } finally { @@ -185,8 +185,8 @@ function log1CInternal (connection, text, failed) { function initialize () { clearLogFile() appendLog() - log(format('Файл скрипта: {0}', thisFileName)) - log(format('Файл резервной копии: {0}', backupFileName)) + log(format('[СообщениеПутьКФайлуСкрипта]', thisFileName)) + log(format('[СообщениеПутьКФайлуРезервнойКопии]', backupFileName)) return 0 } @@ -197,15 +197,15 @@ function finalize (success) { } if (!(oFileSystemObject.FileExists(backupFileName))) { - log('Не удалось создать резервную копию базы.') + log('[СообщениеОтказСозданияРезервнойКопииБазы]') success = false } else { var FileArchive = oFileSystemObject.GetFile(backupFileName) if (FileArchive.size / 1024 < 5) { - log('Не удалось создать резервную копию базы.') + log('[СообщениеОтказСозданияРезервнойКопииБазы]') success = false } else { - log('Резервная копия успешно создана') + log('[СообщениеРезультатСозданияРезервнойКопииБазы]') } } @@ -233,7 +233,7 @@ function createConnection () { } try { - log('Начат сеанс внешнего соединения с ИБ', false) + log('[СообщениеНачалоСеансаСоединенияСБазой]', false) var logstep = 'new ActiveXObject COMConnector' var ComConnector = new ActiveXObject(comConnectorName) logstep = 'comConnector.Connect' @@ -244,18 +244,18 @@ function createConnection () { var appVersion = systemInfo.AppVersion logstep = 'SystemInfo.PlatformType' var platformType = systemInfo.PlatformType - logstep = 'Проверка ComConnection.PlatformType' - var platformTypeString = '<Неопределена>' + logstep = 'ComConnection.PlatformType' + var platformTypeString = '[СообщениеРазрядностьОСНеопределена]' if (platformType === ComConnection.PlatformType.Windows_x86) { platformTypeString = '32 bit' } if (platformType === ComConnection.PlatformType.Windows_x86_64) { platformTypeString = '64 bit' } - log(format('Версия comcntr: {0} {1}', appVersion, platformTypeString), false) + log(format('[СообщениеВерсияCOMСоединителя]', appVersion, platformTypeString), false) return ComConnection } catch (e) { - log(format('Исключение в createConnection на шаге: {0}, {1}, {2}', logstep, e.name, e.message), true) + log(format('[СообщениеОтказСоединенияСБазой]', logstep, e.name, e.message), true) return null } } @@ -284,7 +284,7 @@ function write1CEventLog () { log1CInternal(connection, text, failed) } } catch (e) { - log(format('Исключение в write1CEventLog: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказЛогирования1С]', e.name, e.message), true) return } finally { connection = null @@ -300,7 +300,7 @@ function doSetResult (success) { try { connection.РезервноеКопированиеИБСервер.ЗавершитьРезервноеКопирование(success, backupFileName) } catch (e) { - log(format('Исключение при вызове РезервноеКопированиеИБСервер.ЗавершитьРезервноеКопирование: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказПриВызовеЗавершитьРезервноеКопирование]', e.name, e.message), true) res = 2 } return res @@ -319,17 +319,17 @@ function writeEventLog (success) { var eventKind = success ? EVENT_SUCCESS : EVENT_CRITICAL var message if (success) { - message = 'Резервное копирование базы выполнено успешно.' + message = '[СообщениеРезультатРезервногоКопированияБазы]' } else { - message = 'Ошибка при резервном копировании информационной базы.' + message = '[СообщениеОтказРезервногоКопированияБазы]' } - message += format(' Параметры информационной базы: {0}.', infoBasePath) + message += format(' [СообщениеПараметрыБазы]', infoBasePath) if (!success) { - message += ' Протокол резервного сохранен в журнал регистрации.' + message += ' [СообщениеРезервноеКопированиеЛогирование1С]' } oShell.LogEvent(eventKind, message) } catch (e) { - log(format('Исключение в writeEventLog: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказЛогирования]', e.name, e.message), true) } } @@ -339,11 +339,11 @@ function backupDB () { try { var fileDBName = BaseFileName + '1Cv8.1CD' var fileDB = oFileSystemObject.GetFile(fileDBName) - log(format('Размер файла 1Cv8.1CD: {0} Мб.', fileDB.size / 1024 / 1024)) + log(format('[СообщениеРазмерФайлаРезервнойКопииВМб]', fileDB.size / 1024 / 1024)) var backupPath = oFileSystemObject.GetAbsolutePathName(backupFileName) if (fileDB.size / 1024 / 1024 > 2000) { - log('Размер файла 1Cv8.1CD превышает 2 Гб, поэтому сжатие в zip не используется.') + log('[СообщениеОтказСжатияФайлаРезервнойКопиВZIP]') backupFileName = backupFileName.replace('.zip', '') backupPath = oFileSystemObject.GetAbsolutePathName(backupFileName) oFileSystemObject.CreateFolder(backupPath) @@ -362,11 +362,11 @@ function backupDB () { } destFolder.CopyHere(sourceFilePath) - log('Начато создание резервной копии...') + log('[СообщениеНачалоСозданияРезервнойКопииБазы]') } catch (e) { alert(e.message) CollectGarbage() // предотвращает исключение out of memory - log(format('Исключение при создании резервной копии базы: {0}, {1}', e.name, e.message), true) + log(format('[СообщениеОтказСозданияРезервнойКопииБазыПодробно]', e.name, e.message), true) ret = 1 } @@ -392,7 +392,7 @@ function WaitUntilFinish () { // Если за 15 минут файл все еще не начал создаваться, то отменяем резервное копирование. if (CheckCount > 60 * 3) { - log(format('За 15 минут файл резервной копии все еще не начал создаваться (размер {0} байт), предположительно, из-за возникшей ошибки. Резервное копирование прервано.', nowSize), true) + log(format('[СообщениеПредположениеОшибкиРезервногоКопированияБазы]', nowSize), true) return 1 } @@ -409,7 +409,7 @@ function doAllowConnections () { try { oFileSystemObject.DeleteFile(BaseFileName + '1Cv8.cdn') } catch (e) { - log(format('Ошибка при удалении файла блокировок 1Cv8.cdn: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОшибкаУдаленияФайлаБлокировок]', e.name, e.message), true) return 3 } } diff --git a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl index aadfe15d5..b967535c0 100644 --- a/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl +++ b/SSL/src/DataProcessors/РезультатыОбновленияПрограммы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl @@ -406,6 +406,12 @@ КонецФункции +// Параметры: +// Прогресс - Неопределено +// - Структура: +// * ДополнительныеПараметры - Структура. +// ДополнительныеПараметры - Неопределено +// &НаКлиенте Процедура ПрогрессОбновленияИнформационнойБазы(Прогресс, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl b/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl index b98c0b477..ebe573b6a 100644 --- a/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl +++ b/SSL/src/DataProcessors/Сканирование/Forms/РезультатСканирования/Module.bsl @@ -859,7 +859,7 @@ НарастающийНомерИзображения = 1; КонецЕсли; - СтрокаТаблицы.Представление = "Изображение" + Строка(НарастающийНомерИзображения); + СтрокаТаблицы.Представление = НСтр("ru='Изображение'") + Строка(НарастающийНомерИзображения); НарастающийНомерИзображения = НарастающийНомерИзображения + 1; Если КоличествоСтрокДоДобавления = 0 Тогда diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form index dc77dcb8f..9073b3dd8 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Form.form @@ -267,10 +267,6 @@ true - - <key>ru</key> - <value>Связи</value> - ГруппаСвязиExtendedTooltip 346 @@ -401,10 +397,6 @@ true - - <key>ru</key> - <value>Найти</value> - ГруппаНайтиExtendedTooltip 351 @@ -481,10 +473,6 @@ true - - <key>ru</key> - <value>Подменю настройки</value> - ПодменюНастройкиExtendedTooltip 356 @@ -559,10 +547,6 @@ true - - <key>ru</key> - <value>Форма группа вывести список</value> - ФормаГруппаВывестиСписокExtendedTooltip 358 @@ -1448,10 +1432,6 @@ true - - <key>ru</key> - <value>Таблица сопоставления контекстное меню группа связи</value> - ТаблицаСопоставленияКонтекстноеМенюГруппаСвязиExtendedTooltip 363 @@ -1524,10 +1504,6 @@ true - - <key>ru</key> - <value>Таблица сопоставления контекстное меню группа найти</value> - ТаблицаСопоставленияКонтекстноеМенюГруппаНайтиExtendedTooltip 366 @@ -1626,10 +1602,6 @@ true - - <key>ru</key> - <value>Таблица сопоставления контекстное меню группа вывести список</value> - ТаблицаСопоставленияКонтекстноеМенюГруппаВывестиСписокExtendedTooltip 370 diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl index 552efe1d3..d8177178d 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl @@ -684,7 +684,7 @@ ОтборЭлемента.ПравоеЗначение = 1; Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); - Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Нет соответствия, объект будет скопирован'")); + Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Нет соответствия'")); КонецПроцедуры diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form index 227e09e57..9701cf184 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Form.form @@ -50,239 +50,6 @@ Normal
      - - КоманднаяПанель - 27 - - ФормаГруппаВыбратьОтменить - 23 - - Выбрать - 16 - true - true - - true - - false - - ВыбратьExtendedTooltip - 42 - Label - true - true - - Left - - - Form.Command.Выбрать - Auto - true - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Форма группа выбрать отменить</value> - - - ФормаГруппаВыбратьОтменитьExtendedTooltip - 41 - Label - true - true - - Left - - - - - - ФормаГруппаНайти - 24 - - ФормаНайти - 21 - true - true - - true - - - ФормаНайтиExtendedTooltip - 44 - Label - true - true - - Left - - - Form.Item.ТаблицаВыбора.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ФормаОтменитьПоиск - 22 - true - true - - true - - - ФормаОтменитьПоискExtendedTooltip - 45 - Label - true - true - - Left - - - Form.Item.ТаблицаВыбора.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Форма группа найти</value> - - - ФормаГруппаНайтиExtendedTooltip - 43 - Label - true - true - - Left - - - - - - ФормаГруппаВывестиСписок - 28 - - ФормаВывестиСписок - 29 - true - true - - true - - - ФормаВывестиСписокExtendedTooltip - 47 - Label - true - true - - Left - - - Form.Item.ТаблицаВыбора.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ФормаКопироватьВБуферОбмена - 30 - true - true - - true - - - ФормаКопироватьВБуферОбменаExtendedTooltip - 48 - Label - true - true - - Left - - - Form.Item.ТаблицаВыбора.StandardCommand.CopyToClipboard - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - true - true - - true - - - <key>ru</key> - <value>Форма группа вывести список</value> - - - ФормаГруппаВывестиСписокExtendedTooltip - 46 - Label - true - true - - Left - - - - - true - true - - true - - - <key>ru</key> - <value>Командная панель</value> - - - КоманднаяПанельExtendedTooltip - 40 - Label - true - true - - Left - - - CommandBar - - Left - Form - - ТаблицаВыбора 1 @@ -383,7 +150,6 @@
      ColumnGroup - InCell auto true @@ -415,10 +181,214 @@ true
      - None ТаблицаВыбораКоманднаяПанель 3 + + ФормаГруппаВыбратьОтменить + 23 + + Выбрать + 16 + true + true + + true + + false + + ВыбратьExtendedTooltip + 42 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Форма группа выбрать отменить</value> + + + ФормаГруппаВыбратьОтменитьExtendedTooltip + 41 + Label + true + true + + Left + + + + + + ФормаГруппаНайти + 24 + + ФормаНайти + 21 + true + true + + true + + + ФормаНайтиExtendedTooltip + 44 + Label + true + true + + Left + + + Form.Item.ТаблицаВыбора.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтменитьПоиск + 22 + true + true + + true + + + ФормаОтменитьПоискExtendedTooltip + 45 + Label + true + true + + Left + + + Form.Item.ТаблицаВыбора.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Форма группа найти</value> + + + ФормаГруппаНайтиExtendedTooltip + 43 + Label + true + true + + Left + + + + + + ФормаГруппаВывестиСписок + 28 + + ФормаВывестиСписок + 29 + true + true + + true + + + ФормаВывестиСписокExtendedTooltip + 47 + Label + true + true + + Left + + + Form.Item.ТаблицаВыбора.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаКопироватьВБуферОбмена + 30 + true + true + + true + + + ФормаКопироватьВБуферОбменаExtendedTooltip + 48 + Label + true + true + + Left + + + Form.Item.ТаблицаВыбора.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Форма группа вывести список</value> + + + ФормаГруппаВывестиСписокExtendedTooltip + 46 + Label + true + true + + Left + + + + Left true @@ -710,6 +680,8 @@ true true true + CommandBar + CommandBar true
      diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl index ca77f944b..08d870561 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/ФормаВыбораСвязиСопоставления/Module.bsl @@ -122,6 +122,7 @@ ТаблицаВыбора.Загрузить( ПолучитьИзВременногоХранилища(АдресДанных) ); УдалитьИзВременногоХранилища(АдресДанных); КонецЕсли; + КонецПроцедуры &НаСервере diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html index f0e630cf4..c082def73 100644 --- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html +++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html @@ -14,4 +14,4 @@
    • В противном случае поля таблицы сопоставления могут содержать фиктивные ссылки вида:
      <Объект не найден> (26:a0b9001b24e002fe11dfba347dd41412).
    • Фиктивная ссылка указывает на объект в текущей информационной базе, который еще не был загружен из сообщения обмена.
    • См. также:

      \ No newline at end of file + \ No newline at end of file diff --git a/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Module.bsl b/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Module.bsl index f291a0800..1a67f7f89 100644 --- a/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Module.bsl +++ b/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаТекущихДел/Module.bsl @@ -220,6 +220,7 @@ ТекущиеДелаСлужебный.УстановитьНачальныйПорядокРазделов(ТекущиеДела); КонецЕсли; + КартинкаОповещение = БиблиотекаКартинок.Оповещения; Для Каждого Дело Из ТекущиеДела Цикл Если Дело.ЭтоРаздел @@ -273,7 +274,7 @@ СтрокаДела.ВыводитьВОповещениях = Дело.ВыводитьВОповещениях; Если СтрокаДела.ВыводитьВОповещениях Тогда - СтрокаДела.Картинка = БиблиотекаКартинок.Оповещения; + СтрокаДела.Картинка = КартинкаОповещение; Иначе СтрокаДела.Картинка = Неопределено; КонецЕсли; diff --git a/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl index f3213ff77..3d924299c 100644 --- a/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl @@ -391,13 +391,12 @@ ИначеЕсли Результат.Статус = "Выполнено" Тогда ЗагрузитьТекущиеДела(Результат.АдресРезультата); Если ВыводитьОповещения Тогда + Картинка = БиблиотекаКартинок.Информация32; Для Каждого ДелоСОповещением Из ДелаСОповещением Цикл - ОбработкаОповещения = Новый ОписаниеОповещения("ПереходКВажномуДелуИзЦентраОповещений", ЭтотОбъект, ДелоСОповещением.Идентификатор); + ОбработкаОповещения = Новый ОписаниеОповещения("ПереходКВажномуДелуИзЦентраОповещений", ЭтотОбъект, + ДелоСОповещением.Идентификатор); ПоказатьОповещениеПользователя(НСтр("ru = 'Текущие дела'"), - ОбработкаОповещения, - ДелоСОповещением.Описание, - БиблиотекаКартинок.Информация32, - СтатусОповещенияПользователя.Важное, + ОбработкаОповещения, ДелоСОповещением.Описание, Картинка, СтатусОповещенияПользователя.Важное, ДелоСОповещением.Идентификатор); КонецЦикла; КонецЕсли; @@ -700,6 +699,8 @@ Возврат; КонецЕсли; + КартинкаСтрелкаВправо = БиблиотекаКартинок.СтрелкаВправо; + КартинкаСтрелкаВправоКрасная = БиблиотекаКартинок.СтрелкаВправоКрасная; СвернутыеРазделы = Новый Соответствие; Для Каждого СтрокаСоответствия Из НастройкиОтображения.СвернутыеРазделы Цикл @@ -708,8 +709,8 @@ Продолжить; КонецЕсли; - Если ЭлементФормы.Картинка = БиблиотекаКартинок.СтрелкаВправо - Или ЭлементФормы.Картинка = БиблиотекаКартинок.СтрелкаВправоКрасная Тогда + Если ЭлементФормы.Картинка = КартинкаСтрелкаВправо + Или ЭлементФормы.Картинка = КартинкаСтрелкаВправоКрасная Тогда СвернутыеРазделы.Вставить(СтрокаСоответствия.Ключ, Истина); Иначе СвернутыеРазделы.Вставить(СтрокаСоответствия.Ключ, Ложь); @@ -755,13 +756,14 @@ &НаСервере Процедура УстановитьКартинкуРазделовСВажнымиДелами() + Картинка = БиблиотекаКартинок.СтрелкаВправоКрасная; Для Каждого РазделСВажнымиДелами Из РазделыСВажнымиДелами Цикл Если РазделСВажнымиДелами.Значение <> Истина Тогда Продолжить; // Раздел не свернут КонецЕсли; ИмяКартинки = "Картинка" + РазделСВажнымиДелами.Ключ; ЭлементКартинка = Элементы[ИмяКартинки]; - ЭлементКартинка.Картинка = БиблиотекаКартинок.СтрелкаВправоКрасная; + ЭлементКартинка.Картинка = Картинка; КонецЦикла; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl index 3762f0044..b11c1dffb 100644 --- a/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ТранспортСообщенийОбменаFTP/ObjectModule.bsl @@ -21,6 +21,7 @@ Перем ВременныйКаталогСообщенийОбмена; // Временный каталог для сообщений обмена. Перем ТаймаутОтправкиПолученияДанных; // Таймаут, используемый для FTP соединения при отправке и получении данных. +Перем ТаймаутПроверкиСоединения; // Таймаут, используемый для проверки соединения с FTP-сервером. Перем ИдентификаторКаталога; #КонецОбласти @@ -156,7 +157,7 @@ ЗаписьТекста.Закрыть(); // Копируем файл на внешний ресурс из временного каталога. - Результат = ВыполнитьКопированиеФайлаНаFTPСервер(ИмяВременногоФайлаПроверкиПодключения, ИмяФайлаНаСторонеПриемника, 10); + Результат = ВыполнитьКопированиеФайлаНаFTPСервер(ИмяВременногоФайлаПроверкиПодключения, ИмяФайлаНаСторонеПриемника, ТаймаутПроверкиСоединения); // Удаляем файл на внешнем ресурсе. Если Результат Тогда @@ -569,6 +570,8 @@ СообщенияОшибок.Вставить(108, НСтр("ru = 'Превышен допустимый размер сообщения обмена.'")); + СообщенияОшибок.Вставить(109, НСтр("ru = 'Ошика при попытке установить активное соединение с FTP-сервером. Попробуйте использовать пассивное соединение.'")); + КонецПроцедуры /////////////////////////////////////////////////////////////////////////////// @@ -604,6 +607,15 @@ Возврат Ложь; КонецПопытки; + Если Таймаут = ТаймаутПроверкиСоединения + И FTPСоединение.ПассивныйРежим + И Не FTPСоединениеПассивноеСоединение Тогда + ТекстОшибки = ""; + ПолучитьСообщениеОбОшибке(109); + ДополнитьСообщениеОбОшибке(ТекстОшибки); + Возврат Ложь; + КонецЕсли; + Попытка FTPСоединение.Записать(ИмяФайлаИсточника, КаталогНаСервере + ИмяФайлаПриемника); Исключение @@ -634,7 +646,7 @@ КаталогНаСервере = СерверИКаталогНаСервере.ИмяКаталога; Попытка - FTPСоединение = ПолучитьFTPСоединение(10); + FTPСоединение = ПолучитьFTPСоединение(ТаймаутПроверкиСоединения); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ПолучитьСообщениеОбОшибке(102); @@ -695,6 +707,7 @@ ИмяОбъекта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяОбъекта, Метаданные().Имя); ТаймаутОтправкиПолученияДанных = 12*60*60; +ТаймаутПроверкиСоединения = 10; #КонецОбласти diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form index e666c65c3..4907dc3f0 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Form.form @@ -156,10 +156,6 @@ true - - <key>ru</key> - <value>Команды</value> - КомандыРасширеннаяПодсказка 34 diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Module.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Module.bsl index a4294b995..56c0715b8 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Module.bsl +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ВыборОбъектовМетаданныхПоПодсистемам/Module.bsl @@ -743,8 +743,7 @@ КонецПроцедуры // Параметры: -// КоллекцияЭлементовДерева - ДанныеФормыДерева -// - ДанныеФормыЭлементДерева: +// ЭлементДеревоРазделовПоиска - ДанныеФормыЭлементДерева: // * Пометка - Число - обязательный реквизит дерева. // * ЭтоОбъектМетаданных - Булево - обязательный реквизит дерева. // ЗначениеПометки - Число - устанавливаемое значение. diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl index 3514b2718..b9ee0367d 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/НастройкиУдаленияОбъектов/Module.bsl @@ -187,12 +187,14 @@ ТекущиеМетаданные = ""; МестоПоиска = Неопределено; + КартинкаПапка = БиблиотекаКартинок.Папка; + КартинкаРеквизит = БиблиотекаКартинок.Реквизит; Для Каждого МестоПоискаРеквизит Из ВыбранныеРеквизиты Цикл Если ТекущиеМетаданные <> МестоПоискаРеквизит.Метаданные Тогда МестоПоиска = ДеревоНастроек.Строки.Добавить(); МестоПоиска.МестоПоискаРеквизитПредставление = Метаданные.НайтиПоПолномуИмени( МестоПоискаРеквизит.Метаданные).Представление(); - МестоПоиска.Картинка = БиблиотекаКартинок.Папка; + МестоПоиска.Картинка = КартинкаПапка; МестоПоиска.МестоПоискаРеквизит = МестоПоискаРеквизит.Метаданные; ТекущиеМетаданные = МестоПоискаРеквизит.Метаданные; КонецЕсли; @@ -200,7 +202,7 @@ Реквизит = МестоПоиска.Строки.Добавить(); Реквизит.МестоПоискаРеквизитПредставление = МестоПоискаРеквизит.Представление; Реквизит.МестоПоискаРеквизит = МестоПоискаРеквизит.Реквизит; - Реквизит.Картинка = БиблиотекаКартинок.Реквизит; + Реквизит.Картинка = КартинкаРеквизит; КонецЦикла; ЗначениеВРеквизитФормы(ДеревоНастроек, "НастройкиОтображенияОбъектов"); @@ -227,13 +229,14 @@ Фильтр = Новый Структура("МестоПоискаРеквизит", ИдентификаторМестаПоиска); ПодгруппаМестаПоиска = ДеревоМестПоиска.Строки.НайтиСтроки(Фильтр)[0]; ПодгруппаМестаПоиска.Строки.Очистить(); + Картинка = БиблиотекаКартинок.Реквизит; Для Каждого Элемент Из Результат Цикл Если Элемент.Пометка Тогда МестоПоиска = ПодгруппаМестаПоиска.Строки.Добавить(); МестоПоиска.МестоПоискаРеквизит = Элемент.Значение; МестоПоиска.МестоПоискаРеквизитПредставление = Элемент.Представление; - МестоПоиска.Картинка = БиблиотекаКартинок.Реквизит; + МестоПоиска.Картинка = Картинка; КонецЕсли; КонецЦикла; @@ -303,6 +306,7 @@ Процедура ДобавитьНастройкуПродолжениеСервер(Результат) ДеревоМестПоиска = РеквизитФормыВЗначение("НастройкиОтображенияОбъектов"); + Картинка = БиблиотекаКартинок.Папка; Для Каждого Элемент Из Результат Цикл Фильтр = Новый Структура("МестоПоискаРеквизит", Элемент.Значение); @@ -310,7 +314,7 @@ МестоПоиска = ДеревоМестПоиска.Строки.Добавить(); МестоПоиска.МестоПоискаРеквизит = Элемент.Значение; МестоПоиска.МестоПоискаРеквизитПредставление = Элемент.Представление; - МестоПоиска.Картинка = БиблиотекаКартинок.Папка; + МестоПоиска.Картинка = Картинка; КонецЕсли; КонецЦикла; diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form index 6b29b6253..2e0479e53 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form @@ -218,10 +218,6 @@ true - - <key>ru</key> - <value>Команды выбора</value> - КомандыВыбораExtendedTooltip 91 @@ -296,10 +292,6 @@ true - - <key>ru</key> - <value>Команды свернуть развернуть</value> - Группа1РасширеннаяПодсказка8 714 @@ -393,10 +385,6 @@ true - - <key>ru</key> - <value>Командная панель поиск помеченных</value> - Группа1РасширеннаяПодсказка1 682 @@ -475,10 +463,6 @@ true - - <key>ru</key> - <value>Основная</value> - Группа1РасширеннаяПодсказка14 618 @@ -554,10 +538,6 @@ true - - <key>ru</key> - <value>Операции с неудаленными</value> - None ГруппаОперацииСНеудаленнымиРасширеннаяПодсказка @@ -658,10 +638,6 @@ true - - <key>ru</key> - <value>Действия над элементами списка</value> - Группа1РасширеннаяПодсказка15 620 @@ -679,10 +655,6 @@ true - - <key>ru</key> - <value>Командная панель обработка ошибок</value> - Группа1РасширеннаяПодсказка23 686 @@ -1743,10 +1715,6 @@ true - - <key>ru</key> - <value>Команды выбора из меню</value> - КомандыВыбораИзМенюРасширеннаяПодсказка 364 @@ -1846,10 +1814,6 @@ true - - <key>ru</key> - <value>Дерево помеченных на удаление вспомогательные кнопки из меню</value> - ДеревоПомеченныхНаУдалениеВспомогательныеКнопкиИзМенюРасширеннаяПодсказка 372 diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl index e6b9803e1..9d884bdd5 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl @@ -890,7 +890,7 @@ &НаКлиенте Процедура ЗарегистрироватьДействиеМестаИспользования(РедактируемоеМестоИспользования, Действие, Параметр = Неопределено) ДействиеПредставление = ?(Параметр = Неопределено, - ДействияМестИспользованияНеудаленных.НайтиПоЗначению(Действие), + ДействияМестИспользованияНеудаленных.НайтиПоЗначению(Действие).Представление, ПредставлениеКомандыЗаменитьНа(РедактируемоеМестоИспользования, Параметр)); Если Действие = Неопределено Тогда @@ -1108,8 +1108,8 @@ &НаКлиентеНаСервереБезКонтекста Процедура УстановитьСписокДействийМестИспользования(Форма) Форма.ДействияМестИспользованияНеудаленных.Очистить(); - Форма.ДействияМестИспользованияНеудаленных.Добавить("Удалить", "Удалить"); - Форма.ДействияМестИспользованияНеудаленных.Добавить("ЗаменитьСсылку", "Заменить %ПредставлениеСсылка% на"); + Форма.ДействияМестИспользованияНеудаленных.Добавить("Удалить", НСтр("ru='Удалить'")); + Форма.ДействияМестИспользованияНеудаленных.Добавить("ЗаменитьСсылку", НСтр("ru='Заменить %ПредставлениеСсылка% на'")); Форма.Элементы.СвязиНеУдаленныхДействие.СписокВыбора.Очистить(); Для Каждого ЭлементСписка Из Форма.ДействияМестИспользованияНеудаленных Цикл @@ -1210,8 +1210,10 @@ Если Действие = "ЗаменитьСсылку" Тогда ПричинаНеудаления.ДействиеПредставление = ПредставлениеКомандыЗаменитьНа(ПричинаНеудаления, ПараметрДействия); + ИначеЕсли Действие = "Удалить" Тогда + ПричинаНеудаления.ДействиеПредставление = Форма.ДействияМестИспользованияНеудаленных.НайтиПоЗначению(Действие).Представление; Иначе - ПричинаНеудаления.ДействиеПредставление = Форма.ДействияМестИспользованияНеудаленных.НайтиПоЗначению(Действие); + ПричинаНеудаления.ДействиеПредставление = ""; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl index 8a822bce1..093fc8c43 100644 --- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl +++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl @@ -320,7 +320,7 @@ НельзяУдалятьОсновнойОбъект = Истина; НеудаленныеЭлементы.Добавить(РезультатУдаления.УдаляемыйСсылка); - РезультатУдаленияОсновногоЭлемента = РезультатУдаленияЭлемента(ОсновнойОБъект); + РезультатУдаленияОсновногоЭлемента = РезультатУдаленияЭлемента(ОсновнойОбъект); РезультатУдаленияОсновногоЭлемента.Код = КодыРезультатаУдаления().ЕстьМестаИспользования; Фильтр = Новый Структура("УдаляемыйСсылка, МестоИспользования", ОсновнойОбъект.УдаляемыйСсылка, УдаляемыйСсылка.УдаляемыйСсылка); diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl index fc3bc5457..18d8e54c2 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl @@ -62,14 +62,17 @@ АрхивироватьФайлПриИзмененииЗначения(); ПрямаяВыгрузкаПриИзмененииЗначения(); - ИзменитьРежимОбработки(ЭтоКлиент); - #Если ВебКлиент Тогда Элементы.СтраницыОтладкиВыгрузки.ТекущаяСтраница = Элементы.СтраницыОтладкиВыгрузки.ПодчиненныеЭлементы.ГруппаВыгрузкаВебКлиент; Элементы.СтраницыОтладкиЗагрузки.ТекущаяСтраница = Элементы.СтраницыОтладкиЗагрузки.ПодчиненныеЭлементы.ГруппаЗагрузкаВебКлиент; Объект.ФлагРежимОтладкиОбработчиков = Ложь; + + ЭтоКлиент = Истина; + Элементы.РежимОбработки.Доступность = Ложь; #КонецЕсли + ИзменитьРежимОбработки(ЭтоКлиент); + УстановитьДоступностьКомандОтладки(); Если СохраненныйРежимЗагрузки diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl index 2a23cfaa8..1e4e1391e 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl @@ -22,14 +22,13 @@ Объект.РежимОтладкиАлгоритмов = Параметры.РежимОтладкиАлгоритмов; Объект.ОбработчикиСобытийЧитаемИзФайлаПравилОбмена = Параметры.ОбработчикиСобытийЧитаемИзФайлаПравилОбмена; - ЗаголовокФормы = НСтр("ru = 'Настройка отладки обработчиков при %Событие% данных'"); - Событие = ?(Параметры.ОбработчикиСобытийЧитаемИзФайлаПравилОбмена, НСтр("ru = 'выгрузке'"), НСтр("ru = 'загрузке'")); - ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%Событие%", Событие); - Заголовок = ЗаголовокФормы; - - ЗаголовокКнопки = НСтр("ru = 'Сформировать модуль отладки %Событие%'"); - Событие = ?(Параметры.ОбработчикиСобытийЧитаемИзФайлаПравилОбмена, НСтр("ru = 'выгрузки'"), НСтр("ru = 'загрузки'")); - ЗаголовокКнопки = СтрЗаменить(ЗаголовокКнопки, "%Событие%", Событие); + Если Параметры.ОбработчикиСобытийЧитаемИзФайлаПравилОбмена Тогда + Заголовок = НСтр("ru = 'Настройка отладки обработчиков при выгрузке данных'"); + ЗаголовокКнопки = НСтр("ru = 'Сформировать модуль отладки выгрузки'"); + Иначе + Заголовок = НСтр("ru = 'Настройка отладки обработчиков при загрузке данных'"); + ЗаголовокКнопки = НСтр("ru = 'Сформировать модуль отладки загрузки'"); + КонецЕсли; Элементы.ВыгрузитьКодОбработчиков.Заголовок = ЗаголовокКнопки; ЦветОсобогоТекста = ЦветаСтиля.ЦветОсобогоТекста; diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl index d0d8c07a9..f548796a5 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl +++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl @@ -172,7 +172,7 @@ // 2 - разделитель включается в правую подстроку. // // Возвращаемое значение: -// Правая часть строки - до символа-разделителя. +// Строка - правая часть строки до символа-разделителя. // Функция ОтделитьРазделителем(Стр, Знач Разделитель, Режим=0) Экспорт @@ -219,9 +219,9 @@ // Разделитель - Строка - разделитель строк текста, минимум 1 символ; // ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. // Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: -// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки -// включаются в результат. -// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в +// для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки +// включаются в результат; +// если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в // случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а // при других разделителях результатом функции будет пустой массив. // @@ -904,11 +904,11 @@ // не является ошибкой проверки конфигурации. // // Параметры: -// УзелРодитель - xml-узел-родитель. +// УзелРодитель - ЗаписьXML - xml-узел-родитель. // Имя - Строка - имя добавляемого узла. // // Возвращаемое значение: -// Новый xml-узел, добавленный к указанному узлу-родителю. +// ЗаписьXML - xml-узел, добавленный к указанному узлу-родителю. // Функция ДобавитьУзел(УзелРодитель, Имя) Экспорт @@ -925,10 +925,10 @@ // не является ошибкой проверки конфигурации. // // Параметры: -// Узел - xml - узел. +// Узел - ЗаписьXML - xml узел. // // Возвращаемое значение: -// Новый xml - копия указанного узла. +// ЗаписьXML - копия указанного узла. // Функция КопироватьУзел(Узел) Экспорт @@ -975,8 +975,8 @@ // Подчиняет xml-узел указанному узлу-родителю. // // Параметры: -// УзелРодитель - xml-узел-родитель. -// Узел - xml - подчиняемый узел. +// УзелРодитель - ЗаписьXML - xml узел-родитель. +// Узел - ЗаписьXML - xml узел подчиняемый. // Процедура ДобавитьПодчиненный(УзелРодитель, Узел) Экспорт @@ -994,7 +994,7 @@ // Устанавливает атрибут указанного xml-узла. // // Параметры: -// Узел - xml-узел +// Узел - ЗаписьXML - xml-узел // Имя - Строка - имя атрибута. // Значение - Произвольный - устанавливаемое значение. // @@ -1101,7 +1101,7 @@ // ОбрезатьСтрокуСправа - Булево - признак необходимости обрезать строку справа. // // Возвращаемое значение: -// Значение xml-элемента, приведенное к соответствующему типу. +// Произвольный - значение xml-элемента, приведенное к соответствующему типу. // Функция одЗначениеЭлемента(Объект, Тип, ИскатьПоСвойству = "", ОбрезатьСтрокуСправа = Истина) Экспорт @@ -1161,7 +1161,7 @@ // Сохраняет в файл указанный xml-узел. // // Параметры: -// Узел - xml-узел, сохраняемый в файл. +// Узел - ЗаписьXML - xml-узел, сохраняемый в файл. // Процедура ЗаписатьВФайл(Узел) Экспорт @@ -1518,7 +1518,7 @@ // Параметры: // Объект - Произвольный - удаляемый (помечаемый на удаление) объект выборки. // Правило - СтрокаТаблицыЗначений - ссылка на правило очистки данных. -// Свойства - Менеджер - свойства объекта метаданного удаляемого объекта. +// Свойства - Структура - свойства объекта метаданного удаляемого объекта. // ВходящиеДанные - Произвольный - произвольные вспомогательные данные. // Процедура УдалениеОбъектаВыборки(Объект, Правило, Свойства=Неопределено, ВходящиеДанные=Неопределено) Экспорт @@ -1590,7 +1590,7 @@ // ИсходящиеДанные - Произвольный - произвольные вспомогательные данные, передаваемые правилам // передаваемые правилу конвертации свойств. // ИмяПКО - Строка - имя правила конвертации, согласно которому осуществляется выгрузка. -// УзелСсылки - xml-узел ссылки объекта приемника. +// УзелСсылки - ЗаписьXML - xml-узел ссылки объекта приемника. // ТолькоПолучитьУзелСсылки - Булево - если Истина, то выгрузка объекта не производится, // только формируется xml-узел ссылки. // ПКО - СтрокаТаблицыЗначений - строка таблицы правил конвертации. @@ -1720,7 +1720,11 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, НСтр("ru = 'ПередКонвертациейОбъекта (глобальный)'")); + + ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); + ЗаписатьИнформациюОбОшибкеВыгрузкиОбработчикаПКО(64, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПКО, Источник, + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередКонвертациейОбъекта")); + КонецПопытки; Если Отказ Тогда // Отказ от дальнейшей обработки правила. @@ -2134,7 +2138,7 @@ // Возвращает фрагмент текста языка запросов, который выражает условие ограничения на интервал дат. // // Параметры: -// Свойства - Метаданные - свойства объекта метаданных. +// Свойства - Структура - свойства объекта метаданных. // ИмяТипа - Строка - имя типа. // ИмяГруппыТаблицы - Строка - имя группы таблицы. // ВыборкаДляОчисткиДанных - Булево - выборка для очистки данных. @@ -2266,20 +2270,20 @@ КонецЕсли; Запрос.Текст = - "ВЫБРАТЬ // АвтозаменаРазрешенные - | * // АвтозаменаПолей + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | * |ИЗ | &ИмяТаблицыМетаданных КАК ОбъектДляВыгрузки"; - Если НЕ ПустаяСтрока(СтрокаРазрешения) Тогда + Если ПустаяСтрока(СтрокаРазрешения) Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "// АвтозаменаРазрешенные", СтрокаРазрешения); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); КонецЕсли; Если СокрЛП(СтрокаВыбораПолей) <> "*" Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "* // АвтозаменаПолей", СтрокаВыбораПолей); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "*", СтрокаВыбораПолей); КонецЕсли; @@ -2304,20 +2308,20 @@ Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запрос.Текст = - "ВЫБРАТЬ // АвтозаменаРазрешенные - | * // АвтозаменаПолей + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | * |ИЗ | &ИмяТаблицыМетаданных КАК ОбъектДляВыгрузки"; - Если НЕ ПустаяСтрока(СтрокаРазрешения) Тогда + Если ПустаяСтрока(СтрокаРазрешения) Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "// АвтозаменаРазрешенные", СтрокаРазрешения); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); КонецЕсли; Если СокрЛП(СтрокаВыбораПолей) <> "*" Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "* // АвтозаменаПолей", СтрокаВыбораПолей); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "*", СтрокаВыбораПолей); КонецЕсли; @@ -2334,13 +2338,13 @@ Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запрос.Текст = - "ВЫБРАТЬ // АвтозаменаРазрешенные - | * // АвтозаменаПолей + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | * | - | ,NULL КАК Активность - | ,NULL КАК Регистратор - | ,NULL КАК НомерСтроки - | ,NULL КАК Период + |,NULL КАК Активность + |,NULL КАК Регистратор + |,NULL КАК НомерСтроки + |,NULL КАК Период | |ИЗ | &ИмяТаблицыМетаданных КАК ОбъектДляВыгрузки"; @@ -2359,9 +2363,9 @@ КонецЕсли; - Если НЕ ПустаяСтрока(СтрокаРазрешения) Тогда + Если ПустаяСтрока(СтрокаРазрешения) Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "// АвтозаменаРазрешенные", СтрокаРазрешения); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); КонецЕсли; @@ -2382,7 +2386,7 @@ // Формирует выборку для выгрузки очистки данных. // // Параметры: -// Свойства - Менеджер - свойства объекта метаданных. +// Свойства - Структура - свойства объекта метаданных. // ИмяТипа - Строка - имя типа. // ВыборкаДляОчисткиДанных - Булево - выборка для очистки данных. // УдалятьОбъектыНепосредственно - Булево - признак необходимости удалять непосредственно. @@ -2779,8 +2783,8 @@ // // Параметры: // РаботаВозможна - Булево - флаг успешной инициализации внешней обработки. -// ОбъектВладелец - ОбработкаОбъект - объект, который будет являться владельцем -// инициализируемой внешней обработки. +// ОбъектВладелец - ОбработкаОбъект.УниверсальныйОбменДаннымиXML - объект, который будет являться владельцем +// инициализируемой внешней обработки. // Процедура ИнициализацияВнешнейОбработкиОбработчиковСобытий(РаботаВозможна, ОбъектВладелец) Экспорт @@ -3120,7 +3124,7 @@ // Параметры: // Код - Число - код сообщения. // СтруктураЗаписи - Структура - структура записи протокола. -// ВзвестиФлагОшибок - если истина, то - это сообщение об ошибке. Взводится ФлагОшибки. +// ВзвестиФлагОшибок - Булево - если истина, то - это сообщение об ошибке. Взводится ФлагОшибки. // Функция ЗаписатьВПротоколВыполнения(Код="", СтруктураЗаписи=Неопределено, ВзвестиФлагОшибок=Истина, Уровень=0, Выравнивание=22, БезусловнаяЗаписьВПротоколОбмена = Ложь) Экспорт @@ -3736,9 +3740,9 @@ // // Параметры: // ПравилаОбмена - ЧтениеXML - объект типа ЧтениеXML. -// Значения - соответствие значений объекта источника - строковым +// Значения - Соответствие - соответствие значений объекта источника - строковым // представлениям объекта приемника. -// ТипИсточника - значение Тип - типа Тип - тип объекта источника. +// ТипИсточника - Строка - тип объекта источника. // Процедура ЗагрузитьПКЗ(ПравилаОбмена, Значения, ТипИсточника) @@ -3768,9 +3772,9 @@ // // Параметры: // ПравилаОбмена - ЧтениеXML - объект типа ЧтениеXML. -// Значения - соответствие значений объекта источника - строковым +// Значения - Соответствие - соответствие значений объекта источника - строковым // представлениям объекта приемника. -// ТипИсточника - значение Тип - типа Тип - тип объекта источника. +// ТипИсточника - Строка - тип объекта источника. // Процедура ЗагрузитьЗначения(ПравилаОбмена, Значения, ТипИсточника); @@ -5196,7 +5200,7 @@ // // Параметры: // Результат - ЗаписьТекста - объект типа ЗаписьТекста - для вывода обработчика в текстовый файл. -// Алгоритм - элемент структуры - алгоритм для выгрузки. +// Алгоритм - КлючИЗначение - элемент структуры, алгоритм для выгрузки. // Процедура ДобавитьВПотокАлгоритм(Результат, Алгоритм) @@ -5356,7 +5360,7 @@ // ИмяОбласти - Строка - имя области текстового макета "мМакетОбщиеПроцедурыФункции". // // Возвращаемое значение: -// Текст из макета +// Строка - текст из макета // Функция ПолучитьСлужебныйКод(ИмяОбласти) @@ -5466,7 +5470,7 @@ // и вывода предупреждения об ошибке. // // Возвращаемое значение: -// ОбработчикНовый - Строка - измененный код алгоритма с учетом вложенных алгоритмов. +// Строка - измененный код алгоритма с учетом вложенных алгоритмов. // Функция ЗаменитьВызовыАлгоритмовКодомЭтихАлгоритмовВОбработчике(Обработчик, АлгоритмВладелец, МассивЗапрошенныхЭлементов, Знач СтрокаПрефикса = "") @@ -5496,8 +5500,8 @@ ЗаписатьЗаголовокБлокаАлгоритма(ОбработчикНовый, Алгоритм, СтрокаПрефиксаДляВложенногоКода, НСтр("ru = '{РЕКУРСИВНЫЙ ВЫЗОВ АЛГОРИТМА}'")); - СтрокаОператора = НСтр("ru = 'ВызватьИсключение ""РЕКУРСИВНЫЙ ВЫЗОВ АЛГОРИТМА: %1"";'"); - СтрокаОператора = ПодставитьПараметрыВСтроку(СтрокаОператора, Алгоритм); + СтрокаОператора = НСтр("ru = '%1 ""РЕКУРСИВНЫЙ ВЫЗОВ АЛГОРИТМА: %2"";'"); + СтрокаОператора = ПодставитьПараметрыВСтроку(СтрокаОператора, "ВызватьИсключение", Алгоритм); ОбработчикНовый = ОбработчикНовый + Символы.ПС + СтрокаПрефиксаДляВложенногоКода + СтрокаОператора; @@ -5535,7 +5539,7 @@ // МассивИсточник - Массив - источник для получения нового массива копированием. // // Возвращаемое значение: -// НовыйМассив - Массив - массив, полученный копированием из переданного массива. +// Массив - массив, полученный копированием из переданного массива. // Функция СкопироватьМассив(МассивИсточник) @@ -5556,7 +5560,7 @@ // Обработчик - Строка - тело обработчика. // // Возвращаемое значение: -// АлгоритмыОбработчика - Массив - массив с именами алгоритмов, которые присутствуют в переданном обработчике. +// Массив - массив с именами алгоритмов, которые присутствуют в переданном обработчике. // Функция ПолучитьАлгоритмыОбработчика(Обработчик) @@ -5585,7 +5589,7 @@ // (смещение при котором производится вызов алгоритма). // СтрокаПрефикса - Строка - начальное смещение. // Возвращаемое значение: -// СтрокаПрефиксаДляВложенногоКода - Строка - итоговое смещение кода алгоритма. +// Строка - итоговое смещение кода алгоритма. // Функция ПолучитьПрефиксДляВложенногоАлгоритма(СтрокаОбработчика, СтрокаПрефикса) @@ -8178,7 +8182,7 @@ // Загружает объект типа ОписаниеТипов из указанного xml-источника. // // Параметры: -// Источник - xml-источник. +// Источник - ЗаписьXML - xml-источник. // Функция ЗагрузитьТипыОбъекта(Источник) @@ -8584,8 +8588,10 @@ Исключение - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, - ТипОбъекта, Неопределено, НСтр("ru = 'ПередЗагрузкойОбъекта (глобальный)'")); + ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(53, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ИмяПравила, Источник, ТипОбъекта, Неопределено, + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередЗагрузкойОбъекта")); КонецПопытки; @@ -8956,9 +8962,13 @@ НужноЗаписатьОбъект = ОбъектМодифицирован ИЛИ НужноБылоЗаписатьОбъект; Исключение + УдалитьИзСтекаНеЗаписанныхОбъектов(НПП, ГНПП); - ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяПравила, Источник, - ТипОбъекта, Объект, НСтр("ru = 'ПослеЗагрузкиОбъекта (глобальный)'")); + + ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); + ЗаписатьИнформациюОбОшибкеЗагрузкиОбработчикаПКО(54, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ИмяПравила, Источник, ТипОбъекта, Объект, + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеЗагрузкиОбъекта")); КонецПопытки; @@ -9479,14 +9489,14 @@ // // Параметры: // Источник - произвольный источник данных. -// Приемник - xml-узел объекта приемника. +// Приемник - ЗаписьXML - xml-узел объекта приемника. // ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу // для выполнения конвертации. // ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам // конвертации объектов свойств. // ПКО - ссылка на правило конвертации объектов (родитель коллекции правил конвертации свойств). // ПКГС - ссылка на правило конвертации группы свойств. -// УзелКоллекцииСвойств - xml-узел коллекции свойств. +// УзелКоллекцииСвойств - ЗаписьXML - xml-узел коллекции свойств. // Процедура ВыгрузитьГруппуСвойств(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС, УзелКоллекцииСвойств, ВыгрузитьТолькоСсылку, СписокВременныхФайлов = Неопределено) @@ -10912,7 +10922,13 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, НСтр("ru = 'ПередВыгрузкойОбъектаВыборки (глобальный)'"), Объект); + + ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(65, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + Правило.Имя, + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередВыгрузкойОбъектаВыборки"), + Объект); + КонецПопытки; Если Отказ Тогда @@ -10966,7 +10982,13 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Правило.Имя, НСтр("ru = 'ПослеВыгрузкиОбъектаВыборки (глобальный)'"), Объект); + + ИмяОбработчика = НСтр("ru = '%1 (глобальный)'"); + ЗаписатьИнформациюОбОшибкеОбработчикиПВД(69, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + Правило.Имя, + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеВыгрузкиОбъектаВыборки"), + Объект); + КонецПопытки; КонецЕсли; @@ -11022,8 +11044,8 @@ ИтоговоеОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, Свойства.ИмяТипа, Правило.ИмяОбъектаДляЗапросаРегистра, Ложь); ТекстЗапроса = - "ВЫБРАТЬ // АвтозаменаРазрешенные - | * // АвтозаменаПолей + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | * | | ,NULL КАК Активность | ,NULL КАК Регистратор @@ -11046,9 +11068,9 @@ КонецЕсли; - Если НЕ ПустаяСтрока(СтрокаРазрешения) Тогда + Если ПустаяСтрока(СтрокаРазрешения) Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "// АвтозаменаРазрешенные", СтрокаРазрешения); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); КонецЕсли; @@ -11063,20 +11085,20 @@ ИтоговоеОграничениеПоДате = ПолучитьСтрокуОграниченияПоДатеДляЗапроса(Свойства, Свойства.ИмяТипа,, Ложь); ТекстЗапроса = - "ВЫБРАТЬ // АвтозаменаРазрешенные - | * // АвтозаменаПолей + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | * | | ИЗ &ИмяТаблицыМетаданных КАК ОбъектДляВыгрузки"; - Если НЕ ПустаяСтрока(СтрокаРазрешения) Тогда + Если ПустаяСтрока(СтрокаРазрешения) Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "// АвтозаменаРазрешенные", СтрокаРазрешения); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); КонецЕсли; Если Правило.ВыбиратьДанныеДляВыгрузкиОднимЗапросом <> Истина Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "* // АвтозаменаПолей", "ОбъектДляВыгрузки.Ссылка КАК Ссылка"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "*", "ОбъектДляВыгрузки.Ссылка КАК Ссылка"); КонецЕсли; @@ -12328,7 +12350,7 @@ // Осуществляет загрузку правил обмена в соответствии с форматом. // // Параметры: -// Источник - объект, из которого осуществляется загрузка правил обмена; +// Источник - Строка - объект, из которого осуществляется загрузка правил обмена; // ТипИсточника - Строка - указывающая тип источника: "XMLФайл", "ЧтениеXML", "Строка". // Процедура ЗагрузитьПравилаОбмена(Источник="", ТипИсточника="XMLФайл") Экспорт @@ -12701,8 +12723,8 @@ Исключение - Текст = НСтр("ru = 'Обработчик: ""ПослеЗагрузкиПравилОбмена"": %1'"); - Текст = ПодставитьПараметрыВСтроку(Текст, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Текст = НСтр("ru = 'Обработчик: ""%1"": %2'"); + Текст = ПодставитьПараметрыВСтроку(Текст, "ПослеЗагрузкиПравилОбмена", КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Текст); @@ -12906,7 +12928,7 @@ // выполняем необходимые обработчики событий. // // Параметры: -// СтрокаДанных - имя файла для загрузки данных или строка-XML, содержащая данные для загрузки. +// СтрокаДанных - Строка - имя файла для загрузки данных или строка-XML, содержащая данные для загрузки. // // Возвращаемое значение: // Булево - Истина - загрузка данных из файла возможна; Ложь - нет. @@ -13004,8 +13026,13 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередЗагрузкойДанных (конвертация)'")); + + ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(22, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередЗагрузкойДанных")); + Отказ = Истина; + КонецПопытки; Если Отказ Тогда // Отказ от загрузки данных @@ -13060,7 +13087,11 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеЗагрузкиДанных (конвертация)'")); + + ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(23, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеЗагрузкиДанных")); + КонецПопытки; КонецЕсли; @@ -13364,8 +13395,13 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПередВыгрузкойДанных (конвертация)'")); + + ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(62, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПередВыгрузкойДанных")); + Отказ = Истина; + КонецПопытки; Если Не Отказ Тогда @@ -13419,7 +13455,11 @@ КонецЕсли; Исключение - ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), НСтр("ru = 'ПослеВыгрузкиДанных (конвертация)'")); + + ИмяОбработчика = НСтр("ru = '%1 (конвертация)'"); + ЗаписатьИнформациюОбОшибкеОбработчикиКонвертации(63, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), + ПодставитьПараметрыВСтроку(ИмяОбработчика, "ПослеВыгрузкиДанных")); + КонецПопытки; ПровестиЗаписьНеЗаписанныхОбъектов(); @@ -13723,7 +13763,10 @@ одСообщения.Вставить(2, НСтр("ru = 'Ошибка распаковки файла обмена. Файл заблокирован'")); одСообщения.Вставить(3, НСтр("ru = 'Указанный файл правил обмена не существует'")); - одСообщения.Вставить(4, НСтр("ru = 'Ошибка при создании COM-объекта Msxml2.DOMDocument'")); + + ТекстОшибки = НСтр("ru = 'Ошибка при создании COM-объекта %1'"); + одСообщения.Вставить(4, ПодставитьПараметрыВСтроку(ТекстОшибки,"Msxml2.DOMDocument")); + одСообщения.Вставить(5, НСтр("ru = 'Ошибка открытия файла обмена'")); одСообщения.Вставить(6, НСтр("ru = 'Ошибка при загрузке правил обмена'")); одСообщения.Вставить(7, НСтр("ru = 'Ошибка формата правил обмена'")); @@ -13741,63 +13784,85 @@ одСообщения.Вставить(16, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства источника)'")); одСообщения.Вставить(17, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника)'")); - одСообщения.Вставить(19, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойОбъекта'")); - одСообщения.Вставить(20, НСтр("ru = 'Ошибка в обработчике события ПриЗагрузкеОбъекта'")); - одСообщения.Вставить(21, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиОбъекта'")); - одСообщения.Вставить(22, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойДанных (конвертация)'")); - одСообщения.Вставить(23, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиДанных (конвертация)'")); + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1'"); + одСообщения.Вставить(19, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередЗагрузкойОбъекта")); + одСообщения.Вставить(20, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПриЗагрузкеОбъекта")); + одСообщения.Вставить(21, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеЗагрузкиОбъекта")); + + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1 (конвертация)'"); + одСообщения.Вставить(22, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередЗагрузкойДанных")); + одСообщения.Вставить(23, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеЗагрузкиДанных")); + одСообщения.Вставить(24, НСтр("ru = 'Ошибка при удалении объекта'")); одСообщения.Вставить(25, НСтр("ru = 'Ошибка при записи документа'")); одСообщения.Вставить(26, НСтр("ru = 'Ошибка записи объекта'")); - одСообщения.Вставить(27, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаОчистки'")); - одСообщения.Вставить(28, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаОчистки'")); - одСообщения.Вставить(29, НСтр("ru = 'Ошибка в обработчике события ПередУдалениемОбъекта'")); - одСообщения.Вставить(31, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаВыгрузки'")); - одСообщения.Вставить(32, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаВыгрузки'")); - одСообщения.Вставить(33, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'")); - одСообщения.Вставить(34, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'")); + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1'"); + одСообщения.Вставить(27, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередОбработкойПравилаВыгрузки")); + одСообщения.Вставить(28, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеОбработкиПравилаОчистки")); + одСообщения.Вставить(29, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередУдалениемОбъекта")); + + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1'"); + одСообщения.Вставить(31, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередОбработкойПравилаВыгрузки")); + одСообщения.Вставить(32, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеОбработкиПравилаВыгрузки")); + одСообщения.Вставить(33, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередВыгрузкойОбъекта")); + одСообщения.Вставить(34, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеВыгрузкиОбъекта")); одСообщения.Вставить(39, НСтр("ru = 'Ошибка при выполнении алгоритма, содержащегося в файле обмена'")); - одСообщения.Вставить(41, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'")); - одСообщения.Вставить(42, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузкеОбъекта'")); - одСообщения.Вставить(43, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'")); + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1'"); + одСообщения.Вставить(41, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередВыгрузкойОбъекта")); + одСообщения.Вставить(42, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПриВыгрузкеОбъекта")); + одСообщения.Вставить(43, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеВыгрузкиОбъекта")); одСообщения.Вставить(45, НСтр("ru = 'Не найдено правило конвертации объектов'")); - одСообщения.Вставить(48, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств'")); - одСообщения.Вставить(49, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиВыгрузки группы свойств'")); - одСообщения.Вставить(50, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (объекта коллекции)'")); - одСообщения.Вставить(51, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (объекта коллекции)'")); - одСообщения.Вставить(52, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (объекта коллекции)'")); - одСообщения.Вставить(53, НСтр("ru = 'Ошибка в глобальном обработчике события ПередЗагрузкойОбъекта (конвертация)'")); - одСообщения.Вставить(54, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеЗагрузкиОбъекта (конвертация)'")); - одСообщения.Вставить(55, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (свойства)'")); - одСообщения.Вставить(56, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (свойства)'")); - одСообщения.Вставить(57, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (свойства)'")); + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1 группы свойств'"); + одСообщения.Вставить(48, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередОбработкойВыгрузки")); + одСообщения.Вставить(49, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеОбработкиВыгрузки")); + + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1 (объекта коллекции)'"); + одСообщения.Вставить(50, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередВыгрузкой")); + одСообщения.Вставить(51, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПриВыгрузке")); + одСообщения.Вставить(52, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеВыгрузки")); + + ТекстОшибки = НСтр("ru = 'Ошибка в глобальном обработчике события %1 (конвертация)'"); + одСообщения.Вставить(53, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередЗагрузкойОбъекта")); + одСообщения.Вставить(54, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеЗагрузкиОбъекта")); + + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1 (свойства)'"); + одСообщения.Вставить(55, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередВыгрузкой")); + одСообщения.Вставить(56, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПриВыгрузке")); + одСообщения.Вставить(57, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеВыгрузки")); + + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1 (конвертация)'"); + одСообщения.Вставить(62, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередВыгрузкойДанных")); + одСообщения.Вставить(63, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеВыгрузкиДанных")); + + ТекстОшибки = НСтр("ru = 'Ошибка в глобальном обработчике события %1 (конвертация)'"); + одСообщения.Вставить(64, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередКонвертациейОбъекта")); + одСообщения.Вставить(65, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПередВыгрузкойОбъекта")); - одСообщения.Вставить(62, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойДанных (конвертация)'")); - одСообщения.Вставить(63, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)'")); - одСообщения.Вставить(64, НСтр("ru = 'Ошибка в глобальном обработчике события ПередКонвертациейОбъекта (конвертация)'")); - одСообщения.Вставить(65, НСтр("ru = 'Ошибка в глобальном обработчике события ПередВыгрузкойОбъекта (конвертация)'")); одСообщения.Вставить(66, НСтр("ru = 'Ошибка получения коллекции подчиненных объектов из входящих данных'")); одСообщения.Вставить(67, НСтр("ru = 'Ошибка получения свойства подчиненного объекта из входящих данных'")); одСообщения.Вставить(68, НСтр("ru = 'Ошибка получения свойства объекта из входящих данных'")); - одСообщения.Вставить(69, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеВыгрузкиОбъекта (конвертация)'")); + ТекстОшибки = НСтр("ru = 'Ошибка в глобальном обработчике события %1 (конвертация)'"); + одСообщения.Вставить(69, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеВыгрузкиОбъекта")); одСообщения.Вставить(71, НСтр("ru = 'Не найдено соответствие для значения Источника'")); одСообщения.Вставить(72, НСтр("ru = 'Ошибка при выгрузке данных для узла плана обмена'")); - одСообщения.Вставить(73, НСтр("ru = 'Ошибка в обработчике события ПоследовательностьПолейПоиска'")); + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1'"); + одСообщения.Вставить(73, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПоследовательностьПолейПоиска")); одСообщения.Вставить(74, НСтр("ru = 'Необходимо перезагрузить правила обмена для выгрузки данных'")); одСообщения.Вставить(75, НСтр("ru = 'Ошибка при выполнении алгоритма после загрузки значений параметров'")); - одСообщения.Вставить(76, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъектаВФайл'")); + ТекстОшибки = НСтр("ru = 'Ошибка в обработчике события %1'"); + одСообщения.Вставить(76, ПодставитьПараметрыВСтроку(ТекстОшибки, "ПослеВыгрузкиОбъектаВФайл")); одСообщения.Вставить(77, НСтр("ru = 'Не указан файл внешней обработки с подключаемыми процедурами обработчиков событий'")); @@ -14378,7 +14443,7 @@ // Нет. // // Возвращаемое значение: -// ОбработкаОбъект - УниверсальныйОбменДаннымиXML - обработка базы-приемника для загрузки данных в базу-приемник. +// ОбработкаОбъект.УниверсальныйОбменДаннымиXML - обработка базы-приемника для загрузки данных в базу-приемник. // Функция ВыполнитьПодключениеКИБПриемнику() Экспорт @@ -14404,10 +14469,11 @@ РезультатПодключения = ОбъектПодключения.Обработки.УниверсальныйОбменДаннымиXML.Создать(); Исключение - Текст = НСтр("ru = 'При попытке создания обработки УниверсальныйОбменДаннымиXML произошла ошибка: %1'"); - Текст = ПодставитьПараметрыВСтроку(Текст, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Текст = НСтр("ru = 'При попытке создания обработки %1 произошла ошибка: %2'"); + Текст = ПодставитьПараметрыВСтроку(Текст, Метаданные().Имя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); СообщитьПользователю(Текст); РезультатПодключения = Неопределено; + КонецПопытки; Если РезультатПодключения <> Неопределено Тогда diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl index f3b296765..a0711fdc6 100644 --- a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl +++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl @@ -1262,7 +1262,7 @@ СтрокаТаблицы.ОграничениеРазмера = Агрегаты.ОграничениеРазмера; СтрокаТаблицы.Эффект = Агрегаты.Эффект; - Для Каждого Агрегат Из Агрегаты.Агрегаты Цикл + Для Каждого Агрегат Из Агрегаты.Агрегаты Цикл // ИнформацияОбАгрегате СинонимыИзмерений = Новый Массив; Для Каждого ИмяИзмерения Из Агрегат.Измерения Цикл @@ -1444,6 +1444,7 @@ АгрегатыПоРегистрам.Очистить(); СписокАгрегатовРегистра.Очистить(); + Картинка = БиблиотекаКартинок.РегистрБухгалтерии; Для Каждого Регистр Из Метаданные.РегистрыБухгалтерии Цикл Если Не ПравоДоступа("УправлениеИтогами", Регистр) Тогда @@ -1451,7 +1452,6 @@ КонецЕсли; Представление = Регистр.Представление() + " (" + НСтр("ru = 'регистр бухгалтерии'") + ")"; - Картинка = БиблиотекаКартинок.РегистрБухгалтерии; СтрокаТаблицы = СписокИтогов.Добавить(); СтрокаТаблицы.Тип = 1; @@ -1463,6 +1463,7 @@ КонецЦикла; + Картинка = БиблиотекаКартинок.РегистрНакопления; Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл Постфикс = ""; @@ -1479,7 +1480,6 @@ КонецЕсли; Представление = Регистр.Представление() + " (" + Постфикс + ")"; - Картинка = БиблиотекаКартинок.РегистрНакопления; СтрокаТаблицы = СписокИтогов.Добавить(); СтрокаТаблицы.Тип = 0; @@ -1491,6 +1491,7 @@ КонецЦикла; + Картинка = БиблиотекаКартинок.РегистрНакопления; Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл Если Регистр.ВидРегистра <> Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда @@ -1502,10 +1503,7 @@ КонецЕсли; Представление = Регистр.Представление(); - Картинка = БиблиотекаКартинок.РегистрНакопления; - Агрегаты = Регистр.Агрегаты; - Если Агрегаты.Количество() = 0 Тогда Продолжить; КонецЕсли; diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/СерверыОблачнойПодписи/CommandModule.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/СерверыОблачнойПодписи/CommandModule.bsl new file mode 100644 index 000000000..b2b14aa18 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/СерверыОблачнойПодписи/CommandModule.bsl @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ПараметрыФормы = Новый Структура; + + ОткрытьФорму("Справочник.ЭкземплярыСервераDSS.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/СписокСертификатов/CommandModule.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/СписокСертификатов/CommandModule.bsl new file mode 100644 index 000000000..06c2e67a8 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/СписокСертификатов/CommandModule.bsl @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОповещениеСледующее = Новый ОписаниеОповещения("ПослеВыбораПользователя", ЭтотОбъект); + СервисКриптографииDSSКлиент.ВыбратьПользователя(ОповещениеСледующее); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ПослеВыбораПользователя(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора.Выполнено Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НастройкиПользователя", РезультатВыбора.НастройкиПользователя); + ПараметрыФормы.Вставить("ВыбораИзСписка", Ложь); + + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.СписокСертификатов", ПараметрыФормы); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/УчетныеЗаписиОблачнойПодписи/CommandModule.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/УчетныеЗаписиОблачнойПодписи/CommandModule.bsl new file mode 100644 index 000000000..71dbc0bd2 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Commands/УчетныеЗаписиОблачнойПодписи/CommandModule.bsl @@ -0,0 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытий + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ПараметрыФормы = Новый Структура; + + ОткрытьФорму("Справочник.УчетныеЗаписиDSS.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Form.form new file mode 100644 index 000000000..dc6e878bc --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Form.form @@ -0,0 +1,746 @@ + + + + <key>ru</key> + <value>Ввод пароля</value> + + + ЗаголовокФормы + 32 + true + true + + true + + + ЗаголовокФормыРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ЗаголовокФормыКонтекстноеМеню + 33 + true + + Label + true + + Left + Bottom + + + + ГруппаВвод + 23 + + ПраваяКолонка + 27 + + Логин + 41 + true + true + + true + + + Логин + + + ЛогинРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + ЛогинКонтекстноеМеню + 42 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + Сервер + 35 + true + true + + true + + + Сервер + + + СерверРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + СерверКонтекстноеМеню + 36 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + + ПредставлениеСертификата + 50 + true + true + + true + + + ПредставлениеСертификата + + true + + ПредставлениеСертификатаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ПредставлениеСертификатаКонтекстноеМеню + 51 + true + + InputField + Enter + true + Left + true + + + StartChoice + СертификатНачалоВыбора + + true + true + true + + StdPicture.OpenFile + + true + Normal + + + + Пароль + 5 + true + true + + true + + + Пароль + + ShowBottom + + ПарольРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПарольНачалоВыбора + + true + true + true + true + true + true + true + Normal + + + + Сохранить + 8 + true + true + + true + + + Сохранить + + true + Right + + СохранитьРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СохранитьКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Правая</value> + + + ПраваяКолонкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Ввод</value> + + + ГруппаВводРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаКоманда + 3 + + ОК + 13 + true + true + + true + + + ОКРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 15 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандаРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 50 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + Пароль + + <key>ru</key> + <value>Пароль</value> + + 2 + + String + + + + true + + + true + + + + ЗаголовокФормы + 3 + + String + + + + true + + + true + + + + Сохранить + + <key>ru</key> + <value>Сохранить</value> + + 4 + + Boolean + + + true + + + true + + + + РежимВвода + 5 + + String + + + + true + + + true + + + + Ошибка + 6 + + Boolean + + + true + + + true + + + + ВозможноСохранять + 8 + + String + + + + true + + + true + + + + КартинкаОткрыть + 9 + + Picture + + + true + + + true + + + + КартинкаЗакрыть + 10 + + Picture + + + true + + + true + + + + Логин + + <key>ru</key> + <value>Логин</value> + + 7 + + String + + + + true + + + true + + + + Сервер + + <key>ru</key> + <value>Сервер</value> + + 11 + + String + + + + true + + + true + + + + НастройкиПользователя + 12 + + + true + + + true + + + + ПредставлениеСертификата + + <key>ru</key> + <value>Сертификат</value> + + 13 + + String + + + + true + + + true + + + + ДанныеСертификата + 14 + + + true + + + true + + + + МобильныйКлиент + 15 + + Boolean + + + true + + + true + + + + СкрыватьПароль + 16 + + Boolean + + + true + + + true + + + + КоличествоПопыток + 17 + + Number + + 10 + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + ПояснениеОперации + + String + + + + + НастройкиПользователя + + + + РежимВвода + + String + + + + + ВозможноСохранять + + Boolean + + + + Логин + + String + + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Help/ru.html new file mode 100644 index 000000000..e5614a6bc --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Help/ru.html @@ -0,0 +1,26 @@ + + +

      Предназначена для авторизации пользователя на +сервисе облачной подписи.

      + +

      Форма предназначена для всех способов +первичной авторизации указанной в карточке учетной записи, кроме Авторизация через Web-форму. Вызывается +в момент выполнения первой операции с помощью сервиса облачной подписи, +последующие операции такой авторизации не требуют, кроме способа Логин и пароль с дополнительным +подтверждением. В этом случае в зависимости от настроек сервиса может +потребоваться повторная авторизация по истечению срока действия маркера +безопасности.

      + +

      Настройка подключения

      + +
      • В поле логин указывается имя учетной записи облачной подписи.
      • +
      • В поле сервер указывается, какой сервер используется для подключения. 
      • +
      • В поле сертификат указывает статус загруженного сертификата + авторизация выданного пользователю в момент регистрации провайдером + сервиса. Это поле доступно только + для способа Сертификат авторизации
      • +
      • В поле пароль необходимо ввести пароль учетной записи. 
      • +
      • Флажок сохранить позволяет сохранить пароль БД после успешной + авторизация и не запрашивать его у пользователя при последующих + подключениях к сервису.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Module.bsl new file mode 100644 index 000000000..25e36e81c --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПароля/Module.bsl @@ -0,0 +1,294 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // предусмотрено два режима: ПинКод и ПарольПользователя + РежимВвода = Параметры.РежимВвода; + МобильныйКлиент = ОбщегоНазначения.ЭтоМобильныйКлиент(); + НастройкиПользователя = Параметры.НастройкиПользователя; + ВозможноСохранять = Параметры.ВозможноСохранять; + Логин = Параметры.Логин; + СкрыватьПароль = СервисКриптографииDSSСлужебный.НужнаяВерсияПлатформы("8.3.19.0"); + + НастроитьУсловноеОформление(); + ПодготовитьФорму(Параметры); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + ПодключитьОбработчикОжидания("ОбновитьРазмерыФормы", 0.2, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(РезультатРаботы(Ложь)); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПарольНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОткрытьВидимостьЭлемента("Пароль"); + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОписаниеСледующее = Новый ОписаниеОповещения("ВыбратьСертификатПослеПолучения", ЭтотОбъект); + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(); + СервисКриптографииDSSКлиент.ЗагрузитьДанныеИзФайла(ОписаниеСледующее, ".pfx", , Истина, ПараметрыОперации); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Отмена(Команда) + + ЗакрытьФорму(РезультатРаботы(Ложь)); + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + ПодтвердитьПароль(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ОбновитьРазмерыФормы() + + Элементы.ЗаголовокФормы.Видимость = НЕ Элементы.ЗаголовокФормы.Видимость; + Элементы.ЗаголовокФормы.Видимость = НЕ Элементы.ЗаголовокФормы.Видимость; + +КонецПроцедуры + +&НаКлиенте +Функция РезультатРаботы(Подтвержден = Истина) + + ОбъекПароля = ЗакрытьДанныеПользователя(Пароль, Подтвержден); + + Результат = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Подтвержден); + Результат.Вставить("Результат", ОбъекПароля); + Результат.Вставить("Сохранить", Сохранить); + Если ДанныеСертификата <> Неопределено Тогда + Результат.Вставить("СертификатАвторизации", ДанныеСертификата); + КонецЕсли; + + Если НЕ Подтвержден Тогда + СервисКриптографииDSSСлужебныйКлиент.ПолучитьОписаниеОшибки(Результат, "ОтказПользователя"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ЗакрытьДанныеПользователя(ВведенноеЗначение, Подтвержден) + + Если Подтвержден Тогда + Результат = СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ВведенноеЗначение); + Иначе + Результат = СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(Неопределено); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ЗакрытьФорму(РезультатЗакрытия) + + ПрограммноеЗакрытие = Истина; + Закрыть(РезультатЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодтвердитьПароль() + + Если РежимВвода = "ПинКод" И НЕ ЗначениеЗаполнено(Пароль) Тогда + ТекущийЭлемент = Элементы.Пароль; + Ошибка = Истина; + ПодключитьОбработчикОжидания("ОтключитьОшибку", 2, Истина); + + Иначе + ЗакрытьФорму(РезультатРаботы(Истина)); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтключитьОшибку() + + Ошибка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВидимостьЭлемента(ИмяЭлемента) + + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; + Элементы[ИмяЭлемента].РежимПароля = Ложь; + ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; + Если СкрыватьПароль Тогда + ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПодключаемыйОтключитьВидимостьПароля() + + ЭлементФормы = Элементы["Пароль"]; + Если ЭлементФормы.РежимПароля <> Истина Тогда + ЭлементФормы.РежимПароля = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьСертификатПослеПолучения(РезультатВызова, ДополнительныеПараметры) Экспорт + + Если РезультатВызова.Выполнено Тогда + ДанныеСертификата = РезультатВызова.Результат.ДанныеФайла; + УправлениеФормой(ЭтотОбъект); + ТекущийЭлемент = Элементы.Пароль; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьФорму(ПараметрыФормы) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + Заголовок = НСтр("ru = 'Введите пароль'", КодЯзыка); + Элементы.Пароль.Заголовок = НСтр("ru = 'Пароль'", КодЯзыка); + + Если РежимВвода = "ПинКод" Тогда + ЗаголовокФормы = НСтр("ru = 'Введите пароль для доступа к файлу сертификата авторизации'", КодЯзыка); + Иначе + ЗаголовокФормы = НСтр("ru = 'Введите пароль для авторизации на сервере облачной криптографии'", КодЯзыка); + Элементы.ПредставлениеСертификата.Видимость = Ложь; + КонецЕсли; + + Если ЗначениеЗаполнено(ПараметрыФормы.ПояснениеОперации) Тогда + ЗаголовокФормы = ПараметрыФормы.ПояснениеОперации; + КонецЕсли; + + Элементы.ЗаголовокФормы.Заголовок = ЗаголовокФормы; + + КартинкаОткрыть = БиблиотекаКартинок.ВидимостьПароляОткрыто; + КартинкаЗакрыть = БиблиотекаКартинок.ВидимостьПароляЗакрыто; + + Сохранить = ВозможноСохранять = "Обязательно"; + + Элементы.Пароль.КартинкаКнопкиВыбора = КартинкаЗакрыть; + + Если НастройкиПользователя <> Неопределено Тогда + //@skip-warning + Сервер = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(НастройкиПользователя.Подключение, "Сервер", ""); + Логин = НастройкиПользователя.Логин; + КоличествоПопыток = НастройкиПользователя.НеудачныхПопыток; + КонецЕсли; + + Если КоличествоПопыток > 0 Тогда + ТекстЗаголовка = НСтр("ru = 'Количество неудачных попыток: %1'", КодЯзыка); + Элементы.Пароль.РасширеннаяПодсказка.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстЗаголовка, КоличествоПопыток); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура НастроитьУсловноеОформление() + + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("BackColor"); + ЭлементЦветаОформления.Значение = ЦветаСтиля.ЦветФонаПредупреждения; + ЭлементЦветаОформления.Использование = Истина; + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("ОтметкаНезаполненного"); + ЭлементЦветаОформления.Значение = Истина; + ЭлементЦветаОформления.Использование = Истина; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ошибка"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Истина; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Пароль"); + ЭлементОформляемогоПоля.Использование = Истина; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(УправляемаяФорма) + + ВозможноСохранять = УправляемаяФорма.ВозможноСохранять; + ЕстьСертификат = Ложь; + + ЭлементФормы = УправляемаяФорма.Элементы; + ЭлементФормы.Сохранить.Видимость = ВозможноСохранять = "Опционально" ИЛИ ВозможноСохранять = "Обязательно"; + ЭлементФормы.Сохранить.Доступность = ВозможноСохранять = "Опционально"; + ЭлементФормы.Сервер.Видимость = ЗначениеЗаполнено(УправляемаяФорма.Сервер); + ЭлементФормы.Логин.Видимость = ЗначениеЗаполнено(УправляемаяФорма.Логин); + + Если УправляемаяФорма.НастройкиПользователя <> Неопределено Тогда + ЕстьСертификат = УправляемаяФорма.НастройкиПользователя.СертификатАвторизации ИЛИ УправляемаяФорма.ДанныеСертификата <> Неопределено; + КонецЕсли; + + УправляемаяФорма.ПредставлениеСертификата = ?(ЕстьСертификат, + НСтр("ru = 'Загружен'"), + НСтр("ru = 'Загрузите файл сертификата'")); + ЭлементФормы.ПредставлениеСертификата.Доступность = НЕ УправляемаяФорма.МобильныйКлиент; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Form.form new file mode 100644 index 000000000..aa5b477a3 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Form.form @@ -0,0 +1,667 @@ + + + + <key>ru</key> + <value>Ввод пин-кода</value> + + + ГруппаЗаголовок + 1 + + ЗаголовокФормы + 32 + true + true + + true + + + ЗаголовокФормыРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ЗаголовокФормыКонтекстноеМеню + 33 + true + + Label + 2 + true + false + + Left + Bottom + + + true + true + + true + + + <key>ru</key> + <value>Заголовок</value> + + + ГруппаЗаголовокРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаВвод + 23 + + ПраваяКолонка + 27 + + СертификатПредставление + 35 + true + true + + true + + + СертификатПредставление + + true + + СертификатПредставлениеРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + СертификатПредставлениеКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + + + Opening + СертификатПредставлениеОткрытие + + true + true + true + true + true + true + Normal + + + + Пароль + 5 + true + true + + true + + + Пароль + + + ПарольРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 6 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПарольНачалоВыбора + + true + true + true + true + true + true + true + true + Normal + + + + Сохранить + 8 + true + true + + true + + + Сохранить + + true + Right + + СохранитьРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СохранитьКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Правая</value> + + + ПраваяКолонкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Ввод</value> + + + ГруппаВводРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаВсеКоманды + 43 + + СменитьПинКод + 41 + true + true + + true + + + СменитьПинКодРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Hyperlink + Form.Command.СменитьПинКод + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаКоманда + 3 + + ОК + 13 + true + true + + true + + + ОКРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 15 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + Right + + ГруппаКомандаРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Все команды</value> + + + ГруппаВсеКомандыРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 47 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + Пароль + + <key>ru</key> + <value>Пин-код</value> + + 2 + + String + + + + true + + + true + + + + ЗаголовокФормы + 3 + + String + + + + true + + + true + + + + Сохранить + + <key>ru</key> + <value>Сохранить</value> + + 4 + + Boolean + + + true + + + true + + + + Ошибка + 6 + + Boolean + + + true + + + true + + + + КартинкаОткрыть + 9 + + Picture + + + true + + + true + + + + КартинкаЗакрыть + 10 + + Picture + + + true + + + true + + + + Сертификат + 7 + + + true + + + true + + + + НастройкиПользователя + 11 + + + true + + + true + + + + СертификатПредставление + + <key>ru</key> + <value>Сертификат</value> + + 5 + + String + + + + true + + + true + + + + СкрыватьПароль + 8 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + СменитьПинКод + + <key>ru</key> + <value>Сменить пин код</value> + + 3 + + ru + Сменить пин код + + + true + + + + СменитьПинКод + + + Auto + Auto + + + Сертификат + + + + НастройкиПользователя + + + + ВозможноСохранять + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Help/ru.html new file mode 100644 index 000000000..46986315d --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Help/ru.html @@ -0,0 +1,25 @@ + + +

      Форма предназначена для ввода пин-кода доступа +к закрытому ключу сертификата при выполнении операции сервиса облачной подписи.

      + +

      В типовом сценарии запрос пин-кода осуществляется +для первой операции на сервисе облачной подписи с выбранным сертификатом и при выполнении +последующих операций не форма не отображается, т.к. пароль сохраняется на время +сеанса работы пользователя в программе.

      + +

      Ввод пин-кода доступа к закрытому ключу +сертификата

      + +
      • В поле сертификат указываются данные сертификата, с помощью которого + выполняется операция
      • +
      • В поле пин-код необходимо ввести пин-код доступа
      • +
      • Флажок сохранить позволяет сохранить введенный пароль в базе, в + случае успешного подключения к сервису. + В последующих подключениях программа сразу пытается авторизовать с + указанным сертификатом, без показа этой форм.
      • +
      • Ссылка + сменить пин-код вызывает отдельный + процесс смены пин-кода для выбранного сертификата. В случае успешной смены + новый пин-код сразу используется для доступа к операции.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Module.bsl new file mode 100644 index 000000000..8e6b19f50 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВводПинКода/Module.bsl @@ -0,0 +1,219 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НастройкиПользователя = Параметры.НастройкиПользователя; + Сертификат = Параметры.Сертификат; + Если Сертификат <> Неопределено Тогда + СертификатПредставление = Сертификат.Представление; + КонецЕсли; + СкрыватьПароль = СервисКриптографииDSSСлужебный.НужнаяВерсияПлатформы("8.3.19.0"); + + ПодготовитьФорму(Параметры); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(РезультатРаботы()); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПарольНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОткрытьВидимостьЭлемента("Пароль"); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Отмена(Команда) + + ЗакрытьФорму(РезультатРаботы()); + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + ПодтвердитьПароль(); + +КонецПроцедуры + +&НаКлиенте +Процедура СменитьПинКод(Команда) + + ОповещениеОЗавершении = ОписаниеОповещенияОЗакрытии; + ОписаниеОповещенияОЗакрытии = Неопределено; + ЗакрытьФорму(РезультатРаботы()); + СервисКриптографииDSSКлиент.СменитьПинКодСертификата(ОповещениеОЗавершении, НастройкиПользователя, Сертификат); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Функция РезультатРаботы(Подтвердил = Ложь) + + Результат = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Подтвердил); + Результат.Вставить("Результат", ЗакрытьДанныеПользователя(Пароль)); + Результат.Вставить("Сохранить", Сохранить); + + Если НЕ Подтвердил Тогда + СервисКриптографииDSSСлужебныйКлиент.ПолучитьОписаниеОшибки(Результат, "ОтказПользователя"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ЗакрытьФорму(РезультатЗакрытия) + + ПрограммноеЗакрытие = Истина; + Закрыть(РезультатЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодтвердитьПароль() + + Если ЗначениеЗаполнено(Пароль) Тогда + ЗакрытьФорму(РезультатРаботы(Истина)); + Иначе + ТекущийЭлемент = Элементы.Пароль; + Ошибка = Истина; + ПодключитьОбработчикОжидания("ОтключитьОшибку", 2, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтключитьОшибку() + + Ошибка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВидимостьЭлемента(ИмяЭлемента) + + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; + Элементы[ИмяЭлемента].РежимПароля = Ложь; + ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; + Если СкрыватьПароль Тогда + ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПодключаемыйОтключитьВидимостьПароля() + + ЭлементФормы = Элементы["Пароль"]; + Если ЭлементФормы.РежимПароля <> Истина Тогда + ТекущийТекст = ЭлементФормы.ТекстРедактирования; + ЭлементФормы.КартинкаКнопкиВыбора = КартинкаЗакрыть; + ЭлементФормы.РежимПароля = Истина; + ЭтотОбъект["Пароль"] = ТекущийТекст; + ЭлементФормы.ОбновитьТекстРедактирования(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатПредставлениеОткрытие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь); + ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор; + ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект); + + СервисКриптографииDSSКлиент.ПоказатьСертификат( + Неопределено, + НастройкиПользователя, + Сертификат, + ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Функция ЗакрытьДанныеПользователя(ВведенноеЗначение) + + ПризнакКонфиденциальности = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(НастройкиПользователя, "ПризнакКонфиденциальности", 1); + + Возврат СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ВведенноеЗначение, ПризнакКонфиденциальности); + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(КонтекстФормы) + + ЭлементФормы = КонтекстФормы.Элементы; + ЭлементФормы.Сохранить.Видимость = Истина; + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьФорму(ПараметрыФормы) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + Заголовок = НСтр("ru = 'Доступ к закрытому ключу пользователя'", КодЯзыка); + Если ПараметрыФормы.Свойство("ЗаголовокФормы") Тогда + ЗаголовокФормы = ПараметрыФормы.ЗаголовокФормы; + Иначе + ЗаголовокФормы = НСтр("ru = 'Укажите пин-код к закрытому ключу сертификата'", КодЯзыка); + КонецЕсли; + Элементы.ЗаголовокФормы.Заголовок = ЗаголовокФормы; + + КартинкаОткрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВидимостьПароляОткрыто"); + КартинкаЗакрыть = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ВидимостьПароляЗакрыто"); + + Элементы.Пароль.КартинкаКнопкиВыбора = КартинкаЗакрыть; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Form.form new file mode 100644 index 000000000..0f06e857f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Form.form @@ -0,0 +1,355 @@ + + + + <key>ru</key> + <value>Интерактивная аутентификация </value> + + + Слои + 6 + + ВводПароля + 8 + + ВебАутентификация + 3 + true + true + + true + + + ВебАутентификация + + None + + ВебАутентификацияРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + ВебАутентификацияКонтекстноеМеню + 4 + true + + HTMLDocumentField + Enter + true + Left + true + + + DocumentComplete + ВебАутентификацияДокументСформирован + + 50 + true + 10 + true + true + true + + Style.FormBackColor + + + + true + true + + true + + + <key>ru</key> + <value>Пароль</value> + + + ВводПароляРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + Пустая + 10 + + ГруппаОжидание + 15 + + ДлительнаяОперация + 12 + + <key>ru</key> + <value>Длительная операция</value> + + true + true + + true + + + ДлительнаяОперацияРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ДлительнаяОперацияКонтекстноеМеню + 13 + true + + true + true + Center + Center + + + CommonPicture.ДлительнаяОперация48 + + + + 1 + + AsFileRef + + + true + true + + true + + + <key>ru</key> + <value>Ожидание</value> + + true + true + Center + Center + + ГруппаОжиданиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + UsualGroup + + Vertical + Center + Center + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Пустая</value> + + + ПустаяРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + Page + + Vertical + Center + Center + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Слои</value> + + + СлоиРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + true + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 35 + LockOwner + true + true + Vertical + true + true + true + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + ВебАутентификация + + <key>ru</key> + <value>Веб аутентификация</value> + + 2 + + String + + + + true + + + true + + + + ТипКлиента + 3 + + String + + + + true + + + true + + + + Браузер + 4 + + String + + + + true + + + true + + + + НастройкиПользователя + 6 + + + true + + + true + + + + ОписаниеСостояния + 7 + + String + + + + true + + + true + + + + ПрограммноеЗакрытие + 9 + + Boolean + + + true + + + true + + + + НастройкиПользователя + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Help/ru.html new file mode 100644 index 000000000..2a8adf9b8 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Help/ru.html @@ -0,0 +1,24 @@ + + +

      Форма предназначена для авторизации +пользователя с помощью Web-формы.

      + +

      Авторизация с помощью формы возможна, если в +настройках учетной записи указан способ первичной авторизации Авторизация через Web-форму На этой +форме отображается поля сформированные сервисом облачной подписи. Необходимо +следовать подсказкам на форме. В типовом сценарии логин заполняется сразу и +пользователю необходимо указать пароль к этому логину. Особенности авторизации +через Web-форму, имя логина должно соответствовать +имени в учетной записи 1С, т.е. нельзя менять первоначально заполненный логин.

      + +

      Внимание: через Web-форму нельзя +авторизоваться по сертификату авторизации.
                 

      + +

      Авторизация через Web-форму Ввод пин-кода +доступа к закрытому ключу сертификата

      + +
      • В поле логин должно быть указано такое же имя, как и в 1С, иначе в + авторизации будет отказано
      • +
      • В поле пароль необходимо ввести пароль учетной записи
      • +
      • Ссылка сертификат в рамках этого сценарий не работает.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Module.bsl new file mode 100644 index 000000000..711e59c20 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВебАутентификация/Module.bsl @@ -0,0 +1,203 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НастройкиПользователя = Параметры.НастройкиПользователя; + + ЗаполнитьНачальныеНастройки(); + ВебАутентификация = СформироватьАдресФормы(); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ВебАутентификацияДокументСформирован(Элемент) + + Элементы.Слои.ТекущаяСтраница = Элементы.Пустая; + ПодключитьОбработчикОжидания("Подключаемый_СтраницаОбновлена", 0.1, Истина); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура Подключаемый_СтраницаОбновлена() + + ИщемСтроку = НастройкиПользователя.Подключение.Заглушка; + КодАвторизации = ПолучитьКодАвторизации(ИщемСтроку); + + Если ЗначениеЗаполнено(КодАвторизации) Тогда + ОбработчикОтвета = Новый ОписаниеОповещения("ПолучитьРезультатСервиса", ЭтотОбъект); + Если КодАвторизации <> Неопределено Тогда + ОписаниеОперации = ПолучитьТокенПоКодуАвторизации(КодАвторизации); + СервисКриптографииDSSСлужебныйКлиент.ОжидатьЗавершенияВыполненияВФоне(ОбработчикОтвета, ОписаниеОперации); + Иначе + ЗакрытьФорму(Неопределено); + КонецЕсли; + Элементы.Слои.ТекущаяСтраница = Элементы.Пустая; + Иначе + Элементы.Слои.ТекущаяСтраница = Элементы.ВводПароля; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьКодАвторизации(ИщемСтроку) + + Результат = ""; + + Попытка + ПоляПоиска = Новый Структура("activeElement, innerText, url", "", "", ""); + ЗаполнитьЗначенияСвойств(ПоляПоиска, Элементы.ВебАутентификация.Документ); + + Если ПоляПоиска.activeElement = Неопределено Тогда + ИсходнаяСтрока = ПоляПоиска.url; + Иначе + ЗаполнитьЗначенияСвойств(ПоляПоиска, ПоляПоиска.activeElement); + ИсходнаяСтрока = ПоляПоиска.innerText; + КонецЕсли; + + Исключение + ИсходнаяСтрока = ""; + + КонецПопытки; + + Позиция = СтрНайти(ИсходнаяСтрока, ИщемСтроку); + Если Позиция > 0 Тогда + КодАвторизации = Сред(ИсходнаяСтрока, СтрДлина(ИщемСтроку) + Позиция); + ПараметрыОтвета = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьПараметрыИзОтвета(КодАвторизации); + Результат = ПараметрыОтвета["code"]; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ПолучитьРезультатСервиса(РезультатЗапроса, ДополнительныеПараметры) Экспорт + + РезультатЗапроса = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(РезультатЗапроса); + + Если РезультатЗапроса.Выполнено Тогда + ЗакрытьФорму(РезультатЗапроса); + Иначе + ОповещениеСледующее = Новый ОписаниеОповещения("ОтобразитьОшибкуПользователюПослеПоказа", ЭтотОбъект, РезультатЗапроса); + СервисКриптографииDSSСлужебныйКлиент.ВывестиОшибку(ОповещениеСледующее, РезультатЗапроса.Ошибка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтобразитьОшибкуПользователюПослеПоказа(РезультатДиалога, РезультатВыполнения) Экспорт + + ЗакрытьФорму(РезультатВыполнения); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(РезультатАвторизации = Неопределено) + + РезультатРаботы = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + Если РезультатАвторизации <> Неопределено Тогда + РезультатРаботы = РезультатАвторизации; + Иначе + СервисКриптографииDSSСлужебныйКлиент.СформироватьОтказАутентификации(РезультатРаботы); + КонецЕсли; + ПрограммноеЗакрытие = Истина; + + Закрыть(РезультатРаботы); + +КонецПроцедуры + +&НаСервере +Функция СформироватьАдресФормы() + + Результат = ""; + Если НастройкиПользователя <> Неопределено Тогда + Результат = СервисКриптографииDSS.ПолучитьАдресВебАутентификации(НастройкиПользователя); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПолучитьТокенПоКодуАвторизации(КодАвторизации) + + ПараметрыЗадания = Новый Структура(); + ПараметрыЗадания.Вставить("НастройкиПользователя", НастройкиПользователя); + ПараметрыЗадания.Вставить("КодАвторизации", КодАвторизации); + + ОписаниеОперации = СервисКриптографииDSSСлужебный.ВыполнитьВФоне( + "СервисКриптографииDSSСлужебный.ПолучитьТокенПоКодуАвторизации", ПараметрыЗадания); + + Возврат ОписаниеОперации; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьНачальныеНастройки() + + ОбщаяИнформация = Новый СистемнаяИнформация; + ТипКлиента = "ТонкийКлиент"; + Браузер = ""; + + Если ОбщегоНазначения.ЭтоВебКлиент() Тогда + ТипКлиента = "ВебКлиент"; + ИначеЕсли ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + ТипКлиента = "МобильныйКлиент"; + КонецЕсли; + + Браузер = ОбщаяИнформация.ИнформацияПрограммыПросмотра; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(КонтекстФормы) + + Элементы = КонтекстФормы.Элементы; + + Элементы.Слои.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + Элементы.Слои.ТекущаяСтраница = Элементы.Пустая; + + Если ПустаяСтрока(КонтекстФормы.ВебАутентификация) Тогда + Элементы.ДлительнаяОперация.Вид = ВидДекорацииФормы.Надпись; + Элементы.ДлительнаяОперация.Заголовок = + НСтр("ru = 'Для пользователя не предусмотрена интерактивная авторизация'"); + Элементы.ДлительнаяОперация.Подсказка = ""; + Иначе + Элементы.ДлительнаяОперация.Подсказка = НСтр("ru = 'Ожидание ответа'"); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Form.form new file mode 100644 index 000000000..a2f23080a --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Form.form @@ -0,0 +1,202 @@ + + + + <key>ru</key> + <value>Размещение программы</value> + + + ВидПрограммыЭлектроннойПодписи + 5 + true + true + + true + + + ВидПрограммыЭлектроннойПодписи + + None + + ВидПрограммыЭлектроннойПодписиРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ВидПрограммыЭлектроннойПодписиКонтекстноеМеню + 6 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Программа электронной подписи на компьютере + + + ПрограммаЭлектроннойПодписи + + + + + ru + Учетная запись облачной подписи + + + ОблачнаяПодпись + + + Vertical + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаДобавить + 8 + true + true + + true + + + ФормаДобавитьРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Form.Command.Добавить + Auto + true + true + true + UserCmds + Auto + + + ФормаЗакрыть + 3 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 40 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + ВидПрограммыЭлектроннойПодписи + + <key>ru</key> + <value>Вид программы</value> + + 2 + + String + + + + true + + + true + + + + Добавить + + <key>ru</key> + <value>Добавить</value> + + 1 + + ru + Добавить + + + true + + + + Добавить + + + Auto + Auto + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Help/ru.html new file mode 100644 index 000000000..7cc402283 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Help/ru.html @@ -0,0 +1,14 @@ + + + + +

      Служебная предназначена выбора пользователем +программы определяющее расположения закрытых ключей

      + +

      Выбор

      + +
      • В поле программ электронной подписи указывается вариант хранения + закрытых ключей на локальном компьютере.
      • +
      • В поле учетная запись облачной подписи указывается при варианте + хранения закрытых ключей в сервисе облачной подписи. 
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Module.bsl new file mode 100644 index 000000000..1f4fa5361 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборПрограммы/Module.bsl @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ВидПрограммыЭлектроннойПодписи = "ПрограммаЭлектроннойПодписи"; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Добавить(Команда) + + РезультатВыбора = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + РезультатВыбора.Вставить("Результат", ВидПрограммыЭлектроннойПодписи); + + ЗакрытьФорму(РезультатВыбора); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыОперации = Неопределено) + + ПрограммноеЗакрытие = Истина; + Если ТипЗнч(ПараметрыОперации) <> Тип("Структура") + ИЛИ ПараметрыОперации.Количество() = 0 Тогда + ПараметрыОперации = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + КонецЕсли; + + Закрыть(ПараметрыОперации); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Form.form new file mode 100644 index 000000000..e0437a2a5 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Form.form @@ -0,0 +1,275 @@ + + + + <key>ru</key> + <value>Выбор настроек сервиса</value> + + + АдресСервисаЦентраИдентификации + 1 + true + true + + true + + + АдресСервисаЦентраИдентификации + + + АдресСервисаЦентраИдентификацииРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + АдресСервисаЦентраИдентификацииКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + АдресСервисаЭлектроннойПодписи + 4 + true + true + + true + + + АдресСервисаЭлектроннойПодписи + + + АдресСервисаЭлектроннойПодписиРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + АдресСервисаЭлектроннойПодписиКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 7 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + 3 + true + true + UserCmds + Auto + + + ФормаОтмена + 9 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + АдресСервисаЦентраИдентификации + + <key>ru</key> + <value>Адрес сервиса центра идентификации</value> + + 2 + + String + + + + true + + + true + + + + АдресСервисаЭлектроннойПодписи + + <key>ru</key> + <value>Адрес сервиса электронной подписи</value> + + 3 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + ОписаниеСервисаОбнаружения + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Help/ru.html new file mode 100644 index 000000000..3519e5580 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Help/ru.html @@ -0,0 +1,18 @@ + + + + +

      Предназначена для выбора настроек сервиса при +первоначальной настройке подключения к сервису.

      + +

      Позволяет избежать ручного ввода адресов +подключения к серверу облачной подписи. Этот функционал также должен +поддерживаться со стороны сервиса облачной подписи.

      + +

      Настройка подключения

      + +
      • В поле адрес сервиса идентификации содержит список возможных адресов + подключения к ЦИ.
      • +
      • В поле адрес сервиса электронной подписи содержит список возможных + адресов СЭП. 
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Module.bsl new file mode 100644 index 000000000..0819811c9 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборСервисаИзОписания/Module.bsl @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ОписаниеСервисаОбнаружения = Параметры.ОписаниеСервисаОбнаружения; + Если ОписаниеСервисаОбнаружения <> Неопределено Тогда + ЗаполнитьСписки(ОписаниеСервисаОбнаружения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Отмена(Команда) + + ЗакрытьФорму(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + Результат = Новый Структура; + Результат.Вставить("АдресЦИ", АдресСервисаЦентраИдентификации); + Результат.Вставить("АдресСЭП", АдресСервисаЭлектроннойПодписи); + + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ПараметрыЗакрытия.Вставить("Результат", Результат); + + ЗакрытьФорму(ПараметрыЗакрытия); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +// Разбор массива описаний +// +// Параметры: +// ОписаниеСервисаОбнаружения - Структура: +// * СервисыЦИ - Массив из Структура: +// ** АдресСервиса - Строка +// ** Заголовок - Строка +// * СервисыСЭП - Массив из Структура: +// ** АдресСервиса - Строка +// ** Заголовок - Строка +// +&НаСервере +Процедура ЗаполнитьСписки(ОписаниеСервисаОбнаружения) + + ТекущийСписок = Элементы.АдресСервисаЭлектроннойПодписи.СписокВыбора; + ТекущийСписок.Очистить(); + Для каждого СтрокаКлюча Из ОписаниеСервисаОбнаружения.СервисыСЭП Цикл + ТекущийСписок.Добавить(СтрокаКлюча.АдресСервиса, СтрокаКлюча.Заголовок); + КонецЦикла; + + ТекущийСписок = Элементы.АдресСервисаЦентраИдентификации.СписокВыбора; + ТекущийСписок.Очистить(); + Для каждого СтрокаКлюча Из ОписаниеСервисаОбнаружения.СервисыЦИ Цикл + ТекущийСписок.Добавить(СтрокаКлюча.АдресСервиса, СтрокаКлюча.Заголовок); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Form.form new file mode 100644 index 000000000..1965ebab5 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Form.form @@ -0,0 +1,422 @@ + + + + <key>ru</key> + <value>Выберите учетную запись облачной криптографии</value> + + + Список + 47 + + <key>ru</key> + <value>Список учетных записей</value> + + true + true + + true + + + Список + + None + + СписокНаименование + 69 + true + true + + true + + + Список.Наименование + + + СписокНаименованиеРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + СписокНаименованиеКонтекстноеМеню + 70 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКомментарий + 63 + true + true + + true + + + Список.Комментарий + + + СписокКомментарийРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + СписокКомментарийКонтекстноеМеню + 64 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Авторизован + 72 + + <key>ru</key> + <value>Авторизован</value> + + true + true + + + Список.Авторизован + + + АвторизованРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + АвторизованКонтекстноеМеню + 73 + true + + CheckBoxField + Enter + true + Left + true + + + + СписокСсылка + 66 + true + true + + + Список.Ссылка + + + СписокСсылкаРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + СписокСсылкаКонтекстноеМеню + 67 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 49 + Left + + + Selection + СписокУчетныхЗаписейВыбор + + + СписокСтрокаПоиска + 51 + + СписокСтрокаПоискаРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 52 + true + + Список + + true + + + + СписокСостояниеПросмотра + 54 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 55 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 57 + + СписокУправлениеПоискомРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 58 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 48 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow + Row +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
      + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + + + + Список + + <key>ru</key> + <value>Список</value> + + 3 + + DynamicList + + + true + + + true + + + Список.Авторизован + + + Список.Ссылка + +
      true
      + + ВЫБРАТЬ РАЗРЕШЕННЫЕ + УчетныеЗаписиDSS.Наименование КАК Наименование, + УчетныеЗаписиDSS.Комментарий КАК Комментарий, + УчетныеЗаписиDSS.Ссылка КАК Ссылка, + ВЫБОР + КОГДА УчетныеЗаписиDSS.Ссылка В (&СписокАктивных) + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ КАК Авторизован +ИЗ + Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS +ГДЕ + (&ЕстьОтбор = ЛОЖЬ + ИЛИ УчетныеЗаписиDSS.Ссылка В (&СписокУчетныхЗаписей)) + true + true + true + true + +
      + + СписокУчетныхЗаписей + 2 + + ValueList + + + true + + + true + + + + + + + ДобавитьУчетнуюЗапись + + <key>ru</key> + <value>Добавить учетную запись</value> + + 1 + + ru + Добавить учетную запись + + + true + + Auto + Auto + + + ПараметрыОперации + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Help/ru.html new file mode 100644 index 000000000..73be412d5 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Help/ru.html @@ -0,0 +1,29 @@ + + + + +

      Предназначен для выбора текущей учетной записи для работы с электронной облачной подписью.

      + +

      В списке выводится:

      + +
      • Наименование - полное наименование учетной + записи; 
      • +
      • Комментарий – дополнительное + описание учетной записи; 
      • +
      • Авторизован – текущий статус авторизации + учетной записи.
      • +

       

      + +

      Если уже происходила авторизация с помощью +учетной записи, то такая запись выделяется цветом.

      + +

      Выбор учетной записи

      + +
      • Выделите нужную строку с + учетной записью, нажмите Выбрать. Также можно + воспользоваться двойным щелчком мыши.
      • +

      Просмотр данных об учетной записи

      + +
      • С помощью команды Изменить контекстного + меню по правой кнопке мыши или меню Еще можно открыть данные об учетной записи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Module.bsl new file mode 100644 index 000000000..7dda50039 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборТекущейУчетнойЗаписи/Module.bsl @@ -0,0 +1,153 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + МассивУчетныхЗаписей = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Параметры.ПараметрыОперации, "СписокУчетныхЗаписей"); + + Если МассивУчетныхЗаписей <> Неопределено Тогда + СписокУчетныхЗаписей.ЗагрузитьЗначения(МассивУчетныхЗаписей); + Иначе + ВсеУчетныеЗаписи = СервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи(); + Для Каждого СтрокаТаблицы Из ВсеУчетныеЗаписи Цикл + СписокУчетныхЗаписей.Добавить(СтрокаТаблицы.Ссылка); + КонецЦикла; + КонецЕсли; + + НастроитьУсловноеОформление(); + ЗаполнитьСписокУчетныхЗаписей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(Неопределено); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок + +&НаКлиенте +Процедура СписокУчетныхЗаписейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ТекущаяСтрока = Элементы.Список.ТекущиеДанные; + Если ТекущаяСтрока <> Неопределено Тогда + ВыборИзСписка(ТекущаяСтрока.Ссылка); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборИзСписка(ТекущаяСсылка) + + НашлиСсылку = ПолучитьТекущегоПользователя(ТекущаяСсылка); + ПараметрыЗакрытия = Неопределено; + Если НашлиСсылку <> Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + ПараметрыЗакрытия.Вставить("Результат", НашлиСсылку); + КонецЕсли; + ЗакрытьФорму(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСписокУчетныхЗаписей() + + ДанныеСеанса = ПолучитьДанныеСеанса(); + ВсеПользователи = ДанныеСеанса.Пользователи; + + СписокАктивных = Новый Массив; + + Для каждого СтрокаКлюча Из ВсеПользователи Цикл + Если СтрокаКлюча.Значение.Политика.Заполнено Тогда + СписокАктивных.Добавить(СтрокаКлюча.Ключ); + КонецЕсли; + КонецЦикла; + + Список.Параметры.УстановитьЗначениеПараметра("СписокАктивных", СписокАктивных); + Список.Параметры.УстановитьЗначениеПараметра("СписокУчетныхЗаписей", СписокУчетныхЗаписей.ВыгрузитьЗначения()); + Список.Параметры.УстановитьЗначениеПараметра("ЕстьОтбор", СписокУчетныхЗаписей.Количество() <> 0); + +КонецПроцедуры + +&НаСервере +Процедура НастроитьУсловноеОформление() + + ЭлементУсловногоОформления = Список.УсловноеОформление.Элементы.Добавить(); + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("BackColor"); + ЭлементЦветаОформления.Значение = ЦветаСтиля.ДобавленныйРеквизитФон; + ЭлементЦветаОформления.Использование = Ложь; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Авторизован"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Истина; + ЭлементОтбораДанных.Использование = Ложь; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьДанныеСеанса() + + Результат = СервисКриптографииDSSСлужебный.ПолучитьКонтейнерНастроек(); + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьТекущегоПользователя(УчетнаяЗапись) + + Результат = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(УчетнаяЗапись); + Возврат Результат; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Form.form new file mode 100644 index 000000000..78c911a2f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Form.form @@ -0,0 +1,407 @@ + + + + <key>ru</key> + <value>Выберите учетную запись облачной криптографии</value> + + + Список + 1 + true + true + + true + + + Список + + None + + Владелец + 17 + true + true + + true + + + Список.Owner + + + ВладелецРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 18 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Логин + 20 + true + true + + true + + + Список.Логин + + + ЛогинРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ЛогинКонтекстноеМеню + 21 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПервичнаяАутентификация + 23 + + <key>ru</key> + <value>Первичная авторизация</value> + + true + true + + true + + + Список.ПервичнаяАутентификация + + + ПервичнаяАутентификацияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ПервичнаяАутентификацияКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Наименование + 14 + true + true + + true + + + Список.Description + + + НаименованиеРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Комментарий + 26 + true + true + + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 5 + + СписокСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 6 + true + + Список + + true + + + + СписокСостояниеПросмотра + 8 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 11 + + СписокУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + true + MultiRow +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
      + None + false + + ФормаКоманднаяПанель + -1 + Left + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + + + + Список + + <key>ru</key> + <value>Список</value> + + 2 + + DynamicList + + + true + + + true + +
      true
      + + Catalog.УчетныеЗаписиDSS + true + true + true + true + +
      + + ДобавитьУчетнуюЗапись + + <key>ru</key> + <value>Добавить учетную запись</value> + + 1 + + ru + Добавить учетную запись + + + true + + Auto + Auto + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Help/ru.html new file mode 100644 index 000000000..43ef498ee --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборУчетнойЗаписи/Help/ru.html @@ -0,0 +1,33 @@ + + + + +

      Предназначен для выбора элемента справочника +учетной записи облачной подписи.

      + +

      В списке выводится:

      + +
      • Сервер – данные о сервере облачной + подписи; 
      • +
      • Логин – имя учетной записи, + под которым будет происходить авторизация; 
      • +
      • Первичная авторизация – выбранный способ авторизации + в сервисе;
      • +
      • Наименование  – наименование учетной записи в БД;
      • +
      • Комментарий  – дополнительное описание учетной записи;
      • +

      Выбор учетной записи

      + +
      • Выделите нужную строку с + учетной записью, нажмите Выбрать. Также можно + воспользоваться двойным щелчком мыши.
      • +

      Добавление учетной записи

      + +
        +
          +
        • Нажмите Создать.
        • +

      Просмотр данных об учетной записи

      + +
      • С помощью команды Изменить контекстного + меню по правой кнопке мыши или меню Еще можно + открыть данные об учетной записи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Form.form new file mode 100644 index 000000000..c51aedd7c --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Form.form @@ -0,0 +1,368 @@ + + + + Список + 1 + true + true + + true + + + Список + + None + + Наименование + 17 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 18 + true + + LabelField + Enter + true + Left + true + + true + true + + + + АдресСервера + 14 + true + true + + true + + + Список.АдресСервера + + + АдресСервераРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + АдресСервераКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Комментарий + 26 + true + true + + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + 1 + true + + + + Ссылка + 23 + true + true + + + Список.Ссылка + + + СсылкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 3 + Left + true + + + Selection + СписокВыбор + + + СписокСтрокаПоиска + 5 + + СписокСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 6 + true + + Список + + true + + + + СписокСостояниеПросмотра + 8 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 11 + + СписокУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
      + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + ОбъектОбработки + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + + + + Список + + <key>ru</key> + <value>Список</value> + + 2 + + DynamicList + + + true + + + true + + + Список.Ссылка + +
      true
      + + ВЫБРАТЬ РАЗРЕШЕННЫЕ + ЭкземплярыСервераDSS.Ссылка КАК Ссылка, + ЭкземплярыСервераDSS.Наименование КАК Наименование, + ЭкземплярыСервераDSS.АдресСервера КАК АдресСервера, + ЭкземплярыСервераDSS.Комментарий КАК Комментарий +ИЗ + Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS +ГДЕ + ЭкземплярыСервераDSS.Используется + Catalog.ЭкземплярыСервераDSS + true + true + true + true + true + +
      + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Help/ru.html new file mode 100644 index 000000000..41b2c2d60 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Help/ru.html @@ -0,0 +1,23 @@ + + +

      Предназначена для выбора из списка всех +зарегистрированных в БД серверов облачной подписи.

      + +

      В списке выводится:

      + +
      • Наименование - полное наименование сервера; 
      • +
      • Адрес сервера – web-адрес подключения + к серверу; 
      • +
      • Комментарий – дополнительная информация о + сервере.
      • +

      Выбор сервера

      + +
      • Выделите нужный сертификат, + нажмите Выбрать. Также можно + воспользоваться двойным щелчком мыши.
      • +

      Просмотр данных о сервере

      + +
      • С помощью команды Изменить контекстного + меню по правой кнопке мыши или меню Еще можно + открыть данные о сервере облачной подписи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Module.bsl new file mode 100644 index 000000000..804ee7eff --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВыборЭкземпляровСервераDSS/Module.bsl @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ПараметрыЗакрытия.Вставить("Результат", ВыбраннаяСтрока); + ЗакрытьФорму(ПараметрыЗакрытия); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Если Параметры.РежимВыбора + И ПараметрыЗакрытия.Выполнено Тогда + ОповеститьОВыборе(ПараметрыЗакрытия.Результат); + Иначе + Закрыть(ПараметрыЗакрытия); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Form.form new file mode 100644 index 000000000..b4c71910f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Form.form @@ -0,0 +1,674 @@ + + + + <key>ru</key> + <value>Ошибка при работе "Облачной криптографии"</value> + + + ГруппаОтобразить + 1 + + ГруппаЛевая + 10 + + ДекорацияКартинка + 14 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 15 + true + + 7 + true + 3 + + AsFileRef + + + true + true + + true + + + <key>ru</key> + <value>Левая</value> + + + ГруппаЛеваяРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаРежимы + 27 + + ГруппаОшибка + 12 + + КодОшибки + 17 + true + true + + true + + + КодОшибки + + + КодОшибкиРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + КодОшибкиКонтекстноеМеню + 18 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СодержаниеОшибки + 36 + true + true + + true + + + СодержаниеОшибки + + true + None + + СодержаниеОшибкиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + СодержаниеОшибкиКонтекстноеМеню + 37 + true + + InputField + true + Enter + true + Left + true + + 3 + true + true + true + true + true + true + + Style.FormBackColor + + Normal + + + true + + true + + + <key>ru</key> + <value>Правая</value> + + + ГруппаОшибкаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаИнформация + 29 + + ДекорацияИнформация + 31 + true + true + + true + + + ДекорацияИнформацияРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ДекорацияИнформацияКонтекстноеМеню + 32 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Информация</value> + + + ГруппаИнформацияРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Режимы</value> + + + ГруппаРежимыРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основная</value> + + + ГруппаОтобразитьРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаКоманда + 8 + + ЖурналОшибок + 23 + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + true + true + + true + + true + + ЖурналОшибокРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + Hyperlink + Form.Command.ЖурналОшибок + Normal + Auto + true + UserCmds + Auto + + + ГруппаЗакрыть + 25 + + Закрыть + 6 + true + true + + true + + true + false + + ЗакрытьРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.Command.Закрыть + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопка закрыть</value> + + + ГруппаЗакрытьРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + CommandBar + + Right + + + + ГруппаВопросы + 34 + true + true + + true + + + <key>ru</key> + <value>Вопросы</value> + + + ГруппаВопросыРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + CommandBar + + Center + + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандаРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 60 + LockOwner + true + Vertical + true + true + auto + true + DontShow + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + ПараметрыОперации + 3 + + + true + + + true + + + + НастройкиПользователя + 4 + + + true + + + true + + + + КодОшибки + + <key>ru</key> + <value>Код ошибки</value> + + 6 + + String + + + + true + + + true + + + + ТаймАут + 2 + + Number + + 10 + + + + true + + + true + + + + РежимОтображения + 5 + + String + + + + true + + + true + + + + СодержаниеОшибки + + <key>ru</key> + <value>Содержание ошибки</value> + + 7 + + String + + + + true + + + true + + + + Закрыть + + <key>ru</key> + <value>Закрыть</value> + + 1 + + ru + Закрыть + + + true + + + + ОК + + + Auto + Auto + + + ЖурналОшибок + + <key>ru</key> + <value>Журнал ошибок</value> + + 2 + + ru + Журнал ошибок + + + true + + + + ЖурналОшибок + + + Auto + Auto + + + ТекстСообщения + + FormattedString + String + + + + + ПараметрыОперации + + + + ЭтоКодОшибки + + Boolean + + + + РежимОтображения + + String + + + + + Заголовок + + String + + + + + ТаймАут + + Number + + 10 + + + + + СписокКоманд + + ValueList + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Help/ru.html new file mode 100644 index 000000000..b4f061437 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Help/ru.html @@ -0,0 +1,13 @@ + + +

      Отображает описание ошибки возникшей при +работе с сервисом облачной подписи.

      + +

      Информация об ошибке

      + +
      • В поле код ошибки указывается числовой код ошибки для ее + идентификации.
      • +
      • В поле описание указывается описание ошибки. 
      • +
      • Ссылка Перейти в журнал регистрации открывает журнал регистрации с + отбором по ошибками возникших при работе сервиса облачной подписи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Module.bsl new file mode 100644 index 000000000..2539f822d --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ВывестиИнформацию/Module.bsl @@ -0,0 +1,243 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТаймАут = Параметры.ТаймАут; + РежимОтображения = Параметры.РежимОтображения; + ВходнойТекст = Параметры.ТекстСообщения; + ПараметрыОперации = Параметры.ПараметрыОперации; + Заголовок = Параметры.Заголовок; + + Элементы.ГруппаОшибка.Видимость = Ложь; + Если РежимОтображения = "Ошибка" Тогда + ПодготовитьФормуОшибки(ВходнойТекст); + + ИначеЕсли РежимОтображения = "Информация" Тогда + ПодготовитьФормуИнформации(ВходнойТекст); + + ИначеЕсли РежимОтображения = "Вопрос" Тогда + ПодготовитьФормуВопроса(ВходнойТекст); + + КонецЕсли; + + КлючСохраненияПоложенияОкна = РежимОтображения; + + Элементы.ЖурналОшибок.Видимость = РежимОтображения = "Ошибка"; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + ПодключитьОбработчикОжидания("Подключаемый_ИзменитьРазмерыФормы", 0.2, Истина); + + Если ЗначениеЗаполнено(ТаймАут) Тогда + ПодключитьОбработчикОжидания("Подключаемый_ЗакрытьФорму", ТаймАут, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ЗакрытьФорму(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЖурналОшибок(Элемент) + + Отбор = Новый Структура; + Отбор.Вставить("СобытиеЖурналаРегистрации", СервисКриптографииDSSКлиентСервер.ИмяСобытияЖурналаРегистрации()); + Отбор.Вставить("Уровень", "Ошибка"); + ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(Отбор, ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ПодготовитьФормуИнформации(ВходнойТекст) + + Элементы.ГруппаРежимы.ТекущаяСтраница = Элементы.ГруппаИнформация; + Элементы.ДекорацияИнформация.Заголовок = ВходнойТекст; + УстановитьКартинку("ДиалогИнформация"); + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьФормуОшибки(ВходнойТекст) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + Элементы.ГруппаОшибка.Видимость = Истина; + Элементы.ГруппаРежимы.ТекущаяСтраница = Элементы.ГруппаОшибка; + Если Параметры.ЭтоКодОшибки Тогда + ВходнойТекст = СервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, ВходнойТекст); + КонецЕсли; + + КодОшибки = СервисКриптографииDSSКлиентСервер.ПолучитьКодОшибки(ВходнойТекст); + + Если ЗначениеЗаполнено(КодОшибки) Тогда + ТекстСообщения = Сред(ВходнойТекст, 8); + Иначе + ТекстСообщения = ВходнойТекст; + КонецЕсли; + + СодержаниеОшибки = СокрЛП(ТекстСообщения); + + Если ПустаяСтрока(КодОшибки) Тогда + Элементы.КодОшибки.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КодОшибки = НСтр("ru = 'Обнаружена ошибка'"); + КонецЕсли; + + Заголовок = НСтр("ru = 'Ошибка при работе ""Облачной криптографии""'", КодЯзыка); + УстановитьКартинку("ДиалогСтоп"); + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьФормуВопроса(ВходнойТекст) + + Элементы.ГруппаРежимы.ТекущаяСтраница = Элементы.ГруппаИнформация; + Заголовок = Параметры.Заголовок; + Элементы.ДекорацияИнформация.Заголовок = ВходнойТекст; + Элементы.ГруппаЗакрыть.Видимость = Ложь; + УстановитьКартинку("ДиалогВопрос"); + + ПервыйЭлемент = Неопределено; + + Для Счетчик = 1 По Параметры.СписокКоманд.Количество() Цикл + СтрокаКоманды = Параметры.СписокКоманд[Счетчик - 1]; + ИмяКоманды = СтрокаКоманды.Значение; + + НоваяКоманда = Команды.Добавить(ИмяКоманды); + НоваяКоманда.Действие = "Подключаемый_НажатиеКнопки"; + НоваяКоманда.Заголовок = СтрокаКоманды.Представление; + Если ЗначениеЗаполнено(СтрокаКоманды.Картинка) Тогда + НоваяКоманда.Картинка = СтрокаКоманды.Картинка; + КонецЕсли; + + НовыйЭлемент = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элементы.ГруппаВопросы); + НовыйЭлемент.ИмяКоманды = ИмяКоманды; + + Если ПервыйЭлемент = Неопределено ИЛИ СтрокаКоманды.Пометка Тогда + ПервыйЭлемент = НовыйЭлемент; + КонецЕсли; + + КонецЦикла; + + Если ПервыйЭлемент <> Неопределено Тогда + ПервыйЭлемент.КнопкаПоУмолчанию = Истина; + КонецЕсли; + + ОтображатьКнопкуЗакрытия = Ложь; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьКартинку(ИмяКартинки) + + НашлиКартинку = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы(ИмяКартинки); + + Если НашлиКартинку.Вид <> ВидКартинки.Пустая Тогда + Элементы.ДекорацияКартинка.Картинка = НашлиКартинку; + Иначе + Элементы.ДекорацияКартинка.Картинка = Новый Картинка; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ИзменитьРазмерыФормы() + + Элементы.ГруппаЛевая.Видимость = НЕ Элементы.ГруппаЛевая.Видимость; + Элементы.ГруппаЛевая.Видимость = НЕ Элементы.ГруппаЛевая.Видимость; + + Если РежимОтображения <> "Вопрос" Тогда + ТекущийЭлемент = Элементы.Закрыть; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Элементы.ДекорацияКартинка.Картинка) Тогда + Элементы.ДекорацияКартинка.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Выполняет событие нажатия кнопки +// +// Параметры: +// Команда - КомандаФормы +// +//@skip-warning +// +&НаКлиенте +Процедура Подключаемый_НажатиеКнопки(Команда) + + ЗакрытьФорму(Команда.Имя); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ЗакрытьФорму() + + ЗакрытьФорму("ТаймАут"); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(РезультатВыбора = "") + + ПрограммноеЗакрытие = Истина; + Если РежимОтображения = "Вопрос" Тогда + ПараметрыОперации = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + ПараметрыОперации.Вставить("Результат", РезультатВыбора); + + ИначеЕсли ТипЗнч(ПараметрыОперации) <> Тип("Структура") + ИЛИ ПараметрыОперации.Количество() = 0 Тогда + ПараметрыОперации = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + + КонецЕсли; + + Закрыть(ПараметрыОперации); + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Form.form new file mode 100644 index 000000000..9f7f6ac96 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Form.form @@ -0,0 +1,2474 @@ + + + + <key>ru</key> + <value>Заявление на изменение реквизитов подключения</value> + + + ДекорацияЛогина + 65 + + <key>ru</key> + <value>Декорация логина</value> + + true + true + + true + + + ДекорацияЛогинаРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + ДекорацияЛогинаКонтекстноеМеню + 66 + true + + Label + true + true + + Left + + + + Раздел1 + 90 + + ЗаголовокРаздела1 + 92 + + КартинкаРаздела1 + 94 + true + true + + true + + + Раздел1 + + None + + КартинкаРаздела1РасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + КартинкаРаздела1КонтекстноеМеню + 95 + true + + PictureField + Enter + true + Left + true + + + CommonPicture.ЭтапыПодтверждения + + + 1 + + AsFileRef + + + + ДекорацияРаздела1 + 97 + + <key>ru</key> + <value>Забыли или нужно сменить пароль</value> + + true + true + + true + + + ДекорацияРаздела1РасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + ДекорацияРаздела1КонтекстноеМеню + 98 + true + + Label + + Style.NormalTextFont + 12.0 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + ЗаголовокРаздела1РасширеннаяПодсказка + 93 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + Auto + true + true + Auto + Auto + + + + ГруппаСменаПароля + 43 + + ДекорацияОтступ1 + 100 + true + true + + true + + + ДекорацияОтступ1РасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ДекорацияОтступ1КонтекстноеМеню + 101 + true + + 3 + 1 + false + false + + AsFileRef + + + + Режим_СменаПароля + 1 + true + true + + true + + + Режим_СменаПароля + + true + Right + Button + + OnChange + Режим_СменаПароляПриИзменении + + + Режим_СменаПароляРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>Пароль позволяет авторизоваться на сервере облачной подписи для выполнения различных операций, таких как формирование ЭП, расшифрование, шифрование и прочие. + +При обработке заявления с выбранной настройкой произойдет следующее +1.На сервере облачной подписи будет установлен новый пароль для учетной записи. Старый пароль перестанет действовать. +2. В момент обновления статуса одобренного заявления будет отображена форма с новым паролем. Запомните или сохраните его.</value> + + Label + true + true + + Left + + + + Режим_СменаПароляКонтекстноеМеню + 2 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Смена пароля</value> + + + ГруппаСменаПароляРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + Раздел1РасширеннаяПодсказка + 91 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Раздел2 + 103 + + ЗаголовокРаздела2 + 105 + + КартинкаРаздела2 + 107 + true + true + + true + + + Раздел2 + + None + + КартинкаРаздела2РасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + КартинкаРаздела2КонтекстноеМеню + 108 + true + + PictureField + Enter + true + Left + true + + + CommonPicture.ЭтапыПодтверждения + + + 1 + + AsFileRef + + + + ДекорацияРаздела2 + 110 + + <key>ru</key> + <value>Закончился срок действия ключа или сменилось мобильное устройство</value> + + true + true + + true + + + ДекорацияРаздела2РасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + ДекорацияРаздела2КонтекстноеМеню + 111 + true + + Label + + Style.NormalTextFont + 12.0 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + ЗаголовокРаздела2РасширеннаяПодсказка + 106 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + Auto + true + true + Auto + Auto + + + + ГруппаСменаКлюча + 45 + + ДекорацияОтступ2 + 113 + true + true + + true + + + ДекорацияОтступ2РасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ДекорацияОтступ2КонтекстноеМеню + 114 + true + + 3 + 1 + false + false + + AsFileRef + + + + Режим_СменаКлючаМобильногоПриложения + 4 + true + true + + true + + + Режим_СменаКлючаМобильногоПриложения + + true + Right + Button + + OnChange + Режим_СменаКлючаМобильногоПриложенияПриИзменении + + + Режим_СменаКлючаМобильногоПриложенияРасширеннаяПодсказка + 6 + + <key>ru</key> + <value>QR-код ключа активации используется для привязки мобильного приложения myDSS к серверу облачной подписи. +После привязки мобильного приложения появляется возможность подтверждать операции с формированием электронной подписи. + +При обработке заявления с выбранной настройкой произойдет следующее +1. На сервере облачной подписи будет сформирован новый QR-код, содержащий ключ активации мобильного приложения. Обратите внимание, что старый QR код перестанет действовать. +2. В момент обновления статуса одобренного заявления будет отображена форма с новым QR-кодом.Отсканируйте его в мобильном приложении myDSS или сохраните его. +3. Также на мобильный телефон должен прийти код активации этого ключа, введите его после сканирования QR-кода.</value> + + Label + true + true + + Left + + + + Режим_СменаКлючаМобильногоПриложенияКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Смена ключа</value> + + + ГруппаСменаКлючаРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + Раздел2РасширеннаяПодсказка + 104 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Раздел3 + 116 + + ЗаголовокРаздела3 + 118 + + КартинкаРаздела3 + 120 + true + true + + true + + + Раздел3 + + None + + КартинкаРаздела3РасширеннаяПодсказка + 122 + Label + true + true + + Left + + + + КартинкаРаздела3КонтекстноеМеню + 121 + true + + PictureField + Enter + true + Left + true + + + CommonPicture.ЭтапыПодтверждения + + + 1 + + AsFileRef + + + + ДекорацияРаздела3 + 123 + + <key>ru</key> + <value>Нужно добавить дополнительное мобильное устройство</value> + + true + true + + true + + + ДекорацияРаздела3РасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + ДекорацияРаздела3КонтекстноеМеню + 124 + true + + Label + + Style.NormalTextFont + 12.0 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + ЗаголовокРаздела3РасширеннаяПодсказка + 119 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + Auto + true + true + Auto + Auto + + + + ГруппаПовторКлюча + 51 + + ДекорацияОтступ3 + 126 + true + true + + true + + + ДекорацияОтступ3РасширеннаяПодсказка + 128 + Label + true + true + + Left + + + + ДекорацияОтступ3КонтекстноеМеню + 127 + true + + 3 + 1 + false + false + + AsFileRef + + + + Режим_ПовторнаяОтправкаКлючМобильногоПриложения + 7 + true + true + + true + + + Режим_ПовторнаяОтправкаКлючМобильногоПриложения + + true + Right + Button + + OnChange + Режим_ПовторнаяОтправкаКлючМобильногоПриложенияПриИзменении + + + Режим_ПовторнаяОтправкаКлючМобильногоПриложенияРасширеннаяПодсказка + 9 + + <key>ru</key> + <value>Для добавления дополнительного мобильного устройства можно отсканировать действующий QR-код на новом устройстве. Если действующий QR-код ключа активации утерян и мобильное приложение активировано, то можно повторно его для дополнительного устройства. + +В момент обновления статуса одобренного заявления будет отображена форма с QR-кодом. +Отсканируйте его в мобильном приложении myDSS или сохраните его. Также необходимо ввести код активации ранее отправленный на телефон. +</value> + + Label + true + true + + Left + + + + Режим_ПовторнаяОтправкаКлючМобильногоПриложенияКонтекстноеМеню + 8 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Повтор ключа</value> + + + ГруппаПовторКлючаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаПовторКодаАвторизации + 47 + + ДекорацияОтступ4 + 129 + true + true + + true + + + ДекорацияОтступ4РасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ДекорацияОтступ4КонтекстноеМеню + 130 + true + + 3 + 1 + false + false + + AsFileRef + + + + Режим_ПовторнаяОтправкаКодаАктивации + 10 + true + true + + true + + + Режим_ПовторнаяОтправкаКодаАктивации + + true + Right + Button + + OnChange + Режим_ПовторнаяОтправкаКодаАктивацииПриИзменении + + + Режим_ПовторнаяОтправкаКодаАктивацииРасширеннаяПодсказка + 12 + + <key>ru</key> + <value>Срок действия кода активации, отправляемого на мобильный телефон ограничен. +Чтобы получить новый код можно использовать данную настройку. +</value> + + Label + true + true + + Left + + + + Режим_ПовторнаяОтправкаКодаАктивацииКонтекстноеМеню + 11 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Повтор кода авторизации</value> + + + ГруппаПовторКодаАвторизацииРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + Раздел3РасширеннаяПодсказка + 117 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Раздел4 + 132 + + ЗаголовокРаздела4 + 134 + + КартинкаРаздела4 + 136 + true + true + + true + + + Раздел4 + + None + + КартинкаРаздела4РасширеннаяПодсказка + 138 + Label + true + true + + Left + + + + КартинкаРаздела4КонтекстноеМеню + 137 + true + + PictureField + Enter + true + Left + true + + + CommonPicture.ЭтапыПодтверждения + + + 1 + + AsFileRef + + + + ДекорацияРаздела4 + 139 + + <key>ru</key> + <value>Изменить контактные сведения</value> + + true + true + + true + + + ДекорацияРаздела4РасширеннаяПодсказка + 141 + Label + true + true + + Left + + + + ДекорацияРаздела4КонтекстноеМеню + 140 + true + + Label + + Style.NormalTextFont + 12.0 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + ЗаголовокРаздела4РасширеннаяПодсказка + 135 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Center + Auto + true + true + Auto + Auto + + + + ГруппаКонтакты + 16 + + ГруппаКонтактыПерваяСтрока + 33 + + ДекорацияОтступ5 + 142 + true + true + + true + + + ДекорацияОтступ5РасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + ДекорацияОтступ5КонтекстноеМеню + 143 + true + + 3 + 1 + false + false + + AsFileRef + + + + ГруппаСменаНомераТелефона + 148 + + ГруппаВводаРежима + 155 + + Режим_СменаКонтактов + 13 + true + true + + true + + + Режим_СменаКонтактов + + true + Right + Button + + OnChange + Режим_СменаКонтактовПриИзменении + + + Режим_СменаКонтактовРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + Режим_СменаКонтактовКонтекстноеМеню + 14 + true + + CheckBoxField + Top + Enter + true + Left + true + + + + ДекорацияОтступ6 + 157 + true + true + + true + + + ДекорацияОтступ6РасширеннаяПодсказка + 159 + Label + true + true + + Left + + + + ДекорацияОтступ6КонтекстноеМеню + 158 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Ввода режима</value> + + Center + + ГруппаВводаРежимаРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаВводНомераТелефона + 153 + VeryLow + + Телефон + 23 + true + true + + true + + + Телефон + + true + None + Button + + OnChange + ТелефонПриИзменении + + + ТелефонРасширеннаяПодсказка + 25 + + <key>ru</key> + <value>Номер мобильного телефона предназначен для получения кода активации мобильного приложения и для одноразовых паролей.</value> + + Label + true + true + + Left + + + + ТелефонКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + + StartChoice + ТелефонНачалоВыбора + + + ChoiceProcessing + ТелефонОбработкаВыбора + + 20 + true + true + true + +7 (999) 999-99-99 + true + true + true + Normal + + ru + Например: +7 999 999-99-99 + + + + + ДекорацияТекущийНомер + 150 + + <key>ru</key> + <value>Телефон на обнаружен</value> + + true + true + + true + + + ДекорацияТекущийНомерРасширеннаяПодсказка + 152 + Label + true + true + + Left + + + + ДекорацияТекущийНомерКонтекстноеМеню + 151 + true + + Label + true + + Style.ПоясняющийТекст + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Ввод номера телефона</value> + + Bottom + + ГруппаВводНомераТелефонаРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Смена номера телефона</value> + + + ГруппаСменаНомераТелефонаРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Контакты первая строка</value> + + + ГруппаКонтактыПерваяСтрокаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Контакты</value> + + + ГруппаКонтактыРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Раздел</value> + + + Раздел4РасширеннаяПодсказка + 133 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаПодвал + 68 + + ГруппаТехническаяИнформация + 72 + + ДатаЗаявления + 77 + true + true + + true + + + ДатаЗаявления + + + ДатаЗаявленияРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ДатаЗаявленияКонтекстноеМеню + 78 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СостояниеЗаявления + 87 + true + true + + true + + + СостояниеЗаявления + + + СостояниеЗаявленияРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + СостояниеЗаявленияКонтекстноеМеню + 88 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИдентификаторЗаявления + 74 + true + true + + true + + + ИдентификаторЗаявления + + + ИдентификаторЗаявленияРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ИдентификаторЗаявленияКонтекстноеМеню + 75 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИдентификаторАбонента + 84 + true + true + + true + + + ИдентификаторАбонента + + + ИдентификаторАбонентаРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ИдентификаторАбонентаКонтекстноеМеню + 85 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СрокQRКода + 160 + true + true + + true + + + СрокQRКода + + + СрокQRКодаРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + + СрокQRКодаКонтекстноеМеню + 161 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПолучитьТекстЗаявления + 80 + true + true + + true + + + ПолучитьТекстЗаявленияРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПолучитьТекстЗаявления + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьЗаявление + 82 + true + true + + true + + + ОтменитьЗаявлениеРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + UsualButton + Form.Command.ОтменитьЗаявление + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Техническая информация</value> + + true + + ГруппаТехническаяИнформацияРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + UsualGroup + + Vertical + PopUp + + ru + Техническая информация + + true + true + true + auto + Auto + Auto + + + + ГруппаКоманды + 70 + + Отправить + 29 + true + true + + true + + true + + ОтправитьРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.Command.Отправить + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 31 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандыРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Подвал</value> + + + ГруппаПодвалРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + Low + Right + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + 60 + LockOwner + true + true + Vertical + true + true + auto + true + DontShow + + Режим_СменаПароля + + <key>ru</key> + <value>Сменить пароль входа на сервер DSS</value> + + 2 + + Boolean + + + true + + + true + + + + Режим_СменаКлючаМобильногоПриложения + + <key>ru</key> + <value>Новый QR-code для подтверждения операций</value> + + 3 + + Boolean + + + true + + + true + + + + Режим_ПовторнаяОтправкаКлючМобильногоПриложения + + <key>ru</key> + <value>Получить действующий QR-код для подтверждения операций</value> + + 4 + + Boolean + + + true + + + true + + + + Режим_ПовторнаяОтправкаКодаАктивации + + <key>ru</key> + <value>Отправить новый код активации ключа на мобильный телефон</value> + + 5 + + Boolean + + + true + + + true + + + + Телефон + + <key>ru</key> + <value>Номер мобильного телефона</value> + + 6 + + String + + + + true + + + true + + + + ЭлектроннаяПочта + 8 + + String + + + + true + + + true + + + + Режим_СменаКонтактов + + <key>ru</key> + <value>Новый номер мобильного телефона:</value> + + 9 + + Boolean + + + true + + + true + + + + УчетнаяЗапись + 10 + + CatalogRef.УчетныеЗаписиDSS + + + true + + + true + + + + ТекущийНомер + 13 + + String + + + + true + + + true + + + + ТекущаяЭлектроннаяПочта + 14 + + String + + + + true + + + true + + + + СостояниеЗаявления + + <key>ru</key> + <value>Состояние заявления</value> + + 1 + + EnumRef.СостоянияЗаявленияУчетнойЗаписиDSS + + + true + + + true + + + + ОбновитьАвтоматически + 16 + + Boolean + + + true + + + true + + + + ОтпечатокСертификата + 7 + + String + + + + true + + + true + + + + ДатаЗаявления + + <key>ru</key> + <value>Дата заявления</value> + + 11 + + Date + + Date + + + + true + + + true + + + + ИдентификаторЗаявления + + <key>ru</key> + <value>Идентификатор заявления</value> + + 12 + + String + + + + true + + + true + + + + ИНН + 15 + + String + + + + true + + + true + + + + КПП + 17 + + String + + + + true + + + true + + + + НомерТелефонаПроверен + 18 + + Boolean + + + true + + + true + + + + ЭлектроннаяПочтаПроверена + 19 + + Boolean + + + true + + + true + + + + ТекстЗаявления + 20 + + String + + + + true + + + true + + + + УжеОтправлено + 21 + + Boolean + + + true + + + true + + + + РежимВвода + 22 + + Boolean + + + true + + + true + + + + ИдентификаторАбонента + + <key>ru</key> + <value>Идентификатор абонента</value> + + 23 + + String + + + + true + + + true + + + + ИнтернетПоддержкаПользователейПодключена + 24 + + Boolean + + + true + + + true + + + + ПроцессОжидания + 25 + + Boolean + + + true + + + true + + + + Раздел1 + + <key>ru</key> + <value>Раздел1</value> + + 26 + + Number + + 10 + + + + true + + + true + + + + Раздел2 + + <key>ru</key> + <value>Раздел2</value> + + 27 + + Number + + 10 + + + + true + + + true + + + + Раздел3 + + <key>ru</key> + <value>Раздел3</value> + + 28 + + Number + + 10 + + + + true + + + true + + + + Раздел4 + + <key>ru</key> + <value>Раздел4</value> + + 29 + + Number + + 10 + + + + true + + + true + + + + ТелефонXML + 30 + + String + + + + true + + + true + + + + ТекущийНомерXML + 31 + + String + + + + true + + + true + + + + СрокQRКода + + <key>ru</key> + <value>Срок действия текущего QR-кода</value> + + 32 + + Date + + + + true + + + true + + + + Отправить + + <key>ru</key> + <value>Отправить</value> + + 1 + + ru + Отправить + + + true + + + + ОК + + + Auto + Auto + + + ПолучитьТекстЗаявления + + <key>ru</key> + <value>Текст заявления</value> + + 2 + + ru + Получить текст заявления + + + true + + + + ПолучитьТекстЗаявления + + + Auto + Auto + + + ОтменитьЗаявление + + <key>ru</key> + <value>Отменить заявление</value> + + 3 + + ru + Отменить заявление + + + true + + + + ОтменитьЗаявление + + + Auto + Auto + + + УчетнаяЗапись + + CatalogRef.УчетныеЗаписиDSS + + + + ОбновитьАвтоматически + + Boolean + + + + СостояниеЗаявления + + EnumRef.СостоянияЗаявленияУчетнойЗаписиDSS + + + + РежимВвода + + Boolean + + + + СодержимоеЗаявления + + + + + + + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Help/ru.html new file mode 100644 index 000000000..0e6730feb --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Help/ru.html @@ -0,0 +1,7 @@ +Предназначена для заполнения и отправки заявления на изменение реквизитов подключения в сервис облачной подписи. +
      +

      Заполнение

      +
      +
      • Необходимо выбрать нужные изменения реквизитов подключения с помощью флажков.
      • +
      • После заполнения заявления нажмите кнопку Отправить.
      +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Module.bsl new file mode 100644 index 000000000..93daf5b72 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ЗаявлениеНаИзменениеРеквизитовПодключения/Module.bsl @@ -0,0 +1,828 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УчетнаяЗапись = Параметры.УчетнаяЗапись; + СостояниеЗаявления = Параметры.СостояниеЗаявления; + ОбновитьАвтоматически = Параметры.ОбновитьАвтоматически; + РежимВвода = Параметры.РежимВвода; + ДоступныеРазделы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ДоступныеРазделы", Новый Массив); + + Если РежимВвода Тогда + ВсеРеквизиты = ПолучитьДанныеЗаявления(Параметры.СодержимоеЗаявления); + ИначеЕсли СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено Тогда + ВсеРеквизиты = ПолучитьДанныеЗаявления(Справочники.УчетныеЗаписиDSS.ПустаяСсылка()); + ВсеРеквизиты.СостояниеЗаявления = СостояниеЗаявления; + Иначе + ВсеРеквизиты = ПолучитьДанныеЗаявления(УчетнаяЗапись); + КонецЕсли; + + ЗаполнитьФормуДаннымиЗаявления(ВсеРеквизиты); + + Если НЕ ЗначениеЗаполнено(СостояниеЗаявления) Тогда + СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено; + КонецЕсли; + + УжеОтправлено = СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено + ИЛИ СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Отклонено + ИЛИ СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено; + + Если СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено Тогда + ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат(); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); + ИнтернетПоддержкаПользователейПодключена = МодульИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки(); + КонецЕсли; + + ПодготовитьОформлениеФормы(ДоступныеРазделы); + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если Режим_СменаКонтактов Тогда + + Если НЕ ЗначениеЗаполнено(Телефон) И НЕ ЗначениеЗаполнено(ЭлектроннаяПочта) Тогда + ПроверяемыеРеквизиты.Добавить("ЭлектроннаяПочта"); + ПроверяемыеРеквизиты.Добавить("Телефон"); + Отказ = Истина; + КонецЕсли; + + Если НЕ ПроверитьЭлектроннуюПочту(ЭлектроннаяПочта) Тогда + ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Некорректно заполнен адрес электронной почты.'"), , "ЭлектроннаяПочта", , Отказ) + КонецЕсли; + + Если НЕ ПроверитьНомерТелефона(Телефон) Тогда + ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Некорректно заполнен номер телефона.'"), , "Телефон", , Отказ) + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + НастроитьДоступностьЭлементов(); + ПодключитьОбработчикОжидания("Подключаемый_ИзменитьРазмерыФормы", 0.2, Истина); + + Если ОбновитьАвтоматически Тогда + Если СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Подготовлено") Тогда + ОтправитьЗаявление(); + ИначеЕсли СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено") + ИЛИ СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено") Тогда + ЗавершитьНастройки(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если Модифицированность И НЕ ЗавершениеРаботы Тогда + Отказ = Истина; + ПодключитьОбработчикОжидания("Подключаемый_ЗакрытиеФормы", 0.1, Истина); + Иначе + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ВРег(ИмяСобытия) = ВРег("ИнтернетПоддержкаПодключена") Тогда + ИнтернетПоддержкаПользователейПодключена = Истина; + ИначеЕсли ВРег(ИмяСобытия) = ВРег("ИнтернетПоддержкаОтключена") Тогда + ИнтернетПоддержкаПользователейПодключена = Ложь; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура Режим_СменаПароляПриИзменении(Элемент) + + СменаРежима(); + +КонецПроцедуры + +&НаКлиенте +Процедура Режим_СменаКлючаМобильногоПриложенияПриИзменении(Элемент) + + СменаРежима(); + +КонецПроцедуры + +&НаКлиенте +Процедура Режим_ПовторнаяОтправкаКодаАктивацииПриИзменении(Элемент) + + СменаРежима(); + +КонецПроцедуры + +&НаКлиенте +Процедура Режим_ПовторнаяОтправкаКлючМобильногоПриложенияПриИзменении(Элемент) + + СменаРежима(); + +КонецПроцедуры + +&НаКлиенте +Процедура Режим_СменаКонтактовПриИзменении(Элемент) + + СменаРежима(); + +КонецПроцедуры + +&НаКлиенте +Процедура ТелефонПриИзменении(Элемент) + + Элементы.Телефон.ОтметкаНезаполненного = НЕ ПроверитьНомерТелефона(Телефон); + ТелефонXML = ЗначениеТелефонаОблачнойПодписиПоПредставлению(Телефон); + Модифицированность = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ТелефонНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформациейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( + "УправлениеКонтактнойИнформациейКлиент"); + + ПараметрыФормы = МодульУправлениеКонтактнойИнформациейКлиент.ПараметрыФормыКонтактнойИнформации( + ВидКонтактнойИнформацииТелефон(), ТелефонXML, Телефон); + + ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Мобильный телефон владельца'")); + + МодульУправлениеКонтактнойИнформациейКлиент.ОткрытьФормуКонтактнойИнформации(ПараметрыФормы, Элемент); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ТелефонОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда + ТелефонXML = ВыбранноеЗначение.Значение; + Телефон = ПолучитьПредставлениеТелефона(ВыбранноеЗначение.Представление); + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + Если НЕ ПроверитьЗаполнение() Тогда + Возврат; + КонецЕсли; + + Если РежимВвода Тогда + Ответ = РезультатРаботы(Истина); + ЗакрытьФорму(Ответ); + ИначеЕсли УжеОтправлено Тогда + ЗавершитьНастройки(); + Иначе + ОтправитьЗаявление(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьТекстЗаявления(Команда) + + Если ЗначениеЗаполнено(ТекстЗаявления) Тогда + ИмяФайла = ИдентификаторЗаявления + ".xml"; + ДанныеФайла = ПолучитьДвоичныеДанныеИзBase64Строки(ТекстЗаявления); + АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла); + ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, АдресФайла, ИмяФайла); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьЗаявление(Команда) + + Дополнение = ?(УжеОтправлено, НСтр("ru = 'и отправленного'"), ""); + ТекстВопроса = НСтр("ru = 'Данные заявления будет потеряны безвозвратно. + |Хотите отказаться от оформленного %1 заявления.'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Дополнение); + + ОповещениеСледующее = Новый ОписаниеОповещения("ОтменитьЗаявлениеЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОповещениеСледующее, + ТекстВопроса, + РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ЦиклОкончанияНастройки + +&НаКлиенте +Процедура ЗавершитьНастройки() + + СтатусПроцессаОжидания(Истина); + + Результат = ПолучитьСостояниеЗаявления(); + Если Результат.Выполнено И Результат.РегистрацияУспешна Тогда + ИдентификаторАбонента = Результат.ИдентификаторАбонента; + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("УчетнаяЗапись", УчетнаяЗапись); + ПараметрыВызова.Вставить("Сертификат", Результат.ДанныеСертификата); + ПараметрыВызова.Вставить("ШифрованныйБлок", Результат.ДанныеШифрованногоБлока); + ПараметрыВызова.Вставить("УстановитьСертификат", Ложь); + + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("ОтобразитьОшибку", Истина); + + ОповещениеСледующее = Новый ОписаниеОповещения("ЗавершитьНастройкиОкончание", ЭтотОбъект); + СервисКриптографииDSSСлужебныйКлиент.АктивироватьИУстановитьСертификат(ОповещениеСледующее, ПараметрыВызова, ПараметрыОперации); + + ИначеЕсли Результат.Выполнено И НЕ Результат.РегистрацияУспешна Тогда + СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Отклонено"); + ЗавершитьНастройкиРезультат(Истина); + + ИначеЕсли ОбновитьАвтоматически Тогда + ЗавершитьНастройкиРезультат(Ложь); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьНастройкиОкончание(РезультатВыполнения, ДополнительныеПараметры) Экспорт + + Если РезультатВыполнения.Выполнено Тогда + СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено"); + ЗавершитьНастройкиРезультат(Истина); + Иначе + СтатусПроцессаОжидания(Ложь); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьНастройкиРезультат(Успешно) + + СтатусПроцессаОжидания(Ложь); + + ЗакрытьФорму(РезультатРаботы(Успешно)); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьСостояниеЗаявления() + + КлючПоиска = Обработки.УправлениеПодключениемDSS.КлючПоискаУчетнойЗаписи(УчетнаяЗапись); + Результат = Обработки.УправлениеПодключениемDSS.ПолучитьСостояниеЗаявления(УчетнаяЗапись, ИдентификаторЗаявления, КлючПоиска); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область ЦиклОтправкиЗаявления + +&НаКлиенте +Процедура ОтправитьЗаявление() + + ОповещениеСледующее = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеРезультат", ЭтотОбъект); + + ПараметрыЦикла = Новый Структура; + ПараметрыЦикла.Вставить("Заявление", Неопределено); + ПараметрыЦикла.Вставить("Подпись", Неопределено); + ПараметрыЦикла.Вставить("ТикетПоддержки", Неопределено); + ПараметрыЦикла.Вставить("ОповещениеОЗавершении", ОповещениеСледующее); + + СтатусПроцессаОжидания(Истина); + + Если ИнтернетПоддержкаПользователейПодключена Тогда + ОтправитьЗаявлениеСформироватьЗаявление(ПараметрыЦикла); + Иначе + ОтправитьЗаявлениеПодключитьИнтернетПоддержку(ПараметрыЦикла); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьЗаявлениеПодключитьИнтернетПоддержку(ПараметрыЦикла) + + ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении; + + Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Невозможно подключиться к порталу интернет-поддержки по причине: + |Библиотека интернет поддержки пользователей не внедрена в конфигурацию.'")); + Возврат; + КонецЕсли; + + МодульИнтернетПоддержкаПользователейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( + "ИнтернетПоддержкаПользователейКлиент"); + + Если МодульИнтернетПоддержкаПользователейКлиент.ДоступноПодключениеИнтернетПоддержки() Тогда + ОповещениеОПодключении = Новый ОписаниеОповещения("ОтправитьЗаявлениеПослеПодключенияИнтернетПоддержки", ЭтотОбъект, ПараметрыЦикла); + МодульИнтернетПоддержкаПользователейКлиент.ПодключитьИнтернетПоддержкуПользователей(ОповещениеОПодключении, ЭтотОбъект); + + Иначе + ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Для отправки заявления необходимо подключить Интернет-поддержку пользователей.'")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьЗаявлениеПослеПодключенияИнтернетПоддержки(РезультатВыполнения, ПараметрыЦикла) Экспорт + + ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении; + ЛогинПоддержки = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(РезультатВыполнения, "Логин"); + ИнтернетПоддержкаПользователейПодключена = ЗначениеЗаполнено(ЛогинПоддержки); + + Если ИнтернетПоддержкаПользователейПодключена Тогда + ОтправитьЗаявлениеСформироватьЗаявление(ПараметрыЦикла); + Иначе + ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Для отправки заявления необходимо проверить подключение услуги Интернет-поддержки пользователей.'")); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьЗаявлениеСформироватьЗаявление(ПараметрыЦикла) + + ДлительнаяОперация = ПолучитьТикетИнтернетПоддержки(); + + ОбъектОповещения = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеПолучениеТикета", ЭтотОбъект, ПараметрыЦикла); + СервисКриптографииDSSСлужебныйКлиент.ОжидатьЗавершенияВыполненияВФоне(ОбъектОповещения, ДлительнаяОперация); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьЗаявлениеСформироватьЗаявлениеПолучениеТикета(ОтветСервиса, ПараметрыЦикла) Экспорт + + ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении; + РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ПараметрыЦикла); + + Если НЕ РезультатВыполнения.Выполнено Тогда + ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Не удалось получить тикет Интернет-поддержки.'")); + + ИначеЕсли ЗначениеЗаполнено(РезультатВыполнения.Тикет) Тогда + ПараметрыЦикла.ТикетПоддержки = РезультатВыполнения; + ПараметрыЦикла.Заявление = ПодготовитьТекстЗаявления(РезультатВыполнения); + + ДанныеДляПодписи = ПолучитьДвоичныеДанныеИзСтроки(ПараметрыЦикла.Заявление, "windows-1251"); + СвойстваСертификата = Новый Структура("Отпечаток", ОтпечатокСертификата); + + СвойстваПодписи = СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS(Истина, Ложь); + СервисКриптографииDSSКлиентСервер.ПолучитьИнформациюДокументаДляПодписи(СвойстваПодписи, НСтр("ru = 'Подпись отправляемого заявления'"), "xml"); + + ПараметрыОперации = Новый Структура; + ПараметрыОперации.Вставить("ОтобразитьОшибку", Истина); + + ОповещениеСледующее = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеПослеПодписание", ЭтотОбъект, ПараметрыЦикла); + СервисКриптографииDSSКлиент.Подписать(ОповещениеСледующее, УчетнаяЗапись, ДанныеДляПодписи, СвойстваПодписи, СвойстваСертификата, ПараметрыОперации); + + Иначе + ИнтернетПоддержкаПользователейПодключена = Ложь; + ПоказатьОшибку(ОповещениеОЗавершении, НСтр("ru = 'Неверные параметры подключения к Интернет-поддержке'")); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьЗаявлениеСформироватьЗаявлениеПослеПодписание(РезультатВыполнения, ПараметрыЦикла) Экспорт + + ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении; + + Если РезультатВыполнения.Выполнено Тогда + ПараметрыЦикла.Подпись = РезультатВыполнения.Результат; + ДлительнаяОперация = ОтправитьЗаявлениеНаСервере(ПараметрыЦикла.Заявление, ПараметрыЦикла.Подпись, ПараметрыЦикла.ТикетПоддержки); + + ОбъектОповещения = Новый ОписаниеОповещения("ОтправитьЗаявлениеСформироватьЗаявлениеЗавершение", ЭтотОбъект, ПараметрыЦикла); + СервисКриптографииDSSСлужебныйКлиент.ОжидатьЗавершенияВыполненияВФоне(ОбъектОповещения, ДлительнаяОперация); + + Иначе + ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Неопределено); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьЗаявлениеСформироватьЗаявлениеЗавершение(ОтветСервиса, ПараметрыЦикла) Экспорт + + ОповещениеОЗавершении = ПараметрыЦикла.ОповещениеОЗавершении; + + РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ПараметрыЦикла); + Если РезультатВыполнения.Выполнено Тогда + СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено"); + ДатаЗаявления = РезультатВыполнения.ДатаОтправки; + ИдентификаторЗаявления = РезультатВыполнения.ИдентификаторДокументооборота; + СтатусПроцессаОжидания(Ложь); + ЗакрытьФорму(РезультатРаботы(Истина)); + Иначе + ПоказатьОшибку(ОповещениеОЗавершении, РезультатВыполнения.Ошибка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьЗаявлениеСформироватьЗаявлениеРезультат(РезультатВыполнения, ПараметрыЦикла) Экспорт + + СтатусПроцессаОжидания(Ложь); + +КонецПроцедуры + +&НаСервере +Функция ПодготовитьТекстЗаявления(ТикетПоддержки) + + РеквизитыЗаявления = ПодготовитьДанныеЗаявления(); + Результат = Обработки.УправлениеПодключениемDSS.ПодготовитьЗаявлениеXML(РеквизитыЗаявления, УчетнаяЗапись, ТикетПоддержки); + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПолучитьТикетИнтернетПоддержки() + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ПолучитьТикетИнтернетПоддержкиПользователя", ПараметрыВызова); + +КонецФункции + +&НаСервере +Функция ОтправитьЗаявлениеНаСервере(Заявление, Подпись, ТикетПоддержки) + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + ПараметрыВызова.Вставить("Заявление", Заявление); + ПараметрыВызова.Вставить("ПодписьЗаявления", Подпись); + ПараметрыВызова.Вставить("ТикетПользователя", ТикетПоддержки); + ПараметрыВызова.Вставить("ИдентификаторДокументооборота", ИдентификаторЗаявления); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ОтправитьЗаявлениеНаПортал", ПараметрыВызова); + +КонецФункции + +#КонецОбласти + +#Область Прочие + +&НаКлиенте +Процедура ПоказатьОшибку(ОповещениеЗавершения, ТекстОшибки) + + СервисКриптографииDSSКлиент.ВывестиОшибку(ОповещениеЗавершения, ТекстОшибки); + +КонецПроцедуры + +&НаКлиенте +Процедура СтатусПроцессаОжидания(НовыйСтатус) + + ПроцессОжидания = НовыйСтатус; + НастроитьДоступностьЭлементов(); + +КонецПроцедуры + +&НаКлиенте +Процедура СменаРежима() + + Модифицированность = Истина; + НастроитьДоступностьЭлементов(); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьДоступностьЭлементов() + + Изменять = Истина; + Если СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Подготовлено") Тогда + Изменять = НЕ ОбновитьАвтоматически; + ИначеЕсли СостояниеЗаявления <> ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено") Тогда + Изменять = Ложь; + КонецЕсли; + + ДоступныКонтакты = Режим_СменаКлючаМобильногоПриложения ИЛИ Режим_СменаПароля + ИЛИ Режим_ПовторнаяОтправкаКлючМобильногоПриложения + ИЛИ Режим_ПовторнаяОтправкаКодаАктивации; + Элементы.ГруппаКонтактыПерваяСтрока.Доступность = Изменять И ДоступныКонтакты; + Элементы.Телефон.Доступность = Режим_СменаКонтактов И Изменять И ДоступныКонтакты; + + Элементы.ГруппаСменаПароля.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять; + Элементы.ГруппаСменаКлюча.Доступность = НЕ Режим_СменаПароля И Изменять + И НЕ Режим_ПовторнаяОтправкаКлючМобильногоПриложения И НЕ Режим_ПовторнаяОтправкаКодаАктивации; + Элементы.ГруппаПовторКлюча.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять; + Элементы.ГруппаПовторКодаАвторизации.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять; + Элементы.ГруппаПовторКодаАвторизации.Доступность = НЕ Режим_СменаКлючаМобильногоПриложения И Изменять; + Элементы.Отправить.Доступность = Изменять И НЕ ОбновитьАвтоматически И НЕ ПроцессОжидания; + Элементы.ПолучитьТекстЗаявления.Доступность = ЗначениеЗаполнено(ТекстЗаявления); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ИзменитьРазмерыФормы() + + Элементы.ГруппаКонтакты.Видимость = НЕ Элементы.ГруппаКонтакты.Видимость; + Элементы.ГруппаКонтакты.Видимость = НЕ Элементы.ГруппаКонтакты.Видимость; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ЗакрытиеФормы() + + ОповещениеСледующее = Новый ОписаниеОповещения("ЗакрытьФормуПослеВыбора", ЭтотОбъект); + ПоказатьВопрос(ОповещениеСледующее, + НСтр("ru = 'Сохранить изменения?'"), + РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(РезультатВыбора = Неопределено) + + Модифицированность = Ложь; + Закрыть(РезультатВыбора); + +КонецПроцедуры + +&НаКлиенте +Функция РезультатРаботы(Успешно = Истина) + + ДанныеЗаявления = ПодготовитьДанныеЗаявления(); + + Результат = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Успешно); + Результат.Вставить("Результат", Новый Структура); + Результат.Результат.Вставить("СодержаниеЗаявления", ДанныеЗаявления); + Результат.Результат.Вставить("СостояниеЗаявления", СостояниеЗаявления); + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ЗакрытьФормуПослеВыбора(ВыборПользователя, ДополнительныеПараметры) Экспорт + + Если ВыборПользователя = КодВозвратаДиалога.Да Тогда + Если СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено") Тогда + СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Подготовлено"); + КонецЕсли; + Ответ = РезультатРаботы(Истина); + Иначе + Ответ = РезультатРаботы(Ложь); + КонецЕсли; + + ЗакрытьФорму(Ответ); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтменитьЗаявлениеЗавершение(ВыборПользователя, ДополнительныеПараметры) Экспорт + + ОчиститьЗаявление(); + Ответ = РезультатРаботы(Истина); + ЗакрытьФорму(Ответ); + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПроверитьЭлектроннуюПочту(ЭлектроннаяПочта) + + Результат = НЕ ЗначениеЗаполнено(ЭлектроннаяПочта) + ИЛИ ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ЭлектроннаяПочта); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПроверитьНомерТелефона(НомерТелефона) + + Представление = Обработки.УправлениеПодключениемDSS.ПолучитьПредставлениеТелефона(НомерТелефона); + Результат = ЗначениеЗаполнено(Представление) ИЛИ НЕ ЗначениеЗаполнено(НомерТелефона); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ВидКонтактнойИнформацииТелефон() + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Результат = МодульУправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления["ТипыКонтактнойИнформации"].Телефон); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ЗначениеТелефонаОблачнойПодписиПоПредставлению(ТекущийТелефон) + + Результат = ""; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Результат = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(ТекущийТелефон, Перечисления["ТипыКонтактнойИнформации"].Телефон); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьФормуДаннымиЗаявления(ВсеРеквизиты) + + ДатаЗаявления = ВсеРеквизиты.ДатаЗаявления; + ИдентификаторЗаявления = ВсеРеквизиты.ИдентификаторЗаявления; + ИдентификаторАбонента = ВсеРеквизиты.ИдентификаторАбонента; + СостояниеЗаявления = ВсеРеквизиты.СостояниеЗаявления; + ИНН = ВсеРеквизиты.ИНН; + КПП = ВсеРеквизиты.КПП; + Телефон = ВсеРеквизиты.НомерТелефона; + ТелефонXML = ВсеРеквизиты.НомерТелефонаXML; + НомерТелефонаПроверен = ВсеРеквизиты.НомерТелефонаПроверен; + ЭлектроннаяПочта = ВсеРеквизиты.ЭлектроннаяПочта; + ЭлектроннаяПочтаПроверена = ВсеРеквизиты.ЭлектроннаяПочтаПроверена; + Режим_СменаКонтактов = ВсеРеквизиты.Режим_СменаКонтактов; + Режим_ПовторнаяОтправкаКлючМобильногоПриложения = ВсеРеквизиты.Режим_ПовторнаяОтправкаКлючМобильногоПриложения; + Режим_ПовторнаяОтправкаКодаАктивации = ВсеРеквизиты.Режим_ПовторнаяОтправкаКодаАктивации; + Режим_СменаКлючаМобильногоПриложения = ВсеРеквизиты.Режим_СменаКлючаМобильногоПриложения; + Режим_СменаПароля = ВсеРеквизиты.Режим_СменаПароля; + ТекстЗаявления = ВсеРеквизиты.ТекстЗаявления; + +КонецПроцедуры + +&НаСервере +Функция ПолучитьДанныеЗаявления(СодержимоеЗаявления = Неопределено) + + Результат = Обработки.УправлениеПодключениемDSS.СтруктураРеквизитовЗаявления(); + ДанныеЗаявления = Неопределено; + + Если ТипЗнч(СодержимоеЗаявления) = Тип("СправочникСсылка.УчетныеЗаписиDSS") Тогда + + РеквизитЗаявления = Неопределено; + Если СервисКриптографииDSSСлужебный.ПроверитьПраво("УчетныеЗаписиDSS") Тогда + РеквизитЗаявления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СодержимоеЗаявления, "СодержаниеЗаявления", Истина); + КонецЕсли; + + Если РеквизитЗаявления <> Неопределено Тогда + ДанныеЗаявления = РеквизитЗаявления.Получить(); + КонецЕсли; + + Иначе + ДанныеЗаявления = СодержимоеЗаявления; + КонецЕсли; + + Если ТипЗнч(ДанныеЗаявления) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Результат, ДанныеЗаявления); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПодготовитьДанныеЗаявления() + + Результат = Обработки.УправлениеПодключениемDSS.СтруктураРеквизитовЗаявления(); + Результат.ДатаЗаявления = ДатаЗаявления; + Результат.ИдентификаторЗаявления = ИдентификаторЗаявления; + Результат.ИдентификаторАбонента = ИдентификаторАбонента; + Результат.СостояниеЗаявления = СостояниеЗаявления; + Результат.ИНН = ИНН; + Результат.КПП = КПП; + Результат.НомерТелефона = Телефон; + Результат.НомерТелефонаXML = ТелефонXML; + Результат.НомерТелефонаПроверен = НомерТелефонаПроверен; + Результат.ЭлектроннаяПочта = ЭлектроннаяПочта; + Результат.ЭлектроннаяПочтаПроверена = ЭлектроннаяПочтаПроверена; + Результат.СрокQRКода = СрокQRКода; + Результат.Режим_СменаКонтактов = Режим_СменаКонтактов; + Результат.Режим_ПовторнаяОтправкаКлючМобильногоПриложения = Режим_ПовторнаяОтправкаКлючМобильногоПриложения; + Результат.Режим_ПовторнаяОтправкаКодаАктивации = Режим_ПовторнаяОтправкаКодаАктивации; + Результат.Режим_СменаКлючаМобильногоПриложения = Режим_СменаКлючаМобильногоПриложения; + Результат.Режим_СменаПароля = Режим_СменаПароля; + Результат.ТекстЗаявления = ТекстЗаявления; + Результат.ОтпечатокСертификата = ОтпечатокСертификата; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ОчиститьЗаявление() + + ВсеРеквизиты = Обработки.УправлениеПодключениемDSS.СтруктураРеквизитовЗаявления(); + ЗаполнитьФормуДаннымиЗаявления(ВсеРеквизиты); + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьОформлениеФормы(ДоступныеРазделы) + + Если ЗначениеЗаполнено(ТекущийНомер) Тогда + Элементы.ДекорацияТекущийНомер.Заголовок = НСтр("ru = 'Текущий номер телефона'") + ": " + ТекущийНомер; + Иначе + Элементы.ДекорацияТекущийНомер.Заголовок = ""; + КонецЕсли; + Элементы.ДекорацияТекущийНомер.Видимость = ЗначениеЗаполнено(Элементы.ДекорацияТекущийНомер.Заголовок); + + Элементы.ДекорацияЛогина.Заголовок = НСтр("ru = 'Настройка для'") + ": " + СокрЛП(УчетнаяЗапись); + Элементы.СостояниеЗаявления.Видимость = НЕ РежимВвода; + Элементы.ДатаЗаявления.Видимость = НЕ РежимВвода; + Элементы.ПолучитьТекстЗаявления.Видимость = НЕ РежимВвода; + Элементы.ОтменитьЗаявление.Видимость = НЕ РежимВвода И УжеОтправлено; + + Если РежимВвода Тогда + Заголовок = НСтр("ru = 'Дополнительные настройки издания сертификата'"); + Элементы.ДекорацияЛогина.Видимость = Ложь; + Элементы.Отправить.Заголовок = НСтр("ru = 'ОК'"); + ИначеЕсли УжеОтправлено Тогда + Элементы.Отправить.Заголовок = НСтр("ru = 'Обновить'"); + Иначе + Элементы.Отправить.Заголовок = НСтр("ru = 'Отправить'"); + КонецЕсли; + + Раздел1 = 1; + Раздел2 = 2; + Раздел3 = 3; + Раздел4 = 4; + + СписокРазделов = Новый Структура; + СписокРазделов.Вставить("Пароль", "Раздел1"); + СписокРазделов.Вставить("НовыйQRКод", "Раздел2"); + СписокРазделов.Вставить("Повтор", "Раздел3"); + СписокРазделов.Вставить("Контакты", "Раздел4"); + + Если ДоступныеРазделы.Количество() = 0 Тогда + Для каждого СтрокаКлюча Из СписокРазделов Цикл + ДоступныеРазделы.Добавить(СтрокаКлюча.Ключ); + КонецЦикла; + КонецЕсли; + + Для каждого СтрокаКлюча Из СписокРазделов Цикл + ИмяЭлемента = СтрокаКлюча.Значение; + Элементы[ИмяЭлемента].Доступность = ДоступныеРазделы.Найти(СтрокаКлюча.Ключ) <> Неопределено; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат() + + ДанныеЗаявления = Обработки.УправлениеПодключениемDSS.ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат(УчетнаяЗапись); + + ТекущаяЭлектроннаяПочта = ДанныеЗаявления.ОблачнаяПодписьЭлектроннаяПочта; + ТекущийНомер = ДанныеЗаявления.ОблачнаяПодписьМобильныйТелефон; + ТекущийНомерXML = ДанныеЗаявления.ОблачнаяПодписьМобильныйТелефонXML; + ИНН = ДанныеЗаявления.ИНН; + КПП = ДанныеЗаявления.КПП; + ОтпечатокСертификата = ДанныеЗаявления.ОтпечатокСертификата; + + Если НЕ ЗначениеЗаполнено(ИдентификаторАбонента) Тогда + ИдентификаторАбонента = ДанныеЗаявления.ИдентификаторАбонента; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьПредставлениеТелефона(ТекущийНомерТелефона) + + Результат = Обработки.УправлениеПодключениемDSS.ПолучитьПредставлениеТелефона(ТекущийНомерТелефона); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Form.form new file mode 100644 index 000000000..2a7c4780a --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Form.form @@ -0,0 +1,1479 @@ + + + + <key>ru</key> + <value>Создание запроса на сертификат</value> + + + ГруппаОсновное + 48 + + КриптоПровайдер + 50 + + <key>ru</key> + <value>Криптопровайдер</value> + + true + true + + true + + + КриптоПровайдер + + + КриптоПровайдерРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + КриптоПровайдерКонтекстноеМеню + 51 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + true + Normal + + + + УдостоверяющийЦентр + 59 + true + true + + true + + + УдостоверяющийЦентр + + + OnChange + УдостоверяющийЦентрПриИзменении + + + УдостоверяющийЦентрРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + УдостоверяющийЦентрКонтекстноеМеню + 60 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ШаблонСертификата + 53 + true + true + + true + + + ШаблонСертификата + + + ШаблонСертификатаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ШаблонСертификатаКонтекстноеМеню + 54 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + + ГруппаОсновноеРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаПоляСертификата + 4 + + ОбщееИмя + 1 + + <key>ru</key> + <value>Общее имя</value> + + true + true + + true + + + ОбщееИмя + + + ОбщееИмяРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ОбщееИмяКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ЭлектроннаяПочта + 45 + + <key>ru</key> + <value>Электронная почта</value> + + true + true + + true + + + ЭлектроннаяПочта + + + ЭлектроннаяПочтаРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ЭлектроннаяПочтаКонтекстноеМеню + 46 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаВладелец + 64 + + Фамилия + 6 + + <key>ru</key> + <value>Фамилия</value> + + true + true + + true + + + Фамилия + + + ФамилияРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + ФамилияКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИмяОтчество + 9 + + <key>ru</key> + <value>Имя и отчество</value> + + true + true + + true + + + ИмяОтчество + + + ИмяОтчествоРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ИмяОтчествоКонтекстноеМеню + 10 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Владелец</value> + + + ГруппаВладелецРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + + + ГруппаАдрес + 66 + + Страна + 12 + + <key>ru</key> + <value>Код страны</value> + + true + true + + true + + + Страна + + + СтранаРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СтранаКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + КодРегиона + 15 + + <key>ru</key> + <value>Код региона</value> + + true + true + + true + + + КодРегиона + + + КодРегионаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + КодРегионаКонтекстноеМеню + 16 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + НаселенныйПункт + 18 + + <key>ru</key> + <value>Населенный пункт</value> + + true + true + + true + + + НаселенныйПункт + + + НаселенныйПунктРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + НаселенныйПунктКонтекстноеМеню + 19 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Улица + 21 + + <key>ru</key> + <value>Улица</value> + + true + true + + true + + + Улица + + + УлицаРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + УлицаКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Адрес</value> + + + ГруппаАдресРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + + + ГруппаОрганизация + 68 + + Организация + 27 + + <key>ru</key> + <value>Организация</value> + + true + true + + true + + + Организация + + + ОрганизацияРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ОрганизацияКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ИНН + 42 + + <key>ru</key> + <value>ИНН</value> + + true + true + + true + + + ИНН + + + OnChange + ИННПриИзменении + + + ИННРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ИННКонтекстноеМеню + 43 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаОГРН + 70 + + ОГРН + 36 + + <key>ru</key> + <value>ОГРН</value> + + true + true + + true + + + ОГРН + + + ОГРНРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ОГРНКонтекстноеМеню + 37 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОГРНИП + 24 + + <key>ru</key> + <value>ОГРНИП</value> + + true + true + + true + + + ОГРНИП + + + ОГРНИПРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ОГРНИПКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>ОГРН</value> + + + ГруппаОГРНРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + СНИЛС + 39 + + <key>ru</key> + <value>СНИЛС</value> + + true + true + + true + + + СНИЛС + + + СНИЛСРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + СНИЛСКонтекстноеМеню + 40 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Подразделение + 30 + + <key>ru</key> + <value>Подразделение</value> + + true + true + + true + + + Подразделение + + + ПодразделениеРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ПодразделениеКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Должность + 33 + + <key>ru</key> + <value>Должность</value> + + true + true + + true + + + Должность + + + ДолжностьРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ДолжностьКонтекстноеМеню + 34 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Организация</value> + + + ГруппаОрганизацияРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Поля сертификата</value> + + + ГруппаПоляСертификатаРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + + ru + Поля сертификата + + true + WeakSeparation + true + true + auto + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ФормаСоздатьЗапрос + 62 + true + true + + true + + + ФормаСоздатьЗапросРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Command.СоздатьЗапрос + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + Фамилия + + <key>ru</key> + <value>Фамилия</value> + + 2 + + String + + 64 + + + + true + + + true + + + + НаселенныйПункт + + <key>ru</key> + <value>Населенный пункт</value> + + 3 + + String + + 128 + + + + true + + + true + + + + ОбщееИмя + + <key>ru</key> + <value>Общее имя</value> + + 4 + + String + + 64 + + + + true + + + true + + + + ИмяОтчество + + <key>ru</key> + <value>Имя отчество</value> + + 5 + + String + + 64 + + + + true + + + true + + + + Страна + + <key>ru</key> + <value>Страна</value> + + 6 + + String + + 2 + + + + true + + + true + + + + КодРегиона + + <key>ru</key> + <value>Код региона</value> + + 7 + + String + + 128 + + + + true + + + true + + + + Улица + + <key>ru</key> + <value>Улица</value> + + 8 + + String + + 128 + + + + true + + + true + + + + ОГРНИП + + <key>ru</key> + <value>ОГРНИП</value> + + 9 + + String + + 15 + + + + true + + + true + + + + Организация + + <key>ru</key> + <value>Организация</value> + + 10 + + String + + 64 + + + + true + + + true + + + + Подразделение + + <key>ru</key> + <value>Подразделение</value> + + 11 + + String + + 64 + + + + true + + + true + + + + Должность + + <key>ru</key> + <value>Должность</value> + + 12 + + String + + 64 + + + + true + + + true + + + + ОГРН + + <key>ru</key> + <value>ОГРН</value> + + 13 + + String + + 13 + + + + true + + + true + + + + СНИЛС + + <key>ru</key> + <value>СНИЛС</value> + + 14 + + String + + 14 + + + + true + + + true + + + + ИНН + + <key>ru</key> + <value>ИНН</value> + + 15 + + String + + 12 + + + + true + + + true + + + + ЭлектроннаяПочта + + <key>ru</key> + <value>Электронная почта</value> + + 16 + + String + + 128 + + + + true + + + true + + + + КриптоПровайдер + + <key>ru</key> + <value>Крипто провайдер</value> + + 17 + + + true + + + true + + + + ШаблонСертификата + + <key>ru</key> + <value>Шаблон сертификата</value> + + 18 + + + true + + + true + + + + УдостоверяющийЦентр + + <key>ru</key> + <value>Удостоверяющий центр</value> + + 20 + + + true + + + true + + + + НастройкиПользователя + 21 + + + true + + + true + + + + СоздатьЗапрос + + <key>ru</key> + <value>Создать запрос</value> + + 1 + + ru + Создать запрос + + + true + + + + СоздатьЗапрос + + + Auto + Auto + + + НастройкиПользователя + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Help/ru.html new file mode 100644 index 000000000..1e0346434 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Help/ru.html @@ -0,0 +1,25 @@ + + + + +

      Предназначена для заполнения полей при +формировании нового запроса на сертификат.

      + +

      Основные поля запроса на сертификат

      + +
      • В поле криптопровайдер содержит список доступных криптопровайдеров.
      • +
      • В поле удостоверяющий центр указывается, какой УЦ будет использоваться + при выпуске нового сертификата. 
      • +
      • В поле шаблон сертификата содержит список шаблонов сертификатов, в соответствии + с которым необходимо заполнить содержание запроса на сертификат.
      • +

      Поля содержания запроса на сертификат

      + +
      • В поле общее имя содержит представление нового сертификата
      • +
      • В поле электронная почта необходимо адрес электронной почты
      • +
      • Прочие поля – необходимо + заполнить прочие поля, часть полей является обязательными и выделены + красным подчеркиванием. 
      • +
      • Кнопка + создать запрос формирует запрос + на новый сертификат к сервису облачной подписи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Module.bsl new file mode 100644 index 000000000..b578aad3c --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/НовыйЗапросНаСертификат/Module.bsl @@ -0,0 +1,291 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НастройкиПользователя = Параметры.НастройкиПользователя; + + Если НастройкиПользователя <> Неопределено Тогда + ЗаполнитьСпискиФормы(НастройкиПользователя); + КонецЕсли; + + Если Параметры.Свойство("ПоляЗапроса") + И ТипЗнч(Параметры.ПоляЗапроса) = Тип("Соответствие") Тогда + ЗаполнитьПоляЗапроса(Параметры.ПоляЗапроса); + КонецЕсли; + + УправлениеФормой(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(Неопределено); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ИННПриИзменении(Элемент) + + УправлениеФормой(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура СоздатьЗапрос(Команда) + + Если ПроверитьПоляЗапроса() Тогда + ПараметрыЗапроса = ПодготовитьЗапросНаСертификат(); + ЗакрытьФорму(ПараметрыЗапроса); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + РезультатВызова = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + Если ПараметрыЗакрытия <> Неопределено Тогда + РезультатВызова.Выполнено = Истина; + РезультатВызова.Вставить("Результат", ПараметрыЗакрытия); + КонецЕсли; + + Закрыть(РезультатВызова); + +КонецПроцедуры + +&НаКлиенте +Процедура УдостоверяющийЦентрПриИзменении(Элемент) + + Элементы.ШаблонСертификата.СписокВыбора.Очистить(); + ЗаполнитьСписокШаблонов(УдостоверяющийЦентр.Шаблоны); + + УправлениеФормой(); + +КонецПроцедуры + +&НаСервере +Функция ПроверитьПоляЗапроса() + + Результат = Истина; + Если ЗначениеЗаполнено(УдостоверяющийЦентр) Тогда + ВсеАтрибуты = СервисКриптографииDSS.ПолучитьРеестрПолейУдостоверяющегоЦентра(УдостоверяющийЦентр); + Иначе + ВсеАтрибуты = Новый Массив; + КонецЕсли; + + ВсеОшибки = Неопределено; + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + Для Каждого СтрокаМассива Из ВсеАтрибуты Цикл + ЗначениеПоля = ЭтотОбъект[СтрокаМассива.Представление]; + Если НЕ ЗначениеЗаполнено(ЗначениеПоля) И СтрокаМассива.Обязательно Тогда + ТекстОшибки = НСтр("ru = 'Поле: %1 не заполнено'", КодЯзыка); + ДобавитьОшибкуПользователю(ВсеОшибки, + СтрокаМассива.Представление, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, СтрокаМассива.Представление)); + КонецЕсли; + КонецЦикла; + + Если НЕ ЗначениеЗаполнено(УдостоверяющийЦентр) Тогда + ДобавитьОшибкуПользователю(ВсеОшибки, + "УдостоверяющийЦентр", + НСтр("ru = 'Поле: Удостоверяющий центр не заполнено'", КодЯзыка)); + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ШаблонСертификата) Тогда + ДобавитьОшибкуПользователю(ВсеОшибки, + "ШаблонСертификата", + НСтр("ru = 'Поле: Шаблон сертификата не заполнено'", КодЯзыка)); + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(КриптоПровайдер) Тогда + ДобавитьОшибкуПользователю(ВсеОшибки, + "КриптоПровайдер", + НСтр("ru = 'Поле: Криптопровайдер не заполнено'", КодЯзыка)); + КонецЕсли; + + Если ЗначениеЗаполнено(ВсеОшибки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(ВсеОшибки); + Результат = Ложь; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПодготовитьЗапросНаСертификат(ИмяПоля = "OID") + + Результат = Новый Структура; + ПоляАтрибутов = Новый Соответствие; + ВсеАтрибуты = СервисКриптографииDSS.ПолучитьРеестрПолейУдостоверяющегоЦентра(УдостоверяющийЦентр); + ИмяСертификата = ""; + + Для Каждого СтрокаМассива Из ВсеАтрибуты Цикл + ЗначениеПоля = ЭтотОбъект[СтрокаМассива.Представление]; + Если ЗначениеЗаполнено(ЗначениеПоля) ИЛИ СтрокаМассива.Обязательно Тогда + ПоляАтрибутов.Вставить(СтрокаМассива[ИмяПоля], ЗначениеПоля); + КонецЕсли; + Если ЗначениеЗаполнено(ЗначениеПоля) Тогда + ИмяСертификата = ИмяСертификата + ?(ПустаяСтрока(ИмяСертификата), "", ",") + СтрокаМассива.Имя + "=" + ЗначениеПоля; + КонецЕсли; + КонецЦикла; + + Результат.Вставить("ПоляАтрибутов", ПоляАтрибутов); + Результат.Вставить("УдостоверяющийЦентр", СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(УдостоверяющийЦентр, "Идентификатор")); + Результат.Вставить("Криптопровайдер", СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(КриптоПровайдер, "Идентификатор")); + Результат.Вставить("ШаблонСертификата", ШаблонСертификата); + Результат.Вставить("ИмяСертификата", ИмяСертификата); + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьПоляЗапроса(ПоляЗапроса) + + ВсеПоля = СервисКриптографииDSSASNКлиентСервер.ОпределитьТип_OID(, "10"); + + Для каждого СтрокаПоля Из ВсеПоля Цикл + ЗначениеПоля = ПоляЗапроса[СтрокаПоля.Ключ]; + Представление = СтрокаПоля.Значение.Представление; + Если НЕ ЗначениеЗаполнено(ЗначениеПоля) Тогда + ЗначениеПоля = ПоляЗапроса[Представление]; + КонецЕсли; + ЭтотОбъект[Представление] = ЗначениеПоля; + Элементы[Представление].Доступность = НЕ ЗначениеЗаполнено(ЗначениеПоля); + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// ТекущиеНастройки - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +&НаСервере +Процедура ЗаполнитьСпискиФормы(ТекущиеНастройки) + + Для каждого СтрокаМассива Из ТекущиеНастройки.Политика.УЦ Цикл + Элементы.УдостоверяющийЦентр.СписокВыбора.Добавить(СтрокаМассива, СтрокаМассива.Имя); + КонецЦикла; + + Если ТекущиеНастройки.Политика.УЦ.Количество() = 1 Тогда + УдостоверяющийЦентр = ТекущиеНастройки.Политика.УЦ[0]; + КонецЕсли; + + Для каждого СтрокаМассива Из ТекущиеНастройки.Политика.Криптопровайдеры Цикл + Элементы.КриптоПровайдер.СписокВыбора.Добавить(СтрокаМассива, СтрокаМассива.Описание); + КонецЦикла; + + Если ТекущиеНастройки.Политика.Криптопровайдеры.Количество() = 1 Тогда + КриптоПровайдер = ТекущиеНастройки.Политика.Криптопровайдеры[0]; + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Шаблоны - Массив из Структура: +// * Шаблон - Строка +// * Наименование - Строка +// +&НаСервере +Процедура ЗаполнитьСписокШаблонов(Шаблоны) + + Для каждого СтрокаМассива Из Шаблоны Цикл + Элементы.ШаблонСертификата.СписокВыбора.Добавить(СтрокаМассива.Шаблон, СтрокаМассива.Наименование); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УправлениеФормой() + + ЭтоЮрЛицо = СтрДлина(ИНН) = 10; + ЭлементыФормы = Элементы; + + СимволОбязательности = "(*)"; + + // вернем в исходное состояние + ВсеПоля = СервисКриптографииDSSASNКлиентСервер.ОпределитьТип_OID(, "10"); + Для каждого СтрокаМассива Из ВсеПоля Цикл + Представление = СтрокаМассива.Значение.Представление; + ЭлементФормы = ЭлементыФормы[Представление]; + ЭлементФормы.Заголовок = СтрЗаменить(ЭлементФормы.Заголовок, СимволОбязательности, ""); + ЭлементФормы.ТолькоПросмотр = Истина; + ЭлементФормы.ОтметкаНезаполненного = Ложь; + КонецЦикла; + + Если ЗначениеЗаполнено(УдостоверяющийЦентр) Тогда + ИменаПолей = СервисКриптографииDSS.ПолучитьРеестрПолейУдостоверяющегоЦентра(УдостоверяющийЦентр); + Для каждого СтрокаМассива Из ИменаПолей Цикл + ЭлементФормы = ЭлементыФормы[СтрокаМассива.Представление]; + ЭлементФормы.ТолькоПросмотр = Ложь; + Если СтрокаМассива.Обязательно Тогда + ЭлементФормы.Заголовок = ЭлементФормы.Заголовок + СимволОбязательности; + ЭлементФормы.ОтметкаНезаполненного = Истина; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ЭлементыФормы.ОГРНИП.Видимость = НЕ ЭтоЮрЛицо; + ЭлементыФормы.ОГРН.Видимость = ЭтоЮрЛицо; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьОшибкуПользователю( + Ошибки, + ПолеОшибки, + ТекстДляОднойОшибки) + + ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю( + Ошибки, + ПолеОшибки, + ТекстДляОднойОшибки, + Неопределено); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ОсновнаяФорма/Form.form new file mode 100644 index 000000000..db00bed00 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ОсновнаяФорма/Form.form @@ -0,0 +1,42 @@ + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnOpen + ПриОткрытии + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ОсновнаяФорма/Module.bsl new file mode 100644 index 000000000..4d39ce35d --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ОсновнаяФорма/Module.bsl @@ -0,0 +1,19 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПоказатьПредупреждение(, НСтр("ru = 'Обработка не предназначена для интерактивного открытия.'")); + Отказ = Истина; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Attributes/СписокВыбор/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Attributes/СписокВыбор/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Attributes/СписокВыбор/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Form.form new file mode 100644 index 000000000..e91787869 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Form.form @@ -0,0 +1,1185 @@ + + + + <key>ru</key> + <value>Выбор учетной записи облачной подписи</value> + + + ГруппаВыборСостояния + 77 + + ГруппаНоваяУчетнаяЗапись + 79 + + ИсточникВыбораНовая + 83 + true + true + + true + + + ИсточникВыбора + + None + + OnChange + ИсточникВыбораПриИзменении + + + ИсточникВыбораНоваяРасширеннаяПодсказка + 85 + Label + true + true + + Left + + + + ИсточникВыбораНоваяКонтекстноеМеню + 84 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + Новая учетная запись облачной подписи + + + НовыйЛогин + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Новая учетная запись</value> + + + ГруппаНоваяУчетнаяЗаписьРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаНастройкиУчетнойЗаписи + 91 + + ИсточникВыбораСписок + 86 + true + true + + true + + + ИсточникВыбора + + None + + OnChange + ИсточникВыбораПриИзменении + + + ИсточникВыбораСписокРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + + ИсточникВыбораСписокКонтекстноеМеню + 87 + true + + RadioButtonField + Enter + true + Left + true + + + + ru + Существующие учетные записи + + + УчетнаяЗапись + + + Vertical + + + + ВыборДействия + 125 + true + true + + true + + + ВыборДействия + + None + + OnChange + ВыборДействияПриИзменении + + + ВыборДействияРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + + ВыборДействияКонтекстноеМеню + 126 + true + + RadioButtonField + Enter + true + Left + true + + Tumbler + + + ru + Выбрать из списка + + + Список + + + + + ru + Не найден в списке + + + Восстановить + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Настройки учетной записи</value> + + + ГруппаНастройкиУчетнойЗаписиРасширеннаяПодсказка + 92 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаДействия + 123 + + ГруппаСписокВыбора + 81 + + ГруппаСписокВыбораСодержимое + 96 + + ГруппаКомандыСпискаВыбора + 128 + true + true + + true + + + <key>ru</key> + <value>Команды списка</value> + + + ГруппаКомандыСпискаВыбораРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + CommandBar + + Left + Item.СписокВыбор + + + + СписокВыбор + 98 + + <key>ru</key> + <value>Выбор</value> + + true + true + + true + + + СписокВыбор + + None + + СписокВыборНаименование + 111 + true + true + + true + + + СписокВыбор.Наименование + + + СписокВыборНаименованиеРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + + СписокВыборНаименованиеКонтекстноеМеню + 112 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокВыборКоманднаяПанель + 100 + Left + true + + + Selection + СписокВыборВыбор + + + СписокВыборСтрокаПоиска + 102 + + СписокВыборСтрокаПоискаРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + + СписокВыборСтрокаПоискаКонтекстноеМеню + 103 + true + + СписокВыбор + + true + + + + СписокВыборСостояниеПросмотра + 105 + + СписокВыборСостояниеПросмотраРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + СписокВыборСостояниеПросмотраКонтекстноеМеню + 106 + true + + ViewStatusAddition + СписокВыбор + + true + + + + СписокВыборУправлениеПоиском + 108 + + СписокВыборУправлениеПоискомРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + СписокВыборУправлениеПоискомКонтекстноеМеню + 109 + true + + SearchControlAddition + СписокВыбор + + true + + + + СписокВыборРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + + СписокВыборКонтекстноеМеню + 99 + true + + HierarchicalList + true + true + true + true + 10 + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + AsFileRef + + СписокВыбор.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Список выбора содержимое</value> + + + ГруппаСписокВыбораСодержимоеРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор</value> + + + ГруппаСписокВыбораРасширеннаяПодсказка + 82 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаСоздатьУчетнуюЗапись + 89 + + Сервер + 21 + true + true + + true + + + Сервер + + ShowBottom + + СерверРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + + СерверКонтекстноеМеню + 22 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаЛогин + 73 + + Логин + 18 + true + true + + true + + + ЛогинУчетнойЗаписи + + ShowBottom + + OnChange + ЛогинПриИзменении + + + ЛогинРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ЛогинКонтекстноеМеню + 19 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Логин</value> + + + ГруппаЛогинРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Создать новую учетную запись</value> + + + ГруппаСоздатьУчетнуюЗаписьРасширеннаяПодсказка + 90 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Действия</value> + + + ГруппаДействияРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор состояния</value> + + + ГруппаВыборСостоянияРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаКоманды + 40 + + Подтвердить + 42 + true + true + + true + + + ПодтвердитьРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Form.Command.Подтвердить + Auto + true + true + true + UserCmds + Auto + + + Отмена + 44 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандыРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + + FillCheckProcessingAtServer + ОбработкаПроверкиЗаполненияНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + ЛогинУчетнойЗаписи + + <key>ru</key> + <value>Логин учетной записи</value> + + 3 + + String + + + + true + + + true + + + + Сервер + + <key>ru</key> + <value>Сервер</value> + + 4 + + String + + + + true + + + true + + + + ТаблицаСервисов + 5 + + ValueTable + + + true + + + true + + + ВнутреннийИдентификатор + 2 + + String + + + + true + + + true + + + + Представление + 3 + + String + + + + true + + + true + + + + ДанныеСервиса + 4 + + + true + + + true + + + + + ЛогинПараметр + 8 + + String + + + + true + + + true + + + + ВосстановитьУчетнуюЗапись + 2 + + Boolean + + + true + + + true + + + + ВосстановлениеНачато + 6 + + Boolean + + + true + + + true + + + + СостояниеЛогина + 13 + + Number + + 10 + + + + true + + + true + + + + ВыборНовойУчетнойЗаписи + 7 + + Boolean + + + true + + + true + + + + ИсточникВыбора + + <key>ru</key> + <value>Источник выбора</value> + + 10 + + String + + + + true + + + true + + + + СписокВыбор + + <key>ru</key> + <value>Список выбор</value> + + 9 + + DynamicList + + + true + + + true + +
      true
      + + ВЫБРАТЬ + СправочникУчетныеЗаписиDSS.Ссылка КАК Ссылка, + СправочникУчетныеЗаписиDSS.ПометкаУдаления КАК ПометкаУдаления, + СправочникУчетныеЗаписиDSS.Владелец КАК Владелец, + СправочникУчетныеЗаписиDSS.Наименование КАК Наименование, + СправочникУчетныеЗаписиDSS.Автор КАК Автор, + СправочникУчетныеЗаписиDSS.ВторичнаяАвторизация КАК ВторичнаяАвторизация, + СправочникУчетныеЗаписиDSS.ДополнительнаяИнформация КАК ДополнительнаяИнформация, + СправочникУчетныеЗаписиDSS.Комментарий КАК Комментарий, + СправочникУчетныеЗаписиDSS.Логин КАК Логин, + СправочникУчетныеЗаписиDSS.ПервичнаяАутентификация КАК ПервичнаяАутентификация, + СправочникУчетныеЗаписиDSS.СодержаниеЗаявления КАК СодержаниеЗаявления, + СправочникУчетныеЗаписиDSS.СостояниеЗаявления КАК СостояниеЗаявления, + СправочникУчетныеЗаписиDSS.Предопределенный КАК Предопределенный, + СправочникУчетныеЗаписиDSS.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, + ЭкземплярыСервераDSS.ВнутреннийИдентификатор КАК ВнутреннийИдентификатор +ИЗ + Справочник.УчетныеЗаписиDSS КАК СправочникУчетныеЗаписиDSS + ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + ПО СправочникУчетныеЗаписиDSS.Владелец = ЭкземплярыСервераDSS.Ссылка +{ГДЕ + ЭкземплярыСервераDSS.ВнутреннийИдентификатор = &ВнутреннийИдентификатор ИЛИ &ВнутреннийИдентификатор = ""} + Catalog.УчетныеЗаписиDSS + true + true + true + true + true + +
      + + УчетнаяЗапись + 11 + + CatalogRef.УчетныеЗаписиDSS + + + true + + + true + + + + НастройкиНовойУчетнойЗаписи + 12 + + Boolean + + + true + + + true + + + + ВыборДействия + + <key>ru</key> + <value>Выбор действия</value> + + 14 + + String + + + + true + + + true + + + + ДополнитьСервера + 15 + + Boolean + + + true + + + true + + + + Подтвердить + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Подтвердить + + + true + + + + Подтвердить + + + Auto + Auto + + + Продолжить + + <key>ru</key> + <value>Продолжить</value> + + 3 + + ru + Продолжить + + + true + + Auto + Auto + + + Логин + + String + + + + + СписокСерверов + + + + Сервер + + String + + + + + ВыборНовойУчетнойЗаписи + + Boolean + + + + УчетнаяЗапись + + CatalogRef.УчетныеЗаписиDSS + + + + НастройкиНовойУчетнойЗаписи + + Boolean + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Help/ru.html new file mode 100644 index 000000000..bc96a926c --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Help/ru.html @@ -0,0 +1,16 @@ +Предназначен для подбора элементов списка учетных записей облачной подписи. +
      В списке выводится:
      +
      +
      • Наименование - наименование учетной записи в БД.
      +
      Подбор учетной записи
      +
      +
      • Выделите нужную строку с учетной записью или несколько строк, нажмите Выбрать из списка. Нажмите ОК для подтверждения выбора. 
      +

      Добавление новой учетной записи

      +
      +
      • Нажмите Создать новую учетную запись, заполните необходимые поля.
      +

      См. также:

      + + + + \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Module.bsl new file mode 100644 index 000000000..ae1af6f4c --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодборУчетнойЗаписи/Module.bsl @@ -0,0 +1,502 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ЗакрытиеФормы; + +&НаКлиенте +Перем РежимПроверки; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЛогинПараметр = Параметры.Логин; + Сервер = Параметры.Сервер; + ВыборНовойУчетнойЗаписи = Параметры.ВыборНовойУчетнойЗаписи; + УчетнаяЗапись = Параметры.УчетнаяЗапись; + //@skip-warning + НастройкиНовойУчетнойЗаписи = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Параметры, "НастройкиНовойУчетнойЗаписи", Истина); + //@skip-warning + ДополнитьСервера = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Параметры, "ДополнитьСервера", Истина); + + Если Параметры.СписокСерверов <> Неопределено Тогда + + СписокСерверов = Параметры.СписокСерверов; + Для Каждого СтрокаМассива Из СписокСерверов Цикл + НоваяСтрока = ТаблицаСервисов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаМассива); + КонецЦикла; + + КонецЕсли; + + СписокВыбор.Параметры.УстановитьЗначениеПараметра("ВнутреннийИдентификатор", Сервер); + + ИнициализацияДанныхФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ЗакрытиеФормы = Ложь; + ВосстановлениеНачато = Ложь; + РежимПроверки = Ложь; + + ИзменитьОформлениеЭлементов(); + Если НастройкиНовойУчетнойЗаписи И ТаблицаСервисов.Количество() = 0 Тогда + ЗаполнитьТаблицуСерверов(); + КонецЕсли; + + ПодключитьОбработчикОжидания("ОбновитьРазмерыФормы", 0.2, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ЗакрытиеФормы, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + Если ИсточникВыбора = "УчетнаяЗапись" Тогда + ПроверяемыеРеквизиты.Добавить("УчетнаяЗапись"); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ЛогинПриИзменении(Элемент) + + ПроверитьУникальностьЛогина(); + ИзменитьОформлениеЭлементов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ИсточникВыбораПриИзменении(Элемент) + + УстановитьВидимостьДоступность(); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыборВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + ВыбратьУчетнуюЗапись(Элементы.СписокВыбор.ТекущаяСтрока); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборДействияПриИзменении(Элемент) + + УстановитьВидимостьДоступность(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Подтвердить(Команда) + + Если ИсточникВыбора = "УчетнаяЗапись" + И ВыборДействия = "Восстановить" Тогда + ПодготовитьВосстановлениеУчетнойЗаписи(); + Возврат; + КонецЕсли; + + Если НЕ ПроверитьЗаполнение() Тогда + Возврат; + КонецЕсли; + + Если ИсточникВыбора = "НовыйЛогин" Тогда + ЗакрытьФорму(СформироватьРезультат(Истина)); + Иначе + ВыбратьУчетнуюЗапись(Элементы.СписокВыбор.ТекущаяСтрока); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ОформлениеФормы + +&НаКлиенте +Процедура ОбновитьРазмерыФормы() + + ИмяЭлемента = "ГруппаСписокВыбораСодержимое"; + + Элементы[ИмяЭлемента].Видимость = НЕ Элементы[ИмяЭлемента].Видимость; + Элементы[ИмяЭлемента].Видимость = НЕ Элементы[ИмяЭлемента].Видимость; + +КонецПроцедуры + +&НаКлиенте +Функция ЕстьОшибкаСерверов() + + ЕстьОшибка = ТаблицаСервисов.Количество() = 0 И НастройкиНовойУчетнойЗаписи; + + Возврат ЕстьОшибка; + +КонецФункции + +&НаКлиенте +Процедура ИзменитьОформлениеЭлементов() + + ШаблонОшибки = "%1"; + ПодсказкаСервера = ""; + ПодсказкаЛогина = ""; + + Если ЕстьОшибкаСерверов() Тогда + ПодсказкаСервера = СтрШаблон(ШаблонОшибки, НСтр("ru = 'Не удалось получить список доступных серверов облачной подписи. + |Повторите попытку позже или обратитесь в службу поддержки.'")); + КонецЕсли; + + Если СостояниеЛогина = 1 Тогда + ПодсказкаЛогина = СтрШаблон(ШаблонОшибки, НСтр("ru = 'Обнаружена учетная запись с таким логином. Выберите другой логин или + |восстановите информацию о ней в ИБ.'")); + ИначеЕсли СостояниеЛогина = 2 Тогда + ПодсказкаЛогина = СтрШаблон(ШаблонОшибки, НСтр("ru = 'Такая учетная запись уже зарегистрирована в этой ИБ'")); + КонецЕсли; + + Элементы.Логин.РасширеннаяПодсказка.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ПодсказкаЛогина); + Элементы.Сервер.РасширеннаяПодсказка.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока(ПодсказкаСервера); + + УстановитьВидимостьДоступность(); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьВидимостьДоступность() + + ЕстьОшибка = ЕстьОшибкаСерверов(); + Редактируется = НЕ РежимПроверки И НЕ ВосстановлениеНачато; + + Элементы.Сервер.Видимость = (ТаблицаСервисов.Количество() > 1 ИЛИ ЕстьОшибка); + Элементы.ГруппаНоваяУчетнаяЗапись.Видимость = ВыборНовойУчетнойЗаписи; + Элементы.ИсточникВыбораСписок.Видимость = ВыборНовойУчетнойЗаписи; + Элементы.ВыборДействия.Видимость = НастройкиНовойУчетнойЗаписи; + Элементы.ГруппаКомандыСпискаВыбора.Видимость = НЕ НастройкиНовойУчетнойЗаписи И НЕ ВыборНовойУчетнойЗаписи; + Элементы.ГруппаКоманды.Видимость = НастройкиНовойУчетнойЗаписи ИЛИ ВыборНовойУчетнойЗаписи; + Элементы.ГруппаДействия.ТекущаяСтраница = ?(ВыборДействия = "Список", Элементы.ГруппаСписокВыбора, Элементы.ГруппаСоздатьУчетнуюЗапись); + + Элементы.ИсточникВыбораСписок.ТолькоПросмотр = НЕ Редактируется; + Элементы.ИсточникВыбораНовая.ТолькоПросмотр = НЕ Редактируется; + Элементы.Логин.ТолькоПросмотр = НЕ Редактируется ИЛИ ЕстьОшибка; + + Элементы.Подтвердить.Доступность = Редактируется; + Элементы.ГруппаКомандыСпискаВыбора.Доступность = Редактируется; + Элементы.СписокВыбор.Доступность = Редактируется И ИсточникВыбора <> "НовыйЛогин"; + Элементы.ГруппаСоздатьУчетнуюЗапись.Доступность = Редактируется И ИсточникВыбора <> "НовыйЛогин"; + Элементы.ВыборДействия.Доступность = Редактируется И ИсточникВыбора <> "НовыйЛогин"; + +КонецПроцедуры + +#КонецОбласти + +#Область ДействияФормы + +&НаКлиенте +Процедура ЗакрытьФорму(РезультатВыбора = Неопределено) + + ЗакрытиеФормы = Истина; + Если РезультатВыбора = Неопределено Тогда + РезультатВыбора = СформироватьРезультат(Ложь); + КонецЕсли; + + Закрыть(РезультатВыбора); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьУчетнуюЗапись(ТекущаяУчетнаяЗапись) + + УчетнаяЗапись = ТекущаяУчетнаяЗапись; + ИсточникВыбора = "УчетнаяЗапись"; + ЗакрытьФорму(СформироватьРезультат(Истина, УчетнаяЗапись)); + +КонецПроцедуры + +&НаКлиенте +Функция СформироватьРезультат(Выполнено, ТекущаяУчетнаяЗапись = Неопределено) + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Выполнено); + + Если Выполнено Тогда + НашлиСервер = НайтиСерверОблачнойПодписи(Сервер, "Представление"); + Результат.Вставить("ИсточникВыбора", ИсточникВыбора); + Результат.Вставить("Логин", ЛогинУчетнойЗаписи); + Результат.Вставить("Сервер", Сервер); + Результат.Вставить("СерверПредставление", НашлиСервер); + Результат.Вставить("УчетнаяЗапись", ТекущаяУчетнаяЗапись); + Если ЗначениеЗаполнено(УчетнаяЗапись) Тогда + ДанныеСервера = ДанныеУчетнойЗаписи(УчетнаяЗапись); + Результат.Вставить("СерверПредставление", ДанныеСервера.Представление); + Результат.Вставить("Логин", ДанныеСервера.Логин); + Результат.Вставить("Сервер", ДанныеСервера.Сервер); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьСписокСерверов() + + Если ДополнитьСервера Тогда + ВсеСервера = СервисКриптографииDSS.ПолучитьВсеСерверы(); + Для Каждого СтрокаТаблицы Из ВсеСервера Цикл + Если ЗначениеЗаполнено(СтрокаТаблицы.ВнутреннийИдентификатор) Тогда + НашлиСтроки = ТаблицаСервисов.НайтиСтроки(Новый Структура("ВнутреннийИдентификатор", СтрокаТаблицы.ВнутреннийИдентификатор)); + Иначе + НашлиСтроки = ТаблицаСервисов.НайтиСтроки(Новый Структура("Представление", СтрокаТаблицы.Наименование)); + КонецЕсли; + + Если НашлиСтроки.Количество() = 0 Тогда + НоваяСтрока = ТаблицаСервисов.Добавить(); + НоваяСтрока.ВнутреннийИдентификатор = СтрокаТаблицы.Ссылка.УникальныйИдентификатор(); + НоваяСтрока.Представление = СтрокаТаблицы.Наименование; + НоваяСтрока.ДанныеСервиса = СтрокаТаблицы.Ссылка; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + СписокВыбора = Элементы.Сервер.СписокВыбора; + + СписокВыбора.Очистить(); + + Для Каждого СтрокаМассива Из ТаблицаСервисов Цикл + СписокВыбора.Добавить(СтрокаМассива.ВнутреннийИдентификатор, СтрокаМассива.Представление); + КонецЦикла; + + Если ТаблицаСервисов.Количество() = 1 И ПустаяСтрока(Сервер) Тогда + Сервер = ТаблицаСервисов[0].ВнутреннийИдентификатор; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(НайтиСерверОблачнойПодписи(Сервер, "АдресСервера")) Тогда + Сервер = ""; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ИнициализацияДанныхФормы() + + ЗаполнитьСписокСерверов(); + + ЛогинУчетнойЗаписи = ЛогинПараметр; + ВосстановлениеНачато = Ложь; + ВыборДействия = "Список"; + + Если ЗначениеЗаполнено(ЛогинУчетнойЗаписи) Тогда + Элементы.Логин.СписокВыбора.Добавить(ЛогинУчетнойЗаписи); + КонецЕсли; + + Если ЗначениеЗаполнено(УчетнаяЗапись) ИЛИ НЕ ВыборНовойУчетнойЗаписи Тогда + Элементы.СписокВыбор.ТекущаяСтрока = УчетнаяЗапись; + ИсточникВыбора = "УчетнаяЗапись"; + Иначе + ИсточникВыбора = "НовыйЛогин"; + КонецЕсли; + + Элементы.ГруппаДействия.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + +КонецПроцедуры + +#КонецОбласти + +#Область РежимВосстановления + +&НаКлиенте +Процедура ПодготовитьВосстановлениеУчетнойЗаписи() + + НашлиУчетку = НайтиУчетнуюЗапись(); + Если ЗначениеЗаполнено(НашлиУчетку) Тогда + ВыбратьУчетнуюЗапись(НашлиУчетку); + Иначе + ПодготовитьВосстановлениеУчетнойЗаписиПослеПроверки(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПодготовитьВосстановлениеУчетнойЗаписиПослеПроверки() + + ВосстановлениеНачато = Истина; + ИзменитьОформлениеЭлементов(); + + ДанныеСервера = НайтиСерверОблачнойПодписи(Сервер); + + ОписаниеСледующее = Новый ОписаниеОповещения("ПодготовитьВосстановлениеУчетнойЗаписиЗавершение", ЭтотОбъект); + СервисКриптографииDSSКлиент.ВосстановитьУчетнуюЗапись(ОписаниеСледующее, ДанныеСервера, ЛогинУчетнойЗаписи); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодготовитьВосстановлениеУчетнойЗаписиЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт + + ВосстановлениеНачато = Ложь; + ИзменитьОформлениеЭлементов(); + + Если РезультатВыполнения.Выполнено Тогда + ВыбратьУчетнуюЗапись(РезультатВыполнения.Результат); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область РежимСоздания + +&НаСервере +Функция СервисРеестраСерверовОблачнойПодписи() + + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор); + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("АдресРезультата", АдресРезультата); + + Возврат СервисКриптографииDSSСлужебный.ВыполнитьВФоне("Обработки.УправлениеПодключениемDSS.ОбменССерверомСписокСерверовОблачнойПодписи", ПараметрыВызова); + +КонецФункции + +&НаКлиенте +Процедура ЗаполнитьТаблицуСерверов() + + ДлительнаяОперация = СервисРеестраСерверовОблачнойПодписи(); + ОповещениеСледущее = Новый ОписаниеОповещения("ЗаполнитьТаблицуСерверовЗавершение", ЭтотОбъект); + СервисКриптографииDSSСлужебныйКлиент.ОжидатьЗавершенияВыполненияВФоне(ОповещениеСледущее, ДлительнаяОперация); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьТаблицуСерверовЗавершение(ОтветСервиса, ПараметрыЦикла) Экспорт + + РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(ОтветСервиса, ПараметрыЦикла); + Если РезультатВыполнения <> Неопределено Тогда + + ЗаполнитьТаблицуФормы(РезультатВыполнения); + + КонецЕсли; + + ИзменитьОформлениеЭлементов(); + +КонецПроцедуры + +// Параметры: +// СписокСерверов - Массив из Структура: +// * Наименование - Строка +// * ВнутреннийИдентификатор - Строка +// +&НаКлиенте +Процедура ЗаполнитьТаблицуФормы(СписокСерверов) + + Для Каждого СтрокаМассива Из СписокСерверов Цикл + НоваяСтрока = ТаблицаСервисов.Добавить(); + НоваяСтрока.ДанныеСервиса = СтрокаМассива; + НоваяСтрока.Представление = СтрокаМассива.Наименование; + НоваяСтрока.ВнутреннийИдентификатор = СтрокаМассива.ВнутреннийИдентификатор; + КонецЦикла; + + ЗаполнитьСписокСерверов(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьУникальностьЛогина() + + НашлиУчетнуюЗапись = НайтиУчетнуюЗапись(); + Если ЗначениеЗаполнено(НашлиУчетнуюЗапись) Тогда + СостояниеЛогина = 2; + Иначе + СостояниеЛогина = 0; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Общие + +&НаСервере +Функция НайтиУчетнуюЗапись() + + ФильтрПоиска = Новый Соответствие; + ФильтрПоиска.Вставить("Владелец.ВнутреннийИдентификатор", Сервер); + ФильтрПоиска.Вставить("Логин", ЛогинУчетнойЗаписи); + + НашлиУчетнуюЗапись = СервисКриптографииDSS.НайтиУчетнуюЗапись(ФильтрПоиска); + + Возврат НашлиУчетнуюЗапись; + +КонецФункции + +&НаСервере +Функция НайтиСерверОблачнойПодписи(ИдентификаторСервиса, ИмяПоля = "ДанныеСервиса") + + Результат = Неопределено; + + НашлиСтроки = ТаблицаСервисов.НайтиСтроки(Новый Структура("ВнутреннийИдентификатор", ИдентификаторСервиса)); + Если НашлиСтроки.Количество() <> 0 Тогда + Если ИмяПоля = "АдресСервера" Тогда + Результат = НашлиСтроки[0].ДанныеСервиса.АдресСервера; + ИначеЕсли ИмяПоля = "ДанныеСервиса" Тогда + Результат = НашлиСтроки[0].ДанныеСервиса; + ИначеЕсли ИмяПоля = "Представление" Тогда + Результат = НашлиСтроки[0].Представление; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ДанныеУчетнойЗаписи(ТекущаяУчетнаяЗапись) + + Результат = Новый Структура; + Результат.Вставить("Логин", УчетнаяЗапись.Логин); + Результат.Вставить("Представление", СокрЛП(УчетнаяЗапись.Владелец)); + Результат.Вставить("Сервер", ""); + + НашлиУчетнуюЗапись = СервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи(ТекущаяУчетнаяЗапись); + Если НашлиУчетнуюЗапись.Количество() > 0 Тогда + Результат.Сервер = НашлиУчетнуюЗапись[0].ВнутреннийИдентификатор; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Form.form new file mode 100644 index 000000000..fcecdee7a --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Form.form @@ -0,0 +1,289 @@ + + + + <key>ru</key> + <value>Документы</value> + + + СписокФайлов + 1 + + <key>ru</key> + <value>Файлов</value> + + true + true + + true + + + СписокФайлов + + None + + СписокФайловНаименованиеФайла + 14 + true + true + + true + + + СписокФайлов.НаименованиеФайла + + + СписокФайловНаименованиеФайлаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокФайловНаименованиеФайлаКонтекстноеМеню + 15 + true + + LabelField + true + Auto + true + true + Left + true + Show + Always + + true + true + + Style.FieldSelectionBackColor + + + + + СписокФайловКоманднаяПанель + 3 + Left + + + Selection + СписокФайловВыбор + + + СписокФайловСтрокаПоиска + 5 + + СписокФайловСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СписокФайловСтрокаПоискаКонтекстноеМеню + 6 + true + + СписокФайлов + + true + + + + СписокФайловСостояниеПросмотра + 8 + + СписокФайловСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокФайловСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + СписокФайлов + + true + + + + СписокФайловУправлениеПоиском + 11 + + СписокФайловУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокФайловУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + СписокФайлов + + true + + + + СписокФайловРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СписокФайловКонтекстноеМеню + 2 + true + + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + true + true + AsFileRef + true + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + СписокФайлов + + <key>ru</key> + <value>Список файлов</value> + + 2 + + ValueTable + + + true + + + true + + + НаименованиеФайла + + <key>ru</key> + <value>Наименование</value> + + 1 + + String + + + + true + + + true + + + + НавигационнаяСсылка + 2 + + String + + + + true + + + true + + + + + РежимВыбора + + Boolean + + + + СписокДокументов + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Help/ru.html new file mode 100644 index 000000000..aaa35e4d6 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Help/ru.html @@ -0,0 +1,11 @@ + + +

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

      + +

      В списке выводится:

      + +
      • Наименование – наименование файла в виде ссылки, + по которой можно открыть документ. 
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Module.bsl new file mode 100644 index 000000000..cd0d5edd3 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборНавигационнойСсылки/Module.bsl @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Элементы.СписокФайлов.РежимВыбора = Параметры.РежимВыбора; + + Если Параметры.СписокДокументов <> Неопределено Тогда + Для каждого СтрокаМассива Из Параметры.СписокДокументов Цикл + НоваяСтрока = СписокФайлов.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаМассива); + НоваяСтрока.НаименованиеФайла = СервисКриптографииDSSПодтверждениеСервер.ПредставлениеДокумента(СтрокаМассива); + КонецЦикла; + + Заголовок = "Документы (" + XMLСтрока(СписокФайлов.Количество()) + ")"; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ТекущаяСтрока = Элементы.СписокФайлов.ТекущиеДанные; + + Если ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Элементы.СписокФайлов.РежимВыбора Тогда + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + ОтветПользователя.Вставить("Результат", ТекущаяСтрока.НавигационнаяСсылка); + ЗакрытьФорму(ОтветПользователя); + Иначе + СервисКриптографииDSSКлиент.ПерейтиПоСсылке(ТекущаяСтрока.НавигационнаяСсылка); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Form.form new file mode 100644 index 000000000..0dc77c8e4 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Form.form @@ -0,0 +1,1017 @@ + + + + <key>ru</key> + <value>Выберите другой способ подтверждения</value> + + + ГруппаСтраницы + 36 + + ГруппаНедоступны + 38 + + ДекорацияНедоступны + 42 + + <key>ru</key> + <value>Нет других способов подтверждения доступных пользователю.</value> + + true + true + + true + + + ДекорацияНедоступныРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ДекорацияНедоступныКонтекстноеМеню + 43 + true + + Label + true + true + + Center + Center + + + true + true + + true + + + <key>ru</key> + <value>Недоступны</value> + + + ГруппаНедоступныРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаВыбор + 40 + + ГруппаОфлайн + 1 + + ОфлайнПодтверждение + 26 + true + true + + true + + + ОфлайнПодтверждениеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Hyperlink + Form.Command.ОфлайнПодтверждение + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаОфлайнПодсказка + 70 + + ДекорацияОфлайнПодсказка + 72 + + <key>ru</key> + <value>При отсутствии доступа в интернет с мобильного устройства</value> + + true + true + + true + + Button + + ДекорацияОфлайнПодсказкаРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ДекорацияОфлайнПодсказкаКонтекстноеМеню + 73 + true + + Label + true + + 128 + 122 + 89 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Офлайн подсказка</value> + + + ГруппаОфлайнПодсказкаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Офлайн</value> + + + ГруппаОфлайнРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаМобильноеПриложение + 3 + + myDSS + 28 + true + true + + true + + + myDSSРасширеннаяПодсказка + 29 + + <key>ru</key> + <value>Информацию по использованию мобильного приложения можно прочитать перейдя по <link http://1c.ru>ссылке</></value> + + true + Label + true + true + + Left + + + Hyperlink + Form.Command.myDSS + Normal + Auto + true + true + UserCmds + Button + Auto + + + ГруппаМобильноеПриложениеПодсказка + 60 + + ДекорацияМобильноеПриложениеПодсказка + 62 + + <key>ru</key> + <value>Специальное мобильное приложение для подтверждения операций пользователем</value> + + true + true + + true + + + ДекорацияМобильноеПриложениеПодсказкаРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ДекорацияМобильноеПриложениеПодсказкаКонтекстноеМеню + 63 + true + + Label + true + + 128 + 122 + 89 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Мобильное приложение подсказка</value> + + + ГруппаМобильноеПриложениеПодсказкаРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Мобильное приложение</value> + + + ГруппаМобильноеПриложениеРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаМобильноеПриложение1 + 5 + + AirKey + 30 + true + true + + true + + + AirKeyРасширеннаяПодсказка + 31 + + <key>ru</key> + <value>Информацию по использованию мобильного приложения можно прочитать перейдя по <link http://1c.ru>ссылке</></value> + + true + Label + true + true + + Left + + + Hyperlink + Form.Command.AirKey + Normal + Auto + true + true + UserCmds + Button + Auto + + + ГруппаГруппаМобильноеПриложение1Подсказка + 65 + + ДекорацияМобильноеПриложение1Подсказка + 67 + + <key>ru</key> + <value>Специальное мобильное приложение для подтверждения операций пользователем</value> + + true + true + + true + + + ДекорацияМобильноеПриложение1ПодсказкаРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + ДекорацияМобильноеПриложение1ПодсказкаКонтекстноеМеню + 68 + true + + Label + true + + 128 + 122 + 89 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Мобильное приложение подсказка</value> + + + ГруппаГруппаМобильноеПриложение1ПодсказкаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Мобильное приложение</value> + + + ГруппаМобильноеПриложение1РасширеннаяПодсказка + 6 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаТелефон + 7 + + SMS + 32 + true + true + + true + + + SMSРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Hyperlink + Form.Command.SMS + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаТелефонПодсказка + 75 + + ДекорацияТелефонПодсказка + 77 + + <key>ru</key> + <value>SMS</value> + + true + true + + true + + Button + + ДекорацияТелефонПодсказкаРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ДекорацияТелефонПодсказкаКонтекстноеМеню + 78 + true + + Label + true + + 128 + 122 + 89 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Телефон подсказка</value> + + + ГруппаТелефонПодсказкаРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Телефон</value> + + + ГруппаТелефонРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаПочта + 9 + + Email + 34 + true + true + + true + + + EmailРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Hyperlink + Form.Command.Email + Normal + Auto + true + true + UserCmds + Auto + + + ГруппаПочтаПодсказка + 80 + + ДекорацияПочтаПодсказка + 82 + + <key>ru</key> + <value>Email</value> + + true + true + + true + + Button + + ДекорацияПочтаПодсказкаРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ДекорацияПочтаПодсказкаКонтекстноеМеню + 83 + true + + Label + true + + 128 + 122 + 89 + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Почта подсказка</value> + + + ГруппаПочтаПодсказкаРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Почта</value> + + + ГруппаПочтаРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор</value> + + + ГруппаВыборРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + true + true + + ГруппаСтраницыРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 50 + 25 + LockOwner + true + true + Vertical + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + СписокСпособов + 2 + + ValueList + + + true + + + true + + + + + + + ДанныеПодтверждения + 3 + + + true + + + true + + + + КоличествоВСписке + 4 + + Number + + 10 + + + + true + + + true + + + + НастройкиПользователя + 5 + + + true + + + true + + + + ВторичнаяАвторизация + 6 + + EnumRef.СпособыАвторизацииDSS + + + true + + + true + + + + ОфлайнПодтверждение + + <key>ru</key> + <value>Офлайн-подтверждение</value> + + 1 + + true + + + + ОфлайнПодтверждение + + + Auto + Auto + + + myDSS + + <key>ru</key> + <value>Мобильное приложение myDSS</value> + + 2 + + true + + + + МобильноеПриложение + + + Auto + Auto + + + AirKey + + <key>ru</key> + <value>Мобильное приложение AirKey DSS</value> + + 3 + + ru + Мобильное приложение для безопасного онлайн взаимодействия с пользователем + + + true + + + + МобильноеПриложение1 + + + Auto + Auto + + + SMS + + <key>ru</key> + <value>Одноразовый пароль на мобильный телефон</value> + + 4 + + ru + SMS + + + true + + + + Телефон + + + Auto + Auto + + + Email + + <key>ru</key> + <value>Одноразовый пароль на электронную почту</value> + + 5 + + ru + Email + + + true + + + + Почта + + + Auto + Auto + + + СписокСпособов + + + + ДанныеПодтверждения + + + + НастройкиПользователя + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Help/ru.html new file mode 100644 index 000000000..1947a01c3 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Help/ru.html @@ -0,0 +1,23 @@ + + + + +

      Предназначена для выбора способа подтверждения +операции в случае, если в настройках учетной записи облачной подписи не был +выбран способ по-умолчанию.

      + +

      Наполнение списка зависит от настроек сервера +облачной подписи и ограничений со стороны 1С.

      + +

      Варианты выбор способа

      + +
      • Мобильное приложение myDSS специальное мобильное + приложение уставливаемое на устройство для взаимодействия с сервером
      • +
      • Мобильное приложение AirKey DSS специальное мобильное приложение уставливаемое на + устройство для взаимодействия с сервером
      • +
      • Одноразовый пароль на мобильный телефон пароль, полученный в SMS + сообщении на + мобильный телефон.
      • +
      • Одноразовый пароль на электронную почту пароль, отправленный в письме + на электронную почту.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Module.bsl new file mode 100644 index 000000000..399a751b6 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииВыборСпособа/Module.bsl @@ -0,0 +1,224 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СписокСпособов.Очистить(); + СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_AirKeyLite, "ГруппаМобильноеПриложение1"); + СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение, "ГруппаМобильноеПриложение"); + СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение, "ГруппаОфлайн"); + СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_СМС, "ГруппаТелефон"); + СписокСпособов.Добавить(Перечисления.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта, "ГруппаПочта"); + + КоличествоВСписке = 0; + + Если Параметры.СписокСпособов <> Неопределено Тогда + Для каждого СтрокаМассива Из Параметры.СписокСпособов Цикл + НашлиЗначение = СписокСпособов.НайтиПоЗначению(СтрокаМассива); + Если НашлиЗначение <> Неопределено Тогда + НашлиЗначение.Пометка = Истина; + КоличествоВСписке = КоличествоВСписке + 1; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ДанныеПодтверждения = Параметры.ДанныеПодтверждения; + НастройкиПользователя = Параметры.НастройкиПользователя; + + ВторичнаяАвторизация = СпособАвторизацииПользователя(ДанныеПодтверждения); + + НашлиЗначение = СписокСпособов.НайтиПоЗначению(ВторичнаяАвторизация); + Если НашлиЗначение <> Неопределено + И НашлиЗначение.Пометка Тогда + НашлиЗначение.Пометка = Ложь; + КоличествоВСписке = КоличествоВСписке - 1; + КонецЕсли; + + УправлениеФормой(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОфлайнПодтверждение(Команда) + + ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение")); + +КонецПроцедуры + +&НаКлиенте +Процедура МобильноеПриложение1(Команда) + + ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_AirKeyLite")); + +КонецПроцедуры + +&НаКлиенте +Процедура Почта(Команда) + + ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта")); + +КонецПроцедуры + +&НаКлиенте +Процедура МобильноеПриложение(Команда) + + ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение")); + +КонецПроцедуры + +&НаКлиенте +Процедура Телефон(Команда) + + ВыборПользователя(ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС")); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ВыборПользователя(СпособВыбора) + + ВыбранныйСпособ = СпособВыбора; + Если ВыбранныйСпособ <> ВторичнаяАвторизация + И ДанныеПодтверждения <> Неопределено Тогда + ДанныеПодтверждения.ВторичнаяАвторизация = ВыбранныйСпособ; + + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + ОтветПользователя.Вставить("Результат", ВыбранныйСпособ); + ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + Иначе + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + КонецЕсли; + + ЗакрытьФорму(ОтветПользователя); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьПредставлениеТелефона() + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + Если НастройкиПользователя <> Неопределено И ЗначениеЗаполнено(НастройкиПользователя.Телефон) Тогда + Результат = НСтр("ru = 'Временный пароль будет отправлена номер мобильного телефона'", КодЯзыка) + + " " + СервисКриптографииDSSКлиентСервер.ПредставлениеТелефона(НастройкиПользователя.Телефон); + Иначе + Результат = НСтр("ru = 'Временный пароль будет отправлен на зарегистрированный номер мобильного телефона.'", КодЯзыка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПолучитьПредставлениеПочты() + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + Если НастройкиПользователя <> Неопределено И ЗначениеЗаполнено(НастройкиПользователя.ЭлектроннаяПочта) Тогда + Результат = НСтр("ru = 'Временный пароль будет отправлен адрес электронной почты'", КодЯзыка) + + " " + СервисКриптографииDSSКлиентСервер.ПредставлениеАдресаПочты(НастройкиПользователя.ЭлектроннаяПочта); + Иначе + Результат = НСтр("ru = 'Временный пароль будет отправлен на зарегистрированный адрес электронной почты.'", КодЯзыка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура УправлениеФормой() + + Для каждого СтрокаСписка Из СписокСпособов Цикл + Элементы[СтрокаСписка.Представление].Видимость = СтрокаСписка.Пометка; + КонецЦикла; + + Элементы.ГруппаСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + + Если КоличествоВСписке = 0 Тогда + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаНедоступны; + Иначе + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВыбор; + КонецЕсли; + + Элементы.ДекорацияТелефонПодсказка.Заголовок = ПолучитьПредставлениеТелефона(); + Элементы.ДекорацияПочтаПодсказка.Заголовок = ПолучитьПредставлениеПочты(); + +КонецПроцедуры + +// Параметры: +// ДанныеПодтверждения - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// +// Возвращаемое значение: +// ПеречислениеСсылка.СпособыАвторизацииDSS +// +&НаСервере +Функция СпособАвторизацииПользователя(ДанныеПодтверждения) + + Если ТипЗнч(ДанныеПодтверждения) = Тип("Структура") Тогда + Результат = ДанныеПодтверждения.ВторичнаяАвторизация; + Иначе + Результат = Перечисления.СпособыАвторизацииDSS.ПустаяСсылка(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Form.form new file mode 100644 index 000000000..875f07e35 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Form.form @@ -0,0 +1,955 @@ + + + + <key>ru</key> + <value>Подтверждение криптооперации</value> + + + ГруппаШапка + 1 + + ГруппаИнформацияСервера + 47 + + ДекорацияПустая3 + 49 + true + true + + true + + + ДекорацияПустая3РасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + ДекорацияПустая3КонтекстноеМеню + 50 + true + + Label + 14 + true + true + + Left + + + + ИнформацияСервера + 52 + true + true + + true + + + ИнформацияСервера + + true + None + + ИнформацияСервераРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ИнформацияСервераКонтекстноеМеню + 53 + true + + InputField + Enter + true + Left + true + + true + 2 + true + true + true + true + true + + Style.ПодтверждениеОперацииОписаниеЦвет + + + Style.FormBackColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Информация</value> + + + ГруппаИнформацияСервераРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + + ГруппаШапкаРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСведения + 15 + + Сертификат + 3 + true + true + + true + + + ПредставлениеСертификата + + + СертификатРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + СертификатКонтекстноеМеню + 4 + true + + LabelField + true + Enter + true + Left + true + + + Click + СертификатНажатие + + true + true + true + + + + ГруппаСпособыПодтверждения + 23 + + СпособПодтверждения + 6 + true + true + + true + + + СпособПодтверждения + + Button + + OnChange + СпособПодтвержденияПриИзменении + + + СпособПодтвержденияРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СпособПодтвержденияКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Способы</value> + + + ГруппаСпособыПодтвержденияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + Документы + 9 + true + true + + true + + + ПредставлениеДокументов + + + ДокументыРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ДокументыКонтекстноеМеню + 10 + true + + LabelField + Enter + true + Left + true + + + URLProcessing + ДокументыОбработкаНавигационнойСсылки + + + + + ДекорацияПустая2 + 44 + true + true + + true + + + ДекорацияПустая2РасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ДекорацияПустая2КонтекстноеМеню + 45 + true + + Label + true + true + + Left + + + + ГруппаКодПодтверждения + 37 + + КодПодтверждения + 29 + true + true + + true + + + КодПодтверждения + + Left + + КодПодтвержденияРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + КодПодтвержденияКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + true + false + true + true + true + true + OnValueChange + Normal + + + + ОК + 32 + true + true + + true + + + ОКРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + UsualButton + Form.Command.ОК + Auto + true + 9 + true + true + UserCmds + Auto + + + Повторить + 39 + + <key>ru</key> + <value>Выслать заново</value> + + true + true + + true + + + ПовторитьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + UsualButton + Form.Command.Повторить + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Код</value> + + + ГруппаКодПодтвержденияРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Сведения</value> + + + ГруппаСведенияРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ДекорацияПустая1 + 55 + true + true + + true + + + ДекорацияПустая1РасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ДекорацияПустая1КонтекстноеМеню + 56 + true + + Label + true + true + + Left + + + + ГруппаПодвал + 27 + + Осталось + 20 + true + true + + true + + + Осталось + + None + + ОсталосьРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ОсталосьКонтекстноеМеню + 21 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ГруппаКоманды + 58 + + Отмена + 60 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + Right + + ГруппаКомандыРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Подвал</value> + + + ГруппаПодвалРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + DontUse + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 55 + LockOwner + true + true + Vertical + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + КодПодтверждения + + <key>ru</key> + <value>Код подтверждения</value> + + 2 + + String + + + + true + + + true + + + + Сертификат + 3 + + + true + + + true + + + + ДанныеДокументов + 4 + + + true + + + true + + + + Осталось + + <key>ru</key> + <value>Осталось</value> + + 5 + + String + + 33 + + + + true + + + true + + + + СпособПодтверждения + + <key>ru</key> + <value>Способ подтверждения</value> + + 6 + + EnumRef.СпособыАвторизацииDSS + + + true + + + true + + + + ДанныеПодтверждения + 7 + + + true + + + true + + + + НастройкиПользователя + 8 + + + true + + + true + + + + ОжидатьВыполнения + 9 + + Boolean + + + true + + + true + + + + ПредставлениеДокументов + + <key>ru</key> + <value>Документы</value> + + 10 + + FormattedString + + + true + + + true + + + + ПредставлениеСертификата + + <key>ru</key> + <value>Сертификат</value> + + 11 + + String + + + + true + + + true + + + + ВремяИстекло + 12 + + Boolean + + + true + + + true + + + + ИнформацияСервера + + <key>ru</key> + <value>Информация сервера</value> + + 13 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 2 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Повторить + + <key>ru</key> + <value>Повторить</value> + + 3 + + ru + Повторить + + + true + + + + Повторить + + + Auto + Auto + + + ДанныеПодтверждения + + + + Сертификат + + + + ДанныеДокументов + + + + НастройкиПользователя + + + + ЗаголовокФормы + + String + + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Help/ru.html new file mode 100644 index 000000000..8295d9d20 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Help/ru.html @@ -0,0 +1,24 @@ + + + + +

      Предназначена для вторичного подтверждения +операций в сервис облачной подписи для варианта получения кода по SMS +или Email.

      + +

      Порядок работы

      + +
      • В поле сертификат указывается информация о сертификате, используемый + при операции.
      • +
      • В поле способ подтверждения можно изменить текущий способ на любой + доступный в списке выбора. 
      • +
      • В поле документы указывается список документов, с которыми проводится + операция. Доступно только для операции создание электронной подписи.
      • +
      • В поле код подтверждения необходимо ввести одноразовый пароль, полученный + в SMS или Email. 
      • +
      • Кнопка повторить позволяет запросить получение повторного временного + пароля. Внимание получение повторного одноразового пароля ограничено по + времени.
      • +
      • В нижней части выводиться время, + оставшееся для окончания процедуры подтверждения операции
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Module.bsl new file mode 100644 index 000000000..e41a79f02 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииКодПодтверждения/Module.bsl @@ -0,0 +1,303 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.ДанныеПодтверждения = Неопределено Тогда + Параметры.ДанныеПодтверждения = СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); + ВремяИстекло = Истина; + КонецЕсли; + + Если Параметры.НастройкиПользователя = Неопределено Тогда + Параметры.НастройкиПользователя = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + ВремяИстекло = Истина; + КонецЕсли; + + СервисКриптографииDSSПодтверждениеСервер.ПодготовитьФормуПодтвержденияПриСоздании(ЭтотОбъект); + + НазначитьКлючСохраненияФормы(); + НастроитьУсловноеОформление(); + УправлениеФормой(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + ПриНачалеПодтверждения(); + СервисКриптографииDSSПодтверждениеКлиент.ОформитьВремяИстекло(Элементы.ГруппаПодвал, ВремяИстекло); + СервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект, "СпособПодтверждения"); + + СервисКриптографииDSSПодтверждениеКлиент.ПодключитьОжидание(ЭтотОбъект) + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ВРег(ИмяСобытия) = ВРег("ПодтверждениеЗакрытьФорму") И Источник = УникальныйИдентификатор Тогда + ЗакрытьФорму(Параметр); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СертификатНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь); + ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор; + ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект); + + СервисКриптографииDSSКлиент.ПоказатьСертификат( + Неопределено, + НастройкиПользователя, + Новый Структура("Отпечаток", Сертификат.Отпечаток), + ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура СпособПодтвержденияПриИзменении(Элемент) + + СервисКриптографииDSSПодтверждениеКлиент.ПриИзмененииСпособаПодтверждения(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ДокументыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СервисКриптографииDSSПодтверждениеКлиент.ОбработкаНавигационнойСсылкиДокументов(НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка, ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ДанныеПодтверждения.ЭтапЦикла = "ВводКода"; + ДанныеПодтверждения.КодПользователя = КодПодтверждения; + + ОжидатьВыполнения = Истина; + ОтправкаЗапросаКлиент(); + +КонецПроцедуры + +&НаКлиенте +Процедура Повторить(Команда) + + ПовторитьЗапрос(ДанныеПодтверждения); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Параметры: +// ТекущееПодтверждение - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// +&НаКлиенте +Процедура ПовторитьЗапрос(ТекущееПодтверждение) + + ТекущееПодтверждение.ЭтапЦикла = "Начало"; + ТекущееПодтверждение.Идентификатор = ДанныеПодтверждения.ИдентификаторТранзакции; + ОтправкаЗапросаКлиент(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ДанныеПодтверждения.ЭтапЦикла = "Окончание"; + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработчикОжидания() + + ОбработкаЦиклаОжидания(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаЦиклаОжидания() + + Разница = 0; + Если ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Разница = ДанныеПодтверждения.СрокДействия - СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + КонецЕсли; + + Если Разница > 0 Тогда + Осталось = СервисКриптографииDSSПодтверждениеКлиент.РазницаФормат(Разница); + ИначеЕсли НЕ ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Осталось = ""; + Иначе + ВремяИстекло = Истина; + ПриНачалеПодтверждения(); + Осталось = НСтр("ru = 'Время истекло'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()); + КонецЕсли; + + СервисКриптографииDSSПодтверждениеКлиент.ПодключитьОжидание(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправкаЗапросаКлиент() + + ОбработчикОтвета = Новый ОписаниеОповещения("ПолучениеРезультатаФоновогоЗадания", ЭтотОбъект); + СервисКриптографииDSSПодтверждениеКлиент.ОтправкаЗапроса(ОбработчикОтвета, НастройкиПользователя, ДанныеПодтверждения); + ОжидатьВыполнения = Истина; + ПриНачалеПодтверждения(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучениеРезультатаФоновогоЗадания(Результат, ДополнительныеПараметры) Экспорт + + Если Открыта() Тогда + ОжидатьВыполнения = Ложь; + РезультатЗапроса = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(Результат, ДанныеПодтверждения); + ОповещениеСледующее = Новый ОписаниеОповещения("ПослеОбработкиОтветаСервера", ЭтотОбъект, ДанныеПодтверждения); + СервисКриптографииDSSПодтверждениеКлиент.ОбработатьРезультатЗапроса(ОповещениеСледующее, + РезультатЗапроса, + НастройкиПользователя, + ДанныеПодтверждения, + ЭтотОбъект); + + ПриНачалеПодтверждения(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОбработкиОтветаСервера(РезультатВызова, ДополнительныеПараметры) Экспорт + + РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(РезультатВызова, ДанныеПодтверждения); + Если РезультатВыполнения.Выполнено Тогда + ДанныеПодтверждения = РезультатВыполнения.ДанныеПодтверждения; + Если ДанныеПодтверждения.ЭтапЦикла = "Окончание" Тогда + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветПользователя.Вставить("НастройкиПользователя", РезультатВыполнения.НастройкиПользователя); + ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ЗакрытьФорму(ОтветПользователя); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Начало" Тогда + ВремяИстекло = Ложь; + ОтправкаЗапросаКлиент(); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Выбор" Тогда + ВремяИстекло = Ложь; + ОтправкаЗапросаКлиент(); + Иначе + ПриНачалеПодтверждения(); + КонецЕсли; + + ИначеЕсли НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(РезультатВыполнения.Ошибка) Тогда + ЗакрытьФорму(РезультатВыполнения); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриНачалеПодтверждения() + + СервисКриптографииDSSПодтверждениеКлиент.ВывестиИнформациюСервера(ЭтотОбъект, "ИнформацияСервера"); + Элементы.ОК.Доступность = НЕ ОжидатьВыполнения; + ТекущийЭлемент = Элементы.КодПодтверждения; + +КонецПроцедуры + +&НаСервере +Процедура УправлениеФормой() + + ЭлементыФормы = Элементы; + ЭлементыФормы.Сертификат.Видимость = ЗначениеЗаполнено(Сертификат); + ЭлементыФормы.Документы.Видимость = ЗначениеЗаполнено(ПредставлениеДокументов); + +КонецПроцедуры + +&НаСервере +Процедура НастроитьУсловноеОформление() + + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("BackColor"); + ЭлементЦветаОформления.Значение = ЦветаСтиля.ЦветФонаПредупреждения; + ЭлементЦветаОформления.Использование = Истина; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВремяИстекло"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Истина; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ГруппаПодвал"); + ЭлементОформляемогоПоля.Использование = Истина; + +КонецПроцедуры + +&НаСервере +Процедура НазначитьКлючСохраненияФормы() + + НовыйКлюч = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДанныеПодтверждения, "ТипПодтверждения", ""); + + Если ЗначениеЗаполнено(Сертификат) Тогда + НовыйКлюч = НовыйКлюч + "Сертификат"; + КонецЕсли; + + Если ЗначениеЗаполнено(ПредставлениеДокументов) Тогда + НовыйКлюч = НовыйКлюч + "Документ"; + КонецЕсли; + + КлючСохраненияПоложенияОкна = НовыйКлюч; + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Form.form similarity index 51% rename from SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Form.form rename to SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Form.form index 6a312ff0e..7ae0f444e 100644 --- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/ИсторияВыполнения/Form.form +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Form.form @@ -2,192 +2,25 @@ <key>ru</key> - <value>История выполнения ключевой операции</value> + <value>Подтверждение криптооперации</value> - ГруппаПериод - 13 - - ДатаНачала - 3 - true - true - - true - - - ДатаНачала - - - ДатаНачалаExtendedTooltip - 26 - Label - true - true - - Left - - - - ДатаНачалаКонтекстноеМеню - 4 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - ДатаОкончания - 5 - true - true - - true - - - ДатаОкончания - - - ДатаОкончанияExtendedTooltip - 27 - Label - true - true - - Left - - - - ДатаОкончанияКонтекстноеМеню - 6 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Период</value> - - - ГруппаПериодExtendedTooltip - 25 - Label - true - true - - Left - - - UsualGroup - - HorizontalIfPossible - Auto - WeakSeparation - true - true - auto - Auto - - - - ГруппаПараметрыКлючевойОперации - 14 - - КлючеваяОперация - 1 - true - true - - true - - - КлючеваяОперация - - - КлючеваяОперацияExtendedTooltip - 29 - Label - true - true - - Left - - - - КлючеваяОперацияКонтекстноеМеню - 2 - true - - InputField - true - Enter - true - Left - true - - - Opening - КлючеваяОперацияОткрытие - - true - true - true - false - true - true - true - Normal - - + ГруппаШапка + 1 - ГруппаПараметры - 15 - - Приоритет - 7 + ГруппаИнформацияСервера + 48 + + ДекорацияПустая3 + 50 true true true - - Приоритет - - ПриоритетExtendedTooltip - 31 + ДекорацияПустая3РасширеннаяПодсказка + 52 Label true true @@ -196,40 +29,34 @@ - ПриоритетКонтекстноеМеню - 8 + ДекорацияПустая3КонтекстноеМеню + 51 true - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal + Label + 14 + true + true + + Left - ЦелевоеВремя - 9 + ИнформацияСервера + 45 true true true - ЦелевоеВремя + ИнформацияСервера + true + None - ЦелевоеВремяExtendedTooltip - 32 + ИнформацияСервераРасширеннаяПодсказка + 47 Label true true @@ -238,23 +65,30 @@ - ЦелевоеВремяКонтекстноеМеню - 10 + ИнформацияСервераКонтекстноеМеню + 46 true InputField - true + Top Enter true Left true true + 2 true true + true true true - true + + Style.ПодтверждениеОперацииОписаниеЦвет + + + Style.FormBackColor + Normal @@ -265,11 +99,11 @@ <key>ru</key> - <value>Параметры</value> + <value>Информация</value> - ГруппаПараметрыExtendedTooltip - 30 + ГруппаИнформацияСервераРасширеннаяПодсказка + 49 Label true true @@ -283,6 +117,7 @@ Auto true true + Auto Auto @@ -293,11 +128,11 @@ <key>ru</key> - <value>Ключевая операция</value> + <value>Основное</value> - ГруппаПараметрыКлючевойОперацииExtendedTooltip - 28 + ГруппаШапкаРасширеннаяПодсказка + 2 Label true true @@ -309,86 +144,29 @@ Vertical Auto - WeakSeparation true true - auto + Auto Auto - - КоличествоЗамеров - 11 - true - true - - true - - - КоличествоЗамеров - - Left - - КоличествоЗамеровExtendedTooltip - 33 - Label - true - true - - Left - - - - КоличествоЗамеровКонтекстноеМеню - 12 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - История - 16 - - <key>ru</key> - <value>История</value> - - true - true - - true - - - История - - None + + ГруппаСведения + 15 - ИсторияДлительность - 21 + Сертификат + 3 true true true - История.Длительность + ПредставлениеСертификата - ИсторияДлительностьExtendedTooltip - 35 + СертификатРасширеннаяПодсказка + 5 Label true true @@ -397,38 +175,186 @@ - ИсторияДлительностьКонтекстноеМеню - 22 + СертификатКонтекстноеМеню + 4 true - InputField - Auto + LabelField + true + Enter true Left true - + + + Click + СертификатНажатие + true true - true - true - true - true - Normal + true - ИсторияВремяОкончания - 23 + Документы + 9 true true true - История.ВремяОкончания + ПредставлениеДокументов - ИсторияВремяОкончанияExtendedTooltip + ДокументыРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ДокументыКонтекстноеМеню + 10 + true + + LabelField + Enter + true + Left + true + + + URLProcessing + ДокументыОбработкаНавигационнойСсылки + + + + + ГруппаСпособыПодтверждения + 23 + + СпособПодтверждения + 6 + true + true + + true + + + СпособПодтверждения + + Button + + OnChange + СпособПодтвержденияПриИзменении + + + СпособПодтвержденияРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СпособПодтвержденияКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Способы</value> + + true + + ГруппаСпособыПодтвержденияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ДекорацияПустая1 + 39 + true + true + + true + + + ДекорацияПустая1РасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ДекорацияПустая1КонтекстноеМеню + 40 + true + + Label + true + true + + Left + + + + ДекорацияАнимация + 34 + + <key>ru</key> + <value>Декорация анимация</value> + + true + true + + true + + + ДекорацияАнимацияРасширеннаяПодсказка 36 Label true @@ -438,39 +364,36 @@ - ИсторияВремяОкончанияКонтекстноеМеню - 24 + ДекорацияАнимацияКонтекстноеМеню + 35 true - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal + true + true + true + Center + + + CommonPicture.АнимацияПодтверждения + + + ru + Анимация процесса + + AsFileRef - - ИсторияПользователь - 19 + + ДекорацияПустая2 + 42 true true true - - История.Пользователь - - ИсторияПользовательExtendedTooltip - 37 + ДекорацияПустая2РасширеннаяПодсказка + 44 Label true true @@ -479,104 +402,29 @@ - ИсторияПользовательКонтекстноеМеню - 20 + ДекорацияПустая2КонтекстноеМеню + 43 true - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal + Label + true + true + + Left - - ИсторияКоманднаяПанель - 18 - Left - - - ИсторияСтрокаПоиска - 38 - - ИсторияСтрокаПоискаРасширеннаяПодсказка - 40 - Label - true - true - - Left - - - - ИсторияСтрокаПоискаКонтекстноеМеню - 39 - true - - История - - true - - - - ИсторияСостояниеПросмотра - 41 - - ИсторияСостояниеПросмотраРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - - ИсторияСостояниеПросмотраКонтекстноеМеню - 42 - true - - ViewStatusAddition - История - - true - - - - ИсторияУправлениеПоиском - 44 - - ИсторияУправлениеПоискомРасширеннаяПодсказка - 46 - Label - true - true - - Left - - - - ИсторияУправлениеПоискомКонтекстноеМеню - 45 - true - - SearchControlAddition - История - - true - - + true + true + + true + + + <key>ru</key> + <value>Сведения</value> + - ИсторияExtendedTooltip - 34 + ГруппаСведенияРасширеннаяПодсказка + 16 Label true true @@ -584,49 +432,169 @@ Left - - ИсторияКонтекстноеМеню - 17 - - true - true - true - true - true - true - MultiRow -
      true
      - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - true - true - + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + +
      + + ГруппаПодвал + 37 + + Осталось + 20 + true + true + + true + + + Осталось + + true + None + + ОсталосьРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ОсталосьКонтекстноеМеню + 21 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ГруппаКоманды + 53 + + Отмена + 55 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + Right + + ГруппаКомандыРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Подвал</value> + + + ГруппаПодвалРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + DontUse + Auto + ФормаКоманднаяПанель -1 Left + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + OnCreateAtServer ПриСозданииНаСервере + 55 LockOwner true true Vertical true + true true auto true @@ -634,7 +602,7 @@ Объект 1 - DataProcessorObject.ОценкаПроизводительности + DataProcessorObject.УправлениеПодключениемDSS true @@ -645,14 +613,11 @@
      true
      - КлючеваяОперация - - <key>ru</key> - <value>Ключевая операция</value> - + КодПодтверждения 2 - CatalogRef.КлючевыеОперации + String + true @@ -662,16 +627,9 @@ - ДатаНачала - - <key>ru</key> - <value>Дата начала</value> - + Сертификат 3 - - Date - - + true @@ -680,16 +638,9 @@ - ДатаОкончания - - <key>ru</key> - <value>Дата окончания</value> - + ДанныеДокументов 4 - - Date - - + true @@ -698,59 +649,16 @@ - Приоритет + Осталось <key>ru</key> - <value>Приоритет</value> + <value>Осталось</value> 5 - - Number - - 15 - true - - - - true - - - true - - - - ЦелевоеВремя - - <key>ru</key> - <value>Целевое время</value> - - 6 - - Number - - 15 - 2 - true - - - - true - - - true - - - - КоличествоЗамеров - - <key>ru</key> - <value>Количество замеров</value> - - 7 String - 20 + 33 @@ -761,14 +669,115 @@ - История + СпособПодтверждения <key>ru</key> - <value>История</value> + <value>Способ подтверждения</value> - 8 + 6 - ValueTable + EnumRef.СпособыАвторизацииDSS + + + true + + + true + + + + ДанныеПодтверждения + 7 + + + true + + + true + + + + НастройкиПользователя + 8 + + + true + + + true + + + + ОжидатьВыполнения + 9 + + Boolean + + + true + + + true + + + + ПредставлениеДокументов + + <key>ru</key> + <value>Документы</value> + + 10 + + FormattedString + + + true + + + true + + + + ПредставлениеСертификата + + <key>ru</key> + <value>Сертификат</value> + + 11 + + String + + + + true + + + true + + + + ВремяИстекло + 13 + + Boolean + + + true + + + true + + + + ИнформацияСервера + + <key>ru</key> + <value>Информация сервера</value> + + 15 + + String + true @@ -776,71 +785,30 @@ true - - Пользователь - - <key>ru</key> - <value>Пользователь</value> - - 1 - - String - - 255 - - - - true - - - true - - - - Длительность - - <key>ru</key> - <value>Длительность</value> - - 2 - - Number - - 15 - 3 - true - - - - true - - - true - - - - ВремяОкончания - - <key>ru</key> - <value>Время окончания</value> - - 3 - - Date - - - - true - - - true - - - НастройкиИстории + ДанныеПодтверждения + + Сертификат + + + + ДанныеДокументов + + + + НастройкиПользователя + + + + ЗаголовокФормы + + String + + + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Help/ru.html new file mode 100644 index 000000000..574176736 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Help/ru.html @@ -0,0 +1,27 @@ + + + + +

      Предназначена для вторичного подтверждения +операций в сервис облачной подписи с помощью мобильного приложения.

      + +

      Для использования этого способа подтверждения +на мобильное устройство на платформах iOS или Android должно быть установлено +мобильное приложение myDSS или AirKey DSS. Дополнительно мобильное устройство с +установленным приложением должно быть зарегистрировано в сервисе облачной +подписи.

      + +

      Порядок работы

      + +
      • В поле сертификат указывается информация о сертификате, используемый + при операции.
      • +
      • В поле способ подтверждения можно изменить текущий способ на любой + доступный в списке выбора. 
      • +
      • В поле документы указывается список документов, с которыми проводится + операция. Доступно только для операции создание электронной подписи.
      • +
      • Процесс подтверждения + сопровождается анимацией, программа периодически опрашивает статус + подтверждения в сервисе и в случае успеха автоматически закрывается форма.
      • +
      • В нижней части выводиться время, + оставшееся для окончания процедуры подтверждения операции
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Module.bsl new file mode 100644 index 000000000..2f48c0b0d --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииМобильноеПриложение/Module.bsl @@ -0,0 +1,263 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.ДанныеПодтверждения = Неопределено Тогда + Параметры.ДанныеПодтверждения = СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); + ВремяИстекло = Истина; + КонецЕсли; + + Если Параметры.НастройкиПользователя = Неопределено Тогда + Параметры.НастройкиПользователя = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + ВремяИстекло = Истина; + КонецЕсли; + + СервисКриптографииDSSПодтверждениеСервер.ПодготовитьФормуПодтвержденияПриСоздании(ЭтотОбъект); + ДанныеПодтверждения.СрокОпроса = ТекущаяДатаСеанса() - ДанныеПодтверждения.ПериодОпроса; + + НазначитьКлючСохраненияФормы(); + УправлениеФормой(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + ПриНачалеПодтверждения(); + СервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект, "СпособПодтверждения"); + + СервисКриптографииDSSПодтверждениеКлиент.ПодключитьОжидание(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ВРег(ИмяСобытия) = ВРег("ПодтверждениеЗакрытьФорму") И Источник = УникальныйИдентификатор Тогда + ЗакрытьФорму(Параметр); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СпособПодтвержденияПриИзменении(Элемент) + + СервисКриптографииDSSПодтверждениеКлиент.ПриИзмененииСпособаПодтверждения(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь); + ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор; + ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект); + + СервисКриптографииDSSКлиент.ПоказатьСертификат( + Неопределено, + НастройкиПользователя, + Новый Структура("Отпечаток", Сертификат.Отпечаток), + ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура ДокументыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СервисКриптографииDSSПодтверждениеКлиент.ОбработкаНавигационнойСсылкиДокументов(НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка, ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ДанныеПодтверждения.ЭтапЦикла = "Окончание"; + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработчикОжидания() + + ОбработкаЦиклаОжидания(); + +КонецПроцедуры + +&НаКлиенте +Функция ДатаСеанса() + + Возврат СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + +КонецФункции + +&НаКлиенте +Процедура ОбработкаЦиклаОжидания() + + Разница = 0; + Если ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Разница = ДанныеПодтверждения.СрокДействия - ДатаСеанса(); + КонецЕсли; + + Если Разница > 0 Тогда + Осталось = СервисКриптографииDSSПодтверждениеКлиент.РазницаФормат(Разница); + ИначеЕсли НЕ ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Осталось = ""; + Иначе + Осталось = НСтр("ru = 'время истекло'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()); + ВремяИстекло = Истина; + ПриНачалеПодтверждения(); + КонецЕсли; + + Если ДанныеПодтверждения.ЭтапЦикла = "Ожидание" Тогда + Разница = ДатаСеанса() - ДанныеПодтверждения.СрокОпроса; + Если Разница > ДанныеПодтверждения.ПериодОпроса Тогда + ОтправкаЗапросаКлиент(); + ДанныеПодтверждения.СрокОпроса = ДатаСеанса(); + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSПодтверждениеКлиент.ПодключитьОжидание(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправкаЗапросаКлиент() + + ОжидатьВыполнения = Истина; + ОбработчикОтвета = Новый ОписаниеОповещения("ПолучениеРезультатаФоновогоЗадания", ЭтотОбъект); + СервисКриптографииDSSПодтверждениеКлиент.ОтправкаЗапроса(ОбработчикОтвета, НастройкиПользователя, ДанныеПодтверждения); + ПриНачалеПодтверждения(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучениеРезультатаФоновогоЗадания(Результат, ДополнительныеПараметры) Экспорт + + Если Открыта() Тогда + ОжидатьВыполнения = Ложь; + РезультатЗапроса = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(Результат, ДанныеПодтверждения); + ОповещениеСледующее = Новый ОписаниеОповещения("ПослеОбработкиОтветаСервера", ЭтотОбъект, ДанныеПодтверждения); + СервисКриптографииDSSПодтверждениеКлиент.ОбработатьРезультатЗапроса(ОповещениеСледующее, + РезультатЗапроса, + НастройкиПользователя, + ДанныеПодтверждения, + ЭтотОбъект); + + ПриНачалеПодтверждения(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОбработкиОтветаСервера(РезультатВызова, ДополнительныеПараметры) Экспорт + + РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(РезультатВызова, ДанныеПодтверждения); + Если РезультатВыполнения.Выполнено Тогда + ДанныеПодтверждения = РезультатВыполнения.ДанныеПодтверждения; + Если ДанныеПодтверждения.ЭтапЦикла = "Окончание" Тогда + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветПользователя.Вставить("НастройкиПользователя", РезультатВыполнения.НастройкиПользователя); + ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ЗакрытьФорму(ОтветПользователя); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Отказ" Тогда + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "authentication_declined"); + ОтветПользователя.Вставить("НастройкиПользователя", НастройкиПользователя); + ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ЗакрытьФорму(ОтветПользователя); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Начало" Тогда + ВремяИстекло = Ложь; + ОтправкаЗапросаКлиент(); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла <> "Ошибка" Тогда + ДанныеПодтверждения.ЭтапЦикла = "Ожидание"; + ПриНачалеПодтверждения(); + КонецЕсли; + + ИначеЕсли НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(РезультатВыполнения.Ошибка) Тогда + ЗакрытьФорму(РезультатВыполнения); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриНачалеПодтверждения() + + СервисКриптографииDSSПодтверждениеКлиент.ВывестиИнформациюСервера(ЭтотОбъект, "ИнформацияСервера"); + СервисКриптографииDSSПодтверждениеКлиент.ОформитьВремяИстекло(Элементы.ГруппаПодвал, ВремяИстекло); + +КонецПроцедуры + +&НаСервере +Процедура УправлениеФормой() + + ЭлементыФормы = Элементы; + ЭлементыФормы.Сертификат.Видимость = ЗначениеЗаполнено(Сертификат); + ЭлементыФормы.Документы.Видимость = ЗначениеЗаполнено(ПредставлениеДокументов); + +КонецПроцедуры + +&НаСервере +Процедура НазначитьКлючСохраненияФормы() + + НовыйКлюч = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДанныеПодтверждения, "ТипПодтверждения", ""); + + Если ЗначениеЗаполнено(Сертификат) Тогда + НовыйКлюч = НовыйКлюч + "Сертификат"; + КонецЕсли; + + Если ЗначениеЗаполнено(ПредставлениеДокументов) Тогда + НовыйКлюч = НовыйКлюч + "Документ"; + КонецЕсли; + + КлючСохраненияПоложенияОкна = НовыйКлюч; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Form.form new file mode 100644 index 000000000..59853a837 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Form.form @@ -0,0 +1,1100 @@ + + + + <key>ru</key> + <value>Подтверждение криптооперации</value> + + + ГруппаШапка + 1 + + ГруппаОписаниеСервера + 59 + + ДекорацияПустая4 + 56 + true + true + + true + + + ДекорацияПустая4РасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ДекорацияПустая4КонтекстноеМеню + 57 + true + + Label + 14 + true + true + + Left + + + + ИнформацияСервера + 53 + true + true + + true + + + ИнформацияСервера + + true + None + + ИнформацияСервераРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ИнформацияСервераКонтекстноеМеню + 54 + true + + InputField + Enter + true + Left + true + + true + 2 + true + true + true + true + true + + Style.ПодтверждениеОперацииОписаниеЦвет + + + Style.FormBackColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Описание сервера</value> + + + ГруппаОписаниеСервераРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + + ГруппаШапкаРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + Auto + Auto + + + + ГруппаСведения + 15 + + Сертификат + 3 + true + true + + true + + + ПредставлениеСертификата + + + СертификатРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + СертификатКонтекстноеМеню + 4 + true + + LabelField + true + Enter + true + Left + true + + + Click + СертификатНажатие + + true + true + true + + + + ГруппаСпособыПодтверждения + 23 + + СпособПодтверждения + 6 + true + true + + true + + + СпособПодтверждения + + Button + + OnChange + СпособПодтвержденияПриИзменении + + + СпособПодтвержденияРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + СпособПодтвержденияКонтекстноеМеню + 7 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Способы</value> + + + ГруппаСпособыПодтвержденияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + Документы + 9 + true + true + + true + + + ПредставлениеДокументов + + + ДокументыРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ДокументыКонтекстноеМеню + 10 + true + + LabelField + Enter + true + Left + true + + + URLProcessing + ДокументыОбработкаНавигационнойСсылки + + + + + ДекорацияПустая1 + 44 + true + true + + true + + + ДекорацияПустая1РасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ДекорацияПустая1КонтекстноеМеню + 45 + true + + Label + true + true + + Left + + + + ГруппаГрафическийКод + 37 + + ГрафическийКод + 34 + true + true + + true + + + ГрафическийКод + + None + + ГрафическийКодРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ГрафическийКодКонтекстноеМеню + 35 + true + + PictureField + Enter + true + Left + true + + true + 10 + true + true + true + Proportionally + + 1 + + AsFileRef + + + true + true + + true + + + <key>ru</key> + <value>Код</value> + + + ГруппаГрафическийКодРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ДекорацияПустая2 + 47 + true + true + + true + + + ДекорацияПустая2РасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ДекорацияПустая2КонтекстноеМеню + 48 + true + + Label + true + true + + Left + + + + ГруппаКодВвода + 42 + + КодПодтверждения + 29 + + <key>ru</key> + <value>Код</value> + + true + true + + true + + + КодПодтверждения + + + КодПодтвержденияРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + КодПодтвержденияКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + 5 + true + true + true + true + true + OnValueChange + Normal + + + + ОК + 32 + true + true + + true + + + ОКРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + UsualButton + Form.Command.ОК + Auto + true + 9 + true + true + UserCmds + Auto + + + ГруппаПомощь + 61 + + ДекорацияГрафическийКодОписание + 39 + + <key>ru</key> + <value>1. Откройте мобильное приложение на своем устройстве. +2. Наведите камеру устройства на QR-код. +3. Введите код подтверждения или код отказа.</value> + + true + true + + true + + + ДекорацияГрафическийКодОписаниеРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ДекорацияГрафическийКодОписаниеКонтекстноеМеню + 40 + true + + Label + 3 + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Требуется помощь?</value> + + Center + + ГруппаПомощьРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + PopUp + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Код ввода</value> + + + ГруппаКодВводаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Сведения</value> + + + ГруппаСведенияРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ДекорацияПустая3 + 50 + true + true + + true + + + ДекорацияПустая3РасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ДекорацияПустая3КонтекстноеМеню + 51 + true + + Label + true + true + + Left + + + + ГруппаПодвал + 27 + + Осталось + 20 + true + true + + true + + + Осталось + + None + + ОсталосьРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ОсталосьКонтекстноеМеню + 21 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ГруппаКоманды + 63 + + Отмена + 65 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + Right + + ГруппаКомандыРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Подвал</value> + + + ГруппаПодвалРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + DontUse + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 55 + LockOwner + true + true + Vertical + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + КодПодтверждения + + <key>ru</key> + <value>Код подтверждения</value> + + 2 + + String + + + + true + + + true + + + + Сертификат + 3 + + + true + + + true + + + + ДанныеДокументов + 4 + + + true + + + true + + + + Осталось + + <key>ru</key> + <value>Осталось</value> + + 5 + + String + + 33 + + + + true + + + true + + + + СпособПодтверждения + + <key>ru</key> + <value>Способ подтверждения</value> + + 6 + + EnumRef.СпособыАвторизацииDSS + + + true + + + true + + + + ДанныеПодтверждения + 7 + + + true + + + true + + + + НастройкиПользователя + 8 + + + true + + + true + + + + ОжидатьВыполнения + 9 + + Boolean + + + true + + + true + + + + ПредставлениеДокументов + + <key>ru</key> + <value>Документы</value> + + 10 + + FormattedString + + + true + + + true + + + + ПредставлениеСертификата + + <key>ru</key> + <value>Сертификат</value> + + 11 + + String + + + + true + + + true + + + + ГрафическийКод + + <key>ru</key> + <value>Графический код</value> + + 12 + + String + + + + true + + + true + + + + ВремяИстекло + 15 + + Boolean + + + true + + + true + + + + ИнформацияСервера + + <key>ru</key> + <value>Информация сервера</value> + + 16 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 2 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ДанныеПодтверждения + + + + Сертификат + + + + ДанныеДокументов + + + + НастройкиПользователя + + + + ЗаголовокФормы + + String + + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Help/ru.html new file mode 100644 index 000000000..6fda25c2b --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Help/ru.html @@ -0,0 +1,26 @@ + + + + +

      Предназначена для вторичного подтверждения +операций в сервис облачной подписи в случае, если отсутствует интернет +соединение между сервером облачной подписи и мобильным устройством.

      + +

      Порядок работы

      + +
      • В поле сертификат указывается информация о сертификате, используемый + при операции.
      • +
      • В поле способ подтверждения можно изменить текущий способ на любой + доступный в списке выбора. 
      • +
      • В поле документы указывается список документов, с которыми проводится + операция. Доступно только для операции создание электронной подписи.
      • +
      • В поле графический код отображается QR-code, который необходимо + сканировать с помощью камеры мобильного устройства.
      • +
      • В поле код необходимо ввести одноразовый пароль, отображенный в + мобильном приложении
      • +
      • В нижней части выводиться время, + оставшееся для окончания процедуры подтверждения операции
      • +
      • Также происходит фоновый опрос + сервера на наличие подтверждения операции, если появилась связь между + мобильным приложением и сервером облачной подписи
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Module.bsl new file mode 100644 index 000000000..536cf4d1c --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОфлайн/Module.bsl @@ -0,0 +1,301 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.ДанныеПодтверждения = Неопределено Тогда + Параметры.ДанныеПодтверждения = СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию(); + ВремяИстекло = Истина; + КонецЕсли; + + Если Параметры.НастройкиПользователя = Неопределено Тогда + Параметры.НастройкиПользователя = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + ВремяИстекло = Истина; + КонецЕсли; + + СервисКриптографииDSSПодтверждениеСервер.ПодготовитьФормуПодтвержденияПриСоздании(ЭтотОбъект); + ГрафическийКод = ПоместитьВоВременноеХранилище(ДанныеПодтверждения.ГрафическийКод, УникальныйИдентификатор); + ДанныеПодтверждения.СрокОпроса = СервисКриптографииDSSСлужебный.ДатаСеанса() - ДанныеПодтверждения.ПериодОпроса; + + НазначитьКлючСохраненияФормы(); + НастроитьУсловноеОформление(); + УправлениеФормой(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + ПриНачалеПодтверждения(); + СервисКриптографииDSSПодтверждениеКлиент.ФильтроватьСписокСпособов(ЭтотОбъект, "СпособПодтверждения"); + СервисКриптографииDSSПодтверждениеКлиент.ПодключитьОжидание(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ВРег(ИмяСобытия) = ВРег("ПодтверждениеЗакрытьФорму") И Источник = УникальныйИдентификатор Тогда + ЗакрытьФорму(Параметр); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СертификатНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь); + ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор; + ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект); + + СервисКриптографииDSSКлиент.ПоказатьСертификат( + Неопределено, + НастройкиПользователя, + Новый Структура("Отпечаток", Сертификат.Отпечаток), + ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура ДокументыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + + СервисКриптографииDSSПодтверждениеКлиент.ОбработкаНавигационнойСсылкиДокументов(НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка, ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура СпособПодтвержденияПриИзменении(Элемент) + + СервисКриптографииDSSПодтверждениеКлиент.ПриИзмененииСпособаПодтверждения(ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ДанныеПодтверждения.ЭтапЦикла = "ВводКода"; + ДанныеПодтверждения.КодПользователя = КодПодтверждения; + + ОжидатьВыполнения = Истина; + ОтправкаЗапросаКлиент(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ДанныеПодтверждения.ЭтапЦикла = "Окончание"; + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +//@skip-warning +&НаКлиенте +Процедура Подключаемый_ПодтверждениеОбработчикОжидания() + + ОбработкаЦиклаОжидания(); + +КонецПроцедуры + +&НаКлиенте +Функция ДатаСеанса() + + Возврат СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса(); + +КонецФункции + +&НаКлиенте +Процедура ОбработкаЦиклаОжидания() + + Разница = 0; + Если ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Разница = ДанныеПодтверждения.СрокДействия - ДатаСеанса(); + КонецЕсли; + + Если Разница > 0 Тогда + Осталось = СервисКриптографииDSSПодтверждениеКлиент.РазницаФормат(Разница); + ИначеЕсли НЕ ЗначениеЗаполнено(ДанныеПодтверждения.СрокДействия) Тогда + Осталось = ""; + Иначе + Осталось = НСтр("ru = 'время истекло'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()); + ВремяИстекло = Истина; + ПриНачалеПодтверждения(); + КонецЕсли; + + Если ДанныеПодтверждения.ЭтапЦикла = "Ожидание" Тогда + Разница = ДатаСеанса() - ДанныеПодтверждения.СрокОпроса; + Если Разница > ДанныеПодтверждения.ПериодОпроса Тогда + ОтправкаЗапросаКлиент(); + ДанныеПодтверждения.СрокОпроса = ДатаСеанса(); + КонецЕсли; + КонецЕсли; + + СервисКриптографииDSSПодтверждениеКлиент.ПодключитьОжидание(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтправкаЗапросаКлиент() + + ОбработчикОтвета = Новый ОписаниеОповещения("ПолучениеРезультатаФоновогоЗадания", ЭтотОбъект); + СервисКриптографииDSSПодтверждениеКлиент.ОтправкаЗапроса(ОбработчикОтвета, НастройкиПользователя, ДанныеПодтверждения); + ОжидатьВыполнения = Истина; + ПриНачалеПодтверждения(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучениеРезультатаФоновогоЗадания(Результат, ДополнительныеПараметры) Экспорт + + Если Открыта() Тогда + ОжидатьВыполнения = Ложь; + РезультатЗапроса = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(Результат, ДанныеПодтверждения); + ОповещениеСледующее = Новый ОписаниеОповещения("ПослеОбработкиОтветаСервера", ЭтотОбъект, ДанныеПодтверждения); + СервисКриптографииDSSПодтверждениеКлиент.ОбработатьРезультатЗапроса(ОповещениеСледующее, + РезультатЗапроса, + НастройкиПользователя, + ДанныеПодтверждения, + ЭтотОбъект); + + ПриНачалеПодтверждения(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОбработкиОтветаСервера(РезультатВызова, ДополнительныеПараметры) Экспорт + + РезультатВыполнения = СервисКриптографииDSSСлужебныйКлиент.ПолучитьРезультатВыполненияВФоне(РезультатВызова, ДанныеПодтверждения); + Если РезультатВыполнения.Выполнено Тогда + ДанныеПодтверждения = РезультатВыполнения.ДанныеПодтверждения; + Если ДанныеПодтверждения.ЭтапЦикла = "Окончание" Тогда + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ОтветПользователя.Вставить("НастройкиПользователя", РезультатВыполнения.НастройкиПользователя); + ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ЗакрытьФорму(ОтветПользователя); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла = "Отказ" Тогда + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "authentication_declined"); + ОтветПользователя.Вставить("НастройкиПользователя", НастройкиПользователя); + ОтветПользователя.Вставить("ДанныеПодтверждения", ДанныеПодтверждения); + ЗакрытьФорму(ОтветПользователя); + ИначеЕсли ДанныеПодтверждения.ЭтапЦикла <> "Ошибка" Тогда + ДанныеПодтверждения.ЭтапЦикла = "Ожидание"; + ПриНачалеПодтверждения(); + Иначе + ПриНачалеПодтверждения(); + КонецЕсли; + ИначеЕсли НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(РезультатВыполнения.Ошибка) Тогда + ЗакрытьФорму(РезультатВыполнения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриНачалеПодтверждения() + + СервисКриптографииDSSПодтверждениеКлиент.ВывестиИнформациюСервера(ЭтотОбъект, "ИнформацияСервера"); + СервисКриптографииDSSПодтверждениеКлиент.ОформитьВремяИстекло(Элементы.ГруппаПодвал, ВремяИстекло); + Элементы.ОК.Доступность = НЕ ОжидатьВыполнения ИЛИ ДанныеПодтверждения.ЭтапЦикла = "Ожидание"; + Если Элементы.ГруппаПомощь.Скрыта() Тогда + ТекущийЭлемент = Элементы.КодПодтверждения; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УправлениеФормой() + + ЭлементыФормы = Элементы; + ЭлементыФормы.Сертификат.Видимость = ЗначениеЗаполнено(Сертификат); + ЭлементыФормы.Документы.Видимость = ЗначениеЗаполнено(ПредставлениеДокументов); + +КонецПроцедуры + +&НаСервере +Процедура НастроитьУсловноеОформление() + + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("BackColor"); + ЭлементЦветаОформления.Значение = ЦветаСтиля.ЦветФонаПредупреждения; + ЭлементЦветаОформления.Использование = Истина; + + ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВремяИстекло"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Истина; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ГруппаПодвал"); + ЭлементОформляемогоПоля.Использование = Истина; + +КонецПроцедуры + +&НаСервере +Процедура НазначитьКлючСохраненияФормы() + + НовыйКлюч = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(ДанныеПодтверждения, "ТипПодтверждения", ""); + + Если ЗначениеЗаполнено(Сертификат) Тогда + НовыйКлюч = НовыйКлюч + "Сертификат"; + КонецЕсли; + + Если ЗначениеЗаполнено(ПредставлениеДокументов) Тогда + НовыйКлюч = НовыйКлюч + "Документ"; + КонецЕсли; + + КлючСохраненияПоложенияОкна = НовыйКлюч; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Form.form new file mode 100644 index 000000000..20fb42982 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Form.form @@ -0,0 +1,288 @@ + + + + <key>ru</key> + <value>Ошибка при подтверждении операции</value> + + + ГруппаШапка + 1 + + ДекорацияОшибка + 9 + + <key>ru</key> + <value>Декорация ошибка</value> + + true + true + + true + + + ДекорацияОшибкаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ДекорацияОшибкаКонтекстноеМеню + 10 + true + + 7 + true + 3 + true + + AsFileRef + + + + ДекорацияОписание + 12 + true + true + + true + + + ДекорацияОписаниеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ДекорацияОписаниеКонтекстноеМеню + 13 + true + + Label + true + true + + Left + Center + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + + ГруппаШапкаРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаКоманда + 3 + + Повторить + 5 + true + true + + true + + + ПовторитьРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + UsualButton + Form.Command.Повторить + Normal + Auto + true + true + UserCmds + Auto + + + Закрыть + 7 + true + true + + true + + + ЗакрытьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualButton + Form.StandardCommand.Close + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + Right + + ГруппаКомандаРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 60 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + ДанныеПодтверждения + 2 + + + true + + + true + + + + Повторить + + <key>ru</key> + <value>Повторить</value> + + 1 + + ru + Повторить + + + true + + + + Повторить + + + Auto + Auto + + + ОписаниеОшибки + + String + + + + + РежимПовторения + + Boolean + + + + ДанныеПодтверждения + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Help/ru.html new file mode 100644 index 000000000..ad7c9368d --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Help/ru.html @@ -0,0 +1,15 @@ + + + + +

      Предназначена информирования о возникшей +ошибки в процессе подтверждения операции в сервисе облачной подписи.

      + +

      Порядок работы

      + +
      • В поле описание отображается информация об ошибке, полученной с + сервиса или сформированной в процессе работы.
      • +
      • Кнопка повторить позволяет повторить действие, при котором возникла + ошибка. 
      • +
      • Кнопка закрыть останавливает процедуру подтверждения операции.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Module.bsl new file mode 100644 index 000000000..5d44c1358 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеОперацииОшибка/Module.bsl @@ -0,0 +1,107 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ДанныеПодтверждения = Параметры.ДанныеПодтверждения; + + Элементы.ДекорацияОписание.Заголовок = Параметры.ОписаниеОшибки; + Элементы.Повторить.Видимость = Параметры.РежимПовторения; + + УстановитьКартинку("ДиалогСтоп"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Повторить(Команда) + + ПовторитьОтправку(ДанныеПодтверждения); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Параметры: +// ТекущееПодтверждение - см. СервисКриптографииDSSПодтверждениеСервер.ДанныеВторичнойАвторизацииПоУмолчанию +// +&НаКлиенте +Процедура ПовторитьОтправку(ТекущееПодтверждение) + + ТекущееПодтверждение.ЭтапЦикла = "Начало"; + + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + ТекущееПодтверждение.Идентификатор = ТекущееПодтверждение.ИдентификаторТранзакции; + ПараметрыЗакрытия.Вставить("ДанныеПодтверждения", ТекущееПодтверждение); + + ЗакрытьФорму(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьКартинку(ИмяКартинки) + + НашлиКартинку = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы(ИмяКартинки); + + Если НашлиКартинку.Вид <> ВидКартинки.Пустая Тогда + Элементы.ДекорацияОшибка.Картинка = НашлиКартинку; + Иначе + Элементы.ДекорацияОшибка.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Form.form new file mode 100644 index 000000000..69c9890b8 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Form.form @@ -0,0 +1,850 @@ + + + + ГруппаОтображение + 1 + + ГруппаПечатнаяОбласть + 3 + + ГруппаКомандыПечати + 5 + + Печать + 7 + true + true + + true + + + ПечатьРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + Form.Command.Печать + Normal + PictureAndText + true + true + UserCmds + + StdPicture.PrintImmediately + + Auto + + + ФормаСохранить + 9 + true + true + + true + + + ФормаСохранитьРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.Item.ТабДок.StandardCommand.Save + Normal + Picture + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Команды печати</value> + + + ГруппаКомандыПечатиРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + CommandBar + + Left + + + + ТабДок + 11 + true + true + + true + + + ТабДок + + true + None + + ТабДокРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТабДокКонтекстноеМеню + 12 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + 60 + 16 + true + Special + ScrollAuto + ScrollAuto + WhenMultipleCellsSelected + Auto + true + true + true + + Style.FormBackColor + + + + + ГруппаОтобразитьОписание + 35 + + ДекорацияКартинкаОписания + 37 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + + ДекорацияКартинкаОписанияРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ДекорацияКартинкаОписанияКонтекстноеМеню + 38 + true + + 7 + true + 3 + true + Top + + AsFileRef + + + + ГруппаПраваяОписания + 40 + + ДекорацияОписание + 42 + true + true + + true + + + ДекорацияОписаниеРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ДекорацияОписаниеКонтекстноеМеню + 43 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Правая</value> + + + ГруппаПраваяОписанияРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отобразить описание</value> + + + ГруппаОтобразитьОписаниеРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Печать</value> + + + ГруппаПечатнаяОбластьРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаОписание + 14 + + ГруппаОтобразить + 16 + + ДекорацияКартинка + 18 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + + ДекорацияКартинкаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 19 + true + + 7 + true + 3 + true + Top + + AsFileRef + + + + ГруппаПравая + 21 + + ДекорацияИнформация + 23 + true + true + + true + + + ДекорацияИнформацияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДекорацияИнформацияКонтекстноеМеню + 24 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Правая</value> + + + ГруппаПраваяРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отобразить</value> + + + ГруппаОтобразитьРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Описание</value> + + + ГруппаОписаниеРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Отображение</value> + + + ГруппаОтображениеРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + + ГруппаПодтверждение + 26 + + РежимПодтверждения + 28 + true + true + + true + + + Подтверждение + + Right + + OnChange + ПодтверждениеПриИзменении + + + РежимПодтвержденияРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + РежимПодтвержденияКонтекстноеМеню + 29 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Подтверждение</value> + + + ГруппаПодтверждениеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаКомандыФормы + 31 + + Продолжить + 33 + + <key>ru</key> + <value>Продолжить</value> + + true + true + + true + + + ПродолжитьРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Command.ОК + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды формы</value> + + + ГруппаКомандыФормыРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + CommandBar + + Center + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + Vertical + true + UseIfNecessary + auto + true + DontShow + + ТабДок + + <key>ru</key> + <value>Таб док</value> + + 1 + + SpreadsheetDocument + + + true + + + true + + + + + Подтверждение + + <key>ru</key> + <value>Подтверждение</value> + + 2 + + Boolean + + + true + + + true + + + + ТаймАут + 4 + + Number + + 10 + + + + true + + + true + + + + ТаблицаКоманд + 5 + + ValueTable + + + true + + + true + + + ИмяКоманды + 1 + + String + + + + true + + + true + + + + ЗначениеКоманды + 2 + + + true + + + true + + + + Заголовок + 3 + + String + + + + true + + + true + + + + Пометка + 4 + + Boolean + + + true + + + true + + + + Картинка + 5 + + Picture + + + true + + + true + + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Печать + + <key>ru</key> + <value>Печать</value> + + 2 + + ru + Печать + + + true + + + + Печать + + + DontUse + Auto + + + Заголовок + + String + + + + + ЗаголовокПодтверждения + + String + + + + + СписокКоманд + + ValueList + + + + ПараметрыПечати + + + + ТаймАут + + Number + + 10 + + + + + ТекстВопроса + + FormattedString + String + + + + + + + + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Module.bsl new file mode 100644 index 000000000..25af7012e --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПодтверждениеПользователя/Module.bsl @@ -0,0 +1,287 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТаймАут = Параметры.ТаймАут; + ТекстВопроса = Параметры.ТекстВопроса; + Заголовок = Параметры.Заголовок; + СписокКоманд = Параметры.СписокКоманд; + РежимДиалога = Истина; + РедактированиеТаблицы = Ложь; + + Элементы.ГруппаОтображение.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + Если Параметры.ПараметрыПечати <> Неопределено Тогда + Если ТипЗнч(Параметры.ПараметрыПечати) = Тип("ТабличныйДокумент") Тогда + ТабДок = Параметры.ПараметрыПечати; + Иначе + ТабДок = СформироватьПечатнуюФорму(Параметры.ПараметрыПечати); + КонецЕсли; + + РежимДиалога = Ложь; + Если НЕ Параметры.Свойство("Редактирование", РедактированиеТаблицы) Тогда + РедактированиеТаблицы = Ложь; + КонецЕсли; + КонецЕсли; + + Если ПустаяСтрока(Заголовок) Тогда + Заголовок = НСтр("ru = 'Вопрос'"); + КонецЕсли; + + Если ЗначениеЗаполнено(Параметры.ЗаголовокПодтверждения) Тогда + Элементы.РежимПодтверждения.Заголовок = Параметры.ЗаголовокПодтверждения; + Иначе + Элементы.РежимПодтверждения.Видимость = Ложь; + КонецЕсли; + + Для Счетчик = 1 По СписокКоманд.Количество() Цикл + ИмяКоманды = "КомандаПользователя" + Формат(Счетчик, "ЧЦ=10; ЧГ=0"); + СтрокаКоманды = СписокКоманд[Счетчик - 1]; + НоваяСтрока = ТаблицаКоманд.Добавить(); + НоваяСтрока.ЗначениеКоманды = СтрокаКоманды.Значение; + НоваяСтрока.ИмяКоманды = ИмяКоманды; + НоваяСтрока.Заголовок = СтрокаКоманды.Представление; + НоваяСтрока.Картинка = СтрокаКоманды.Картинка; + НоваяСтрока.Пометка = СтрокаКоманды.Пометка; + КонецЦикла; + + ПодготовитьФормуВопроса(РежимДиалога, ТекстВопроса); + НастроитьВидимостьЭлементов(РежимДиалога, РедактированиеТаблицы); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПодключитьОбработчикОжидания("Подключаемый_ИзменитьРазмерыФормы", 0.2, Истина); + + Если ЗначениеЗаполнено(ТаймАут) Тогда + ПодключитьОбработчикОжидания("Подключаемый_ЗакрытьФорму", ТаймАут, Истина); + КонецЕсли; + + Если Элементы.РежимПодтверждения.Видимость Тогда + ТекущийЭлемент = Элементы.РежимПодтверждения; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПодтверждениеПриИзменении(Элемент) + + Для Каждого СтрокаСписка Из ТаблицаКоманд Цикл + + Если СтрокаСписка.Пометка Тогда + ЭлементКоманды = Элементы[СтрокаСписка.ИмяКоманды]; + ЭлементКоманды.Доступность = Подтверждение; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ЗакрытьФорму(КодВозвратаДиалога.ОК); + +КонецПроцедуры + +&НаКлиенте +Процедура Печать(Команда) + + ТабДок.Напечатать(РежимИспользованияДиалогаПечати.Использовать); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Выполняет событие нажатия кнопки +// +// Параметры: +// Команда - КомандаФормы +// +//@skip-warning +// +&НаКлиенте +Процедура Подключаемый_НажатиеКнопки(Команда) + + НашлиСтроки = ТаблицаКоманд.НайтиСтроки(Новый Структура("ИмяКоманды", Команда.Имя)); + Если НашлиСтроки.Количество() > 0 Тогда + ЗначениеКоманды = НашлиСтроки[0].ЗначениеКоманды; + Если ТипЗнч(ЗначениеКоманды) = Тип("Строка") И СтрНайти(ЗначениеКоманды, "КодВозвратаДиалога.") > 0 Тогда + ЗначениеКоманды = КодВозвратаДиалога[Сред(ЗначениеКоманды, 20)]; + КонецЕсли; + ЗакрытьФорму(ЗначениеКоманды); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ИзменитьРазмерыФормы() + + Элементы.ГруппаКомандыФормы.Видимость = НЕ Элементы.ГруппаКомандыФормы.Видимость; + Элементы.ГруппаОтображение.Видимость = НЕ Элементы.ГруппаОтображение.Видимость; + + Элементы.ГруппаКомандыФормы.Видимость = НЕ Элементы.ГруппаКомандыФормы.Видимость; + Элементы.ГруппаОтображение.Видимость = НЕ Элементы.ГруппаОтображение.Видимость; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ЗакрытьФорму() + + ЗакрытьФорму(КодВозвратаДиалога.Таймаут); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(РезультатВыбора = "") + + Закрыть(РезультатВыбора); + +КонецПроцедуры + +&НаСервере +Процедура НастроитьВидимостьЭлементов(РежимДиалога, РедактированиеТаблицы) + + Элементы.Продолжить.Видимость = ТаблицаКоманд.Количество() = 0; + Элементы.ГруппаОтображение.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + Элементы.ДекорацияКартинкаОписания.Видимость = НЕ Элементы.ДекорацияКартинкаОписания.Картинка.Вид = ВидКартинки.Пустая; + Элементы.ДекорацияКартинка.Видимость = НЕ Элементы.ДекорацияКартинка.Картинка.Вид = ВидКартинки.Пустая; + Элементы.ГруппаОтобразитьОписание.Видимость = ЗначениеЗаполнено(Элементы.ДекорацияОписание.Заголовок); + + Если НЕ РежимДиалога Тогда + Элементы.ГруппаОтображение.ТекущаяСтраница = Элементы.ГруппаПечатнаяОбласть; + + Иначе + Элементы.ГруппаОтображение.ТекущаяСтраница = Элементы.ГруппаОписание; + + Если ТабДок.МасштабПечати = 100 Тогда + ТабДок.АвтоМасштаб = Истина; + КонецЕсли; + ТабДок.ОтображатьЗаголовки = Ложь; + ТабДок.ОтображатьСетку = Ложь; + ТабДок.Защита = Ложь; + ТабДок.ТолькоПросмотр = Истина; + Элементы.ТабДок.Редактирование = РедактированиеТаблицы; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПодготовитьФормуВопроса(РежимДиалога, ВходнойТекст) + + ЕстьПодтверждение = Элементы.РежимПодтверждения.Видимость; + + Если РежимДиалога Тогда + Элементы.ДекорацияИнформация.Заголовок = ВходнойТекст; + Элементы.ДекорацияКартинка.Картинка = ПолучитьРесурсФормы("ДиалогВопрос"); + + ИначеЕсли ЗначениеЗаполнено(ВходнойТекст) Тогда + Элементы.ДекорацияОписание.Заголовок = ВходнойТекст; + Элементы.ДекорацияКартинкаОписания.Картинка = ПолучитьРесурсФормы("ДиалогИнформация"); + + КонецЕсли; + + ПервыйЭлемент = Неопределено; + + Для Счетчик = 1 По ТаблицаКоманд.Количество() Цикл + СтрокаКоманды = ТаблицаКоманд[Счетчик - 1]; + ИмяКоманды = СтрокаКоманды.ИмяКоманды; + + НоваяКоманда = Команды.Добавить(ИмяКоманды); + НоваяКоманда.Действие = "Подключаемый_НажатиеКнопки"; + НоваяКоманда.Заголовок = СтрокаКоманды.Заголовок; + Если ЗначениеЗаполнено(СтрокаКоманды.Картинка) Тогда + НоваяКоманда.Картинка = СтрокаКоманды.Картинка; + КонецЕсли; + + НовыйЭлемент = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элементы.ГруппаКомандыФормы); + НовыйЭлемент.ИмяКоманды = ИмяКоманды; + + Если ЕстьПодтверждение И СтрокаКоманды.Пометка Тогда + НовыйЭлемент.Доступность = Ложь; + КонецЕсли; + + Если ПервыйЭлемент = Неопределено ИЛИ СтрокаКоманды.Пометка Тогда + ПервыйЭлемент = НовыйЭлемент; + КонецЕсли; + + КонецЦикла; + + Если ПервыйЭлемент <> Неопределено Тогда + ПервыйЭлемент.КнопкаПоУмолчанию = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция СформироватьПечатнуюФорму(ПараметрыПечати) + + Результат = Новый ТабличныйДокумент; + МакетПечати = Обработки.УправлениеПодключениемDSS.ПолучитьМакет("ПодключениеУчетнойЗаписиОблачнойПодписи"); + + МакетШапки = МакетПечати.ПолучитьОбласть("Заголовок"); + МакетШапки.Параметры.Сервер = ПараметрыПечати.Сервер; + МакетШапки.Параметры.Логин = ПараметрыПечати.Логин; + Результат.Вывести(МакетШапки); + + Если ПараметрыПечати.Свойство("Пароль") Тогда + МакетШапки = МакетПечати.ПолучитьОбласть("Логин"); + МакетШапки.Параметры.Пароль = ПараметрыПечати.Пароль; + Результат.Вывести(МакетШапки); + КонецЕсли; + + Если ПараметрыПечати.Свойство("ДанныеКлюча") Тогда + МакетШапки = МакетПечати.ПолучитьОбласть("Ключ"); + КартинкаКода = МакетШапки.Рисунки.ВекторАутентификации; + КартинкаКода.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии); + КартинкаКода.ЦветФона = Новый Цвет(); + КартинкаКода.Картинка = Новый Картинка(ПараметрыПечати.ДанныеКлюча); + Результат.Вывести(МакетШапки); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьРесурсФормы(ИмяРесурса) + + Результат = Новый Картинка(); + НашлиРесурс = Новый Структура(ИмяРесурса); + + Попытка + ЗаполнитьЗначенияСвойств(НашлиРесурс, БиблиотекаКартинок); + Исключение + Результат = Новый Картинка(); + КонецПопытки; + + Если НашлиРесурс[ИмяРесурса] <> Неопределено Тогда + Результат = НашлиРесурс[ИмяРесурса]; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Form.form new file mode 100644 index 000000000..3f081e267 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Form.form @@ -0,0 +1,668 @@ + + + + <key>ru</key> + <value>Проверка работоспособности</value> + + + ГруппаОбщая + 17 + + ГруппаШапка + 3 + + Аккаунт + 12 + + <key>ru</key> + <value>Учетная запись</value> + + true + true + + true + + + Аккаунт + + + АккаунтРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + АккаунтКонтекстноеМеню + 13 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ГруппаКоманды + 1 + + ГруппаДействия + 22 + + Начать + 8 + true + true + + true + + + НачатьРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + UsualButton + Form.Command.Начать + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Действия</value> + + true + + ГруппаДействияРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + + + Отмена + 10 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + UsualButton + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + Right + + ГруппаКомандыРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + true + + ГруппаШапкаРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + + Web.AliceBlue + + Auto + Auto + + + + ДекорацияОписание + 5 + + <key>ru</key> + <value>В этой форме Вы можете проверить правильность настроек и работоспособность сервиса DSS. +Во время проверки могут появляться запросы на пароль, выбор сертификата и подтверждение операций.</value> + + true + true + + true + + + ДекорацияОписаниеРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ДекорацияОписаниеКонтекстноеМеню + 6 + true + + Label + true + + Left + + + + ГруппаПроверки + 15 + true + true + + true + + + <key>ru</key> + <value>Проверки</value> + + + ГруппаПроверкиРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ДекорацияОшибка + 19 + true + true + + true + + + ДекорацияОшибкаРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ДекорацияОшибкаКонтекстноеМеню + 20 + true + + Label + true + true + + Web.Red + + + Left + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + 60 + false + + ГруппаОбщаяРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + Аккаунт + + <key>ru</key> + <value>Аккаунт</value> + + 2 + + String + + + + true + + + true + + + + Сертификат + 3 + + + true + + + true + + + + НастройкиПользователя + 4 + + + true + + + true + + + + БазовыеФункции + 5 + + ValueTable + + + true + + + true + + + Описание + 1 + + String + + + + true + + + true + + + + Статус + 2 + + String + + + + true + + + true + + + + ИмяФункции + 3 + + String + + + + true + + + true + + + + ИмяРаздела + 4 + + String + + + + true + + + true + + + + Выполнить + 5 + + Boolean + + + true + + + true + + + + Ошибка + 6 + + String + + + + true + + + true + + + + ИмяПроверки + 7 + + String + + + + true + + + true + + + + + СтатусПроверки + 6 + + String + + + + true + + + true + + + + ДанныеОперации + 7 + + + true + + + true + + + + ОбъектСертификата + 8 + + + true + + + true + + + + ИсходныйТекст + 9 + + String + + + + true + + + true + + + + ДанныеОперацииXML + 10 + + + true + + + true + + + + СписокОпераций + 11 + + + true + + + true + + + + Картинки + 12 + + + true + + + true + + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 1 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + Начать + + <key>ru</key> + <value>Начать</value> + + 2 + + ru + Начать + + + true + + + + Начать + + + Auto + Auto + + + НастройкиПользователя + + + + СписокОпераций + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Help/ru.html new file mode 100644 index 000000000..1899a897f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Help/ru.html @@ -0,0 +1,54 @@ + + +

      Предназначена для проверки работоспособности +сервиса облачной подписи.

      + +

      Проверка работоспособности позволяет проверить +следующие операции:

      + +
      • Выбор сертификата -  если в списке отсутствуют сертификаты, + то необходимо инициировать выпуск нового сертификата, хранящийся в сервисе + облачной подписи.
      • +
      • Получить свойства сертификата + – проверка получение свойства сертификата хранящегося в сервисе.
      • +
      • Зашифровать произвольные + данные – шифрование тестовых данных в формате CMS.
      • +
      • Зашифровать XML + данные – + шифрование тестовых данных в формате XML. Если операция закончилась + неудачей, то сервис облачной подписи не поддерживает операции в формате XML.
      • +
      • Расшифровать произвольные + данные – расшифрование тестовых данных, которые были зашифрованы не + предыдущем шаге.
      • +
      • Расшифровать XML + данные – + расшифрование тестовых данных, которые были зашифрованы не предыдущем + шаге.
      • +
      • Подписать произвольные данные + – формирование электронной подписи для тестовых данных в формате CMS.
      • +
      • Подписать XML + данные – + формирование электронной подписи для тестовых данных. Если операция + закончилась неудачей, то сервис облачной подписи не поддерживает операции + в формате XML.
      • +
      • Проверить сертификат  - проверяет выбранный на предыдущих + шагах сертификат на валидность (срок действия, отзыв и прочее). Если + операция завершилась неудачей, то сервис проверки не доступен или не + настроен.
      • +
      • Проверить подпись – проверяет + ранее сформированнную электронную подпись тестовых данных.
      • +
      • Проверить подпись XML - + проверяет ранее сформированнную электронную подпись в формате XML + тестовых данных. Если + операция завершилась неудачей, то сервис проверки не поддерживает операции + проверки в формате XML.
      • +
      • Хешировать данные – вычисляет + хеш-значение тестовых данных.
      • +
      • Подтвердить операцию – запускает + процесс подтверждение произвольной операции. Порядок и содержание зависит + от указанного имени шаблона подтверждения указанного в расширенных + настройках сервера облачной подписи.
      • +

      В +зависимости от настроек сервиса облачной подписи для операций расшифрования и +подписание может дополнительно запрашиваться подтверждение операции.

      + \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Module.bsl new file mode 100644 index 000000000..8f7c31ef5 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ПроверкаСервиса/Module.bsl @@ -0,0 +1,767 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +&НаКлиенте +Перем РеестрФункций; // см. ПодготовитьРеестрПроверки + +&НаКлиенте +Перем КодЯзыка; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НастройкиПользователя = Параметры.НастройкиПользователя; + СписокОпераций = Параметры.СписокОпераций; + + Если НЕ ЗначениеЗаполнено(СписокОпераций) Тогда + СписокОпераций = ВесьСписокОпераций(); + КонецЕсли; + + Если НастройкиПользователя = Неопределено Тогда + НастройкиПользователя = СервисКриптографииDSS.НастройкиПользователяПоУмолчанию(); + СписокОпераций = Новый Структура; + КонецЕсли; + + Сервер = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(НастройкиПользователя.Подключение, "Сервер"); + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + ТекстОписания = НСтр("ru = '%1 на сервере %2'", КодЯзыка); + ТекстОписания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОписания, НастройкиПользователя.Логин, Сервер); + Аккаунт = ТекстОписания; + СтатусПроверки = "Начало"; + + Картинки = Новый Структура; + Картинки.Вставить("Пустая", Новый Картинка); + ПолучитьКартинку("Ошибка32"); + ПолучитьКартинку("Успешно"); + ПолучитьКартинку("ДлительнаяОперация16"); + + ПодготовитьФорму(); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Начать(Команда) + + Если СтатусПроверки = "Успешно" Тогда + ЗакрытьФорму(ПодготовитьРезультаты()); + Иначе + ПровестиПроверку(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + Если СтатусПроверки = "Ошибка" Тогда + ЗакрытьФорму(ПодготовитьРезультаты()); + Иначе + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область РеализацияРеестраПроверок + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ВыбратьСертификат(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + СервисКриптографииDSSКлиент.ВыборСертификата( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ПолучитьДанныеСертификата(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + СервисКриптографииDSSКлиент.ПолучитьДанныеСертификата( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + Сертификат, + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ЗашифроватьCMS(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + Сертификаты = Новый Массив; + Сертификаты.Добавить(ОбъектСертификата); + ДанныеДокумента = ПолучитьДвоичныеДанныеИзСтроки(ИсходныйТекст); + + СервисКриптографииDSSКлиент.Зашифровать( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеДокумента, + Сертификаты, + "CMS", + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ЗашифроватьXML(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + Сертификаты = Новый Массив; + Сертификаты.Добавить(ОбъектСертификата.Сертификат); + ДанныеДокумента = ПолучитьДвоичныеДанныеИзСтроки(ИсходныйТекст); + + СервисКриптографииDSSКлиент.Зашифровать( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеДокумента, + Сертификаты, + "XML", + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура РасшифроватьCMS(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + Если ЗначениеЗаполнено(ДанныеОперации) Тогда + СервисКриптографииDSSКлиент.Расшифровать( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеОперации, + "CMS", + Сертификат, + НовыеПараметрыОперации()); + Иначе + ОтветСервиса = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + ОтветСервиса.Ошибка = НСтр("ru = 'Нет данных для расшифрования'", КодЯзыка); + ЦиклПроверкиПослеВыполнения(ОтветСервиса, ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура РасшифроватьXML(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + Если ЗначениеЗаполнено(ДанныеОперацииXML) Тогда + СервисКриптографииDSSКлиент.Расшифровать( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеОперацииXML, + "XML", + Сертификат, + НовыеПараметрыОперации()); + Иначе + ОтветСервиса = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + ОтветСервиса.Ошибка = НСтр("ru = 'Нет данных для расшифрования XML'", КодЯзыка); + ЦиклПроверкиПослеВыполнения(ОтветСервиса, ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ПодписатьCMS(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + ДанныеДокумента = ПолучитьДвоичныеДанныеИзСтроки(ИсходныйТекст); + СвойствоПодписи = ПолучитьСвойствоПодписи("CMS"); + СервисКриптографииDSSКлиент.Подписать( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеДокумента, + СвойствоПодписи, + Сертификат, + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ПодписатьXML(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + ДанныеДокумента = ПолучитьДвоичныеДанныеИзСтроки(ИсходныйТекст); + СвойствоПодписи = ПолучитьСвойствоПодписи("XML"); + СервисКриптографииDSSКлиент.Подписать( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеДокумента, + СвойствоПодписи, + Сертификат, + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ПроверитьСертификат(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + СервисКриптографииDSSКлиент.ПроверитьСертификат( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ОбъектСертификата.Сертификат, + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ПроверитьПодпись(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + Если ЗначениеЗаполнено(ДанныеОперации) Тогда + ДанныеДокумента = ПолучитьДвоичныеДанныеИзСтроки(ИсходныйТекст); + СервисКриптографииDSSКлиент.ПроверитьПодпись( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеОперации, + ДанныеДокумента, + "CMS", + НовыеПараметрыОперации()); + Иначе + ОтветСервиса = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + ОтветСервиса.Ошибка = НСтр("ru = 'Нет данных для проверки подписи'", КодЯзыка); + ЦиклПроверкиПослеВыполнения(ОтветСервиса, ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ПроверитьПодписьXML(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + Если ЗначениеЗаполнено(ДанныеОперацииXML) Тогда + ДанныеДокумента = ПолучитьДвоичныеДанныеИзСтроки(ИсходныйТекст); + СервисКриптографииDSSКлиент.ПроверитьПодпись( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеОперацииXML, + ДанныеДокумента, + "XML", + НовыеПараметрыОперации()); + Иначе + ОтветСервиса = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + ОтветСервиса.Ошибка = НСтр("ru = 'Нет данных для проверки подписи XML'", КодЯзыка); + ЦиклПроверкиПослеВыполнения(ОтветСервиса, ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура Хешировать(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + ДанныеДокумента = ПолучитьДвоичныеДанныеИзСтроки(ИсходныйТекст); + СервисКриптографииDSSКлиент.ХешированиеДанных( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + ДанныеДокумента, , + НовыеПараметрыОперации()); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ПроизвольноеПодтверждение(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + СервисКриптографииDSSКлиент.ПодтверждениеПроизвольнойОперации( + ОбратныйВызов(ДополнительныеПараметры), + ПараметрыРаботы, + НСтр("ru = 'Проверка работоспособности'", КодЯзыка), , + НовыеПараметрыОперации()); + +КонецПроцедуры + +#КонецОбласти + +#Область Прочее + +&НаКлиенте +Процедура ЦиклПроверки() + + ОбработкаСледующая = РеестрФункций[0]; // ОписаниеОповещения + + ИмяПроверки = ОбработкаСледующая.ДополнительныеПараметры.ИмяПроверки; + НашлиСтроки = БазовыеФункции.НайтиСтроки(Новый Структура("ИмяПроверки", ИмяПроверки)); + Если НашлиСтроки.Количество() = 1 Тогда + НашлиСтроки[0].Статус = "Ожидание"; + КонецЕсли; + + ВыполнитьОбработкуОповещения(ОбработкаСледующая, НастройкиПользователя); + + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +// Продолжение процедуры ЦиклПроверки. +&НаКлиенте +Процедура ЦиклПроверкиПослеВыполнения(ПараметрыРаботы, ДополнительныеПараметры) Экспорт + + Если НЕ Открыта() Тогда + СтатусПроверки = "Ошибка"; + Возврат; + КонецЕсли; + + ИмяПроверки = ДополнительныеПараметры.ИмяПроверки; + КритичнаяОшибка = Ложь; + ОписаниеОшибки = ""; + + Если ПараметрыРаботы.Свойство("НастройкиПользователя") Тогда + НастройкиПользователя = ПараметрыРаботы.НастройкиПользователя; + КонецЕсли; + + Если НЕ ПараметрыРаботы.Выполнено Тогда + ОписаниеОшибки = ПараметрыРаботы.Ошибка; + Если ИмяПроверки = "ВыбратьСертификат" Тогда + КритичнаяОшибка = Истина; + ИначеЕсли ИмяПроверки = "СвойстваСертификата" Тогда + КритичнаяОшибка = Истина; + Иначе + КритичнаяОшибка = СервисКриптографииDSSКлиентСервер.ТребуетсяВводКонфиденциальныхДанных(НастройкиПользователя.ТокенАвторизации.Токен); + КонецЕсли; + КонецЕсли; + + НашлиСтроки = БазовыеФункции.НайтиСтроки(Новый Структура("ИмяПроверки", ИмяПроверки)); + Если НашлиСтроки.Количество() = 0 Тогда + ОписаниеОшибки = НСтр("ru = 'Не найден раздел'", КодЯзыка); + КритичнаяОшибка = Истина; + Иначе + НашлиСтроки[0].Статус = ?(НЕ ПараметрыРаботы.Выполнено, "Ошибка", "Успешно"); + КонецЕсли; + + Если КритичнаяОшибка Тогда + Элементы.ДекорацияОшибка.Заголовок = ОписаниеОшибки; + РеестрФункций.Очистить(); + Иначе + РеестрФункций.Удалить(0); + УстановитьДанныеОперации(ПараметрыРаботы, НашлиСтроки[0]); + КонецЕсли; + + Если РеестрФункций.Количество() > 0 Тогда + ПодключитьОбработчикОжидания("ЦиклПроверки", 0.1, Истина); + ИначеЕсли КритичнаяОшибка Тогда + СтатусПроверки = "Ошибка"; + УправлениеФормой(ЭтотОбъект); + Иначе + СтатусПроверки = "Успешно"; + УправлениеФормой(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДанныеОперации(ПараметрыРаботы, ДанныеРаздела) + + ИмяПроверки = ДанныеРаздела.ИмяПроверки; + НовыеДанные = Неопределено; + Если ПараметрыРаботы.Выполнено + И ИмяПроверки <> "ПроизвольноеПодтверждение" Тогда + НовыеДанные = ПараметрыРаботы.Результат; + КонецЕсли; + + ДанныеРаздела.Ошибка = ПараметрыРаботы.Ошибка; + + Если ИмяПроверки = "ВыбратьСертификат" Тогда + Сертификат = НовыеДанные; + ИначеЕсли ИмяПроверки = "СвойстваСертификата" Тогда + ОбъектСертификата = НовыеДанные; + ИначеЕсли ИмяПроверки = "ЗашифроватьCMS" Тогда + ДанныеОперации = НовыеДанные; + ИначеЕсли ИмяПроверки = "ЗашифроватьXML" Тогда + ДанныеОперацииXML = НовыеДанные; + ИначеЕсли ИмяПроверки = "ПодписатьCMS" Тогда + ДанныеОперации = НовыеДанные; + ИначеЕсли ИмяПроверки = "ПодписатьXML" Тогда + ДанныеОперацииXML = НовыеДанные; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ОбратныйВызов(ПараметрыВызова) + + Результат = Новый ОписаниеОповещения("ЦиклПроверкиПослеВыполнения", ЭтотОбъект, ПараметрыВызова); + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ПодготовитьРезультаты() + + Результат = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + Счетчик = 0; + + Для каждого СтрокаТаблицы Из БазовыеФункции Цикл + Если НЕ СтрокаТаблицы.Выполнить Тогда + Продолжить; + КонецЕсли; + + Проверен = Ложь; + Если СтрокаТаблицы.Статус = "Успешно" Тогда + Проверен = Истина; + Счетчик = Счетчик + 1; + КонецЕсли; + СписокОпераций.Вставить(СтрокаТаблицы.ИмяПроверки, Проверен); + + КонецЦикла; + + ДанныеПроверки = Новый Структура;; + ДанныеПроверки.Вставить("Успешно", Счетчик); + ДанныеПроверки.Вставить("СписокОпераций", СписокОпераций); + + Результат.Вставить("Результат", ДанныеПроверки); + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +// Возвращаемое значение: +// Массив из ОписаниеОповещения +// +&НаКлиенте +Функция ПодготовитьРеестрПроверки() + + МассивПроверки = Новый Массив; + + Для каждого СтрокаТаблицы Из БазовыеФункции Цикл + СтрокаТаблицы.Статус = ""; + СтрокаТаблицы.Ошибка = ""; + Если СтрокаТаблицы.Выполнить Тогда + ДополнительныеПараметры = Новый Структура(); + ДополнительныеПараметры.Вставить("ИмяПроверки", СтрокаТаблицы.ИмяПроверки); + НовоеОповещение = ПодготовитьОбъектОповещения(СтрокаТаблицы.ИмяПроверки, СтрокаТаблицы.ИмяФункции); + МассивПроверки.Добавить(НовоеОповещение); + КонецЕсли; + КонецЦикла; + + Возврат МассивПроверки; + +КонецФункции + +&НаКлиенте +Функция ПодготовитьОбъектОповещения(ИмяПроверки, ИмяФункции) + + ДополнительныеПараметры = Новый Структура(); + ДополнительныеПараметры.Вставить("ИмяПроверки", ИмяПроверки); + + Если ИмяФункции = "ВыбратьСертификат" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ВыбратьСертификат", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ПолучитьДанныеСертификата" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ПолучитьДанныеСертификата", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ЗашифроватьCMS" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ЗашифроватьCMS", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ЗашифроватьXML" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ЗашифроватьXML", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "РасшифроватьCMS" Тогда + НовоеОповещение = Новый ОписаниеОповещения("РасшифроватьCMS", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "РасшифроватьXML" Тогда + НовоеОповещение = Новый ОписаниеОповещения("РасшифроватьXML", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ПодписатьCMS" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ПодписатьCMS", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ПодписатьXML" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ПодписатьXML", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ПроверитьСертификат" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ПроверитьСертификат", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ПроверитьПодпись" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ПроверитьПодпись", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ПроверитьПодписьXML" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ПроверитьПодписьXML", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "Хешировать" Тогда + НовоеОповещение = Новый ОписаниеОповещения("Хешировать", ЭтотОбъект, ДополнительныеПараметры); + ИначеЕсли ИмяФункции = "ПроизвольноеПодтверждение" Тогда + НовоеОповещение = Новый ОписаниеОповещения("ПроизвольноеПодтверждение", ЭтотОбъект, ДополнительныеПараметры); + Иначе + НовоеОповещение = Неопределено; + КонецЕсли; + + Возврат НовоеОповещение; + +КонецФункции + +&НаКлиенте +Процедура ПровестиПроверку() + + Элементы.ДекорацияОшибка.Заголовок = ""; + СтатусПроверки = "Ожидание"; + + РеестрФункций = ПодготовитьРеестрПроверки(); + ИсходныйТекст = "120"; + ДанныеОперацииXML = Неопределено; + ДанныеОперации = Неопределено; + Сертификат = Неопределено; + + УправлениеФормой(ЭтотОбъект); + Если РеестрФункций.Количество() > 0 Тогда + ЦиклПроверки(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция НовыеПараметрыОперации() + + ПараметрыОперации = Новый Структура(); + + Возврат ПараметрыОперации; + +КонецФункции + +&НаСервере +Процедура ПодготовитьФорму() + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + БазовыеФункции.Очистить(); + + ДобавитьЭлементПроверки("Сертификат", "ВыбратьСертификат", НСтр("ru = 'Выбор сертификата'", КодЯзыка), "ВыбратьСертификат"); + ДобавитьЭлементПроверки("Сертификат", "СвойстваСертификата", НСтр("ru = 'Получить свойства сертификата'", КодЯзыка), "ПолучитьДанныеСертификата"); + + ДобавитьЭлементПроверки("Зашифровать", "ЗашифроватьCMS", НСтр("ru = 'Зашифровать произвольные данные'", КодЯзыка), "ЗашифроватьCMS"); + ДобавитьЭлементПроверки("Зашифровать", "ЗашифроватьXML", НСтр("ru = 'Зашифровать XML данные'", КодЯзыка), "ЗашифроватьXML"); + + ДобавитьЭлементПроверки("Расшифровать", "РасшифроватьCMS", НСтр("ru = 'Расшифровать произвольные данные'", КодЯзыка), "РасшифроватьCMS"); + ДобавитьЭлементПроверки("Расшифровать", "РасшифроватьXML", НСтр("ru = 'Расшифровать XML данные'", КодЯзыка), "РасшифроватьXML"); + + ДобавитьЭлементПроверки("Подписать", "ПодписатьCMS", НСтр("ru = 'Подписать произвольные данные'", КодЯзыка), "ПодписатьCMS"); + ДобавитьЭлементПроверки("Подписать", "ПодписатьXML", НСтр("ru = 'Подписать XML данные'", КодЯзыка), "ПодписатьXML"); + + ДобавитьЭлементПроверки("Прочее", "ПроверитьСертификат", НСтр("ru = 'Проверить сертификат'", КодЯзыка), "ПроверитьСертификат"); + ДобавитьЭлементПроверки("Прочее", "ПроверитьПодпись", НСтр("ru = 'Проверить подпись'", КодЯзыка), "ПроверитьПодпись"); + ДобавитьЭлементПроверки("Прочее", "ПроверитьПодписьXML", НСтр("ru = 'Проверить подпись XML'", КодЯзыка), "ПроверитьПодписьXML"); + ДобавитьЭлементПроверки("Прочее", "Хешировать", НСтр("ru = 'Хешировать данные'", КодЯзыка), "Хешировать"); + ДобавитьЭлементПроверки("Прочее", "ПроизвольноеПодтверждение", НСтр("ru = 'Подтвердить операцию'", КодЯзыка), "ПроизвольноеПодтверждение"); + + ДобавитьРазделПроверки("Сертификат", НСтр("ru = 'Сертификат'", КодЯзыка)); + ДобавитьРазделПроверки("Зашифровать", НСтр("ru = 'Зашифровать'", КодЯзыка)); + ДобавитьРазделПроверки("Расшифровать", НСтр("ru = 'Расшифровать'", КодЯзыка)); + ДобавитьРазделПроверки("Подписать", НСтр("ru = 'Подписание'", КодЯзыка)); + ДобавитьРазделПроверки("Прочее", НСтр("ru = 'Прочее'", КодЯзыка)); + + ОтобразитьДеревоНаФорме(); + +КонецПроцедуры + +&НаСервере +Процедура ОтобразитьДеревоНаФорме() + + Для каждого СтрокаТаблицы Из БазовыеФункции Цикл + + ИмяЭлемента = СтрокаТаблицы.ИмяПроверки; + ЭлементГруппы = Элементы.Добавить("Группа" + ИмяЭлемента, Тип("ГруппаФормы"), Элементы.ГруппаПроверки); + ЭлементГруппы.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ЭлементГруппы.ОтображатьЗаголовок = Ложь; + ЭлементГруппы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда; + + Если СтрокаТаблицы.Выполнить Тогда + ЭлементСтатуса = Элементы.Добавить("Статус" + ИмяЭлемента, Тип("ДекорацияФормы"), ЭлементГруппы); + ЭлементСтатуса.Вид = ВидДекорацииФормы.Картинка; + ЭлементСтатуса.РазмерКартинки = РазмерКартинки.АвтоРазмер; + ЭлементСтатуса.Высота = 1; + ЭлементСтатуса.Ширина = 3; + КонецЕсли; + + ЭлементОписания = Элементы.Добавить("Описание" + ИмяЭлемента, Тип("ДекорацияФормы"), ЭлементГруппы); + ЭлементОписания.Вид = ВидДекорацииФормы.Надпись; + ЭлементОписания.АвтоМаксимальнаяШирина = Ложь; + ЭлементОписания.РастягиватьПоГоризонтали = НЕ СтрокаТаблицы.Выполнить; + ЭлементОписания.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка; + + Если СтрокаТаблицы.Выполнить Тогда + ЭлементОписания.Заголовок = СтрокаТаблицы.Описание; + Иначе + ЭлементОписания.Заголовок = СтрокаТаблицы.Описание; + ЭлементОписания.ЦветФона = WebЦвета.Бежевый; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ДобавитьЭлементПроверки(ИмяРаздела, ИмяПроверки, Описание, ИмяФункции) + + Если СписокОпераций.Свойство(ИмяПроверки) Тогда + НовыйЭлемент = БазовыеФункции.Добавить(); + НовыйЭлемент.Выполнить = Истина; + НовыйЭлемент.ИмяРаздела = ИмяРаздела; + НовыйЭлемент.ИмяПроверки= ИмяПроверки; + НовыйЭлемент.Описание = Описание; + НовыйЭлемент.ИмяФункции = ИмяФункции; + НовыйЭлемент.Статус = ""; + КонецЕсли; + + Возврат НовыйЭлемент; + +КонецФункции + +&НаСервере +Функция ДобавитьРазделПроверки(ИмяРаздела, Описание) + + СтрокаПоиска = Новый Структура("ИмяРаздела, Выполнить", ИмяРаздела, Истина); + НашлиСтроки = БазовыеФункции.НайтиСтроки(СтрокаПоиска); + + Если НашлиСтроки.Количество() > 0 Тогда + ИндексСтроки = БазовыеФункции.Индекс(НашлиСтроки[0]); + НовыйЭлемент = БазовыеФункции.Вставить(ИндексСтроки); + НовыйЭлемент.Выполнить = Ложь; + НовыйЭлемент.ИмяРаздела = ИмяРаздела; + НовыйЭлемент.ИмяПроверки= ИмяРаздела; + НовыйЭлемент.Описание = Описание; + НовыйЭлемент.ИмяФункции = ""; + НовыйЭлемент.Статус = ""; + КонецЕсли; + + Возврат НовыйЭлемент; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(КонтекстФормы) + + СтатусПроверки = КонтекстФормы.СтатусПроверки; + Если СтатусПроверки = "Начало" Тогда + ЗаголовокКнопки = "Начать"; + ИначеЕсли СтатусПроверки = "Успешно" Тогда + ЗаголовокКнопки = "ОК"; + ИначеЕсли СтатусПроверки = "Ошибка" Тогда + ЗаголовокКнопки = "Повторить"; + ИначеЕсли СтатусПроверки = "Ожидание" Тогда + ЗаголовокКнопки = "Проверяется"; + КонецЕсли; + + КонтекстФормы.Элементы.Начать.Заголовок = ЗаголовокКнопки; + КонтекстФормы.Элементы.Начать.Доступность = СтатусПроверки <> "Ожидание"; + + Для каждого СтрокаТаблицы Из КонтекстФормы.БазовыеФункции Цикл + Если СтрокаТаблицы.Выполнить Тогда + ЭлементФормы = КонтекстФормы.Элементы["Статус" + СтрокаТаблицы.ИмяПроверки]; + Если СтрокаТаблицы.Статус = "Ошибка" Тогда + ЭлементФормы.Картинка = КонтекстФормы.Картинки.Ошибка32; + ИначеЕсли СтрокаТаблицы.Статус = "Успешно" Тогда + ЭлементФормы.Картинка = КонтекстФормы.Картинки.Успешно; + ИначеЕсли СтрокаТаблицы.Статус = "Ожидание" Тогда + ЭлементФормы.Картинка = КонтекстФормы.Картинки.ДлительнаяОперация16; + Иначе + ЭлементФормы.Картинка = КонтекстФормы.Картинки.Пустая; + КонецЕсли; + ЭлементФормы = КонтекстФормы.Элементы["Описание" + СтрокаТаблицы.ИмяПроверки]; + ЭлементФормы.Подсказка = СтрокаТаблицы.Ошибка; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьСвойствоПодписи(ТипПодписи) + + Результат = Новый Структура; + + Если ТипПодписи = "XML" Тогда + Результат = СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиXML("Включенная"); + ИначеЕсли ТипПодписи = "CMS" Тогда + Результат = СервисКриптографииDSSКлиентСервер.ПолучитьСвойствоПодписиCMS(Истина, Ложь); + КонецЕсли; + + СервисКриптографииDSSКлиентСервер.ПолучитьИнформациюДокументаДляПодписи(Результат, НСтр("ru = 'Тестовый пример'"), "XML"); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ВесьСписокОпераций() + + Результат = Новый Структура; + + Результат.Вставить("ВыбратьСертификат", Ложь); + Результат.Вставить("СвойстваСертификата", Ложь); + + Результат.Вставить("ЗашифроватьCMS", Ложь); + Результат.Вставить("ЗашифроватьXML", Ложь); + + Результат.Вставить("РасшифроватьCMS", Ложь); + Результат.Вставить("РасшифроватьXML", Ложь); + + Результат.Вставить("ПодписатьCMS", Ложь); + Результат.Вставить("ПодписатьXML", Ложь); + + Результат.Вставить("ПроверитьСертификат", Ложь); + Результат.Вставить("ПроверитьПодпись", Ложь); + Результат.Вставить("ПроверитьПодписьXML", Ложь); + Результат.Вставить("Хешировать", Ложь); + Результат.Вставить("ПроизвольноеПодтверждение", Ложь); + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ПолучитьКартинку(ИмяКартинки) + + Картинки.Вставить(ИмяКартинки, Новый Картинка); + Если Метаданные.ОбщиеКартинки.Найти(ИмяКартинки) <> Неопределено Тогда + Картинки.Вставить(ИмяКартинки, БиблиотекаКартинок[ИмяКартинки]); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Form.form new file mode 100644 index 000000000..2f2aba1dd --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Form.form @@ -0,0 +1,1162 @@ + + + + <key>ru</key> + <value>Расширенные настройки</value> + + + ГруппаСтраницы + 32 + + СтраницыПрочие + 34 + + Наименование + 29 + true + true + + true + + + Наименование + + + НаименованиеРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 30 + true + + InputField + Enter + true + Left + true + + 30 + true + true + true + true + true + true + Normal + + + + ТаймАут + 22 + + <key>ru</key> + <value>Таймаут (сек.)</value> + + true + true + + true + + + ТаймАут + + + ТаймАутРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + ТаймАутКонтекстноеМеню + 23 + true + + InputField + Enter + true + Left + true + + 5 + true + true + true + true + true + true + Normal + + + + ШаблонПодтверждения + 11 + true + true + + true + + + ШаблонПодтверждения + + + ru + Имя шаблона операции произвольного подтверждения, который зарегистрирован на сервере облачной криптографии. +Необходим для операций не требующих доступа к закрытому ключу. + + Button + + ШаблонПодтвержденияРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ШаблонПодтвержденияКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + 15 + true + true + true + true + true + true + Normal + + + + ВерсияАПИ + 3 + + <key>ru</key> + <value>Версия API</value> + + true + true + + true + + + ВерсияАПИ + + + ВерсияАПИРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + ВерсияАПИКонтекстноеМеню + 4 + true + + InputField + Enter + true + Left + true + + 13 + true + false + true + true + true + true + Normal + + + + Используется + 6 + true + true + + true + + + Используется + + + ru + При снятии данного флажка, исключается этот сервер из списка выбора + + Button + + ИспользуетсяРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + ИспользуетсяКонтекстноеМеню + 7 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Прочие</value> + + + СтраницыПрочиеРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаПервичнаяАвторизация + 36 + + ДекорацияОписаниеПервичной + 38 + + <key>ru</key> + <value>Если не заданы ограничения, то пользователю доступны все способы первичной авторизации.</value> + + true + true + + true + + + ДекорацияОписаниеПервичнойРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + ДекорацияОписаниеПервичнойКонтекстноеМеню + 39 + true + + Label + true + true + + Style.ПодтверждениеОперацииОписаниеЦвет + + + Left + + + + ПервичнаяАвторизация + 41 + + <key>ru</key> + <value>Первичная авторизация</value> + + true + true + + true + + + ПервичнаяАвторизация + + None + + ПервичнаяАвторизацияПометка + 87 + + <key>ru</key> + <value>Пометка</value> + + true + true + + true + + + ПервичнаяАвторизация.Check + + + ПервичнаяАвторизацияПометкаРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + + ПервичнаяАвторизацияПометкаКонтекстноеМеню + 88 + true + + CheckBoxField + Auto + true + Left + true + + + + ПервичнаяАвторизацияЗначение + 84 + + <key>ru</key> + <value>Значение</value> + + true + true + + true + + + ПервичнаяАвторизация.Value + + + ПервичнаяАвторизацияЗначениеРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ПервичнаяАвторизацияЗначениеКонтекстноеМеню + 85 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ПервичнаяАвторизацияКоманднаяПанель + 43 + Left + true + + + OnChange + ПервичнаяАвторизацияПриИзменении + + + ПервичнаяАвторизацияСтрокаПоиска + 45 + + ПервичнаяАвторизацияСтрокаПоискаРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ПервичнаяАвторизацияСтрокаПоискаКонтекстноеМеню + 46 + true + + ПервичнаяАвторизация + + true + + + + ПервичнаяАвторизацияСостояниеПросмотра + 48 + + ПервичнаяАвторизацияСостояниеПросмотраРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ПервичнаяАвторизацияСостояниеПросмотраКонтекстноеМеню + 49 + true + + ViewStatusAddition + ПервичнаяАвторизация + + true + + + + ПервичнаяАвторизацияУправлениеПоиском + 51 + + ПервичнаяАвторизацияУправлениеПоискомРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ПервичнаяАвторизацияУправлениеПоискомКонтекстноеМеню + 52 + true + + SearchControlAddition + ПервичнаяАвторизация + + true + + + + ПервичнаяАвторизацияРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ПервичнаяАвторизацияКонтекстноеМеню + 42 + true + + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + AsFileRef + + ПервичнаяАвторизация.Picture + + true + + true + true + + true + + + <key>ru</key> + <value>Первичная авторизация</value> + + + СтраницаПервичнаяАвторизацияРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаВторичнаяАвторизация + 60 + + ДекорацияОписаниеВторичной + 62 + + <key>ru</key> + <value>Если не заданы ограничения, то пользователю доступны все способы вторичной авторизации.</value> + + true + true + + true + + + ДекорацияОписаниеВторичнойРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ДекорацияОписаниеВторичнойКонтекстноеМеню + 63 + true + + Label + true + true + + Style.ПодтверждениеОперацииОписаниеЦвет + + + Left + + + + ВторичнаяАвторизация + 65 + + <key>ru</key> + <value>Вторичная авторизация</value> + + true + true + + true + + + ВторичнаяАвторизация + + None + + ВторичнаяАвторизацияПометка + 81 + + <key>ru</key> + <value>Пометка</value> + + true + true + + true + + + ВторичнаяАвторизация.Check + + + ВторичнаяАвторизацияПометкаРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + ВторичнаяАвторизацияПометкаКонтекстноеМеню + 82 + true + + CheckBoxField + Auto + true + Left + true + + + + ВторичнаяАвторизацияЗначение + 78 + + <key>ru</key> + <value>Значение</value> + + true + true + + true + + + ВторичнаяАвторизация.Value + + + ВторичнаяАвторизацияЗначениеРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + + ВторичнаяАвторизацияЗначениеКонтекстноеМеню + 79 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + ВторичнаяАвторизацияКоманднаяПанель + 67 + Left + true + + + OnChange + ВторичнаяАвторизацияПриИзменении + + + ВторичнаяАвторизацияСтрокаПоиска + 69 + + ВторичнаяАвторизацияСтрокаПоискаРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + + ВторичнаяАвторизацияСтрокаПоискаКонтекстноеМеню + 70 + true + + ВторичнаяАвторизация + + true + + + + ВторичнаяАвторизацияСостояниеПросмотра + 72 + + ВторичнаяАвторизацияСостояниеПросмотраРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + + ВторичнаяАвторизацияСостояниеПросмотраКонтекстноеМеню + 73 + true + + ViewStatusAddition + ВторичнаяАвторизация + + true + + + + ВторичнаяАвторизацияУправлениеПоиском + 75 + + ВторичнаяАвторизацияУправлениеПоискомРасширеннаяПодсказка + 77 + Label + true + true + + Left + + + + ВторичнаяАвторизацияУправлениеПоискомКонтекстноеМеню + 76 + true + + SearchControlAddition + ВторичнаяАвторизация + + true + + + + ВторичнаяАвторизацияРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ВторичнаяАвторизацияКонтекстноеМеню + 66 + true + + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + AsFileRef + + ВторичнаяАвторизация.Picture + + true + + true + true + + true + + + <key>ru</key> + <value>Вторичная авторизация</value> + + + СтраницаВторичнаяАвторизацияРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + ГруппаСтраницыРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ОК + 25 + true + true + + true + + + ОКРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 27 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + ШаблонПодтверждения + + <key>ru</key> + <value>Шаблон подтверждения</value> + + 2 + + String + + 30 + + + + true + + + true + + true + + + Используется + + <key>ru</key> + <value>Используется</value> + + 4 + + Boolean + + + true + + + true + + true + + + ВерсияАПИ + + <key>ru</key> + <value>Версия АПИ</value> + + 5 + + String + + 10 + + + + true + + + true + + true + + + ТаймАут + + <key>ru</key> + <value>Таймаут</value> + + 7 + + Number + + 4 + true + + + + true + + + true + + true + + + Наименование + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + + + true + + + true + + + + ВторичнаяАвторизация + + <key>ru</key> + <value>Вторичная авторизация</value> + + 6 + + ValueList + + + true + + + true + + true + + + EnumRef.СпособыАвторизацииDSS + + + + + ПервичнаяАвторизация + + <key>ru</key> + <value>Первичная авторизация</value> + + 8 + + ValueList + + + true + + + true + + true + + + EnumRef.СпособыАвторизацииDSS + + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + СпособыАвторизации + + + + ТолькоПросмотр + + Boolean + + + + Заголовок + + String + + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Help/ru.html new file mode 100644 index 000000000..4e44868d6 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Help/ru.html @@ -0,0 +1,17 @@ + + +

      + +Содержит дополнительные настройки сервера +облачной подписи и позволит администратору ограничить
      список +доступных пользователю способы авторизации в сервисе облачной подписи.

      • + +В поле представление указывается наименование сервера, оно будет отображено на списках.
      • В поле таймаут указывается время ожидания ответа от сервиса. 
      • В поле шаблон подтверждения указывает имя шаблона, как она было зарегистрирована сервере облачной подписи.
      • В поле версия API необходимо для определения способов подключения к серверу облачной подписи. 
      • Флажок используется позволяет регулировать доступность данного элемента справочника в списках выбора.

      Первичная авторизация

      + +
      • Пометка включает строку в список доступных способов.
      • +
      • В поле Наименование выводится наименование способа. 
      • +

      Вторичная авторизация

      + +
      • Пометка включает строку в список доступных способов поле.
      • +
      • В поле Наименование выводится наименование способа. 
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Module.bsl new file mode 100644 index 000000000..118f86810 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/РасширенныеНастройкиСервера/Module.bsl @@ -0,0 +1,201 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ЗаполнитьЗначенияПараметров(Параметры); + ТолькоПросмотр = Параметры.ТолькоПросмотр; + + Заголовок = НСтр("ru = 'Расширенные настройки:'", СервисКриптографииDSSСлужебный.КодЯзыка()) + " " + Параметры.Заголовок; + ВсеВерсии = СервисКриптографииDSSКлиентСервер.ПоддерживаемыеВерсии(); + Элементы.ВерсияАПИ.СписокВыбора.ЗагрузитьЗначения(ВсеВерсии); + + ПервичнаяАвторизация.ЗагрузитьЗначения(СервисКриптографииDSSСлужебный.ДоступныеСпособыПервичнойАвторизации()); + ВторичнаяАвторизация.ЗагрузитьЗначения(СервисКриптографииDSSСлужебный.ДоступныеСпособыВторичнойАвторизации()); + СервисКриптографииDSSКлиентСервер.ПолучитьПредставлениеСпособовАвторизации(ПервичнаяАвторизация); + СервисКриптографииDSSКлиентСервер.ПолучитьПредставлениеСпособовАвторизации(ВторичнаяАвторизация); + + СпособыАвторизации = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Параметры, "СпособыАвторизации", Новый Массив); + Для каждого СтрокаМассива Из СпособыАвторизации Цикл + НашлиПервичную = ПервичнаяАвторизация.НайтиПоЗначению(СтрокаМассива); + НашлиВторичную = ВторичнаяАвторизация.НайтиПоЗначению(СтрокаМассива); + Если НашлиПервичную <> Неопределено Тогда + НашлиПервичную.Пометка = Истина; + КонецЕсли; + Если НашлиВторичную <> Неопределено Тогда + НашлиВторичную.Пометка = Истина; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + ОбновитьСтатусОграничения("Первичная"); + ОбновитьСтатусОграничения("Вторичная"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыПервичнаяАвторизация + +&НаКлиенте +Процедура ПервичнаяАвторизацияПриИзменении(Элемент) + + ОбновитьСтатусОграничения("Первичная"); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыВторичнаяАвторизация + +&НаКлиенте +Процедура ВторичнаяАвторизацияПриИзменении(Элемент) + + ОбновитьСтатусОграничения("Вторичная"); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + Если Модифицированность Тогда + Результат = Новый Структура(СписокРеквизитов()); + ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект); + Результат.Вставить("СпособыАвторизации", ПолучитьВариантыАвторизации()); + РезультатВыбора = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + РезультатВыбора.Вставить("Результат", Результат); + Иначе + РезультатВыбора = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + КонецЕсли; + + ЗакрытьФорму(РезультатВыбора); + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + ЗакрытьФорму(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ОбновитьСтатусОграничения(ВидОграничения) + + Если ВидОграничения = "Первичная" Тогда + ТекущийСписок = ПервичнаяАвторизация; + ЭлементЗаголовка = Элементы.ДекорацияОписаниеПервичной; + Иначе + ТекущийСписок = ВторичнаяАвторизация; + ЭлементЗаголовка = Элементы.ДекорацияОписаниеВторичной; + КонецЕсли; + + ВсегоПометок = 0; + Для Каждого СтрокаСписка Из ТекущийСписок Цикл + ВсегоПометок = ВсегоПометок + ?(СтрокаСписка.Пометка, 1, 0); + КонецЦикла; + + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + Если ВсегоПометок = 0 Тогда + ЭлементЗаголовка.Заголовок = НСтр("ru = 'По умолчанию доступны все способы авторизации.'", КодЯзыка); + ИначеЕсли ВсегоПометок = ТекущийСписок.Количество() Тогда + ЭлементЗаголовка.Заголовок = НСтр("ru = 'Доступны все способы авторизации.'", КодЯзыка); + Иначе + ЭлементЗаголовка.Заголовок = НСтр("ru = 'Способы авторизации ограничены списком.'", КодЯзыка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПолучитьВариантыАвторизации() + + Результат = Новый Массив; + + Для Каждого СтрокаСписка Из ПервичнаяАвторизация Цикл + Если СтрокаСписка.Пометка Тогда + Результат.Добавить(СтрокаСписка.Значение); + КонецЕсли; + КонецЦикла; + + Для Каждого СтрокаСписка Из ВторичнаяАвторизация Цикл + Если СтрокаСписка.Пометка Тогда + Результат.Добавить(СтрокаСписка.Значение); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаСервере +Функция СписокРеквизитов() + + Результат = "ВерсияАПИ, ШаблонПодтверждения, ТаймАут, Используется, Наименование"; + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьЗначенияПараметров(ПараметрыФормы) + + ВсеПоля = Новый Структура(СписокРеквизитов()); + ЗаполнитьЗначенияСвойств(ВсеПоля, ПараметрыФормы); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, ВсеПоля); + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Form.form new file mode 100644 index 000000000..368dbd7ec --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Form.form @@ -0,0 +1,1333 @@ + + + + <key>ru</key> + <value>Сертификат</value> + + + ГруппаСтраницы + 1 + + ГруппаОбщие + 3 + + ДекорацияПусто1 + 96 + true + true + + true + + + ДекорацияПусто1РасширеннаяПодсказка + 98 + Label + true + true + + Left + + + + ДекорацияПусто1КонтекстноеМеню + 97 + true + + Label + true + true + + Left + + + + КомуВыдан + 20 + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + КомуВыдан + + true + + КомуВыданРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КомуВыданКонтекстноеМеню + 21 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + + Style.FormBackColor + + Normal + + + + ГруппаПрочее + 18 + + КемВыдан + 23 + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + КемВыдан + + true + + КемВыданРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + КемВыданКонтекстноеМеню + 24 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + + Style.FormBackColor + + Normal + + + + ГруппаДействителен + 108 + + ДействителенС + 102 + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + ДействителенС + + true + + ДействителенСРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + + ДействителенСКонтекстноеМеню + 103 + true + + InputField + true + Enter + true + Left + true + + 10 + true + true + true + true + + Style.FormBackColor + + Normal + + + + ДействителенПо + 105 + + <key>ru</key> + <value>по</value> + + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + ДействителенПо + + true + + ДействителенПоРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + + ДействителенПоКонтекстноеМеню + 106 + true + + InputField + true + Enter + true + Left + true + + 10 + true + true + true + true + + Style.FormBackColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Действителен</value> + + + ГруппаДействителенРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + Отпечаток + 93 + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + Отпечаток + + true + + ОтпечатокРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + + ОтпечатокКонтекстноеМеню + 94 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + + Style.FormBackColor + + Normal + + + true + true + + true + + + <key>ru</key> + <value>Прочее</value> + + + ГруппаПрочееРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ДекорацияПусто + 81 + true + true + + true + + + ДекорацияПустоРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + ДекорацияПустоКонтекстноеМеню + 82 + true + + Label + true + true + true + + Left + + + + ГруппаПинКод + 34 + + ДекорацияПинКод + 36 + + <key>ru</key> + <value>Декорация пин код</value> + + true + true + + true + + + ДекорацияПинКодРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ДекорацияПинКодКонтекстноеМеню + 37 + true + + true + true + + + CommonPicture.Зашифрован + + AsFileRef + + + + ДекорацияПинКодОписание + 39 + + <key>ru</key> + <value>На закрытый ключ сертификата установлен пин-код</value> + + true + true + + true + + + ДекорацияПинКодОписаниеРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ДекорацияПинКодОписаниеКонтекстноеМеню + 40 + true + + Label + true + true + + Left + + + + СменитьПинКод + 79 + true + true + + true + + false + + СменитьПинКодРасширеннаяПодсказка + 80 + Label + true + true + + Left + + + Hyperlink + Form.Command.СменитьПинКод + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Пин-код</value> + + + ГруппаПинКодРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Общие</value> + + + ГруппаОбщиеРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ГруппаСостав + 42 + + ТаблицаСостава + 44 + + <key>ru</key> + <value>Таблица состава</value> + + true + true + + true + + + ТаблицаСостава + + None + + ТаблицаСоставаПредставление + 60 + true + true + + true + + + ТаблицаСостава.Представление + + + ТаблицаСоставаПредставлениеРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ТаблицаСоставаПредставлениеКонтекстноеМеню + 61 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСоставаЗначение + 63 + true + true + + true + + + ТаблицаСостава.Значение + + + ТаблицаСоставаЗначениеРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + ТаблицаСоставаЗначениеКонтекстноеМеню + 64 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСоставаКоманднаяПанель + 46 + Left + + + ТаблицаСоставаСтрокаПоиска + 48 + + ТаблицаСоставаСтрокаПоискаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + ТаблицаСоставаСтрокаПоискаКонтекстноеМеню + 49 + true + + ТаблицаСостава + + true + + + + ТаблицаСоставаСостояниеПросмотра + 51 + + ТаблицаСоставаСостояниеПросмотраРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ТаблицаСоставаСостояниеПросмотраКонтекстноеМеню + 52 + true + + ViewStatusAddition + ТаблицаСостава + + true + + + + ТаблицаСоставаУправлениеПоиском + 54 + + ТаблицаСоставаУправлениеПоискомРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + + ТаблицаСоставаУправлениеПоискомКонтекстноеМеню + 55 + true + + SearchControlAddition + ТаблицаСостава + + true + + + + ТаблицаСоставаРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ТаблицаСоставаКонтекстноеМеню + 45 + true + + true + true + true + true + MultiRow +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + true + true + true + true + AsFileRef + true + +
      + + ТаблицаСоставаТекущееЗначение + 66 + true + true + + true + + + Items.ТаблицаСостава.CurrentData.Значение + + None + + ТаблицаСоставаТекущееЗначениеРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + + ТаблицаСоставаТекущееЗначениеКонтекстноеМеню + 67 + true + + InputField + Enter + true + Left + true + + 4 + true + true + true + true + true + true + Normal + + + + ГруппаКоманды + 69 + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + Right + + ГруппаКомандыРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Прочее</value> + + + ГруппаСоставРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + Page + + Vertical + auto + false + +
      + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + ГруппаСтраницыРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
      + Top + true + + ФормаКоманднаяПанель + -1 + + ФормаЗакрыть + 110 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + + Проверить + 73 + true + true + + true + + + ПроверитьРасширеннаяПодсказка + 74 + Label + true + true + + Left + + + Form.Command.Проверить + Normal + Auto + true + true + UserCmds + Auto + + + Скопировать + 75 + true + true + + true + + + СкопироватьРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + Form.Command.Скопировать + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + КомуВыдан + + <key>ru</key> + <value>Кому выдан</value> + + 3 + + String + + + + true + + + true + + + + КемВыдан + + <key>ru</key> + <value>Кем выдан</value> + + 4 + + String + + + + true + + + true + + + + ДействителенС + + <key>ru</key> + <value>Действителен с</value> + + 5 + + Date + + + + true + + + true + + + + ДействителенПо + + <key>ru</key> + <value>Действителен по</value> + + 6 + + Date + + + + true + + + true + + + + ТаблицаСостава + + <key>ru</key> + <value>Таблица состава</value> + + 7 + + ValueTable + + + true + + + true + + + Представление + + <key>ru</key> + <value>Поле</value> + + 2 + + String + + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Значение</value> + + 3 + + String + + + + true + + + true + + + + Картинка + 4 + + Number + + 10 + + + + true + + + true + + + + + СведенияСертификата + 9 + + + true + + + true + + + + ДанныеСертификата + 8 + + + true + + + true + + + + Отпечаток + + <key>ru</key> + <value>Отпечаток</value> + + 10 + + String + + + + true + + + true + + + + НастройкиПользователя + 11 + + + true + + + true + + + + ТребуетсяПинКод + 12 + + Boolean + + + true + + + true + + + + ИдентификаторОбъекта + 13 + + String + + 10 + + + + true + + + true + + + + ПреобразоватьВремя + 2 + + Boolean + + + true + + + true + + + + РежимПросмотра + 14 + + String + + + + true + + + true + + + + Проверить + + <key>ru</key> + <value>Проверить</value> + + 2 + + ru + Проверить + + + true + + + + Проверить + + + Text + Auto + Auto + + + Скопировать + + <key>ru</key> + <value>Выгрузить в файл</value> + + 3 + + ru + Скопировать + + + true + + + StdPicture.Write + + + + СкопироватьСертификат + + + TextPicture + Auto + Auto + + + СменитьПинКод + + <key>ru</key> + <value>Изменить</value> + + 4 + + true + + + + СменитьПинкод + + + Auto + Auto + + + АдресСертификата + + String + + + + + СведенияСертификата + + + + РежимПросмотра + + String + + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Help/ru.html new file mode 100644 index 000000000..e9ff03b28 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Help/ru.html @@ -0,0 +1,28 @@ + + + + +

      Предназначена для вывода сведений о +сертификате хранящийся в сервисе облачной подписи.

      + +

      Отображается информация о сертификате, которую +предоставил сервер. Основные данные о сертификате

      + +
      • В поле кому выдан указывается + информация о владельце сертификата
      • +
      • В поле кем выдан + указывается информация об издателе сертификата
      • +
      • В поле действителен указывается дата начала и окончания действия + сертификата
      • +
      • В поле отпечаток  отображает + значение отпечатка в HEX представлении
      • +

      Действия с сертификатом

      + +
      • Кнопка проверить позволяет проверить валидность сертификат с помощью + сервиса проверки.
      • +
      • Кнопка выгрузить в файл выгружает содержимое сертификата в файл в + формате ASN. 
      • +
      • Если при использовании сервиса + облачной допускается применение пин-кодов для сертификатов, то по ссылке изменить можно инициировать + процесс смены, сброса или установки пин-кода.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Module.bsl new file mode 100644 index 000000000..92f3c74c4 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СвойствоСертификата/Module.bsl @@ -0,0 +1,410 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("НастройкиПользователя", НастройкиПользователя); + + Если ЗначениеЗаполнено(Параметры.АдресСертификата) Тогда + ДанныеСертификата = ПолучитьИзВременногоХранилища(Параметры.АдресСертификата); + КонецЕсли; + + СведенияСертификата = Параметры.СведенияСертификата; + РежимПросмотра = Параметры.РежимПросмотра; + + Если ЭтоСертификат(РежимПросмотра) Тогда + Если ТипЗнч(СведенияСертификата) = Тип("Структура") Тогда + Отпечаток = СведенияСертификата.Отпечаток; + ТребуетсяПинКод = СведенияСертификата.ТребуетсяПинКод; + ДействителенС = СведенияСертификата.ДатаНачала; + ДействителенПо = СведенияСертификата.ДатаОкончания; + ПреобразоватьВремя = Истина; + КонецЕсли; + + Если ТипЗнч(ДанныеСертификата) = Тип("ДвоичныеДанные") Тогда + СертификатОбъект = Новый СертификатКриптографии(ДанныеСертификата); + ЗаполнитьСведенияСертификатаДвоичныеДанные(СертификатОбъект); + Иначе + ЗаполнитьСведенияСертификатаОписание(ДанныеСертификата); + КонецЕсли; + + Если НастройкиПользователя = Неопределено + И ЗначениеЗаполнено(Отпечаток) Тогда + НастройкиПользователя = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователяПоСертификату(Отпечаток); + КонецЕсли; + + Если ЗначениеЗаполнено(Отпечаток) Тогда + ОписаниеСертификата = СервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоОтпечатку(Отпечаток); + Если ОписаниеСертификата <> Неопределено Тогда + ИдентификаторОбъекта = ОписаниеСертификата.Идентификатор; + КонецЕсли; + КонецЕсли; + + Иначе + Если ТипЗнч(ДанныеСертификата) = Тип("ДвоичныеДанные") Тогда + СвойстваЗапросаНаЗапрос = СервисКриптографииDSSASNКлиентСервер.ПолучитьСвойстваЗапросаНаСертификат(ДанныеСертификата); + ЗаполнитьСведенияЗапросаНаСертификат(СвойстваЗапросаНаЗапрос); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + УправлениеФормой(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Проверить(Команда) + + Если ТипЗнч(ДанныеСертификата) = Тип("Структура") Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("ПроверитьПослеПолученияДанных", ЭтотОбъект); + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("ИдентификаторОперации", УникальныйИдентификатор); + СервисКриптографииDSSКлиент.ПолучитьДанныеСертификата(ОповещениеСледующее, НастройкиПользователя, ИдентификаторОбъекта, ПараметрыОперации); + Иначе + ПараметрыВызова = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ПараметрыВызова.Вставить("Результат", ДанныеСертификата); + ПроверитьПослеПолученияДанных(ПараметрыВызова, Неопределено); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СменитьПинКод(Команда) + + ОписаниеСледующее = Новый ОписаниеОповещения("ПослеСменыПинКода", ЭтотОбъект); + СервисКриптографииDSSКлиент.СменитьПинКодСертификата(ОписаниеСледующее, НастройкиПользователя, ИдентификаторОбъекта); + +КонецПроцедуры + +&НаКлиенте +Процедура СкопироватьСертификат(Команда) + + Если ЭтоСертификат(РежимПросмотра) Тогда + Если ТипЗнч(ДанныеСертификата) = Тип("Структура") Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("СкопироватьСертификатПослеПолученияДанных", ЭтотОбъект); + СервисКриптографииDSSКлиент.ПолучитьДанныеСертификата(ОповещениеСледующее, НастройкиПользователя, ИдентификаторОбъекта); + Иначе + ПараметрыВызова = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ПараметрыВызова.Вставить("Результат", ДанныеСертификата); + СкопироватьСертификатПослеПолученияДанных(ПараметрыВызова, Неопределено); + КонецЕсли; + Иначе + ОповещениеСледующее = Новый ОписаниеОповещения("СкопироватьСертификатПослеЭкспортаСертификата", ЭтотОбъект); + СервисКриптографииDSSКлиент.СохранитьДанныеВФайл(ОповещениеСледующее, ДанныеСертификата, ".p10", Истина); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область АсинхронныеВызовы + +&НаКлиенте +Процедура ПроверитьПослеПолученияДанных(РезультатВызова, ВходящийКонтекст) Экспорт + + Если РезультатВызова.Выполнено Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("ПроверитьЗавершение", ЭтотОбъект); + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("ИдентификаторОперации", УникальныйИдентификатор); + СервисКриптографииDSSКлиент.ПроверитьСертификат(ОповещениеСледующее, НастройкиПользователя, РезультатВызова.Результат.Сертификат, ПараметрыОперации); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьЗавершение(Результат, ВходящийКонтекст) Экспорт + + Если Результат.Выполнено + И Результат.Результат Тогда + СервисКриптографииDSSКлиент.ВывестиИнформацию(Неопределено, + НСтр("ru = 'Сертификат действителен'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка())); + Иначе + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, Результат.Ошибка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СкопироватьСертификатПослеПолученияДанных(РезультатВызова, ДополнительныеПараметры) Экспорт + + Если РезультатВызова.Выполнено Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("СкопироватьСертификатПослеЭкспортаСертификата", ЭтотОбъект); + СервисКриптографииDSSКлиент.СохранитьДанныеВФайл(ОповещениеСледующее, РезультатВызова.Результат.Сертификат, ".cer", Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СкопироватьСертификатПослеЭкспортаСертификата(РезультатВызова, ДополнительныеПараметры) Экспорт + + ЗадатьВопрос = РезультатВызова.Выполнено; + + Если НЕ ЗадатьВопрос Тогда + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, РезультатВызова.Ошибка); + КонецЕсли; + + Если ЗадатьВопрос И ЭтоСертификат(РежимПросмотра) Тогда + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ИмяФайла", РезультатВызова.Результат); + ОповещениеСледующее = Новый ОписаниеОповещения("ОткрытьСертификатПослеЭкспортаСертификата", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(ОповещениеСледующее, + НСтр("ru = 'Открыть сертификат на просмотр?'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()), + РежимДиалогаВопрос.ДаНет); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификатПослеЭкспортаСертификата(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + СервисКриптографииDSSКлиент.ПерейтиПоСсылке(ДополнительныеПараметры.ИмяФайла); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеСменыПинКода(РезультатВызова, ДополнительныеПараметры) Экспорт + + Если РезультатВызова.Выполнено Тогда + СервисКриптографииDSSКлиент.ВывестиИнформацию(Неопределено, + НСтр("ru = 'Смена пин-кода выполнена успешно.'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()), 30); + Иначе + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, РезультатВызова.Ошибка); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Прочее + +&НаКлиенте +Процедура УправлениеФормой() + + ЭлементыФормы = Элементы; + + Если ЭтоСертификат(РежимПросмотра) Тогда + Заголовок = НСтр("ru = 'Сертификат'"); + ЭлементыФормы.ГруппаПинКод.Видимость = ТребуетсяПинКод; + Иначе + Заголовок = НСтр("ru = 'Запрос на сертификат'"); + ЭлементыФормы.ГруппаПинКод.Видимость = Ложь; + ЭлементыФормы.Проверить.Видимость = Ложь; + ЭлементыФормы.ГруппаПрочее.Видимость = Ложь; + ЭлементыФормы.КомуВыдан.Заголовок = НСтр("ru = 'Владелец'"); + КонецЕсли; + + ТекущийЭлемент = Элементы.ФормаЗакрыть; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСведенияСертификатаДвоичныеДанные(Сертификат) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + // заполняем таблицу всех свойств сертификата + ТаблицаСостава.Очистить(); + Отпечаток = Сертификат.Отпечаток; + + ПредставлениеИздателя = ПолучитьПредставлениеКоллекции(Сертификат.Издатель); + ПредставлениеСубъекта = ПолучитьПредставлениеКоллекции(Сертификат.Субъект); + + КомуВыдан = ПредставлениеСубъекта.Имя; + КемВыдан = ПредставлениеИздателя.Имя; + Если НЕ ЗначениеЗаполнено(ДействителенС) Тогда + ДействителенС = Сертификат.ДатаНачала; + ДействителенПо = Сертификат.ДатаОкончания; + ПреобразоватьВремя = Истина; + КонецЕсли; + + ДобавитьСтроку(НСтр("ru = 'Версия'", КодЯзыка), Сертификат.Версия, 2); + ДобавитьСтроку(НСтр("ru = 'Серийный номер'", КодЯзыка), ПолучитьHexСтрокуИзДвоичныхДанных(Сертификат.СерийныйНомер), 2); + ДобавитьСтроку(НСтр("ru = 'Алгоритм подписи'", КодЯзыка), "неопределено", 2); + ДобавитьСтроку(НСтр("ru = 'Хеш-алгоритм подписи'", КодЯзыка), "неопределено", 2); + ДобавитьСтроку(НСтр("ru = 'Издатель'", КодЯзыка), ПредставлениеИздателя.Поля, 2); + ДобавитьСтроку(НСтр("ru = 'Субъект'", КодЯзыка), ПредставлениеСубъекта.Поля, 2); + ДобавитьСтроку(НСтр("ru = 'Открытый ключ'", КодЯзыка), Сертификат.ОткрытыйКлюч, 2); + ДобавитьСтроку(НСтр("ru = 'Параметры открытого ключа'", КодЯзыка), "неопределено", 2); + + Для каждого СтрокаКлюча Из Сертификат.РасширенныеСвойства Цикл + + ПредставлениеКлюча = ПолучитьПредставлениеКоллекции(СтрокаКлюча.Значение); + ДобавитьСтроку(НСтр("ru = 'Улучшенный ключ'", КодЯзыка), ПредставлениеКлюча.Поля, 2); + + КонецЦикла; + + ПреобразоватьВремя(ПреобразоватьВремя); + +КонецПроцедуры + +&НаСервере +Функция РазделитьНаСтроки(ДанныеСтроки) + + Результат = СтрЗаменить(ДанныеСтроки, ",", Символы.ПС); + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьСведенияСертификатаОписание(Сертификат) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + // заполняем таблицу всех свойств сертификата + ТаблицаСостава.Очистить(); + + ПредставлениеИздателя = ПолучитьПредставлениеКоллекции(Сертификат.Издатель); + ПредставлениеСубъекта = ПолучитьПредставлениеКоллекции(Сертификат.Субъект); + + КомуВыдан = ПредставлениеСубъекта.Имя; + КемВыдан = ПредставлениеИздателя.Имя; + Если НЕ ЗначениеЗаполнено(ДействителенС) Тогда + ДействителенС = Сертификат.ДатаНачала; + ДействителенПо = Сертификат.ДатаОкончания; + КонецЕсли; + + ДобавитьСтроку(НСтр("ru = 'Версия'", КодЯзыка), Сертификат.Версия, 2); + ДобавитьСтроку(НСтр("ru = 'Серийный номер'", КодЯзыка), Сертификат.СерийныйНомер, 2); + ДобавитьСтроку(НСтр("ru = 'Алгоритм подписи'", КодЯзыка), Сертификат.АлгоритмПодписи, 2); + ДобавитьСтроку(НСтр("ru = 'Хеш-алгоритм подписи'", КодЯзыка), Сертификат.АлгоритмОткрытогоКлюча, 2); + ДобавитьСтроку(НСтр("ru = 'Издатель'", КодЯзыка), ПредставлениеИздателя.Поля, 2); + ДобавитьСтроку(НСтр("ru = 'Субъект'", КодЯзыка), ПредставлениеСубъекта.Поля, 2); + ДобавитьСтроку(НСтр("ru = 'Открытый ключ'", КодЯзыка), Сертификат.ОткрытыйКлюч, 2); + ДобавитьСтроку(НСтр("ru = 'Параметры открытого ключа'", КодЯзыка), Сертификат.ПараметрыОткрытогоКлюча, 2); + + Для каждого СтрокаКлюча Из Сертификат.РасширениеСертификата Цикл + ДобавитьСтроку(СтрокаКлюча.Ключ, РазделитьНаСтроки(СтрокаКлюча.Значение), 2); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьСведенияЗапросаНаСертификат(ЗапросНаСертификат) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + // заполняем таблицу всех свойств запроса + ТаблицаСостава.Очистить(); + + ПредставлениеСубъекта = ПолучитьПредставлениеКоллекции(ЗапросНаСертификат.Владелец); + КомуВыдан = ПредставлениеСубъекта.Имя; + + ДобавитьСтроку(НСтр("ru = 'Алгоритм ключа'", КодЯзыка), ЗапросНаСертификат.АлгоритмПубличногоКлюча, 2); + ДобавитьСтроку(НСтр("ru = 'Открытый ключ'", КодЯзыка), ЗапросНаСертификат.ОткрытыйКлюч, 2); + + Для каждого СтрокаКлюча Из ЗапросНаСертификат.Владелец Цикл + ДобавитьСтроку(СтрокаКлюча.Ключ, РазделитьНаСтроки(СтрокаКлюча.Значение), 2); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПреобразоватьВремя(ПреобразоватьВремя) + + Если ПреобразоватьВремя Тогда + ДействителенС = МестноеВремя(ДействителенС); + ДействителенПо = МестноеВремя(ДействителенПо); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьСтроку(ПредставлениеПоля, ЗначениеПоля, ТипПоля) + + НоваяСтрока = ТаблицаСостава.Добавить(); + НоваяСтрока.Представление = ПредставлениеПоля; + НоваяСтрока.Значение = ЗначениеПоля; + НоваяСтрока.Картинка = ТипПоля; + +КонецПроцедуры + +// Формирует список допустимых полей для сертификата +// +// Возвращаемое значение: +// см. СервисКриптографииDSSASNКлиентСервер.ОпределитьТип_OID +// +&НаСервере +Функция ПоляИдентификаторов() + + Результат = СервисКриптографииDSSASNКлиентСервер.ОпределитьТип_OID(Неопределено, "10"); + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ПолучитьПредставлениеКоллекции(КоллекцияДляОбработки) + + Результат = Новый Структура("Поля, Имя", "", ""); + ВсеПоля = ПоляИдентификаторов(); + ИмяОбщее = ""; + МассивКлючей= Новый Соответствие; + + Для каждого СтрокаКоллекции Из КоллекцияДляОбработки Цикл + Если ТипЗнч(СтрокаКоллекции) = Тип("КлючИЗначение") Тогда + ПредставлениеКлюча = СтрЗаменить(СтрокаКоллекции.Ключ, "OID", ""); + ПредставлениеКлюча = СтрЗаменить(ПредставлениеКлюча, "_", "."); + Если ВсеПоля[ПредставлениеКлюча] <> Неопределено Тогда + ПредставлениеКлюча = ВсеПоля[ПредставлениеКлюча].Имя; + КонецЕсли; + МассивКлючей.Вставить(ПредставлениеКлюча, СтрокаКоллекции.Значение); + Если ПредставлениеКлюча = "CN" ИЛИ ПредставлениеКлюча = "ОбщееИмя" Тогда + ИмяОбщее = СтрокаКоллекции.Значение; + КонецЕсли; + Иначе + МассивКлючей.Вставить(СтрокаКоллекции); + Если ПустаяСтрока(ИмяОбщее) Тогда + ИмяОбщее = СтрокаКоллекции; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Результат.Имя = ИмяОбщее; + + Для каждого СтрокаКоллекции Из МассивКлючей Цикл + Результат.Поля = Результат.Поля + ?(ПустаяСтрока(Результат.Поля), "", Символы.ПС); + Если ЗначениеЗаполнено(СтрокаКоллекции.Значение) Тогда + Результат.Поля = Результат.Поля + СтрокаКоллекции.Ключ + " = " + СтрокаКоллекции.Значение; + Иначе + Результат.Поля = Результат.Поля + СтрокаКоллекции.Ключ; + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ЭтоСертификат(РежимПросмотра) + + Результат = РежимПросмотра = "Сертификат"; + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Form.form new file mode 100644 index 000000000..f74fb567a --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Form.form @@ -0,0 +1,927 @@ + + + + <key>ru</key> + <value>Смена пин-кода</value> + + + ГруппаПояснениеОперации + 42 + + ПояснениеОперации + 44 + true + true + + true + + + ПояснениеОперации + + None + + ПояснениеОперацииРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ПояснениеОперацииКонтекстноеМеню + 45 + true + + LabelField + Enter + true + Left + true + + true + 2 + true + + + + ДекорацияПояснениеОперации + 47 + true + true + + true + + + ДекорацияПояснениеОперацииРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + ДекорацияПояснениеОперацииКонтекстноеМеню + 48 + true + + Label + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Пояснение операции</value> + + + ГруппаПояснениеОперацииРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаСтарыйПароль + 18 + + СтарыйПароль + 12 + + <key>ru</key> + <value>Текущий пин-код</value> + + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + СтарыйПароль + + false + Top + + СтарыйПарольРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СтарыйПарольКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + + StartChoice + СтарыйПарольНачалоВыбора + + true + true + true + true + true + true + true + true + Normal + + + + ДекорацияСтарыйПароль + 20 + true + true + + true + + + ДекорацияСтарыйПарольРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДекорацияСтарыйПарольКонтекстноеМеню + 21 + true + + Label + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Старый пароль</value> + + + ГруппаСтарыйПарольРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаНовыйПароль + 28 + + НовыйПароль + 4 + + <key>ru</key> + <value>Новый пин-код</value> + + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + НовыйПароль + + false + Top + + НовыйПарольРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + НовыйПарольКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + + StartChoice + НовыйПарольНачалоВыбора + + true + true + true + true + true + true + true + true + Normal + + + + ДекорацияНовыйПароль + 35 + true + true + + true + + + ДекорацияНовыйПарольРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ДекорацияНовыйПарольКонтекстноеМеню + 36 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Новый пароль</value> + + + ГруппаНовыйПарольРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаПодтверждение + 30 + + ПроверочныйПароль + 7 + + <key>ru</key> + <value>Подтверждение</value> + + + Style.ВыделенныйЗаголовокПодтвержденияШрифт + + true + true + + true + + + ПроверочныйПароль + + false + Top + + ПроверочныйПарольРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ПроверочныйПарольКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПроверочныйПарольНачалоВыбора + + true + true + true + true + true + true + true + true + Normal + + + + ДекорацияПодтверждение + 32 + true + true + + true + + + ДекорацияПодтверждениеРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + ДекорацияПодтверждениеКонтекстноеМеню + 33 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Подтверждение</value> + + + ГруппаПодтверждениеРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаСохранить + 23 + + Сохранить + 15 + true + true + + true + + + Сохранить + + true + Right + + СохранитьРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СохранитьКонтекстноеМеню + 16 + true + + CheckBoxField + Enter + true + Left + true + + + + ДекорацияСохранить + 25 + true + true + + true + + + ДекорацияСохранитьРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + ДекорацияСохранитьКонтекстноеМеню + 26 + true + + Label + true + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Сохранить</value> + + + ГруппаСохранитьРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаКоманды + 38 + + ОК + 10 + true + true + + true + + + ОКРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + UsualButton + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + Отмена + 40 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + UsualButton + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + Right + + ГруппаКомандыРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + 40 + LockOwner + true + true + Vertical + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + НовыйПароль + + <key>ru</key> + <value>Новый пароль</value> + + 3 + + String + + + + true + + + true + + + + ПроверочныйПароль + + <key>ru</key> + <value>Проверочный пароль</value> + + 4 + + String + + + + true + + + true + + + + СтарыйПароль + + <key>ru</key> + <value>Старый пароль</value> + + 2 + + String + + + + true + + + true + + + + Сохранить + + <key>ru</key> + <value>Сохранить</value> + + 5 + + Boolean + + + true + + + true + + + + РежимФормы + 6 + + String + + + + true + + + true + + + + Обязательно + 7 + + Boolean + + + true + + + true + + + + КартинкаОткрыть + 8 + + Picture + + + true + + + true + + + + КартинкаЗакрыть + 9 + + Picture + + + true + + + true + + + + ПояснениеОперации + + <key>ru</key> + <value>Пояснение операции</value> + + 10 + + String + + + + true + + + true + + + + НастройкиПользователя + 11 + + + true + + + true + + + + СкрыватьПароль + 12 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Отмена + + <key>ru</key> + <value>Отмена</value> + + 2 + + ru + Отмена + + + true + + + + Отмена + + + Auto + Auto + + + Обязательно + + Boolean + + + + РежимФормы + + String + + + + + ПояснениеОперации + + String + + + + + НастройкиПользователя + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Help/ru.html new file mode 100644 index 000000000..930dce318 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Help/ru.html @@ -0,0 +1,28 @@ + + + + +

      Предназначена для авторизации пользователя на +сервисе облачной подписи.

      + +

      Форма предназначена для всех способов +первичной авторизации указанной в карточке учетной записи, кроме Авторизация через Web-форму. Вызывается +в момент выполнения первой операции с помощью сервиса облачной подписи, +последующие операции такой авторизации не требуют, кроме способа Логин и пароль с дополнительным +подтверждением. В этом случае в зависимости от настроек сервиса может +потребоваться повторная авторизация по истечению срока действия маркера +безопасности.

      + +

      Настройка подключения

      + +
      • В поле логин указывается имя учетной записи облачной подписи.
      • +
      • В поле сервер указывается, какой сервер используется для подключения. 
      • +
      • В поле сертификат указывает статус загруженного сертификата + авторизация выданного пользователю в момент регистрации провайдером + сервиса. Это поле доступно только + для способа Сертификат авторизации
      • +
      • В поле пароль необходимо ввести пароль учетной записи. 
      • +
      • Флажок сохранить позволяет сохранить пароль БД после успешной + авторизация и незапрашивать его у пользователя при последующих + подключениях к сервису.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Module.bsl new file mode 100644 index 000000000..6fb4bfa97 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СменаПинКода/Module.bsl @@ -0,0 +1,255 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + РежимФормы = "Смена"; + Если ЗначениеЗаполнено(Параметры.РежимФормы) Тогда + РежимФормы = Параметры.РежимФормы; + КонецЕсли; + + ПояснениеОперации = Параметры.ПояснениеОперации; + Обязательно = Параметры.Обязательно; + НастройкиПользователя = Параметры.НастройкиПользователя; + СкрыватьПароль = СервисКриптографииDSSСлужебный.НужнаяВерсияПлатформы("8.3.19.0"); + + КлючСохраненияПоложенияОкна = "НастройкиФормы_" + РежимФормы; + ПодготовитьФорму(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + ПодключитьОбработчикОжидания("ОбновитьРазмерыФормы", 0.2, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура НовыйПарольНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОткрытьВидимостьЭлемента("НовыйПароль"); + +КонецПроцедуры + +&НаКлиенте +Процедура СтарыйПарольНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОткрытьВидимостьЭлемента("СтарыйПароль"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверочныйПарольНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОткрытьВидимостьЭлемента("ПроверочныйПароль"); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + + Если НовыйПароль = ПроверочныйПароль + И Обязательно + И НЕ ЗначениеЗаполнено(НовыйПароль) Тогда + СервисКриптографииDSSСлужебныйКлиент.ВывестиОшибку(Неопределено, + НСтр("ru = 'Необходимо указать новый пин-код'", КодЯзыка)); + ИначеЕсли НовыйПароль = ПроверочныйПароль + И НЕ ЗначениеЗаполнено(НовыйПароль) Тогда + ЗадатьВопросОСбросеПинКода(); + ИначеЕсли НовыйПароль = ПроверочныйПароль Тогда + ЗакрытьФорму(ПодготовитьРезультат(Истина)); + Иначе + СервисКриптографииDSSСлужебныйКлиент.ВывестиОшибку(Неопределено, + НСтр("ru = 'Новый пин-код и его подтверждение не совпадают'", КодЯзыка)); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Отмена(Команда) + + ЗакрытьФорму(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗадатьВопросОСбросеПинКода() + + ОповещениеСледующее = Новый ОписаниеОповещения("ЗадатьВопросОСбросеПинКодаЗавершение", ЭтотОбъект); + + СписокКоманд = Новый СписокЗначений; + СписокКоманд.Добавить("ОК", НСтр("ru = 'Сбросить'"), Истина); + СписокКоманд.Добавить("Отмена", НСтр("ru = 'Отмена'")); + + ТекстВопроса = НСтр("ru = 'Сбросить пин-код для доступа к сертификату?'"); + + СервисКриптографииDSSСлужебныйКлиент.ВывестиВопрос( + ОповещениеСледующее, + ТекстВопроса, + СписокКоманд); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗадатьВопросОСбросеПинКодаЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора.Выполнено И РезультатВыбора.Результат = "ОК" Тогда + ЗакрытьФорму(ПодготовитьРезультат(Истина)); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПодготовитьРезультат(Подтвердили = Ложь) + + ОтветПользователя = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Истина); + ОтветПользователя.Выполнено = Подтвердили; + ОтветПользователя.Вставить("Результат", ЗакрытьДанныеПользователя(СтарыйПароль)); + ОтветПользователя.Вставить("НовыйПинКод", ЗакрытьДанныеПользователя(НовыйПароль)); + ОтветПользователя.Вставить("Сохранить", Сохранить); + + Если НЕ ОтветПользователя.Выполнено Тогда + СервисКриптографииDSSСлужебныйКлиент.СформироватьОтказАутентификации(ОтветПользователя); + КонецЕсли; + + Возврат ОтветПользователя; + +КонецФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = ПодготовитьРезультат(); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВидимостьЭлемента(ИмяЭлемента) + + Элементы[ИмяЭлемента].КартинкаКнопкиВыбора = КартинкаОткрыть; + Элементы[ИмяЭлемента].РежимПароля = Ложь; + ЭтотОбъект[ИмяЭлемента] = Элементы[ИмяЭлемента].ТекстРедактирования; + Если СкрыватьПароль Тогда + ПодключитьОбработчикОжидания("ПодключаемыйОтключитьВидимостьПароля", 2, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПодключаемыйОтключитьВидимостьПароля() + + МассивЭлементов = Новый Массив; + МассивЭлементов.Добавить("СтарыйПароль"); + МассивЭлементов.Добавить("НовыйПароль"); + МассивЭлементов.Добавить("ПроверочныйПароль"); + + Для каждого СтрокаМассива Из МассивЭлементов Цикл + ЭлементФормы = Элементы[СтрокаМассива]; + Если ЭлементФормы.РежимПароля <> Истина Тогда + ТекущийТекст = ЭлементФормы.ТекстРедактирования; + ЭлементФормы.КартинкаКнопкиВыбора = КартинкаЗакрыть; + ЭлементФормы.РежимПароля = Истина; + ЭтотОбъект[СтрокаМассива] = ТекущийТекст; + ЭлементФормы.ОбновитьТекстРедактирования(); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Функция ЗакрытьДанныеПользователя(ВведенноеЗначение) + + ПризнакКонфиденциальности = СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(НастройкиПользователя, "ПризнакКонфиденциальности", 1); + + Если ЗначениеЗаполнено(ВведенноеЗначение) Тогда + Результат = СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ВведенноеЗначение, ПризнакКонфиденциальности); + Иначе + Результат = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура ПодготовитьФорму() + + КартинкаОткрыть = БиблиотекаКартинок.ВидимостьПароляОткрыто; + КартинкаЗакрыть = БиблиотекаКартинок.ВидимостьПароляЗакрыто; + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + + Если РежимФормы = "Установка" Тогда + Элементы.ГруппаСтарыйПароль.Видимость = Ложь; + Элементы.ГруппаСохранить.Видимость = Ложь; + Заголовок = НСтр("ru = 'Установка нового пин-кода'", КодЯзыка); + Иначе + Заголовок = НСтр("ru = 'Смена пин-кода'", КодЯзыка); + КонецЕсли; + + Элементы.СтарыйПароль.КартинкаКнопкиВыбора = КартинкаЗакрыть; + Элементы.НовыйПароль.КартинкаКнопкиВыбора = КартинкаЗакрыть; + Элементы.ПроверочныйПароль.КартинкаКнопкиВыбора = КартинкаЗакрыть; + Элементы.ГруппаПояснениеОперации.Видимость = ЗначениеЗаполнено(ПояснениеОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьРазмерыФормы() + + Элементы.ГруппаНовыйПароль.Видимость = НЕ Элементы.ГруппаНовыйПароль.Видимость; + Элементы.ГруппаНовыйПароль.Видимость = НЕ Элементы.ГруппаНовыйПароль.Видимость; + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Form.form new file mode 100644 index 000000000..f643fd461 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Form.form @@ -0,0 +1,770 @@ + + + + <key>ru</key> + <value>Выбор сертификата</value> + + + ТаблицаСертификатов + 1 + + <key>ru</key> + <value>Таблица сертификатов</value> + + true + true + + true + + + ТаблицаСертификатов + + None + + ТаблицаСертификатовОбщееИмя + 14 + + <key>ru</key> + <value>Представление</value> + + true + true + + true + + + ТаблицаСертификатов.ОбщееИмя + + + ТаблицаСертификатовОбщееИмяРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТаблицаСертификатовОбщееИмяКонтекстноеМеню + 15 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовИздатель + 34 + + <key>ru</key> + <value>Кем выдан</value> + + true + true + + true + + + ТаблицаСертификатов.Издатель + + + ТаблицаСертификатовИздательРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + + ТаблицаСертификатовИздательКонтекстноеМеню + 35 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовСрокДействия + 20 + + <key>ru</key> + <value>Срок действия</value> + + true + true + + true + + + ТаблицаСертификатов.СрокДействия + + + ТаблицаСертификатовСрокДействияРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ТаблицаСертификатовСрокДействияКонтекстноеМеню + 21 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаСертификатовКоманднаяПанель + 3 + + Выбрать + 39 + true + true + + true + + + ВыбратьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + + ТаблицаСертификатовПродолжить + 47 + true + true + + true + + + ТаблицаСертификатовПродолжитьРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Form.Command.Продолжить + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСвойстваСертификата + 43 + true + true + + true + + + ФормаСвойстваСертификатаРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Command.СвойстваСертификата + Normal + PictureAndText + true + true + UserCmds + + StdPicture.InputFieldOpen + + Auto + + + УдалитьЗапрос + 45 + true + true + + true + + + УдалитьЗапросРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Command.Удалить + Normal + PictureAndText + true + true + UserCmds + + StdPicture.DeleteDirectly + + Auto + + Left + + + Selection + ТаблицаСертификатовВыбор + + + ТаблицаСертификатовСтрокаПоиска + 5 + + ТаблицаСертификатовСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ТаблицаСертификатовСтрокаПоискаКонтекстноеМеню + 6 + true + + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовСостояниеПросмотра + 8 + + ТаблицаСертификатовСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ТаблицаСертификатовСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовУправлениеПоиском + 11 + + ТаблицаСертификатовУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТаблицаСертификатовУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + ТаблицаСертификатов + + true + + + + ТаблицаСертификатовРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + ТаблицаСертификатовКонтекстноеМеню + 2 + + ТаблицаСертификатовКонтекстноеМенюСвойстваСертификата + 37 + true + true + + true + + + ТаблицаСертификатовКонтекстноеМенюСвойстваСертификатаРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + Form.Command.СвойстваСертификата + Normal + Auto + true + true + UserCmds + Auto + + true + + 60 + true + true + 10 + true + Row +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + false + false + Auto + Auto + true + true + true + true + AsFileRef + true + +
      + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + +
      true
      +
      + + НастройкиПользователя + 2 + + + true + + + true + + + + ТаблицаСертификатов + + <key>ru</key> + <value>Таблица сертификатов</value> + + 3 + + ValueTable + + + true + + + true + + + ОбщееИмя + + <key>ru</key> + <value>Общее имя</value> + + 1 + + String + + + + true + + + true + + + + СрокДействия + + <key>ru</key> + <value>Срок действия</value> + + 3 + + String + + + + true + + + true + + + + Идентификатор + 6 + + Number + + 10 + + + + true + + + true + + + + Основной + 2 + + Boolean + + + true + + + true + + + + ДатаОкончания + 7 + + Date + + Date + + + + true + + + true + + + + Издатель + + <key>ru</key> + <value>Издатель</value> + + 8 + + String + + + + true + + + true + + + + ТребуетПинКод + 9 + + Boolean + + + true + + + true + + + + Отпечаток + 4 + + String + + + + true + + + true + + + + + ВыборИзСписка + 4 + + Boolean + + + true + + + true + + + + ПолноеОписание + 5 + + Boolean + + + true + + + true + + + + РежимВыбора + 7 + + String + + + + true + + + true + + + + СвойстваСертификата + + <key>ru</key> + <value>Просмотр</value> + + 1 + + ru + Свойства сертификата + + + true + + + + СвойстваСертификата + + + Auto + Auto + + + Выбрать + + <key>ru</key> + <value>Выбрать</value> + + 2 + + ru + Выбрать + + + true + + + + Выбрать + + + Auto + Auto + + + Удалить + + <key>ru</key> + <value>Удалить</value> + + 3 + + ru + Удалить + + + true + + + + Удалить + + + Auto + Auto + + + Продолжить + + <key>ru</key> + <value>Продолжить</value> + + 4 + + ru + Продолжить + + + true + + + + ВыборПродолжения + + + Auto + Auto + + + ВыборИзСписка + + Boolean + + + + НастройкиПользователя + + + + ПолноеОписание + + Boolean + + + + РежимВыбора + + String + + + + + МассивВыбора + + + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Help/ru.html new file mode 100644 index 000000000..659eb2fe4 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Help/ru.html @@ -0,0 +1,24 @@ + + + + +

      Предназначен для просмотра списка всех +зарегистрированных серверов облачной подписи.

      + +

      В списке выводится:

      + +
      • Наименование - полное наименование сервера + облачной подписи; 
      • +
      • Адрес сервера – содержит web-адрес + подключения к серверу облачной подписи; 
      • +
      • Комментарий – дополнительное описание о + сервере.
      • +

      Добавление сервера

      + +
        • Нажмите Добавить.
        • +

      Просмотр данных о сервере

      + +
      • С помощью команды Изменить контекстного + меню по правой кнопке мыши или меню Еще можно + открыть данные о сервера облачной подписи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Module.bsl new file mode 100644 index 000000000..dd91b67b7 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокСертификатов/Module.bsl @@ -0,0 +1,300 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НастройкиПользователя = Параметры.НастройкиПользователя; + ВыборИзСписка = Параметры.ВыборИзСписка; + ПолноеОписание = Параметры.ПолноеОписание; + РежимВыбора = Параметры.РежимВыбора; + + ЗаполнитьСписокСертификатов(НастройкиПользователя, Параметры.МассивВыбора); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаСертификатов + +&НаКлиенте +Процедура ТаблицаСертификатовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если ВыборИзСписка Тогда + ВыборСтрокиСертификата(); + Иначе + ПросмотрСведенийСертификата(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура СвойстваСертификата(Команда) + + ПросмотрСведенийСертификата(); + +КонецПроцедуры + +&НаКлиенте +Процедура Выбрать(Команда) + + ВыборСтрокиСертификата(); + +КонецПроцедуры + +&НаКлиенте +Процедура Удалить(Команда) + + ТекущаяСтрока = Элементы.ТаблицаСертификатов.ТекущиеДанные; + + Если ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + Если НЕ ЭтоСертификаты(РежимВыбора) Тогда + ПараметрыЦикла = Новый Структура; + ПараметрыЦикла.Вставить("Идентификатор", ТекущаяСтрока.Идентификатор); + ПараметрыЦикла.Вставить("ТекущийСертификат", ТекущаяСтрока); + ОписаниеСледующее = Новый ОписаниеОповещения("УдалениеЗапросаНаСертификатПослеВопроса", ЭтотОбъект, ПараметрыЦикла); + + СписокКоманд = Новый СписокЗначений; + СписокКоманд.Добавить("Да", НСтр("ru = 'Да'")); + СписокКоманд.Добавить("Нет", НСтр("ru = 'Нет'")); + + СервисКриптографииDSSКлиент.ВывестиВопрос(ОписаниеСледующее, + НСтр("ru = 'Удалить выбранный запрос на сертификат?'"), + СписокКоманд, + , + НСтр("ru = 'Удаление запроса'")); + + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборПродолжения(Команда) + + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + ПараметрыЗакрытия.Вставить("Результат", Истина); + ЗакрытьФорму(ПараметрыЗакрытия); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя"); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыборСтрокиСертификата() + + ТекущаяСтрока = Элементы.ТаблицаСертификатов.ТекущиеДанные; + Если ТекущаяСтрока <> Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(); + Если ЭтоСертификаты(РежимВыбора) Тогда + ВыборПользователя = Новый Структура("Отпечаток", ТекущаяСтрока.Отпечаток); + Если ПолноеОписание Тогда + ВыборПользователя = ПолучитьПолноеОписаниеСертификата(ВыборПользователя); + КонецЕсли; + Иначе + ВыборПользователя = ТекущаяСтрока.Идентификатор; + КонецЕсли; + ПараметрыЗакрытия.Вставить("Результат", ВыборПользователя); + ЗакрытьФорму(ПараметрыЗакрытия); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПросмотрСведенийСертификата() + + ТекущаяСтрока = Элементы.ТаблицаСертификатов.ТекущиеДанные; + Если ТекущаяСтрока = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ЭтоСертификаты(РежимВыбора) Тогда + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь); + ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор; + ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект); + + СервисКриптографииDSSКлиент.ПоказатьСертификат( + Неопределено, + НастройкиПользователя, + Новый Структура("Отпечаток", ТекущаяСтрока.Отпечаток), + ПараметрыОперации); + + Иначе + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь); + ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор; + ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект); + + СервисКриптографииDSSКлиент.ПоказатьЗапросНаСертификат( + Неопределено, + НастройкиПользователя, + ТекущаяСтрока.Идентификатор, + ПараметрыОперации); + + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// РезультатВыполнения - Структура +// ПараметрыЦикла - Структура: +// * Идентификатор - Число +// +&НаКлиенте +Процедура УдалениеЗапросаНаСертификатПослеВопроса(РезультатВыполнения, ПараметрыЦикла) Экспорт + + Если РезультатВыполнения.Выполнено И РезультатВыполнения.Результат = "Да" Тогда + ОписаниеСледующее = Новый ОписаниеОповещения("УдалениеЗапросаНаСертификатПослеВыполнения", ЭтотОбъект, ПараметрыЦикла); + СервисКриптографииDSSКлиент.УдалитьЗапросНаСертификат(ОписаниеСледующее, НастройкиПользователя, ПараметрыЦикла.Идентификатор); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УдалениеЗапросаНаСертификатПослеВыполнения(РезультатВыполнения, ПараметрыЦикла) Экспорт + + Если РезультатВыполнения.Выполнено И РезультатВыполнения.Результат Тогда + ТаблицаСертификатов.Удалить(ПараметрыЦикла.ТекущийСертификат); + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ЭтоСертификаты(РежимВыбора) + + Результат = РежимВыбора = "Сертификаты"; + Возврат Результат; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(КонтекстФормы) + + ЭлементыФормы = КонтекстФормы.Элементы; + + ЭлементыФормы.Выбрать.Видимость = КонтекстФормы.ВыборИзСписка; + + Если ЭтоСертификаты(КонтекстФормы.РежимВыбора) Тогда + ЭлементыФормы.УдалитьЗапрос.Видимость = Ложь; + ЭлементыФормы.ТаблицаСертификатовПродолжить.Видимость = Ложь; + ЭлементыФормы.УдалитьЗапрос.Видимость = Ложь; + Иначе + ЭлементыФормы.ТаблицаСертификатовСрокДействия.Видимость = Ложь; + ЭлементыФормы.ТаблицаСертификатовИздатель.Заголовок = НСтр("ru = 'Владелец'"); + КонтекстФормы.Заголовок = НСтр("ru = 'Запросы на сертификат'"); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// ТекущиеНастройки - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// МассивВыбора - Массив из Структура: +// * Идентификатор - Число +// * Имя - Строка +// * Издатель - Строка +// +&НаСервере +Процедура ЗаполнитьСписокСертификатов(ТекущиеНастройки, МассивВыбора = Неопределено) + + Если МассивВыбора = Неопределено Тогда + ТекущийМассив = Новый Массив; + Иначе + ТекущийМассив = МассивВыбора; + КонецЕсли; + + ТаблицаСертификатов.Очистить(); + + Если ЭтоСертификаты(РежимВыбора) Тогда + ВесьСписок = ТекущиеНастройки.Сертификаты; + + Для каждого СтрокаКлюча Из ВесьСписок Цикл + Сертификат = СтрокаКлюча.Значение; + НоваяСтрока = ТаблицаСертификатов.Добавить(); + НоваяСтрока.Отпечаток = Сертификат.Отпечаток; + НоваяСтрока.Идентификатор = Сертификат.Идентификатор; + НоваяСтрока.ОбщееИмя = Сертификат.Представление; + НоваяСтрока.Основной = Сертификат.Основной; + НоваяСтрока.Издатель = Сертификат.Издатель; + НоваяСтрока.ДатаОкончания = Сертификат.ДатаОкончания; + НоваяСтрока.СрокДействия = Формат(Сертификат.ДатаНачала, "ДЛФ=DT") + " - " + Формат(Сертификат.ДатаОкончания, "ДЛФ=DT"); + НоваяСтрока.ТребуетПинКод = Сертификат.ТребуетсяПинКод; + КонецЦикла; + + ТаблицаСертификатов.Сортировать("ДатаОкончания Убыв"); + + Иначе + Для каждого СтрокаКлюча Из ТекущийМассив Цикл + НоваяСтрока = ТаблицаСертификатов.Добавить(); + НоваяСтрока.Идентификатор = СтрокаКлюча.Идентификатор; + НоваяСтрока.ОбщееИмя = СтрокаКлюча.Имя; + НоваяСтрока.Издатель = СтрокаКлюча.Владелец; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПолучитьПолноеОписаниеСертификата(Отпечаток) + + Возврат СервисКриптографииDSS.НайтиСертификат(Отпечаток); + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Form.form new file mode 100644 index 000000000..80f7c01af --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Form.form @@ -0,0 +1,430 @@ + + + + Список + 1 + true + true + + true + + + Список + + None + + Наименование + 20 + true + true + + true + + + Список.Наименование + + + НаименованиеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 21 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Логин + 17 + true + true + + true + + + Список.Логин + + + ЛогинРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ЛогинКонтекстноеМеню + 18 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Сервер + 29 + + <key>ru</key> + <value>Сервер</value> + + true + true + + true + + + Список.Сервер + + + СерверРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + СерверКонтекстноеМеню + 30 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПервичнаяАутентификация + 26 + true + true + + true + + + Список.ПервичнаяАутентификация + + + ПервичнаяАутентификацияРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + ПервичнаяАутентификацияКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Комментарий + 14 + true + true + + true + + + Список.Комментарий + + + КомментарийРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Ссылка + 32 + true + true + + + Список.Ссылка + + + СсылкаРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 33 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 5 + + СписокСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 6 + true + + Список + + true + + + + СписокСостояниеПросмотра + 8 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 11 + + СписокУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
      + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + ОбъектОбработки + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + + + + Список + + <key>ru</key> + <value>Список</value> + + 2 + + DynamicList + + + true + + + true + + + Список.Ссылка + +
      true
      + + ВЫБРАТЬ РАЗРЕШЕННЫЕ + УчетныеЗаписиDSS.Ссылка КАК Ссылка, + УчетныеЗаписиDSS.Наименование КАК Наименование, + УчетныеЗаписиDSS.Логин КАК Логин, + УчетныеЗаписиDSS.Владелец КАК Сервер, + УчетныеЗаписиDSS.ПервичнаяАутентификация КАК ПервичнаяАутентификация, + УчетныеЗаписиDSS.Комментарий КАК Комментарий +ИЗ + Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS + Catalog.УчетныеЗаписиDSS + true + true + true + true + +
      + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Help/ru.html new file mode 100644 index 000000000..278d1e13a --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокУчетныхЗаписей/Help/ru.html @@ -0,0 +1,24 @@ + + + + +

      Предназначен для выбора элемента справочника +учетной записи облачной подписи.

      + +

      В списке выводится:

      + +
      • Наименование  – наименование учетной записи в БД;
      • +
      • Логин – имя учетной записи, + под которым будет происходить авторизация; 
      • +
      • Сервер – данные о сервере облачной подписи; 
      • +
      • Первичная авторизация – выбранный способ авторизации + в сервисе;
      • +
      • Комментарий  – дополнительное описание учетной записи;
      • +

      Добавление учетной записи

      + +
        • Нажмите Создать
        • +

      Просмотр данных об учетной записи

      + +
      • С помощью команды Изменить контекстного + меню по правой кнопке мыши или меню Еще можно открыть данные об учетной записи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Form.form new file mode 100644 index 000000000..7f677e6e5 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Form.form @@ -0,0 +1,350 @@ + + + + Список + 1 + true + true + + true + + + Список + + None + + СписокНаименование + 17 + + <key>ru</key> + <value>Представление</value> + + true + true + + true + + + Список.Description + + + СписокНаименованиеРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокНаименованиеКонтекстноеМеню + 18 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокАдресСервера + 20 + true + true + + true + + + Список.АдресСервера + + + СписокАдресСервераРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + СписокАдресСервераКонтекстноеМеню + 21 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКомментарий + 23 + true + true + + true + + + Список.Комментарий + + + СписокКомментарийРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + СписокКомментарийКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + true + 1 + true + + + + СписокСсылка + 14 + true + true + + + Список.Ref + + + СписокСсылкаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СписокСсылкаКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 5 + + СписокСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 6 + true + + Список + + true + + + + СписокСостояниеПросмотра + 8 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 11 + + СписокУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + HierarchicalList + true + true + true + true + true + MultiRow +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + AsFileRef + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
      + + ФормаКоманднаяПанель + -1 + Left + true + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + ОбъектОбработки + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + + + + Список + + <key>ru</key> + <value>Список</value> + + 2 + + DynamicList + + + true + + + true + + + Список.Ref + +
      true
      + + Catalog.ЭкземплярыСервераDSS + true + true + true + true + +
      + + + + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Help/ru.html new file mode 100644 index 000000000..2cec455da --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/СписокЭкземпляровСервераDSS/Help/ru.html @@ -0,0 +1,23 @@ + + + + +

      Предназначен для просмотра списка всех +зарегистрированных серверов облачной подписи.

      + +

      В списке выводится:

      + +
      • Наименование - полное наименование сервера + облачной подписи; 
      • +
      • Адрес сервера – содержит web-адрес + подключения к серверу облачной подписи; 
      • +
      • Комментарий – дополнительное описание о + сервере.
      • +

      Добавление сервера

      + +
        • Нажмите Добавить.
        • +

      Просмотр данных о сервере

      + +
      • С помощью команды Изменить контекстного + меню по правой кнопке мыши или меню Еще можно открыть данные о сервера облачной подписи.
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Form.form new file mode 100644 index 000000000..1c56b58d7 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Form.form @@ -0,0 +1,1415 @@ + + + + ГруппаКоманды + 10 + + ПроверкаРаботоспособности + 18 + true + true + + true + + + ПроверкаРаботоспособностиРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.Command.ПроверкаРаботоспособности + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПроверитьПодключение + 30 + true + true + + true + + + ПроверитьПодключениеРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.Command.ПроверитьПодключение + Normal + Auto + true + true + UserCmds + Auto + + + ИзменитьРеквизитыПодключения + 110 + true + true + + true + + + ИзменитьРеквизитыПодключенияРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + Form.Command.ИзменитьРеквизитыПодключения + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьПредыдущееЗаявление + 112 + true + true + + true + + + ОткрытьПредыдущееЗаявлениеРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + Form.Command.ОткрытьПредыдущееЗаявление + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Команды</value> + + + ГруппаКомандыРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + ГруппаСостояниеЗаявления + 103 + + ОбновитьСостояние + 105 + true + true + + true + + + ОбновитьСостояниеРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + UsualButton + Form.Command.ОбновитьСостояние + Normal + Auto + true + true + UserCmds + Auto + + + СостояниеОбработкиЗаявления + 107 + + <key>ru</key> + <value>Состояние</value> + + true + true + + true + + + СостояниеОбработкиЗаявления + + + СостояниеОбработкиЗаявленияРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + СостояниеОбработкиЗаявленияКонтекстноеМеню + 108 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Состояние заявления</value> + + 78 + false + + ГруппаСостояниеЗаявленияРасширеннаяПодсказка + 104 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + + Style.ToolTipBackColor + + Auto + Auto + + + + ГруппаОсновныеДанные + 82 + + Владелец + 27 + true + true + + true + + + Объект.Owner + + + OnChange + ВладелецПриИзменении + + + ВладелецРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ВладелецКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаЛогин + 69 + + Логин + 1 + true + true + + true + + + Объект.Логин + + + ЛогинРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ЛогинКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + Пароль + 71 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + Пароль + + + OnChange + ПарольПриИзменении + + + ПарольРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 72 + true + + InputField + Enter + true + Left + true + + 20 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Логин</value> + + + ГруппаЛогинРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаАутентификация + 23 + + ПервичнаяАутентификация + 7 + + <key>ru</key> + <value>Первичная авторизация</value> + + true + true + + true + + + Объект.ПервичнаяАутентификация + + + OnChange + ПервичнаяАутентификацияПриИзменении + + + ПервичнаяАутентификацияРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + ПервичнаяАутентификацияКонтекстноеМеню + 8 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПервичнаяАутентификацияАвтоПодбор + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Аутентификация</value> + + + ГруппаАутентификацияРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ГруппаСертификат + 32 + + Сертификат + 76 + true + true + + true + + + Сертификат + + + СертификатРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + СертификатКонтекстноеМеню + 77 + true + + InputField + Enter + true + Left + true + + + StartChoice + СертификатНачалоВыбора + + + Clearing + СертификатОчистка + + true + true + true + true + + StdPicture.OpenFile + + true + true + true + Normal + + + + ВыгрузитьСертификат + 55 + true + true + + true + + + ВыгрузитьСертификатРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + UsualButton + Form.Command.ВыгрузитьСертификат + Normal + Auto + true + true + UserCmds + Auto + + + ПинКод + 79 + + <key>ru</key> + <value>Пин-код</value> + + true + true + + true + + + ПинКод + + + OnChange + ПинКодПриИзменении + + + ПинКодРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ПинКодКонтекстноеМеню + 80 + true + + InputField + Enter + true + Left + true + + 18 + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Сертификат</value> + + + ГруппаСертификатРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ВторичнаяАвторизация + 84 + + <key>ru</key> + <value>Подтверждение операций</value> + + true + true + + true + + + Объект.ВторичнаяАвторизация + + + ru + Укажите метод подтверждения операций по умолчанию + + ShowBottom + + ВторичнаяАвторизацияРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ВторичнаяАвторизацияКонтекстноеМеню + 85 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ВторичнаяАвторизацияАвтоПодбор + + true + true + true + true + true + true + Normal + + ru + Укажите метод подтверждения операций по умолчанию + + + + + ГруппаЛичныйКабинет + 87 + + ЛичныйКабинет + 92 + true + true + + true + + + ЛичныйКабинет + + ShowBottom + + ЛичныйКабинетРасширеннаяПодсказка + 94 + + <key>ru</key> + <value>Личный кабинет позволяет изменить настройки авторизации, пароли и другие настройки.</value> + + Label + true + + Left + + + + ЛичныйКабинетКонтекстноеМеню + 93 + true + + LabelField + Enter + true + Left + true + + + Click + ЛичныйКабинетНажатие + + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Личный кабинет</value> + + true + + ГруппаЛичныйКабинетРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + UsualGroup + + Vertical + Left + Auto + true + true + Auto + Auto + + + + Комментарий + 20 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДополнительнаяИнформация + 100 + true + true + + + Объект.ДополнительнаяИнформация + + + ДополнительнаяИнформацияРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ДополнительнаяИнформацияКонтекстноеМеню + 101 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаПодвал + 95 + + Автор + 97 + true + true + + true + + + Объект.Автор + + + АвторРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + + АвторКонтекстноеМеню + 98 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Подвал</value> + + + ГруппаПодвалРасширеннаяПодсказка + 96 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Действия</value> + + 78 + false + + ГруппаОсновныеДанныеРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + ОбъектОбработки + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + + + + Объект + 2 + + CatalogObject.УчетныеЗаписиDSS + + + true + + + true + +
      true
      + true +
      + + Изменен + 3 + + Boolean + + + true + + + true + + + + ИдентификаторСправочника + 4 + + UUID + + + true + + + true + + + + НастройкиПользователя + 6 + + + true + + + true + + + + Пароль + + <key>ru</key> + <value>Пароль</value> + + 11 + + String + + + + true + + + true + + true + + + Сертификат + + <key>ru</key> + <value>Сертификат</value> + + 7 + + String + + 50 + + + + true + + + true + + true + + + ДанныеСертификата + 12 + + + true + + + true + + + + ПинКод + + <key>ru</key> + <value>Пин-код</value> + + 5 + + String + + + + true + + + true + + true + + + ОтказОтПроверки + 8 + + Boolean + + + true + + + true + + + + ЛичныйКабинет + + <key>ru</key> + <value>Личный кабинет</value> + + 9 + + FormattedString + + + true + + + true + + + + АдресЛичногоКабинета + 10 + + String + + + + true + + + true + + + + МобильныйКлиент + 13 + + Boolean + + + true + + + true + + + + ДоступныеСпособыАвторизации + 14 + + + true + + + true + + + + ПолноправныйПользователь + 15 + + Boolean + + + true + + + true + + + + СостояниеОбработкиЗаявления + + <key>ru</key> + <value>Состояние обработки заявления</value> + + 16 + + String + + + + true + + + true + + + + ПроверкаРаботоспособности + + <key>ru</key> + <value>Проверка работоспособности</value> + + 2 + + ru + Проверка работоспособности + + + true + + + + ПроверкаРаботоспособности + + + Auto + Auto + + + ПроверитьПодключение + + <key>ru</key> + <value>Проверить подключение</value> + + 1 + + ru + Проверить подключение + + + true + + + + ПроверитьПодключение + + + Text + Auto + Auto + + + ВыгрузитьСертификат + + <key>ru</key> + <value>Выгрузить</value> + + 6 + + ru + Выгрузить сертификат авторизации + + + true + + + + ВыгрузитьСертификат + + + Picture + Auto + Auto + + + ОбновитьСостояние + + <key>ru</key> + <value>Обновить состояние</value> + + 3 + + ru + Обновить состояние + + + true + + + StdPicture.Refresh + + + + ОбновитьСостояние + + + Picture + Auto + Auto + + + ИзменитьРеквизитыПодключения + + <key>ru</key> + <value>Заявление на изменение</value> + + 4 + + ru + Заявление на изменение параметров подключения + + + true + + + + ИзменитьРеквизитыПодключения + + + Auto + Auto + + + ОткрытьПредыдущееЗаявление + + <key>ru</key> + <value>Открыть оформленное заявление</value> + + 5 + + ru + Открыть предыдущее заявление + + + true + + + CommonPicture.ЗаявлениеНаВыпускСертификатаКлюча + + + + ОткрытьПредыдущееЗаявление + + + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + AfterWriteAtServer + ПослеЗаписиНаСервере + + + OnReadAtServer + ПриЧтенииНаСервере + + + BeforeWrite + ПередЗаписью + + + BeforeWriteAtServer + ПередЗаписьюНаСервере + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Help/ru.html new file mode 100644 index 000000000..0c150d815 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Help/ru.html @@ -0,0 +1,49 @@ + + + + +

      Предназначена для хранения индивидуальных +настроек подключения привязанных к сервису облачной подписи.

      + +

      Информация учетной записи позволяет хранить +данные необходимые для авторизации пользователя и настроек вторичного +подтверждения. Техническая информация о подключении к сервису облачной подписи +храниться в данных связанного с этой учетной записью элементе сервера облачной подписи.

      + +

      Настройка авторизации учетной записи

      + +
      • В поле сервер указывается элемент справочника серверы облачной + подписи, к которой привязывается учетная запись.
      • +
      • В поле логин указывается уникальное имя учетной записи, выданного провайдером + пользователю при регистрации.
      • +
      • В поле первичная авторизация необходимо выбрать способ авторизации + пользователя, который допускается при работе с сервисом. Информацию о + способах авторизации предоставляет провайдер сервиса.
      • +
      • В поле пароль можно опционально указать пароль при первичной + авторизации. Введенный пароль сохраняется в настройках текущего пользователя.
      • +
      • Поле сертификат необходимо при авторизации по сертификату + авторизации, который выпустил провайдер сервиса при регистрации + пользователя. Сертификат авторизации это файл в формате pfx содержащий закрытый ключ и + сертификат к нему. Поле доступно для заполнения при выборе способа + первичной авторизации: сертификат + авторизации.
      • +
      • Поле пин-код можно заполнить и сохранить в настройках текущего + пользователя, если используется способ первичной авторизации: сертификат авторизации. Этот пин-код + должен совпадать с паролем, который был задан при создании файла pfx
      • +
      • В поле подтверждение операций задается способ, который будет + автоматически заполняться при процедуре подтверждения операций подписи, + расшифровки и прочих.
      • +
      • По ссылке личный кабинет запускается браузер со страницей личного + кабинета учетной записи.
      • +
      • Комментарий содержит + произвольную текстовую информацию об учетной записи облачной подписи.
      • +
      • Также можно проверить + возможность подключения к серверу с помощью кнопки Проверить подключение
      • +
      • С помощью кнопки Состояние учетной записи + отображается детальная информация об учетной записи, полученной с сервиса + облачной подписи
      • +
      • Пункт меню Еще – Проверка работоспособности + можно не только проверить возможность подключения к сервису, но + дополнительно проверить выполнения базовых операций выполняемых сервисом: + подписание, расшифрование, расшифрование и прочие операции
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Module.bsl new file mode 100644 index 000000000..028306982 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаУчетнойЗаписи/Module.bsl @@ -0,0 +1,754 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПараметрыРазмещения = ПодключаемыеКоманды.ПараметрыРазмещения(); + ПараметрыРазмещения.Источники = Новый Массив; + ПараметрыРазмещения.Источники.Добавить(Метаданные.Справочники.УчетныеЗаписиDSS); + ПараметрыРазмещения.КоманднаяПанель = Элементы.ГруппаКоманды; + ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыРазмещения); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + + МобильныйКлиент = ОбщегоНазначения.ЭтоМобильныйКлиент(); + ПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(); + УстановитьКартинку("Записать"); + + ПриЧтенииСозданииНаСервере(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + + Если ЗначениеЗаполнено(Объект.Владелец) Тогда + ТекущийЭлемент = Элементы.Логин; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если Изменен Тогда + Изменен = Ложь; + Если НЕ ОтказОтПроверки Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("ПроверитьПодключениеКлиент", ЭтотОбъект); + ПоказатьВопрос(ОповещениеСледующее, + НСтр("ru = 'Данные учетной записи были изменены, проверить подключение к серверу?'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()), + РежимДиалогаВопрос.ДаНет, 30); + КонецЕсли; + КонецЕсли; + + ПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи); + + Оповестить("Запись_УчетнойЗаписиDSS", Новый Структура, Объект.Ссылка); + ОтказОтПроверки = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + Изменен = Модифицированность; + Объект.Наименование = СокрЛП(Объект.Логин) + " на " + СокрЛП(Объект.Владелец); + +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда + СсылкаНового = Справочники.УчетныеЗаписиDSS.ПолучитьСсылку(ИдентификаторСправочника); + ТекущийОбъект.УстановитьСсылкуНового(СсылкаНового); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + + // СтандартныеПодсистемы.УправлениеДоступом + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи); + КонецЕсли; + // Конец СтандартныеПодсистемы.УправлениеДоступом + + Если Изменен Тогда + НастройкиПользователя = ОбновитьНастройкиПользователя(Объект.Ссылка); + КонфиденциальныеДанные = ПолучитьДанныеХранилища(ИдентификаторСправочника); + Если Объект.ПервичнаяАутентификация = Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации Тогда + Если ЗначениеЗаполнено(ДанныеСертификата) Тогда + КонфиденциальныеДанные.СертификатАвторизации = ДанныеСертификата; + Иначе + КонфиденциальныеДанные.СертификатАвторизации = Неопределено; + КонецЕсли; + + Если ЗначениеЗаполнено(ПинКод) Тогда + КонфиденциальныеДанные.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ОбъектПароля(ПинКод, 1); + Иначе + КонфиденциальныеДанные.ПарольСертификата = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + КонецЕсли; + + ИначеЕсли ЗначениеЗаполнено(Пароль) Тогда + КонфиденциальныеДанные.Пароль = СервисКриптографииDSSКлиентСервер.ОбъектПароля(Пароль, 1); + + Иначе + КонфиденциальныеДанные.Пароль = СервисКриптографииDSSКлиентСервер.ОбъектПароля("", 3); + + КонецЕсли; + + ЗаписатьВХранилищеСервер(ИдентификаторСправочника, КонфиденциальныеДанные); + ПриЧтенииСозданииНаСервере(); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + + // СтандартныеПодсистемы.УправлениеДоступом + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.УправлениеДоступом + + ПриЧтенииСозданииНаСервере(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПарольПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Пароль) Тогда + Пароль = ЗакрытьДанныеПользователя(Пароль); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПинКодПриИзменении(Элемент) + + Если ЗначениеЗаполнено(ПинКод) Тогда + ПинКод = ЗакрытьДанныеПользователя(ПинКод); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПервичнаяАутентификацияПриИзменении(Элемент) + + ОбновитьСтатусЗащищенногоХранилищаСервер(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПервичнаяАутентификацияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ВторичнаяАвторизацияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Модифицированность = Истина; + ДанныеСертификата = Неопределено; + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ВладелецПриИзменении(Элемент) + + ПриИзмененииСервисаПодписиСервер(); + +КонецПроцедуры + +&НаКлиенте +Процедура СертификатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОписаниеСледующее = Новый ОписаниеОповещения("ВыбратьСертификатПослеПолучения", ЭтотОбъект); + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(); + СервисКриптографииDSSКлиент.ЗагрузитьДанныеИзФайла(ОписаниеСледующее, ".pfx", , Истина, ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура ЛичныйКабинетНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + СервисКриптографииDSSКлиент.ПерейтиПоСсылке(АдресЛичногоКабинета, "MSIE"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "СервисКриптографииDSS_ЗаписьЗащищенныхДанных" Тогда + ОбновитьСтатусЗащищенногоХранилищаСервер(); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ПроверитьПодключение(Команда) + + ПроверитьПодключениеКлиент(КодВозвратаДиалога.Да); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверкаРаботоспособности(Команда) + + Если ЗначениеЗаполнено(Объект.Ссылка) Тогда + СервисКриптографииDSSКлиент.ПроверитьРаботоспособностьСервиса(Неопределено, Объект.Ссылка); + Иначе + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, + НСтр("ru = 'Необходимо записать информацию о новой учетной записи.'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка())); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыгрузитьСертификат(Команда) + + Если ДанныеСертификата = Неопределено Тогда + ДанныеСертификата = ПолучитьДанныеХранилища(ИдентификаторСправочника, "СертификатАвторизации"); + КонецЕсли; + + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(); + СервисКриптографииDSSКлиент.СохранитьДанныеВФайл(Неопределено, ДанныеСертификата, ".pfx", Истина, ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСостояние(Команда) + + ОповещениеСледующее = Новый ОписаниеОповещения("ОбновитьСостояниеПослеПроверки", ЭтотОбъект); + ПроверитьМодифицированность(ОповещениеСледующее); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРеквизитыПодключения(Команда) + + ОповещениеСледующее = Новый ОписаниеОповещения("ИзменитьРеквизитыПодключенияПослеПроверки", ЭтотОбъект); + ПроверитьМодифицированность(ОповещениеСледующее); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПредыдущееЗаявление(Команда) + + ОповещениеСледующее = Новый ОписаниеОповещения("ОткрытьОформленноеЗаявление", ЭтотОбъект); + ПроверитьМодифицированность(ОповещениеСледующее); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ БСП + +// СтандартныеПодсистемы.ПодключаемыеКоманды +&НаКлиенте +Процедура Подключаемый_ВыполнитьКоманду(Команда) + ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт + ВыполнитьКомандуНаСервере(ПараметрыВыполнения); +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения) + ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбновитьКоманды() + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект); +КонецПроцедуры +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрыЗакрытия = Неопределено Тогда + ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Изменен); + КонецЕсли; + + Закрыть(ПараметрыЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьМодифицированность(ОписаниеЗавершения) + + Если Модифицированность Тогда + ОписаниеСледующее = Новый ОписаниеОповещения("ПроверитьМодифицированностьЗапись", ЭтотОбъект, ОписаниеЗавершения); + ПоказатьВопрос( + ОписаниеСледующее, + НСтр("ru = 'Данные учетной записи были изменены, они будут сохранены. Продолжить?'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()), + РежимДиалогаВопрос.ДаНет); + + Иначе + ВыполнитьОбработкуОповещения(ОписаниеЗавершения, КодВозвратаДиалога.Да); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ЗакрытьДанныеПользователя(ВведенноеЗначение) + + ОбъектПароля = СервисКриптографииDSSКлиент.ПодготовитьОбъектПароля(ВведенноеЗначение); + Возврат ОбъектПароля.Значение; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(КонтекстФормы) + + ОбъектСправочника = КонтекстФормы.Объект; + ЭлементыФормы = КонтекстФормы.Элементы; + + ВидимостьСертификата= ОбъектСправочника.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации"); + ВидимостьПароля = ОбъектСправочника.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") + ИЛИ ОбъектСправочника.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_УчетныеДанные"); + + ЭлементыФормы.ГруппаСертификат.Видимость = ВидимостьСертификата; + ЭлементыФормы.ВыгрузитьСертификат.Видимость = ЗначениеЗаполнено(КонтекстФормы.ДанныеСертификата); + КонтекстФормы.Сертификат = ?(ЗначениеЗаполнено(КонтекстФормы.ДанныеСертификата), + НСтр("ru = 'Загружен'"), + НСтр("ru = 'Загрузите файл'")); + + ЭлементыФормы.Пароль.ТолькоПросмотр = НЕ ВидимостьПароля; + ЭлементыФормы.Пароль.ПодсказкаВвода = ?(ВидимостьПароля, "", НСтр("ru = 'Не требуется'")); + ЭлементыФормы.Сертификат.Доступность = НЕ КонтекстФормы.МобильныйКлиент; + ЭлементыФормы.Автор.ТолькоПросмотр = НЕ КонтекстФормы.ПолноправныйПользователь; + ЭлементыФормы.ГруппаЛичныйКабинет.Видимость = ЗначениеЗаполнено(КонтекстФормы.АдресЛичногоКабинета); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьКартинку(ИмяКартинки) + + НашлиКартинку = СервисКриптографииDSS.ПолучитьКартинкуПодсистемы(ИмяКартинки); + + Если НашлиКартинку.Вид <> ВидКартинки.Пустая Тогда + Элементы.ВыгрузитьСертификат.Картинка = НашлиКартинку; + Иначе + Элементы.ВыгрузитьСертификат.Отображение = ОтображениеКнопки.Текст; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьДанныеСсылок() + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + ЛичныйКабинет = ""; + АдресЛичногоКабинета = ""; + + Если НЕ СервисКриптографииDSSСлужебный.ПроверитьПраво("ЭкземплярыСервераDSS") Тогда + Возврат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЭкземплярыСервераDSS.АдресЛичногоКабинета КАК АдресЛичногоКабинета + |ИЗ + | Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + |ГДЕ + | ЭкземплярыСервераDSS.Ссылка = &СсылкаСервера"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("СсылкаСервера", Объект.Владелец); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + АдресЛичногоКабинета = Выборка.АдресЛичногоКабинета; + ОбщаяСтрока = "" + НСтр("ru = 'Открыть'", КодЯзыка) + ""; + ЛичныйКабинет = СтроковыеФункции.ФорматированнаяСтрока(ОбщаяСтрока); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриИзмененииСервисаПодписиСервер() + + ОбновитьДанныеСсылок(); + ДоступныеСпособыАвторизации = ПодготовитьСписки(Объект.Владелец); + Элементы.ВторичнаяАвторизация.СписокВыбора.ЗагрузитьЗначения(ДоступныеСпособыАвторизации.ВторичнаяАвторизация); + СервисКриптографииDSSКлиентСервер.ПолучитьПредставлениеСпособовАвторизации(Элементы.ВторичнаяАвторизация.СписокВыбора); + Элементы.ПервичнаяАутентификация.СписокВыбора.ЗагрузитьЗначения(ДоступныеСпособыАвторизации.ПервичнаяАутентификация); + СервисКриптографииDSSКлиентСервер.ПолучитьПредставлениеСпособовАвторизации(Элементы.ПервичнаяАутентификация.СписокВыбора); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииСозданииНаСервере() + + ПриИзмененииСервисаПодписиСервер(); + + Если ЗначениеЗаполнено(Объект.Ссылка) Тогда + ИдентификаторСправочника = Объект.Ссылка.УникальныйИдентификатор(); + НастройкиПользователя = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(Объект.Ссылка); + Иначе + ИдентификаторСправочника = Новый УникальныйИдентификатор; + Если ДоступныеСпособыАвторизации.ПервичнаяАутентификация.Количество() > 0 Тогда + Объект.ПервичнаяАутентификация = ДоступныеСпособыАвторизации.ПервичнаяАутентификация[0]; + КонецЕсли; + Если ДоступныеСпособыАвторизации.ВторичнаяАвторизация.Количество() > 0 Тогда + Объект.ВторичнаяАвторизация = ДоступныеСпособыАвторизации.ВторичнаяАвторизация[0]; + КонецЕсли; + КонецЕсли; + + ОбновитьСтатусЗащищенногоХранилища(); + ОбновитьСостояниеЗаявления(); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСостояниеЗаявления(ПринудительноПоказать = Ложь) + + ДанныеЗаявления = Обработки.УправлениеПодключениемDSS.ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат(Объект.Ссылка); + ПоставляемыйСервер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Владелец, "ВнутреннийИдентификатор", Истина); + ЗаявлениеПодключено = ЗначениеЗаполнено(ПоставляемыйСервер) + И ЗначениеЗаполнено(ДанныеЗаявления.ИдентификаторАбонента) + И СервисКриптографииDSS.ИспользоватьРасширенныеВозможности(); + НовоеЗаявление = Истина; + ЕстьЗаявление = Истина; + ТекущийОбъект = РеквизитФормыВЗначение("Объект"); + Если ТекущийОбъект.СодержаниеЗаявления.Получить() = Неопределено Тогда + ЕстьЗаявление = Ложь + КонецЕсли; + + Если Объект.СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено Тогда + СостояниеОбработкиЗаявления = НСтр("ru = 'Заявление на изменение параметров подключения исполнено.'"); + ИначеЕсли Объект.СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Отклонено Тогда + СостояниеОбработкиЗаявления = НСтр("ru = 'Заявление на изменение параметров подключения отклонено.'"); + ИначеЕсли Объект.СостояниеЗаявления = Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено Тогда + СостояниеОбработкиЗаявления = НСтр("ru = 'Заявление на изменение параметров подключения отправлено. Проверьте статус.'"); + НовоеЗаявление = Ложь; + Иначе + СостояниеОбработкиЗаявления = НСтр("ru = 'Заявление на изменение параметров подключения не отправлено.'"); + НовоеЗаявление = Ложь; + КонецЕсли; + + Элементы.ГруппаСостояниеЗаявления.Видимость = ЗаявлениеПодключено И (ПринудительноПоказать ИЛИ НЕ НовоеЗаявление); + Элементы.ИзменитьРеквизитыПодключения.Видимость = ЗаявлениеПодключено И НовоеЗаявление И НЕ ПринудительноПоказать; + Элементы.ОткрытьПредыдущееЗаявление.Видимость = ЗаявлениеПодключено И ЕстьЗаявление И ЗаявлениеПодключено; + +КонецПроцедуры + +&НаСервере +Процедура БлокироватьДляРедактирования() + + ЗаблокироватьДанныеФормыДляРедактирования(); + +КонецПроцедуры + +&НаСервере +Процедура РазблокироватьДляРедактирования() + + РазблокироватьДанныеФормыДляРедактирования(); + +КонецПроцедуры + +&НаСервере +Процедура СохранитьИзмененияЗаявления(ДанныеЗаявления) + + ТекущийОбъект = РеквизитФормыВЗначение("Объект"); + ТекущийОбъект.СостояниеЗаявления = ДанныеЗаявления.СостояниеЗаявления; + ТекущийОбъект.СодержаниеЗаявления = Новый ХранилищеЗначения(ДанныеЗаявления.СодержаниеЗаявления); + ТекущийОбъект.Записать(); + + Прочитать(); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСтатусЗащищенногоХранилищаСервер() + + ОбновитьСтатусЗащищенногоХранилища(); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьСтатусЗащищенногоХранилища() + + ПинКод = ""; + Пароль = ""; + Сертификат = Неопределено; + + Если Объект.ПервичнаяАутентификация = Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации Тогда + ПинКод = ПодготовитьЗакрытыеДанные(ПолучитьДанныеХранилища(ИдентификаторСправочника, "ПарольСертификата")); + ДанныеСертификата = ПолучитьДанныеХранилища(ИдентификаторСправочника, "СертификатАвторизации"); + ИначеЕсли Объект.ПервичнаяАутентификация <> Перечисления.СпособыАвторизацииDSS.Первичный_КодАвторизации Тогда + Пароль = ПодготовитьЗакрытыеДанные(ПолучитьДанныеХранилища(ИдентификаторСправочника, "Пароль")); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПодготовитьСписки(СерверПодписи) + + Результат = Новый Структура("ПервичнаяАутентификация, ВторичнаяАвторизация"); + Результат.ПервичнаяАутентификация = СервисКриптографииDSS.СписокПервичнойАвторизации(СерверПодписи); + Результат.ВторичнаяАвторизация = СервисКриптографииDSS.СписокВторичнойАвторизации(СерверПодписи); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ОбновитьНастройкиПользователя(ТекущийПользователь) + + СервисКриптографииDSSСлужебныйВызовСервера.СброситьПараметрыСеансаУчетнойЗаписи(ТекущийПользователь); + Результат = СервисКриптографииDSSСлужебныйВызовСервера.ПолучитьНастройкиПользователя(ТекущийПользователь); + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПодготовитьЗакрытыеДанные(ТекущиеДанные) + + АвторизованныйПользователь = Пользователи.АвторизованныйПользователь(); + Результат = СервисКриптографииDSSКлиентСервер.ПолучитьЗначениеПароля(ТекущиеДанные, АвторизованныйПользователь); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьДанныеХранилища(ИдентификаторСправочника, ПараметрДанных = "") + + Результат = СервисКриптографииDSSСлужебный.ПолучитьЗакрытыеДанные(Строка(ИдентификаторСправочника), ПараметрДанных); + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Процедура ЗаписатьВХранилищеСервер(ИдентификаторСправочника, НовоеЗначение) + + СервисКриптографииDSSСлужебный.СохранитьЗакрытыеДанные(СокрЛП(ИдентификаторСправочника), НовоеЗначение); + +КонецПроцедуры + +#Область АсинхронныеВызовы + +&НаКлиенте +Процедура ПроверитьМодифицированностьЗапись(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ЭлементЗаписан = Истина; + Если Модифицированность Тогда + ОтказОтПроверки = Истина; + ЭлементЗаписан = Записать(); + КонецЕсли; + + Если ЭлементЗаписан Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры, КодВозвратаДиалога.Да); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеКлиент(РезультатВыбора = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + ОписаниеСледующее = Новый ОписаниеОповещения("ПроверитьПодключениеСервиса", ЭтотОбъект); + ПроверитьМодифицированность(ОписаниеСледующее); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьПодключениеСервиса(РезультатВыбора = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + НастройкиПользователя = ОбновитьНастройкиПользователя(Объект.Ссылка); + ОписаниеСледующее = Новый ОписаниеОповещения("РезультатАвторизации", ЭтотОбъект); + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("ИдентификаторОперации", УникальныйИдентификатор); + ПараметрыОперации.Вставить("Принудительно", Истина); + ПараметрыОперации.Вставить("ОжидатьВыполнения", Истина); + СервисКриптографииDSSКлиент.ПроверкаАутентификацииПользователя(ОписаниеСледующее, Объект.Ссылка, ПараметрыОперации); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура РезультатАвторизации(РезультатВызова, ДополнительныеПараметры) Экспорт + + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + Если РезультатВызова.Выполнено Тогда + СервисКриптографииDSSКлиент.ВывестиИнформацию(Неопределено, + НСтр("ru = 'Проверка авторизации выполнена успешно.'", КодЯзыка), + 30); + ОбновитьСтатусЗащищенногоХранилищаСервер(); + ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоОшибкаАутентификации(РезультатВызова.Ошибка) Тогда + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, РезультатВызова.Ошибка); + ИначеЕсли НЕ СервисКриптографииDSSКлиентСервер.ЭтоОшибкаОтказа(РезультатВызова.Ошибка) Тогда + СервисКриптографииDSSКлиент.ВывестиОшибку(Неопределено, РезультатВызова.Ошибка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьСертификатПослеПолучения(РезультатВызова, ДополнительныеПараметры) Экспорт + + Если РезультатВызова.Выполнено Тогда + ДанныеСертификата = РезультатВызова.Результат.ДанныеФайла; + Модифицированность = Истина; + УправлениеФормой(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСостояниеПослеПроверки(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + ПараметрыФормы = Новый Структура; + Если Объект.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Отправлено") Тогда + ПараметрыФормы.Вставить("ОбновитьАвтоматически", Истина); + Иначе + ПараметрыФормы.Вставить("ОбновитьАвтоматически", Ложь); + КонецЕсли; + ПараметрыФормы.Вставить("УчетнаяЗапись", Объект.Ссылка); + ПараметрыФормы.Вставить("СостояниеЗаявления", Объект.СостояниеЗаявления); + ОписаниеСледующее = Новый ОписаниеОповещения("ОбновитьСостояниеЗавершение", ЭтотОбъект); + БлокироватьДляРедактирования(); + СервисКриптографииDSSКлиент.ОткрытьЗаявлениеНаИзменение(ОписаниеСледующее, ПараметрыФормы); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСостояниеЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора.Выполнено Тогда + СохранитьИзмененияЗаявления(РезультатВыбора.Результат); + КонецЕсли; + РазблокироватьДляРедактирования(); + ОбновитьСостояниеЗаявления(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРеквизитыПодключенияПослеПроверки(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("УчетнаяЗапись", Объект.Ссылка); + ПараметрыФормы.Вставить("СостояниеЗаявления", ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено")); + ОписаниеСледующее = Новый ОписаниеОповещения("ИзменитьРеквизитыПодключенияЗавершение", ЭтотОбъект); + БлокироватьДляРедактирования(); + СервисКриптографииDSSКлиент.ОткрытьЗаявлениеНаИзменение(ОписаниеСледующее, ПараметрыФормы); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРеквизитыПодключенияЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора.Выполнено Тогда + СохранитьИзмененияЗаявления(РезультатВыбора.Результат); + КонецЕсли; + РазблокироватьДляРедактирования(); + УправлениеФормой(ЭтотОбъект); + ОбновитьСостояниеЗаявления(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОформленноеЗаявление(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("УчетнаяЗапись", Объект.Ссылка); + ПараметрыФормы.Вставить("СостояниеЗаявления", ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияУчетнойЗаписиDSS.Исполнено")); + СервисКриптографииDSSКлиент.ОткрытьЗаявлениеНаИзменение(Неопределено, ПараметрыФормы); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Form.form b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Form.form new file mode 100644 index 000000000..eb634c35a --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Form.form @@ -0,0 +1,1224 @@ + + + + ГруппаШапка + 1 + + ГруппаАдресСервера + 41 + + АдресСервера + 11 + true + true + + true + + + Объект.АдресСервера + + + OnChange + АдресСервераПриИзменении + + + АдресСервераРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + АдресСервераКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + + AutoComplete + АдресСервераАвтоПодбор + + 40 + true + false + true + true + true + Normal + + ru + Адрес сервера, например https://dss.cryptopro.ru + + + + + ГруппаДлительнаяОперация + 132 + + ДекорацияПояснение + 137 + + <key>ru</key> + <value>запрос информации с сервера</value> + + true + true + + true + + + ДекорацияПояснениеРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + + ДекорацияПояснениеКонтекстноеМеню + 138 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Длительная операция</value> + + Center + + ГруппаДлительнаяОперацияРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адрес сервера</value> + + + ГруппаАдресСервераРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаЦИ + 126 + + СервисИдентификации + 30 + + <key>ru</key> + <value>Адрес</value> + + true + true + + true + + + Объект.СервисИдентификации + + Left + + СервисИдентификацииРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + СервисИдентификацииКонтекстноеМеню + 31 + true + + InputField + Enter + true + Left + true + + + AutoComplete + СервисИдентификацииАвтоПодбор + + + ChoiceProcessing + СервисИдентификацииОбработкаВыбора + + 40 + true + false + true + true + true + true + Normal + + ru + Полный или относительный адрес, например "STS" + + + + + ИдентификаторЦИ + 14 + + <key>ru</key> + <value>Идентификатор клиента</value> + + true + true + + true + + + Объект.ИдентификаторЦИ + + Left + + ИдентификаторЦИРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ИдентификаторЦИКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Сервис центра идентификации</value> + + + ГруппаЦИРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + auto + Auto + Auto + + + + ГруппаСЭП + 128 + + СервисПодписи + 33 + + <key>ru</key> + <value>Адрес</value> + + true + true + + true + + + Объект.СервисПодписи + + Left + + OnChange + СервисПодписиПриИзменении + + + СервисПодписиРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + СервисПодписиКонтекстноеМеню + 34 + true + + InputField + Enter + true + Left + true + + + AutoComplete + СервисПодписиАвтоПодбор + + + ChoiceProcessing + СервисПодписиОбработкаВыбора + + 40 + true + false + true + true + true + true + Normal + + ru + Полный или относительный адрес, например "SignServer" + + + + + ИдентификаторСЭП + 27 + + <key>ru</key> + <value>Идентификатор сервиса</value> + + true + true + + true + + + Объект.ИдентификаторСЭП + + Left + + ИдентификаторСЭПРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ИдентификаторСЭПКонтекстноеМеню + 28 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + Normal + + ru + Идентификатор, например: "urn:cryptopro:dss:signserver:signserver" + + + + true + true + + true + + + <key>ru</key> + <value>Сервис электронной подписи</value> + + + ГруппаСЭПРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + auto + Auto + Auto + + + + ГруппаПроверки + 130 + + СервисПроверки + 36 + + <key>ru</key> + <value>Адрес</value> + + true + true + + true + + + Объект.СервисПроверки + + Button + + СервисПроверкиРасширеннаяПодсказка + 38 + + <key>ru</key> + <value>Адрес службы проверки подписи и сертификатов "КриптоПро SVS 2.0". +Данная служба может быть развернута на этом же сервере или может быть сторонним сервером. +Если служба развернута вместе сервером DSS, обычно назначено имя "Verify" +</value> + + Label + true + true + + Left + + + + СервисПроверкиКонтекстноеМеню + 37 + true + + InputField + Enter + true + Left + true + + + AutoComplete + СервисПроверкиАвтоПодбор + + + ChoiceProcessing + СервисПроверкиОбработкаВыбора + + 40 + true + false + true + true + true + true + Normal + + ru + Относительный или полный адрес. + + + + true + true + + true + + + <key>ru</key> + <value>Сервис проверки подписи и сертификатов</value> + + + ГруппаПроверкиРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + + + ГруппаОбработкиДокументов + 150 + + СервисОбработкиДокументов + 152 + + <key>ru</key> + <value>Адрес</value> + + true + true + + true + + + Объект.СервисОбработкиДокументов + + + ru + Адрес сервиса обработки документов, например "DocumentStore" + + + СервисОбработкиДокументовРасширеннаяПодсказка + 154 + Label + true + true + + Left + + + + СервисОбработкиДокументовКонтекстноеМеню + 153 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + СервисОбработкиДокументовАвтоПодбор + + + ChoiceProcessing + СервисОбработкиДокументовОбработкаВыбора + + true + true + true + true + true + true + true + Normal + + ru + Полный или относительный адрес, например "DocumentStore" + + + + true + true + + true + + + <key>ru</key> + <value>Сервис обработки документов</value> + + + ГруппаОбработкиДокументовРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + + + ГруппаАудита + 155 + + СервисАудита + 157 + + <key>ru</key> + <value>Адрес</value> + + true + true + + true + + + Объект.СервисАудита + + + СервисАудитаРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + + СервисАудитаКонтекстноеМеню + 158 + true + + InputField + true + Enter + true + Left + true + + + AutoComplete + СервисАудитаАвтоПодбор + + + ChoiceProcessing + СервисАудитаОбработкаВыбора + + true + true + true + true + true + true + true + Normal + + ru + Полный или относительный адрес, например "AnalyticsService" + + + + true + true + + true + + + <key>ru</key> + <value>Сервис аудита</value> + + + ГруппаАудитаРасширеннаяПодсказка + 156 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + + + ГруппаЛичныйКабинет + 143 + + АдресЛичногоКабинета + 145 + true + true + + true + + + Объект.АдресЛичногоКабинета + + + АдресЛичногоКабинетаРасширеннаяПодсказка + 147 + + <key>ru</key> + <value>Адрес личного кабинета пользователя сервера DSS</value> + + Label + true + true + + Left + + + + АдресЛичногоКабинетаКонтекстноеМеню + 146 + true + + InputField + Enter + true + Left + true + + + AutoComplete + АдресЛичногоКабинетаАвтоПодбор + + + ChoiceProcessing + АдресЛичногоКабинетаОбработкаВыбора + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Личный кабинет</value> + + + ГруппаЛичныйКабинетРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + auto + Auto + Auto + + + + ДекорацияПустая + 140 + true + true + + true + + + ДекорацияПустаяРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + + ДекорацияПустаяКонтекстноеМеню + 141 + true + + Label + true + true + + Left + + + + Комментарий + 53 + true + true + + true + + + Объект.Комментарий + + + КомментарийРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 54 + true + + InputField + Enter + true + Left + true + + + StartChoice + КомментарийНачалоВыбора + + 1 + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Основное</value> + + + ГруппаШапкаРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ПолучитьОписание + 51 + + <key>ru</key> + <value>Заполнить возможные значения по информации с сервера</value> + + true + true + + true + + + ПолучитьОписаниеРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + CommandBarHyperlink + Form.Command.ПолучитьОписание + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ЗаполнитьИзФайла + 114 + true + true + + true + + + ЗаполнитьИзФайлаРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Form.Command.ЗаполнитьИзФайла + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаРасширенныеНастройки + 160 + true + true + + true + + + ФормаРасширенныеНастройкиРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + CommandBarHyperlink + Form.Command.РасширенныеНастройки + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + ОбъектОбработки + 1 + + DataProcessorObject.УправлениеПодключениемDSS + + + true + + + true + + + + Объект + 2 + + CatalogObject.ЭкземплярыСервераDSS + + + true + + + true + +
      true
      + true +
      + + Изменен + 4 + + Boolean + + + true + + + true + + + + НастройкиПользователя + 5 + + + true + + + true + + + + ПрежнийСервер + 3 + + String + + + + true + + + true + + + + ОтказОтПроверки + 6 + + Boolean + + + true + + + true + + + + Администратор + 7 + + Boolean + + + true + + + true + + + + ИдВерсии + 8 + + Number + + 10 + + + + true + + + true + + + + ПолучитьОписание + + <key>ru</key> + <value>Получить описание</value> + + 1 + + ru + Получить описание + + + true + + + + ПолучитьОписание + + + Auto + Auto + + + ЗаполнитьИзФайла + + <key>ru</key> + <value>Заполнить данные из файла</value> + + 4 + + ru + Заполнить из файла + + + true + + + + ЗаполнитьИзФайла + + + Auto + Auto + + + РасширенныеНастройки + + <key>ru</key> + <value>Расширенные настройки</value> + + 5 + + ru + Расширенные настройки + + + true + + + + РасширенныеНастройки + + + Auto + Auto + + + + + + + + AfterWrite + ПослеЗаписи + + + OnReadAtServer + ПриЧтенииНаСервере + + + BeforeWrite + ПередЗаписью + + +
      diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Help/ru.html new file mode 100644 index 000000000..88edd8ada --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Help/ru.html @@ -0,0 +1,53 @@ + + +

      Предназначена для хранения настроек +подключения к сервису облачной подписи.

      + +

      Сервис облачной подписи позволяют хранить +сертификаты и закрытые ключи к ним в «Облаке». Это позволяет пользователю +использовать функции подписания, шифрования, расшифровки данных практически с +любого компьютера. Для использования этого функционала не требуется установки +криптопровайдеров и сертификатов на локальный компьютер, достаточно +предоставить данные для авторизации на настроенном сервисе.

      + +

       К каждому серверу облачной подписи привязываются +учетной записи этого сервиса, указываемые в справочнике «Учетные записи +облачной подписи»

      + +

      Настройка подключения

      + +
      • В поле адрес сервера указывается полный веб-адрес подключения к + сервису
      • +
      • В поле адрес сервиса центра идентификации указывается полный или + относительный адрес подключения. 
      • +
      • В поле адрес сервиса электронной подписи указывается полный или + относительный адрес подключения. 
      • +
      • В + поле адрес сервиса обработки документов указывается полный или + относительный адрес подключения.
      • +
      • В поле адрес службы проверки подписи и сертификатов указывает полный + или относительный адрес подключения. 
      • +
      • В поле адрес личного кабинета указывается полный или относительный + адрес подключения.  Это поле + является не обязательным, информация в этом может быть удобной для + организации быстрого перехода к странице личного кабинета пользователя + опубликованного не сервисе.
      • +
      • В поле идентификатор клиента указываются ключевые данные для + идентификации пользователя
      • +
      • Поле идентификатор сервиса может заполняться автоматически или + указано пользователем вручную
      • +
      • По кнопке Расширенные настройки можно перейти на отдельную форму для + указания необязательных настроек:
      • +
        • Представление сервера
        • +
        • Время ожидания подключения к + сервису (таймаут) указывает в секундах
        • +
        • Версия поддерживаемого АПИ
        • +
        • Отключить использование + данного сервера – исключается из последующего создания учетных записей, и + выбора учетных записей
        • +
      • По кнопке Ограничение авторизации можно перейти на отдельную форму позволяющая + задать список способ авторизации достуных этому серверу
      • +
      • Также по ссылке Учетные записи облачной подписи + можно перейти к списку зарегистрированных учетных записей облачной подписи + связанных этим элементом сервера облачной подписи
      • +
      \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Module.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Module.bsl new file mode 100644 index 000000000..23e2be483 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Forms/ФормаЭкземпляраСервераDSS/Module.bsl @@ -0,0 +1,721 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОписаниеПеременных + +&НаКлиенте +Перем ПрограммноеЗакрытие; + +&НаКлиенте +Перем НовыйЭлемент; + +#КонецОбласти + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + + Администратор = Пользователи.ЭтоПолноправныйПользователь(, Истина); + + ПриСозданииЧтенииНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ПриСозданииЧтенииНаСервере(); + + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие); + НовыйЭлемент = НЕ ЗначениеЗаполнено(Объект.Ссылка); + + ИспользоватьДлительнуюОперацию(); + СформироватьНаименование(); + ЗаполнитьАдресаСервисов(); + + // СтандартныеПодсистемы.ПодключаемыеКоманды + ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект); + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) + + Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы( + ЭтотОбъект, + Отказ, + ПрограммноеЗакрытие, + ЗавершениеРаботы) Тогда + ЗакрытьФорму(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) + + Изменен = Модифицированность; + ПроверитьАдресаСервисов(Отказ); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если НовыйЭлемент Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("СоздатьНовуюУчетнуюЗапись", ЭтотОбъект); + ПоказатьВопрос(ОповещениеСледующее, + НСтр("ru = 'Добавлена информация о новом сервере облачной подписи. + |Добавить новую учетную запись для этого сервера?'", + СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()), + РежимДиалогаВопрос.ДаНет, + 30); + ИначеЕсли Изменен Тогда + ОповещениеСледующее = Новый ОписаниеОповещения("ОбновитьПараметрСеанса", ЭтотОбъект); + ПоказатьВопрос(ОповещениеСледующее, + НСтр("ru = 'Изменились настройки сервера DSS. + |Необходимо полностью обновить сеансовые параметры. + |Обновить?'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()), + РежимДиалогаВопрос.ДаНет, + 30); + КонецЕсли; + + ПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи); + + НовыйЭлемент = Ложь; + Изменен = Ложь; + ОтказОтПроверки = Ложь; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура АдресСервераПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Объект.АдресСервера) Тогда + СформироватьНаименование(); + ПолучитьОписаниеСервиса(Ложь); + КонецЕсли; + + ЗаполнитьАдресаСервисов(); + +КонецПроцедуры + +&НаКлиенте +Процедура АдресСервераАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + ДанныеВыбора = Неопределено; + + Если ЗначениеЗаполнено(Текст) Тогда + НачалоАдреса = Сред(Текст, 1, 8); + Если СтрНайти("https://", НачалоАдреса, , 1) = 0 + И СтрНайти("http://", НачалоАдреса, , 1) = 0 Тогда + ДанныеВыбора = Новый СписокЗначений; + ДанныеВыбора.Добавить("https://" + Текст); + КонецЕсли; + КонецЕсли; + + СтандартнаяОбработка = ДанныеВыбора = Неопределено; + +КонецПроцедуры + +&НаКлиенте +Процедура СервисПодписиПриИзменении(Элемент) + + СформироватьИдентификаторСЭП(); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисПодписиАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + ДополнитьСписокСервером(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисПодписиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ПослеВыбораАдресаСервера(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисПроверкиАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + ДополнитьСписокСервером(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисПроверкиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ПослеВыбораАдресаСервера(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисИдентификацииАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + ДополнитьСписокСервером(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисИдентификацииОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ПослеВыбораАдресаСервера(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура АдресЛичногоКабинетаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + ДополнитьСписокСервером(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура АдресЛичногоКабинетаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ПослеВыбораАдресаСервера(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисОбработкиДокументовОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ПослеВыбораАдресаСервера(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисОбработкиДокументовАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + ДополнитьСписокСервером(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисАудитаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + ПослеВыбораАдресаСервера(Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура СервисАудитаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + ДополнитьСписокСервером(Элемент, Текст, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура РасширенныеНастройки(Команда) + + ОповещениеСледующее = Новый ОписаниеОповещения("ПослеВыбораРасширенныхНастроек", ЭтотОбъект); + + МассивАвторизация = Новый Массив; + + Для Каждого СтрокаМассива Из Объект.ОграничениеАвторизации Цикл + МассивАвторизация.Добавить(СтрокаМассива.СпособАвторизации); + КонецЦикла; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр); + ПараметрыФормы.Вставить("СпособыАвторизации", МассивАвторизация); + ПараметрыФормы.Вставить("ВерсияАПИ", Объект.ВерсияАПИ); + ПараметрыФормы.Вставить("ТаймАут", Объект.ТаймАут); + ПараметрыФормы.Вставить("Используется", Объект.Используется); + ПараметрыФормы.Вставить("ШаблонПодтверждения", Объект.ШаблонПодтверждения); + ПараметрыФормы.Вставить("Наименование", Объект.Наименование); + ПараметрыФормы.Вставить("Заголовок", + ?(ЗначениеЗаполнено(Объект.Ссылка), + СокрЛП(Объект.Ссылка), + НСтр("ru = 'новый элемент'", СервисКриптографииDSSСлужебныйКлиент.КодЯзыка()))); + + ОткрытьФорму("Обработка.УправлениеПодключениемDSS.Форма.РасширенныеНастройкиСервера", ПараметрыФормы, ЭтотОбъект, , , , ОповещениеСледующее); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьИзФайла(Команда) + + ОписаниеСледующее = Новый ОписаниеОповещения("ПослеЗагрузкиФайлаНастроек", ЭтотОбъект); + АдресФайла = ПоместитьВоВременноеХранилище("", УникальныйИдентификатор); + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(); + + СервисКриптографииDSSКлиент.ЗагрузитьДанныеИзФайла(ОписаниеСледующее, ".txt", АдресФайла, Истина, ПараметрыОперации); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьОписание(Команда) + + ПолучитьОписаниеСервиса(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ БСП + +// СтандартныеПодсистемы.ПодключаемыеКоманды +&НаКлиенте +Процедура Подключаемый_ВыполнитьКоманду(Команда) + ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт + ВыполнитьКомандуНаСервере(ПараметрыВыполнения); +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения) + ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбновитьКоманды() + ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект); +КонецПроцедуры +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды + +&НаКлиенте +Процедура ПослеВыбораАдресаСервера(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + Если ВыбранноеЗначение = Объект.АдресСервера + "/" Тогда + СтандартнаяОбработка = Ложь; + ТекущийЭлемент = Элемент; + Элемент.ВыделенныйТекст = ВыбранноеЗначение; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьОписаниеСервиса(Интерактивно = Ложь) + + ОписаниеСледующее = Новый ОписаниеОповещения("ПолучитьОписаниеПослеПолучения", ЭтотОбъект); + Если Интерактивно Тогда + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(); + СервисКриптографииDSSКлиент.ВыбратьНастройкиСервиса(ОписаниеСледующее, Объект.АдресСервера, ПараметрыОперации); + Иначе + ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь); + СервисКриптографииDSSКлиент.ПолучитьОписаниеСервиса(ОписаниеСледующее, Объект.АдресСервера, ПараметрыОперации); + КонецЕсли; + + ИспользоватьДлительнуюОперацию(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьДлительнуюОперацию(Включить = Ложь) + + Элементы.ГруппаДлительнаяОперация.Видимость = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьСписок(СписокВыбора) + + Счетчик = СписокВыбора.Количество(); + + Пока Счетчик > 1 Цикл + СписокВыбора.Удалить(Счетчик - 1); + Счетчик = Счетчик + 1; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура СформироватьНаименование() + + АдресСервера = Объект.АдресСервера; + + Если Объект.Наименование = ПрежнийСервер Тогда + Объект.Наименование = АдресСервера; + КонецЕсли; + + ПрежнийСервер = АдресСервера; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьАдресаСервисов() + + АдресСервера = Объект.АдресСервера; + Элементы.СервисИдентификации.СписокВыбора.Очистить(); + Элементы.СервисПодписи.СписокВыбора.Очистить(); + Элементы.СервисПроверки.СписокВыбора.Очистить(); + Элементы.АдресЛичногоКабинета.СписокВыбора.Очистить(); + Элементы.СервисАудита.СписокВыбора.Очистить(); + Элементы.СервисОбработкиДокументов.СписокВыбора.Очистить(); + + Если ЗначениеЗаполнено(АдресСервера) Тогда + + ДополнитьСписокСервером(Элементы.СервисИдентификации, Объект.СервисИдентификации); + ДополнитьСписокСервером(Элементы.СервисПодписи, Объект.СервисПодписи); + ДополнитьСписокСервером(Элементы.СервисПроверки, Объект.СервисПроверки); + ДополнитьСписокСервером(Элементы.АдресЛичногоКабинета, Объект.АдресЛичногоКабинета); + + ДополнитьСписокСервером(Элементы.СервисАудита, Объект.СервисАудита); + ДополнитьСписокСервером(Элементы.СервисОбработкиДокументов, Объект.СервисОбработкиДокументов); + + КонецЕсли; + + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(ПараметрЗакрытия = Неопределено) + + ПрограммноеЗакрытие = Истина; + + Если ПараметрЗакрытия = Неопределено Тогда + ПараметрЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Изменен); + КонецЕсли; + + Закрыть(ПараметрЗакрытия); + +КонецПроцедуры + +&НаКлиенте +Функция ВернутьПредставлениеАдреса(СписокВыбора, ТекущийАдрес) + + Результат = ""; + + Если СписокВыбора.Количество() > 0 + И СписокВыбора.НайтиПоЗначению(ТекущийАдрес) = Неопределено Тогда + Для Счетчик = 1 По СписокВыбора.Количество() - 1 Цикл + СтрокаСписка = СписокВыбора[Счетчик]; + Результат = Результат + СтрокаСписка.Значение; + Прервать; + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ПроверитьАдресаСервисов(ОтказСобытия) + + Если ОтказСобытия Тогда + Возврат; + КонецЕсли; + + ТекстВопроса= ""; + Результат = Ложь; + КодЯзыка = СервисКриптографииDSSСлужебныйКлиент.КодЯзыка(); + + Если НЕ ОтказОтПроверки И Модифицированность Тогда + ПредставлениеОшибки = ВернутьПредставлениеАдреса(Элементы.СервисИдентификации.СписокВыбора, Объект.СервисИдентификации); + Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда + ТекстВопроса = ТекстВопроса + + НСтр("ru = 'Рекомендуемый адрес ЦИ:'", КодЯзыка) + + Символы.ПС + + ПредставлениеОшибки + + Символы.ПС; + КонецЕсли; + + ПредставлениеОшибки = ВернутьПредставлениеАдреса(Элементы.СервисПодписи.СписокВыбора, Объект.СервисПодписи); + Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда + ТекстВопроса = ТекстВопроса + + НСтр("ru = 'Рекомендуемый адрес СЭП:'", КодЯзыка) + + Символы.ПС + + ПредставлениеОшибки + + Символы.ПС; + КонецЕсли; + + Если ИдВерсии > 1 Тогда + ПредставлениеОшибки = ВернутьПредставлениеАдреса(Элементы.СервисОбработкиДокументов.СписокВыбора, Объект.СервисОбработкиДокументов); + Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда + ТекстВопроса = ТекстВопроса + + НСтр("ru = 'Рекомендуемый адрес сервиса обработки документов:'", КодЯзыка) + + Символы.ПС + + ПредставлениеОшибки + + Символы.ПС; + КонецЕсли; + + ПредставлениеОшибки = ВернутьПредставлениеАдреса(Элементы.СервисАудита.СписокВыбора, Объект.СервисАудита); + Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда + ТекстВопроса = ТекстВопроса + + НСтр("ru = 'Рекомендуемый адрес сервиса аудита:'", КодЯзыка) + + Символы.ПС + + ПредставлениеОшибки + + Символы.ПС; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если ЗначениеЗаполнено(ТекстВопроса) Тогда + ТекстВопроса = НСтр("ru = 'Обнаружено расхождение при заполнении настроек сервера.'", КодЯзыка) + + Символы.ПС + + ТекстВопроса + + Символы.ПС + НСтр("ru = 'Продолжить?'", КодЯзыка); + ОписаниеСледующее = Новый ОписаниеОповещения("ПроверкаАдресаСервисовОтвет", ЭтотОбъект); + ПоказатьВопрос(ОписаниеСледующее, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30); + Результат = Истина; + КонецЕсли; + + ОтказСобытия = Результат; + +КонецПроцедуры + +&НаКлиенте +Процедура СформироватьИдентификаторСЭП() + + СписокВыбора = Элементы.ИдентификаторСЭП.СписокВыбора; + СписокВыбора.Очистить(); + + ИдентификаторСервиса = СервисКриптографииDSSКлиент.СформироватьИдентификаторСЭП(Объект.СервисПодписи); + Если ЗначениеЗаполнено(ИдентификаторСервиса) Тогда + СписокВыбора.Добавить(ИдентификаторСервиса); + КонецЕсли; + + Элементы.ИдентификаторСЭП.КнопкаВыпадающегоСписка = СписокВыбора.Количество() > 0; + +КонецПроцедуры + +&НаКлиенте +Процедура ДополнитьСписокСервером(Элемент, ТекстРедактирования, СтандартнаяОбработка = Истина) + + Если ПустаяСтрока(ТекстРедактирования) Тогда + Возврат; + КонецЕсли; + + НачалоПозиции = 0; + Элемент.ПолучитьГраницыВыделения(,НачалоПозиции,,); + АдресСервера = Объект.АдресСервера; + + Если ЗначениеЗаполнено(АдресСервера) Тогда + Если Элемент.СписокВыбора.Количество() = 0 Тогда + Элемент.СписокВыбора.Добавить(""); + КонецЕсли; + + ДлинаТекста = СтрДлина(ТекстРедактирования); + Если СтрНайти(ТекстРедактирования, АдресСервера, , 1) = 0 + И СтрНайти(НРег(ТекстРедактирования), "http", , 1) = 0 + И НачалоПозиции > ДлинаТекста Тогда + Элемент.СписокВыбора[0].Значение = АдресСервера + "/" + ТекстРедактирования; + Иначе + Элемент.СписокВыбора[0].Значение = ТекстРедактирования; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УправлениеФормой(КонтекстФормы) + + Элементы = КонтекстФормы.Элементы; + ОбъектСправочника = КонтекстФормы.Объект; + ЕстьДоступ = НЕ ЗначениеЗаполнено(ОбъектСправочника.ВнутреннийИдентификатор) ИЛИ КонтекстФормы.Администратор; + + КонтекстФормы.ТолькоПросмотр = НЕ ЕстьДоступ; + + Элементы.СервисИдентификации.КнопкаВыпадающегоСписка = Элементы.СервисИдентификации.СписокВыбора.Количество() > 0; + Элементы.СервисПодписи.КнопкаВыпадающегоСписка = Элементы.СервисПодписи.СписокВыбора.Количество() > 0; + Элементы.СервисПроверки.КнопкаВыпадающегоСписка = Элементы.СервисПроверки.СписокВыбора.Количество() > 0; + Элементы.АдресЛичногоКабинета.КнопкаВыпадающегоСписка = Элементы.СервисПроверки.СписокВыбора.Количество() > 0; + Элементы.СервисОбработкиДокументов.КнопкаВыпадающегоСписка = Элементы.СервисОбработкиДокументов.СписокВыбора.Количество() > 0; + Элементы.СервисАудита.КнопкаВыпадающегоСписка = Элементы.СервисАудита.СписокВыбора.Количество() > 0; + + Элементы.ГруппаАудита.Видимость = КонтекстФормы.ИдВерсии > 1; + Элементы.ГруппаОбработкиДокументов.Видимость = КонтекстФормы.ИдВерсии > 1; + +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииЧтенииНаСервере() + + ПрежнийСервер = Объект.АдресСервера; + ИдВерсии = СервисКриптографииDSSКлиентСервер.ИдентификаторВерсииСервера(Объект.ВерсияАПИ); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Процедура ПриСменеВерсииАПИСервер() + + ИдВерсии = СервисКриптографииDSSКлиентСервер.ИдентификаторВерсииСервера(Объект.ВерсияАПИ); + УправлениеФормой(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Процедура РазобратьФайлНастроек(АдресФайла) + + ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла); + ДанныеФайла = ПолучитьСтрокуИзДвоичныхДанных(ДанныеФайла); + НастройкиСервиса = СервисКриптографииDSSСлужебный.РазобратьФайлНастроекСервера(ДанныеФайла); + + Объект.АдресСервера = НастройкиСервиса.АдресСервера; + Объект.СервисПодписи = НастройкиСервиса.СервисПодписи; + Объект.СервисПроверки = НастройкиСервиса.СервисПроверки; + Объект.СервисИдентификации = НастройкиСервиса.СервисИдентификации; + Объект.СервисАудита = НастройкиСервиса.СервисАудита; + Объект.СервисОбработкиДокументов = НастройкиСервиса.СервисОбработкиДокументов; + Объект.ИдентификаторЦИ = НастройкиСервиса.ИдентификаторЦИ; + Объект.ИдентификаторСЭП = НастройкиСервиса.ИдентификаторСЭП; + Объект.ШаблонПодтверждения = НастройкиСервиса.ШаблонПодтверждения; + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура ОбновитьНастройкиНаСервере(СсылкаСервера) + + СервисКриптографииDSSСлужебный.ЗаполнитьНастройкиПодключения(СсылкаСервера); + +КонецПроцедуры + +#Область АсинхронныеВызовы + +&НаКлиенте +Процедура СоздатьНовуюУчетнуюЗапись(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + ПараметрыОперации = Новый Структура(); + ПараметрыОперации.Вставить("Основание", Объект.Ссылка); + СервисКриптографииDSSКлиент.ОткрытьСведенияУчетнойЗаписи(Неопределено, Неопределено, ПараметрыОперации); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьПараметрСеанса(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора = КодВозвратаДиалога.Да Тогда + ОбновитьНастройкиНаСервере(Объект.Ссылка); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// РезультатВызова - Структура: +// * Результат - Структура: +// ** СервисыСЭП - Массив из Структура: +// *** АдресСервиса- Строка +// *** Заголовок - Строка +// ** СервисыЦИ - Массив из Структура: +// *** АдресСервиса- Строка +// *** Заголовок - Строка +// ** СервисИдентификации- Строка +// ** СервисПодписи - Строка +// ДополнительныеПараметры - Неопределено +// - Структура +// +&НаКлиенте +Процедура ПолучитьОписаниеПослеПолучения(РезультатВызова, ДополнительныеПараметры) Экспорт + + ИспользоватьДлительнуюОперацию(); + ОчиститьСписок(Элементы.СервисИдентификации.СписокВыбора); + ОчиститьСписок(Элементы.СервисПодписи.СписокВыбора); + ОчиститьСписок(Элементы.СервисПроверки.СписокВыбора); + + Если РезультатВызова.Выполнено Тогда + + Если РезультатВызова.Результат.Свойство("СервисыСЭП") Тогда + СписокВыбора = Элементы.СервисПодписи.СписокВыбора; + Для каждого СтрокаМассива Из РезультатВызова.Результат.СервисыСЭП Цикл + СписокВыбора.Добавить(СтрокаМассива.АдресСервиса, СтрокаМассива.Заголовок); + КонецЦикла; + + СписокВыбора = Элементы.СервисИдентификации.СписокВыбора; + Для каждого СтрокаМассива Из РезультатВызова.Результат.СервисыЦИ Цикл + СписокВыбора.Добавить(СтрокаМассива.АдресСервиса, СтрокаМассива.Заголовок); + КонецЦикла; + Иначе + Объект.СервисИдентификации = РезультатВызова.Результат.СервисИдентификации; + Объект.СервисПодписи = РезультатВызова.Результат.СервисПодписи; + КонецЕсли; + + УправлениеФормой(ЭтотОбъект); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗагрузкиФайлаНастроек(РезультатВызова, ДополнительныеПараметры) Экспорт + + Если РезультатВызова.Выполнено Тогда + РазобратьФайлНастроек(РезультатВызова.Результат.ДанныеФайла); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверкаАдресаСервисовОтвет(РезультатОтвета, ДополнительныеПараметры) Экспорт + + Если РезультатОтвета = КодВозвратаДиалога.Да Тогда + ОтказОтПроверки = Истина; + Записать(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеВыбораРасширенныхНастроек(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора.Выполнено Тогда + Модифицированность = Истина; + СмениласьВерсия = Объект.ВерсияАПИ <> РезультатВыбора.Результат.ВерсияАПИ; + ЗаполнитьЗначенияСвойств(Объект, РезультатВыбора.Результат); + Объект.ОграничениеАвторизации.Очистить(); + Для Каждого СтрокаМассива Из РезультатВыбора.Результат.СпособыАвторизации Цикл + НоваяСтрока = Объект.ОграничениеАвторизации.Добавить(); + НоваяСтрока.СпособАвторизации = СтрокаМассива; + КонецЦикла; + + Если СмениласьВерсия Тогда + ПриСменеВерсииАПИСервер(); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Help/ru.html b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Help/ru.html new file mode 100644 index 000000000..b3d6f9d08 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Help/ru.html @@ -0,0 +1 @@ +Служебная обработка необходимая для работы с подсистемой "Облачная подпись" \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/ManagerModule.bsl b/SSL/src/DataProcessors/УправлениеПодключениемDSS/ManagerModule.bsl new file mode 100644 index 000000000..ab873b15f --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/ManagerModule.bsl @@ -0,0 +1,2014 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// Следующие процедуры и функции предназначены для интеграции с 1С:Библиотека электронных документов. + +#Область ОбработкаЗаявления + +#Область ФоновыеЗадания + +// Обращается к сервису для получения реестра зарегистрированных серверов облачной подписи +// +// Параметры: +// ПараметрыФункции - Структура: +// * ВнутреннийИдентификатор - Строка - необязательный, используется для фильтрации списка +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// Массив из Структура - каждая строка содержит поля: +// * Ссылка - СправочникСсылка.УчетныеЗаписиDSS +// * Наименование - Строка +// * АдресСервера - Строка +// * АдресЛичногоКабинета - Строка +// * СервисИдентификации - Строка +// * СервисПодписи - Строка +// * СервисПроверки - Строка +// * ВнутреннийИдентификатор - Строка +// * ИдентификаторЦИ - Строка +// * ИдентификаторСЭП - Строка +// * ШаблонПодтверждения - Строка +// * ТаймАут - Число +// * ВерсияАПИ - Строка +// * Комментарий - Строка +// * Используется - Булево +// * ОграничениеАвторизации - Строка +// * ПользовательШифрования - Строка +// * ПарольПользовательШифрования - Строка +// +Функция ОбменССерверомСписокСерверовОблачнойПодписи(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + Результат = Новый Массив; + ВнутреннийИдентификатор = СвойствоСтруктуры(ПараметрыФункции, "ВнутреннийИдентификатор", ""); + + ПараметрыПодключения = ПараметрыПодключенияСервисов("СписокСерверовDSS"); + + ПараметрыЗапроса = Новый Структура; + Если ЗначениеЗаполнено(ВнутреннийИдентификатор) Тогда + ПараметрыЗапроса.Вставить("id", ВнутреннийИдентификатор); + КонецЕсли; + + ОтветСервиса = ВыполнитьЗапросREST(ПараметрыПодключения, ПараметрыЗапроса); + Если ОтветСервиса.Выполнено Тогда + СоответствиеТипов = СпособыАвторизацииОблачнойПодписи(); + + Для Каждого ТекущийЭлемент Из ОтветСервиса.Результат Цикл + ОписаниеСервиса = ПолучитьОписаниеСервисаОблачнойПодписи(); + + ОписаниеСервиса.Наименование = СвойствоСтруктуры(ТекущийЭлемент, "srvUri", ""); + ОписаниеСервиса.АдресСервера = СвойствоСтруктуры(ТекущийЭлемент, "srvUri", ""); + ОписаниеСервиса.СервисПодписи = СвойствоСтруктуры(ТекущийЭлемент, "sgnSrv", ""); + ОписаниеСервиса.СервисИдентификации = СвойствоСтруктуры(ТекущийЭлемент, "stsSrv", ""); + ОписаниеСервиса.СервисПроверки = СвойствоСтруктуры(ТекущийЭлемент, "verSrv", ""); + ОписаниеСервиса.ИдентификаторЦИ = СвойствоСтруктуры(ТекущийЭлемент, "stsId", ""); + ОписаниеСервиса.ИдентификаторСЭП = СвойствоСтруктуры(ТекущийЭлемент, "sgnId", ""); + + ОписаниеСервиса.Используется = СвойствоСтруктуры(ТекущийЭлемент, "isUsed", Истина); + ОписаниеСервиса.ТаймАут = СвойствоСтруктуры(ТекущийЭлемент, "timeout", 120); + ОписаниеСервиса.ВерсияАПИ = СвойствоСтруктуры(ТекущийЭлемент, "apiVer", ""); + ОписаниеСервиса.АдресЛичногоКабинета = СвойствоСтруктуры(ТекущийЭлемент, "accUri", ""); + ОписаниеСервиса.ВнутреннийИдентификатор = СвойствоСтруктуры(ТекущийЭлемент, "prvId", ""); + + ОписаниеСервиса.ПользовательШифрования = СвойствоСтруктуры(ТекущийЭлемент, "pubUser", ""); + ОписаниеСервиса.ПарольПользовательШифрования = СвойствоСтруктуры(ТекущийЭлемент, "pubUserPassword", ""); + + СпособАутентификации = СвойствоСтруктуры(ТекущийЭлемент, "authMeth", 3); + СпособАвторизации = СвойствоСтруктуры(ТекущийЭлемент, "cfrmMeth", 9); + + Если СпособАутентификации = 3 И СпособАвторизации = 9 Тогда + СпособАутентификации = -2; + КонецЕсли; + + ОграничениеАвторизации = Новый Массив; + ОграничениеАвторизации.Добавить(СоответствиеТипов[СпособАутентификации]); + ОграничениеАвторизации.Добавить(СоответствиеТипов[СпособАвторизации]); + + ОписаниеСервиса.ОграничениеАвторизации = СтрСоединить(ОграничениеАвторизации, ","); + + Результат.Добавить(ОписаниеСервиса); + + КонецЦикла; + + КонецЕсли; + + Если АдресРезультата <> Неопределено Тогда + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Обращается к сервису для проверки существования указанного логина и получения реестра серверов +// +// Параметры: +// ПараметрыФункции - Структура: +// * Логин - Строка +// * ВнутреннийИдентификатор - Строка - необязательный +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// Структура: +// * Логин - Строка +// * Сервисы - Массив из см. ОбменССерверомСписокСерверовОблачнойПодписи +// +Функция ОбменССерверомПроверитьПодключение(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + Логин = СвойствоСтруктуры(ПараметрыФункции, "Логин", ""); + ВнутреннийИдентификатор = СвойствоСтруктуры(ПараметрыФункции, "ВнутреннийИдентификатор", ""); + + ВсеСервисы = ОбменССерверомСписокСерверовОблачнойПодписи(Неопределено); + + Результат = Новый Структура; + Результат.Вставить("Логин", Логин); + Результат.Вставить("Сервисы", ВсеСервисы); + Результат.Вставить("ЛогинОбнаружен", Ложь); + + Если НЕ ЗначениеЗаполнено(ВнутреннийИдентификатор) И ВсеСервисы.Количество() > 1 Тогда + ВнутреннийИдентификатор = ВсеСервисы[0].АдресСервера; + КонецЕсли; + + Если ЗначениеЗаполнено(ВнутреннийИдентификатор) И ЗначениеЗаполнено(Логин) Тогда + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ВнутреннийИдентификатор", ВнутреннийИдентификатор); + ПараметрыВызова.Вставить("Логин", Логин); + РезультатПроверки = ОбменССерверомПроверитьЛогин(ПараметрыВызова); + Если РезультатПроверки.Пройден = Ложь Тогда + Результат.Вставить("Логин", РезультатПроверки.Варианты); + Результат.Вставить("ЛогинОбнаружен", Истина); + КонецЕсли; + КонецЕсли; + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, НСтр("ru = 'Проверить подключение'")); + +КонецФункции + +// Вызывает сервис проверки логина учетной записи. +// +// Параметры: +// ПараметрыФункции - Структура: +// * ВнутреннийИдентификатор - Строка - идентификатор сервера +// * Логин - Строка +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево +// * Варианты - Строка +// * Ошибка - Строка +// +Функция ОбменССерверомПроверитьЛогин(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Пройден", Неопределено); + Результат.Вставить("Варианты", ""); + Результат.Вставить("Ошибка", ""); + + Логин = ПараметрыФункции.Логин; + ВнутреннийИдентификатор = ПараметрыФункции.ВнутреннийИдентификатор; + + ПараметрыПодключения = ПараметрыПодключенияСервисов("ПроверитьЛогинDSS"); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("login", Логин); + Если ЗначениеЗаполнено(ВнутреннийИдентификатор) Тогда + ПараметрыЗапроса.Вставить("prvId", ВнутреннийИдентификатор); + КонецЕсли; + + ОтветСервиса = ВыполнитьЗапросREST(ПараметрыПодключения, ПараметрыЗапроса); + Если ОтветСервиса.Выполнено Тогда + Результат.Пройден = СвойствоСтруктуры(ОтветСервиса.Результат, "isFree", Ложь); + Результат.Варианты = СвойствоСтруктуры(ОтветСервиса.Результат, "Login", ""); + Иначе + Результат.Ошибка = ОтветСервиса.Ошибка; + КонецЕсли; + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, НСтр("ru = 'Проверить логин'")); + +КонецФункции + +// Вызывает сервис активирования логина учетной записи. +// В случае успеха в настройках сервера облачной подписи включается аутентификация по паролю, отключается +// подтверждение всех операций. +// +// Параметры: +// ПараметрыФункции - Структура: +// * ИдентификаторСубъекта - Строка - идентификатор отправленного заявления +// * ИдентификаторПодписи - Строка - подписываемые данные +// * ДанныеПодписи - ДвоичныеДанные - данные подписи идентификатора подписи +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево +// * Ошибка - Строка +// +Функция ОбменССерверомАктивироватьУчетнуюЗапись(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Ложь); + Результат.Вставить("Ошибка", ""); + + ИдентификаторСубъекта = ПараметрыФункции.ИдентификаторСубъекта; + ПодписьПароля = ПараметрыФункции.ПодписьПароля; + ДанныеПодписи = ПараметрыФункции.ДанныеПодписи; + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + + ПараметрыПодключения = ПараметрыПодключенияСервисов("АктивироватьПароль"); + ПараметрыПодключения.ТочкаПодключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПараметрыПодключения.ТочкаПодключения, ИдентификаторСубъекта, ПодписьПароля); + + ОтветСервиса = ВыполнитьЗапросREST(ПараметрыПодключения, JsonИзСтруктуры(ПолучитьBase64СтрокуИзДвоичныхДанных(ДанныеПодписи)), "POST", Заголовки); + Если ОтветСервиса.Выполнено Тогда + Если СвойствоСтруктуры(ОтветСервиса.Результат, "code", "-1") <> "0" Тогда + Результат.Ошибка = НСтр("ru = 'Ошибка активирования учетной записи'"); + Иначе + Результат.Выполнено = Истина; + КонецЕсли; + Иначе + Результат.Ошибка = ОтветСервиса.Ошибка; + КонецЕсли; + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, НСтр("ru = 'Активировать учетную запись'")); + +КонецФункции + +// Вызывает сервис активирования ключа для мобильного приложения (QR-code). +// +// Параметры: +// ПараметрыФункции - Структура: +// * ИдентификаторСубъекта - Строка +// * ПодписьПриложения - ДвоичныеДанные +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево +// * Результат - Булево - результат активирования +// * Ошибка - Строка +// +Функция ОбменССерверомАктивироватьКлючПриложенияУчетнойЗаписи(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Истина); + Результат.Вставить("Результат", Ложь); + Результат.Вставить("Ошибка", ""); + + ПодписьПриложения = ПараметрыФункции.ПодписьПриложения; + ИдентификаторСубъекта = ПараметрыФункции.ИдентификаторСубъекта; + + ПараметрыПодключения = ПараметрыПодключенияСервисов("АктивироватьКлючМобильногоПриложения"); + ПараметрыПодключения.АдресЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПараметрыПодключения.АдресЗапроса, ИдентификаторСубъекта, ПодписьПриложения); + + ОтветСервиса = ВыполнитьЗапросREST(ПараметрыПодключения, Неопределено); + + Если ОтветСервиса.Выполнено Тогда + Если СвойствоСтруктуры(ОтветСервиса.Результат, "code", "-1") = "0" Тогда + Результат.Результат = Истина; + КонецЕсли; + Иначе + Результат.Ошибка = ОтветСервиса.Ошибка; + КонецЕсли; + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, НСтр("ru = 'Активировать ключ мобильного приложения'")); + +КонецФункции + +// Вызывает сервис отправки кода активация для ключа мобильного приложения. +// +// Параметры: +// ПараметрыФункции - Структура: +// * ПодписьКодаАктивацииПриложения- Строка +// * ИдентификаторСубъекта - Строка +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево +// * Результат - Булево - результат активирования +// * Ошибка - Строка +// +Функция ОбменССерверомОтправитьКодАктивацииКлюча(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Ложь); + + ПараметрыПодключения = ПараметрыПодключенияСервисов("ОтправитьКодАктивацииКлюча"); + ПодписьКода = ПараметрыФункции.ПодписьКодаАктивацииПриложения; + ИдентификаторСубъекта = ПараметрыФункции.ИдентификаторСубъекта; + + ПараметрыПодключения.АдресЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПараметрыПодключения.АдресЗапроса, ИдентификаторСубъекта, ПодписьКода); + + ОтветСервиса = ВыполнитьЗапросREST(ПараметрыПодключения, Неопределено); + Если ОтветСервиса.Выполнено Тогда + Если СвойствоСтруктуры(ОтветСервиса.Результат, "code", "-1") = "0" Тогда + Результат.Выполнено = Истина; + КонецЕсли; + КонецЕсли; + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, НСтр("ru = 'Отправка кода активации мобильного приложения'")); + +КонецФункции + +// Отправляет заявление на изменение параметров подключения облачной подписи на портал УЦ. +// +// Параметры: +// ПараметрыФункции - Структура: +// * Заявление - Строка - содержимое заявления в формате XML +// * ПодписьЗаявления - ДвоичныеДанные, Неопределено - ЭП сформированная для заявления +// * ИдентификаторДокументооборота - Строка - идентификатор отправляемого заявления +// * ТикетПользователя - Строка - предварительно полученный тикет пользователя из сервиса Интернет-поддержки +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево +// * Ошибка - Строка +// * ИдентификаторДокументооборота - Строка +// * ДатаОтправки - Дата +// +Функция ОтправитьЗаявлениеНаПортал(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + ВидОперации = НСтр("ru = 'Отправить заявление на портал'"); + Заявление = ПараметрыФункции.Заявление; + ПодписьЗаявления = ПараметрыФункции.ПодписьЗаявления; + ИдентификаторДокументооборота = ПараметрыФункции.ИдентификаторДокументооборота; + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Ложь); + Результат.Вставить("Ошибка", ""); + Результат.Вставить("ИдентификаторДокументооборота", ИдентификаторДокументооборота); + Результат.Вставить("ДатаОтправки", Неопределено); + + ОписаниеОшибки = ""; + ШаблонОписанияОшибки = НСтр("ru = 'Не удалось отправить заявление по причине: + |%1'"); + + ВсеАдреса = АдресаСервисовОбработкиЗаявления(); + + Попытка + ВебСервис = ВебСервисУЦ(ВсеАдреса.ВебСервис, "http://regservice.keydisk.ru/", "RegService"); + Исключение + + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + + КонецПопытки; + + ЭтоПовторнаяОтправкаПакета = Истина; + Если Не ЗначениеЗаполнено(Результат.ИдентификаторДокументооборота) Тогда + ЭтоПовторнаяОтправкаПакета = Ложь; + Результат.ИдентификаторДокументооборота = НовыйСжатыйУникальныйИдентификатор(); + КонецЕсли; + + ПакетЗаявления = ПакетЗаявления(Заявление, Результат.ИдентификаторДокументооборота, ПодписьЗаявления); + + Попытка + ОтветСервиса = ВебСервис.SendPacket(ПакетЗаявления); + Исключение + + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + + КонецПопытки; + + Если Не ЗначениеЗаполнено(ОтветСервиса) Тогда + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + НСтр("ru = 'Сервер вернул пустой ответ.'")); + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + КонецЕсли; + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(ОтветСервиса); + + ПостроительDOM = Новый ПостроительDOM(); + ПостроительDOM = ПостроительDOM.Прочитать(ЧтениеXML); + + ЧтениеXML.Закрыть(); + + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("code"); + КодРезультата = УзелDOM[0].ТекстовоеСодержимое; + Если КодРезультата = "0" Тогда + Результат.ДатаОтправки = ТекущаяДатаСеанса(); + Результат.Выполнено = Истина; + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + ИначеЕсли КодРезультата = "60" // Документооборот уже зарегистрирован. + И ЭтоПовторнаяОтправкаПакета Тогда + Результат.ДатаОтправки = ТекущаяДатаСеанса(); + Результат.Выполнено = Истина; + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + КонецЕсли; + + Результат.ИдентификаторДокументооборота = ""; + + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("errorMessage"); + Если УзелDOM.Количество() > 0 Тогда + ОписаниеОшибки = УзелDOM[0].ТекстовоеСодержимое; + КонецЕсли; + + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + ОписаниеОшибки); + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + +КонецФункции + +// Получает тикет пользователя Интернет-поддержки +// +// Параметры: +// ПараметрыФункции - Структура +// АдресРезультата - Строка - в случае необходимости содержит адрес временного хранилища куда помещается результат +// +// Возвращаемое значение: +// - Строка +// - Неопределено +// +Функция ПолучитьТикетИнтернетПоддержкиПользователя(ПараметрыФункции, АдресРезультата = Неопределено) Экспорт + + Результат = Новый Структура(); + Результат.Вставить("Выполнено", Ложь); + Результат.Вставить("Ошибка", ""); + Результат.Вставить("Тикет", Неопределено); + + ВидОперации = НСтр("ru = 'Получить тикет'"); + + Если Не ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда + Результат.Ошибка = НСтр("ru = 'Невозможно подключиться к порталу интернет-поддержки по причине: + |Библиотека интернет поддержки пользователей не внедрена в конфигурацию.'"); + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + КонецЕсли; + + Результат.Вставить("Выполнено", Истина); + + МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей"); + УстановитьПривилегированныйРежим(Истина); + ОтветСервиса = МодульИнтернетПоддержкаПользователей.ТикетАутентификацииНаПорталеПоддержки("http://regservice.1c.ru"); + УстановитьПривилегированныйРежим(Ложь); + + Если ЗначениеЗаполнено(ОтветСервиса.КодОшибки) Тогда + Если ОтветСервиса.КодОшибки = "НеверныйЛогинИлиПароль" Тогда + Результат.Тикет = ""; + КонецЕсли; + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось подключиться к порталу интернет-поддержки по причине: + |%1'"), ОтветСервиса.СообщениеОбОшибке); + Иначе + Результат.Тикет = ОтветСервиса.Тикет; + КонецЕсли; + + Возврат ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации); + +КонецФункции + +#КонецОбласти + +// Возвращает список реквизитов заявления необходимых для отправки в сервис регистрации +// +// Возвращаемое значение: +// Структура +// +Функция СтруктураРеквизитовЗаявления() Экспорт + + Результат = Новый Структура; + Результат.Вставить("ДатаЗаявления", ТекущаяДатаСеанса()); + Результат.Вставить("ИдентификаторЗаявления", ""); + Результат.Вставить("ИдентификаторАбонента", ""); + Результат.Вставить("СостояниеЗаявления", Перечисления.СостоянияЗаявленияУчетнойЗаписиDSS.НеПодготовлено); + Результат.Вставить("ОтпечатокСертификата", ""); + Результат.Вставить("НомерТелефона", ""); + Результат.Вставить("НомерТелефонаXML", ""); + Результат.Вставить("НомерТелефонаПроверен", Ложь); + Результат.Вставить("ЭлектроннаяПочта", ""); + Результат.Вставить("ЭлектроннаяПочтаПроверена", Ложь); + Результат.Вставить("ИНН", ""); + Результат.Вставить("КПП", ""); + Результат.Вставить("СрокQRКода", '00010101'); + Результат.Вставить("Режим_СменаКонтактов", Ложь); + Результат.Вставить("Режим_ПовторнаяОтправкаКлючМобильногоПриложения", Ложь); + Результат.Вставить("Режим_ПовторнаяОтправкаКодаАктивации", Ложь); + Результат.Вставить("Режим_СменаКлючаМобильногоПриложения", Ложь); + Результат.Вставить("Режим_СменаПароля", Ложь); + Результат.Вставить("Режим_ИзданиеСертификата", Ложь); + Результат.Вставить("ТекстЗаявления", ""); + + Возврат Результат; + +КонецФункции + +// Формирует структуру для поиска в файлах настроек необходимых разделов +// +// Параметры: +// ТекущаяУчетнаяЗапись- СправочникСсылка.УчетныеЗаписиDSS +// Сервер - Строка +// Логин - Строка +// +// Возвращаемое значение: +// Структура: +// * Сервер - Строка +// * Логин - Строка +// +Функция КлючПоискаУчетнойЗаписи(ТекущаяУчетнаяЗапись, Сервер = "", Логин = "") Экспорт + + Результат = Новый Структура; + Результат.Вставить("Сервер", Сервер); + Результат.Вставить("Логин", Логин); + + Если ЗначениеЗаполнено(ТекущаяУчетнаяЗапись) Тогда + ВсеЗаписи = СервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи(ТекущаяУчетнаяЗапись); + Если ВсеЗаписи.Количество() > 0 Тогда + Результат.Сервер = ВсеЗаписи[0].ВнутреннийИдентификатор; + Результат.Логин = ВсеЗаписи[0].Логин; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Анализирует состояние блока конфиденциальной информации +// +// Параметры: +// ШифрованныйБлок - Строка +// - ДвоичныеДанные +// КлючПоиска - см. КлючПоискаУчетнойЗаписи +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево - Истина, если блок содержит корректные данные +// * Пароль - Строка +// - Неопределено +// * КлючПриложения - Строка +// - Неопределено +// * НовыйКлючПриложения - Строка +// - Неопределено +// * ПодписьПриложения - Строка +// - Неопределено +// +Функция СлужебныеДанныеОблачнойПодписи(ШифрованныйБлок, КлючПоиска = Неопределено) Экспорт + + Успешно = Ложь; + + Если ЭтоАдресВременногоХранилища(ШифрованныйБлок) Тогда + ДанныеБлока = ПолучитьИзВременногоХранилища(ШифрованныйБлок); + Иначе + ДанныеБлока = ШифрованныйБлок; + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Ложь); + Результат.Вставить("Пароль", Неопределено); + Результат.Вставить("НовыйКлючПриложения", Неопределено); + Результат.Вставить("КлючПриложения", Неопределено); + Результат.Вставить("ПодписьПриложения", Неопределено); + Результат.Вставить("ПодписьКодаАктивации", Неопределено); + Результат.Вставить("ПодписьПароля", Неопределено); + + Пароль = Неопределено; + КлючПриложения = Неопределено; + НовыйКлючПриложения = Неопределено; + ПодписьПриложения = Неопределено; + ПодписьПароля = Неопределено; + ПодписьКодаАктивации = Неопределено; + + Попытка + Текст = ПолучитьСтрокуИзДвоичныхДанных(ДанныеБлока, "windows-1251"); + Текст = "" + Символы.ПС + + "<корневойЭлемент>" + Текст + ""; + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(Текст); + ПостроительDOM = Новый ПостроительDOM; + ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); + + УзелDOM = ПолучитьЭлементУзлаDOM(ДокументDOM, "ОблачныйКлюч", Ложь); + + Для Счетчик = 0 По УзелDOM.Количество() - 1 Цикл + + Узел = УзелDOM[Счетчик]; + + Сервер = ПолучитьАтрибутУзлаXML(Узел, "ИдентификаторСервиса", ""); + Логин = ПолучитьАтрибутУзлаXML(Узел, "ИмяПользователя", ""); + Пароль = ПолучитьАтрибутУзлаXML(Узел, "Пароль", ""); + НовыйКлючПриложения = ЗначениеУзлаXML(Узел, "QRКодНовый"); + КлючПриложения = ЗначениеУзлаXML(Узел, "QRКод"); + ПодписьПароля = ПолучитьАтрибутУзлаXML(Узел, "ПроверочныйКодАктивацииПароля", ""); + ПодписьКодаАктивации = ПолучитьАтрибутУзлаXML(Узел, "ПроверочныйКодПолученияКодаАктивации", ""); + ПодписьПриложения = ПолучитьАтрибутУзлаXML(Узел, "ПроверочныйКодАктивацииКлючаИПолученияКодаАктивации", ""); + + Если ЗначениеЗаполнено(НовыйКлючПриложения) Тогда + КлючПриложения = Base64Значение(НовыйКлючПриложения); + КонецЕсли; + + Если ЗначениеЗаполнено(КлючПриложения) Тогда + КлючПриложения = Base64Значение(КлючПриложения); + КонецЕсли; + + Если КлючПоиска = Неопределено + ИЛИ (КлючПоиска.Сервер = Сервер + И КлючПоиска.Логин = Логин) Тогда + Успешно = Истина; + КонецЕсли; + + КонецЦикла; + + Исключение + Успешно = Ложь; + + КонецПопытки; + + Результат.Выполнено = Успешно; + Если Успешно Тогда + Результат.Пароль = Пароль; + Результат.НовыйКлючПриложения = КлючПриложения; + Результат.КлючПриложения = КлючПриложения; + Результат.ПодписьПриложения = ПодписьПриложения; + Результат.ПодписьПароля = ПодписьПароля; + Результат.ПодписьКодаАктивации = ПодписьКодаАктивации; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Создает или обновляет данные учетной записи облачной подписи +// +// Параметры: +// ДанныеСервиса - СправочникСсылка.ЭкземплярыСервераDSS, Структура - если передана структура, +// то она должна соответствовать см. ПолучитьОписаниеСервисаОблачнойПодписи() +// Логин - Строка +// РежимАутентификации - Строка +// ОбновлятьДанные - Булево - принудительно обновлять данные +// +// Возвращаемое значение: +// СправочникСсылка.УчетныеЗаписиDSS +// +Функция СоздатьУчетнуюЗаписьОблачнойПодписи(ДанныеСервиса, Логин, РежимАутентификации = "", ОбновлятьДанные = Ложь) Экспорт + + КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); + Результат = Неопределено; + СсылкаСервера = Неопределено; + ТекстОшибки = НСтр("ru = 'Недостаточно данных для восстановления учетной записи DSS.'", КодЯзыка) + " " + Логин; + ВидОперации = НСтр("ru = 'Обновление учетной записи'"); + + Если ТипЗнч(ДанныеСервиса) = Тип("Структура") Тогда + Если ЗначениеЗаполнено(ДанныеСервиса.ВнутреннийИдентификатор) Тогда + ВсеСервисы = СервисКриптографииDSS.ПолучитьВсеСерверы(Новый Структура("ВнутреннийИдентификатор", ДанныеСервиса.ВнутреннийИдентификатор)); + Иначе + ВсеСервисы = СервисКриптографииDSS.ПолучитьВсеСерверы(Новый Структура("АдресСервера", ДанныеСервиса.АдресСервера)); + КонецЕсли; + + Если ВсеСервисы.Количество() > 0 И НЕ ОбновлятьДанные Тогда + СсылкаСервера = ВсеСервисы[0].Ссылка; + Иначе + СсылкаСервера = СервисКриптографииDSS.ОбновитьДанныеСервераОблачнойПодписи(ДанныеСервиса); + КонецЕсли; + Иначе + СсылкаСервера = ДанныеСервиса; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(СсылкаСервера) Тогда + ПодготовитьРезультатВызова(ТекстОшибки, Неопределено, ВидОперации); + Возврат Результат; + КонецЕсли; + + // определим способы авторизации и аутентификации + МассивСпособов = СервисКриптографииDSS.СписокПервичнойАвторизации(СсылкаСервера); + Если ЗначениеЗаполнено(РежимАутентификации) Тогда + ПервичнаяАутентификация = Перечисления.СпособыАвторизацииDSS[РежимАутентификации]; + ИначеЕсли МассивСпособов.Количество() = 0 Тогда + ПервичнаяАутентификация = Перечисления.СпособыАвторизацииDSS.Первичный_УчетныеДанные; + Иначе + ПервичнаяАутентификация = МассивСпособов[0]; + КонецЕсли; + + МассивСпособов = СервисКриптографииDSS.СписокВторичнойАвторизации(СсылкаСервера); + Если МассивСпособов.Количество() = 0 Тогда + ВторичнаяАвторизация = Перечисления.СпособыАвторизацииDSS.Вторичный_МобильноеПриложение; + Иначе + ВторичнаяАвторизация = МассивСпособов[0]; + КонецЕсли; + + СтрокаПоиска = Новый Структура("Владелец, Логин", СсылкаСервера, Логин); + УчетнаяЗаписьОблачнойПодписи = СервисКриптографииDSS.НайтиУчетнуюЗапись(СтрокаПоиска); + + Если НЕ ЗначениеЗаполнено(УчетнаяЗаписьОблачнойПодписи) ИЛИ ОбновлятьДанные Тогда + ОписаниеУчетнойЗаписи = Новый Структура; + ОписаниеУчетнойЗаписи.Вставить("Владелец", СсылкаСервера); + ОписаниеУчетнойЗаписи.Вставить("Логин", Логин); + ОписаниеУчетнойЗаписи.Вставить("ПервичнаяАутентификация", ПервичнаяАутентификация); + ОписаниеУчетнойЗаписи.Вставить("ВторичнаяАвторизация", ВторичнаяАвторизация); + ОписаниеУчетнойЗаписи.Вставить("Комментарий", НСтр("ru = 'Заполнено в режиме восстановления учетной записи.'", КодЯзыка)); + Результат = СервисКриптографииDSS.ОбновитьДанныеУчетнойЗаписиОблачнойПодписи(ОписаниеУчетнойЗаписи); + + Иначе + Результат = УчетнаяЗаписьОблачнойПодписи; + + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(Результат) Тогда + ПодготовитьРезультатВызова(ТекстОшибки, Неопределено, ВидОперации); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Формирует параметры для формирования запроса на сертификат +// +// Параметры: +// УчетнаяЗаписьОблачнойПодписи - СправочникСсылка.УчетныеЗаписиDSS +// ПоляЗаявления - Соответствие из КлючИЗначение: +// * Ключ - Строка - идентификатор OID +// * Значение - Строка +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево - обязательное +// * КриптоПровайдер - Строка +// * КриптоПровайдер_Тип - Число +// * КриптоПровайдер_Имя - Строка +// * ШаблонСертификата - Строка - имя шаблона +// * УдостоверяющийЦентр - Строка - идентификатор УЦ +// * ИмяСертификата - Строка - формируется из обязательных полей +// * ПоляАтрибутов - Соответствие - перечисление всех полей запроса +// +Функция ПолучитьДанныеДляЗапросаНаСертификат(УчетнаяЗаписьОблачнойПодписи, ПоляЗаявления) Экспорт + + Результат = Новый Структура(); + Результат.Вставить("Выполнено", Ложь); + + СводныеДанные = СервисКриптографииDSS.ПолучитьИнформациюУдостоверяющихЦентров(УчетнаяЗаписьОблачнойПодписи); + Если СводныеДанные.Заполнено Тогда + + ТекущийКриптоПровайдер = Неопределено; + ТекущийШаблон = Неопределено; + УдостоверяющийЦентр = Неопределено; + ПоляАтрибутов = Неопределено; + ИмяСертификата = ""; + + Для Каждого СтрокаМассива Из СводныеДанные.Криптопровайдеры Цикл + ТекущийКриптоПровайдер = СтрокаМассива; + Если СтрНайти(СтрокаМассива.Описание, "2012") Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Для Каждого СтрокаМассива Из СводныеДанные.УдостоверяющиеЦентры Цикл + ПоляУЦ = СервисКриптографииDSS.ПолучитьРеестрПолейУдостоверяющегоЦентра(СтрокаМассива); + НовыеПоля = Новый Соответствие; + ВсеОбязательные = 0; + ИмяСертификата = ""; + Для Каждого СтрокаПоля Из ПоляУЦ Цикл + ВсеОбязательные = ВсеОбязательные + ?(СтрокаПоля.Обязательно, 1, 0); + ЗначениеПоля = ПоляЗаявления[СтрокаПоля.OID]; + + Если СтрокаПоля.Обязательно Тогда + ИмяСертификата = ИмяСертификата + ?(ПустаяСтрока(ИмяСертификата), "", ",") + СтрокаПоля.Имя + "=" + ЗначениеПоля; + КонецЕсли; + + Если ЗначениеПоля <> Неопределено Тогда + НовыеПоля.Вставить(СтрокаПоля.OID, ЗначениеПоля); + ВсеОбязательные = ВсеОбязательные - ?(СтрокаПоля.Обязательно, 1, 0); + КонецЕсли; + + КонецЦикла; + + Если ВсеОбязательные = 0 Тогда + УдостоверяющийЦентр = СтрокаМассива; + ПоляАтрибутов = НовыеПоля; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если УдостоверяющийЦентр <> Неопределено Тогда + ШаблоныУЦ = СервисКриптографииDSS.ПолучитьРеестрШаблоновУдостоверяющегоЦентра(УдостоверяющийЦентр); + Для Каждого СтрокаШаблона Из ШаблоныУЦ Цикл + ТекущийШаблон = СтрокаШаблона.Шаблон; + Если СтрНайти(СтрокаШаблона.Наименование, "2012") > 0 Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если ЗначениеЗаполнено(ТекущийКриптоПровайдер) Тогда + Результат.Вставить("КриптоПровайдер", ТекущийКриптоПровайдер.Идентификатор); + Результат.Вставить("КриптоПровайдер_Тип", ТекущийКриптоПровайдер.Тип); + Результат.Вставить("КриптоПровайдер_Имя", ТекущийКриптоПровайдер.Имя); + КонецЕсли; + + Если ЗначениеЗаполнено(ТекущийШаблон) Тогда + Результат.Вставить("ШаблонСертификата", ТекущийШаблон); + КонецЕсли; + + Если УдостоверяющийЦентр <> Неопределено Тогда + Результат.Вставить("УдостоверяющийЦентр", УдостоверяющийЦентр.Идентификатор); + КонецЕсли; + + Если ЗначениеЗаполнено(ИмяСертификата) Тогда + ИмяСертификата = СтрЗаменить(ИмяСертификата, """", ""); + Результат.Вставить("ИмяСертификата", ИмяСертификата); + КонецЕсли; + + Если ЗначениеЗаполнено(ПоляАтрибутов) Тогда + Результат.Вставить("ПоляАтрибутов", ПоляАтрибутов); + КонецЕсли; + + КонецЕсли; + + Если Результат.Количество() = 8 Тогда + Результат.Выполнено = Истина; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Обновляет, создает элементы справочника на основании полученных данных для автоматических настроек +// +// Параметры: +// ДокументDOM - ДокументDOM +// КлючПоиска - см. КлючПоискаУчетнойЗаписи +// ОбновлятьДанные - Булево - принудительное обновление +// +// Возвращаемое значение: +// Неопределено, Структура - в случае структуры содержит поля: +// * Логин - Строка +// * ТелефонМобильный - Строка +// * ЭлектроннаяПочта - Строка +// * Отпечаток - Строка +// * ВнутреннийИдентификатор - Строка +// * РежимАутентификации - Строка +// * Сервер - Структура - список полей описан в ПолучитьОписаниеСервисаОблачнойПодписи +// * УчетнаяЗаписьОблачнойПодписи - СправочникСсылка.УчетныеЗаписиDSS +// +Функция ОбновитьДанныеОблачнойПодписиВУчетнойЗаписи(ДокументDOM, КлючПоиска = Неопределено, ОбновлятьДанные = Истина) Экспорт + + Результат = Неопределено; + УчетнаяЗаписьОблачнойПодписи = Неопределено; + + УзелDOM = ПолучитьЭлементУзлаDOM(ДокументDOM, "ВладелецЭЦП", Ложь); + НашлиУзел = Ложь; + + Для Счетчик = 0 По УзелDOM.Количество() - 1 Цикл + + Узел = УзелDOM[Счетчик]; + Отпечаток = НРег(ЗначениеУзлаXML(Узел, "Отпечаток")); + УзелDSS = ПолучитьЭлементУзлаDOM(Узел, "СведенияОПользователеDSS", Истина); + СерверDSS = ПолучитьЭлементУзлаDOM(Узел, "СерверDSS"); + + Сервер = ПолучитьАтрибутУзлаXML(УзелDSS, "ИдентификаторСервиса", ""); + Логин = ПолучитьАтрибутУзлаXML(УзелDSS, "ИмяПользователя", ""); + + Если КлючПоиска = Неопределено + ИЛИ (КлючПоиска.Сервер = Сервер + И КлючПоиска.Логин = Логин) Тогда + НашлиУзел = Истина; + КонецЕсли; + + Если НЕ НашлиУзел Тогда + Продолжить; + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("ВнутреннийИдентификатор", ПолучитьАтрибутУзлаXML(УзелDSS, "ИдентификаторСервиса", "")); + Результат.Вставить("Логин", ПолучитьАтрибутУзлаXML(УзелDSS, "ИмяПользователя", "")); + Результат.Вставить("ТелефонМобильный", ПолучитьАтрибутУзлаXML(УзелDSS, "ТелефонМобильный", "")); + Результат.Вставить("ЭлектроннаяПочта", ПолучитьАтрибутУзлаXML(УзелDSS, "ЭлектроннаяПочта", "")); + Результат.Вставить("Отпечаток", Отпечаток); + Результат.Вставить("РежимАутентификации", ПолучитьАтрибутУзлаXML(УзелDSS, "РежимАутентификации", "")); + Результат.Вставить("СрокQRКода", ПолучитьАтрибутУзлаXML(УзелDSS, "СрокДействияQRКода", '00010101')); + + УзелДействий = ПолучитьЭлементУзлаDOM(Узел, "ДействияОблачнойПодписи", Ложь); + ВсеДействия = Новый Массив; + Для СчетчикДействий = 0 По УзелДействий.Количество() - 1 Цикл + ТекущееДействие = ЗначениеУзлаXML(УзелДействий[СчетчикДействий], "ДействиеОблачнойПодписи", ""); + ВсеДействия.Добавить(ТекущееДействие); + КонецЦикла; + Результат.Вставить("Действия", СтрСоединить(ВсеДействия, ",")); + + Если СерверDSS <> Неопределено Тогда + + ВсеВерсии = СервисКриптографииDSSКлиентСервер.ПоддерживаемыеВерсии(); + ОписаниеСервиса = ПолучитьОписаниеСервисаОблачнойПодписи(); + + АдресСервера = ПолучитьАтрибутУзлаXML(СерверDSS, "АдресDSS", ""); + + ОписаниеСервиса.Наименование = АдресСервера; + ОписаниеСервиса.АдресСервера = АдресСервера; + ОписаниеСервиса.СервисПодписи = ПолучитьАтрибутУзлаXML(СерверDSS, "АдресСЭП", ""); + ОписаниеСервиса.СервисИдентификации = ПолучитьАтрибутУзлаXML(СерверDSS, "АдресЦентраИдентификации", ""); + ОписаниеСервиса.СервисПроверки = ПолучитьАтрибутУзлаXML(СерверDSS, "АдресСервисаПроверки", ""); + ОписаниеСервиса.ИдентификаторЦИ = ПолучитьАтрибутУзлаXML(СерверDSS, "ИдентификаторЦИ", ""); + ОписаниеСервиса.ИдентификаторСЭП = ПолучитьАтрибутУзлаXML(СерверDSS, "ИдентификаторСЭП", ""); + ОписаниеСервиса.ВнутреннийИдентификатор = ПолучитьАтрибутУзлаXML(СерверDSS, "ИдентификаторDSS", ""); + + ОписаниеСервиса.Используется = Истина; + ОписаниеСервиса.ТаймАут = 120; + ОписаниеСервиса.ВерсияАПИ = ВсеВерсии[0]; + ОписаниеСервиса.АдресЛичногоКабинета = ПолучитьАтрибутУзлаXML(СерверDSS, "АдресЛичногоКабинета", ""); + + ОграничениеАвторизации = Новый Массив; + Если Результат.РежимАутентификации = "ПарольМобильноеПриложение" Тогда + СоответствиеТипов = СпособыАвторизацииОблачнойПодписи(); + СпособАутентификации = 2; + СпособАвторизации = 9; + + Если СпособАутентификации = 3 И СпособАвторизации = 9 Тогда + СпособАутентификации = -2; + КонецЕсли; + + ОграничениеАвторизации.Добавить(СоответствиеТипов[СпособАутентификации]); + ОграничениеАвторизации.Добавить(СоответствиеТипов[СпособАвторизации]); + + КонецЕсли; + + ОписаниеСервиса.ОграничениеАвторизации = СтрСоединить(ОграничениеАвторизации, ","); + + Результат.Вставить("Сервер", ОписаниеСервиса); + + Иначе + ПараметрыФункции = Новый Структура(); + ПараметрыФункции.Вставить("ВнутреннийИдентификатор", Результат.ВнутреннийИдентификатор); + МассивСерверов = ОбменССерверомСписокСерверовОблачнойПодписи(ПараметрыФункции); + Если МассивСерверов.Количество() > 0 Тогда + Результат.Вставить("Сервер", МассивСерверов[0]); + КонецЕсли; + КонецЕсли; + + Прервать; + + КонецЦикла; + + Если Результат <> Неопределено Тогда + РежимАутентификации = СпособыАвторизацииОблачнойПодписи()[Результат.РежимАутентификации]; + УчетнаяЗаписьОблачнойПодписи = СоздатьУчетнуюЗаписьОблачнойПодписи( + Результат.Сервер, + Результат.Логин, + РежимАутентификации, + ОбновлятьДанные); + КонецЕсли; + + Если ЗначениеЗаполнено(УчетнаяЗаписьОблачнойПодписи) Тогда + Результат.Вставить("УчетнаяЗаписьОблачнойПодписи", УчетнаяЗаписьОблачнойПодписи); + Иначе + Результат = Неопределено; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Запрос состояния обработки заявления, в случае одобрения возвращает данные для автоматических настроек. +// +// Параметры: +// Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// - СправочникСсылка.УчетныеЗаписиDSS +// ИдентификаторДокументооборота - Строка - идентификатор отправленного заявления +// КлючПоиска - см. КлючПоискаУчетнойЗаписи +// +// Возвращаемое значение: +// Структура: +// * Выполнено - Булево +// * РегистрацияУспешна - Булево +// * Ошибка - Строка +// * ДанныеОтвета - ДвоичныеДанные +// - Неопределено +// * ДанныеШифрованногоБлока - ДвоичныеДанные +// - Неопределено +// * ДанныеСертификата - ДвоичныеДанные +// - Неопределено +// * ДанныеКорневогоСертификата - ДвоичныеДанные +// - Неопределено +// * Программа - СправочникСсылка.УчетныеЗаписиDSS - созданный или обновленный элемент справочника +// * ИдентификаторАбонента - Строка +// * СрокQRКода - Дата +// * НомерТелефона - Строка +// * ЭлектроннаяПочта - Строка +// * Действия - Строка +// +Функция ПолучитьСостояниеЗаявления(Программа, ИдентификаторДокументооборота, КлючПоиска = Неопределено) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Выполнено", Ложь); + Результат.Вставить("ДанныеОтвета", Неопределено); + Результат.Вставить("ДанныеШифрованногоБлока", Неопределено); + Результат.Вставить("ДанныеСертификата", Неопределено); + Результат.Вставить("ДанныеКорневогоСертификата", Неопределено); + Результат.Вставить("Ошибка", ""); + Результат.Вставить("ИдентификаторАбонента", ""); + Результат.Вставить("Программа", Программа); + Результат.Вставить("РегистрацияУспешна", Ложь); + Результат.Вставить("СрокQRКода", '00010101'); + Результат.Вставить("НомерТелефона", ""); + Результат.Вставить("ЭлектроннаяПочта", ""); + Результат.Вставить("Действия", ""); + + ВсеАдреса = АдресаСервисовОбработкиЗаявления(); + + ШаблонОписанияОшибки = + НСтр("ru = 'Не удалось обновить состояние по причине: %1'"); + + Попытка + ВебСервис = ВебСервисУЦ(ВсеАдреса.ВебСервис, "http://regservice.keydisk.ru/", "RegService"); + Ответ = ВебСервис.ReceivePacket(Строка(ИдентификаторДокументооборота)); + + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Возврат Результат; + + КонецПопытки; + + Если Не ЗначениеЗаполнено(Ответ) Тогда + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + НСтр("ru = 'Метод ReceivePacket сервиса 1С:Подпись вернул пустой ответ.'")); + Возврат Результат; + КонецЕсли; + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(Ответ); + ПостроительDOM = Новый ПостроительDOM(); + ПостроительDOM = ПостроительDOM.Прочитать(ЧтениеXML); + ЧтениеXML.Закрыть(); + + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("code"); + КодРезультата = УзелDOM[0].ТекстовоеСодержимое; + + ИмяФайлаПакетОтвета = ""; + Если КодРезультата = "0" Тогда + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("packet"); + + Если УзелDOM.Количество() > 0 Тогда + + ДвоичныеДанные = Base64Значение(УзелDOM[0].ТекстовоеСодержимое); + ИмяФайлаПакетОтвета = ПолучитьИмяВременногоФайла(".zip"); + ДвоичныеДанные.Записать(ИмяФайлаПакетОтвета); + + Результат.ДанныеОтвета = ДвоичныеДанные; + + Иначе + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + НСтр("ru = 'Метод ReceivePacket сервиса 1С:Подпись вернул пустые данные.'")); + КонецЕсли; + + ИначеЕсли КодРезультата = "1" Тогда + Результат.Ошибка = НСтр("ru = 'Заявление еще не обработано, попробуйте позже.'"); + Иначе + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("errorMessage"); + Если УзелDOM.Количество() > 0 Тогда + Результат.Ошибка = УзелDOM[0].ТекстовоеСодержимое; + Иначе + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Метод ReceivePacket сервиса 1С:Подпись вернул код ошибки: %1'"), + Строка(КодРезультата)); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(Результат.Ошибка) Тогда + Возврат Результат; + КонецЕсли; + + ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( + ПолучитьИмяВременногоФайла("package")); + + СоздатьКаталог(ВременныйКаталог); + + ФайлНайден = Ложь; + Попытка + Архив1 = Новый ЧтениеZipФайла(ИмяФайлаПакетОтвета); + + Для Счетчик = 0 По Архив1.Элементы.Количество() - 1 Цикл + + Если Архив1.Элементы[Счетчик].Расширение = "bin" Тогда + ФайлНайден = Истина; + + Архив1.Извлечь(Архив1.Элементы[Счетчик], ВременныйКаталог); + Архив2 = Новый ЧтениеZipФайла(ВременныйКаталог + Архив1.Элементы[Счетчик].Имя); + Архив2.ИзвлечьВсе(ВременныйКаталог); + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ВременныйКаталог + "file"); + ПостроительDOM = Новый ПостроительDOM; + ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); + ЧтениеXML.Закрыть(); + + Результат.РегистрацияУспешна = Булево(ЗначениеУзлаXML(ДокументDOM, "РегистрацияУспешна")); + + Если Результат.РегистрацияУспешна Тогда + Результат.ИдентификаторАбонента = ЗначениеУзлаXML(ДокументDOM, "ИдентификаторАбонента"); + Иначе + Результат.Ошибка = ЗначениеУзлаXML(ДокументDOM, "Результат"); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если Не ФайлНайден Тогда + ВызватьИсключение НСтр("ru = 'Архив не содержит файл данных.'"); + КонецЕсли; + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось разобрать результат выполнения метода ReceivePacket сервиса 1С:Подпись по причине: %1'"), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + + УдалитьФайлы(ИмяФайлаПакетОтвета); + УдалитьФайлы(ВременныйКаталог); + + Если ЗначениеЗаполнено(Результат.Ошибка) Тогда + Возврат Результат; + КонецЕсли; + + Если Не Результат.РегистрацияУспешна Тогда + Результат.Выполнено = Истина; + Возврат Результат; + КонецЕсли; + + // Запрос сертификата. + + Ответ = ВебСервис.ReceiveUpdatedPacket(Строка(Результат.ИдентификаторАбонента), Дата('00010101')); + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(Ответ); + ПостроительDOM = Новый ПостроительDOM(); + ПостроительDOM = ПостроительDOM.Прочитать(ЧтениеXML); + ЧтениеXML.Закрыть(); + + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("code"); + КодРезультата = УзелDOM[0].ТекстовоеСодержимое; + + ИмяФайлаПакетОтвета = ""; + Если КодРезультата = "0" Тогда + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("packet"); + + Если УзелDOM.Количество() > 0 Тогда + + ДвоичныеДанные = Base64Значение(УзелDOM[0].ТекстовоеСодержимое); + ИмяФайлаПакетОтвета = ПолучитьИмяВременногоФайла(".zip"); + ДвоичныеДанные.Записать(ИмяФайлаПакетОтвета); + + Результат.ДанныеОтвета = ДвоичныеДанные; + + Иначе + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОписанияОшибки, + НСтр("ru = 'Метод ReceiveUpdatedPacket сервиса 1С:Подпись вернул пустые данные.'")); + КонецЕсли; + Иначе + УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("errorMessage"); + Если УзелDOM.Количество() > 0 Тогда + Результат.Ошибка = УзелDOM[0].ТекстовоеСодержимое; + Иначе + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Метод ReceiveUpdatedPacket сервиса 1С:Подпись вернул код ошибки: %1'"), + Строка(КодРезультата)); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(Результат.Ошибка) Тогда + Возврат Результат; + КонецЕсли; + + ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( + ПолучитьИмяВременногоФайла("package")); + + СоздатьКаталог(ВременныйКаталог); + + ФайлНайден = Ложь; + + Попытка + Архив = Новый ЧтениеZipФайла(ИмяФайлаПакетОтвета); + + Для Счетчик = 0 По Архив.Элементы.Количество() - 1 Цикл + + Если Архив.Элементы[Счетчик].Расширение = "xml" Тогда + ФайлНайден = Истина; + + Архив.Извлечь(Архив.Элементы[Счетчик], ВременныйКаталог); + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.ОткрытьФайл(ВременныйКаталог + Архив.Элементы[Счетчик].Имя); + ПостроительDOM = Новый ПостроительDOM; + ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); + ЧтениеXML.Закрыть(); + + УзелDOM = ДокументDOM.ПолучитьЭлементыПоИмени("Сертификат"); + + СертификатСтрокой = ""; + КорневойСертификатСтрокой = ""; + + Для Каждого Узел Из УзелDOM Цикл + Хранилище = Узел.Атрибуты.ПолучитьИменованныйЭлемент("Хранилище").ТекстовоеСодержимое; + Если Хранилище = "MY" Тогда + СертификатСтрокой = Узел.ТекстовоеСодержимое; + КонецЕсли; + Если Хранилище = "ROOT" Тогда + КорневойСертификатСтрокой = Узел.ТекстовоеСодержимое; + КонецЕсли; + КонецЦикла; + + Если Не ЗначениеЗаполнено(СертификатСтрокой) Тогда + ВызватьИсключение НСтр("ru = 'Ответ не содержит сведений о выпущенном сертификате.'"); + ИначеЕсли Не ЗначениеЗаполнено(КорневойСертификатСтрокой) Тогда + ВызватьИсключение НСтр("ru = 'Ответ не содержит сведений о корневом сертификате.'"); + КонецЕсли; + + Результат.ДанныеСертификата = Base64Значение(СертификатСтрокой); + Результат.ДанныеКорневогоСертификата = Base64Значение(КорневойСертификатСтрокой); + + КонецЕсли; + КонецЦикла; + + Если Не ФайлНайден Тогда + ВызватьИсключение НСтр("ru = 'Архив не содержит файл данных.'"); + КонецЕсли; + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось разобрать результат выполнения метода ReceiveUpdatedPacket сервиса 1С:Подпись по причине: %1'"), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + + УдалитьФайлы(ИмяФайлаПакетОтвета); + УдалитьФайлы(ВременныйКаталог); + + Если ЗначениеЗаполнено(Результат.Ошибка) Тогда + Возврат Результат; + КонецЕсли; + + Если ТипЗнч(Программа) = СервисКриптографииDSSКлиентСервер.ПолучитьТипОблачнойПодписи() Тогда + Попытка + РезультатОбновления = ОбновитьДанныеОблачнойПодписиВУчетнойЗаписи(ДокументDOM, КлючПоиска, Истина); + Если РезультатОбновления = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не удалось зарегистрировать учетную запись облачной подписи.'"); + ИначеЕсли ЗначениеЗаполнено(Программа) И Программа <> РезультатОбновления.УчетнаяЗаписьОблачнойПодписи Тогда + ВызватьИсключение НСтр("ru = 'Выбранная учетная запись облачной подписи не соответствуют регистрационным данным.'"); + ИначеЕсли Программа <> РезультатОбновления.УчетнаяЗаписьОблачнойПодписи Тогда + Результат.Программа = РезультатОбновления.УчетнаяЗаписьОблачнойПодписи; + КонецЕсли; + Результат.СрокQRКода = РезультатОбновления.СрокQRКода; + Результат.НомерТелефона = РезультатОбновления.ТелефонМобильный; + Результат.ЭлектроннаяПочта = РезультатОбновления.ЭлектроннаяПочта; + Результат.Действия = РезультатОбновления.Действия; + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось разобрать результат выполнения метода ReceiveUpdatedPacket сервиса 1С:Подпись по причине: %1'"), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + КонецПопытки; + КонецЕсли; + + Если ЗначениеЗаполнено(Результат.Ошибка) Тогда + Возврат Результат; + КонецЕсли; + + УзелЗакрытойИнформации = ДокументDOM.ПолучитьЭлементыПоИмени("КонфиденциальнаяИнформация"); + Если УзелЗакрытойИнформации <> Неопределено Тогда + Результат.ДанныеШифрованногоБлока = Base64Значение(УзелЗакрытойИнформации[0].ТекстовоеСодержимое); + КонецЕсли; + + Результат.Выполнено = Истина; + + Возврат Результат; + +КонецФункции + +// Получает данные из предыдущего заявления на выпуск квалифицированного заявления связанного с этой программой +// +// Параметры: +// Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// - СправочникСсылка.УчетныеЗаписиDSS +// СсылкаСертификата - Неопределено +// - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования +// +// Возвращаемое значение: +// Структура: +// * ОблачнаяПодписьМобильныйТелефон - Строка +// * ОблачнаяПодписьЭлектроннаяПочта - Строка +// * ИНН - Строка +// * КПП - Строка +// * ИдентификаторАбонента - Строка +// * ОтпечатокСертификата - Строка +// * СрокQRКода - Дата +// +Функция ПолучитьДанныеИзПредыдущегоЗаявленияНаСертификат(Программа, СсылкаСертификата = Неопределено) Экспорт + + ДанныеЗаявления = Новый Структура(); + ДанныеЗаявления.Вставить("ИдентификаторАбонента", ""); + ДанныеЗаявления.Вставить("ОблачнаяПодписьМобильныйТелефон", ""); + ДанныеЗаявления.Вставить("ОблачнаяПодписьМобильныйТелефонXML", ""); + ДанныеЗаявления.Вставить("ОблачнаяПодписьЭлектроннаяПочта", ""); + ДанныеЗаявления.Вставить("ИНН", ""); + ДанныеЗаявления.Вставить("КПП", ""); + ДанныеЗаявления.Вставить("ОтпечатокСертификата", ""); + ДанныеЗаявления.Вставить("СрокQRКода", '00010101'); + + Если Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено + И Метаданные.Справочники.Найти("СертификатыКлючейЭлектроннойПодписиИШифрования") <> Неопределено Тогда + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | СертификатыКлючейЭлектроннойПодписиИШифрования.СодержаниеЗаявления КАК СодержаниеЗаявления, + | СертификатыКлючейЭлектроннойПодписиИШифрования.Отпечаток КАК Отпечаток + |ИЗ + | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК СертификатыКлючейЭлектроннойПодписиИШифрования + |ГДЕ + | СертификатыКлючейЭлектроннойПодписиИШифрования.Программа = &Программа + | И (&СсылкаСертификата = НЕОПРЕДЕЛЕНО + | ИЛИ СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка <> &СсылкаСертификата) + | + |УПОРЯДОЧИТЬ ПО + | СертификатыКлючейЭлектроннойПодписиИШифрования.ДействителенДо УБЫВ"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Программа", Программа); + Запрос.УстановитьПараметр("СсылкаСертификата", СсылкаСертификата); + + СведенияОЗаявлении = Запрос.Выполнить().Выбрать(); + + РеквизитыЗаявления = Неопределено; + Пока СведенияОЗаявлении.Следующий() Цикл + + Если ЗначениеЗаполнено(СведенияОЗаявлении.Отпечаток) Тогда + ДанныеОтпечатка = Base64Значение(СведенияОЗаявлении.Отпечаток); + ДанныеЗаявления.ОтпечатокСертификата = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(ДанныеОтпечатка)); + КонецЕсли; + + РеквизитыЗаявления = СведенияОЗаявлении.СодержаниеЗаявления.Получить(); + Если ТипЗнч(РеквизитыЗаявления) = Тип("Структура") Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Если РеквизитыЗаявления <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ДанныеЗаявления, РеквизитыЗаявления); + КонецЕсли; + + Возврат ДанныеЗаявления; + +КонецФункции + +// Формируем текст заявления на изменение параметров подключения к серверу облачной подписи +// +// Параметры: +// РеквизитыЗаявления - см. СтруктураРеквизитовЗаявления +// Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// - СправочникСсылка.УчетныеЗаписиDSS +// ТикетПользователя - Строка +// +// Возвращаемое значение: +// Строка +// +Функция ПодготовитьЗаявлениеXML(РеквизитыЗаявления, Программа, ТикетПользователя) Экспорт + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку("windows-1251"); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + + // АПК:1036-выкл - сторонний сервис + ЗаписьXML.ЗаписатьНачалоЭлемента("Заявление"); + ЗаписьXML.ЗаписатьАтрибут("ВерсФорм", "2.5"); + ЗаписьXML.ЗаписатьАтрибут("ДатаВремяФормирования", XMLСтрока(ТекущаяДатаСеанса())); + ЗаписьXML.ЗаписатьАтрибут("ВерсПрог", "1С"); + + ЗаписатьУзелXML(ЗаписьXML, "УчетнаяЗапись", РеквизитыЗаявления.ИдентификаторАбонента, Истина); + ЗаписатьУзелXML(ЗаписьXML, "ТипЗаявления", "2"); + ЗаписатьУзелXML(ЗаписьXML, "ИНН", РеквизитыЗаявления.ИНН, Истина); + ЗаписатьУзелXML(ЗаписьXML, "КПП", РеквизитыЗаявления.КПП, Истина); + + ЗаписьXML.ЗаписатьНачалоЭлемента("ВладельцыЭЦП"); + ЗаписьXML.ЗаписатьНачалоЭлемента("ВладелецЭЦП"); + + ЗаписьРазделаУчетнойЗаписиОблачнойПодписи(ЗаписьXML, РеквизитыЗаявления, Программа); + + ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ВладелецЭЦП. + ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ВладельцыЭЦП. + + ЗаписатьУзелXML(ЗаписьXML, "БилетПользователя", ТикетПользователя, Истина); + + // АПК:1036-вкл - сторонний сервис + + ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента Заявление. + + Результат = ЗаписьXML.Закрыть(); + + Возврат Результат; + +КонецФункции + +// Дополняет текст заявления на изменение параметров подключения сведениями об учетной записи облачной подписи +// +// Параметры: +// ЗаписьXML - ЗаписьXML +// РеквизитыЗаявления - см. СтруктураРеквизитовЗаявления +// Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// - СправочникСсылка.УчетныеЗаписиDSS +// Логин - Строка - для новой учетной записи +// Сервер - Строка - для новой учетной записи +// +Процедура ЗаписьРазделаУчетнойЗаписиОблачнойПодписи(ЗаписьXML, РеквизитыЗаявления, Программа, Логин = "", Сервер = "") Экспорт + + Если СервисКриптографииDSSКлиентСервер.ПолучитьТипОблачнойПодписи() <> ТипЗнч(Программа) Тогда + Возврат; + КонецЕсли; + + НоваяУчетнаяЗапись = НЕ ЗначениеЗаполнено(Программа); + МобильныйТелефонБезРазделителей = СервисКриптографииDSSСлужебный.ТелефонМобильныйБезРазделителей(РеквизитыЗаявления.НомерТелефона); + ЭлектроннаяПочта = РеквизитыЗаявления.ЭлектроннаяПочта; + УдостоверяющийЦентр = "ООО ""НПЦ ""1С"""; // АПК:1297 Не локализуется (формат веб-сервиса). + + МассивДействий = Новый Массив; + + Если НоваяУчетнаяЗапись Тогда + МассивДействий.Добавить("Создать"); + Иначе + НашлиСтроку = СервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи(Программа); + Если НашлиСтроку.Количество() = 0 Тогда + Возврат; + КонецЕсли; + Логин = НашлиСтроку[0].Логин; + Сервер = НашлиСтроку[0].ВнутреннийИдентификатор; + МассивДействий.Добавить("Использовать"); + КонецЕсли; + + Если РеквизитыЗаявления.Режим_ИзданиеСертификата Тогда + МассивДействий.Добавить("СменитьСертификат"); + КонецЕсли; + + Если РеквизитыЗаявления.Режим_СменаКонтактов Тогда + МассивДействий.Добавить("СменитьКонтакты"); + КонецЕсли; + + Если РеквизитыЗаявления.Режим_ПовторнаяОтправкаКлючМобильногоПриложения Тогда + МассивДействий.Добавить("ОтправитьКлюч" + "myDSS"); // АПК:1297 Не локализуется (формат веб-сервиса). + КонецЕсли; + + Если РеквизитыЗаявления.Режим_ПовторнаяОтправкаКодаАктивации Тогда + МассивДействий.Добавить("ОтправитьКодАктивации"); + КонецЕсли; + + Если РеквизитыЗаявления.Режим_СменаКлючаМобильногоПриложения Тогда + МассивДействий.Добавить("СменитьКлюч" + "myDSS"); // АПК:1297 Не локализуется (формат веб-сервиса). + КонецЕсли; + + Если РеквизитыЗаявления.Режим_СменаПароля Тогда + МассивДействий.Добавить("СменитьПароль"); + КонецЕсли; + + // общий блок + ЗаписьXML.ЗаписатьНачалоЭлемента("ПараметрыГенерацииСертификатаВDSS"); + ЗаписьXML.ЗаписатьАтрибут("УдостоверяющийЦентр", УдостоверяющийЦентр); + + ЗаписьXML.ЗаписатьНачалоЭлемента("ОперацииУчетнойЗаписиDSS"); + Для Каждого СтрокаМассива Из МассивДействий Цикл + ЗаписатьУзелXML(ЗаписьXML, "ОперацияУчетнойЗаписиDSS", СтрокаМассива); + КонецЦикла; + ЗаписьXML.ЗаписатьКонецЭлемента(); + + // блок информации об учетной записи + Если НоваяУчетнаяЗапись Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента("НоваяУчетнаяЗаписьDSS"); + Иначе + ЗаписьXML.ЗаписатьНачалоЭлемента("УчетнаяЗаписьDSS"); + КонецЕсли; + ЗаписатьУзелXML(ЗаписьXML, "ИдентификаторСервиса", Сервер); + ЗаписатьУзелXML(ЗаписьXML, "ИмяПользователя", Логин); + ЗаписатьУзелXML(ЗаписьXML, "МобильныйТелефон", МобильныйТелефонБезРазделителей, Истина); + ЗаписатьУзелXML(ЗаписьXML, "ЭлектроннаяПочта", ЭлектроннаяПочта, Истина); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ЗаписьXML.ЗаписатьКонецЭлемента(); + +КонецПроцедуры + +// Анализ номера мобильного телефона на российский стандарт +// +// Параметры: +// Телефон - Строка +// +// Возвращаемое значение: +// Строка +// +Функция ПолучитьПредставлениеТелефона(Телефон) Экспорт + + Представление = ""; + + ТолькоЦифры = ЗначениеПоПредставлениюТелефона(Телефон); + + Если СтрДлина(ТолькоЦифры) = 10 Тогда + Представление = СтрШаблон( + "+7 (%1) %2-%3-%4", + Сред(ТолькоЦифры, 1, 3), + Сред(ТолькоЦифры, 4, 3), + Сред(ТолькоЦифры, 7, 2), + Сред(ТолькоЦифры, 9)); + КонецЕсли; + + Возврат Представление; + +КонецФункции + +// Анализ номера мобильного телефона на российский стандарт +// +// Параметры: +// Телефон - Строка +// +// Возвращаемое значение: +// Строка +// +Функция ЗначениеПоПредставлениюТелефона(Телефон) Экспорт + + ТекстДляОбработки = СокрЛП(Телефон); + + ТолькоЦифры = ""; + Для Индекс = 1 По СтрДлина(ТекстДляОбработки) Цикл + ТекущийСимвол = Сред(ТекстДляОбработки, Индекс, 1); + Если СтрНайти("0123456789", ТекущийСимвол) Тогда + ТолькоЦифры = ТолькоЦифры + ТекущийСимвол; + КонецЕсли; + КонецЦикла; + + Если СтрДлина(ТолькоЦифры) = 11 + И (Сред(ТолькоЦифры, 1, 1) = "7" ИЛИ Сред(ТолькоЦифры, 1, 1) = "8") Тогда + ТолькоЦифры = Сред(ТолькоЦифры, 2); + КонецЕсли; + + Возврат ТолькоЦифры; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция УстановитьСоединениеССерверомИнтернета(URLСервера, ОписаниеОшибки = "", Таймаут = 60) + + СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URLСервера); + Схема = ?(ЗначениеЗаполнено(СтруктураURI.Схема), СтруктураURI.Схема, "http"); + Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси(Схема); + + Попытка + Соединение = Новый HTTPСоединение( + СтруктураURI.Хост, + СтруктураURI.Порт, + СтруктураURI.Логин, + СтруктураURI.Пароль, + Прокси, + Таймаут, + ?(НРег(Схема) = "http", Неопределено, ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение())); + Исключение + + ИнформацияОбОшибке = ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке()); + ВидОперации = НСтр("ru = 'Установление соединения с сервером интернета.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ПодготовитьРезультатВызова(ОписаниеОшибки, Неопределено, ВидОперации); + + Возврат Неопределено; + КонецПопытки; + + Возврат Соединение; + +КонецФункции + +Функция ВыполнитьЗапросREST(ПараметрыПодключения, ПараметрыМетода = Неопределено, МетодЗапроса = "GET", Заголовки = Неопределено) + + Результат = Новый Структура("Выполнено, Ошибка, Результат", Ложь, "", Неопределено); + + Путь = ПараметрыПодключения.ТочкаПодключения; + + ПараметрыЗапроса = Неопределено; + + Если Заголовки = Неопределено Тогда + Заголовки = Новый Соответствие; + КонецЕсли; + + Если ПараметрыМетода <> Неопределено Тогда + ПараметрыЗапроса = ""; + Если МетодЗапроса = "GET" Тогда + Для Каждого СтрокаКлюча Из ПараметрыМетода Цикл + ПараметрыЗапроса = ПараметрыЗапроса + ?(ПустаяСтрока(ПараметрыЗапроса), "", "&"); + ЗначениеПараметра = СтрокаКлюча.Значение; + ПараметрыЗапроса = ПараметрыЗапроса + СтрокаКлюча.Ключ + "=" + ЗначениеПараметра; + КонецЦикла; + Путь = Путь + ?(ПустаяСтрока(ПараметрыЗапроса), "", "?" + ПараметрыЗапроса); + ИначеЕсли ТипЗнч(ПараметрыМетода) <> Тип("Строка") Тогда + ПараметрыЗапроса = JsonИзСтруктуры(ПараметрыМетода); + Иначе + ПараметрыЗапроса = ПараметрыМетода; + КонецЕсли; + КонецЕсли; + + Попытка + Соединение = УстановитьСоединениеССерверомИнтернета(ПараметрыПодключения.АдресСервера); + + Запрос = Новый HTTPЗапрос(Путь, Заголовки); + + Если ПараметрыЗапроса <> Неопределено Тогда + Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса); + КонецЕсли; + + ОтветСервиса = Соединение.ВызватьHTTPМетод(МетодЗапроса, Запрос); + + ТелоКакСтрока = ОтветСервиса.ПолучитьТелоКакСтроку(); + + Если ОтветСервиса.КодСостояния = 200 Тогда + Результат.Результат = JsonВСтруктуру(ТелоКакСтрока); + Результат.Выполнено = Истина; + Иначе + Результат.Ошибка = ТелоКакСтрока; + КонецЕсли; + + Исключение + ДанныеОшибки = ИнформацияОбОшибке(); + ВидОперации = НСтр("ru = 'Вызов REST сервиса.'", ОбщегоНазначения.КодОсновногоЯзыка()) + + ПараметрыПодключения.АдресСервера; + Результат.Ошибка = КраткоеПредставлениеОшибки(ДанныеОшибки); + ПодготовитьРезультатВызова(Результат.Ошибка, Неопределено, ВидОперации); + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +Функция ВебСервисУЦ(АдресВебСервиса, ПространствоИмен, ИмяСервиса) + + ПараметрыПодключения = ОбщегоНазначения.ПараметрыПодключенияWSПрокси(); + ПараметрыПодключения.АдресWSDL = АдресВебСервиса; + ПараметрыПодключения.URIПространстваИмен = ПространствоИмен; + ПараметрыПодключения.ИмяСервиса = ИмяСервиса; + ПараметрыПодключения.Таймаут = 7; + + Возврат ОбщегоНазначения.СоздатьWSПрокси(ПараметрыПодключения); + +КонецФункции + +// Возвращает описание всех сервисов используемые в обработке заявления +// +// Возвращаемое значение: +// Структура +// +Функция АдресаСервисовОбработкиЗаявления() + + Результат = Новый Структура; + Результат.Вставить("СписокСерверовDSS", "/api/v1/dssapi/GetDssList"); + Результат.Вставить("ПроверитьЛогинDSS", "/api/v1/dssuserinfo/CheckLogin"); + Результат.Вставить("АктивироватьПароль", "/api/v1/dssapi/ActivatePassword?skid=%1&guid=%2"); + Результат.Вставить("АктивироватьКлючМобильногоПриложения", "/api/v1/dssapi/ActivateKeyAndGetActivationCode?skid=%1&guid=%2"); + Результат.Вставить("СвойствоУчетнойЗаписи", "/api/v1/dssapi/PropertyLogin"); + Результат.Вставить("ОтправитьКодАктивацииКлюча", "/api/v1/dssapi/GetActivationCode?skid=%1&guid=%2"); + + Результат.Вставить("ВебСервис", "http://regservice.1c.ru/regservice/regservice.asmx?wsdl"); + + Возврат Результат; + +КонецФункции + +Функция ПараметрыПодключенияСервисов(ТочкаПодключения) + + ВсеТочки = АдресаСервисовОбработкиЗаявления(); + + Результат = Новый Структура; + Результат.Вставить("АдресСервера", "http://regservice.1c.ru"); + Результат.Вставить("ТочкаПодключения", ВсеТочки[ТочкаПодключения]); + + Возврат Результат; + +КонецФункции + +Функция ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке) + + Результат = ИнформацияОбОшибке; + Если ИнформацияОбОшибке <> Неопределено Тогда + Если ИнформацияОбОшибке.Причина <> Неопределено Тогда + Результат = ПолучитьИнформациюОбОшибке(ИнформацияОбОшибке.Причина); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция JsonВСтруктуру(СтрокаJSON, ПараметрыПреобразования = Неопределено) + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(СтрокаJSON); + + Объект = ПрочитатьJSON(ЧтениеJSON); + + ЧтениеJSON.Закрыть(); + + Возврат Объект; + +КонецФункции + +// Преобразует структуру или соответствие в строку JSON. Двоичные данные преобразуются в строки Base64. +// +// Параметры: +// СтрокаJSON - Структура, Соответствие - структура, которую необходимо преобразовать в строку JSON. +// ОграничитьДлину - Булево - ограничить длину значения не более 100 символов +// +// Возвращаемое значение: +// Строка - текстовое представление JSON +// +Функция JsonИзСтруктуры(Объект, ОграничитьДлину = Ложь) + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(); + + ЗаписатьJSON(ЗаписьJSON, Объект); + + Возврат ЗаписьJSON.Закрыть(); + +КонецФункции + +Функция СвойствоСтруктуры(Данные, КлючевоеПоле, ЗначениеПоУмолчанию = Неопределено) + + Возврат СервисКриптографииDSSКлиентСервер.ПолучитьПолеСтруктуры(Данные, КлючевоеПоле, ЗначениеПоУмолчанию) + +КонецФункции + +Функция ПолучитьОписаниеСервисаОблачнойПодписи() + + Результат = Новый Структура; + Результат.Вставить("Ссылка", Новый(СервисКриптографииDSSКлиентСервер.ПолучитьТипОблачнойПодписи())); + Результат.Вставить("Наименование", ""); + Результат.Вставить("АдресСервера", ""); + Результат.Вставить("АдресЛичногоКабинета", ""); + Результат.Вставить("СервисИдентификации", ""); + Результат.Вставить("СервисПодписи", ""); + Результат.Вставить("СервисПроверки", ""); + Результат.Вставить("ВнутреннийИдентификатор", ""); + Результат.Вставить("ИдентификаторЦИ", ""); + Результат.Вставить("ИдентификаторСЭП", ""); + Результат.Вставить("ШаблонПодтверждения", ""); + Результат.Вставить("ТаймАут", 120); + Результат.Вставить("ВерсияАПИ", ""); + Результат.Вставить("Комментарий", ""); + Результат.Вставить("Используется", Истина); + Результат.Вставить("ОграничениеАвторизации", ""); + Результат.Вставить("ПользовательШифрования", ""); + Результат.Вставить("ПарольПользовательШифрования", ""); + + Возврат Результат; + +КонецФункции + +Функция СпособыАвторизацииОблачнойПодписи() + + Результат = Новый Соответствие; + + Результат.Вставить(5, "Вторичный_СМС"); // подтверждение по SMS + Результат.Вставить(9, "Вторичный_МобильноеПриложение"); // подтверждение по myDSS + Результат.Вставить(8, "Вторичный_ЭлектроннаяПочта"); // подтверждение по электронной почте + Результат.Вставить(12, "Вторичный_AirKeyLite"); // подтверждение альтернативным мобильным приложением + Результат.Вставить(3, "Первичный_УчетныеДанные"); // логин и пароль + Результат.Вставить(-2, "Первичный_ДвухФакторная"); // аутентификация требует подтверждение + Результат.Вставить(-1, "Первичный_КодАвторизации"); // особый способ пользователя + Результат.Вставить(2, "Первичный_СертификатАвторизации"); + Результат.Вставить("ПарольМобильноеПриложение", "Первичный_ДвухФакторная"); // аутентификация требует подтверждение + + Возврат Результат; + +КонецФункции + +Функция ПолучитьАтрибутУзлаXML(УзелDOM, НазваниеАтрибута, ЗначениеПоУмолчанию = "") + + Результат = ЗначениеПоУмолчанию; + + Если УзелDOM = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + НайденныйАтрибут = УзелDOM.Атрибуты.ПолучитьИменованныйЭлемент(НазваниеАтрибута); + Если НайденныйАтрибут <> Неопределено Тогда + Результат = НайденныйАтрибут.ТекстовоеСодержимое; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьЭлементУзлаDOM(УзелВладелец, ИмяЭлемента, ТолькоОдин = Истина) + + Результат = Неопределено; + + НашлиУзлы = УзелВладелец.ПолучитьЭлементыПоИмени(ИмяЭлемента); + Если НЕ ТолькоОдин Тогда + Результат = НашлиУзлы; + ИначеЕсли НашлиУзлы.Количество() = 1 Тогда + Результат = НашлиУзлы[0]; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ЗначениеУзлаXML(ДокументDOM, НазваниеУзла, ЗначениеПоУмолчанию = "") + + НашлиЭлементы = ПолучитьЭлементУзлаDOM(ДокументDOM, НазваниеУзла, Ложь); + Если НашлиЭлементы.Количество() = 0 Тогда + Результат = ЗначениеПоУмолчанию; + Иначе + Результат = НашлиЭлементы[0].ТекстовоеСодержимое; + КонецЕсли; + + Если ТипЗнч(Результат) = Тип("Строка") + И ЗначениеЗаполнено(Результат) Тогда + Если ТипЗнч(ЗначениеПоУмолчанию) = Тип("Дата") Тогда + Результат = XMLЗначение(Тип("Дата"), Результат); + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПакетЗаявления(ЗаявлениеXML, ИдентификаторДокументооборота, ПодписьЗаявления = Неопределено) + + // Подготовка пакета заявления. + ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( + ПолучитьИмяВременногоФайла("package")); + + СоздатьКаталог(ВременныйКаталог); + + МассивФайлов = Новый Массив; + ИмяФайлаЗаявления = НовыйСжатыйУникальныйИдентификатор() + ".bin"; + ИмяФайлаОписания = "packageDescription.xml"; + ИмяФайлаПакета = ИдентификаторДокументооборота + ".zip"; + + ПодготовитьФайл(ЗаявлениеXML, ИмяФайлаЗаявления, ВременныйКаталог); + МассивФайлов.Добавить(ИмяФайлаЗаявления); + + Если ЗначениеЗаполнено(ПодписьЗаявления) Тогда + ИмяФайлаПодписи = НовыйСжатыйУникальныйИдентификатор() + ".bin"; + ПодготовитьФайл(ПодписьЗаявления, ИмяФайлаПодписи, ВременныйКаталог, "bin"); + МассивФайлов.Добавить(ИмяФайлаПодписи); + КонецЕсли; + + ОписаниеПакетаXML = ОписаниеПакетаXML(ИмяФайлаЗаявления, ИмяФайлаПодписи, ИдентификаторДокументооборота); + ПодготовитьФайл(ОписаниеПакетаXML, ИмяФайлаОписания, ВременныйКаталог); + МассивФайлов.Добавить(ИмяФайлаОписания); + + Результат = ПодготовитьФайлОтправки(МассивФайлов, ВременныйКаталог, ИмяФайлаПакета); + + УдалитьФайлы(ВременныйКаталог); + + Возврат Результат; + +КонецФункции + +Функция ПодготовитьФайлОтправки(МассивФайлов, ВременныйКаталог, ИмяФайлаПакета) + + ЗаписьАрхива = Новый ЗаписьZipФайла(ВременныйКаталог + ИмяФайлаПакета, , , , УровеньСжатияZIP.Максимальный); + + Для Каждого СтрокаМассива Из МассивФайлов Цикл + ЗаписьАрхива.Добавить(ВременныйКаталог + СтрокаМассива); + КонецЦикла; + ЗаписьАрхива.Записать(); + + Результат = Base64Строка(Новый ДвоичныеДанные(ВременныйКаталог + ИмяФайлаПакета)); + + Возврат Результат; + +КонецФункции + +Функция ОписаниеПакетаXML(ИмяФайлаЗаявления, ИмяФайлаПодписи, ИдентификаторДокументооборота) + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку("windows-1251"); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + + // АПК:1036-выкл - сторонний сервис + + ЗаписьXML.ЗаписатьНачалоЭлемента("пакет"); + ЗаписьXML.ЗаписатьАтрибут("версияФормата", "1С:1.0"); + + ЗаписьXML.ЗаписатьАтрибут("версПрог", "1.0"); // АПК:1297 Не локализуется (формат веб-сервиса). + ЗаписьXML.ЗаписатьАтрибут("типДокументооборота", "РегистрацияАбонентаЭДО"); + ЗаписьXML.ЗаписатьАтрибут("типТранзакции", "Регистрация"); + ЗаписьXML.ЗаписатьАтрибут("идентификаторДокументооборота", ИдентификаторДокументооборота); + + + ЗаписьXML.ЗаписатьНачалоЭлемента("отправитель"); + ЗаписьXML.ЗаписатьАтрибут("типСубъекта", "абонент"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("получатель"); + ЗаписьXML.ЗаписатьАтрибут("идентификаторСубъекта", "КалугаАстрал"); + ЗаписьXML.ЗаписатьАтрибут("типСубъекта", "спецоператор"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("документ"); + ЗаписьXML.ЗаписатьАтрибут("идентификаторДокумента", НовыйСжатыйУникальныйИдентификатор()); + ЗаписьXML.ЗаписатьАтрибут("типДокумента", "Заявление"); + ЗаписьXML.ЗаписатьАтрибут("типСодержимого", "xml"); + ЗаписьXML.ЗаписатьАтрибут("сжат", "false"); + ЗаписьXML.ЗаписатьАтрибут("зашифрован", "false"); + + ЗаписьXML.ЗаписатьНачалоЭлемента("содержимое"); + ЗаписьXML.ЗаписатьАтрибут("имяФайла", ИмяФайлаЗаявления); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента документ. + + Если ЗначениеЗаполнено(ИмяФайлаПодписи) Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента("подпись"); + ЗаписьXML.ЗаписатьАтрибут("имяФайла", ИмяФайлаПодписи); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + + // АПК:1036-вкл - сторонний сервис + + ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента пакет. + + СтрокаXML = ЗаписьXML.Закрыть(); + + Возврат СтрокаXML; + +КонецФункции + +Функция НовыйСжатыйУникальныйИдентификатор() + + Возврат НРег(СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "")); + +КонецФункции + +Функция ПодготовитьРезультатВызова(Результат, АдресРезультата, ВидОперации) + + Если АдресРезультата <> Неопределено Тогда + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + КонецЕсли; + + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ТекстОшибки = Результат; + Иначе + ТекстОшибки = СвойствоСтруктуры(Результат, "Ошибка", ""); + КонецЕсли; + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + СервисКриптографииDSSСлужебный.ПротоколОшибкиПриВызове(ТекстОшибки, ВидОперации, Неопределено); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Процедура ЗаписатьУзелXML(ЗаписьXML, ИмяУзла, ЗначениеУзла, НеВыгружатьПустые = Ложь) + + Если НЕ НеВыгружатьПустые ИЛИ НЕ ПустаяСтрока(ЗначениеУзла) Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяУзла); + ЗаписьXML.ЗаписатьТекст(Строка(ЗначениеУзла)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + +КонецПроцедуры + +Процедура ПодготовитьФайл(СодержимоеФайла, ИмяФайла, ВременныйКаталог, ТипФайла = "xml") + + Если ТипЗнч(СодержимоеФайла) = Тип("ДвоичныеДанные") Тогда + СодержимоеФайла.Записать(ВременныйКаталог + ИмяФайла); + + ИначеЕсли ТипФайла = "xml" Тогда + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.ОткрытьФайл(ВременныйКаталог + ИмяФайла, "windows-1251"); + ЗаписьXML.ЗаписатьБезОбработки(СодержимоеФайла); + ЗаписьXML.Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/Templates/ПодключениеУчетнойЗаписиОблачнойПодписи/Template.mxlx b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Templates/ПодключениеУчетнойЗаписиОблачнойПодписи/Template.mxlx new file mode 100644 index 000000000..da759c1f7 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/Templates/ПодключениеУчетнойЗаписиОблачнойПодписи/Template.mxlx @@ -0,0 +1,404 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 7 + + 0 + + 1 + + + + + b5da7fde-a9fe-40f0-b8a8-b289e81b32cc + 7 + + 0 + + 1 + + + + + 0 + + 2 + + 1 + + 3 + + + ru + Пароль + + + + + + + 4 + + + ru + [Пароль] + + + + + + + 5 + + + + + 5 + + + + + 5 + + + + + 5 + + + + + + 1 + + true + + + + 2 + + b5da7fde-a9fe-40f0-b8a8-b289e81b32cc + 6 + + 1 + + 3 + + + ru + Ключ мобильного +приложения myDSS + + + + + + + + 3 + + true + + + + 4 + + 7 + + 1 + + 8 + + + + + + 5 + + 2 + + 1 + + 9 + + + ru + Данные учетной записи облачной подписи для подключения к сервису и подтверждение операций. + + + + + + + + 6 + + 10 + true + + + + 7 + + 11 + true + + + + 8 + + 2 + + 1 + + 3 + + + ru + Сервер + + + + + + + 4 + + + ru + [Сервер] + + + + + + + 5 + + + + + 5 + + + + + 5 + + + + + 5 + + + + + + 9 + + 2 + + 1 + + 3 + + + ru + Логин + + + + + + + 4 + + + ru + [Логин] + + + + + + + 5 + + + + + 5 + + + + + 5 + + + + + 5 + + + + + + Picture + 1 + 12 + 2 + 15 + 2 + 543 + 3 + 96 + 6 + 102 + false + Proportionally + 1 + 1 + + true + 13 + 10 + 10 + + 0 + 2 + 4 + + + 2 + 1 + 5 + + + 5 + 1 + 5 + + + 8 + 2 + 4 + + + 9 + 2 + 4 + + + ВекторАутентификации + 1 + + + Заголовок + + Rows + 4 + 9 + -1 + -1 + + + + Ключ + + Rows + 2 + 2 + -1 + -1 + + + + Логин + + Rows + 0 + 0 + -1 + -1 + + + + Solid + + + Dotted + + + + + 30 + + + 0 + + + 0 + 0 + 72 + Left + Top + Wrap + + + 0 + 0 + 72 + Left + Top + Wrap + Template + + + 0 + 72 + + + 0 + 570 + + + 0 + 30 + + + 1 + Center + + + 1 + Center + Wrap + + + 0 + 42 + + + 0 + 24 + + + 1 + + + 72 + + + 0 + + + \ No newline at end of file diff --git a/SSL/src/DataProcessors/УправлениеПодключениемDSS/УправлениеПодключениемDSS.mdo b/SSL/src/DataProcessors/УправлениеПодключениемDSS/УправлениеПодключениемDSS.mdo new file mode 100644 index 000000000..f4d859971 --- /dev/null +++ b/SSL/src/DataProcessors/УправлениеПодключениемDSS/УправлениеПодключениемDSS.mdo @@ -0,0 +1,450 @@ + + + + + + + УправлениеПодключениемDSS + + ru + Управление подключением DSS + + true + DataProcessor.УправлениеПодключениемDSS.Form.ОсновнаяФорма + true + + + ru + + + + ВводПароля + + ru + Ввод пароля + + + + ru + + + PersonalComputer + MobileDevice + + + ВводПинКода + + ru + Ввод пин кода + + + + ru + + + PersonalComputer + MobileDevice + + + ВебАутентификация + + ru + Веб аутентификация + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборПрограммы + + ru + Выбор программы + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборСервисаИзОписания + + ru + Выбор сервиса из описания + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборТекущейУчетнойЗаписи + + ru + Выбор текущей учетной записи + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборУчетнойЗаписи + + ru + Выбор учетной записи + + + + ru + + + PersonalComputer + MobileDevice + + + ВыборЭкземпляровСервераDSS + + ru + Выбор экземпляров сервера DSS + + + + ru + + + PersonalComputer + MobileDevice + + + ВывестиИнформацию + + ru + Вывести информацию + + + + ru + + + PersonalComputer + MobileDevice + + + ЗаявлениеНаИзменениеРеквизитовПодключения + + ru + Заявление на изменение реквизитов подключения + + + + ru + + + PersonalComputer + MobileDevice + + + НовыйЗапросНаСертификат + + ru + Новый запрос на сертификат + + + + ru + + + PersonalComputer + MobileDevice + + + ОсновнаяФорма + + ru + Основная форма + + PersonalComputer + MobileDevice + + + ПодборУчетнойЗаписи + + ru + Подбор учетной записи + + + + ru + + + PersonalComputer + MobileDevice + + + ПодтверждениеОперацииВыборНавигационнойСсылки + + ru + Подтверждение операции выбор навигационной ссылки + + + + ru + + + PersonalComputer + MobileDevice + + + ПодтверждениеОперацииВыборСпособа + + ru + Подтверждение операции выбор способа + + + + ru + + + PersonalComputer + MobileDevice + + + ПодтверждениеОперацииКодПодтверждения + + ru + Подтверждение операции код подтверждения + + + + ru + + + PersonalComputer + MobileDevice + + + ПодтверждениеОперацииМобильноеПриложение + + ru + Подтверждение операции мобильное приложение + + + + ru + + + PersonalComputer + MobileDevice + + + ПодтверждениеОперацииОфлайн + + ru + Подтверждение операции офлайн + + + + ru + + + PersonalComputer + MobileDevice + + + ПодтверждениеОперацииОшибка + + ru + Подтверждение операции ошибка + + + + ru + + + PersonalComputer + MobileDevice + + + ПодтверждениеПользователя + + ru + Подтверждение пользователя + + PersonalComputer + MobileDevice + + + ПроверкаСервиса + + ru + Проверка сервиса + + + + ru + + + PersonalComputer + MobileDevice + + + РасширенныеНастройкиСервера + + ru + Расширенные настройки сервера + + + + ru + + + PersonalComputer + MobileDevice + + + СвойствоСертификата + + ru + Свойство сертификата + + + + ru + + + PersonalComputer + MobileDevice + + + СменаПинКода + + ru + Смена пин-кода + + + + ru + + + PersonalComputer + MobileDevice + + + СписокСертификатов + + ru + Список сертификатов + + + + ru + + + PersonalComputer + MobileDevice + + + СписокУчетныхЗаписей + + ru + Список учетных записей + + + + ru + + + PersonalComputer + MobileDevice + + + СписокЭкземпляровСервераDSS + + ru + Список экземпляров сервера DSS + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаУчетнойЗаписи + + ru + Форма учетной записи + + + + ru + + + PersonalComputer + MobileDevice + + + ФормаЭкземпляраСервераDSS + + ru + Форма экземпляра сервера DSS + + + + ru + + + PersonalComputer + MobileDevice + + + ПодключениеУчетнойЗаписиОблачнойПодписи + + ru + Подключение учетной записи облачной подписи + + + + СписокСертификатов + + ru + Список сертификатов + + NavigationPanelSeeAlso + Auto + + + СерверыОблачнойПодписи + + ru + Серверы облачной подписи + + NavigationPanelOrdinary + Auto + + + УчетныеЗаписиОблачнойПодписи + + ru + Учетные записи облачной подписи + + NavigationPanelOrdinary + Auto + + diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form index 22f0db99a..2314cf676 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/ОбновлениеНеПодходит/Form.form @@ -109,7 +109,7 @@ 1 <key>ru</key> - <value>Поставка предназначена для обновления следующих версий</value> + <value>Обновление для версий</value> true true @@ -119,6 +119,7 @@ ОбновлениеДляВерсий + None Add Change Copy diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form index 661444dd2..4ba81d8df 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Form.form @@ -3761,6 +3761,19 @@ true + + ЗагрузитьРасширения + 7 + + Boolean + + + true + + + true + + Назад diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Module.bsl index f657b4e40..b15976954 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Forms/Форма/Module.bsl @@ -49,7 +49,8 @@ // Проверяем каждый раз при открытии помощника. КонфигурацияИзменена = КонфигурацияИзменена(); - НуженФайлОбновления = ?(КонфигурацияИзменена, 0, 1); + ЗагрузитьРасширения = ЗагрузитьРасширенияИзменяющиеСтруктуруДанных(); + НуженФайлОбновления = ?(КонфигурацияИзменена ИЛИ ЗагрузитьРасширения, 0, 1); Если Параметры.ЗавершениеРаботыСистемы Тогда Элементы.ПереключательОбновленияФайл.Видимость = Ложь; @@ -137,7 +138,7 @@ ИмяСтраницы = Страницы.ФайлОбновления.Имя; Если ЭтоПодчиненныйУзелРИБ Тогда - Если КонфигурацияИзменена Тогда + Если КонфигурацияИзменена ИЛИ ЗагрузитьРасширения Тогда ПерейтиКВыборуРежимаОбновления(); Возврат; КонецЕсли; @@ -425,7 +426,7 @@ ДоступностьКнопкиНазад = Ложь; Если НуженФайлОбновления = 0 Тогда - Если КонфигурацияИзменена Тогда + Если КонфигурацияИзменена ИЛИ ЗагрузитьРасширения Тогда Элементы.СтраницыНадписиИзмененнойКонфигурации.ТекущаяСтраница = Элементы.ЕстьИзменения; Иначе Элементы.СтраницыНадписиИзмененнойКонфигурации.ТекущаяСтраница = Элементы.НетИзменений; @@ -551,6 +552,9 @@ ПараметрыОбновления.Вставить("НуженФайлОбновления", Булево(НуженФайлОбновления)); ПараметрыОбновления.Вставить("ФайлыИсправлений", ФайлыИсправлений); + ПараметрыОбновления.Вставить("КонфигурацияИзменена", КонфигурацияИзменена); + ПараметрыОбновления.Вставить("ЗагрузитьРасширения", ЗагрузитьРасширения); + ОбновлениеКонфигурацииКлиент.УстановитьОбновление(ЭтотОбъект, ПараметрыОбновления, ПараметрыАдминистрирования); КонецПроцедуры @@ -915,4 +919,21 @@ КонецПроцедуры +&НаСервере +Функция ЗагрузитьРасширенияИзменяющиеСтруктуруДанных() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + + МодульОбменДаннымиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСлужебный"); + Возврат МодульОбменДаннымиСлужебный.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных(); + + Иначе + + Возврат Ложь; + + КонецЕсли; + +КонецФункции + + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt index 9108ebdda..bccfe27de 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/ЗаставкаОбновленияКонфигурации/Template.txt @@ -148,7 +148,7 @@ var fileName = fileProperties.filePath ret = updateCfg(fileName) if (ret !== 0) { - log('Не удалось обновить по файлу, возможно конфигурация не находится на поддержке, попытка загрузки конфигурации.') + log('[СообщениеОтказОбновленияБазыИзФайла]') ret = loadCfg(fileName) } break @@ -180,10 +180,14 @@ if (finish) { return } + + document.getElementById('ProductNameText').innerHTML = '[НаименованиеПродукта]' + document.getElementById('copyrightText').innerHTML = '[Копирайт]' + // Если предыдущий шаг завершился неудачно... if (ret !== 0 && ret !== -1) { if (errStep === 0) { - log(format('Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.', ret), true) + log(format('[СообщениеЗаставкиОшибкаШага]', ret), true) if (UseRestore) { setProgress('[Шаг10Восстановление]') @@ -253,6 +257,14 @@ position: absolute; left: 10px; top: 240px;">   </div> + <div id="productNameText" style="font-size: 12pt; font-family: sans,sans-serif; color: #50525b; font-weight: bold; + position: absolute; left: 20px; top: 270px;"> +   + </div> + <div id="copyrightText" style="font-size: 8pt; font-family: sans,sans-serif; color: #9b9b9b; font-weight: bold; + position: absolute; left: 20px; top: 290px;"> +   + </div> </body> </html> diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/МакетФайлаОбновленияКонфигурации/Template.txt b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/МакетФайлаОбновленияКонфигурации/Template.txt index 4d15edf53..abb0ade3b 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/МакетФайлаОбновленияКонфигурации/Template.txt +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/МакетФайлаОбновленияКонфигурации/Template.txt @@ -37,8 +37,8 @@ var tempLogFileName = 'templog.txt' var errorFileName = 'error.txt' var taskNameScheduleService = [ИмяЗадачиПланировщикаЗадач] // Если указано, то задача, которой запущен скрипт. var runAppAdditionalParams = [ПараметрыЗапускаПредприятия] // Аргументы командной строки, которые следует добавить к запуску 1С:Предприятия в режиме клиента. -var updateConfiguration = true -var loadExtentions = true +var updateConfiguration = [ВыполнитьОбновлениеКонфигурации] +var loadExtentions = [ВыполнитьЗагрузкуРасширений] #КонецОбласти @@ -73,7 +73,7 @@ function runApp (sFilePath, sFileArgs, show, bWaitOnReturn) { sFileArgs = '' } var ret = 1 - log(format('Запускается: {0}; параметры: {1}; окно: {2}; ожидание: {3}', + log(format('[СообщениеНачалоЗапуска]', sFilePath, hidePass(sFileArgs), SWtoString(show), @@ -81,10 +81,10 @@ function runApp (sFilePath, sFileArgs, show, bWaitOnReturn) { try { ret = oShell.Run(format('"{0}" {1}', sFilePath, sFileArgs), show, bWaitOnReturn) } catch (e) { - log(format('Исключение в runApp: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеДеталиИсключения]', e.name, e.message), true) return 1 } - log(format('Код возврата: {0}', ret), ret !== 0) + log(format('[СообщениеРезультатЗапуска]', ret), ret !== 0) return ret } @@ -153,11 +153,11 @@ function appendLog () { // Инициализация function initialize () { - log(format('Файл скрипта: {0}', thisFileName)) - log(format('Количество файлов обновления: {0}', cfgFileNames.length)) + log(format('[СообщениеПутьКФайлуСкрипта]', thisFileName)) + log(format('[СообщениеСчетчикФайловОбновления]', cfgFileNames.length)) for (var i = 0; i < cfgFileNames.length; i++) { var fileInfo = GetRequired(cfgFileNames[i], null) - var required = fileInfo.requiredVersion ? '(Обязательная)' : ''; + var required = fileInfo.requiredVersion ? '([СообщениеВажность])' : ''; log(format('{0}. {1} {2}', i + 1, fileInfo.filePath, required)) } return 0 @@ -176,7 +176,7 @@ function finalize (success) { if (!success) { if (UseRestore && backupCreated) { - log('Восстановление ИБ из временного архива') + log('[СообщениеВосстановлениеБазы]') restoreDB() } allowConnections() // Разрешение подключений @@ -190,7 +190,7 @@ function finalize (success) { function deleteScheduleTask () { if (taskNameScheduleService !== '') { - log(format('Удаление задачи планировщика задач: "{0}"', taskNameScheduleService)) + log(format('[СообщениеУдалениеЗадачиПланировщика]', taskNameScheduleService)) try { var schedule = new ActiveXObject('Schedule.Service') schedule.Connect() @@ -198,7 +198,7 @@ function deleteScheduleTask () { var root = schedule.GetFolder('\\') root.DeleteTask(taskNameScheduleService, 0) } catch (ex) { - log(format('Ошибка при удалении задачи из планировщика задач: {0}', ex.message), true) + log(format('[СообщениеОтказУдаленияЗадачиПланировщика]', ex.message), true) } } } @@ -211,12 +211,12 @@ function createConnection () { return ComConnection } try { - log('Начат сеанс внешнего соединения с ИБ', false) + log('[СообщениеНачалоСеансаСоединенияСБазой]', false) var ComConnector = new ActiveXObject(comConnectorName) ComConnection = ComConnector.Connect(connectionString) return ComConnection } catch (e) { - log(format('Исключение в createConnection: {0}, {1}', e.name, e.message), true) + log(format('[СообщениеОтказСоединенияСБазой]', e.name, e.message), true) return null } } @@ -229,17 +229,17 @@ function doSetResult (success) { } var res = 0 try { - log(format('ОбновлениеКонфигурации.ЗавершитьОбновление({0}, {1}, {2})', success, emailAddress, adminName)) + log(format('[СообщениеВызовЗавершитьОбновление]', success, emailAddress, adminName)) connection.ОбновлениеКонфигурации.ЗавершитьОбновление(success, emailAddress, adminName) } catch (e) { - log(format('Исключение при вызове ОбновлениеКонфигурации.ЗавершитьОбновление: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказПриВызовеЗавершитьОбновление]', e.name, e.message), true) res = 2 } } if (success) { - log('ОбновлениеВыполненоУспешно (обновление выполнено)', false) + log('[СообщениеРезультатОбновленияБазы]', false) } else { - log('ОбновлениеНеВыполнено (обновление не выполнено)', true) + log('[СообщениеОтказОбновленияБазы]', true) } return res } @@ -257,17 +257,17 @@ function writeEventLog (success) { var eventKind = success ? EVENT_SUCCESS : EVENT_CRITICAL var message if (success) { - message = 'Обновление информационной базы завершилась успешно.'; + message = '[СообщениеРезультатОбновленияБазы]'; } else { - message = 'Ошибка при обновлении информационной базы.'; + message = '[СообщениеОтказОбновленияБазы]'; } - message += format(' Параметры информационной базы: {0}.', infoBasePath) + message += format(' [СообщениеПараметрыБазы]', infoBasePath) if (!success) { - message += ' Протокол обновления сохранен в журнал регистрации.'; + message += ' [СообщениеОбновлениеЛогирование1С]'; } oShell.LogEvent(eventKind, message) } catch (e) { - log(format('Исключение в writeEventLog: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказЛогирования]', e.name, e.message), true) } } @@ -277,40 +277,22 @@ function backupDB () { return 0 } var ret = 0 - - log( - format('\r\n\ - Выполняется копирование из:\r\n\ - {0}\r\n\ - в:\r\n\ - {1}', - BaseFileName, - backupFileName - ) - ) + log(format('[СообщениеКопированиеБазы]', BaseFileName, backupFileName)) try { if (!oFileSystemObject.FileExists(BaseFileName)) { - throw new Error(format('Файл базы данных 1Cv8.1CD не существует по пути: {0}', BaseFileName)) + throw new Error(format('[СообщениеФайлБазыНеСуществует]', BaseFileName)) } if (!oFileSystemObject.FolderExists(oFileSystemObject.GetParentFolderName(backupFileName))) { - throw new Error(format('Папки для сохранения резервной копии не существует: {0}', backupFileName)) + throw new Error(format('[СообщениеКаталогРезервнойКопииБазыНеСуществует]', backupFileName)) } if (oFileSystemObject.FileExists(backupFileName)) { var ThisFile = oFileSystemObject.GetFile(BaseFileName) throw new Error( - format('\r\n\ - Файл резервной копии уже существует: {0}\r\n\ - Создан: {1}\r\n\ - Последнее обращение: {2}\r\n\ - Последнее изменение: {3}\r\n\ - Размер: {4}\r\n\ - Тип: {5}\r\n\ - Атрибуты:\r\n\ - {6}', + format('[СообщениеПараметрыФайлаРезервнойКопии]', backupFileName, ThisFile.DateCreated, ThisFile.DateLastAccessed, @@ -326,9 +308,7 @@ function backupDB () { var drive = oFileSystemObject.GetDrive(oFileSystemObject.GetDriveName(backupFileName)) } catch (ex2) { throw new Error( - format('\r\n\ - Диск не найден по пути {0}\r\n\ - Исключение: {1}, {2}.', + format('[СообщениеДискНеСуществует]', backupFileName, ex2.name, ex2.message @@ -337,7 +317,7 @@ function backupDB () { } if (!drive.IsReady) { - throw new Error(format('Диск не доступен по пути {0}', backupFileName)) + throw new Error(format('[СообщениеДискНедоступен]', backupFileName)) } var fileDB = oFileSystemObject.GetFile(BaseFileName) @@ -346,13 +326,7 @@ function backupDB () { if (drive.FreeSpace < requiredFreeSize) { throw new Error( - format('\r\n\ - Недостаточно свободного места для создания резервной копии.\r\n\ - Освободите место или укажите папку на другом диске.\r\n\ - Требуется: {0} Mb\r\n\ - Доступно на диске {1}: {2} Mb\r\n\ - Размер файла 1Cv8.1CD: {3} Mb\r\n\ - Тип диска: {4}', + format('[СообщениеДисковогоПространстваНедостаточно]', requiredFreeSize / 1024 / 1024, drive.DriveLetter, drive.FreeSpace / 1024 / 1024, @@ -364,13 +338,13 @@ function backupDB () { oFileSystemObject.CopyFile(BaseFileName, backupFileName, true) - log(format('Резервная копия базы создана', ret), ret !== 0) + log(format('[СообщениеРезультатСозданияРезервнойКопииБазы]', ret), ret !== 0) } catch (e) { CollectGarbage() log( format( - 'Исключение при создании резервной копии базы: {0}\r\n\ {1}.', + '[СообщениеОтказСозданияРезервнойКопииБазыПодробно]', e.name, e.message ), @@ -443,9 +417,9 @@ function restoreDB () { var ret = 0 try { oFileSystemObject.CopyFile(backupFileName, BaseFileName, true) - log(format('База данных восстановлена из резервной копии', ret), ret !== 0) + log(format('[СообщениеРезультатВосстановленияБазы]', ret), ret !== 0) } catch (e) { - log(format('Исключение при восстановлении базы из резервной копии', e.name, e.message), true) + log(format('[СообщениеОтказВосстановленияБазыПодробно]', e.name, e.message), true) ret = -1 } return ret @@ -458,7 +432,7 @@ function doAllowConnections () { return (useComConnector ? 1 : 0) } try { - log('СоединенияИБ.РазрешитьРаботуПользователей()') + log('[СообщениеВызовРазрешитьРаботуПользователей]') connection.СоединенияИБ.РазрешитьРаботуПользователей() connectionsDenied = false connection = null @@ -466,7 +440,7 @@ function doAllowConnections () { } catch (e) { connection = null CollectGarbage() - log(format('Исключение при вызове СоединенияИБ.РазрешитьРаботуПользователей: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказВызоваРазрешитьРаботуПользователей]', e.name, e.message), true) return 3 } } @@ -485,10 +459,10 @@ function doExecuteUpdate (lastVersion) { if (useComConnector && lastVersion) { try { if (addDeletePatches() != 0) { - throw new Error('Не удалось обновить исправления конфигурации. Подробности см. в предыдущей записи.') + throw new Error('[СообщениеОтказОбновленияИсправлений]') } } catch (e) { - log(format('Исключение при вызове ОбновлениеКонфигурацииВызовСервера.ОбновитьИсправленияИзСкрипта: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказВызоваОбновитьИсправленияИзСкрипта]', e.name, e.message), true) return 2 } } @@ -498,14 +472,14 @@ function doExecuteUpdate (lastVersion) { return 1 } try { - log(format('ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы({0})', !lastVersion)) + log(format('[СообщениеВызовВыполнитьОбновлениеИнформационнойБазы]', !lastVersion)) connection.ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(!lastVersion) connection = null CollectGarbage() } catch (e) { connection = null CollectGarbage() - log(format('Исключение при вызове ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказВызоваВыполнитьОбновлениеИнформационнойБазы]', e.name, e.message), true) return 2 } return 0 @@ -519,7 +493,7 @@ function doExecuteUpdate (lastVersion) { SW_SHOW, true) if (result === 0 && oFileSystemObject.FileExists(errorFileName)) { - log('При выполнении обновления информационной базы произошла ошибка:', true) + log('[СообщениеОтказОбновленияБазыОбщее]', true) appendLog() result = 1 } @@ -546,7 +520,7 @@ function doDisconnectAndBlockUsersHTA (connection) { case 0: { log('СоединенияИБ.УстановитьБлокировкуСоединений()') - connection.СоединенияИБ.УстановитьБлокировкуСоединений('в связи с необходимостью обновления конфигурации.', unlockCode) + connection.СоединенияИБ.УстановитьБлокировкуСоединений('[СообщениеБлокировкаБазы]', unlockCode) disconnectionInterval = connection.СоединенияИБ.ПараметрыБлокировкиСеансов().ИнтервалОжиданияЗавершенияРаботыПользователей * 1000 disconnectionStartDateTime = connection.СоединенияИБ.ПараметрыБлокировкиСеансов().Начало if (connection.ЗначениеЗаполнено(disconnectionStartDateTime)) { @@ -574,7 +548,7 @@ function doDisconnectAndBlockUsersHTA (connection) { case 2: { if (!connection.СоединенияИБ.УстановленаБлокировкаСоединений()) { - log('Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.', true) + log('[СообщениеОтказЗавершенияРаботыПользователей]', true) return 3 } @@ -597,7 +571,7 @@ function doDisconnectAndBlockUsersHTA (connection) { } } catch (e) { CollectGarbage() - log(format('Исключение при вызове doDisconnectAndBlockUsersHTA: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтменаБлокировкиРаботыПользователей]', e.name, e.message), true) result = 2 } return result @@ -627,7 +601,7 @@ function disconnectAndBlockUsersHTA () { connection = null ComConnection = null CollectGarbage() - log('Завершен сеанс внешнего соединения с ИБ', false) + log('[СообщениеКонецСеансаСоединенияСБазой]', false) } } } else { @@ -645,8 +619,8 @@ function doDisconnectAndBlockUsers () { return (useComConnector ? 1 : 0) } try { - log('Установка блокировки сеансов в связи с необходимостью обновления конфигурации') - connection.СоединенияИБ.УстановитьБлокировкуСоединений('в связи с необходимостью обновления конфигурации.', unlockCode) + log('[СообщениеБлокировкаРаботыПользователейЛогирование]') + connection.СоединенияИБ.УстановитьБлокировкуСоединений('[СообщениеБлокировкаРаботыПользователей]', unlockCode) var interval = connection.СоединенияИБ.ПараметрыБлокировкиСеансов().ИнтервалОжиданияЗавершенияРаботыПользователей * 1000 @@ -659,7 +633,7 @@ function doDisconnectAndBlockUsers () { break } connectionsNum = connection.СоединенияИБ.КоличествоСеансовИнформационнойБазы(false) - log(format('Количество сеансов информационной базы: {0}', connectionsNum)) + log(format('[СообщениеСчетчикСеансовБазы]', connectionsNum)) if (connectionsNum <= 1) { break } @@ -669,9 +643,9 @@ function doDisconnectAndBlockUsers () { } var locked = connection.ПолучитьБлокировкуУстановкиСоединений().Установлена - log(format('Блокировка начала сеансов установлена: {0}', locked)) + log(format('[СообщениеРезультатБлокировкиСеансов]', locked)) if (!connection.ПолучитьБлокировкуУстановкиСоединений().Установлена) { - log('Попытка завершения работы пользователей завершилась безуспешно: отменена блокировка ИБ.', true) + log('[СообщениеОтказЗавершенияРаботыПользователей]', true) return 3 } @@ -679,7 +653,7 @@ function doDisconnectAndBlockUsers () { // если этого не произошло, пробуем принудительно прервать соединения. doDisconnectConnections(connection) connectionsNum = connection.СоединенияИБ.КоличествоСеансовИнформационнойБазы(false); - log(format('Количество сеансов информационной базы: {0}', connectionsNum)) + log(format('[СообщениеСчетчикСеансовБазы]', connectionsNum)) if (connectionsNum > 1) { connection.СоединенияИБ.РазрешитьРаботуПользователей() var message = connection.СоединенияИБ.СообщениеОНеотключенныхСеансах() @@ -690,7 +664,7 @@ function doDisconnectAndBlockUsers () { CollectGarbage() log( format( - 'Исключение при вызове doDisconnectAndBlockUsers: {0}, {1}.', + '[СообщениеОтменаБлокировкиРаботыПользователей]', e.name, e.message), true) @@ -714,7 +688,7 @@ function doDisconnectConnections (connection) { if (connectionsNum <= 1) { break } - log(format('Количество зависших сеансов информационной базы: {0}, попытка № {1}', connectionsNum, retry)) + log(format('[СообщениеСчетчикЗависшихСеансовБазы]', connectionsNum, retry)) WScript.Sleep(15 * 1000) // Ждем 15 секунд до следующей проверки. retry = retry - 1 } @@ -821,7 +795,7 @@ function doDeferredHandlers () { } try { - log('ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас())') + log('[СообщениеВызовВыполнитьОтложенноеОбновлениеСейчас]') connection.ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас() connection = null CollectGarbage() @@ -830,7 +804,7 @@ function doDeferredHandlers () { CollectGarbage() log( format( - 'Исключение при вызове ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас: {0}, {1}.', + '[СообщениеОтказВызоваВыполнитьОтложенноеОбновлениеСейчас]', e.name, e.message), true) @@ -928,12 +902,12 @@ function DeletePatches() { appendLog() } catch (e) { - log(format('Исключение при вызове ОбновлениеКонфигурацииВызовСервера.УдалитьИсправленияИзСкрипта: {0}, {1}.', e.name, e.message), true) + log(format('[СообщениеОтказВызоваУдалитьИсправленияИзСкрипта]', e.name, e.message), true) result = 2; } if (result != 0) { - log('Не удалось удалить исправления конфигурации. Подробности см. в предыдущей записи.') + log('[СообщениеОтказУдаленияИсправлений]') } return result @@ -965,12 +939,12 @@ function doExecuteLoadExt() { true) if (result === 0 && oFileSystemObject.FileExists(errorFileName)) { - log('При выполнении обновления информационной базы произошла ошибка:', true) + log('[СообщениеОтказОбновленияБазыОбщее]', true) appendLog() result = 1 } - return result + return result } if (oHTA != null) { @@ -994,7 +968,7 @@ var oFileSystemObject = new ActiveXObject('Scripting.FileSystemObject') clearLogFile() appendLog() -log(format('Используется COM соединение: {0}', useComConnector)) +log(format('[СообщениеПараметрыCOMСоединителя]', useComConnector)) if (useComConnector) { registerCOM() diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt index 400bfa008..53ba027f6 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/НеинтерактивноеОбновлениеКонфигурации/Template.txt @@ -36,7 +36,7 @@ function checkResult (ret) { if (ret === 0) { return } - log(format('Завершение с ошибкой. Код ошибки: {0}. Подробности см. в предыдущей записи.', ret), true) + log(format('[СообщениеЗаставкиОшибкаШага]', ret), true) finalize() ClearTempFiles() @@ -56,34 +56,34 @@ function ClearTempFiles () { } catch (e) { } } -setProgress('Инициализация') +setProgress('[СообщениеИнициализация]') var ret = initialize() checkResult(ret) -setProgress('Завершение работы пользователей') +setProgress('[СообщениеЗавершениеРаботыПользователей]') ret = disconnectAndBlockUsers() checkResult(ret) if (createBackup) { - setProgress('Создание резервной копии информационной базы') + setProgress('[СообщениеСозданиеРезервнойКопииБазы]') ret = backupDB() checkResult(ret) } if (executeDeferredHandlers) { - setProgress('Выполнение отложенных обработчиков обновления') + setProgress('[СообщениеВыполнениеОтложенныхОбработчиковОбновления]') ret = runDeferredHandlers() checkResult(ret) } if (cfgFileNames.length === 0) { if (updateConfiguration){ - setProgress('Обновление конфигурации информационной базы') + setProgress('[СообщениеОбновлениеКонфигурации]') ret = updateDbCfg() checkResult(ret) } if (loadExtentions){ - setProgress('Обновление расширений информационной базы') + setProgress('[СообщениеЗагрузкаРасширений]') ret = executeLoadExt() checkResult(ret) } @@ -91,7 +91,7 @@ if (cfgFileNames.length === 0) { for (var cfgFileIndex = 0; cfgFileIndex < cfgFileNames.length; cfgFileIndex++) { var fileProperties = GetRequired(cfgFileNames[cfgFileIndex]) - setProgress(format('Загрузка файла обновления в основную базу ({0}/{1})', cfgFileIndex + 1, cfgFileNames.length)) + setProgress(format('[СообщениеЗагрузкаФайлаОбновлений]', cfgFileIndex + 1, cfgFileNames.length)) ret = updateCfg(fileProperties.filePath) // Если не удалось загрузить файл, возможно конфигурация не находится на поддержке. if (ret !== 0) { @@ -99,22 +99,22 @@ if (cfgFileNames.length === 0) { } checkResult(ret) - setProgress(format('Обновление конфигурации информационной базы ({0}/{1})', cfgFileIndex + 1, cfgFileNames.length)) + setProgress(format('[СообщениеПараметрыОбновленияКонфигурации]', cfgFileIndex + 1, cfgFileNames.length)) ret = updateDbCfg() checkResult(ret) if (fileProperties.requiredVersion || (cfgFileIndex + 1 === cfgFileNames.length)) { - setProgress(format('Выполнение обработчиков обновления ({0}/{1})', cfgFileIndex + 1, cfgFileNames.length)) + setProgress(format('[СообщениеВыполнениеОбработчиковОбновления]', cfgFileIndex + 1, cfgFileNames.length)) ret = executeUpdate(cfgFileIndex + 1 === cfgFileNames.length) checkResult(ret) } } } -setProgress('Разрешение подключений новых соединений') +setProgress('[СообщениеРазрешениеПодключений]') ret = allowConnections() checkResult(ret) -setProgress('Завершение') +setProgress('[СообщениеЗавершениеОбновления]') finalize(true) ClearTempFiles() diff --git a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/СкриптУдаленияПатчей/Template.txt b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/СкриптУдаленияПатчей/Template.txt index 07656c5de..fdba42c17 100644 --- a/SSL/src/DataProcessors/УстановкаОбновлений/Templates/СкриптУдаленияПатчей/Template.txt +++ b/SSL/src/DataProcessors/УстановкаОбновлений/Templates/СкриптУдаленияПатчей/Template.txt @@ -26,7 +26,7 @@ var outFileName var COMConnector var connection -var mainEvent = 'Удаление исправлений (патчей)' +var mainEvent = '[СообщениеОсновноеСобытие]' try { @@ -42,7 +42,7 @@ try { } catch (ex) { if (outf != null) { - outf.WriteLine(mainEvent + ": Ошибка инициализации переменных: " + ex.message) + outf.WriteLine(mainEvent + "[СообщениеОтказИнициализации]" + ex.message) } WScript.Quit(1) @@ -51,14 +51,14 @@ try { try { if (outf != null) { - outf.WriteLine(mainEvent + ": Создание объекта COM-соединителя...") + outf.WriteLine(mainEvent + "[СообщениеСозданиеОбъектаCOMСоединителя]") } COMConnector = new ActiveXObject(COMConnectorName) } catch (ex) { if (outf != null) { - outf.WriteLine(mainEvent + ": Ошибка создания объекта COM-соединителя: " + ex.message) + outf.WriteLine(mainEvent + "[СообщениеОтказСозданияОбъектаCOMСоединителя]" + ex.message) } WScript.Quit(1) @@ -67,14 +67,14 @@ try { try { if (outf != null) { - outf.WriteLine(mainEvent + ": Установка соединения с " + ConnectionString + "...") + outf.WriteLine(mainEvent + "[СообщениеУстановкаСоединенияСБазой]" + ConnectionString + "...") } connection = COMConnector.Connect(ConnectionString) } catch (ex) { if (outf != null) { - outf.WriteLine(mainEvent + ": Ошибка установки соединения с " + ConnectionString + ": " + ex.message) + outf.WriteLine(mainEvent + "[СообщениеОтказСоединенияСБазойОбщее]" + ConnectionString + ": " + ex.message) } WScript.Quit(1) @@ -85,14 +85,14 @@ try { if (Action == 'RemoveAll') { if (outf != null) { - outf.WriteLine(mainEvent + ": Вызов ОбновлениеКонфигурацииВызовСервера.УдалитьИсправленияИзСкрипта()...") + outf.WriteLine(mainEvent + "[СообщениеВызовУдалитьИсправленияИзСкрипта]") } connection.ОбновлениеКонфигурацииВызовСервера.УдалитьИсправленияИзСкрипта(); } else { if (outf != null) { - outf.WriteLine(mainEvent + ": Вызов ОбновлениеКонфигурацииВызовСервера.ОбновитьИсправленияИзСкрипта()...") + outf.WriteLine(mainEvent + "[СообщениеВызовОбновитьИсправленияИзСкрипта]") } connection.ОбновлениеКонфигурацииВызовСервера.ОбновитьИсправленияИзСкрипта(fixFileNames, removeFixNames) @@ -101,7 +101,7 @@ try { } catch (ex) { if (outf != null) { - outf.WriteLine(mainEvent + ": Ошибка БСП: " + ex.message) + outf.WriteLine(mainEvent + "[СообщениеОшибкаБСП]" + ex.message) } WScript.Quit(1) diff --git a/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступа/ВладелецЗначенийКлючейДоступа.mdo b/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступа/ВладелецЗначенийКлючейДоступа.mdo index 411f2013d..6f6e70a58 100644 --- a/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступа/ВладелецЗначенийКлючейДоступа.mdo +++ b/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступа/ВладелецЗначенийКлючейДоступа.mdo @@ -32,6 +32,7 @@ <types>CatalogRef.Файлы</types> <types>CatalogRef.РассылкиОтчетов</types> <types>ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения</types> + <types>CatalogRef.УчетныеЗаписиDSS</types> <types>CatalogRef.ШаблоныСообщений</types> <types>CatalogRef.ДополнительныеОтчетыИОбработки</types> <types>CatalogRef.СообщениеSMSПрисоединенныеФайлы</types> diff --git a/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступаОбъект/ВладелецЗначенийКлючейДоступаОбъект.mdo b/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступаОбъект/ВладелецЗначенийКлючейДоступаОбъект.mdo index 50517c755..cefa6ed7d 100644 --- a/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступаОбъект/ВладелецЗначенийКлючейДоступаОбъект.mdo +++ b/SSL/src/DefinedTypes/ВладелецЗначенийКлючейДоступаОбъект/ВладелецЗначенийКлючейДоступаОбъект.mdo @@ -33,6 +33,7 @@ <types>CatalogObject.Файлы</types> <types>CatalogObject.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы</types> <types>CatalogObject.ЗапланированноеВзаимодействиеПрисоединенныеФайлы</types> + <types>CatalogObject.УчетныеЗаписиDSS</types> <types>CatalogObject.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы</types> <types>CatalogObject.ВариантыОтчетов</types> <types>TaskObject.ЗадачаИсполнителя</types> diff --git a/SSL/src/DefinedTypes/ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент/ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент.mdo b/SSL/src/DefinedTypes/ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент/ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент.mdo new file mode 100644 index 000000000..14d5977e0 --- /dev/null +++ b/SSL/src/DefinedTypes/ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент/ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент.mdo @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:DefinedType xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="93848cf6-7a87-42c7-b685-0bc418a2037c"> + <producedTypes> + <containerType typeId="57f6ce9c-0a60-4e28-87b4-ae444c3415e1" valueTypeId="da4409d3-d726-42dc-ba9a-e48f816b2420"/> + </producedTypes> + <name>ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент</name> + <synonym> + <key>ru</key> + <value>Владелец с ограничением по наборам значений доступа документ</value> + </synonym> + <type> + <types>DocumentObject.Встреча</types> + <types>DocumentObject.ЭлектронноеПисьмоВходящее</types> + <types>DocumentObject.ЗапланированноеВзаимодействие</types> + <types>DocumentObject.СообщениеSMS</types> + <types>DocumentObject.ТелефонныйЗвонок</types> + <types>DocumentObject.ЭлектронноеПисьмоИсходящее</types> + </type> +</mdclass:DefinedType> diff --git a/SSL/src/DefinedTypes/ПрограммаЭлектроннойПодписи/ПрограммаЭлектроннойПодписи.mdo b/SSL/src/DefinedTypes/ПрограммаЭлектроннойПодписи/ПрограммаЭлектроннойПодписи.mdo new file mode 100644 index 000000000..621a11280 --- /dev/null +++ b/SSL/src/DefinedTypes/ПрограммаЭлектроннойПодписи/ПрограммаЭлектроннойПодписи.mdo @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:DefinedType xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="20082776-ce24-41c5-ae11-6fa9bc54db59"> + <producedTypes> + <containerType typeId="33992399-f8ee-4ad7-b009-d4816d159868" valueTypeId="08b8ea82-4677-41fd-bbf0-3ef7aec0b001"/> + </producedTypes> + <name>ПрограммаЭлектроннойПодписи</name> + <synonym> + <key>ru</key> + <value>Программа электронной подписи</value> + </synonym> + <type> + <types>CatalogRef.УчетныеЗаписиDSS</types> + <types>CatalogRef.ПрограммыЭлектроннойПодписиИШифрования</types> + </type> +</mdclass:DefinedType> diff --git a/SSL/src/DefinedTypes/Сотрудник/Сотрудник.mdo b/SSL/src/DefinedTypes/Сотрудник/Сотрудник.mdo new file mode 100644 index 000000000..feacd319a --- /dev/null +++ b/SSL/src/DefinedTypes/Сотрудник/Сотрудник.mdo @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:DefinedType xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c61e4c12-178d-47aa-a070-333fe5450168"> + <producedTypes> + <containerType typeId="891e4da0-da0a-44cd-91b5-dec22577e374" valueTypeId="a5ec03e4-6677-40e3-9608-0cb27f2173af"/> + </producedTypes> + <name>Сотрудник</name> + <synonym> + <key>ru</key> + <value>Сотрудник</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>10</length> + </stringQualifiers> + </type> +</mdclass:DefinedType> diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form index 7d4c771e0..e4270629c 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Form.form @@ -8863,7 +8863,7 @@ <id>15</id> <toolTip> <key>ru</key> - <value>Установить вариант навигации по закладкам</value> + <value>Установить вариант навигации по папкам</value> </toolTip> <use> <common>true</common> diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl index 2c1bbae0f..6b2d21b39 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl @@ -517,8 +517,9 @@ Возврат; КонецЕсли; - ТекстВопроса = НСтр("ru = 'Удалить папку ""'") + Строка(ТекущиеДанные.Значение) - + НСтр("ru = '"" и переместить все ее содержимое в папку ""Удаленные""'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Удалить папку ""%1"" и переместить все ее содержимое в папку ""Удаленные""?'"), + Строка(ТекущиеДанные.Значение)); ДополнительныеПараметры = Новый Структура("ТекущиеДанные", ТекущиеДанные); ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОУдаленииПапкиПослеЗавершения", ЭтотОбъект, ДополнительныеПараметры); @@ -2845,6 +2846,7 @@ Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); Запрос.УстановитьПараметр("РольПолныеПравДоступна", Пользователи.ЭтоПолноправныйПользователь()); + Результат = Запрос.Выполнить(); Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); СтрокиПервыйУровень = Папки.ПолучитьЭлементы(); @@ -2928,11 +2930,13 @@ МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОтборВзаимодействия, КомпоновщикНастроек.ПолучитьНастройки(),,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); - Если МакетКомпоновкиДанных.ЗначенияПараметров.Количество() = 0 Тогда + ЗначенияПараметровМакета = МакетКомпоновкиДанных.ЗначенияПараметров; // ЗначенияПараметровМакетаКомпоновкиДанных + + Если ЗначенияПараметровМакета.Количество() = 0 Тогда Возврат ""; - ИначеЕсли МакетКомпоновкиДанных.ЗначенияПараметров.Количество() = 2 - И (НЕ ЗначениеЗаполнено(МакетКомпоновкиДанных.ЗначенияПараметров.ДатаНачала.Значение)) - И (НЕ ЗначениеЗаполнено(МакетКомпоновкиДанных.ЗначенияПараметров.ДатаОкончания.Значение)) Тогда + ИначеЕсли ЗначенияПараметровМакета.Количество() = 2 + И (НЕ ЗначениеЗаполнено(ЗначенияПараметровМакета.ДатаНачала.Значение)) + И (НЕ ЗначениеЗаполнено(ЗначенияПараметровМакета.ДатаОкончания.Значение)) Тогда Возврат ""; КонецЕсли; @@ -3806,9 +3810,8 @@ ТекстОшибки = НайтиВзаимодействияПолнотекстовыйПоиск(КоличествоЭлементовНайдено); Если ТекстОшибки = Неопределено Тогда РасширенныйПоиск = Истина; - ТекстОповещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Найдено %1 %2.'"), - ?(ТолькоПочта,НСтр("ru = 'писем'"), НСтр("ru = 'взаимодействий'")) + ": ", - Строка(КоличествоЭлементовНайдено)); + ТекстОповещения = ?(ТолькоПочта, НСтр("ru = 'Найдено %1 писем.'"), НСтр("ru = 'Найдено %1 взаимодействий.'")); + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОповещения, Строка(КоличествоЭлементовНайдено)); ПоказатьОповещениеПользователя(ТекстОповещения); ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные <> Неопределено Тогда @@ -3954,20 +3957,22 @@ &НаКлиенте Процедура ЗаполнитьОписаниеНайденоПолнотекстовымПоиском(Взаимодействие) - СтрокаОписания = ОписанияНайденоПолнотекстовымПоиском.НайтиСтроки(Новый Структура("Взаимодействие",Взаимодействие)); + СтрокаОписания = ОписанияНайденоПолнотекстовымПоиском.НайтиСтроки(Новый Структура("Взаимодействие", Взаимодействие)); Если СтрокаОписания.Количество() = 0 Тогда ОписаниеНайденоПолнотекстовымПоиском = ""; - Иначе - СтрокаТаблицыСОписанием = СтрокаОписания[0]; - Если ВзаимодействияКлиентСервер.ЯвляетсяПрисоединеннымФайломВзаимодействий(СтрокаТаблицыСОписанием.Значение) Тогда - ТекстНайдено = НСтр("ru = 'Найдено в присоединенном файле'"); - Иначе - ТекстНайдено = НСтр("ru = 'Найдено в'"); - КонецЕсли; - - ОписаниеНайденоПолнотекстовымПоиском = ТекстНайдено + " - " + СтрокаТаблицыСОписанием.Описание; + Возврат; КонецЕсли; + СтрокаТаблицыСОписанием = СтрокаОписания[0]; + Если ВзаимодействияКлиентСервер.ЯвляетсяПрисоединеннымФайломВзаимодействий(СтрокаТаблицыСОписанием.Значение) Тогда + ТекстНайдено = НСтр("ru = 'Найдено в присоединенном файле %1.'"); + Иначе + ТекстНайдено = НСтр("ru = 'Найдено в %1.'"); + КонецЕсли; + + ОписаниеНайденоПолнотекстовымПоиском = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНайдено, + СтрокаТаблицыСОписанием.Описание); + КонецПроцедуры /////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form index 97ef62af8..5b72002d4 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Form.form @@ -3617,6 +3617,14 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <parameters> + <name>ДополнительныеПараметры</name> + <valueType/> + </parameters> + <parameters> + <name>Отбор</name> + <valueType/> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Module.bsl b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Module.bsl index 4235a8d24..873f788e8 100644 --- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Module.bsl +++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Module.bsl @@ -31,13 +31,13 @@ - Если Параметры.Свойство("Отбор") Тогда + Если ТипЗнч(Параметры.Отбор) = Тип("Структура") Тогда ШаблонЗаголовка = НСтр("ru = 'Взаимодействия по %1'"); Если Параметры.Отбор.Свойство("Предмет") Тогда - Если Параметры.Свойство("ДополнительныеПараметры") + Если ТипЗнч(Параметры.ДополнительныеПараметры) = Тип("Структура") И Параметры.ДополнительныеПараметры.Свойство("ТипВзаимодействия") Тогда Если Параметры.ДополнительныеПараметры.ТипВзаимодействия = "Взаимодействие" Тогда diff --git a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form index 5e084c28b..5ab760630 100644 --- a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Form.form @@ -11,10 +11,6 @@ <userVisible> <common>true</common> </userVisible> - <title> - <key>ru</key> - <value>Форма группа команды формы</value> - ФормаГруппаКомандыФормыРасширеннаяПодсказка 191 @@ -263,10 +259,6 @@ true - - <key>ru</key> - <value>Форма глобальные команды</value> - ФормаГлобальныеКомандыРасширеннаяПодсказка 187 @@ -324,10 +316,6 @@ true - - <key>ru</key> - <value>Подменю анкетирование</value> - ru Подменю для размещения подключаемых команд diff --git a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl index 9c1a7bafd..b5a9d7269 100644 --- a/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl +++ b/SSL/src/Documents/Анкета/Forms/ФормаДокумента/Module.bsl @@ -321,7 +321,7 @@ // Анализирует тип вопроса и вызывает соответствующие процедуры для установки значений реквизита. // // Параметры: -// ВопросШаблона - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// ВопросШаблона - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. @@ -349,7 +349,7 @@ // Устанавливает значения реквизитов простого вопроса. // // Параметры: -// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. @@ -406,7 +406,7 @@ // Анализирует тип табличного вопроса и вызывает соответствующие процедуры для установки значений реквизитов. // // Параметры: -// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. @@ -438,7 +438,7 @@ // Устанавливает значения реквизитов составного табличного вопроса. // // Параметры: -// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. @@ -481,7 +481,7 @@ // Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках. // // Параметры: -// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. @@ -513,7 +513,7 @@ // Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в колонках. // // Параметры: -// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. @@ -548,7 +548,7 @@ // Устанавливает значения реквизитов табличного вопроса с предопределенными ответами в строках и колонках. // // Параметры: -// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. @@ -580,7 +580,7 @@ // Устанавливает значения реквизитов комплексного вопроса. // // Параметры: -// Вопрос - СправочникСсылка.ВопросыШаблонаАнкет - вопрос шаблона анкеты, +// Вопрос - СправочникСсылка.ВопросыШаблонаАнкеты - вопрос шаблона анкеты, // для которого устанавливаются значения реквизитов. // ВыборкаВопрос - ВыборкаИзРезультатаЗапроса - выборка, содержащая значения ответов // на вопрос шаблона анкеты. diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form index 5abbdeed1..738505bbd 100644 --- a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form +++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form @@ -244,10 +244,6 @@ true - - <key>ru</key> - <value>Списки</value> - ГруппаСпискиExtendedTooltip 34 diff --git a/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl b/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl index 1e2528f18..82a5f7791 100644 --- a/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl +++ b/SSL/src/Documents/НазначениеОпросов/ManagerModule.bsl @@ -62,16 +62,8 @@ // Вызывается при подготовке шаблонов сообщений и позволяет переопределить список реквизитов и вложений. // // Параметры: -// Реквизиты - ДеревоЗначений - список реквизитов шаблона: -// ** Имя - Строка - уникальное имя общего реквизита. -// ** Представление - Строка - представление общего реквизита. -// ** Тип - Тип - тип реквизита. По умолчанию строка. -// ** Формат - Строка - формат вывода значения для чисел, дат, строк и булевых значений. -// Вложения - ТаблицаЗначений - печатные формы и вложения: -// ** Имя - Строка - уникальное имя вложения. -// ** Представление - Строка - представление варианта. -// ** ТипФайла - Строка - тип вложения, который соответствует расширению файла: "pdf", "png", "jpg", mxl" -// и др. +// Реквизиты - см. ШаблоныСообщенийПереопределяемый.ПриПодготовкеШаблонаСообщения.Реквизиты +// Вложения - см. ШаблоныСообщенийПереопределяемый.ПриПодготовкеШаблонаСообщения.Вложения // ДополнительныеПараметры - Структура - дополнительные сведения о шаблоне сообщений. // Процедура ПриПодготовкеШаблонаСообщения(Реквизиты, Вложения, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/Documents/СообщениеSMS/ManagerModule.bsl b/SSL/src/Documents/СообщениеSMS/ManagerModule.bsl index 4a2fe2729..4ec2e8488 100644 --- a/SSL/src/Documents/СообщениеSMS/ManagerModule.bsl +++ b/SSL/src/Documents/СообщениеSMS/ManagerModule.bsl @@ -17,10 +17,13 @@ // Получает массив структур, адресатов документа Сообщение SMS. // // Параметры: -// Ссылка - Документ.СообщениеSMS - документ, для которого получаем массив контактов. +// Ссылка - ДокументСсылка.СообщениеSMS - документ, для которого получаем массив контактов. // // Возвращаемое значение: -// Массив - адресаты сообщения SMS. +// Массив из Структура: +// * Адрес - Строка +// * Представление - Строка +// * Контакт - ЛюбаяСсылка // Функция ПолучитьКонтакты(Ссылка) Экспорт diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form index c99fdba59..fe921dec8 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Form.form @@ -705,7 +705,7 @@ Кому: - Кому: + Кому @@ -714,7 +714,7 @@ Копия: - Копия: + Копия @@ -723,7 +723,7 @@ Скрытая копия: - Скрытая копия: + СкрытаяКопия @@ -732,7 +732,7 @@ Обратный адрес: - Обратный адрес: + ОбратныйАдрес Normal diff --git a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl index c58d1fae0..ac64c9cda 100644 --- a/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl +++ b/SSL/src/Documents/ЭлектронноеПисьмоИсходящее/Forms/ФормаДокумента/Module.bsl @@ -56,8 +56,10 @@ КонецЕсли; // Конец СтандартныеПодсистемы.ПодключаемыеКоманды - ПроверитьСостояниеОтправкиПисемНаСервере(); - + СостояниеОтправкиПисем = СостояниеОтправкиПисем(); + Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = СостояниеОтправкиПисем.ОтправкаПриостановлена; + Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = СостояниеОтправкиПисем.ТекстПредупреждения; + КонецПроцедуры &НаКлиенте @@ -79,7 +81,8 @@ УправлениеДоступностью(); - ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", 60, Истина); + Интервал = ?(Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость, 60, 600); + ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина); КонецПроцедуры @@ -730,11 +733,11 @@ Если Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда ВариантОтправки = Элементы.СписокПолучателей.ТекущиеДанные.ВариантОтправки; - Если ВариантОтправки = "Кому:" Тогда + Если ВариантОтправки = "Кому" Тогда ГруппаПодбора = НСтр("ru = 'Кому'"); - ИначеЕсли ВариантОтправки = "Копия:" Тогда + ИначеЕсли ВариантОтправки = "Копия" Тогда ГруппаПодбора = НСтр("ru = 'Копии'"); - ИначеЕсли ВариантОтправки = "СкрытаяКопия:" Тогда + ИначеЕсли ВариантОтправки = "СкрытаяКопия" Тогда ГруппаПодбора = НСтр("ru = 'Скрытые'"); КонецЕсли; @@ -818,7 +821,7 @@ &НаКлиенте Процедура СписокПолучателейПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Если НоваяСтрока Тогда - Элемент.ТекущиеДанные.ВариантОтправки = Элементы.СписокПолучателейВариантОтправки.СписокВыбора.НайтиПоЗначению("Кому:"); + Элемент.ТекущиеДанные.ВариантОтправки = "Кому"; Элемент.ТекущийЭлемент = Элементы.СписокПолучателейПредставление; КонецЕсли; КонецПроцедуры @@ -983,10 +986,14 @@ Процедура СформироватьПоШаблону(Команда) Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда + + ЗаполнитьТабличныеЧастиПоСпискуПолучателей(); + МодульШаблоныСообщенийКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ШаблоныСообщенийКлиент"); Оповещение = Новый ОписаниеОповещения("ЗаполнитьПоШаблонуПослеВыбораШаблона", ЭтотОбъект); ПредметСообщения = ?(ЗначениеЗаполнено(Предмет), Предмет, "Общий"); МодульШаблоныСообщенийКлиент.ПодготовитьСообщениеПоШаблону(ПредметСообщения, "Письмо", Оповещение); + КонецЕсли КонецПроцедуры @@ -1031,7 +1038,7 @@ Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина); // Список вариантов отправки - Взаимодействия.УстановитьУсловноеОформлениеСпискаВыбора(ЭтотОбъект, "СписокПолучателейВариантОтправки", "СписокПолучателей.ВариантОтправки"); + ОбщегоНазначения.УстановитьУсловноеОформлениеСпискаВыбора(ЭтотОбъект, "СписокПолучателейВариантОтправки", "СписокПолучателей.ВариантОтправки"); КонецПроцедуры @@ -1912,7 +1919,7 @@ НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементСписка.Представление); НоваяСтрока = СписокПолучателей.Добавить(); - НоваяСтрока.ВариантОтправки = НСтр("ru = 'Кому:'"); + НоваяСтрока.ВариантОтправки = "Кому"; НоваяСтрока.Адрес = ЭлементСписка.Значение; НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементСписка.Представление); КонецЦикла; @@ -2233,11 +2240,11 @@ Объект.ПолучателиСкрытыхКопий.Очистить(); Объект.ПолучателиОтвета.Очистить(); Для каждого Получатель Из СписокПолучателей Цикл - Если Получатель.ВариантОтправки = НСтр("ru = 'Обратный адрес:'") Тогда + Если Получатель.ВариантОтправки = "ОбратныйАдрес" Тогда НоваяСтрока = Объект.ПолучателиОтвета.Добавить(); - ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Копия:'") Тогда + ИначеЕсли Получатель.ВариантОтправки = "Копия" Тогда НоваяСтрока = Объект.ПолучателиКопий.Добавить(); - ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Скрытая копия:'") Тогда + ИначеЕсли Получатель.ВариантОтправки = "СкрытаяКопия" Тогда НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить(); Иначе НоваяСтрока = Объект.ПолучателиПисьма.Добавить(); @@ -2364,14 +2371,14 @@ СписокПолучателей.Очистить(); - ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиПисьма, НСтр("ru = 'Кому:'")); - ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиКопий, НСтр("ru = 'Копия:'")); - ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиСкрытыхКопий, НСтр("ru = 'Скрытая копия:'")); - ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиОтвета, НСтр("ru = 'Обратный адрес:'")); + ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиПисьма, "Кому"); + ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиКопий, "Копия"); + ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиСкрытыхКопий, "СкрытаяКопия"); + ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиОтвета, "ОбратныйАдрес"); Если СписокПолучателей.Количество() = 0 Тогда НоваяСтрока = СписокПолучателей.Добавить(); - НоваяСтрока.ВариантОтправки = "Кому:"; + НоваяСтрока.ВариантОтправки = "Кому"; КонецЕсли; КонецПроцедуры @@ -2858,11 +2865,11 @@ Для каждого ПочтовыйАдрес Из ПочтовыеАдреса Цикл - Если Получатель.ВариантОтправки = НСтр("ru = 'Обратный адрес:'") Тогда + Если Получатель.ВариантОтправки = "ОбратныйАдрес" Тогда НоваяСтрока = Объект.ПолучателиОтвета.Добавить(); - ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Копия:'") Тогда + ИначеЕсли Получатель.ВариантОтправки = "Копия" Тогда НоваяСтрока = Объект.ПолучателиКопий.Добавить(); - ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Скрытая копия:'") Тогда + ИначеЕсли Получатель.ВариантОтправки = "СкрытаяКопия" Тогда НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить(); Иначе НоваяСтрока = Объект.ПолучателиПисьма.Добавить(); @@ -2997,18 +3004,26 @@ &НаКлиенте Процедура ПроверитьСостояниеОтправкиПисем() - ПроверитьСостояниеОтправкиПисемНаСервере(); + СостояниеОтправкиПисем = СостояниеОтправкиПисем(); + Если Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость <> СостояниеОтправкиПисем.ОтправкаПриостановлена Тогда + Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = СостояниеОтправкиПисем.ОтправкаПриостановлена; + Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = СостояниеОтправкиПисем.ТекстПредупреждения; + КонецЕсли; + Интервал = ?(Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость, 60, 600); ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина); КонецПроцедуры -&НаСервере -Процедура ПроверитьСостояниеОтправкиПисемНаСервере() +&НаСервереБезКонтекста +Функция СостояниеОтправкиПисем() - Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = Взаимодействия.ОтправкаПисемПриостановлена(); - Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = Взаимодействия.ТекстПредупрежденияОПриостановкеОтправкиПисем(); + Результат = Новый Структура; + Результат.Вставить("ОтправкаПриостановлена", Взаимодействия.ОтправкаПисемПриостановлена()); + Результат.Вставить("ТекстПредупреждения", Взаимодействия.ТекстПредупрежденияОПриостановкеОтправкиПисем()); -КонецПроцедуры + Возврат Результат; + +КонецФункции #КонецОбласти diff --git a/SSL/src/Enums/ВариантыПериода/ВариантыПериода.mdo b/SSL/src/Enums/ВариантыПериода/ВариантыПериода.mdo new file mode 100644 index 000000000..8cc4d5bb2 --- /dev/null +++ b/SSL/src/Enums/ВариантыПериода/ВариантыПериода.mdo @@ -0,0 +1,45 @@ + + + + + + + + ВариантыПериода + + ru + Варианты периода + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Стандартный + + ru + Стандартный + + + + Финансовый + + ru + Финансовый + + + diff --git a/SSL/src/Enums/ВариантыПредставленияПериода/ВариантыПредставленияПериода.mdo b/SSL/src/Enums/ВариантыПредставленияПериода/ВариантыПредставленияПериода.mdo new file mode 100644 index 000000000..71a7859c4 --- /dev/null +++ b/SSL/src/Enums/ВариантыПредставленияПериода/ВариантыПредставленияПериода.mdo @@ -0,0 +1,45 @@ + + + + + + + + ВариантыПредставленияПериода + + ru + Варианты представления периода + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Стандартный + + ru + Стандартный + + + + Гиперссылка + + ru + Гиперссылка + + + diff --git a/SSL/src/Enums/СостоянияЗаявленияУчетнойЗаписиDSS/СостоянияЗаявленияУчетнойЗаписиDSS.mdo b/SSL/src/Enums/СостоянияЗаявленияУчетнойЗаписиDSS/СостоянияЗаявленияУчетнойЗаписиDSS.mdo new file mode 100644 index 000000000..57ce2ff1e --- /dev/null +++ b/SSL/src/Enums/СостоянияЗаявленияУчетнойЗаписиDSS/СостоянияЗаявленияУчетнойЗаписиDSS.mdo @@ -0,0 +1,66 @@ + + + + + + + + СостоянияЗаявленияУчетнойЗаписиDSS + + ru + Состояния заявления учетной записи DSS + + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Исполнено + + ru + Исполнено + + + + НеПодготовлено + + ru + Не подготовлено + + + + Отклонено + + ru + Отклонено + + + + Отправлено + + ru + Отправлено + + + + Подготовлено + + ru + Подготовлено + + + diff --git a/SSL/src/Enums/СпособыАвторизацииDSS/СпособыАвторизацииDSS.mdo b/SSL/src/Enums/СпособыАвторизацииDSS/СпособыАвторизацииDSS.mdo new file mode 100644 index 000000000..369c8e3c9 --- /dev/null +++ b/SSL/src/Enums/СпособыАвторизацииDSS/СпособыАвторизацииDSS.mdo @@ -0,0 +1,95 @@ + + + + + + + + СпособыАвторизацииDSS + + ru + Способы авторизации DSS + + Перечисляет первичные и вторичные способы авторизации + + Use + Order + + Use + + + + + Use + Ref + + Use + + + + true + BothWays + + Вторичный_AirKeyLite + + ru + Вторичный air key lite + + + + Вторичный_МобильноеПриложение + + ru + Вторичный мобильное приложение + + + + Вторичный_ОфлайнПодтверждение + + ru + Вторичный офлайн подтверждение + + + + Вторичный_СМС + + ru + Вторичный СМС + + + + Вторичный_ЭлектроннаяПочта + + ru + Вторичный электронная почта + + + + Первичный_ДвухФакторная + + ru + Первичный двухфакторная + + + + Первичный_КодАвторизации + + ru + Первичный код авторизации + + + + Первичный_СертификатАвторизации + + ru + Первичный сертификат авторизации + + + + Первичный_УчетныеДанные + + ru + Первичный учетные данные + + + diff --git a/SSL/src/Enums/ТипыПредопределенныхПапокПисем/ТипыПредопределенныхПапокПисем.mdo b/SSL/src/Enums/ТипыПредопределенныхПапокПисем/ТипыПредопределенныхПапокПисем.mdo index 048766890..3efa6306e 100644 --- a/SSL/src/Enums/ТипыПредопределенныхПапокПисем/ТипыПредопределенныхПапокПисем.mdo +++ b/SSL/src/Enums/ТипыПредопределенныхПапокПисем/ТипыПредопределенныхПапокПисем.mdo @@ -1,9 +1,9 @@ - + - - - + + + ТипыПредопределенныхПапокПисем diff --git a/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей.mdo b/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей.mdo index 3cb3a5947..916dd9e19 100644 --- a/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей.mdo +++ b/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей.mdo @@ -10,5 +10,5 @@ DefinedType.ВладелецСОграничениемПоНаборамЗначенийДоступаОбъект BeforeWrite - CommonModule.УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей + CommonModule.УправлениеДоступомСлужебный.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей diff --git a/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов.mdo b/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов.mdo new file mode 100644 index 000000000..51a2215c0 --- /dev/null +++ b/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов.mdo @@ -0,0 +1,14 @@ + + + ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументов + + ru + Заполнить наборы значений доступа табличных частей документов + + Подписка поставляется подсистемой Управление доступом для заполнения табличной части НаборыЗначенийДоступа тех объектов метаданных, в которых она была создана для работы шаблона #ПоНаборамЗначений + + DefinedType.ВладелецСОграничениемПоНаборамЗначенийДоступаДокумент + + BeforeWrite + CommonModule.УправлениеДоступомСлужебный.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей + diff --git a/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия.mdo b/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия.mdo deleted file mode 100644 index 77fd3c6c9..000000000 --- a/SSL/src/EventSubscriptions/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия/ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия.mdo +++ /dev/null @@ -1,19 +0,0 @@ - - - ЗаполнитьНаборыЗначенийДоступаТабличныхЧастейДокументовВзаимодействия - - ru - Заполнить наборы значений доступа табличных частей документов взаимодействия - - Подписка создана при внедрении подсистемы Управление доступом для заполнения табличной части НаборыЗначенийДоступа тех объектов метаданных, в которых она была создана для работы шаблона #ПоНаборамЗначений - - DocumentObject.Встреча - DocumentObject.ЭлектронноеПисьмоВходящее - DocumentObject.ЗапланированноеВзаимодействие - DocumentObject.СообщениеSMS - DocumentObject.ТелефонныйЗвонок - DocumentObject.ЭлектронноеПисьмоИсходящее - - BeforeWrite - CommonModule.ВзаимодействияСобытия.ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей - diff --git a/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo b/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo index f56c9cdea..9dfe8e101 100644 --- a/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo +++ b/SSL/src/EventSubscriptions/КонтрольНеразделенныхОбъектовПриЗаписи/КонтрольНеразделенныхОбъектовПриЗаписи.mdo @@ -72,6 +72,7 @@ CatalogObject.ОбщиеВнешниеКомпоненты CatalogObject.ИдентификаторыОбъектовМетаданных ConstantValueManager.ДополнительныйЯзык1 + ConstantValueManager.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных ConstantValueManager.КоличествоЭлементовВТранзакцииЗагрузкиДанных ConstantValueManager.ВыполнятьЗамерыПроизводительности ConstantValueManager.ЗагрузитьСообщениеОбменаДанными diff --git a/SSL/src/EventSubscriptions/ПередУдалениемПланаОбмена/ПередУдалениемПланаОбмена.mdo b/SSL/src/EventSubscriptions/ПередУдалениемПланаОбмена/ПередУдалениемПланаОбмена.mdo new file mode 100644 index 000000000..239b1bca3 --- /dev/null +++ b/SSL/src/EventSubscriptions/ПередУдалениемПланаОбмена/ПередУдалениемПланаОбмена.mdo @@ -0,0 +1,13 @@ + + + ПередУдалениемПланаОбмена + + ru + Перед удалением плана обмена + + + ExchangePlanObject + + BeforeDelete + CommonModule.ОбменДаннымиСобытия.ПередУдалениемПланаОбмена + diff --git a/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ManagerModule.bsl b/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ManagerModule.bsl index 67f3051ad..ea3bd23b2 100644 --- a/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ManagerModule.bsl +++ b/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ManagerModule.bsl @@ -16,8 +16,7 @@ // Очередь - Число - очередь обработки данных. // // Возвращаемое значение: -// Массив - массив со значениями: -// * ПланОбменаСсылка.ОбновлениеИнформационнойБазы +// Массив из ПланОбменаСсылка.ОбновлениеИнформационнойБазы. // Функция УзлыМеньшейОчереди(Очередь) Экспорт diff --git a/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo b/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo index 7ef50d4c2..168f86c4c 100644 --- a/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo +++ b/SSL/src/ExchangePlans/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo @@ -953,6 +953,9 @@ InformationRegister.СостоянияУспешныхОбменовДанными + + InformationRegister.ИспользуемыеВидыДоступа + Constant.ОтложенноеОбновлениеВГлавномУзлеЗавершеноУспешно @@ -1010,12 +1013,18 @@ Constant.КоличествоЭлементовВТранзакцииЗагрузкиДанных + + Constant.ЗагрузитьРасширенияИзменяющиеСтруктуруДанных + InformationRegister.КлючиДоступаПользователей InformationRegister.КлючиДоступаГруппДоступа + + InformationRegister.ИспользуемыеВидыДоступаПоТаблицам + InformationRegister.ДампыПлатформы diff --git a/SSL/src/FunctionalOptions/ИспользоватьСервисОблачнойПодписи/ИспользоватьСервисОблачнойПодписи.mdo b/SSL/src/FunctionalOptions/ИспользоватьСервисОблачнойПодписи/ИспользоватьСервисОблачнойПодписи.mdo new file mode 100644 index 000000000..ca8c79939 --- /dev/null +++ b/SSL/src/FunctionalOptions/ИспользоватьСервисОблачнойПодписи/ИспользоватьСервисОблачнойПодписи.mdo @@ -0,0 +1,19 @@ + + + ИспользоватьСервисОблачнойПодписи + + ru + Использовать сервис облачной подписи + + Constant.ИспользоватьСервисОблачнойПодписи + true + Catalog.ЭкземплярыСервераDSS + Catalog.УчетныеЗаписиDSS + Report.СостояниеУчетнойЗаписиDSS + DataProcessor.УправлениеПодключениемDSS + DataProcessor.УправлениеПодключениемDSS.Command.СписокСертификатов + DataProcessor.УправлениеПодключениемDSS.Command.СерверыОблачнойПодписи + DataProcessor.УправлениеПодключениемDSS.Command.УчетныеЗаписиОблачнойПодписи + Enum.СпособыАвторизацииDSS + InformationRegister.СертификатыПользователяDSS + diff --git a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВЛокальномРежиме/ИспользоватьСинхронизациюДанныхВЛокальномРежиме.mdo b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВЛокальномРежиме/ИспользоватьСинхронизациюДанныхВЛокальномРежиме.mdo index d401896f2..b65810534 100644 --- a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВЛокальномРежиме/ИспользоватьСинхронизациюДанныхВЛокальномРежиме.mdo +++ b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВЛокальномРежиме/ИспользоватьСинхронизациюДанныхВЛокальномРежиме.mdo @@ -18,6 +18,6 @@ CommonCommand.СценарииСинхронизации CommonCommand.СинхронизироватьСДополнительнымиПараметрами CommonForm.ВыборОбъектовИнформационнойБазыКорреспондента - CommonForm.СинхронизацияДанных + CommonForm.НастройкиСинхронизацииДанных CommonCommand.ПолучитьНастройкиСинхронизацииДляДругойПрограммы diff --git a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo index cea1105ca..60d81757a 100644 --- a/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo +++ b/SSL/src/FunctionalOptions/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете/ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете.mdo @@ -7,5 +7,6 @@ Constant.ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете true - CommonCommand.СинхронизацияДанныхВМоделиСервиса + CommonCommand.НастройкиСинхронизацииДанныхВМоделиСервиса + CommonCommand.НастройкиПодключения diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl index 541604199..ba92879d3 100644 --- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl +++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl @@ -64,7 +64,7 @@ Если Параметры.Свойство("ВыборАдресаПоПочтовомуИндексу") И КодИсточникаЗагрузки = "САЙТ" Тогда РежимРаботы = "ОБНОВЛЕНИЕ"; - ПочтовыйИндекс = Параметры.Индекс; + ПочтовыйИндекс = Параметры.ПочтовыйИндекс; Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ОбновлениеКлассификатора; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный"); diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/ManagerModule.bsl b/SSL/src/InformationRegisters/ВерсииОбъектов/ManagerModule.bsl index c449f8931..62399a331 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/ManagerModule.bsl @@ -1564,6 +1564,134 @@ Возврат Результат; КонецФункции + +// Прогресс удаления предупреждений синхронизации +// +Процедура ПрогрессУдалениеПредупрежденийСинхронизации(Знач ТекущийШаг, Максимум) + + ТекущийШаг = ?(ТекущийШаг = 0, 1, ТекущийШаг); + + Шаблон = НСтр("ru = 'Выполнено итераций %1 из %2'", ОбщегоНазначения.КодОсновногоЯзыка()); + ТекстПрогресса = СтрШаблон(Шаблон, ТекущийШаг, Максимум); + + ПроцентВыполнения = ОКР(ТекущийШаг * 100 / Максимум, 0); + + ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, ТекстПрогресса); + +КонецПроцедуры + +Процедура ОчиститьПредупрежденияВерсий(ПараметрыУдаления, ИмяСобытия) Экспорт + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТипВерсииОбъекта", ПараметрыУдаления.ОтборТипыПредупрежденийВерсий); + + Запрос.Текст = + "ВЫБРАТЬ + | РегистрВерсииОбъектов.Объект КАК ОбъектБлокировки, + | РегистрВерсииОбъектов.НомерВерсии КАК НомерВерсии + |ИЗ + | РегистрСведений.ВерсииОбъектов КАК РегистрВерсииОбъектов + |ГДЕ + | РегистрВерсииОбъектов.ТипВерсииОбъекта В(&ТипВерсииОбъекта) + |ИТОГИ ПО + | ОбъектБлокировки"; + + СхемаЗапроса = Новый СхемаЗапроса; + СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст); + + ОператорСхемыЗапроса = СхемаЗапроса.ПакетЗапросов[0].Операторы[0]; + + Если ПараметрыУдаления.ОтборУзловПланаОбмена.Количество() > 0 Тогда + + ОператорСхемыЗапроса.Отбор.Добавить("АвторВерсии В(&ОтборУзловПланаОбмена)"); + Запрос.УстановитьПараметр("ОтборУзловПланаОбмена", ПараметрыУдаления.ОтборУзловПланаОбмена); + + КонецЕсли; + + Если ЗначениеЗаполнено(ПараметрыУдаления.ОтборПоДатеВозникновения) Тогда + + ОператорСхемыЗапроса.Отбор.Добавить("ДатаВерсии МЕЖДУ &ДатаНачала И &ДатаОкончания"); + Запрос.УстановитьПараметр("ДатаНачала", ПараметрыУдаления.ОтборПоДатеВозникновения.ДатаНачала); + Запрос.УстановитьПараметр("ДатаОкончания", ПараметрыУдаления.ОтборПоДатеВозникновения.ДатаОкончания); + + КонецЕсли; + + Если ПараметрыУдаления.ТолькоСкрытыеЗаписи Тогда + + ОператорСхемыЗапроса.Отбор.Добавить("ВерсияПроигнорирована = ИСТИНА"); + + КонецЕсли; + + Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса(); + ВыборкаОбъекты = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + + КоличествоОбъектов = ВыборкаОбъекты.Количество(); + Если КоличествоОбъектов < 1 Тогда + + Возврат; + + КонецЕсли; + + Пропорция = ПараметрыУдаления.ОтборТипыПредупрежденийВерсий.Количество() / КоличествоОбъектов; + ИтераторВыборки = 0; + + НаборЗаписейРезультаты = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей(); + + Пока ВыборкаОбъекты.Следующий() Цикл + + // 1. Начать транзакцию для пакета из двух операций чтения и записи регистра + НачатьТранзакцию(); + Попытка + + // 2. Установить исключительную блокировку на интересующий диапазон записей регистра, + // для того чтобы гарантировать, что в момент записи количество предупреждений не изменилось с момента чтения в + // каком-либо другом сеансе. + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.ВерсииОбъектов"); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировкиДанных.УстановитьЗначение("Объект", ВыборкаОбъекты.ОбъектБлокировки); + БлокировкаДанных.Заблокировать(); + + // 3. Прочитать регистр сведений + НаборЗаписейРезультаты.Отбор.Объект.Установить(ВыборкаОбъекты.ОбъектБлокировки, Истина); + + ВыборкаНомераВерсий = ВыборкаОбъекты.Выбрать(); + Пока ВыборкаНомераВерсий.Следующий() Цикл + + НаборЗаписейРезультаты.Отбор.НомерВерсии.Установить(ВыборкаНомераВерсий.НомерВерсии, Истина); + + // 4. Записать в регистр сведений + НаборЗаписейРезультаты.Записать(Истина); + + КонецЦикла; + + ИтераторВыборки = ИтераторВыборки + 1; + Если ОКР(ИтераторВыборки * Пропорция, 0) <> ОКР((ИтераторВыборки - 1) * Пропорция, 0) Тогда + + // Увеличиваем шаг только с учетом пропорции, т.е. когда количество итераций умноженное на пропорцию изменяет значение + ПараметрыУдаления.КоличествоОперацийТекущийШаг = ПараметрыУдаления.КоличествоОперацийТекущийШаг + 1; + + КонецЕсли; + + ПрогрессУдалениеПредупрежденийСинхронизации(ПараметрыУдаления.КоличествоОперацийТекущийШаг, ПараметрыУдаления.КоличествоОперацийМаксимум); + + ЗафиксироватьТранзакцию(); + + Исключение + + // 5. Если при установке блокировки возникла исключительная ситуация из-за того, что регистр уже заблокирован в + // другом сеансе (или по другим причинам), отменить транзакцию и записать сведения об ошибке в журнал регистрации. + ОтменитьТранзакцию(); + + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; + + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #КонецЕсли \ No newline at end of file diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo b/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo index 01ea0dc6c..5bd19e3d8 100644 --- a/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo +++ b/SSL/src/InformationRegisters/ВерсииОбъектов/ВерсииОбъектов.mdo @@ -330,6 +330,22 @@ Use + + ПредупреждениеСинхронизации + + ru + Предупреждение синхронизации + + + String + + + + + Use + Use + + Объект diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl index 41ccf1ca0..d51d16e8b 100644 --- a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl @@ -177,11 +177,11 @@ // Обновляет группы значений доступа в РегистрСведений.ГруппыЗначенийДоступа. // // Параметры: -// ЗначенияДоступа - СправочникОбъект, -// - СправочникСсылка. -// - массив значений указанных выше типов. +// ЗначенияДоступа - СправочникОбъект +// - СправочникСсылка +// - Массив - массив значений указанных выше типов. // - Неопределено - без отбора. -// Тип значений должен быть в составе типов измерения Значение +// Тип значений должен быть в составе типов измерения ЗначениеДоступа // регистра сведений ГруппыЗначенийДоступа. // Если передан Объект, то обновление будет только при его изменении. // @@ -655,23 +655,6 @@ НовыеЗначения = СтарыеЗначения; КонецЕсли; - Если Не ТребуетсяОбновление Тогда - Возврат; - КонецЕсли; - - Если СвойстваВидаДоступа.ТипГруппЗначений <> Тип("Неопределено") - И (Объект = Неопределено Или Не Объект.ЭтоНовый()) Тогда - - ТекущаяСсылка = ЗначенияСИзменениямиПоТипам.Получить(СвойстваВидаДоступа.ТипЗначений); - - Если ТекущаяСсылка = Неопределено Тогда - ЗначенияСИзменениямиПоТипам.Вставить(СвойстваВидаДоступа.ТипЗначений, Ссылка); - - ИначеЕсли ТипЗнч(ТекущаяСсылка) = СвойстваВидаДоступа.ТипЗначений Тогда - ЗначенияСИзменениямиПоТипам.Вставить(СвойстваВидаДоступа.ТипЗначений, Истина); - КонецЕсли; - КонецЕсли; - // Подготовка новых записей для обновления. НовыеЗаписи = СоздатьНаборЗаписей().Выгрузить(); @@ -736,9 +719,9 @@ Данные.Вставить("ФиксированныйОтбор", ФиксированныйОтбор); Данные.Вставить("ДополнительныеСвойства", ДополнительныеСвойства); + ЕстьТекущиеИзменения = Ложь; НачатьТранзакцию(); Попытка - ЕстьТекущиеИзменения = Ложь; УправлениеДоступомСлужебный.ОбновитьНаборыЗаписей(Данные, ЕстьТекущиеИзменения); Если ЕстьТекущиеИзменения Тогда СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); @@ -750,6 +733,23 @@ ВызватьИсключение; КонецПопытки; + Если Не ТребуетсяОбновление И Не ЕстьТекущиеИзменения Тогда + Возврат; + КонецЕсли; + + Если СвойстваВидаДоступа.ТипГруппЗначений <> Тип("Неопределено") + И (Объект = Неопределено Или Не Объект.ЭтоНовый()) Тогда + + ТекущаяСсылка = ЗначенияСИзменениямиПоТипам.Получить(СвойстваВидаДоступа.ТипЗначений); + + Если ТекущаяСсылка = Неопределено Тогда + ЗначенияСИзменениямиПоТипам.Вставить(СвойстваВидаДоступа.ТипЗначений, Ссылка); + + ИначеЕсли ТипЗнч(ТекущаяСсылка) = СвойстваВидаДоступа.ТипЗначений Тогда + ЗначенияСИзменениямиПоТипам.Вставить(СвойстваВидаДоступа.ТипЗначений, Истина); + КонецЕсли; + КонецЕсли; + КонецПроцедуры // Обновляет группировки пользователей для проверки разрешенных значений diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаЗагрузкиДанных/CommandModule.bsl b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаЗагрузкиДанных/CommandModule.bsl index fe0ef949a..94c9febbc 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаЗагрузкиДанных/CommandModule.bsl +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаЗагрузкиДанных/CommandModule.bsl @@ -8,6 +8,11 @@ #Область ОбработчикиСобытий +// Параметры: +// ПараметрКоманды - Структура +// - Неопределено +// ПараметрыВыполненияКоманды - ПараметрыВыполненияКоманды +// &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаИзмененияДанных/CommandModule.bsl b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаИзмененияДанных/CommandModule.bsl index f5f389268..3bfbbaec3 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаИзмененияДанных/CommandModule.bsl +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Commands/ДатыЗапретаИзмененияДанных/CommandModule.bsl @@ -8,6 +8,11 @@ #Область ОбработчикиСобытий +// Параметры: +// ПараметрКоманды - Структура +// - Неопределено +// ПараметрыВыполненияКоманды - ПараметрыВыполненияКоманды +// &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form index 99f7f03e1..b217563e0 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Form.form @@ -595,10 +595,6 @@ true - - <key>ru</key> - <value>Пользователи стандартные команды</value> - ПользователиСтандартныеКомандыExtendedTooltip 326 @@ -2121,10 +2117,6 @@ true - - <key>ru</key> - <value>Даты запрета стандартные команды</value> - ДатыЗапретаСтандартныеКомандыРасширеннаяПодсказка 404 @@ -2347,10 +2339,6 @@ true - - <key>ru</key> - <value>Даты запрета контекстное меню стандартные команды</value> - ДатыЗапретаКонтекстноеМенюСтандартныеКомандыExtendedTooltip 392 diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl index 8a95364de..894f8d754 100644 --- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl +++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl @@ -58,8 +58,9 @@ Продолжить; КонецЕсли; НоваяСтрока = Таблица.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Раздел.Значение); - Если Не ЗначениеЗаполнено(Раздел.Значение.Ссылка) Тогда + СвойстваРаздела = Раздел.Значение; // Структура + ЗаполнитьЗначенияСвойств(НоваяСтрока, СвойстваРаздела); + Если Не ЗначениеЗаполнено(СвойстваРаздела.Ссылка) Тогда НоваяСтрока.Представление = ТекстПредставленияОбщейДаты(); НоваяСтрока.ЭтоОбщаяДата = Истина; КонецЕсли; @@ -2308,7 +2309,7 @@ КлючЗаписи = РегистрыСведений.ДатыЗапретаИзменения.СоздатьКлючЗаписи(ЗначенияКлючаЗаписи); ЗаблокироватьДанныеДляРедактирования(КлючЗаписи, , Блокировки.ИдентификаторФормы); БлокировкаДобавлена = Ложь; - Если Блокировки.Состав.НайтиСтроки(ЗначенияКлючаЗаписи) = 0 Тогда + Если Блокировки.Состав.НайтиСтроки(ЗначенияКлючаЗаписи).Количество() = 0 Тогда ЗаполнитьЗначенияСвойств(Блокировки.Состав.Добавить(), ЗначенияКлючаЗаписи); БлокировкаДобавлена = Истина; КонецЕсли; diff --git a/SSL/src/InformationRegisters/ЗамерыВремени/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗамерыВремени/ManagerModule.bsl index e39324024..d28d5e8a1 100644 --- a/SSL/src/InformationRegisters/ЗамерыВремени/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗамерыВремени/ManagerModule.bsl @@ -10,46 +10,6 @@ #Область СлужебныеПроцедурыИФункции -Функция ПолучитьПоследниеКомментарии() Экспорт - Запрос = Новый Запрос; - ТекстЗапроса = " - |ВЫБРАТЬ - | Комментарий КАК Комментарий, - | КОЛИЧЕСТВО(Комментарий) КАК ЧастотаИспользования - |ИЗ - | ( - | ВЫБРАТЬ ПЕРВЫЕ 1000 - | ЗамерыВремени.Комментарий КАК Комментарий - | ИЗ - | РегистрСведений.ЗамерыВремени КАК ЗамерыВремени - | УПОРЯДОЧИТЬ ПО - | ЗамерыВремени.ДатаЗаписи УБЫВ - | ) КАК Выборка - |СГРУППИРОВАТЬ ПО - | Комментарий - |УПОРЯДОЧИТЬ ПО - | КОЛИЧЕСТВО(Комментарий) УБЫВ - |"; - - Запрос.Текст = ТекстЗапроса; - РезультатЗапроса = Запрос.Выполнить(); - - Комментарии = Новый Массив(); - - Количество = 0; - ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - Комментарии.Добавить(ВыборкаДетальныеЗаписи.Комментарий); - Количество = Количество + 1; - - Если Количество = 5 Тогда - Прервать; - КонецЕсли; - КонецЦикла; - - Возврат Комментарии; -КонецФункции - Функция ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, Количество) Экспорт Запрос = Новый Запрос; @@ -104,11 +64,13 @@ | ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015,1,1),СЕКУНДА, ВЫРАЗИТЬ((Замеры.ДатаНачалаЗамера/1000)/&ПериодАгрегации - 0.5 КАК ЧИСЛО(11,0)) * &ПериодАгрегации - 63555667200)" КонецФункции -// Возвращает таблицу настроек интервалов по умолчанию +// Возвращает таблицу настроек интервалов по умолчанию. // // Возвращаемое значение: -// НастроечнаяТаблицаИнтервалов - ТаблицаЗначений - содержащая настройки интервалов по умолчанию. -// Колонки: НижняяГраница, ВерхняяГраница, Шаг. +// ТаблицаЗначений: +// * НижняяГраница - Число +// * ВерхняяГраница - Число +// * Шаг - Число // Функция НастроечнаяТаблицаИнтервалов() @@ -221,8 +183,8 @@ // Должна содержать колонки НижняяГраница, ВерхняяГраница, Шаг типа Число. // // Возвращаемое значение: -// ТаблицаИнтервалов - ТаблицаЗначений - содержащая нижнее и верхнее граничные значения для каждого из интервалов. -// Колонки: НижняяГраница, ВерхняяГраница. +// ТаблицаЗначений - содержащая нижнее и верхнее граничные значения для каждого из интервалов. +// Колонки: НижняяГраница, ВерхняяГраница. // Функция ТаблицаИнтерваловПоНастройкам(ТаблицаНастроек) @@ -290,7 +252,7 @@ // Должна содержать колонки НижняяГраница, ВерхняяГраница. // // Возвращаемое значение: -// ТекстЗапроса - часть текста запроса, соответствующая переданной таблице интервалов. +// Строка // Функция ЧастьТекстаЗапросаПоИнтервалам(ТаблицаИнтервалов, ИмяТаблицыИсточника, ИмяКолонкиИсточника, СИменем) @@ -316,7 +278,9 @@ КонецЦикла; // @query-part-1 + // АПК:1297-выкл локализация текста запроса не требуется. ТекстЗапроса = "ВЫБОР " + ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС) + " Иначе 0 Конец" + ?(СИменем, " КАК ExecutionTime, ", ","); + // АПК:1297-вкл Возврат ТекстЗапроса; diff --git a/SSL/src/InformationRegisters/ЗамерыВремениТехнологические/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗамерыВремениТехнологические/ManagerModule.bsl index a438f8795..d53ec0214 100644 --- a/SSL/src/InformationRegisters/ЗамерыВремениТехнологические/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗамерыВремениТехнологические/ManagerModule.bsl @@ -66,8 +66,10 @@ // Возвращает таблицу настроек интервалов по умолчанию // // Возвращаемое значение: -// НастроечнаяТаблицаИнтервалов - ТаблицаЗначений - содержащая настройки интервалов по умолчанию. -// Колонки: НижняяГраница, ВерхняяГраница, Шаг. +// ТаблицаЗначений - настройки интервалов по умолчанию: +// * НижняяГраница - Число +// * ВерхняяГраница - Число +// * Шаг - Число // Функция НастроечнаяТаблицаИнтервалов() @@ -180,8 +182,8 @@ // Должна содержать колонки НижняяГраница, ВерхняяГраница, Шаг типа Число. // // Возвращаемое значение: -// ТаблицаИнтервалов - ТаблицаЗначений - содержащая нижнее и верхнее граничные значения для каждого из интервалов. -// Колонки: НижняяГраница, ВерхняяГраница. +// ТаблицаЗначений - содержащая нижнее и верхнее граничные значения для каждого из интервалов. +// Колонки: НижняяГраница, ВерхняяГраница. // Функция ТаблицаИнтерваловПоНастройкам(ТаблицаНастроек) @@ -249,7 +251,7 @@ // Должна содержать колонки НижняяГраница, ВерхняяГраница. // // Возвращаемое значение: -// ТекстЗапроса - часть текста запроса, соответствующая переданной таблице интервалов. +// Строка // Функция ЧастьТекстаЗапросаПоИнтервалам(ТаблицаИнтервалов, ИмяТаблицыИсточника, ИмяКолонкиИсточника, СИменем) @@ -275,7 +277,9 @@ КонецЦикла; // @query-part-1 + // АПК:1297-выкл локализация текста запроса не требуется. ТекстЗапроса = "ВЫБОР " + ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", Символы.ПС) + " Иначе 0 Конец" + ?(СИменем, " КАК ExecutionTime, ", ","); + // АПК:1297-вкл Возврат ТекстЗапроса; diff --git a/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl index e13e2f88d..cc5f3aaa0 100644 --- a/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗначенияГруппДоступа/ManagerModule.bsl @@ -58,8 +58,8 @@ // - использования видов доступа. // // Параметры: -// ГруппыДоступа - СправочникСсылка.ГруппыДоступа. -// - массив значений указанных выше типов. +// ГруппыДоступа - СправочникСсылка.ГруппыДоступа +// - Массив - массив значений указанных выше типов. // - Неопределено - без отбора. // // ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, @@ -113,6 +113,7 @@ УстановитьПривилегированныйРежим(Истина); Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); Запрос.УстановитьПараметр("ИспользуемыеВидыДоступа", ИспользуемыеВидыДоступа); Запрос.УстановитьПараметр("ТипыГруппИЗначенийВидовДоступа", @@ -196,7 +197,7 @@ | Справочник.ГруппыДоступа КАК ГруппыДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа | ПО ГруппыДоступа.Профиль = ПрофилиГруппДоступа.Ссылка - | И (ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)) + | И (ГруппыДоступа.Профиль <> &ПрофильАдминистратор) | И (НЕ ГруппыДоступа.ПометкаУдаления) | И (НЕ ПрофилиГруппДоступа.ПометкаУдаления) | И (&УсловиеОтбораГруппДоступа1) @@ -373,6 +374,7 @@ УстановитьПривилегированныйРежим(Истина); Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); Запрос.УстановитьПараметр("ИспользуемыеВидыДоступа", ИспользуемыеВидыДоступа); Запрос.УстановитьПараметр("ТипыГруппИЗначенийВидовДоступа", @@ -446,7 +448,7 @@ | Справочник.ГруппыДоступа КАК ГруппыДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа | ПО ГруппыДоступа.Профиль = ПрофилиГруппДоступа.Ссылка - | И (ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)) + | И (ГруппыДоступа.Профиль <> &ПрофильАдминистратор) | И (НЕ ГруппыДоступа.ПометкаУдаления) | И (НЕ ПрофилиГруппДоступа.ПометкаУдаления) | И (&УсловиеОтбораГруппДоступа1) @@ -603,6 +605,10 @@ УправлениеДоступомСлужебный.ОбновитьРегистрСведений(Данные, ЕстьТекущиеИзменения); Если ЕстьТекущиеИзменения Тогда ЕстьИзменения = Истина; + СоставИзменений = Данные.ИзмененияСоставаСтрок.Скопировать(, "ТипЗначенийДоступа"); + СоставИзменений.Свернуть("ТипЗначенийДоступа"); + ИзменениеТиповЗначений = СоставИзменений.ВыгрузитьКолонку("ТипЗначенийДоступа"); + РегистрыСведений.ИспользуемыеВидыДоступаПоТаблицам.ОбновитьДанныеРегистра(, ИзменениеТиповЗначений); КонецЕсли; Если ЕстьТекущиеИзменения @@ -633,7 +639,7 @@ | Справочник.ГруппыДоступа КАК ГруппыДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа | ПО ГруппыДоступа.Профиль = ПрофилиГруппДоступа.Ссылка - | И (ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)) + | И (ГруппыДоступа.Профиль <> &ПрофильАдминистратор) | И (НЕ ГруппыДоступа.ПометкаУдаления) | И (НЕ ПрофилиГруппДоступа.ПометкаУдаления) | И (&УсловиеОтбораГруппДоступа1) @@ -682,6 +688,7 @@ | ПрофилиГруппДоступаЗначенияДоступа.ЗначениеДоступа"; Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, ГруппыДоступа, "ГруппыДоступа", "&УсловиеОтбораГруппДоступа1:ГруппыДоступа.Ссылка"); diff --git a/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Module.bsl index 41ca0720d..09b0fad83 100644 --- a/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Module.bsl @@ -64,30 +64,8 @@ Процедура УстановитьУсловноеОформление() Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Очистить(); - ТипыЗначенийДоступа = Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы(); - - Для Каждого Тип Из ТипыЗначенийДоступа Цикл - Типы = Новый Массив; - Типы.Добавить(Тип); - ОписаниеТипа = Новый ОписаниеТипов(Типы); - ПустаяСсылкаТипа = ОписаниеТипа.ПривестиЗначение(Неопределено); - - // Оформление. - ЭлементОформления = Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить(); - ЭлементОформления.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - - ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", Строка(Тип)); - - ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТипЗначенийДоступа"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.ПравоеЗначение = ПустаяСсылкаТипа; - ЭлементОтбора.Использование = Истина; - - ЭлементПоля = ЭлементОформления.Поля.Элементы.Добавить(); - ЭлементПоля.Поле = Новый ПолеКомпоновкиДанных("ТипЗначенийДоступа"); - ЭлементПоля.Использование = Истина; - КонецЦикла; + РегистрыСведений.ЗначенияГруппДоступаПоУмолчанию.ОформитьПредставлениеТипаЗначенияДоступа(Список, + "ТипЗначенийДоступа"); КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/ManagerModule.bsl b/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/ManagerModule.bsl index 633184596..b383ecbcd 100644 --- a/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/ManagerModule.bsl @@ -50,4 +50,41 @@ #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +// Параметры: +// Список - ДинамическийСписок +// ИмяПоля - Строка +// +Процедура ОформитьПредставлениеТипаЗначенияДоступа(Список, ИмяПоля) Экспорт + + ТипыЗначенийДоступа = Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы(); + + Для Каждого Тип Из ТипыЗначенийДоступа Цикл + Типы = Новый Массив; + Типы.Добавить(Тип); + ОписаниеТипа = Новый ОписаниеТипов(Типы); + ПустаяСсылкаТипа = ОписаниеТипа.ПривестиЗначение(Неопределено); + + // Оформление. + ЭлементОформления = Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить(); + ЭлементОформления.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; + + ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", Строка(Тип)); + + ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = ПустаяСсылкаТипа; + ЭлементОтбора.Использование = Истина; + + ЭлементПоля = ЭлементОформления.Поля.Элементы.Добавить(); + ЭлементПоля.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); + ЭлементПоля.Использование = Истина; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + #КонецЕсли diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..2a483a3d8 --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,134 @@ + + + + ТипЗначенийДоступа + 11 + true + true + + true + + + Запись.ТипЗначенийДоступа + + + ТипЗначенийДоступаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТипЗначенийДоступаКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ФормаВключитьВозможностьРедактирования + 9 + true + true + + true + + + ФормаВключитьВозможностьРедактированияExtendedTooltip + 10 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ИспользуемыеВидыДоступа + + + true + + + true + +
      true
      + true +
      + + ВключитьВозможностьРедактирования + + <key>ru</key> + <value>Включить возможность редактирования</value> + + 1 + + ru + Включить возможность редактирования только для целей поиска неисправности (требуется углубленное понимание работы механизма) + + + true + + + + ВключитьВозможностьРедактирования + + + DontUse + Auto + + + + + + +
      diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..841c970be --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТолькоПросмотр = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ВключитьВозможностьРедактирования(Команда) + + ТолькоПросмотр = Ложь; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..6d2c96e82 --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Form.form @@ -0,0 +1,389 @@ + + + + ГруппаПользовательскихНастроек + 30 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + + ГруппаПользовательскихНастроекРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + КоманднаяПанель + 32 + + ФормаОбновитьДанныеРегистра + 13 + true + true + + true + + + ФормаОбновитьДанныеРегистраExtendedTooltip + 14 + Label + true + true + + Left + + + Form.Command.ОбновитьДанныеРегистра + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаВключитьВозможностьРедактирования + 12 + true + true + + true + + + ФормаВключитьВозможностьРедактированияExtendedTooltip + 15 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Список + 1 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + Copy + + ТипЗначенийДоступа + 43 + true + true + + true + + + Список.ТипЗначенийДоступа + + + ТипЗначенийДоступаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ТипЗначенийДоступаКонтекстноеМеню + 44 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокSearchString + 34 + + СписокSearchStringExtendedTooltip + 36 + Label + true + true + + Left + + + + СписокSearchStringContextMenu + 35 + true + + Список + + true + + + + СписокViewStatus + 37 + + СписокViewStatusExtendedTooltip + 39 + Label + true + true + + Left + + + + СписокViewStatusContextMenu + 38 + true + + ViewStatusAddition + Список + + true + + + + СписокSearchControl + 40 + + СписокSearchControlExtendedTooltip + 42 + Label + true + true + + Left + + + + СписокSearchControlContextMenu + 41 + true + + SearchControlAddition + Список + + true + + + + СписокExtendedTooltip + 16 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + ГруппаПользовательскихНастроек + +
      + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
      true
      + + InformationRegister.ИспользуемыеВидыДоступа + true + true + true + true + +
      + + ВключитьВозможностьРедактирования + + <key>ru</key> + <value>Включить возможность редактирования</value> + + 1 + + ru + Включить возможность редактирования только для целей поиска неисправности (требуется углубленное понимание работы механизма) + + + true + + + + ВключитьВозможностьРедактирования + + + DontUse + Auto + + + ОбновитьДанныеРегистра + + <key>ru</key> + <value>Обновить данные регистра</value> + + 2 + + ru + Обновить данные регистра + + + true + + + + ОбновитьДанныеРегистра + + + DontUse + Auto + + + + + + +
      diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..5320e001c --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + + ТолькоПросмотр = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ВключитьВозможностьРедактирования(Команда) + + ТолькоПросмотр = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьДанныеРегистра(Команда) + + ЕстьИзменения = Ложь; + + ОбновитьДанныеРегистраНаСервере(ЕстьИзменения); + + Если ЕстьИзменения Тогда + Текст = НСтр("ru = 'Обновление выполнено успешно.'"); + Иначе + Текст = НСтр("ru = 'Обновление не требуется.'"); + КонецЕсли; + + ПоказатьПредупреждение(, Текст); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ОбновитьДанныеРегистраНаСервере(ЕстьИзменения) + + УстановитьПривилегированныйРежим(Истина); + + РегистрыСведений.ИспользуемыеВидыДоступа.ОбновитьДанныеРегистра(ЕстьИзменения); + + Элементы.Список.Обновить(); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьУсловноеОформление() + + Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Очистить(); + РегистрыСведений.ЗначенияГруппДоступаПоУмолчанию.ОформитьПредставлениеТипаЗначенияДоступа(Список, + "ТипЗначенийДоступа"); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/ManagerModule.bsl new file mode 100644 index 000000000..26b420843 --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/ManagerModule.bsl @@ -0,0 +1,162 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Процедура обновляет данные регистра при изменении использования видов доступа. +// +// Параметры: +// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// устанавливается Истина, иначе не изменяется. +// +Процедура ОбновитьДанныеРегистра(ЕстьИзменения = Неопределено) Экспорт + + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.СвойстваВидовДоступа(); + ИспользуемыеВидыДоступа = СоздатьНаборЗаписей().Выгрузить(); + + Для Каждого СвойстваВидаДоступа Из СвойстваВидовДоступа.Массив Цикл + + Если СвойстваВидаДоступа.Имя = "ВнешниеПользователи" + Или СвойстваВидаДоступа.Имя = "Пользователи" Тогда + // Эти виды доступа не могут быть отключены по функциональным опциям. + Используется = Истина; + Иначе + Используется = Истина; + ИнтеграцияПодсистемБСП.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); + УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); + КонецЕсли; + + Если Используется Тогда + ИспользуемыеВидыДоступа.Добавить().ТипЗначенийДоступа = СвойстваВидаДоступа.Ссылка; + КонецЕсли; + КонецЦикла; + + ТекстЗапросовВременныхТаблиц = + "ВЫБРАТЬ + | НовыеДанные.ТипЗначенийДоступа + |ПОМЕСТИТЬ НовыеДанные + |ИЗ + | &ИспользуемыеВидыДоступа КАК НовыеДанные"; + + ТекстЗапроса = + "ВЫБРАТЬ + | НовыеДанные.ТипЗначенийДоступа, + | &ПодстановкаПоляВидИзмененияСтроки + |ИЗ + | НовыеДанные КАК НовыеДанные"; + + // Подготовка выбираемых полей с необязательным отбором. + Поля = Новый Массив; + Поля.Добавить(Новый Структура("ТипЗначенийДоступа")); + + Запрос = Новый Запрос; + ИспользуемыеВидыДоступа.Свернуть("ТипЗначенийДоступа"); + Запрос.УстановитьПараметр("ИспользуемыеВидыДоступа", ИспользуемыеВидыДоступа); + + Запрос.Текст = УправлениеДоступомСлужебный.ТекстЗапросаВыбораИзменений( + ТекстЗапроса, Поля, "РегистрСведений.ИспользуемыеВидыДоступа", ТекстЗапросовВременныхТаблиц); + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("РегистрСведений.ИспользуемыеВидыДоступа"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + Данные = Новый Структура; + Данные.Вставить("МенеджерРегистра", РегистрыСведений.ИспользуемыеВидыДоступа); + Данные.Вставить("ИзмененияСоставаСтрок", Запрос.Выполнить().Выгрузить()); + + ЕстьТекущиеИзменения = Ложь; + УправлениеДоступомСлужебный.ОбновитьРегистрСведений(Данные, ЕстьТекущиеИзменения); + + Если ЕстьТекущиеИзменения Тогда + ЕстьИзменения = Истина; + ПриИзмененииИспользованияВидовДоступа(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ЗарегистрироватьИзменениеПриЗагрузке(ЭлементДанных) Экспорт + + СтарыеЗначения = СоздатьНаборЗаписей(); + Если ЭлементДанных.Отбор.ТипЗначенийДоступа.Используется Тогда + СтарыеЗначения.Отбор.ТипЗначенийДоступа.Установить(ЭлементДанных.Отбор.ТипЗначенийДоступа.Значение); + КонецЕсли; + + СтарыеЗначения.Прочитать(); + + Таблица = СтарыеЗначения.Выгрузить(); + Таблица.Колонки.Добавить("ВидИзмененияСтроки", Новый ОписаниеТипов("Число")); + Таблица.ЗаполнитьЗначения(-1, "ВидИзмененияСтроки"); + + Для Каждого Запись Из ЭлементДанных Цикл + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.ВидИзмененияСтроки = 1; + НоваяСтрока.ТипЗначенийДоступа = Запись.ТипЗначенийДоступа; + КонецЦикла; + Таблица.Свернуть("ТипЗначенийДоступа", "ВидИзмененияСтроки"); + + Изменения = Новый Массив; + Для Каждого Строка Из Таблица Цикл + Если Строка.ВидИзмененияСтроки = 0 Тогда + Продолжить; + КонецЕсли; + Изменения.Добавить(Строка.ТипЗначенийДоступа); + КонецЦикла; + + Если Не ЗначениеЗаполнено(Изменения) Тогда + Возврат; + КонецЕсли; + + Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("ИспользуемыеВидыДоступа", Изменения); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ОбработатьИзменениеЗарегистрированноеПриЗагрузке() Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + // Изменение настроек прав в АРМ заблокированы и не загружаются в область данных. + Возврат; + КонецЕсли; + + Изменения = Справочники.ГруппыДоступа.ЗарегистрированныеСсылки("ИспользуемыеВидыДоступа"); + Если Изменения.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ПриИзмененииИспользованияВидовДоступа(); + + Справочники.ГруппыДоступа.ЗарегистрироватьСсылки("ИспользуемыеВидыДоступа", Null); + +КонецПроцедуры + +// Для процедур ОбновитьДанныеРегистра, ОбработатьИзменениеЗарегистрированноеПриЗагрузке. +Процедура ПриИзмененииИспользованияВидовДоступа() + + РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра(); + РегистрыСведений.ИспользуемыеВидыДоступаПоТаблицам.ОбновитьДанныеРегистра(); + + УправлениеДоступомСлужебный.ЗапланироватьОбновлениеПараметровОграниченияДоступа( + "ПриИзмененииИспользованияВидовДоступа"); + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/ИспользуемыеВидыДоступа.mdo b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/ИспользуемыеВидыДоступа.mdo new file mode 100644 index 000000000..1b2e89abc --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступа/ИспользуемыеВидыДоступа.mdo @@ -0,0 +1,93 @@ + + + + + + + + + + + + ИспользуемыеВидыДоступа + + ru + Используемые виды доступа + + InformationRegister.ИспользуемыеВидыДоступа.Form.ФормаЗаписи + InformationRegister.ИспользуемыеВидыДоступа.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + ТипЗначенийДоступа + + ru + Тип значений доступа + + + DefinedType.ЗначениеДоступа + + + ru + Тип значений доступа (пустая ссылка), который соответствует виду доступа в группе доступа. +Используемый "разрез" ограничения прав доступа для информационной базы в целом. + + + + Use + true + + true + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаЗаписи/Form.form new file mode 100644 index 000000000..cfd278db6 --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаЗаписи/Form.form @@ -0,0 +1,175 @@ + + + + Таблица + 11 + true + true + + true + + + Запись.Таблица + + + ТаблицаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТаблицаКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТипЗначенийДоступа + 14 + true + true + + true + + + Запись.ТипЗначенийДоступа + + + ТипЗначенийДоступаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТипЗначенийДоступаКонтекстноеМеню + 15 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + + ФормаВключитьВозможностьРедактирования + 9 + true + true + + true + + + ФормаВключитьВозможностьРедактированияExtendedTooltip + 10 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Запись + 1 + + InformationRegisterRecordManager.ИспользуемыеВидыДоступаПоТаблицам + + + true + + + true + +
      true
      + true +
      + + ВключитьВозможностьРедактирования + + <key>ru</key> + <value>Включить возможность редактирования</value> + + 1 + + ru + Включить возможность редактирования только для целей поиска неисправности (требуется углубленное понимание работы механизма) + + + true + + + + ВключитьВозможностьРедактирования + + + DontUse + Auto + + + + + + +
      diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаЗаписи/Module.bsl new file mode 100644 index 000000000..841c970be --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаЗаписи/Module.bsl @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТолькоПросмотр = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ВключитьВозможностьРедактирования(Команда) + + ТолькоПросмотр = Ложь; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..61e6fb4bb --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,17 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..f422bfaff --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Form.form @@ -0,0 +1,425 @@ + + + + ГруппаПользовательскихНастроек + 30 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + + ГруппаПользовательскихНастроекРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + КоманднаяПанель + 32 + + ФормаОбновитьДанныеРегистра + 13 + true + true + + true + + + ФормаОбновитьДанныеРегистраExtendedTooltip + 14 + Label + true + true + + Left + + + Form.Command.ОбновитьДанныеРегистра + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаВключитьВозможностьРедактирования + 12 + true + true + + true + + + ФормаВключитьВозможностьРедактированияExtendedTooltip + 15 + Label + true + true + + Left + + + Form.Command.ВключитьВозможностьРедактирования + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + + Список + 1 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + Copy + + Таблица + 43 + true + true + + true + + + Список.Таблица + + + ТаблицаРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ТаблицаКонтекстноеМеню + 44 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ТипЗначенийДоступа + 46 + true + true + + true + + + Список.ТипЗначенийДоступа + + + ТипЗначенийДоступаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + + ТипЗначенийДоступаКонтекстноеМеню + 47 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокSearchString + 34 + + СписокSearchStringExtendedTooltip + 36 + Label + true + true + + Left + + + + СписокSearchStringContextMenu + 35 + true + + Список + + true + + + + СписокViewStatus + 37 + + СписокViewStatusExtendedTooltip + 39 + Label + true + true + + Left + + + + СписокViewStatusContextMenu + 38 + true + + ViewStatusAddition + Список + + true + + + + СписокSearchControl + 40 + + СписокSearchControlExtendedTooltip + 42 + Label + true + true + + Left + + + + СписокSearchControlContextMenu + 41 + true + + SearchControlAddition + Список + + true + + + + СписокExtendedTooltip + 16 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + true + MultiRow +
      true
      + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + ExpandTopLevel + true + true + true + + Список.DefaultPicture + + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + ГруппаПользовательскихНастроек + +
      + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Copy + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Список + 1 + + DynamicList + + + true + + + true + +
      true
      + + InformationRegister.ИспользуемыеВидыДоступаПоТаблицам + true + true + true + true + +
      + + ВключитьВозможностьРедактирования + + <key>ru</key> + <value>Включить возможность редактирования</value> + + 1 + + ru + Включить возможность редактирования только для целей поиска неисправности (требуется углубленное понимание работы механизма) + + + true + + + + ВключитьВозможностьРедактирования + + + DontUse + Auto + + + ОбновитьДанныеРегистра + + <key>ru</key> + <value>Обновить данные регистра</value> + + 2 + + ru + Обновить данные регистра + + + true + + + + ОбновитьДанныеРегистра + + + DontUse + Auto + + + + + + +
      diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Module.bsl new file mode 100644 index 000000000..219da0f2d --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УстановитьУсловноеОформление(); + + ТолькоПросмотр = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ВключитьВозможностьРедактирования(Команда) + + ТолькоПросмотр = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьДанныеРегистра(Команда) + + ЕстьИзменения = Ложь; + + ОбновитьДанныеРегистраНаСервере(ЕстьИзменения); + + Если ЕстьИзменения Тогда + Текст = НСтр("ru = 'Обновление выполнено успешно.'"); + Иначе + Текст = НСтр("ru = 'Обновление не требуется.'"); + КонецЕсли; + + ПоказатьПредупреждение(, Текст); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ОбновитьДанныеРегистраНаСервере(ЕстьИзменения) + + УстановитьПривилегированныйРежим(Истина); + + РегистрыСведений.ИспользуемыеВидыДоступаПоТаблицам.ОбновитьДанныеРегистра(, ЕстьИзменения); + + Элементы.Список.Обновить(); + +КонецПроцедуры + +&НаСервере +Процедура УстановитьУсловноеОформление() + + Список.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Очистить(); + РегистрыСведений.ЗначенияГруппДоступаПоУмолчанию.ОформитьПредставлениеТипаЗначенияДоступа(Список, + "ТипЗначенийДоступа"); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/ManagerModule.bsl b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/ManagerModule.bsl new file mode 100644 index 000000000..1bec0602a --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/ManagerModule.bsl @@ -0,0 +1,109 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// Процедура обновляет данные регистра при изменении использования видов доступа. +// +// Параметры: +// Таблицы - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// - Массив - значения указанных выше типов. +// - Неопределено - без отбора. +// +// ТипыЗначенийДоступа - ОпределяемыйТип.ЗначениеДоступа +// - Массив - значения указанного выше типа. +// - Неопределено - без отбора. +// +// ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, +// устанавливается Истина, иначе не изменяется. +// +Процедура ОбновитьДанныеРегистра(Таблицы = Неопределено, ТипыЗначенийДоступа = Неопределено, + ЕстьИзменения = Неопределено) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТаблицыГруппДоступа.Таблица КАК Таблица, + | ЗначенияГруппДоступаПоУмолчанию.ТипЗначенийДоступа КАК ТипЗначенийДоступа, + | &ПодстановкаПоляВидИзмененияСтроки + |ИЗ + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияГруппДоступаПоУмолчанию + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ИспользуемыеВидыДоступа КАК ИспользуемыеВидыДоступа + | ПО (ИспользуемыеВидыДоступа.ТипЗначенийДоступа = ЗначенияГруппДоступаПоУмолчанию.ТипЗначенийДоступа) + | И (НЕ ЗначенияГруппДоступаПоУмолчанию.ВсеРазрешеныБезИсключений) + | И (&УсловиеОтбораТиповЗначений1) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа + | ПО (ТаблицыГруппДоступа.ГруппаДоступа = ЗначенияГруппДоступаПоУмолчанию.ГруппаДоступа) + | И (ВЫБОР + | КОГДА ТаблицыГруппДоступа.ПравоДобавление + | ТОГДА НЕ ТаблицыГруппДоступа.ПравоДобавлениеБезОграничения + | КОГДА ТаблицыГруппДоступа.ПравоИзменение + | ТОГДА НЕ ТаблицыГруппДоступа.ПравоИзменениеБезОграничения + | ИНАЧЕ НЕ ТаблицыГруппДоступа.ПравоЧтениеБезОграничения + | КОНЕЦ) + | И (&УсловиеОтбораТаблиц1)"; + + // Подготовка выбираемых полей с необязательным отбором. + Поля = Новый Массив; + Поля.Добавить(Новый Структура("Таблица", "&УсловиеОтбораТаблиц2")); + Поля.Добавить(Новый Структура("ТипЗначенийДоступа", "&УсловиеОтбораТиповЗначений2")); + + Запрос = Новый Запрос; + Запрос.Текст = УправлениеДоступомСлужебный.ТекстЗапросаВыбораИзменений( + ТекстЗапроса, Поля, "РегистрСведений.ИспользуемыеВидыДоступаПоТаблицам"); + + УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, Таблицы, "Таблицы", + "&УсловиеОтбораТаблиц1:ТаблицыГруппДоступа.Таблица + |&УсловиеОтбораТаблиц2:СтарыеДанные.Таблица"); + + УправлениеДоступомСлужебный.УстановитьУсловиеОтбораВЗапросе(Запрос, ТипыЗначенийДоступа, "ТипыЗначенийДоступа", + "&УсловиеОтбораТиповЗначений1:ЗначенияГруппДоступаПоУмолчанию.ТипЗначенийДоступа + |&УсловиеОтбораТиповЗначений2:СтарыеДанные.ТипЗначенийДоступа"); + + Если ТипыЗначенийДоступа <> Неопределено + И Таблицы = Неопределено Тогда + + ИзмеренияОтбора = "ТипЗначенийДоступа"; + Иначе + ИзмеренияОтбора = Неопределено; + КонецЕсли; + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("РегистрСведений.ИспользуемыеВидыДоступаПоТаблицам"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + Данные = Новый Структура; + Данные.Вставить("МенеджерРегистра", РегистрыСведений.ИспользуемыеВидыДоступаПоТаблицам); + Данные.Вставить("ИзмененияСоставаСтрок", Запрос.Выполнить().Выгрузить()); + Данные.Вставить("ИзмеренияОтбора", ИзмеренияОтбора); + + ЕстьТекущиеИзменения = Ложь; + УправлениеДоступомСлужебный.ОбновитьРегистрСведений(Данные, ЕстьТекущиеИзменения); + + Если ЕстьТекущиеИзменения Тогда + ЕстьИзменения = Истина; + УправлениеДоступомСлужебный.ЗапланироватьОбновлениеПараметровОграниченияДоступа( + "ПриИзмененииИспользованияВидовДоступаПоТаблицам"); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти + +#КонецЕсли diff --git a/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/ИспользуемыеВидыДоступаПоТаблицам.mdo b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/ИспользуемыеВидыДоступаПоТаблицам.mdo new file mode 100644 index 000000000..41cfc1885 --- /dev/null +++ b/SSL/src/InformationRegisters/ИспользуемыеВидыДоступаПоТаблицам/ИспользуемыеВидыДоступаПоТаблицам.mdo @@ -0,0 +1,117 @@ + + + + + + + + + + + + ИспользуемыеВидыДоступаПоТаблицам + + ru + Используемые виды доступа по таблицам + + InformationRegister.ИспользуемыеВидыДоступаПоТаблицам.Form.ФормаЗаписи + InformationRegister.ИспользуемыеВидыДоступаПоТаблицам.Form.ФормаСписка + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Таблица + + ru + Таблица + + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + ru + Идентификатор объекта метаданных для которого в одной из ролей профиля заданы права доступа с ограничением на уровне записей. + + + + ShowError + Use + true + + Catalog.ИдентификаторыОбъектовМетаданных.EmptyRef + + true + + + ТипЗначенийДоступа + + ru + Тип значений доступа + + + DefinedType.ЗначениеДоступа + + + ru + Тип значений доступа (пустая ссылка), который соответствует виду доступа в группе доступа. +Возможный используемый "разрез" ограничения прав доступа для таблицы, вычисленный по настройкам видов доступа в профилях и группах доступа. + + + + Use + true + + true + true + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ФормаЗаписи + + ru + Форма записи + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаЗаписи/Form.form index a2bd3d2ce..b2742df07 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаЗаписи/Form.form @@ -83,7 +83,7 @@
      - Изменение + ПравоИзменение 7 true true @@ -91,11 +91,11 @@ true - Запись.Изменение + Запись.ПравоИзменение Right - ИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 9 Label true @@ -105,7 +105,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 8 true @@ -117,7 +117,7 @@ - Добавление + ПравоДобавление 12 true true @@ -125,11 +125,11 @@ true - Запись.Добавление + Запись.ПравоДобавление Right - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 14 Label true @@ -139,7 +139,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 13 true diff --git a/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаСписка/Form.form index 3f808cd32..0626157c4 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/Forms/ФормаСписка/Form.form @@ -219,7 +219,7 @@ - Изменение + ПравоИзменение 22 true true @@ -227,11 +227,11 @@ true - Список.Изменение + Список.ПравоИзменение true - ИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 24 Label true @@ -241,7 +241,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 23 true @@ -253,7 +253,7 @@ - Добавление + ПравоДобавление 29 true true @@ -261,10 +261,10 @@ true - Список.Добавление + Список.ПравоДобавление - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 31 Label true @@ -274,7 +274,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 30 true @@ -488,8 +488,8 @@ КОНЕЦ КАК ТипЭлементовНабора, КлючиДоступаВнешнихПользователей.ВнешнийПользователь КАК ВнешнийПользователь, КлючиДоступаВнешнихПользователей.КлючДоступа КАК КлючДоступа, - КлючиДоступаВнешнихПользователей.Изменение КАК Изменение, - КлючиДоступаВнешнихПользователей.Добавление КАК Добавление, + КлючиДоступаВнешнихПользователей.ПравоИзменение КАК ПравоИзменение, + КлючиДоступаВнешнихПользователей.ПравоДобавление КАК ПравоДобавление, КлючиДоступаВнешнихПользователей.ЭтоПраваНабораГрупп КАК ЭтоПраваНабораГрупп ИЗ РегистрСведений.КлючиДоступаВнешнихПользователей КАК КлючиДоступаВнешнихПользователей diff --git a/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/КлючиДоступаВнешнихПользователей.mdo b/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/КлючиДоступаВнешнихПользователей.mdo index 1e162df93..d6baaba75 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/КлючиДоступаВнешнихПользователей.mdo +++ b/SSL/src/InformationRegisters/КлючиДоступаВнешнихПользователей/КлючиДоступаВнешнихПользователей.mdo @@ -56,10 +56,10 @@ Ключ доступа внешнего пользователя - Изменение + ПравоИзменение ru - Изменение + Право изменение Boolean @@ -75,10 +75,10 @@ - Добавление + ПравоДобавление ru - Добавление + Право добавление Boolean diff --git a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаЗаписи/Form.form index 3cb576baf..8ffcdced4 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаЗаписи/Form.form @@ -83,7 +83,7 @@ - Изменение + ПравоИзменение 7 true true @@ -91,11 +91,11 @@ true - Запись.Изменение + Запись.ПравоИзменение Right - ИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 9 Label true @@ -105,7 +105,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 8 true @@ -117,7 +117,7 @@ - Добавление + ПравоДобавление 12 true true @@ -125,11 +125,11 @@ true - Запись.Добавление + Запись.ПравоДобавление Right - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 14 Label true @@ -139,7 +139,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 13 true diff --git a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form index 3ef8414c4..487183094 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/Forms/ФормаСписка/Form.form @@ -219,7 +219,7 @@ - Изменение + ПравоИзменение 22 true true @@ -227,11 +227,11 @@ true - Список.Изменение + Список.ПравоИзменение true - ИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 24 Label true @@ -241,7 +241,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 23 true @@ -253,7 +253,7 @@ - Добавление + ПравоДобавление 29 true true @@ -261,10 +261,10 @@ true - Список.Добавление + Список.ПравоДобавление - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 31 Label true @@ -274,7 +274,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 30 true @@ -449,8 +449,8 @@ ТИПЗНАЧЕНИЯ(КлючиДоступаГруппДоступа.ГруппаДоступа) КАК ТипГрупп, КлючиДоступаГруппДоступа.ГруппаДоступа КАК ГруппаДоступа, КлючиДоступаГруппДоступа.КлючДоступа КАК КлючДоступа, - КлючиДоступаГруппДоступа.Изменение КАК Изменение, - КлючиДоступаГруппДоступа.Добавление КАК Добавление + КлючиДоступаГруппДоступа.ПравоИзменение КАК ПравоИзменение, + КлючиДоступаГруппДоступа.ПравоДобавление КАК ПравоДобавление ИЗ РегистрСведений.КлючиДоступаГруппДоступа КАК КлючиДоступаГруппДоступа InformationRegister.КлючиДоступаГруппДоступа diff --git a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/КлючиДоступаГруппДоступа.mdo b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/КлючиДоступаГруппДоступа.mdo index 04872c92e..4f69c31ad 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/КлючиДоступаГруппДоступа.mdo +++ b/SSL/src/InformationRegisters/КлючиДоступаГруппДоступа/КлючиДоступаГруппДоступа.mdo @@ -56,10 +56,10 @@ Ключ доступа группы доступа - Изменение + ПравоИзменение ru - Изменение + Право изменение Boolean @@ -75,10 +75,10 @@ - Добавление + ПравоДобавление ru - Добавление + Право добавление Boolean diff --git a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаЗаписи/Form.form index 4c3f7654f..6847d502b 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаЗаписи/Form.form @@ -83,7 +83,7 @@ - Изменение + ПравоИзменение 7 true true @@ -91,11 +91,11 @@ true - Запись.Изменение + Запись.ПравоИзменение Right - ИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 9 Label true @@ -105,7 +105,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 8 true @@ -117,7 +117,7 @@ - Добавление + ПравоДобавление 12 true true @@ -125,11 +125,11 @@ true - Запись.Добавление + Запись.ПравоДобавление Right - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 14 Label true @@ -139,7 +139,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 13 true diff --git a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form index b66e59600..40de74f89 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/Forms/ФормаСписка/Form.form @@ -181,7 +181,7 @@ - Изменение + ПравоИзменение 22 true true @@ -189,11 +189,11 @@ true - Список.Изменение + Список.ПравоИзменение true - ИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 24 Label true @@ -203,7 +203,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 23 true @@ -215,7 +215,7 @@ - Добавление + ПравоДобавление 29 true true @@ -223,10 +223,10 @@ true - Список.Добавление + Список.ПравоДобавление - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 31 Label true @@ -236,7 +236,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 30 true diff --git a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/КлючиДоступаНаборовГруппДоступа.mdo b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/КлючиДоступаНаборовГруппДоступа.mdo index e8c8c866a..0ea09b493 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/КлючиДоступаНаборовГруппДоступа.mdo +++ b/SSL/src/InformationRegisters/КлючиДоступаНаборовГруппДоступа/КлючиДоступаНаборовГруппДоступа.mdo @@ -56,10 +56,10 @@ Ключ доступа набора групп доступа - Изменение + ПравоИзменение ru - Изменение + Право изменение Boolean @@ -75,10 +75,10 @@ - Добавление + ПравоДобавление ru - Добавление + Право добавление Boolean diff --git a/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаЗаписи/Form.form index 58c1d9af1..2922c2c72 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаЗаписи/Form.form @@ -91,7 +91,7 @@ true - Запись.Изменение + Запись.ПравоИзменение Right @@ -125,7 +125,7 @@ true - Запись.Добавление + Запись.ПравоДобавление Right diff --git a/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form index 8afb13d3b..a3677cbee 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/КлючиДоступаПользователей/Forms/ФормаСписка/Form.form @@ -219,7 +219,7 @@ - Изменение + ПравоИзменение 22 true true @@ -227,11 +227,11 @@ true - Список.Изменение + Список.ПравоИзменение true - ИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 24 Label true @@ -241,7 +241,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 23 true @@ -253,7 +253,7 @@ - Добавление + ПравоДобавление 29 true true @@ -261,10 +261,10 @@ true - Список.Добавление + Список.ПравоДобавление - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 31 Label true @@ -274,7 +274,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 30 true @@ -488,8 +488,8 @@ КОНЕЦ КАК ТипЭлементовНабора, КлючиДоступаПользователей.Пользователь КАК Пользователь, КлючиДоступаПользователей.КлючДоступа КАК КлючДоступа, - КлючиДоступаПользователей.Изменение КАК Изменение, - КлючиДоступаПользователей.Добавление КАК Добавление, + КлючиДоступаПользователей.ПравоИзменение КАК ПравоИзменение, + КлючиДоступаПользователей.ПравоДобавление КАК ПравоДобавление, КлючиДоступаПользователей.ЭтоПраваНабораГрупп КАК ЭтоПраваНабораГрупп ИЗ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаПользователей diff --git a/SSL/src/InformationRegisters/КлючиДоступаПользователей/КлючиДоступаПользователей.mdo b/SSL/src/InformationRegisters/КлючиДоступаПользователей/КлючиДоступаПользователей.mdo index 8c79aaf53..efedfb49f 100644 --- a/SSL/src/InformationRegisters/КлючиДоступаПользователей/КлючиДоступаПользователей.mdo +++ b/SSL/src/InformationRegisters/КлючиДоступаПользователей/КлючиДоступаПользователей.mdo @@ -56,10 +56,10 @@ Ключ доступа пользователя - Изменение + ПравоИзменение ru - Изменение + Право изменение Boolean @@ -75,10 +75,10 @@ - Добавление + ПравоДобавление ru - Добавление + Право добавление Boolean diff --git a/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl b/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl index b92bc390f..4198151eb 100644 --- a/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/КодировкиФайлов/ManagerModule.bsl @@ -13,7 +13,7 @@ // Возвращает кодировку версии файла. // // Параметры: -// ВерсияСсылка - ОпределяемыйТип.ПрисоединенныеФайлы - версия файла. +// ВерсияСсылка - ОпределяемыйТип.ПрисоединенныйФайл - версия файла. // // Возвращаемое значение: // Строка @@ -33,7 +33,7 @@ // Записывает кодировку версии файла. // // Параметры: -// ВерсияСсылка - ОпределяемыйТип.ПрисоединенныеФайлы - ссылка на версию файла. +// ВерсияСсылка - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на версию файла. // Кодировка - Строка - новая кодировка версии файла. // Процедура ЗаписатьКодировкуВерсииФайла(ВерсияСсылка, Кодировка) Экспорт @@ -50,7 +50,7 @@ // Автоматически определяет и возвращает кодировку текстового файла. // // Параметры: -// ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныеФайлы +// ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл // Расширение - Строка - расширение файла. // // Возвращаемое значение: @@ -94,7 +94,7 @@ // файл содержит сигнатуру BOM в начале. // // Параметры: -// ДвоичныеДанные - двоичные данные файла. +// ДвоичныеДанные - ДвоичныеДанные - двоичные данные файла. // // Возвращаемое значение: // Строка - кодировка файла. Если файл не содержит сигнатуру BOM, @@ -113,10 +113,10 @@ // файл содержит объявление XML. // // Параметры: -// ДвоичныеДанные - двоичные данные файла. +// ДвоичныеДанные - ДвоичныеДанные- двоичные данные файла. // // Возвращаемое значение: -// КодировкаXML - Строка - кодировка файла. Если невозможно прочитать +// Строка - кодировка файла. Если невозможно прочитать // объявление XML, возвращает пустую строку. // Функция КодировкаИзОбъявленияXML(ДвоичныеДанные) @@ -141,10 +141,10 @@ // Возвращает кодировку текста, полученную из сигнатуры BOM в начале. // // Параметры: -// БуферДвоичныхДанных - коллекция байтов для определения кодировки. +// БуферДвоичныхДанных - Число - коллекция байтов для определения кодировки. // // Возвращаемое значение: -// Кодировка - Строка - кодировка файла. Если файл не содержит сигнатуру BOM, +// Строка - кодировка файла. Если файл не содержит сигнатуру BOM, // возвращает пустую строку. // Функция КодировкаBOM(БуферДвоичныхДанных) @@ -213,7 +213,7 @@ // ДанныеТекста - ДвоичныеДанные - двоичные данные файла. // // Возвращаемое значение: -// СоответствующаяКодировка - Строка - кодировка файла. +// Строка - кодировка файла. // Функция КодировкаИзСоответствияАлфавиту(ДанныеТекста) diff --git a/SSL/src/InformationRegisters/КодировкиФайлов/RecordSetModule.bsl b/SSL/src/InformationRegisters/КодировкиФайлов/RecordSetModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form index 8d17ecd85..fbbc9662f 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Form.form @@ -1179,6 +1179,10 @@ DontUse Auto + + Источник + + diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl index 591f46f33..6125eaa10 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Module.bsl @@ -15,7 +15,7 @@ Объект.Пользователь = Пользователи.ТекущийПользователь(); - Если Параметры.Свойство("Источник") Тогда + Если ЗначениеЗаполнено(Параметры.Источник) Тогда Объект.Источник = Параметры.Источник; Объект.Описание = ОбщегоНазначения.ПредметСтрокой(Объект.Источник); КонецЕсли; @@ -130,7 +130,8 @@ ВыбранныйСпособ = ПолучитьКлючПоЗначениюВСоответствии(ПредопределенныеСпособыОповещения, Объект.СпособУстановкиВремениНапоминания); Если Объект.СпособУстановкиВремениНапоминания = ПредопределенноеЗначение("Перечисление.СпособыУстановкиВремениНапоминания.ОтносительноТекущегоВремени") Тогда - СпособУстановкиВремениНапоминания = НСтр("ru = 'через'") + " " + НапоминанияПользователяКлиент.ПредставлениеВремени(Объект.ИнтервалВремениНапоминания); + СпособУстановкиВремениНапоминания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'через %1'"), НапоминанияПользователяКлиент.ПредставлениеВремени(Объект.ИнтервалВремениНапоминания)); Иначе СпособУстановкиВремениНапоминания = ВыбранныйСпособ; КонецЕсли; @@ -189,7 +190,8 @@ ИнтервалВремени = НапоминанияПользователяКлиент.ПолучитьИнтервалВремениИзСтроки(СпособУстановкиВремениНапоминания); Если ИнтервалВремени > 0 Тогда ИнтервалВремениСтрокой = НапоминанияПользователяКлиент.ПредставлениеВремени(ИнтервалВремени); - СпособУстановкиВремениНапоминания = НСтр("ru = 'через'") + " " + ИнтервалВремениСтрокой; + СпособУстановкиВремениНапоминания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'через %1'"), ИнтервалВремениСтрокой); Иначе Если Элементы.СпособУстановкиВремениНапоминания.СписокВыбора.НайтиПоЗначению(СпособУстановкиВремениНапоминания) = Неопределено Тогда ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Интервал времени не определен.'"), , "СпособУстановкиВремениНапоминания"); @@ -324,9 +326,12 @@ &НаКлиенте Функция ПолучитьПредопределенныеСпособыОповещения() Результат = Новый Соответствие; - Результат.Вставить(НСтр("ru = 'относительно предмета'"), ПредопределенноеЗначение("Перечисление.СпособыУстановкиВремениНапоминания.ОтносительноВремениПредмета")); - Результат.Вставить(НСтр("ru = 'в указанное время'"), ПредопределенноеЗначение("Перечисление.СпособыУстановкиВремениНапоминания.ВУказанноеВремя")); - Результат.Вставить(НСтр("ru = 'периодически'"), ПредопределенноеЗначение("Перечисление.СпособыУстановкиВремениНапоминания.Периодически")); + Результат.Вставить(НСтр("ru = 'относительно предмета'"), + ПредопределенноеЗначение("Перечисление.СпособыУстановкиВремениНапоминания.ОтносительноВремениПредмета")); + Результат.Вставить(НСтр("ru = 'в указанное время'"), + ПредопределенноеЗначение("Перечисление.СпособыУстановкиВремениНапоминания.ВУказанноеВремя")); + Результат.Вставить(НСтр("ru = 'периодически'"), + ПредопределенноеЗначение("Перечисление.СпособыУстановкиВремениНапоминания.Периодически")); Возврат Результат; КонецФункции @@ -341,7 +346,8 @@ Элементы.ИнтервалВремениОтносительноИсточника.СписокВыбора.Очистить(); ИнтервалыВремени = НастройкиПодсистемы.СтандартныеИнтервалы; Для Каждого Интервал Из ИнтервалыВремени Цикл - СпособыОповещения.Добавить(НСтр("ru = 'через'") + " " + Интервал); + СпособыОповещения.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'через %1'"), Интервал)); Элементы.ИнтервалВремениОтносительноИсточника.СписокВыбора.Добавить(Интервал); КонецЦикла; КонецПроцедуры @@ -352,7 +358,8 @@ Для Час = 0 По 23 Цикл Для Период = 0 По 1 Цикл Время = Час*60*60 + Период*30*60; - Элементы.Время.СписокВыбора.Добавить(НачалоДня(Объект.ВремяСобытия) + Время, "" + Час + ":" + Формат(Период*30,"ЧЦ=2; ЧН=00")); + Элементы.Время.СписокВыбора.Добавить(НачалоДня(Объект.ВремяСобытия) + Время, + "" + Час + ":" + Формат(Период*30,"ЧЦ=2; ЧН=00")); КонецЦикла; КонецЦикла; КонецПроцедуры diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form index 9fee9c42f..a50f0d595 100644 --- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form +++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Form.form @@ -523,10 +523,6 @@ true - - <key>ru</key> - <value>Действия с напоминаниями</value> - true ДействияСНапоминаниямиExtendedTooltip @@ -626,10 +622,6 @@ true - - <key>ru</key> - <value>Действия со списком</value> - true ДействияСоСпискомExtendedTooltip diff --git a/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl b/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl index 49a53d880..4d541d3f6 100644 --- a/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl @@ -15,13 +15,12 @@ // // Параметры: // ВладельцыНастроекПрав - ОпределяемыйТип.ВладелецНастроекПрав - например, СправочникСсылка.ПапкиФайлов -// или другого типа, по которым права настраиваются непосредственно. -// - тип владельца прав, например Тип("СправочникСсылка.ПапкиФайлов"). -// - массив значений указанных выше типов. +// или другой тип, по которому права настраиваются непосредственно. +// - Массив - массив значений указанных выше типов. // - Неопределено - без отбора для всех типов. -// - объект, например, СправочникОбъект.ПапкиФайлов, при передаче -// объекта обновление будет только, если объект перед записью и -// он изменился (родитель изменен). +// - ОпределяемыйТип.ВладелецНастроекПравОбъект - например, СправочникОбъект.ПапкиФайлов, +// при передаче объекта обновление будет если только объект в состоянии перед записью и +// родитель изменен. // // ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, // устанавливается Истина, иначе не изменяется. diff --git a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form index 17fea4ba8..d1f854d7c 100644 --- a/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/НастройкиОчисткиФайлов/Forms/ФормаЗаписи/Form.form @@ -317,10 +317,6 @@ true - - <key>ru</key> - <value>Командная панель</value> - ГруппаКоманднаяПанельРасширеннаяПодсказка 35 diff --git a/SSL/src/InformationRegisters/НастройкиПравОбъектов/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиПравОбъектов/ManagerModule.bsl index c1352cf14..cbfec939e 100644 --- a/SSL/src/InformationRegisters/НастройкиПравОбъектов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НастройкиПравОбъектов/ManagerModule.bsl @@ -94,22 +94,25 @@ // // Возвращаемое значение: // Структура: -// Наследовать - Булево - флажок наследования настроек прав родителей. -// Настройки - ТаблицаЗначений: -// * ВладелецНастройки - ОпределяемыйТип.ВладелецНастроекПрав - ссылка на объект -// или родителя объекта (из иерархии родителей объекта) -// * НаследованиеРазрешено - Булево - разрешено наследование. -// * Пользователь - СправочникСсылка.Пользователи -// СправочникСсылка.ГруппыПользователей -// СправочникСсылка.ВнешниеПользователи -// СправочникСсылка.ГруппыВнешнихПользователей. -// * <ИмяПрава1> - Неопределено -// - Булево - +// * Наследовать - Булево - флажок наследования настроек прав родителей. +// * Настройки - ТаблицаЗначений: +// ** ВладелецНастройки - ОпределяемыйТип.ВладелецНастроекПрав - ссылка на объект +// или родителя объекта (из иерархии родителей объекта). +// ** НаследованиеРазрешено - Булево - разрешено наследование. +// ** Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ВнешниеПользователи +// - СправочникСсылка.ГруппыВнешнихПользователей. +// +// Имена прав, указанные в переопределяемой +// процедуре ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов: +// # <ИмяПрава1> = Неопределено +// = Булево - // Неопределено - право не настроено, // Истина - право разрешено, // Ложь - право запрещено. -// * <ИмяПрава2> - Неопределено -// - Булево +// # <ИмяПрава2> = Неопределено +// = Булево - аналогично. // Функция Прочитать(Знач СсылкаНаОбъект) Экспорт @@ -249,13 +252,16 @@ // СправочникСсылка.ГруппыПользователей // СправочникСсылка.ВнешниеПользователи // СправочникСсылка.ГруппыВнешнихПользователей. -// * <ИмяПрава1> - Неопределено -// - Булево - +// +// Имена прав, указанные в переопределяемой +// процедуре ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов: +// # <ИмяПрава1> = Неопределено +// = Булево - // Неопределено - право не настроено, // Истина - право разрешено, // Ложь - право запрещено. -// * <ИмяПрава2> - Неопределено -// - Булево +// # <ИмяПрава2> = Неопределено +// = Булево - аналогично. // // Наследовать - Булево - флажок наследования настроек прав родителей. // @@ -442,7 +448,7 @@ Отбор = Новый Структура; Для каждого КлючИЗначение Из ВозможныеПрава.ПоТипамСсылок Цикл ТипВладельцаПрав = КлючИЗначение.Ключ; - ОписаниеПрав = КлючИЗначение.Значение; // Массив из см. СвойстваВозможногоПрава + ОписаниеПрав = КлючИЗначение.Значение; // ФиксированныйМассив из см. СвойстваВозможногоПрава Если ПустыеСсылкиВладелецПрав.Получить(ТипВладельцаПрав) = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -655,11 +661,11 @@ // ** Значение - см. СвойстваВозможногоПрава // * ПоТипамСсылок - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип - тип ссылки из ОпределяемыйТип.ВладельцыНастроекПрав -// * Значение - Массив из см. СвойстваВозможногоПрава +// * Значение - ФиксированныйМассив из см. СвойстваВозможногоПрава // * ПоПолнымИменам - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - владелец прав (полное имя таблицы) // * Значение - см. СвойстваВозможногоПрава -// * ТипыВладельцев - Массив из ОпределяемыйТип.ВладелецНастроекПрав +// * ТипыВладельцев - ФиксированныйМассив из ОпределяемыйТип.ВладелецНастроекПрав // * ОтдельныеТаблицы - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных // - СправочникСсылка.ИдентификаторыОбъектовРасширений - идентификатор таблицы @@ -793,13 +799,14 @@ ИндексыПравВладельцев = Новый Соответствие; - Для каждого ВозможноеПраво Из ВозможныеПрава Цикл + Для Каждого ВозможноеПраво Из ВозможныеПрава Цикл ОбъектМетаданныхВладельца = Метаданные.НайтиПоПолномуИмени(ВозможноеПраво.ВладелецПрав); Если ОбъектМетаданныхВладельца = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не найден владелец прав ""%1"".'"), ВозможноеПраво.ВладелецПрав); + ВызватьИсключение ТекстОшибки; КонецЕсли; ДополнительныеПараметры.ВладелецПрав = ВозможноеПраво.ВладелецПрав; @@ -819,17 +826,18 @@ ОбъектМетаданныхВладельца); Если ОпределяемыйТипВладельцевПрав.Получить(ТипСсылки) = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Тип владельца прав ""%1"" |не указан в определяемом типе ""Владелец настроек прав"".'"), Строка(ТипСсылки)); + ВызватьИсключение ТекстОшибки; КонецЕсли; Если (ТипыПодпискиЗаписатьЗависимыеНаборыЗначенийДоступа.Получить(ТипОбъекта) <> Неопределено ИЛИ ТипыПодпискиЗаписатьНаборыЗначенийДоступа.Получить(ТипОбъекта) <> Неопределено) И ОпределяемыйТипЗначенийДоступа.Получить(ТипСсылки) = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Тип владельца прав ""%1"" |не указан в определяемом типе ""Значение доступа"", |но используется для заполнения наборов значений доступа, @@ -839,32 +847,36 @@ |Требуется указать тип в определяемом типе ""Значение доступа"" |для корректного заполнения регистра НаборыЗначенийДоступа.'"), Строка(ТипСсылки)); + ВызватьИсключение ТекстОшибки; КонецЕсли; СвойстваВидаДоступа = СвойстваВидовДоступа.ПоТипамЗначений.Получить(ТипСсылки); // см. УправлениеДоступомСлужебный.СвойстваВидаДоступа Если СвойстваВидаДоступа <> Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Тип владельца прав ""%1"" |не может использоваться, как тип значений доступа, |но обнаружен в описании вида доступа ""%2"".'"), Строка(ТипСсылки), СвойстваВидаДоступа.Имя); + ВызватьИсключение ТекстОшибки; КонецЕсли; Если СвойстваВидовДоступа.ПоТипамГруппИЗначений.Получить(ТипСсылки) <> Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Тип владельца прав ""%1"" |не может использоваться, как тип групп значений доступа, |но обнаружен в описании вида доступа ""%2"".'"), Строка(ТипСсылки), СвойстваВидаДоступа.Имя); + ВызватьИсключение ТекстОшибки; КонецЕсли; Если ТипыПодпискиОбновитьГруппыВладельцевНастроекПрав.Получить(ТипОбъекта) = Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Тип владельца прав ""%1"" |не указан в определяемом типе ""Владелец настроек прав объект"".'"), Строка(ТипОбъекта)); + ВызватьИсключение ТекстОшибки; КонецЕсли; ПоПолнымИменам.Вставить(ВозможноеПраво.ВладелецПрав, ПраваВладельца); @@ -883,20 +895,25 @@ КонецЕсли; Если ПраваВладельца.Получить(ВозможноеПраво.Имя) <> Неопределено Тогда - ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Для владельца прав ""%1"" |повторно определено право ""%2"".'"), ВозможноеПраво.ВладелецПрав, ВозможноеПраво.Имя); + ВызватьИсключение ТекстОшибки; КонецЕсли; - // Преобразования списков требуемых прав в массивы. - Разделитель = "|"; - Для Индекс = 0 По ВозможноеПраво.ТребуемыеПрава.Количество()-1 Цикл - Если СтрНайти(ВозможноеПраво.ТребуемыеПрава[Индекс], Разделитель) > 0 Тогда - ВозможноеПраво.ТребуемыеПрава[Индекс] = СтрРазделить( - ВозможноеПраво.ТребуемыеПрава[Индекс], Разделитель, Ложь); + Для Каждого ТребуемоеПраво Из ВозможноеПраво.ТребуемыеПрава Цикл + Если ВозможныеПрава.Найти(ТребуемоеПраво, "Имя") <> Неопределено Тогда + Продолжить; КонецЕсли; + ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для права ""%1"" владельца прав ""%2"" + |указано некорректное имя требуемого права ""%3"".'"), + ВозможноеПраво.Имя, + ВозможноеПраво.ВладелецПрав, + ТребуемоеПраво); + ВызватьИсключение ТекстОшибки; КонецЦикла; СвойстваВозможногоПрава = СвойстваВозможногоПрава(ВозможноеПраво); @@ -942,13 +959,13 @@ // Возвращаемое значение: // Структура: // * ВладелецПрав - Строка -// * Имя - Строка +// * Имя - Строка // * Заголовок - Строка // * Подсказка - Строка -// * НачальноеЗначение - Булево -// * ТребуемыеПрава - Массив из Строка -// * ЧтениеВТаблицах - Массив из Строка -// * ИзменениеВТаблицах - Массив из Строка +// * НачальноеЗначение - Булево +// * ТребуемыеПрава - ФиксированныйМассив из Строка +// * ЧтениеВТаблицах - ФиксированныйМассив из Строка +// * ИзменениеВТаблицах - ФиксированныйМассив из Строка // Функция СвойстваВозможногоПрава(ВозможноеПраво) @@ -963,14 +980,23 @@ ЗаполнитьЗначенияСвойств(СвойстваВозможногоПрава, ВозможноеПраво); + СвойстваВозможногоПрава.ТребуемыеПрава = + Новый ФиксированныйМассив(СвойстваВозможногоПрава.ТребуемыеПрава); + + СвойстваВозможногоПрава.ЧтениеВТаблицах = + Новый ФиксированныйМассив(СвойстваВозможногоПрава.ЧтениеВТаблицах); + + СвойстваВозможногоПрава.ИзменениеВТаблицах = + Новый ФиксированныйМассив(СвойстваВозможногоПрава.ИзменениеВТаблицах); + Возврат СвойстваВозможногоПрава; КонецФункции // Возвращаемое значение: // Соответствие из КлючИЗначение: -// Ключ - Тип -// Значение - см. СвойстваВозможногоПрава +// * Ключ - Тип +// * Значение - см. СвойстваВозможногоПрава // Функция ПраваВладельца() diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ПростаяФормаЗаписиНастройки/Form.form b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ПростаяФормаЗаписиНастройки/Form.form index 89c60b1ba..c1705a844 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ПростаяФормаЗаписиНастройки/Form.form +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ПростаяФормаЗаписиНастройки/Form.form @@ -153,10 +153,6 @@ true - - <key>ru</key> - <value>Командная панель</value> - ГруппаКоманднаяПанельРасширеннаяПодсказка 35 diff --git a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form index d32008c25..d485ca936 100644 --- a/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form +++ b/SSL/src/InformationRegisters/НастройкиСинхронизацииФайлов/Forms/ФормаЗаписиНастройки/Form.form @@ -523,10 +523,6 @@ true - - <key>ru</key> - <value>Меню сгруппировать</value> - МенюСгруппироватьРасширеннаяПодсказка 146 @@ -716,10 +712,6 @@ true - - <key>ru</key> - <value>Контекстное меню добавить</value> - КонтекстноеМенюДобавитьРасширеннаяПодсказка 152 @@ -792,10 +784,6 @@ true - - <key>ru</key> - <value>Контекстное меню сгруппировать</value> - КонтекстноеМенюСгруппироватьРасширеннаяПодсказка 154 @@ -1008,10 +996,6 @@ true - - <key>ru</key> - <value>Командная панель</value> - ГруппаКоманднаяПанельРасширеннаяПодсказка 35 diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl index d4bd07705..0fefb0555 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Forms/ФормаЗаписи/Module.bsl @@ -11,7 +11,10 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - ЗаполнитьДоступныеВидыТранспорта(); + Перем РазрешенныеНастройкиТранспорта; + + Параметры.Свойство("РазрешенныеНастройкиТранспорта", РазрешенныеНастройкиТранспорта); + ЗаполнитьДоступныеВидыТранспорта(РазрешенныеНастройкиТранспорта); СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису = ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУстановкаПодключенияКWebСервису(); @@ -367,7 +370,7 @@ КонецПроцедуры &НаСервере -Процедура ЗаполнитьДоступныеВидыТранспорта() +Процедура ЗаполнитьДоступныеВидыТранспорта(РазрешенныеНастройкиТранспорта = Неопределено) ДоступныеВидыТранспорта.Очистить(); Элементы.ВидТранспортаСообщенийОбменаПоУмолчанию.СписокВыбора.Очистить(); @@ -387,6 +390,13 @@ Для Каждого Элемент Из ИспользуемыеТранспорты Цикл + Если ТипЗнч(РазрешенныеНастройкиТранспорта) = Тип("Массив") + И РазрешенныеНастройкиТранспорта.Найти(Элемент) = Неопределено Тогда + + Продолжить; + + КонецЕсли; + СтрокаДоступныеВидыТранспорта = ДоступныеВидыТранспорта.Добавить(); СтрокаДоступныеВидыТранспорта.ВидТранспорта = Элемент; СтрокаДоступныеВидыТранспорта.ИмяСтраницы = СтрЗаменить("НастройкиТранспорта[ВидТранспорта]", diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html index 93cba204e..d90bbf350 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/Help/ru.html @@ -3,7 +3,7 @@

      Параметры подключения также указываются во время настройки синхронизации данных в Помощнике создания синхронизации данных. Эти настройки выводятся по умолчанию. Их можно изменить.

      Перейти к настройке Параметров подключения можно по соответствующей команде из настройки синхронизации данных.

      Общими для всех являются следующие параметры:

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

        Прямое подключение:

        diff --git a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl index 79f64490a..39194d5e9 100644 --- a/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/НастройкиТранспортаОбменаДанными/ManagerModule.bsl @@ -449,6 +449,8 @@ Результат.Вставить(СписокПаролей, Пароли); КонецЕсли; + Результат.Вставить("ИдентификаторИнформационнойБазыИсточника", ""); + Возврат Результат; КонецФункции diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl index 40bedf0d9..7f042c7d5 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаНаУровнеЗаписей/Module.bsl @@ -743,6 +743,7 @@ Контекст.Вставить("ДобавленныеСтроки", Новый Массив); Контекст.Вставить("УдаленныеСтроки", Новый Соответствие); Контекст.Вставить("ИзмененныеСтроки", Новый Соответствие); + Контекст.Вставить("ОбновлениеДоступаВыполняется", Элементы.ОбновлениеДоступаВыполняется.Видимость); Попытка Статус = НачатьОбновлениеПрогрессаНаСервере(Контекст, АдресРезультата, АдресХранимыхДанных, @@ -904,8 +905,10 @@ ИдентификаторФормы, ИдентификаторЗаданияОбновленияПрогресса) Если ЗначениеЗаполнено(АдресХранимыхДанных) Тогда + ЗапускПриОткрытии = Ложь; ХранимыеДанные = ПолучитьИзВременногоХранилища(АдресХранимыхДанных); Иначе + ЗапускПриОткрытии = Истина; ХранимыеДанные = Новый Структура; ХранимыеДанные.Вставить("СтрокиСписков", Новый Соответствие); ХранимыеДанные.Вставить("СвойстваСписков", Новый Соответствие); @@ -919,9 +922,17 @@ АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы); ПараметрыПроцедуры.Вставить("ХранимыеДанные", ХранимыеДанные); + ПараметрыПроцедуры.Вставить("Версия", 1); ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(ИдентификаторФормы); ПараметрыВыполнения.ОжидатьЗавершение = 0; + Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() + Или ОбщегоНазначения.РазделениеВключено() + Или ЗапускПриОткрытии И Не Контекст.ОбновлениеДоступаВыполняется Тогда + ПараметрыВыполнения.СРасширениямиБазыДанных = Истина; + Иначе + ПараметрыВыполнения.ЗапуститьНеВФоне = Истина; + КонецЕсли; ПараметрыВыполнения.АдресРезультата = АдресРезультата; ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Управление доступом: Получение прогресса обновления доступа'"); diff --git a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Module.bsl b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Module.bsl index 584ad3fa3..71c97d921 100644 --- a/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Module.bsl +++ b/SSL/src/InformationRegisters/ОбновлениеКлючейДоступаКДанным/Forms/ОбновлениеДоступаРучноеУправление/Module.bsl @@ -125,8 +125,6 @@ Возврат НСтр("ru = 'Выберите объект.'"); КонецЕсли; - УправлениеДоступомСлужебный.ОчиститьКэшЗначенийГруппДоступаДляРасчетаПрав(); - ПолноеИмя = ОбъектОбновленияДоступа.Метаданные().ПолноеИмя(); ИдентификаторТранзакции = Новый УникальныйИдентификатор; @@ -254,8 +252,6 @@ Списки = Неопределено; КонецЕсли; - УправлениеДоступомСлужебный.ОчиститьКэшЗначенийГруппДоступаДляРасчетаПрав(); - Если ОбновитьКлючиДоступаКЭлементамДанных Или ОбновитьПраваНаКлючиДоступа Тогда ПараметрыПланирования = УправлениеДоступомСлужебный.ПараметрыПланированияОбновленияДоступа(); ПараметрыПланирования.ЭтоПродолжениеОбновления = Истина; diff --git a/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo b/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo index b1463c0fb..0803f6193 100644 --- a/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo +++ b/SSL/src/InformationRegisters/ОбработчикиОбновления/ОбработчикиОбновления.mdo @@ -64,6 +64,7 @@ Use Use + Index Версия diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl index e80f979d2..cdadb79a4 100644 --- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl +++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Module.bsl @@ -34,7 +34,7 @@ ЕстьДополнительныеЯзыки = Ложь; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); - МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); // АПК:1386 - обязательная подсистема. ДополнительныеЯзыкиПечатныхФорм = МодульУправлениеПечатьюМультиязычность.ДополнительныеЯзыкиПечатныхФорм(); Элементы.ОтборПоЯзыку.СписокВыбора.Добавить("", НСтр("ru = 'Все'")); diff --git a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form index fe33cfff3..d0053a2ad 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Form.form @@ -89,13 +89,13 @@ - ПрограммныеДействияПользователя + ПрограммныеПраваПользователя 25 ВертикальнаяГруппа1 29 - Чтение + ПравоЧтение 27 true true @@ -103,7 +103,7 @@ true - Чтение + ПравоЧтение Right @@ -111,7 +111,7 @@ Право Чтение включено всегда, когда есть запись регистра. - ЧтениеExtendedTooltip + ПравоЧтениеРасширеннаяПодсказка 37 Label true @@ -121,7 +121,7 @@ - ЧтениеКонтекстноеМеню + ПравоЧтениеКонтекстноеМеню 28 true @@ -134,7 +134,7 @@ - Изменение + ПравоИзменение 7 true true @@ -142,11 +142,11 @@ true - Запись.Изменение + Запись.ПравоИзменение Right - ИзменениеExtendedTooltip + ПравоИзменениеРасширеннаяПодсказка 39 Label true @@ -156,7 +156,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 8 true @@ -168,7 +168,7 @@ - Добавление + ПравоДобавление 5 true true @@ -176,11 +176,11 @@ true - Запись.Добавление + Запись.ПравоДобавление Right - ДобавлениеExtendedTooltip + ПравоДобавлениеРасширеннаяПодсказка 38 Label true @@ -190,7 +190,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 6 true @@ -234,7 +234,7 @@ ВертикальнаяГруппа2 30 - ЧтениеБезОграничения + ПравоЧтениеБезОграничения 11 true true @@ -242,11 +242,11 @@ true - Запись.ЧтениеБезОграничения + Запись.ПравоЧтениеБезОграничения Right - ЧтениеБезОграниченияExtendedTooltip + ПравоЧтениеБезОграниченияРасширеннаяПодсказка 42 Label true @@ -256,7 +256,7 @@ - ЧтениеБезОграниченияКонтекстноеМеню + ПравоЧтениеБезОграниченияКонтекстноеМеню 12 true @@ -268,7 +268,7 @@ - ИзменениеБезОграничения + ПравоИзменениеБезОграничения 15 true true @@ -276,11 +276,11 @@ true - Запись.ИзменениеБезОграничения + Запись.ПравоИзменениеБезОграничения Right - ИзменениеБезОграниченияExtendedTooltip + ПравоИзменениеБезОграниченияРасширеннаяПодсказка 44 Label true @@ -290,7 +290,7 @@ - ИзменениеБезОграниченияКонтекстноеМеню + ПравоИзменениеБезОграниченияКонтекстноеМеню 16 true @@ -302,7 +302,7 @@ - ДобавлениеБезОграничения + ПравоДобавлениеБезОграничения 13 true true @@ -310,11 +310,11 @@ true - Запись.ДобавлениеБезОграничения + Запись.ПравоДобавлениеБезОграничения Right - ДобавлениеБезОграниченияExtendedTooltip + ПравоДобавлениеБезОграниченияРасширеннаяПодсказка 43 Label true @@ -324,7 +324,7 @@ - ДобавлениеБезОграниченияКонтекстноеМеню + ПравоДобавлениеБезОграниченияКонтекстноеМеню 14 true @@ -371,10 +371,10 @@ <key>ru</key> - <value>Программные действия пользователя</value> + <value>Программные права пользователя</value> - ПрограммныеДействияПользователяExtendedTooltip + ПрограммныеПраваПользователяРасширеннаяПодсказка 35 Label true @@ -396,10 +396,10 @@ - ИнтерактивныеДействияПользователя + ИнтерактивныеПраваПользователя 26 - Просмотр + ПравоПросмотр 19 true true @@ -407,11 +407,11 @@ true - Запись.Просмотр + Запись.ПравоПросмотр Right - ПросмотрExtendedTooltip + ПравоПросмотрРасширеннаяПодсказка 47 Label true @@ -421,7 +421,7 @@ - ПросмотрКонтекстноеМеню + ПравоПросмотрКонтекстноеМеню 20 true @@ -433,7 +433,7 @@ - Редактирование + ПравоРедактирование 23 true true @@ -441,11 +441,11 @@ true - Запись.Редактирование + Запись.ПравоРедактирование Right - РедактированиеExtendedTooltip + ПравоРедактированиеРасширеннаяПодсказка 49 Label true @@ -455,7 +455,7 @@ - РедактированиеКонтекстноеМеню + ПравоРедактированиеКонтекстноеМеню 24 true @@ -467,7 +467,7 @@ - ИнтерактивноеДобавление + ПравоИнтерактивноеДобавление 21 true true @@ -475,11 +475,11 @@ true - Запись.ИнтерактивноеДобавление + Запись.ПравоИнтерактивноеДобавление Right - ИнтерактивноеДобавлениеExtendedTooltip + ПравоИнтерактивноеДобавлениеРасширеннаяПодсказка 48 Label true @@ -489,7 +489,7 @@ - ИнтерактивноеДобавлениеКонтекстноеМеню + ПравоИнтерактивноеДобавлениеКонтекстноеМеню 22 true @@ -507,10 +507,10 @@ <key>ru</key> - <value>Интерактивные действия пользователя (основные)</value> + <value>Интерактивные права пользователя (основные)</value> - ИнтерактивныеДействияПользователяExtendedTooltip + ИнтерактивныеПраваПользователяРасширеннаяПодсказка 46 Label true @@ -595,10 +595,10 @@ true - Чтение + ПравоЧтение <key>ru</key> - <value>Чтение</value> + <value>Право чтение</value> 2 diff --git a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Module.bsl index 3f578474b..c5591e43c 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Module.bsl +++ b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаЗаписи/Module.bsl @@ -11,7 +11,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - Чтение = Истина; + ПравоЧтение = Истина; ТолькоПросмотр = Истина; diff --git a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form index 96ac53c1a..f5682cb15 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Form.form @@ -135,7 +135,7 @@ Copy Create - СписокОбъектМетаданных + ОбъектМетаданных 6 true true @@ -151,7 +151,7 @@ Представление объекта метаданных с типом. - СписокОбъектМетаданныхРасширеннаяПодсказка + ОбъектМетаданныхРасширеннаяПодсказка 39 Label true @@ -161,7 +161,7 @@ - СписокОбъектМетаданныхКонтекстноеМеню + ОбъектМетаданныхКонтекстноеМеню 7 true @@ -176,7 +176,7 @@ - СписокРоль + Роль 4 <key>ru</key> @@ -192,7 +192,7 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>СписокРольРасширеннаяПодсказка</name> + <name>РольРасширеннаяПодсказка</name> <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -202,7 +202,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокРольКонтекстноеМеню</name> + <name>РольКонтекстноеМеню</name> <id>5</id> <autoFill>true</autoFill> </contextMenu> @@ -218,14 +218,14 @@ </extInfo> </items> <items xsi:type="form:FormGroup"> - <name>СписокГруппаПравоЧтение</name> + <name>ГруппаПравоЧтение</name> <id>31</id> <items xsi:type="form:FormField"> - <name>СписокЧтение</name> + <name>ПравоЧтение</name> <id>29</id> <title> <key>ru</key> - <value>Чтение</value> + <value>Право чтение</value> true true @@ -233,14 +233,14 @@ true - Список.Чтение + Список.ПравоЧтение ru Право Чтение, установленное в роли. - СписокЧтениеРасширеннаяПодсказка + ПравоЧтениеРасширеннаяПодсказка 42 Label true @@ -250,7 +250,7 @@ - СписокЧтениеКонтекстноеМеню + ПравоЧтениеКонтекстноеМеню 30 true @@ -262,7 +262,7 @@ - СписокЧтениеБезОграничения + ПравоЧтениеБезОграничения 14 <key>ru</key> @@ -274,11 +274,11 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ЧтениеБезОграничения</segments> + <segments>Список.ПравоЧтениеБезОграничения</segments> </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>СписокЧтениеБезОграниченияРасширеннаяПодсказка</name> + <name>ПравоЧтениеБезОграниченияРасширеннаяПодсказка</name> <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -288,7 +288,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокЧтениеБезОграниченияКонтекстноеМеню</name> + <name>ПравоЧтениеБезОграниченияКонтекстноеМеню</name> <id>15</id> <autoFill>true</autoFill> </contextMenu> @@ -306,10 +306,10 @@ </userVisible> <title> <key>ru</key> - <value>Группа право чтение</value> + <value>Право чтение</value> - СписокГруппаПравоЧтениеРасширеннаяПодсказка + ГруппаПравоЧтениеРасширеннаяПодсказка 41 Label true @@ -326,111 +326,10 @@ - СписокГруппаПравоДобавление - 32 - - СписокДобавление - 8 - true - true - - true - - - Список.Добавление - - true - - СписокДобавлениеРасширеннаяПодсказка - 45 - Label - true - true - - Left - - - - СписокДобавлениеКонтекстноеМеню - 9 - true - - CheckBoxField - Enter - true - Left - true - - - - СписокДобавлениеБезОграничения - 16 - - <key>ru</key> - <value>Без ограничения</value> - - true - true - - true - - - Список.ДобавлениеБезОграничения - - true - - СписокДобавлениеБезОграниченияРасширеннаяПодсказка - 46 - Label - true - true - - Left - - - - СписокДобавлениеБезОграниченияКонтекстноеМеню - 17 - true - - CheckBoxField - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Группа право добавление</value> - - - СписокГруппаПравоДобавлениеРасширеннаяПодсказка - 44 - Label - true - true - - Left - - - ColumnGroup - - Vertical - auto - true - - - - СписокГруппаПравоИзменение + ГруппаПравоИзменение 33 - СписокИзменение + ПравоИзменение 10 true true @@ -438,11 +337,11 @@ true - Список.Изменение + Список.ПравоИзменение true - СписокИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 48 Label true @@ -452,7 +351,7 @@ - СписокИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 11 true @@ -464,7 +363,7 @@ - СписокИзменениеБезОграничения + ПравоИзменениеБезОграничения 18 <key>ru</key> @@ -476,11 +375,11 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ИзменениеБезОграничения</segments> + <segments>Список.ПравоИзменениеБезОграничения</segments> </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>СписокИзменениеБезОграниченияРасширеннаяПодсказка</name> + <name>ПравоИзменениеБезОграниченияРасширеннаяПодсказка</name> <id>49</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -490,7 +389,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокИзменениеБезОграниченияКонтекстноеМеню</name> + <name>ПравоИзменениеБезОграниченияКонтекстноеМеню</name> <id>19</id> <autoFill>true</autoFill> </contextMenu> @@ -508,10 +407,10 @@ </userVisible> <title> <key>ru</key> - <value>Группа право изменение</value> + <value>Право изменение</value> - СписокГруппаПравоИзменениеРасширеннаяПодсказка + ГруппаПравоИзменениеРасширеннаяПодсказка 47 Label true @@ -527,8 +426,109 @@ true + + ГруппаПравоДобавление + 32 + + ПравоДобавление + 8 + true + true + + true + + + Список.ПравоДобавление + + true + + ПравоДобавлениеРасширеннаяПодсказка + 45 + Label + true + true + + Left + + + + ПравоДобавлениеКонтекстноеМеню + 9 + true + + CheckBoxField + Enter + true + Left + true + + + + ПравоДобавлениеБезОграничения + 16 + + <key>ru</key> + <value>Без ограничения</value> + + true + true + + true + + + Список.ПравоДобавлениеБезОграничения + + true + + ПравоДобавлениеБезОграниченияРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + ПравоДобавлениеБезОграниченияКонтекстноеМеню + 17 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Право добавление</value> + + + ГруппаПравоДобавлениеРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + ColumnGroup + + Vertical + auto + true + + - СписокПросмотр + ПравоПросмотр 22 true true @@ -536,11 +536,11 @@ true - Список.Просмотр + Список.ПравоПросмотр true - СписокПросмотрРасширеннаяПодсказка + ПравоПросмотрРасширеннаяПодсказка 53 Label true @@ -550,7 +550,7 @@ - СписокПросмотрКонтекстноеМеню + ПравоПросмотрКонтекстноеМеню 23 true @@ -562,20 +562,20 @@ - СписокИнтерактивноеДобавление - 24 + ПравоРедактирование + 26 true true true - Список.ИнтерактивноеДобавление + Список.ПравоРедактирование true - СписокИнтерактивноеДобавлениеРасширеннаяПодсказка - 54 + ПравоРедактированиеРасширеннаяПодсказка + 55 Label true true @@ -584,8 +584,8 @@ - СписокИнтерактивноеДобавлениеКонтекстноеМеню - 25 + ПравоРедактированиеКонтекстноеМеню + 27 true CheckBoxField @@ -596,20 +596,20 @@ - СписокРедактирование - 26 + ПравоИнтерактивноеДобавление + 24 true true true - Список.Редактирование + Список.ПравоИнтерактивноеДобавление true - СписокРедактированиеРасширеннаяПодсказка - 55 + ПравоИнтерактивноеДобавлениеРасширеннаяПодсказка + 54 Label true true @@ -618,8 +618,8 @@ - СписокРедактированиеКонтекстноеМеню - 27 + ПравоИнтерактивноеДобавлениеКонтекстноеМеню + 25 true CheckBoxField @@ -792,25 +792,25 @@
        true
        ВЫБРАТЬ - ПраваРолей.ОбъектМетаданных, - ПраваРолей.Роль, - ИСТИНА КАК Чтение, - ПраваРолей.Добавление, - ПраваРолей.Изменение, - ПраваРолей.ЧтениеБезОграничения, - ПраваРолей.ДобавлениеБезОграничения, - ПраваРолей.ИзменениеБезОграничения, - ПраваРолей.Просмотр, - ПраваРолей.ИнтерактивноеДобавление, - ПраваРолей.Редактирование + ПраваРолей.ОбъектМетаданных КАК ОбъектМетаданных, + ПраваРолей.Роль КАК Роль, + ИСТИНА КАК ПравоЧтение, + ПраваРолей.ПравоИзменение КАК ПравоИзменение, + ПраваРолей.ПравоДобавление КАК ПравоДобавление, + ПраваРолей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + ПраваРолей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + ПраваРолей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, + ПраваРолей.ПравоПросмотр КАК ПравоПросмотр, + ПраваРолей.ПравоРедактирование КАК ПравоРедактирование, + ПраваРолей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление ИЗ РегистрСведений.ПраваРолей КАК ПраваРолей ГДЕ ВЫБОР - КОГДА &ОбъектМетаданных = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) - ТОГДА ИСТИНА - ИНАЧЕ ПраваРолей.ОбъектМетаданных = &ОбъектМетаданных - КОНЕЦ + КОГДА &ОбъектМетаданных = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) + ТОГДА ИСТИНА + ИНАЧЕ ПраваРолей.ОбъектМетаданных = &ОбъектМетаданных + КОНЕЦ InformationRegister.ПраваРолей true true diff --git a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Module.bsl b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Module.bsl index 1027afa3a..178bba356 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/InformationRegisters/ПраваРолей/Forms/ФормаСписка/Module.bsl @@ -16,7 +16,7 @@ Список.Параметры.УстановитьЗначениеПараметра("ОбъектМетаданных", Параметры.ОбъектМетаданных); Если ЗначениеЗаполнено(Параметры.ОбъектМетаданных) Тогда - Элементы.СписокОбъектМетаданных.Видимость = Ложь; + Элементы.ОбъектМетаданных.Видимость = Ложь; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/InformationRegisters/ПраваРолей/ManagerModule.bsl b/SSL/src/InformationRegisters/ПраваРолей/ManagerModule.bsl index 194bd207f..ec58fae8b 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПраваРолей/ManagerModule.bsl @@ -163,14 +163,12 @@ // Массив - со значениями типа Строка, если ПолучитьМассивИмен = Истина. // Функция ВсеПоляОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, - ПолноеИмя, - ОбъектИБ = Неопределено, - ПолучитьМассивИмен = Ложь) + ПолноеИмя, ОбъектИБ = Неопределено, ПолучитьМассивИмен = Ложь) ИменаКоллекций = Новый Массив; ИмяТипа = Лев(ПолноеИмя, СтрНайти(ПолноеИмя, ".") - 1); - Если ИмяТипа = "Справочник" Тогда + Если ИмяТипа = "Справочник" Тогда ИменаКоллекций.Добавить("Реквизиты"); ИменаКоллекций.Добавить("ТабличныеЧасти"); ИменаКоллекций.Добавить("СтандартныеРеквизиты"); @@ -266,25 +264,28 @@ Иначе Для каждого Поле Из ОбъектМетаданных[ИмяКоллекции] Цикл Если ИмяТипа = "ЖурналДокументов" И Поле.Имя = "Тип" - ИЛИ ИмяТипа = "ПланВидовХарактеристик" И Поле.Имя = "ТипЗначения" - ИЛИ ИмяТипа = "ПланСчетов" И Поле.Имя = "Вид" - ИЛИ ИмяТипа = "РегистрНакопления" И Поле.Имя = "ВидДвижения" - ИЛИ ИмяТипа = "РегистрБухгалтерии" И ИмяКоллекции = "СтандартныеРеквизиты" И СтрНайти(Поле.Имя, "Субконто") > 0 Тогда + Или ИмяТипа = "ПланВидовХарактеристик" И Поле.Имя = "ТипЗначения" + Или ИмяТипа = "ПланСчетов" И Поле.Имя = "Вид" + Или ИмяТипа = "РегистрНакопления" И Поле.Имя = "ВидДвижения" + Или ИмяТипа = "РегистрБухгалтерии" И ИмяКоллекции = "СтандартныеРеквизиты" + И СтрНайти(Поле.Имя, "Субконто") > 0 Тогда Продолжить; КонецЕсли; Если ИмяКоллекции = "Графы" Или Поле.Тип.СодержитТип(ТипХранилищеЗначения) Тогда Продолжить; КонецЕсли; - Если (ИмяКоллекции = "Измерения" ИЛИ ИмяКоллекции = "Ресурсы") - И ?(ОбъектИБ = Неопределено, Метаданные, ОбъектИБ.Метаданные).РегистрыБухгалтерии.Содержит(ОбъектМетаданных) + Если (ИмяКоллекции = "Измерения" Или ИмяКоллекции = "Ресурсы") + И ?(ОбъектИБ = Неопределено, Метаданные, + ОбъектИБ.Метаданные).РегистрыБухгалтерии.Содержит(ОбъектМетаданных) И НЕ Поле.Балансовый Тогда - // Дт - ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, Поле.Имя + "Дт", ИменаПолей, ОбъектИБ); - // Кт - ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, Поле.Имя + "Кт", ИменаПолей, ОбъектИБ); + ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, + Поле.Имя + "Дт", ИменаПолей, ОбъектИБ); + ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, + Поле.Имя + "Кт", ИменаПолей, ОбъектИБ); Иначе - ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, Поле.Имя, ИменаПолей, ОбъектИБ); + ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, + Поле.Имя, ИменаПолей, ОбъектИБ); КонецЕсли; КонецЦикла; КонецЕсли; @@ -303,20 +304,16 @@ КонецФункции -Процедура ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, - ИмяПоля, - ИменаПолей, - ОбъектИБ) +Процедура ДобавитьПолеОграниченияДоступаОбъектаМетаданных(ОбъектМетаданных, ИмяПоля, + ИменаПолей, ОбъектИБ) Попытка Если ОбъектИБ = Неопределено Тогда - ПараметрыДоступа("Чтение", ОбъектМетаданных, ИмяПоля, Метаданные.Роли.ПолныеПрава); + ПараметрыДоступа("Чтение", + ОбъектМетаданных, ИмяПоля, Метаданные.Роли.ПолныеПрава); Иначе - ОбъектИБ.ПараметрыДоступа( - "Чтение", - ОбъектМетаданных, - ИмяПоля, - ОбъектИБ.Метаданные.Роли.ПолныеПрава); + ОбъектИБ.ПараметрыДоступа("Чтение", + ОбъектМетаданных, ИмяПоля, ОбъектИБ.Метаданные.Роли.ПолныеПрава); КонецЕсли; ПараметрыДоступаМожноПолучить = Истина; Исключение @@ -355,8 +352,9 @@ Для Каждого ВозможныеПрава Из ВозможныеПраваОбъектовМетаданных Цикл Для Каждого ОбъектМетаданных Из Метаданные[ВозможныеПрава.Коллекция] Цикл - Если Не ОбъектыРасширений И ОбъектМетаданных.РасширениеКонфигурации() <> Неопределено Тогда - Продолжить; + Если Не ОбъектыРасширений + И ОбъектМетаданных.РасширениеКонфигурации() <> Неопределено Тогда + Продолжить; КонецЕсли; ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); @@ -377,19 +375,28 @@ НоваяСтрока.РольПолноеИмя = Роль.ПолноеИмя(); НоваяСтрока.ОбъектМетаданныхПолноеИмя = ПолноеИмя; - НоваяСтрока.ЧтениеБезОграничения = НЕ ПараметрыДоступа("Чтение", ОбъектМетаданных, Поля, Роль).ОграничениеУсловием; - НоваяСтрока.Просмотр = ПравоДоступа("Просмотр", ОбъектМетаданных, Роль); + НоваяСтрока.ПравоЧтениеБезОграничения = Не ПараметрыДоступа("Чтение", + ОбъектМетаданных, Поля, Роль).ОграничениеУсловием; + НоваяСтрока.ПравоПросмотр = ПравоДоступа("Просмотр", ОбъектМетаданных, Роль); - Если ВозможныеПрава.ПравоДобавления И ПравоДоступа("Добавление", ОбъектМетаданных, Роль) Тогда - НоваяСтрока.Добавление = Истина; - НоваяСтрока.ДобавлениеБезОграничения = НЕ ПараметрыДоступа("Добавление", ОбъектМетаданных, Поля, Роль).ОграничениеУсловием; - НоваяСтрока.ИнтерактивноеДобавление = ПравоДоступа("ИнтерактивноеДобавление", ОбъектМетаданных, Роль); + Если ВозможныеПрава.ПравоДобавления + И ПравоДоступа("Добавление", ОбъектМетаданных, Роль) Тогда + + НоваяСтрока.ПравоДобавление = Истина; + НоваяСтрока.ПравоДобавлениеБезОграничения = Не ПараметрыДоступа("Добавление", + ОбъектМетаданных, Поля, Роль).ОграничениеУсловием; + НоваяСтрока.ПравоИнтерактивноеДобавление = + ПравоДоступа("ИнтерактивноеДобавление", ОбъектМетаданных, Роль); КонецЕсли; - Если ВозможныеПрава.ПравоИзменения И ПравоДоступа("Изменение", ОбъектМетаданных, Роль) Тогда - НоваяСтрока.Изменение = Истина; - НоваяСтрока.ИзменениеБезОграничения = НЕ ПараметрыДоступа("Изменение", ОбъектМетаданных, Поля, Роль).ОграничениеУсловием; - НоваяСтрока.Редактирование = ПравоДоступа("Редактирование", ОбъектМетаданных, Роль); + Если ВозможныеПрава.ПравоИзменения + И ПравоДоступа("Изменение", ОбъектМетаданных, Роль) Тогда + + НоваяСтрока.ПравоИзменение = Истина; + НоваяСтрока.ПравоИзменениеБезОграничения = Не ПараметрыДоступа("Изменение", + ОбъектМетаданных, Поля, Роль).ОграничениеУсловием; + НоваяСтрока.ПравоРедактирование = + ПравоДоступа("Редактирование", ОбъектМетаданных, Роль); КонецЕсли; КонецЦикла; @@ -406,14 +413,14 @@ "ВЫБРАТЬ | НовыеДанные.ОбъектМетаданных, | НовыеДанные.Роль, - | НовыеДанные.Добавление, - | НовыеДанные.Изменение, - | НовыеДанные.ЧтениеБезОграничения, - | НовыеДанные.ДобавлениеБезОграничения, - | НовыеДанные.ИзменениеБезОграничения, - | НовыеДанные.Просмотр, - | НовыеДанные.ИнтерактивноеДобавление, - | НовыеДанные.Редактирование + | НовыеДанные.ПравоДобавление, + | НовыеДанные.ПравоИзменение, + | НовыеДанные.ПравоЧтениеБезОграничения, + | НовыеДанные.ПравоДобавлениеБезОграничения, + | НовыеДанные.ПравоИзменениеБезОграничения, + | НовыеДанные.ПравоПросмотр, + | НовыеДанные.ПравоИнтерактивноеДобавление, + | НовыеДанные.ПравоРедактирование |ПОМЕСТИТЬ НовыеДанные |ИЗ | &ПраваРолей КАК НовыеДанные"; @@ -422,14 +429,14 @@ "ВЫБРАТЬ | НовыеДанные.ОбъектМетаданных, | НовыеДанные.Роль, - | НовыеДанные.Добавление, - | НовыеДанные.Изменение, - | НовыеДанные.ЧтениеБезОграничения, - | НовыеДанные.ДобавлениеБезОграничения, - | НовыеДанные.ИзменениеБезОграничения, - | НовыеДанные.Просмотр, - | НовыеДанные.ИнтерактивноеДобавление, - | НовыеДанные.Редактирование, + | НовыеДанные.ПравоДобавление, + | НовыеДанные.ПравоИзменение, + | НовыеДанные.ПравоЧтениеБезОграничения, + | НовыеДанные.ПравоДобавлениеБезОграничения, + | НовыеДанные.ПравоИзменениеБезОграничения, + | НовыеДанные.ПравоПросмотр, + | НовыеДанные.ПравоИнтерактивноеДобавление, + | НовыеДанные.ПравоРедактирование, | &ПодстановкаПоляВидИзмененияСтроки |ИЗ | НовыеДанные КАК НовыеДанные"; @@ -440,14 +447,14 @@ Поля = Новый Массив; Поля.Добавить(Новый Структура("ОбъектМетаданных")); Поля.Добавить(Новый Структура("Роль", ЗначениеОтбораРолей)); - Поля.Добавить(Новый Структура("Добавление")); - Поля.Добавить(Новый Структура("Изменение")); - Поля.Добавить(Новый Структура("ЧтениеБезОграничения")); - Поля.Добавить(Новый Структура("ДобавлениеБезОграничения")); - Поля.Добавить(Новый Структура("ИзменениеБезОграничения")); - Поля.Добавить(Новый Структура("Просмотр")); - Поля.Добавить(Новый Структура("ИнтерактивноеДобавление")); - Поля.Добавить(Новый Структура("Редактирование")); + Поля.Добавить(Новый Структура("ПравоДобавление")); + Поля.Добавить(Новый Структура("ПравоИзменение")); + Поля.Добавить(Новый Структура("ПравоЧтениеБезОграничения")); + Поля.Добавить(Новый Структура("ПравоДобавлениеБезОграничения")); + Поля.Добавить(Новый Структура("ПравоИзменениеБезОграничения")); + Поля.Добавить(Новый Структура("ПравоПросмотр")); + Поля.Добавить(Новый Структура("ПравоИнтерактивноеДобавление")); + Поля.Добавить(Новый Структура("ПравоРедактирование")); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ПраваРолей", ПраваРолей); @@ -473,14 +480,14 @@ // ТаблицаЗначений: // * ОбъектМетаданных - СправочникСсылка.ИдентификаторыОбъектовМетаданных // * Роль - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// * Изменение - Булево -// * Добавление - Булево -// * ЧтениеБезОграничения - Булево -// * ИзменениеБезОграничения - Булево -// * ДобавлениеБезОграничения - Булево -// * Просмотр - Булево -// * Редактирование - Булево -// * ИнтерактивноеДобавление - Булево +// * ПравоИзменение - Булево +// * ПравоДобавление - Булево +// * ПравоЧтениеБезОграничения - Булево +// * ПравоИзменениеБезОграничения - Булево +// * ПравоДобавлениеБезОграничения - Булево +// * ПравоПросмотр - Булево +// * ПравоРедактирование - Булево +// * ПравоИнтерактивноеДобавление - Булево // * РольПолноеИмя - Строка // * ОбъектМетаданныхПолноеИмя - Строка // @@ -536,8 +543,9 @@ Функция ИзмененныеОбъектыМетаданных(Изменения) Экспорт - Изменения.Свернуть("ОбъектМетаданных, Роль, Добавление, Изменение, ЧтениеБезОграничения, " - + "ДобавлениеБезОграничения, ИзменениеБезОграничения", "ВидИзмененияСтроки"); + Изменения.Свернуть("ОбъектМетаданных, Роль, ПравоДобавление, ПравоИзменение, " + + "ПравоЧтениеБезОграничения, ПравоДобавлениеБезОграничения, ПравоИзменениеБезОграничения", + "ВидИзмененияСтроки"); ЛишниеСтроки = Изменения.НайтиСтроки(Новый Структура("ВидИзмененияСтроки", 0)); Для каждого Строка Из ЛишниеСтроки Цикл diff --git a/SSL/src/InformationRegisters/ПраваРолей/ПраваРолей.mdo b/SSL/src/InformationRegisters/ПраваРолей/ПраваРолей.mdo index 2dc0c5b7f..25135cdbf 100644 --- a/SSL/src/InformationRegisters/ПраваРолей/ПраваРолей.mdo +++ b/SSL/src/InformationRegisters/ПраваРолей/ПраваРолей.mdo @@ -60,17 +60,17 @@ - в отчете "Права доступа". - Изменение + ПравоИзменение ru - Изменение + Право изменение Boolean ru - Право Изменение, установленное в роли. + Право изменение, установленное в роли. @@ -78,17 +78,17 @@ - Добавление + ПравоДобавление ru - Добавление + Право добавление Boolean ru - Право Добавление, установленное в роли. + Право добавление, установленное в роли. @@ -96,17 +96,17 @@ - ЧтениеБезОграничения + ПравоЧтениеБезОграничения ru - Чтение без ограничения + Право чтение без ограничения Boolean ru - Право Чтение, установленное в роли, + Право чтение, установленное в роли, не содержит ограничения доступа ни по одному полю. @@ -115,17 +115,17 @@ - ИзменениеБезОграничения + ПравоИзменениеБезОграничения ru - Изменение без ограничения + Право изменение без ограничения Boolean ru - Право Изменение, установленное в роли, + Право изменение, установленное в роли, не содержит ограничения доступа. @@ -134,17 +134,17 @@ - ДобавлениеБезОграничения + ПравоДобавлениеБезОграничения ru - Добавление без ограничения + Право добавление без ограничения Boolean ru - Право Добавление, установленное в роли, + Право добавление, установленное в роли, не содержит ограничения доступа. @@ -153,17 +153,17 @@ - Просмотр + ПравоПросмотр ru - Просмотр + Право просмотр Boolean ru - Право Просмотр, установленное в роли. + Право просмотр, установленное в роли. @@ -171,17 +171,17 @@ - Редактирование + ПравоРедактирование ru - Редактирование + Право редактирование Boolean ru - Право Редактирование, установленное в роли. + Право редактирование, установленное в роли. @@ -189,17 +189,17 @@ - ИнтерактивноеДобавление + ПравоИнтерактивноеДобавление ru - Интерактивное добавление + Право интерактивное добавление Boolean ru - Право Интерактивное добавление, установленное в роли. + Право интерактивное добавление, установленное в роли. diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Help/ru.html b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Help/ru.html index a96becebd..980256999 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Help/ru.html +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ЗагрузитьПравилаСинхронизацииДанных/Help/ru.html @@ -1,7 +1,7 @@

        Предназначена для контроля и замены комплекта правил для синхронизации данных.

        Открывается по кнопке Загрузить комплект правил из настройки синхронизации данных.

        -

        Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Правила обмена состоят из правил конвертации объектов и правил регистрации объектов.

        +

        Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Правила обмена состоят из правил конвертации объектов и правил регистрации объектов.

        Правила конвертации объектов можно открыть из настройки синхронизации данных по команде Еще - Загрузить правила конвертации объектов. Правила конвертации данных используются при синхронизации данных двух программ. 

        Правила регистрации объектов можно открыть из настройки синхронизации данных по команде Еще - Загрузить правила регистрации объектов.

        Источник правил

        diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Help/ru.html b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Help/ru.html index 3c2acf082..7649564b8 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Help/ru.html +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаКонвертацииОбъектов/Help/ru.html @@ -1,6 +1,6 @@

        Предназначена для контроля и замены правил конвертации данных. Правила конвертации данных используются при синхронизации данных двух программ. 

        -

        Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Правила обмена состоят из правил конвертации объектов и правил регистрации объектов.

        +

        Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Правила обмена состоят из правил конвертации объектов и правил регистрации объектов.

        Правила конвертации объектов можно открыть из настройки синхронизации данных по команде Еще - Загрузить правила конвертации объектов.

        Источник правил

        • Для стандартной синхронизации данных между типовыми программами используются типовые правила из конфигурации (имя макета правил конвертации, из которого были получены типовые правила, указывается).Однако в ряде случаев необходимо использовать правила из файла (например, если синхронизация ведется между базами с нетиповыми программами). diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Help/ru.html b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Help/ru.html index ba923444b..c8767714c 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Help/ru.html +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Forms/ПравилаРегистрацииОбъектов/Help/ru.html @@ -1,6 +1,6 @@

          Предназначена для контроля и замены правил регистрации данных. Правила регистрации данных предусмотрены для всех видов синхронизации данных. 

          -

          Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Правила обмена состоят из правил конвертации объектов и правил регистрации объектов.

          +

          Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Правила обмена состоят из правил конвертации объектов и правил регистрации объектов.

          Правила регистрации объектов можно открыть из настройки синхронизации данных по команде Еще - Загрузить правила регистрации объектов.

          Источник правил

          • diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html index ab3c1581f..6b6069667 100644 --- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html +++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html @@ -1,6 +1,6 @@ -

            Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Если эти правила устарели, то выполнение синхронизации данных приведет к очень серьезным ошибкам, порче информации. Поэтому при настройке новой синхронизации данных, а также при выходе очередного обновления любой из программ, участвующих в синхронизации данных, необходимо контролировать актуальность используемых типовых правил обмена.

            -

            Типовые правила обмена состоят из правил конвертации объектов и правил регистрации объектов. Правила конвертации данных используются при синхронизации данных двух программ. Правила регистрации предусмотрены для всех видов синхронизации данных. Комплект актуальных правил обмена публикуется на сайте технической поддержки http://users.v8.1c.ru. Исправительные версии правил обмена также публикуются на данном сайте.

            +

            Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Если эти правила устарели, то выполнение синхронизации данных приведет к очень серьезным ошибкам, порче информации. Поэтому при настройке новой синхронизации данных, а также при выходе очередного обновления любой из программ, участвующих в синхронизации данных, необходимо контролировать актуальность используемых типовых правил обмена.

            +

            Типовые правила обмена состоят из правил конвертации объектов и правил регистрации объектов. Правила конвертации данных используются при синхронизации данных двух программ. Правила регистрации предусмотрены для всех видов синхронизации данных. Комплект актуальных правил обмена публикуется на сайте технической поддержки http://users.v8.1c.ru. Исправительные версии правил обмена также публикуются на данном сайте.

            Контроль актуальности правил синхронизации

            • При проверке актуальности правил необходимо обратить внимание на следующие контролируемые параметры:
              diff --git a/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl b/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl index 8966259e3..56531151a 100644 --- a/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl @@ -43,14 +43,22 @@ // Формирует пустую структуру для записи в регистр сведений ПредметыПапкиВзаимодействий. // +// Возвращаемое значение: +// Структура: +// * Предмет - ЛюбаяСсылка +// * Папка - СправочникСсылка.ПапкиЭлектронныхПисем +// * Рассмотрено - Булево +// * РассмотретьПосле - Дата +// * РассчитыватьРассмотрено - Булево +// Функция РеквизитыВзаимодействия() Экспорт Результат = Новый Структура; - Результат.Вставить("Предмет" ,Неопределено); - Результат.Вставить("Папка" ,Неопределено); - Результат.Вставить("Рассмотрено" ,Неопределено); - Результат.Вставить("РассмотретьПосле" ,Неопределено); - Результат.Вставить("РассчитыватьРассмотрено",Истина); + Результат.Вставить("Предмет" , Неопределено); + Результат.Вставить("Папка" , Неопределено); + Результат.Вставить("Рассмотрено" , Неопределено); + Результат.Вставить("РассмотретьПосле" , Неопределено); + Результат.Вставить("РассчитыватьРассмотрено", Истина); Возврат Результат; @@ -59,13 +67,13 @@ // Устанавливает папку, предмет и реквизиты рассмотрения для взаимодействий. // // Параметры: -// Ссылка - ДокументСсылка.ЭлектронноеПисьмоВходящее -// - ДокументСсылка.ЭлектронноеПисьмоИсходящее -// - ДокументСсылка.Встреча -// - ДокументСсылка.ЗапланированноеВзаимодействие -// - ДокументСсылка.ТелефонныйЗвонок - взаимодействие для которого будут установлены папка и предмет. +// Взаимодействие - ДокументСсылка.ЭлектронноеПисьмоВходящее +// - ДокументСсылка.ЭлектронноеПисьмоИсходящее +// - ДокументСсылка.Встреча +// - ДокументСсылка.ЗапланированноеВзаимодействие +// - ДокументСсылка.ТелефонныйЗвонок - взаимодействие для которого будут установлены папка и предмет. // Реквизиты - см. РегистрыСведений.ПредметыПапкиВзаимодействий.РеквизитыВзаимодействия. -// НаборЗаписей - РегистрСведений.ПредметыПапкиВзаимодействий.НаборЗаписей - набор записей регистра, если он уже создан +// НаборЗаписей - РегистрСведенийНаборЗаписей.ПредметыПапкиВзаимодействий - набор записей регистра, если он уже создан // на момент вызова процедуры. // Процедура ЗаписатьПредметыПапкиВзаимодействий(Взаимодействие, Реквизиты, НаборЗаписей = Неопределено) Экспорт diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Form.form new file mode 100644 index 000000000..1895e876d --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Form.form @@ -0,0 +1,943 @@ + + + + ТаблицаОбъектовИсправления + 1 + + <key>ru</key> + <value>Таблица объектов исправления</value> + + true + true + + true + + + ТаблицаОбъектовИсправления + + None + + ТаблицаОбъектовИсправленияОбработатьСтроку + 14 + true + true + + true + + + ТаблицаОбъектовИсправления.ОбработатьСтроку + + + ТаблицаОбъектовИсправленияОбработатьСтрокуРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияОбработатьСтрокуКонтекстноеМеню + 15 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаОбъектовИсправленияПроблемныйОбъект + 17 + true + true + + true + + + ТаблицаОбъектовИсправления.ПроблемныйОбъект + + + ТаблицаОбъектовИсправленияПроблемныйОбъектРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияПроблемныйОбъектКонтекстноеМеню + 18 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияВерсияИзДругойПрограммы + 39 + true + true + + + ТаблицаОбъектовИсправления.ВерсияИзДругойПрограммы + + + ТаблицаОбъектовИсправленияВерсияИзДругойПрограммыРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияВерсияИзДругойПрограммыКонтекстноеМеню + 40 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияВерсияЭтойПрограммы + 42 + true + true + + + ТаблицаОбъектовИсправления.ВерсияЭтойПрограммы + + + ТаблицаОбъектовИсправленияВерсияЭтойПрограммыРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияВерсияЭтойПрограммыКонтекстноеМеню + 43 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияОписаниеОшибки + 30 + true + true + + + ТаблицаОбъектовИсправления.ОписаниеОшибки + + + ТаблицаОбъектовИсправленияОписаниеОшибкиРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияОписаниеОшибкиКонтекстноеМеню + 31 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияНеудачнаяПопытка + 33 + true + true + + + ТаблицаОбъектовИсправления.НеудачнаяПопытка + + None + + ТаблицаОбъектовИсправленияНеудачнаяПопыткаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияНеудачнаяПопыткаКонтекстноеМеню + 34 + true + + CheckBoxField + true + Auto + true + Left + true + + + + ТаблицаОбъектовИсправленияКоманднаяПанель + 3 + + ТаблицаОбъектовИсправленияИзменитьРезультат + 47 + true + true + + true + + + ТаблицаОбъектовИсправленияИзменитьРезультатРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Form.Command.ПересмотретьРезультат + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияПоказатьОтличия + 45 + true + true + + true + + + ТаблицаОбъектовИсправленияПоказатьОтличияРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Command.ПоказатьОтличия + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияОткрытьВерсиюДоКонфликта + 49 + true + true + + true + + + ТаблицаОбъектовИсправленияОткрытьВерсиюДоКонфликтаРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюЭтойПрограммы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТаблицаОбъектовИсправленияОткрытьВерсиюКонфликта + 51 + true + true + + true + + + ТаблицаОбъектовИсправленияОткрытьВерсиюКонфликтаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюДругойПрограммы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТаблицаОбъектовИсправленияКомандаВыделения + 24 + + ТаблицаОбъектовИсправленияОтметитьВсе + 22 + true + true + + true + + + ТаблицаОбъектовИсправленияОтметитьВсеРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.ОтметитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияСнятьВыделение + 20 + true + true + + true + + + ТаблицаОбъектовИсправленияСнятьВыделениеРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.СнятьВыделение + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команда выделения</value> + + + ТаблицаОбъектовИсправленияКомандаВыделенияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + Compact + + + Left + + + ТаблицаОбъектовИсправленияСтрокаПоиска + 5 + + ТаблицаОбъектовИсправленияСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияСтрокаПоискаКонтекстноеМеню + 6 + true + + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияСостояниеПросмотра + 8 + + ТаблицаОбъектовИсправленияСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияУправлениеПоиском + 11 + + ТаблицаОбъектовИсправленияУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияКонтекстноеМеню + 2 + + ТаблицаОбъектовИсправленияКонтекстноеМенюОткрытьВерсиюДругойПрограммы + 53 + true + true + + true + + + ТаблицаОбъектовИсправленияКонтекстноеМенюОткрытьВерсиюДругойПрограммыРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюДругойПрограммы + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияКонтекстноеМенюОткрытьВерсиюЭтойПрограммы + 55 + true + true + + true + + + ТаблицаОбъектовИсправленияКонтекстноеМенюОткрытьВерсиюЭтойПрограммыРасширеннаяПодсказка + 56 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюЭтойПрограммы + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + MultiRow +
              true
              + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + AsFileRef + true + +
              + + ОписаниеОшибкиПроведенияИзСтроки + 36 + true + true + + true + + + ТаблицаОбъектовИсправления[0].ОписаниеОшибки + + Top + + ОписаниеОшибкиПроведенияИзСтрокиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ОписаниеОшибкиПроведенияИзСтрокиКонтекстноеМеню + 37 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + ТаблицаОбъектовИсправления + + <key>ru</key> + <value>Объекты исправления</value> + + 1 + + ValueTable + + + true + + + true + + + ОбработатьСтроку + + <key>ru</key> + <value>...</value> + + 1 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Проблемный объект</value> + + 2 + + BusinessProcessRef + DocumentRef + ChartOfCalculationTypesRef + TaskRef + ChartOfCharacteristicTypesRef + ChartOfAccountsRef + CatalogRef + + + true + + + true + + + + ОписаниеОшибки + + <key>ru</key> + <value>Описание ошибки</value> + + 3 + + String + + 1000 + + + + true + + + true + + + + НеудачнаяПопытка + + <key>ru</key> + <value>Неудачная попытка</value> + + 4 + + Boolean + + + true + + + true + + + + ВерсияИзДругойПрограммы + + <key>ru</key> + <value>Версия из другой программы</value> + + 5 + + Number + + 10 + true + + + + true + + + true + + + + ВерсияЭтойПрограммы + + <key>ru</key> + <value>Версия этой программы</value> + + 6 + + Number + + 10 + true + + + + true + + + true + + + + + ОтметитьВсе + + <key>ru</key> + <value>Отметить все</value> + + 1 + + ru + Отметить все + + + true + + + StdPicture.CheckAll + + + + ОтметитьВсе + + + Auto + Auto + + + СнятьВыделение + + <key>ru</key> + <value>Снять выделение</value> + + 2 + + ru + Снять выделение + + + true + + + StdPicture.UncheckAll + + + + СнятьВыделение + + + Auto + Auto + + + ПоказатьОтличия + + <key>ru</key> + <value>Показать отличия</value> + + 3 + + ru + Показать отличия между версиями в этой и в другой программе + + + true + + + CommonPicture.ПоказатьОтличия + + + + ПоказатьОтличия + + + TextPicture + DontUse + Auto + + + ПересмотретьРезультат + + <key>ru</key> + <value>Пересмотреть</value> + + 4 + + ru + Рассмотреть и изменить результат разрешения конфликта на противоположный + + + true + + + CommonPicture.СинхронизацияДанныхКоллизия + + + + ПересмотретьРезультат + + + TextPicture + DontUse + Auto + + + ОткрытьВерсиюЭтойПрограммы + + <key>ru</key> + <value>Показать версию, созданную в этой информационной базе</value> + + 5 + + ru + Открыть версию, созданную в этой информационной базе + + + true + + + + ОткрытьВерсиюЭтойПрограммы + + + DontUse + Auto + + + ОткрытьВерсиюДругойПрограммы + + <key>ru</key> + <value>Показать версию, полученную из другой информационной базы</value> + + 6 + + ru + Открыть версию, полученную из другой информационной базы + + + true + + + + ОткрытьВерсиюДругойПрограммы + + + DontUse + Auto + + + + + +
              diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Module.bsl new file mode 100644 index 000000000..c96334e10 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийКоллизии/Module.bsl @@ -0,0 +1,269 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ Параметры.Свойство("ДанныеВыделенныхСтрок") Тогда + + ВызватьИсключение НСтр("ru ='Самостоятельное использование формы не предусмотрено.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + КонецЕсли; + + УсловноеОформлениеФормы(); + ЗаполнитьТаблицуФормы(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОтметитьВсе(Команда) + + ИзменитьОтметкуСтрок(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьВыделение(Команда) + + ИзменитьОтметкуСтрок(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьОтличия(Команда) + + ПоказатьОтличияВерсийОбъекта(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПересмотретьРезультат(Команда) + + ТекстВопроса = НСтр("ru = 'Пересмотреть результаты коллизий по отмеченным строкам?'"); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПересмотретьРезультатыКоллизий", ЭтотОбъект); + + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура ПересмотретьРезультатыКоллизий(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + + Возврат; + + КонецЕсли; + + ПараметрыПересмотра = Новый Структура; + ПараметрыПересмотра.Вставить("КоличествоПересмотренных", 0); + ПараметрыПересмотра.Вставить("КоличествоВсего", 0); + + ПересмотретьРезультатыНаСервере(ПараметрыПересмотра); + + Если ПараметрыПересмотра.КоличествоПересмотренных > 0 Тогда + + Оповестить("ИсправлениеПредупрежденийСинхронизацииПересмотрКоллизии"); + + КонецЕсли; + + ОчиститьСообщения(); + Если ПараметрыПересмотра.КоличествоПересмотренных <> ПараметрыПересмотра.КоличествоВсего Тогда + + ШаблонСообщения = НСтр("ru = 'Отмечено строк: %1. Изменено объектов: %2.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, + Формат(ПараметрыПересмотра.КоличествоВсего, "ЧН=; ЧГ=0"), + Формат(ПараметрыПересмотра.КоличествоПересмотренных, "ЧН=; ЧГ=0")); + + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсиюЭтойПрограммы(Команда) + + ОткрытьВерсиюНаКлиенте("ВерсияЭтойПрограммы"); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсиюДругойПрограммы(Команда) + + ОткрытьВерсиюНаКлиенте("ВерсияИзДругойПрограммы"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ПоказатьОтличияВерсийОбъекта() + + ТекущиеДанныеСтроки = Элементы.ТаблицаОбъектовИсправления.ТекущиеДанные; + Если ТекущиеДанныеСтроки = Неопределено Тогда + + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + + Если ТекущиеДанныеСтроки.ВерсияЭтойПрограммы <> 0 Тогда + + СравниваемыеВерсии.Добавить(ТекущиеДанныеСтроки.ВерсияЭтойПрограммы); + + КонецЕсли; + + Если ТекущиеДанныеСтроки.ВерсияИзДругойПрограммы <> 0 Тогда + + СравниваемыеВерсии.Добавить(ТекущиеДанныеСтроки.ВерсияИзДругойПрограммы); + + КонецЕсли; + + Если СравниваемыеВерсии.Количество() <> 2 Тогда + + ТекстСообщения = НСтр("ru = 'Нет версии для сравнения.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ПоказатьПредупреждение(Неопределено, ТекстСообщения); + Возврат; + + КонецЕсли; + + ОткрытьОтчетСравненияВерсий(ТекущиеДанныеСтроки.ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьОтметкуСтрок(ЗначениеОтметки); + + Для Каждого ВыделеннаяСтрока Из ТаблицаОбъектовИсправления Цикл + + ВыделеннаяСтрока.ОбработатьСтроку = ЗначениеОтметки; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсиюНаКлиенте(ПолеВерсия) + + ТекущиеДанные = Элементы.ТаблицаОбъектовИсправления.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ТекущиеДанные[ПолеВерсия]); + + ОткрытьОтчетСравненияВерсий(ТекущиеДанные.ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МодульВерсионированиеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВерсионированиеОбъектовКлиент"); + МодульВерсионированиеОбъектовКлиент.ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УсловноеОформлениеФормы() + + ОшибкиКрасным = УсловноеОформление.Элементы.Добавить(); + + ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ОшибкиКрасным.Отбор, "ТаблицаОбъектовИсправления.НеудачнаяПопытка", ВидСравненияКомпоновкиДанных.Равно, Истина); + ОшибкиКрасным.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноКрасный); + + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияПроблемныйОбъект"); + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияРезультатПроведения"); + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияНеудачнаяПопытка"); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТаблицуФормы() + + Если ТипЗнч(Параметры.ДанныеВыделенныхСтрок) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + Для каждого ДанныеСтроки Из Параметры.ДанныеВыделенныхСтрок Цикл + + НоваяСтрока = ТаблицаОбъектовИсправления.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ДанныеСтроки); + НоваяСтрока.ОбработатьСтроку = Истина; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПересмотретьРезультатыНаСервере(ПараметрыПересмотра) + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + Возврат; + + КонецЕсли; + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + ШаблонТекстаОшибки = НСтр("ru = 'Не удалось изменить версию объекта по причине:%1%2'", ОбщегоНазначения.КодОсновногоЯзыка()); + + Для Каждого ВыделеннаяСтрока Из ТаблицаОбъектовИсправления Цикл + + Если НЕ ВыделеннаяСтрока.ОбработатьСтроку Тогда + + Продолжить; + + КонецЕсли; + + ПараметрыПересмотра.КоличествоВсего = ПараметрыПересмотра.КоличествоВсего + 1; + + Попытка + + МодульВерсионированиеОбъектов.ПриПереходеНаВерсиюОбъекта(ВыделеннаяСтрока.ПроблемныйОбъект, ВыделеннаяСтрока.ВерсияИзДругойПрограммы); + ПараметрыПересмотра.КоличествоПересмотренных = ПараметрыПересмотра.КоличествоПересмотренных + 1; + + Исключение + + ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + ВыделеннаяСтрока.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, Символы.ПС, ТекстОшибки); + ВыделеннаяСтрока.НеудачнаяПопытка = Истина; + + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Form.form new file mode 100644 index 000000000..dfebf0cb8 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Form.form @@ -0,0 +1,865 @@ + + + + ТаблицаОбъектовИсправления + 1 + + <key>ru</key> + <value>Таблица объектов исправления</value> + + true + true + + true + + + ТаблицаОбъектовИсправления + + None + + ТаблицаОбъектовИсправленияОбработатьСтроку + 14 + true + true + + true + + + ТаблицаОбъектовИсправления.ОбработатьСтроку + + + ТаблицаОбъектовИсправленияОбработатьСтрокуРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияОбработатьСтрокуКонтекстноеМеню + 15 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаОбъектовИсправленияПроблемныйОбъект + 17 + true + true + + true + + + ТаблицаОбъектовИсправления.ПроблемныйОбъект + + + ТаблицаОбъектовИсправленияПроблемныйОбъектРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияПроблемныйОбъектКонтекстноеМеню + 18 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияВерсияИзДругойПрограммы + 39 + true + true + + + ТаблицаОбъектовИсправления.ВерсияИзДругойПрограммы + + + ТаблицаОбъектовИсправленияВерсияИзДругойПрограммыРасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияВерсияИзДругойПрограммыКонтекстноеМеню + 40 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияВерсияЭтойПрограммы + 42 + true + true + + + ТаблицаОбъектовИсправления.ВерсияЭтойПрограммы + + + ТаблицаОбъектовИсправленияВерсияЭтойПрограммыРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияВерсияЭтойПрограммыКонтекстноеМеню + 43 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияОписаниеОшибки + 30 + true + true + + + ТаблицаОбъектовИсправления.ОписаниеОшибки + + + ТаблицаОбъектовИсправленияОписаниеОшибкиРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияОписаниеОшибкиКонтекстноеМеню + 31 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияНеудачнаяПопытка + 33 + true + true + + + ТаблицаОбъектовИсправления.НеудачнаяПопытка + + None + + ТаблицаОбъектовИсправленияНеудачнаяПопыткаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияНеудачнаяПопыткаКонтекстноеМеню + 34 + true + + CheckBoxField + true + Auto + true + Left + true + + + + ТаблицаОбъектовИсправленияКоманднаяПанель + 3 + + ТаблицаОбъектовИсправленияПринятьВерсию + 57 + true + true + + true + + + ТаблицаОбъектовИсправленияПринятьВерсиюРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + Form.Command.ПринятьВерсию + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияПоказатьОтличия + 45 + true + true + + true + + + ТаблицаОбъектовИсправленияПоказатьОтличияРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Command.ПоказатьОтличия + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияОткрытьВерсиюКонфликта + 51 + true + true + + true + + + ТаблицаОбъектовИсправленияОткрытьВерсиюКонфликтаРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюДругойПрограммы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ТаблицаОбъектовИсправленияКомандаВыделения + 24 + + ТаблицаОбъектовИсправленияОтметитьВсе + 22 + true + true + + true + + + ТаблицаОбъектовИсправленияОтметитьВсеРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.ОтметитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияСнятьВыделение + 20 + true + true + + true + + + ТаблицаОбъектовИсправленияСнятьВыделениеРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.СнятьВыделение + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команда выделения</value> + + + ТаблицаОбъектовИсправленияКомандаВыделенияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + Compact + + + Left + + + ТаблицаОбъектовИсправленияСтрокаПоиска + 5 + + ТаблицаОбъектовИсправленияСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияСтрокаПоискаКонтекстноеМеню + 6 + true + + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияСостояниеПросмотра + 8 + + ТаблицаОбъектовИсправленияСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияУправлениеПоиском + 11 + + ТаблицаОбъектовИсправленияУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияКонтекстноеМеню + 2 + + ТаблицаОбъектовИсправленияКонтекстноеМенюОткрытьВерсиюДругойПрограммы + 53 + true + true + + true + + + ТаблицаОбъектовИсправленияКонтекстноеМенюОткрытьВерсиюДругойПрограммыРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюДругойПрограммы + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + MultiRow +
              true
              + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + AsFileRef + true + +
              + + ОписаниеОшибкиПроведенияИзСтроки + 36 + true + true + + true + + + ТаблицаОбъектовИсправления[0].ОписаниеОшибки + + Top + + ОписаниеОшибкиПроведенияИзСтрокиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ОписаниеОшибкиПроведенияИзСтрокиКонтекстноеМеню + 37 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + ТаблицаОбъектовИсправления + + <key>ru</key> + <value>Объекты исправления</value> + + 1 + + ValueTable + + + true + + + true + + + ОбработатьСтроку + + <key>ru</key> + <value>...</value> + + 1 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Проблемный объект</value> + + 2 + + BusinessProcessRef + DocumentRef + ChartOfCalculationTypesRef + TaskRef + ChartOfCharacteristicTypesRef + ChartOfAccountsRef + CatalogRef + + + true + + + true + + + + ОписаниеОшибки + + <key>ru</key> + <value>Описание ошибки</value> + + 3 + + String + + 1000 + + + + true + + + true + + + + НеудачнаяПопытка + + <key>ru</key> + <value>Неудачная попытка</value> + + 4 + + Boolean + + + true + + + true + + + + ВерсияИзДругойПрограммы + + <key>ru</key> + <value>Версия из другой программы</value> + + 5 + + Number + + 10 + true + + + + true + + + true + + + + ВерсияЭтойПрограммы + + <key>ru</key> + <value>Версия этой программы</value> + + 6 + + Number + + 10 + true + + + + true + + + true + + + + + ОтметитьВсе + + <key>ru</key> + <value>Отметить все</value> + + 1 + + ru + Отметить все + + + true + + + StdPicture.CheckAll + + + + ОтметитьВсе + + + Auto + Auto + + + СнятьВыделение + + <key>ru</key> + <value>Снять выделение</value> + + 2 + + ru + Снять выделение + + + true + + + StdPicture.UncheckAll + + + + СнятьВыделение + + + Auto + Auto + + + ПоказатьОтличия + + <key>ru</key> + <value>Показать отличия</value> + + 3 + + ru + Показать отличия между версиями в этой и в другой программе + + + true + + + CommonPicture.ПоказатьОтличия + + + + ПоказатьОтличия + + + TextPicture + DontUse + Auto + + + ОткрытьВерсиюДругойПрограммы + + <key>ru</key> + <value>Показать непринятую версию, полученную из другой информационной базы</value> + + 6 + + ru + Открыть версию, полученную из другой информационной базы + + + true + + + + ОткрытьВерсиюДругойПрограммы + + + DontUse + Auto + + + ПринятьВерсию + + <key>ru</key> + <value>Принять версию</value> + + 4 + + ru + Принять версию несмотря на установленный запрет загрузки данных + + + true + + + + ПринятьВерсию + + + TextPicture + DontUse + Auto + + + + + +
              diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Module.bsl new file mode 100644 index 000000000..32ecacca8 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПоДатеЗапретаЗагрузки/Module.bsl @@ -0,0 +1,226 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ Параметры.Свойство("ДанныеВыделенныхСтрок") Тогда + + ВызватьИсключение НСтр("ru ='Самостоятельное использование формы не предусмотрено.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + КонецЕсли; + + УсловноеОформлениеФормы(); + ЗаполнитьТаблицуФормы(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОтметитьВсе(Команда) + + ИзменитьОтметкуСтрок(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьВыделение(Команда) + + ИзменитьОтметкуСтрок(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПринятьВерсию(Команда) + + ТекстВопроса = НСтр("ru = 'Принять версии в отмеченных строках, несмотря на запрет загрузки?'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПринятьВерсиюЗавершение", ЭтотОбъект); + + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + +КонецПроцедуры + +&НаКлиенте +Процедура ПринятьВерсиюЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + + Возврат; + + КонецЕсли; + + ПараметрыПересмотра = Новый Структура; + ПараметрыПересмотра.Вставить("КоличествоПересмотренных", 0); + ПараметрыПересмотра.Вставить("КоличествоВсего", 0); + + ПересмотретьРезультатыНаСервере(ПараметрыПересмотра); + + Если ПараметрыПересмотра.КоличествоПересмотренных > 0 Тогда + + Оповестить("ИсправлениеПредупрежденийСинхронизацииПересмотрДатыЗапрета"); + + КонецЕсли; + + ОчиститьСообщения(); + Если ПараметрыПересмотра.КоличествоПересмотренных <> ПараметрыПересмотра.КоличествоВсего Тогда + + ШаблонСообщения = НСтр("ru = 'Отмечено строк: %1. Изменено объектов: %2.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонСообщения, + Формат(ПараметрыПересмотра.КоличествоВсего, "ЧН=; ЧГ=0"), + Формат(ПараметрыПересмотра.КоличествоПересмотренных, "ЧН=; ЧГ=0")); + + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьОтличия(Команда) + + ПоказатьОтличияВерсийОбъекта(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсиюДругойПрограммы(Команда) + + ПоказатьОтличияВерсийОбъекта(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ПоказатьОтличияВерсийОбъекта() + + ТекущиеДанныеСтроки = Элементы.ТаблицаОбъектовИсправления.ТекущиеДанные; + Если ТекущиеДанныеСтроки = Неопределено Тогда + + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ТекущиеДанныеСтроки.ВерсияИзДругойПрограммы); + + ОткрытьОтчетСравненияВерсий(ТекущиеДанныеСтроки.ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьОтметкуСтрок(ЗначениеОтметки); + + Для Каждого ВыделеннаяСтрока Из ТаблицаОбъектовИсправления Цикл + + ВыделеннаяСтрока.ОбработатьСтроку = ЗначениеОтметки; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МодульВерсионированиеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВерсионированиеОбъектовКлиент"); + МодульВерсионированиеОбъектовКлиент.ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПересмотретьРезультатыНаСервере(ПараметрыПересмотра) + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + Возврат; + + КонецЕсли; + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + ШаблонТекстаОшибки = НСтр("ru = 'Не удалось изменить версию объекта по причине:%1%2'", ОбщегоНазначения.КодОсновногоЯзыка()); + + Для Каждого ВыделеннаяСтрока Из ТаблицаОбъектовИсправления Цикл + + Если НЕ ВыделеннаяСтрока.ОбработатьСтроку Тогда + + Продолжить; + + КонецЕсли; + + ПараметрыПересмотра.КоличествоВсего = ПараметрыПересмотра.КоличествоВсего + 1; + + Попытка + + МодульВерсионированиеОбъектов.ПриПереходеНаВерсиюОбъекта(ВыделеннаяСтрока.ПроблемныйОбъект, ВыделеннаяСтрока.ВерсияИзДругойПрограммы); + ПараметрыПересмотра.КоличествоПересмотренных = ПараметрыПересмотра.КоличествоПересмотренных + 1; + + Исключение + + ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + + ВыделеннаяСтрока.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, Символы.ПС, ТекстОшибки); + ВыделеннаяСтрока.НеудачнаяПопытка = Истина; + + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УсловноеОформлениеФормы() + + ОшибкиКрасным = УсловноеОформление.Элементы.Добавить(); + + ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ОшибкиКрасным.Отбор, "ТаблицаОбъектовИсправления.НеудачнаяПопытка", ВидСравненияКомпоновкиДанных.Равно, Истина); + ОшибкиКрасным.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноКрасный); + + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияПроблемныйОбъект"); + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияРезультатПроведения"); + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияНеудачнаяПопытка"); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТаблицуФормы() + + Если ТипЗнч(Параметры.ДанныеВыделенныхСтрок) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + Для каждого ДанныеСтроки Из Параметры.ДанныеВыделенныхСтрок Цикл + + НоваяСтрока = ТаблицаОбъектовИсправления.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ДанныеСтроки); + НоваяСтрока.ОбработатьСтроку = Истина; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Form.form new file mode 100644 index 000000000..027c0010a --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Form.form @@ -0,0 +1,664 @@ + + + + ТаблицаОбъектовИсправления + 1 + + <key>ru</key> + <value>Таблица объектов исправления</value> + + true + true + + true + + + ТаблицаОбъектовИсправления + + None + + ТаблицаОбъектовИсправленияОбработатьСтроку + 14 + true + true + + true + + + ТаблицаОбъектовИсправления.ОбработатьСтроку + + + ТаблицаОбъектовИсправленияОбработатьСтрокуРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияОбработатьСтрокуКонтекстноеМеню + 15 + true + + CheckBoxField + Auto + true + Left + true + + + + ТаблицаОбъектовИсправленияПроблемныйОбъект + 17 + true + true + + true + + + ТаблицаОбъектовИсправления.ПроблемныйОбъект + + + ТаблицаОбъектовИсправленияПроблемныйОбъектРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияПроблемныйОбъектКонтекстноеМеню + 18 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияОписаниеОшибки + 30 + true + true + + + ТаблицаОбъектовИсправления.РезультатИсправления + + + ТаблицаОбъектовИсправленияОписаниеОшибкиРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияОписаниеОшибкиКонтекстноеМеню + 31 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ТаблицаОбъектовИсправленияНеудачнаяПопытка + 33 + true + true + + + ТаблицаОбъектовИсправления.НеудачнаяПопытка + + None + + ТаблицаОбъектовИсправленияНеудачнаяПопыткаРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияНеудачнаяПопыткаКонтекстноеМеню + 34 + true + + CheckBoxField + true + Auto + true + Left + true + + + + ТаблицаОбъектовИсправленияКоманднаяПанель + 3 + + ТаблицаОбъектовИсправленияПровестиДокументы + 26 + true + true + + true + + + ТаблицаОбъектовИсправленияПровестиДокументыРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.ПровестиДокументы + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияКомандаВыделения + 24 + + ТаблицаОбъектовИсправленияОтметитьВсе + 22 + true + true + + true + + + ТаблицаОбъектовИсправленияОтметитьВсеРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.ОтметитьВсе + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаОбъектовИсправленияСнятьВыделение + 20 + true + true + + true + + + ТаблицаОбъектовИсправленияСнятьВыделениеРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.СнятьВыделение + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команда выделения</value> + + + ТаблицаОбъектовИсправленияКомандаВыделенияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + Compact + + + + ТаблицаОбъектовИсправленияПроводитьВРежимеРазработчика + 28 + true + true + + true + + + ТаблицаОбъектовИсправленияПроводитьВРежимеРазработчикаРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.Command.ПроводитьВРежимеРазработчика + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + Left + + + ТаблицаОбъектовИсправленияСтрокаПоиска + 5 + + ТаблицаОбъектовИсправленияСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияСтрокаПоискаКонтекстноеМеню + 6 + true + + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияСостояниеПросмотра + 8 + + ТаблицаОбъектовИсправленияСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияУправлениеПоиском + 11 + + ТаблицаОбъектовИсправленияУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + ТаблицаОбъектовИсправления + + true + + + + ТаблицаОбъектовИсправленияРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + ТаблицаОбъектовИсправленияКонтекстноеМеню + 2 + true + + true + true + true + MultiRow +
              true
              + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + AsFileRef + true + +
              + + РезультатИсправленияПроведенияИзСтроки + 36 + true + true + + true + + + ТаблицаОбъектовИсправления[0].РезультатИсправления + + Top + + РезультатИсправленияПроведенияИзСтрокиРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + РезультатИсправленияПроведенияИзСтрокиКонтекстноеМеню + 37 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + ТаблицаОбъектовИсправления + + <key>ru</key> + <value>Объекты исправления</value> + + 1 + + ValueTable + + + true + + + true + + + ОбработатьСтроку + + <key>ru</key> + <value>...</value> + + 1 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Проблемный объект</value> + + 2 + + DocumentRef + + + true + + + true + + + + РезультатИсправления + + <key>ru</key> + <value>Результат исправления</value> + + 3 + + String + + 1000 + + + + true + + + true + + + + НеудачнаяПопытка + + <key>ru</key> + <value>Неудачная попытка</value> + + 4 + + Boolean + + + true + + + true + + + + + ОтметитьВсе + + <key>ru</key> + <value>Отметить все</value> + + 1 + + ru + Отметить все + + + true + + + StdPicture.CheckAll + + + + ОтметитьВсе + + + Auto + Auto + + + СнятьВыделение + + <key>ru</key> + <value>Снять выделение</value> + + 2 + + ru + Снять выделение + + + true + + + StdPicture.UncheckAll + + + + СнятьВыделение + + + Auto + Auto + + + ПровестиДокументы + + <key>ru</key> + <value>Провести документы</value> + + 3 + + ru + Провести документы + + + true + + + StdPicture.Post + + + + ПровестиДокументы + + + TextPicture + Auto + Auto + + + ПроводитьВРежимеРазработчика + + <key>ru</key> + <value>Проводить в режиме разработчика</value> + + 4 + + ru + Проводить в режиме разработчика + + + true + + + + ПроводитьВРежимеРазработчика + + + Auto + Auto + + + + + +
              diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Module.bsl new file mode 100644 index 000000000..8d8a754fa --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОбработкаПредупрежденийПроведения/Module.bsl @@ -0,0 +1,191 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если НЕ Параметры.Свойство("ДанныеВыделенныхСтрок") Тогда + + ВызватьИсключение НСтр("ru ='Самостоятельное использование формы не предусмотрено.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + КонецЕсли; + + УсловноеОформлениеФормы(); + ЗаполнитьТаблицуФормы(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ПровестиДокументы(Команда) + + ПараметрыПроведения = Новый Структура; + ПараметрыПроведения.Вставить("КоличествоПроведенные", 0); + ПараметрыПроведения.Вставить("КоличествоВсего", 0); + + ПровестиДокументыНаСервере(ПараметрыПроведения); + + Если ПараметрыПроведения.КоличествоПроведенные > 0 Тогда + + Оповестить("ИсправлениеПредупрежденийСинхронизацииПроведенияДокументов"); + + КонецЕсли; + + ОчиститьСообщения(); + Если ПараметрыПроведения.КоличествоПроведенные <> ПараметрыПроведения.КоличествоВсего Тогда + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Проведено документов %1 из %2.'"), + Формат(ПараметрыПроведения.КоличествоПроведенные, "ЧН=; ЧГ=0"), + Формат(ПараметрыПроведения.КоличествоВсего, "ЧН=; ЧГ=0")); + + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОтметитьВсе(Команда) + + ИзменитьОтметкуСтрок(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьВыделение(Команда) + + ИзменитьОтметкуСтрок(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроводитьВРежимеРазработчика(Команда) + + Элементы.ТаблицаОбъектовИсправленияПроводитьВРежимеРазработчика.Пометка + = НЕ Элементы.ТаблицаОбъектовИсправленияПроводитьВРежимеРазработчика.Пометка; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьОтметкуСтрок(ЗначениеОтметки); + + Для Каждого ВыделеннаяСтрока Из ТаблицаОбъектовИсправления Цикл + + ВыделеннаяСтрока.ОбработатьСтроку = ЗначениеОтметки; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УсловноеОформлениеФормы() + + ОшибкиКрасным = УсловноеОформление.Элементы.Добавить(); + + ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ОшибкиКрасным.Отбор, "ТаблицаОбъектовИсправления.НеудачнаяПопытка", ВидСравненияКомпоновкиДанных.Равно, Истина); + ОшибкиКрасным.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноКрасный); + + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияПроблемныйОбъект"); + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияРезультатПроведения"); + ПолеОформления = ОшибкиКрасным.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТаблицаОбъектовИсправленияНеудачнаяПопытка"); + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьТаблицуФормы() + + Если ТипЗнч(Параметры.ДанныеВыделенныхСтрок) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + Для каждого ПроблемныйОбъект Из Параметры.ДанныеВыделенныхСтрок Цикл + + НоваяСтрока = ТаблицаОбъектовИсправления.Добавить(); + НоваяСтрока.ОбработатьСтроку = Истина; + НоваяСтрока.ПроблемныйОбъект = ПроблемныйОбъект; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПровестиДокументыНаСервере(ПараметрыПроведения) + + ШаблонПредупреждения = НСтр("ru ='Документ [%1] не проводился из-за ошибок проверки заполнения. + |Для устранения проблемы откройте документ и выполните проведение в ручном режиме.'", ОбщегоНазначения.КодОсновногоЯзыка()); + + + Для Каждого ВыделеннаяСтрока Из ТаблицаОбъектовИсправления Цикл + + Если НЕ ВыделеннаяСтрока.ОбработатьСтроку Тогда + + Продолжить; + + КонецЕсли; + + ПараметрыПроведения.КоличествоВсего = ПараметрыПроведения.КоличествоВсего + 1; + + НачатьТранзакцию(); + Попытка + + ЗаблокироватьДанныеДляРедактирования(ВыделеннаяСтрока.ПроблемныйОбъект); + + ДокументОбъект = ВыделеннаяСтрока.ПроблемныйОбъект.ПолучитьОбъект(); + Если ДокументОбъект.ПроверитьЗаполнение() Тогда + + Если Элементы.ТаблицаОбъектовИсправленияПроводитьВРежимеРазработчика.Пометка Тогда + + ДокументОбъект.ОбменДанными.Загрузка = Истина; + + КонецЕсли; + + ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); + + ВыделеннаяСтрока.РезультатИсправления = НСтр("ru ='Документ успешно проведен.'"); + ПараметрыПроведения.КоличествоПроведенные = ПараметрыПроведения.КоличествоПроведенные + 1; + + Иначе + + ВыделеннаяСтрока.РезультатИсправления = СтрШаблон(ШаблонПредупреждения, ВыделеннаяСтрока.ПроблемныйОбъект); + ВыделеннаяСтрока.НеудачнаяПопытка = Истина; + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + ВыделеннаяСтрока.РезультатИсправления = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВыделеннаяСтрока.НеудачнаяПопытка = Истина; + + КонецПопытки; + + КонецЦикла; + + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Form.form new file mode 100644 index 000000000..da165bf2e --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Form.form @@ -0,0 +1,757 @@ + + + + <key>ru</key> + <value>Отбор по типам предупреждений</value> + + + ОсновныеОтборы + 22 + + Отправка + 24 + + ОшибкаПроверкиПередОтправкойXTDO + 19 + true + true + + true + + + ОшибкаПроверкиПередОтправкойXTDO + + Right + + ОшибкаПроверкиПередОтправкойXTDOРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + ОшибкаПроверкиПередОтправкойXTDOКонтекстноеМеню + 20 + true + + CheckBoxField + Enter + true + Left + true + + + + ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных + 13 + true + true + + true + + + ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных + + Right + + ОшибкаВыполненияКодаОбработчиковПриОтправкеДанныхРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + ОшибкаВыполненияКодаОбработчиковПриОтправкеДанныхКонтекстноеМеню + 14 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Отправка</value> + + 30 + false + + ОтправкаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + Получение + 26 + + НепроведенныйДокумент + 1 + true + true + + true + + + НепроведенныйДокумент + + Right + + НепроведенныйДокументРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + НепроведенныйДокументКонтекстноеМеню + 2 + true + + CheckBoxField + Enter + true + Left + true + + + + НезаполненныеРеквизиты + 4 + true + true + + true + + + НезаполненныеРеквизиты + + Right + + НезаполненныеРеквизитыРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + НезаполненныеРеквизитыКонтекстноеМеню + 5 + true + + CheckBoxField + Enter + true + Left + true + + + + НепринятыеДанныеПоКоллизии + 7 + true + true + + true + + + НепринятыеДанныеПоКоллизии + + Right + + НепринятыеДанныеПоКоллизииРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + + НепринятыеДанныеПоКоллизииКонтекстноеМеню + 8 + true + + CheckBoxField + Enter + true + Left + true + + + + ПринятыеДанныеПоКоллизии + 37 + true + true + + true + + + ПринятыеДанныеПоКоллизии + + Right + + ПринятыеДанныеПоКоллизииРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ПринятыеДанныеПоКоллизииКонтекстноеМеню + 38 + true + + CheckBoxField + Enter + true + Left + true + + + + НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе + 10 + true + true + + true + + + НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе + + Right + + НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазеРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазеКонтекстноеМеню + 11 + true + + CheckBoxField + Enter + true + Left + true + + + + НепринятыйПоДатеЗапретаОбъектСуществуетВБазе + 40 + true + true + + true + + + НепринятыйПоДатеЗапретаОбъектСуществуетВБазе + + Right + + НепринятыйПоДатеЗапретаОбъектСуществуетВБазеРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + НепринятыйПоДатеЗапретаОбъектСуществуетВБазеКонтекстноеМеню + 41 + true + + CheckBoxField + Enter + true + Left + true + + + + ОшибкаВыполненияКодаОбработчиковПриПолученииДанных + 16 + true + true + + true + + + ОшибкаВыполненияКодаОбработчиковПриПолученииДанных + + Right + + ОшибкаВыполненияКодаОбработчиковПриПолученииДанныхРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + ОшибкаВыполненияКодаОбработчиковПриПолученииДанныхКонтекстноеМеню + 17 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Получение</value> + + 40 + false + + ПолучениеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Основные отборы</value> + + + ОсновныеОтборыРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + Декорация1 + 32 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 33 + true + + Label + true + true + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 35 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаСбросить + 43 + true + true + + true + + + ФормаСброситьРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Command.Сбросить + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтмена + 30 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + Vertical + true + true + true + auto + true + + НепроведенныйДокумент + + <key>ru</key> + <value>Непроведенные документы</value> + + 1 + + Boolean + + + true + + + true + + + + НезаполненныеРеквизиты + + <key>ru</key> + <value>Незаполненные реквизиты</value> + + 2 + + Boolean + + + true + + + true + + + + НепринятыеДанныеПоКоллизии + + <key>ru</key> + <value>Непринятые данные по коллизии</value> + + 3 + + Boolean + + + true + + + true + + + + НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе + + <key>ru</key> + <value>Непринятые по дате запрета (объект не существует)</value> + + 4 + + Boolean + + + true + + + true + + + + ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных + + <key>ru</key> + <value>Ошибки кода обработчиков при отправке</value> + + 5 + + Boolean + + + true + + + true + + + + ОшибкаВыполненияКодаОбработчиковПриПолученииДанных + + <key>ru</key> + <value>Ошибки кода обработчиков при получении</value> + + 6 + + Boolean + + + true + + + true + + + + ОшибкаПроверкиПередОтправкойXTDO + + <key>ru</key> + <value>Ошибка проверки перед отправкой (XTDO)</value> + + 7 + + Boolean + + + true + + + true + + + + ПринятыеДанныеПоКоллизии + + <key>ru</key> + <value>Принятые данные по коллизии</value> + + 8 + + Boolean + + + true + + + true + + + + НепринятыйПоДатеЗапретаОбъектСуществуетВБазе + + <key>ru</key> + <value>Непринятый по дате запрета (объект существует)</value> + + 9 + + Boolean + + + true + + + true + + + + КэшЗначений + 10 + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Сбросить + + <key>ru</key> + <value>Сбросить</value> + + 2 + + ru + Сбросить + + + true + + + + Сбросить + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Module.bsl new file mode 100644 index 000000000..6ea38fe78 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборПредупрежденийПоТипам/Module.bsl @@ -0,0 +1,130 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Перем ОтборТипыПредупреждений; + + ПодсистемаВерсионированияСуществует = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов"); + + КэшЗначений = Новый Структура; + КэшЗначений.Вставить("ПодсистемаВерсионированияСуществует", ПодсистемаВерсионированияСуществует); + КэшЗначений.Вставить("НепринятыеДанныеПоКоллизии", Неопределено); + КэшЗначений.Вставить("ПринятыеДанныеПоКоллизии", Неопределено); + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе", Неопределено); + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектСуществуетВБазе", Неопределено); + + Если ПодсистемаВерсионированияСуществует Тогда + + МенеджерПеречисления = Перечисления["ТипыВерсийОбъекта"]; + КэшЗначений.НепринятыеДанныеПоКоллизии = МенеджерПеречисления.НепринятыеДанныеПоКоллизии; + КэшЗначений.ПринятыеДанныеПоКоллизии = МенеджерПеречисления.ПринятыеДанныеПоКоллизии; + КэшЗначений.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе = МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе; + КэшЗначений.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе = МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе; + + КонецЕсли; + + Параметры.Свойство("ОтборТипыПредупреждений", ОтборТипыПредупреждений); + ЗначенияОтбораТиповПредупрежденийВРеквизитыФормы(ОтборТипыПредупреждений); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + СоответствиеРеквизитов = Новый Соответствие; + СоответствиеРеквизитов.Вставить("НезаполненныеРеквизиты", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты")); + СоответствиеРеквизитов.Вставить("НепроведенныйДокумент", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент")); + СоответствиеРеквизитов.Вставить("ОшибкаПроверкиПередОтправкойXTDO", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта")); + СоответствиеРеквизитов.Вставить("ОшибкаВыполненияКодаОбработчиковПриПолученииДанных", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных")); + СоответствиеРеквизитов.Вставить("ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных", ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных")); + + Если КэшЗначений.ПодсистемаВерсионированияСуществует Тогда + + СоответствиеРеквизитов.Вставить("НепринятыеДанныеПоКоллизии", КэшЗначений.НепринятыеДанныеПоКоллизии); + СоответствиеРеквизитов.Вставить("ПринятыеДанныеПоКоллизии", КэшЗначений.ПринятыеДанныеПоКоллизии); + СоответствиеРеквизитов.Вставить("НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе", КэшЗначений.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе); + СоответствиеРеквизитов.Вставить("НепринятыйПоДатеЗапретаОбъектСуществуетВБазе", КэшЗначений.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе); + + КонецЕсли; + + ОтборТипыПредупреждений = Новый Массив; + Для каждого ЗначениеСоответствия Из СоответствиеРеквизитов Цикл + + Если ЭтотОбъект[ЗначениеСоответствия.Ключ] Тогда + + ОтборТипыПредупреждений.Добавить(ЗначениеСоответствия.Значение); + + КонецЕсли; + + КонецЦикла; + + Закрыть(ОтборТипыПредупреждений); + +КонецПроцедуры + +&НаКлиенте +Процедура Сбросить(Команда) + + НезаполненныеРеквизиты = Ложь; + НепроведенныйДокумент = Ложь; + ОшибкаПроверкиПередОтправкойXTDO = Ложь; + ОшибкаВыполненияКодаОбработчиковПриПолученииДанных = Ложь; + ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных = Ложь; + НепринятыеДанныеПоКоллизии = Ложь; + НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе = Ложь; + НепринятыйПоДатеЗапретаОбъектСуществуетВБазе = Ложь; + ПринятыеДанныеПоКоллизии = Ложь; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ЗначенияОтбораТиповПредупрежденийВРеквизитыФормы(ОтборТипыПредупреждений) + + Если ТипЗнч(ОтборТипыПредупреждений) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + СоответствиеРеквизитов = Новый Соответствие; + СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты, "НезаполненныеРеквизиты"); + СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент, "НепроведенныйДокумент"); + СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта, "ОшибкаПроверкиПередОтправкойXTDO"); + СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных, "ОшибкаВыполненияКодаОбработчиковПриПолученииДанных"); + СоответствиеРеквизитов.Вставить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных, "ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных"); + + Если КэшЗначений.ПодсистемаВерсионированияСуществует Тогда + + СоответствиеРеквизитов.Вставить(КэшЗначений.НепринятыеДанныеПоКоллизии, "НепринятыеДанныеПоКоллизии"); + СоответствиеРеквизитов.Вставить(КэшЗначений.ПринятыеДанныеПоКоллизии, "ПринятыеДанныеПоКоллизии"); + СоответствиеРеквизитов.Вставить(КэшЗначений.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе, "НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе"); + СоответствиеРеквизитов.Вставить(КэшЗначений.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе, "НепринятыйПоДатеЗапретаОбъектСуществуетВБазе"); + + КонецЕсли; + + Для каждого ТипПредупреждения Из ОтборТипыПредупреждений Цикл + + ЭтотОбъект[СоответствиеРеквизитов[ТипПредупреждения]] = Истина; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Form.form new file mode 100644 index 000000000..88a179fa1 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Form.form @@ -0,0 +1,472 @@ + + + + Группа1 + 22 + + СписокСинхронизаций + 37 + + <key>ru</key> + <value>Синхронизаций</value> + + true + true + + true + + + СписокСинхронизаций + + true + None + + СписокСинхронизацийИспользование + 53 + true + true + + true + + + СписокСинхронизаций.Использование + + + СписокСинхронизацийИспользованиеРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + СписокСинхронизацийИспользованиеКонтекстноеМеню + 54 + true + + CheckBoxField + Auto + Left + true + Left + true + + + + СписокСинхронизацийСинхронизация + 50 + true + true + + true + + + СписокСинхронизаций.Синхронизация + + + СписокСинхронизацийСинхронизацияРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + СписокСинхронизацийСинхронизацияКонтекстноеМеню + 51 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + СписокСинхронизацийКоманднаяПанель + 39 + Left + true + + + СписокСинхронизацийСтрокаПоиска + 41 + + СписокСинхронизацийСтрокаПоискаРасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + СписокСинхронизацийСтрокаПоискаКонтекстноеМеню + 42 + true + + СписокСинхронизаций + + true + + + + СписокСинхронизацийСостояниеПросмотра + 44 + + СписокСинхронизацийСостояниеПросмотраРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + СписокСинхронизацийСостояниеПросмотраКонтекстноеМеню + 45 + true + + ViewStatusAddition + СписокСинхронизаций + + true + + + + СписокСинхронизацийУправлениеПоиском + 47 + + СписокСинхронизацийУправлениеПоискомРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + + СписокСинхронизацийУправлениеПоискомКонтекстноеМеню + 48 + true + + SearchControlAddition + СписокСинхронизаций + + true + + + + СписокСинхронизацийРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + СписокСинхронизацийКонтекстноеМеню + 38 + true + + true + true + true + MultiRow +
              true
              + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + AsFileRef + true + +
              + true + true + + true + + + <key>ru</key> + <value>Группа1</value> + + + Группа1РасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + +
              + + Декорация1 + 32 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 33 + true + + Label + true + true + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 35 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаВыключитьВсе + 56 + true + true + + true + + + ФормаВыключитьВсеРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + Form.Command.Сбросить + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтмена + 30 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + СписокСинхронизаций + + <key>ru</key> + <value>Список синхронизаций</value> + + 1 + + ValueTable + + + true + + + true + + + Синхронизация + + <key>ru</key> + <value>Синхронизация</value> + + 1 + + ExchangePlanRef + + + true + + + true + + + + Использование + + <key>ru</key> + <value>...</value> + + 2 + + Boolean + + + true + + + true + + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + Сбросить + + <key>ru</key> + <value>Сбросить</value> + + 2 + + ru + Сбросить + + + true + + + + Сбросить + + + Auto + Auto + + + + + +
              diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Module.bsl new file mode 100644 index 000000000..a4ebc61c3 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ОтборСинхронизаций/Module.bsl @@ -0,0 +1,70 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Перем МассивУзловПланаОбмена, ОтборУзловПланаОбмена; + + Параметры.Свойство("МассивУзловПланаОбмена", МассивУзловПланаОбмена); + Параметры.Свойство("ОтборУзловПланаОбмена", ОтборУзловПланаОбмена); + + Если ТипЗнч(МассивУзловПланаОбмена) = Тип("Массив") Тогда + + ЕстьДействующийОтбор = (ТипЗнч(ОтборУзловПланаОбмена) = Тип("Массив")); + + Для каждого Синхронизация Из МассивУзловПланаОбмена Цикл + + НоваяСтрока = СписокСинхронизаций.Добавить(); + НоваяСтрока.Синхронизация = Синхронизация; + НоваяСтрока.Использование = (ЕстьДействующийОтбор И ОтборУзловПланаОбмена.Найти(Синхронизация) <> Неопределено); + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ОтборУзловПланаОбмена = Новый Массив; + Для каждого СтрокаСинхронизации Из СписокСинхронизаций Цикл + + Если НЕ СтрокаСинхронизации.Использование Тогда + + Продолжить; + + КонецЕсли; + + ОтборУзловПланаОбмена.Добавить(СтрокаСинхронизации.Синхронизация); + + КонецЦикла; + + Закрыть(ОтборУзловПланаОбмена); + +КонецПроцедуры + +&НаКлиенте +Процедура Сбросить(Команда) + + Для каждого СтрокаТаблицы Из СписокСинхронизаций Цикл + + СтрокаТаблицы.Использование = Ложь; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Form.form new file mode 100644 index 000000000..ea74f69da --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Form.form @@ -0,0 +1,613 @@ + + + + ДекорацияКартинка + 1 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + ShowRight + + ДекорацияКартинкаРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>Неудачная попытка отправки объекта. Откройте форму объекта и проверьте корректность заполнения реквизитов. +Если предупреждение потеряло свою актуальность воспользуйтесь командой "Скрыть из списка", при этом необходимо помнить, что предупреждения, которые связаны с отправкой данных обновляются после каждой сессии обмена. +</value> + + Label + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 2 + true + + true + true + + + CommonPicture.Ошибка32 + + AsFileRef + + + + ДатаВозникновения + 23 + true + true + + true + + + ДатаВозникновения + + + ДатаВозникновенияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДатаВозникновенияКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + 40 + true + true + + ru + ДЛФ=DDT + + + + + УзелИнформационнойБазы + 13 + true + true + + true + + + УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + ПроблемныйОбъект + 10 + true + true + + true + + + ПроблемныйОбъект + + true + + ПроблемныйОбъектРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПроблемныйОбъектКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + + Click + ПроблемныйОбъектНажатие + + true + true + true + + + + Описание + 4 + true + true + + true + + + Описание + + + ОписаниеРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + 9 + true + true + true + true + true + true + Normal + + + + КомментарийПредупреждения + 20 + true + true + + true + + + КомментарийПредупреждения + + + OnChange + КомментарийПредупрежденияПриИзменении + + + КомментарийПредупрежденияРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КомментарийПредупрежденияКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаСкрытьПредупреждение + 26 + + СкрытьПредупреждение + 28 + true + true + + true + + + СкрытьПредупреждение + + Right + Button + + OnChange + СкрытьПредупреждениеПриИзменении + + + СкрытьПредупреждениеРасширеннаяПодсказка + 30 + + <key>ru</key> + <value>Пользователь может самостоятельно определить, является ли текущее предупреждение проблемой. Если предупреждение более неактуально, можно выполнить команду "Скрыть из списка". После нажатия и сохранения предупреждение будет скрыто из общего списка.</value> + + Label + true + true + + Left + + + + СкрытьПредупреждениеКонтекстноеМеню + 29 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Скрыть предупреждение</value> + + true + + ГруппаСкрытьПредупреждениеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 16 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 18 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Описание + + <key>ru</key> + <value>Описание</value> + + 1 + + String + + + + true + + + true + + + + СкрытьПредупреждение + + <key>ru</key> + <value>Скрыть предупреждение</value> + + 2 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Объект</value> + + 3 + + DocumentRef + CatalogRef + + + true + + + true + + + + УзелИнформационнойБазы + + <key>ru</key> + <value>Синхронизация</value> + + 4 + + ExchangePlanRef + + + true + + + true + + + + ТипПредупреждения + 5 + + EnumRef.ТипыПроблемОбменаДанными + EnumRef.ТипыВерсийОбъекта + + + true + + + true + + + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка + 6 + + Boolean + + + true + + + true + + + + КомментарийПредупреждения + + <key>ru</key> + <value>Комментарий администратора к предупреждению синхронизации</value> + + 7 + + String + + 1000 + + + + true + + + true + + + + ДатаВозникновения + + <key>ru</key> + <value>Дата возникновения</value> + + 8 + + Date + + + + true + + + true + + + + КлючУникальностиЗаписиРегистраСведений + 9 + + String + + 32 + + + + true + + + true + + + + ОбъектМетаданных + 10 + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + true + + + true + + + + ТребуетсяОбновлениеКомментария + 11 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Module.bsl new file mode 100644 index 000000000..0c4feb06f --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеКонвертацииОбъектаПриОтправке/Module.bsl @@ -0,0 +1,145 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + Параметры.Свойство("Описание", Описание); + Параметры.Свойство("ТипПредупреждения", ТипПредупреждения); + Параметры.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы); + Параметры.Свойство("СкрытьПредупреждение", СкрытьПредупреждение); + Параметры.Свойство("ДатаВозникновения", ДатаВозникновения); + Параметры.Свойство("ОбъектМетаданных", ОбъектМетаданных); + Параметры.Свойство("КлючУникальности", КлючУникальностиЗаписиРегистраСведений); + Параметры.Свойство("КомментарийПредупреждения", КомментарийПредупреждения); + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Ложь; + ТребуетсяОбновлениеКомментария = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзменитьКартинкуДекорации() + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СкрытьПредупреждениеПриИзменении(Элемент) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроблемныйОбъектНажатие(Элемент, СтандартнаяОбработка) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийПредупрежденияПриИзменении(Элемент) + + ТребуетсяОбновлениеКомментария = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ПередЗакрытиемНаСервере(); + + Если ТребуетсяОбновлениеПризнакаСкрытьИзСписка + ИЛИ ТребуетсяОбновлениеКомментария Тогда + + Закрыть(Новый Структура("ТребуетсяОбновлениеСписка", Истина)); + + Иначе + + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьКартинкуДекорации() + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗакрытиемНаСервере() + + Если НЕ ТребуетсяОбновлениеПризнакаСкрытьИзСписка + И НЕ ТребуетсяОбновлениеКомментария Тогда + + Возврат; + + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.РезультатыОбменаДанными.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ТипПроблемы = ТипПредупреждения; + МенеджерЗаписи.УзелИнформационнойБазы = УзелИнформационнойБазы; + МенеджерЗаписи.ОбъектМетаданных = ОбъектМетаданных; + МенеджерЗаписи.ПроблемныйОбъект = ПроблемныйОбъект; + МенеджерЗаписи.КлючУникальности = КлючУникальностиЗаписиРегистраСведений; + + МенеджерЗаписи.Прочитать(); // читаем для сохранения реквизитов, которые не передаем на форму + Если НЕ МенеджерЗаписи.Выбран() Тогда + + // Сценарий: открыли карточку предупреждения, а параллельно поправили проблему + Возврат; + + КонецЕсли; + + МенеджерЗаписи.ДатаВозникновения = ДатаВозникновения; + МенеджерЗаписи.Комментарий = КомментарийПредупреждения; + МенеджерЗаписи.Пропущена = СкрытьПредупреждение; + МенеджерЗаписи.Записать(Истина); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Form.form new file mode 100644 index 000000000..08293737d --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Form.form @@ -0,0 +1,612 @@ + + + + ДекорацияКартинка + 1 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + ShowRight + + ДекорацияКартинкаРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>В объекте остались пустые (незаполненные) реквизиты. Откройте объект и попробуйте заполнить реквизиты вручную. +Если предупреждение потеряло свою актуальность воспользуйтесь командой "Скрыть из списка".</value> + + Label + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 2 + true + + true + true + + + CommonPicture.Ошибка32 + + AsFileRef + + + + ДатаВозникновения + 23 + true + true + + true + + + ДатаВозникновения + + + ДатаВозникновенияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДатаВозникновенияКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + 40 + true + true + + ru + ДЛФ=DDT + + + + + УзелИнформационнойБазы + 13 + true + true + + true + + + УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + ПроблемныйОбъект + 10 + true + true + + true + + + ПроблемныйОбъект + + true + + ПроблемныйОбъектРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПроблемныйОбъектКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + + Click + ПроблемныйОбъектНажатие + + true + true + true + + + + Описание + 4 + true + true + + true + + + Описание + + + ОписаниеРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + 9 + true + true + true + true + true + true + Normal + + + + КомментарийПредупреждения + 20 + true + true + + true + + + КомментарийПредупреждения + + + OnChange + КомментарийПредупрежденияПриИзменении + + + КомментарийПредупрежденияРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КомментарийПредупрежденияКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаСкрытьПредупреждение + 26 + + СкрытьПредупреждение + 7 + true + true + + true + + + СкрытьПредупреждение + + Right + Button + + OnChange + СкрытьПредупреждениеПриИзменении + + + СкрытьПредупреждениеРасширеннаяПодсказка + 9 + + <key>ru</key> + <value>Пользователь может самостоятельно определить, является ли текущее предупреждение проблемой. Если предупреждение более неактуально, можно выполнить команду "Скрыть из списка". После нажатия и сохранения предупреждение будет скрыто из общего списка.</value> + + Label + true + true + + Left + + + + СкрытьПредупреждениеКонтекстноеМеню + 8 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Скрыть предупреждение</value> + + true + + ГруппаСкрытьПредупреждениеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 16 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 18 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Описание + + <key>ru</key> + <value>Описание</value> + + 1 + + String + + + + true + + + true + + + + СкрытьПредупреждение + + <key>ru</key> + <value>Скрыть предупреждение</value> + + 2 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Объект</value> + + 3 + + DocumentRef + CatalogRef + + + true + + + true + + + + УзелИнформационнойБазы + + <key>ru</key> + <value>Синхронизация</value> + + 4 + + ExchangePlanRef + + + true + + + true + + + + ТипПредупреждения + 5 + + EnumRef.ТипыПроблемОбменаДанными + EnumRef.ТипыВерсийОбъекта + + + true + + + true + + + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка + 6 + + Boolean + + + true + + + true + + + + КомментарийПредупреждения + + <key>ru</key> + <value>Комментарий администратора к предупреждению синхронизации</value> + + 7 + + String + + 1000 + + + + true + + + true + + + + ТребуетсяОбновлениеКомментария + 8 + + Boolean + + + true + + + true + + + + ОбъектМетаданных + 9 + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + true + + + true + + + + КлючУникальностиЗаписиРегистраСведений + 10 + + String + + 32 + + + + true + + + true + + + + ДатаВозникновения + + <key>ru</key> + <value>Дата возникновения</value> + + 11 + + Date + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Module.bsl new file mode 100644 index 000000000..e4633ce2e --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНезаполненногоРеквизита/Module.bsl @@ -0,0 +1,137 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + Параметры.Свойство("Описание", Описание); + Параметры.Свойство("ТипПредупреждения", ТипПредупреждения); + Параметры.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы); + Параметры.Свойство("СкрытьПредупреждение", СкрытьПредупреждение); + Параметры.Свойство("ДатаВозникновения", ДатаВозникновения); + Параметры.Свойство("ОбъектМетаданных", ОбъектМетаданных); + Параметры.Свойство("КлючУникальности", КлючУникальностиЗаписиРегистраСведений); + Параметры.Свойство("КомментарийПредупреждения", КомментарийПредупреждения); + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Ложь; + ТребуетсяОбновлениеКомментария = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзменитьКартинкуДекорации() + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СкрытьПредупреждениеПриИзменении(Элемент) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + ИзменитьКартинкуДекорации(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроблемныйОбъектНажатие(Элемент, СтандартнаяОбработка) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийПредупрежденияПриИзменении(Элемент) + + ТребуетсяОбновлениеКомментария = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ПередЗакрытиемНаСервере(); + + Если ТребуетсяОбновлениеПризнакаСкрытьИзСписка + ИЛИ ТребуетсяОбновлениеКомментария Тогда + + Закрыть(Новый Структура("ТребуетсяОбновлениеСписка", Истина)); + + Иначе + + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьКартинкуДекорации() + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗакрытиемНаСервере() + + Если НЕ ТребуетсяОбновлениеПризнакаСкрытьИзСписка + И НЕ ТребуетсяОбновлениеКомментария Тогда + + Возврат; + + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.РезультатыОбменаДанными.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ТипПроблемы = ТипПредупреждения; + МенеджерЗаписи.УзелИнформационнойБазы = УзелИнформационнойБазы; + МенеджерЗаписи.ОбъектМетаданных = ОбъектМетаданных; + МенеджерЗаписи.ПроблемныйОбъект = ПроблемныйОбъект; + МенеджерЗаписи.КлючУникальности = КлючУникальностиЗаписиРегистраСведений; + + МенеджерЗаписи.Прочитать(); // читаем для сохранения реквизитов, которые не передаем на форму + Если НЕ МенеджерЗаписи.Выбран() Тогда + + // Сценарий: открыли карточку предупреждения, а параллельно поправили проблему + Возврат; + + КонецЕсли; + + МенеджерЗаписи.ДатаВозникновения = ДатаВозникновения; + МенеджерЗаписи.Комментарий = КомментарийПредупреждения; + МенеджерЗаписи.Пропущена = СкрытьПредупреждение; + МенеджерЗаписи.Записать(Истина); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Form.form new file mode 100644 index 000000000..58cb0e48a --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Form.form @@ -0,0 +1,697 @@ + + + + ДекорацияКартинка + 1 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + ShowRight + + ДекорацияКартинкаРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>Неудачная попытка проведения документа. Откройте форму документа и попробуйте выполнить проведение в ручном режиме. +Если предупреждение потеряло свою актуальность воспользуйтесь командой "Скрыть из списка".</value> + + Label + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 2 + true + + true + true + + + CommonPicture.Ошибка32 + + AsFileRef + + + + ДатаВозникновения + 27 + true + true + + true + + + ДатаВозникновения + + + ДатаВозникновенияРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + + ДатаВозникновенияКонтекстноеМеню + 28 + true + + LabelField + Enter + true + Left + true + + 40 + true + true + + ru + ДЛФ=DDT + + + + + УзелИнформационнойБазы + 13 + true + true + + true + + + УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + ГруппаПроблемныйОбъект + 20 + + ПроблемныйОбъект + 10 + true + true + + true + + + ПроблемныйОбъект + + true + + ПроблемныйОбъектРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПроблемныйОбъектКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + + Click + ПроблемныйОбъектНажатие + + true + true + true + + + + ПровестиДокумент + 22 + true + true + + true + + + ПровестиДокументРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualButton + Form.Command.ПровестиДокумент + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Проблемный объект</value> + + + ГруппаПроблемныйОбъектРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + Описание + 4 + true + true + + true + + + Описание + + + ОписаниеРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + 9 + true + true + true + true + true + true + Normal + + + + КомментарийПредупреждения + 24 + true + true + + true + + + КомментарийПредупреждения + + + OnChange + КомментарийПредупрежденияПриИзменении + + + КомментарийПредупрежденияРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + КомментарийПредупрежденияКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаСкрытьПредупреждение + 30 + + СкрытьПредупреждение + 32 + true + true + + true + + + СкрытьПредупреждение + + Right + Button + + OnChange + СкрытьПредупреждениеПриИзменении + + + СкрытьПредупреждениеРасширеннаяПодсказка + 34 + + <key>ru</key> + <value>Пользователь может самостоятельно определить, является ли текущее предупреждение проблемой. Если предупреждение более неактуально, можно выполнить команду "Скрыть из списка". После нажатия и сохранения предупреждение будет скрыто из общего списка.</value> + + Label + true + true + + Left + + + + СкрытьПредупреждениеКонтекстноеМеню + 33 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Скрыть предупреждение</value> + + true + + ГруппаСкрытьПредупреждениеРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 16 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 18 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Описание + + <key>ru</key> + <value>Описание</value> + + 1 + + String + + + + true + + + true + + + + СкрытьПредупреждение + + <key>ru</key> + <value>Скрыть предупреждение</value> + + 2 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Объект</value> + + 3 + + DocumentRef + CatalogRef + + + true + + + true + + + + УзелИнформационнойБазы + + <key>ru</key> + <value>Синхронизация</value> + + 4 + + ExchangePlanRef + + + true + + + true + + + + ТипПредупреждения + 5 + + EnumRef.ТипыПроблемОбменаДанными + EnumRef.ТипыВерсийОбъекта + + + true + + + true + + + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка + 6 + + Boolean + + + true + + + true + + + + КомментарийПредупреждения + + <key>ru</key> + <value>Комментарий администратора к предупреждению синхронизации</value> + + 7 + + String + + 1000 + + + + true + + + true + + + + КлючУникальностиЗаписиРегистраСведений + 8 + + String + + 32 + + + + true + + + true + + + + ДатаВозникновения + + <key>ru</key> + <value>Дата возникновения</value> + + 9 + + Date + + + + true + + + true + + + + ТребуетсяОбновлениеКомментария + 10 + + Boolean + + + true + + + true + + + + ОбъектМетаданных + 11 + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ПровестиДокумент + + <key>ru</key> + <value>Провести</value> + + 2 + + ru + Провести документ + + + true + + + StdPicture.Post + + + + ПровестиДокумент + + + TextPicture + DontUse + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Module.bsl new file mode 100644 index 000000000..b40ec615c --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеНепроведенногоДокумента/Module.bsl @@ -0,0 +1,192 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + Параметры.Свойство("Описание", Описание); + Параметры.Свойство("ТипПредупреждения", ТипПредупреждения); + Параметры.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы); + Параметры.Свойство("СкрытьПредупреждение", СкрытьПредупреждение); + Параметры.Свойство("ДатаВозникновения", ДатаВозникновения); + Параметры.Свойство("ОбъектМетаданных", ОбъектМетаданных); + Параметры.Свойство("КлючУникальности", КлючУникальностиЗаписиРегистраСведений); + Параметры.Свойство("КомментарийПредупреждения", КомментарийПредупреждения); + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Ложь; + ТребуетсяОбновлениеКомментария = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзменитьКартинкуДекорации() + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СкрытьПредупреждениеПриИзменении(Элемент) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроблемныйОбъектНажатие(Элемент, СтандартнаяОбработка) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийПредупрежденияПриИзменении(Элемент) + + ТребуетсяОбновлениеКомментария = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ПередЗакрытиемНаСервере(); + + Если ТребуетсяОбновлениеПризнакаСкрытьИзСписка + ИЛИ ТребуетсяОбновлениеКомментария Тогда + + Закрыть(Новый Структура("ТребуетсяОбновлениеСписка", Истина)); + + Иначе + + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПровестиДокумент(Команда) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + ОчиститьСообщения(); + СообщениеОбОшибке = ""; + + ПровестиДокументы(ПроблемныйОбъект, СообщениеОбОшибке); + + Если НЕ ПустаяСтрока(СообщениеОбОшибке) Тогда + + ПоказатьПредупреждение(, СообщениеОбОшибке); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьКартинкуДекорации() + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗакрытиемНаСервере() + + Если НЕ ТребуетсяОбновлениеПризнакаСкрытьИзСписка + И НЕ ТребуетсяОбновлениеКомментария Тогда + + Возврат; + + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.РезультатыОбменаДанными.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ТипПроблемы = ТипПредупреждения; + МенеджерЗаписи.УзелИнформационнойБазы = УзелИнформационнойБазы; + МенеджерЗаписи.ОбъектМетаданных = ОбъектМетаданных; + МенеджерЗаписи.ПроблемныйОбъект = ПроблемныйОбъект; + МенеджерЗаписи.КлючУникальности = КлючУникальностиЗаписиРегистраСведений; + + МенеджерЗаписи.Прочитать(); // читаем для сохранения реквизитов, которые не передаем на форму + Если НЕ МенеджерЗаписи.Выбран() Тогда + + // Сценарий: открыли карточку предупреждения, а параллельно поправили проблему + Возврат; + + КонецЕсли; + + МенеджерЗаписи.ДатаВозникновения = ДатаВозникновения; + МенеджерЗаписи.Комментарий = КомментарийПредупреждения; + МенеджерЗаписи.Пропущена = СкрытьПредупреждение; + МенеджерЗаписи.Записать(Истина); + +КонецПроцедуры + +&НаСервере +Процедура ПровестиДокументы(ПроблемныйОбъект, СообщениеОбОшибке) + + НачатьТранзакцию(); + Попытка + + ЗаблокироватьДанныеДляРедактирования(ПроблемныйОбъект); + + ДокументОбъект = ПроблемныйОбъект.ПолучитьОбъект(); + Если ДокументОбъект.ПроверитьЗаполнение() Тогда + + ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); + + КонецЕсли; + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + + ШаблонСообщения = НСтр("ru = 'Не удалось провести документ ""%1"" по причине:%2 %3.'", ОбщегоНазначения.КодОсновногоЯзыка()); + ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбщегоНазначения.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ПроблемныйОбъект, Символы.ПС, ПредставлениеОшибки)); + + КонецПопытки; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Form.form new file mode 100644 index 000000000..748b899ba --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Form.form @@ -0,0 +1,892 @@ + + + + ДекорацияКартинка + 1 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + ShowRight + + ДекорацияКартинкаРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>Данные были одновременно изменены в этой и в другой программе, в результате чего появилось две версии +одного объекта (справочник, документ) и возник конфликт, который был разрешен автоматически. Если конфликт разрешен верно или предупреждение потеряло свою актуальность воспользуйтесь командой "Скрыть из списка"</value> + + Label + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 2 + true + + true + true + + + CommonPicture.Ошибка32 + + AsFileRef + + + + ДатаВозникновения + 35 + true + true + + true + + + ДатаВозникновения + + + ДатаВозникновенияРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ДатаВозникновенияКонтекстноеМеню + 36 + true + + LabelField + Enter + true + Left + true + + 40 + true + true + + ru + ДЛФ=DDT + + + + + УзелИнформационнойБазы + 13 + true + true + + true + + + УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + ГруппаПроблемныйОбъект + 20 + + ПроблемныйОбъект + 10 + true + true + + true + + + ПроблемныйОбъект + + true + + ПроблемныйОбъектРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПроблемныйОбъектКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + + Click + ПроблемныйОбъектНажатие + + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Проблемный объект</value> + + + ГруппаПроблемныйОбъектРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаКомандыИсправления + 22 + + ПоказатьОтличия + 28 + true + true + + true + + + ПоказатьОтличияРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.Command.ПоказатьОтличия + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьВерсиюВЭтойПрограмме + 26 + true + true + + true + + + ОткрытьВерсиюВЭтойПрограммеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюВЭтойПрограмме + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьВерсию + 24 + true + true + + true + + + ОткрытьВерсиюРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюДругойПрограммы + Normal + Auto + true + true + UserCmds + Auto + + + ПересмотретьРезультатРешенияКоллизии + 30 + true + true + + true + + + ПересмотретьРезультатРешенияКоллизииРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.Command.ПересмотретьРезультатРешенияКоллизии + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды исправления</value> + + + ГруппаКомандыИсправленияРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + CommandBar + + Left + + + + Описание + 4 + true + true + + true + + + Описание + + + ОписаниеРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + 9 + true + true + true + true + true + true + Normal + + + + КомментарийПредупреждения + 32 + true + true + + true + + + КомментарийПредупреждения + + + OnChange + КомментарийПредупрежденияПриИзменении + + + КомментарийПредупрежденияРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + КомментарийПредупрежденияКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаСкрытьПредупреждение + 38 + + СкрытьПредупреждение + 40 + true + true + + true + + + СкрытьПредупреждение + + Right + Button + + OnChange + СкрытьПредупреждениеПриИзменении + + + СкрытьПредупреждениеРасширеннаяПодсказка + 42 + + <key>ru</key> + <value>Пользователь может самостоятельно определить, является ли текущее предупреждение проблемой. Если предупреждение более неактуально, можно выполнить команду "Скрыть из списка". После нажатия и сохранения предупреждение будет скрыто из общего списка.</value> + + Label + true + true + + Left + + + + СкрытьПредупреждениеКонтекстноеМеню + 41 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Скрыть предупреждение</value> + + true + + ГруппаСкрытьПредупреждениеРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 16 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 18 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Описание + + <key>ru</key> + <value>Описание</value> + + 1 + + String + + + + true + + + true + + + + СкрытьПредупреждение + + <key>ru</key> + <value>Скрыть предупреждение</value> + + 2 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Объект</value> + + 3 + + DocumentRef + CatalogRef + + + true + + + true + + + + УзелИнформационнойБазы + + <key>ru</key> + <value>Синхронизация</value> + + 4 + + ExchangePlanRef + + + true + + + true + + + + ТипПредупреждения + 5 + + EnumRef.ТипыПроблемОбменаДанными + EnumRef.ТипыВерсийОбъекта + + + true + + + true + + + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка + 6 + + Boolean + + + true + + + true + + + + ВерсияИзДругойПрограммы + 7 + + Number + + 10 + true + + + + true + + + true + + + + ВерсияЭтойПрограммы + 8 + + Number + + 10 + true + + + + true + + + true + + + + КомментарийПредупреждения + + <key>ru</key> + <value>Комментарий администратора к предупреждению синхронизации</value> + + 10 + + String + + 1000 + + + + true + + + true + + + + ТребуетсяОбновлениеКомментария + 11 + + Boolean + + + true + + + true + + + + ДатаВозникновения + + <key>ru</key> + <value>Дата возникновения</value> + + 9 + + Date + + + + true + + + true + + + + ВерсияИзДругойПрограммыПринята + 12 + + Boolean + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ОткрытьВерсиюДругойПрограммы + + <key>ru</key> + <value>Показать версию из другой программы</value> + + 2 + + ru + Открыть непринятую версию + + + true + + + CommonPicture.СинхронизацияДанныхНепринятыеПоДате + + + + ОткрытьВерсиюДругойПрограммы + + + TextPicture + DontUse + Auto + + + ОткрытьВерсиюВЭтойПрограмме + + <key>ru</key> + <value>Показать версию в этой программе</value> + + 3 + + ru + Открыть версию в этой программе + + + true + + + + ОткрытьВерсиюВЭтойПрограмме + + + DontUse + Auto + + + ПоказатьОтличия + + <key>ru</key> + <value>Показать отличия</value> + + 4 + + ru + Показать отличия в виде отчета + + + true + + + CommonPicture.ПоказатьОтличия + + + + ПоказатьОтличия + + + TextPicture + DontUse + Auto + + + ПересмотретьРезультатРешенияКоллизии + + <key>ru</key> + <value>Пересмотреть результат</value> + + 5 + + ru + Пересмотреть результат решения коллизии + + + true + + + CommonPicture.СинхронизацияДанныхКоллизия + + + + ПересмотретьРезультатРешенияКоллизии + + + TextPicture + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Module.bsl new file mode 100644 index 000000000..1693e5817 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеОКоллизии/Module.bsl @@ -0,0 +1,272 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + Параметры.Свойство("Описание", Описание); + Параметры.Свойство("ТипПредупреждения", ТипПредупреждения); + Параметры.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы); + Параметры.Свойство("ВерсияИзДругойПрограммы", ВерсияИзДругойПрограммы); + Параметры.Свойство("ВерсияЭтойПрограммы", ВерсияЭтойПрограммы); + Параметры.Свойство("ВерсияИзДругойПрограммыПринята", ВерсияИзДругойПрограммыПринята); + Параметры.Свойство("ДатаВозникновения", ДатаВозникновения); + Параметры.Свойство("СкрытьПредупреждение", СкрытьПредупреждение); + Параметры.Свойство("КомментарийПредупреждения", КомментарийПредупреждения); + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Ложь; + ТребуетсяОбновлениеКомментария = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзменитьКартинкуДекорации() + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СкрытьПредупреждениеПриИзменении(Элемент) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроблемныйОбъектНажатие(Элемент, СтандартнаяОбработка) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийПредупрежденияПриИзменении(Элемент) + + ТребуетсяОбновлениеКомментария = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ПоказатьОтличия(Команда) + + Если ВерсияЭтойПрограммы = 0 + ИЛИ ВерсияИзДругойПрограммы = 0 Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Для сравнения должно быть две версии объекта.'"), ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ВерсияИзДругойПрограммы); + СравниваемыеВерсии.Добавить(ВерсияЭтойПрограммы); + + ОткрытьОтчетСравненияВерсий(ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсиюВЭтойПрограмме(Команда) + + Если НЕ ЗначениеЗаполнено(ПроблемныйОбъект) + Тогда + + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ВерсияЭтойПрограммы); + + ОткрытьОтчетСравненияВерсий(ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсиюДругойПрограммы(Команда) + + Если НЕ ЗначениеЗаполнено(ПроблемныйОбъект) Тогда + + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ВерсияИзДругойПрограммы); + + ОткрытьОтчетСравненияВерсий(ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ПересмотретьРезультатРешенияКоллизии(Команда) + + Если ВерсияИзДругойПрограммыПринята Тогда + + ТекстВопроса = НСтр("ru = 'Заменить версию, полученную из другой программы, на версию из этой программы?'"); + + Иначе + + ТекстВопроса = НСтр("ru = 'Заменить версию этой программы на версию, полученную из другой программы?'"); + + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершитьПересмотрРезультатаКоллизии", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьПересмотрРезультатаКоллизии(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + + Возврат; + + КонецЕсли; + + ОчиститьСообщения(); + + СообщениеОбОшибке = ""; + ПринятьОтклонитьВерсиюНаСервере(СообщениеОбОшибке); + + Если ПустаяСтрока(СообщениеОбОшибке) Тогда + + СкрытьПредупреждение = Истина; + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + Иначе + + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + ПередЗакрытиемНаСервере(); + + Если ТребуетсяОбновлениеПризнакаСкрытьИзСписка + ИЛИ ТребуетсяОбновлениеКомментария Тогда + + Закрыть(Новый Структура("ТребуетсяОбновлениеСписка", Истина)); + + Иначе + + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьКартинкуДекорации() + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МодульВерсионированиеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВерсионированиеОбъектовКлиент"); + МодульВерсионированиеОбъектовКлиент.ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПринятьОтклонитьВерсиюНаСервере(СообщениеОбОшибке) + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + Возврат; + + КонецЕсли; + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + Попытка + + МодульВерсионированиеОбъектов.ПриПереходеНаВерсиюОбъекта(ПроблемныйОбъект, ВерсияИзДругойПрограммы); + + Исключение + + ПредставлениеОбъекта = ?(ОбщегоНазначения.СсылкаСуществует(ПроблемныйОбъект), ПроблемныйОбъект, ПроблемныйОбъект.Метаданные()); + ТекстИсключения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ШаблонТекста = НСтр("ru = 'Не удалось принять версию объекта ""%1"" по причине:%2 %3.'", ОбщегоНазначения.КодОсновногоЯзыка()); + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ПредставлениеОбъекта, Символы.ПС, ТекстИсключения); + + ОбщегоНазначения.СообщитьПользователю(ТекстИсключения); + + КонецПопытки; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗакрытиемНаСервере() + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") + ИЛИ (НЕ ТребуетсяОбновлениеПризнакаСкрытьИзСписка + И НЕ ТребуетсяОбновлениеКомментария) Тогда + + Возврат; + + КонецЕсли; + + ПараметрыЗаписиРегистра = Новый Структура; + ПараметрыЗаписиРегистра.Вставить("Ссылка", ПроблемныйОбъект); + ПараметрыЗаписиРегистра.Вставить("НомерВерсии", ВерсияИзДругойПрограммы); + ПараметрыЗаписиРегистра.Вставить("ВерсияПроигнорирована", СкрытьПредупреждение); + ПараметрыЗаписиРегистра.Вставить("Комментарий", КомментарийПредупреждения); + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ИзменитьПредупреждениеСинхронизации(ПараметрыЗаписиРегистра, Истина); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Form.form new file mode 100644 index 000000000..ae9cb4398 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Form.form @@ -0,0 +1,878 @@ + + + + ДекорацияКартинка + 1 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + ShowRight + + ДекорацияКартинкаРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>При синхронизации были получены данные, которые были отклонены из-за установленного запрета на загрузку данных, в результате чего появилась непринятая версия документа. Для того чтобы принять версию несмотря на запрет, используйте команду "Принять версию". Если предупреждение потеряло свою актуальность воспользуйтесь командой "Скрыть из списка"</value> + + Label + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 2 + true + + true + true + + + CommonPicture.Ошибка32 + + AsFileRef + + + + ДатаВозникновения + 35 + true + true + + true + + + ДатаВозникновения + + + ДатаВозникновенияРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ДатаВозникновенияКонтекстноеМеню + 36 + true + + LabelField + Enter + true + Left + true + + 40 + true + true + + ru + ДЛФ=DDT + + + + + УзелИнформационнойБазы + 13 + true + true + + true + + + УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + ГруппаПроблемныйОбъект + 20 + + ПроблемныйОбъект + 10 + true + true + + true + + + ПроблемныйОбъект + + true + + ПроблемныйОбъектРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПроблемныйОбъектКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + + Click + ПроблемныйОбъектНажатие + + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Проблемный объект</value> + + + ГруппаПроблемныйОбъектРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаКомандыИсправления + 22 + + ПоказатьОтличия + 28 + true + true + + true + + + ПоказатьОтличияРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Form.Command.ПоказатьОтличия + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьВерсиюВЭтойПрограмме + 26 + true + true + + true + + + ОткрытьВерсиюВЭтойПрограммеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсиюЭтойПрограммы + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьВерсию + 24 + true + true + + true + + + ОткрытьВерсиюРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Command.ОткрытьВерсию + Normal + Auto + true + true + UserCmds + Auto + + + ПринятьВерсию + 30 + true + true + + true + + + ПринятьВерсиюРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + Form.Command.ПринятьВерсию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды исправления</value> + + + ГруппаКомандыИсправленияРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + CommandBar + + Left + + + + Описание + 4 + true + true + + true + + + Описание + + + ОписаниеРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + 9 + true + true + true + true + true + true + Normal + + + + КомментарийПредупреждения + 32 + true + true + + true + + + КомментарийПредупреждения + + + OnChange + КомментарийПредупрежденияПриИзменении + + + КомментарийПредупрежденияРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + + КомментарийПредупрежденияКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаСкрытьПредупреждение + 38 + + СкрытьПредупреждение + 40 + true + true + + true + + + СкрытьПредупреждение + + Right + Button + + OnChange + СкрытьПредупреждениеПриИзменении + + + СкрытьПредупреждениеРасширеннаяПодсказка + 42 + + <key>ru</key> + <value>Пользователь может самостоятельно определить, является ли текущее предупреждение проблемой. Если предупреждение более неактуально, можно выполнить команду "Скрыть из списка". После нажатия и сохранения предупреждение будет скрыто из общего списка.</value> + + Label + true + true + + Left + + + + СкрытьПредупреждениеКонтекстноеМеню + 41 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Скрыть предупреждение</value> + + true + + ГруппаСкрытьПредупреждениеРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 16 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 18 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Описание + + <key>ru</key> + <value>Описание</value> + + 1 + + String + + + + true + + + true + + + + СкрытьПредупреждение + + <key>ru</key> + <value>Скрыть предупреждение</value> + + 2 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Объект</value> + + 3 + + DocumentRef + CatalogRef + + + true + + + true + + + + УзелИнформационнойБазы + + <key>ru</key> + <value>Синхронизация</value> + + 4 + + ExchangePlanRef + + + true + + + true + + + + ТипПредупреждения + 5 + + EnumRef.ТипыПроблемОбменаДанными + EnumRef.ТипыВерсийОбъекта + + + true + + + true + + + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка + 6 + + Boolean + + + true + + + true + + + + ВерсияИзДругойПрограммы + 7 + + Number + + 15 + true + + + + true + + + true + + + + ВерсияЭтойПрограммы + 8 + + Number + + 10 + true + + + + true + + + true + + + + КомментарийПредупреждения + + <key>ru</key> + <value>Комментарий администратора к предупреждению синхронизации</value> + + 9 + + String + + 1000 + + + + true + + + true + + + + ТребуетсяОбновлениеКомментария + 10 + + Boolean + + + true + + + true + + + + ДатаВозникновения + + <key>ru</key> + <value>Дата возникновения</value> + + 12 + + Date + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + ОткрытьВерсию + + <key>ru</key> + <value>Показать непринятую версию</value> + + 2 + + ru + Открыть непринятую версию + + + true + + + CommonPicture.СинхронизацияДанныхНепринятыеПоДате + + + + ОткрытьВерсию + + + TextPicture + DontUse + Auto + + + ОткрытьВерсиюЭтойПрограммы + + <key>ru</key> + <value>Показать версию этой программы</value> + + 3 + + ru + Открыть версию этой программы + + + true + + + + ОткрытьВерсиюВЭтойПрограмме + + + DontUse + Auto + + + ПоказатьОтличия + + <key>ru</key> + <value>Показать отличия</value> + + 4 + + ru + Показать отличия в виде отчета + + + true + + + CommonPicture.ПоказатьОтличия + + + + ПоказатьОтличия + + + TextPicture + DontUse + Auto + + + ПринятьВерсию + + <key>ru</key> + <value>Принять отклоненную версию</value> + + 6 + + ru + Принять версию несмотря на установленный запрет загрузки данных + + + true + + + CommonPicture.СинхронизацияДанныхДанныеПолучены + + + + ПринятьВерсиюНепринятые + + + TextPicture + DontUse + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Module.bsl new file mode 100644 index 000000000..247e52282 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупреждениеПоДатеЗапретаЗагрузки/Module.bsl @@ -0,0 +1,264 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + Параметры.Свойство("Описание", Описание); + Параметры.Свойство("ТипПредупреждения", ТипПредупреждения); + Параметры.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы); + Параметры.Свойство("ВерсияИзДругойПрограммы", ВерсияИзДругойПрограммы); + Параметры.Свойство("ВерсияЭтойПрограммы", ВерсияЭтойПрограммы); + Параметры.Свойство("СкрытьПредупреждение", СкрытьПредупреждение); + Параметры.Свойство("ДатаВозникновения", ДатаВозникновения); + Параметры.Свойство("КомментарийПредупреждения", КомментарийПредупреждения); + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Ложь; + ТребуетсяОбновлениеКомментария = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзменитьКартинкуДекорации() + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СкрытьПредупреждениеПриИзменении(Элемент) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроблемныйОбъектНажатие(Элемент, СтандартнаяОбработка) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийПредупрежденияПриИзменении(Элемент) + + ТребуетсяОбновлениеКомментария = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОткрытьВерсию(Команда) + + Если НЕ ЗначениеЗаполнено(ПроблемныйОбъект) Тогда + + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ВерсияИзДругойПрограммы); + + ОткрытьОтчетСравненияВерсий(ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВерсиюВЭтойПрограмме(Команда) + + Если НЕ ЗначениеЗаполнено(ПроблемныйОбъект) + Тогда + + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ВерсияЭтойПрограммы); + + ОткрытьОтчетСравненияВерсий(ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ПринятьВерсиюНепринятые(Команда) + + ТекстВопроса = НСтр("ru = 'Принять версию, несмотря на запрет загрузки?'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПринятьВерсиюЗавершение", ЭтотОбъект); + + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + +КонецПроцедуры + +&НаКлиенте +Процедура ПринятьВерсиюЗавершение(Результат, ДополнительныеПараметры) Экспорт + + Если Результат <> КодВозвратаДиалога.Да Тогда + + Возврат; + + КонецЕсли; + + ОчиститьСообщения(); + + СообщениеОбОшибке = ""; + ПринятьОтклонитьВерсиюНаСервере(СообщениеОбОшибке); + + Если ПустаяСтрока(СообщениеОбОшибке) Тогда + + СкрытьПредупреждение = Истина; + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + Иначе + + ПоказатьПредупреждение(, СообщениеОбОшибке); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьОтличия(Элемент) + + Если ВерсияЭтойПрограммы = 0 + ИЛИ ВерсияИзДругойПрограммы = 0 Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Для сравнения должно быть две версии объекта.'"), ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + Возврат; + + КонецЕсли; + + СравниваемыеВерсии = Новый Массив; + СравниваемыеВерсии.Добавить(ВерсияЭтойПрограммы); + СравниваемыеВерсии.Добавить(ВерсияИзДругойПрограммы); + + ОткрытьОтчетСравненияВерсий(ПроблемныйОбъект, СравниваемыеВерсии); + +КонецПроцедуры + +&НаКлиенте +Процедура ОК(Команда) + + ПередЗакрытиемНаСервере(); + + Если ТребуетсяОбновлениеПризнакаСкрытьИзСписка + ИЛИ ТребуетсяОбновлениеКомментария Тогда + + Закрыть(Новый Структура("ТребуетсяОбновлениеСписка", Истина)); + + Иначе + + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьКартинкуДекорации() + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МодульВерсионированиеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВерсионированиеОбъектовКлиент"); + МодульВерсионированиеОбъектовКлиент.ОткрытьОтчетСравненияВерсий(Ссылка, СравниваемыеВерсии); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПринятьОтклонитьВерсиюНаСервере(СообщениеОбОшибке) + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + Возврат; + + КонецЕсли; + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + Попытка + + МодульВерсионированиеОбъектов.ПриПереходеНаВерсиюОбъекта(ПроблемныйОбъект, ВерсияИзДругойПрограммы); + + Исключение + + ПредставлениеОбъекта = ?(ОбщегоНазначения.СсылкаСуществует(ПроблемныйОбъект), ПроблемныйОбъект, ПроблемныйОбъект.Метаданные()); + ТекстИсключения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ШаблонТекста = НСтр("ru = 'Не удалось принять версию объекта ""%1"" по причине:%2 %3.'", ОбщегоНазначения.КодОсновногоЯзыка()); + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ПредставлениеОбъекта, Символы.ПС, ТекстИсключения); + + ОбщегоНазначения.СообщитьПользователю(ТекстИсключения); + + КонецПопытки; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗакрытиемНаСервере() + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") + ИЛИ (НЕ ТребуетсяОбновлениеПризнакаСкрытьИзСписка + И НЕ ТребуетсяОбновлениеКомментария) Тогда + + Возврат; + + КонецЕсли; + + ПараметрыЗаписиРегистра = Новый Структура; + ПараметрыЗаписиРегистра.Вставить("Ссылка", ПроблемныйОбъект); + ПараметрыЗаписиРегистра.Вставить("НомерВерсии", ВерсияИзДругойПрограммы); + ПараметрыЗаписиРегистра.Вставить("ВерсияПроигнорирована", СкрытьПредупреждение); + ПараметрыЗаписиРегистра.Вставить("Комментарий", КомментарийПредупреждения); + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ИзменитьПредупреждениеСинхронизации(ПараметрыЗаписиРегистра, Истина); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Form.form new file mode 100644 index 000000000..3e5383058 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Form.form @@ -0,0 +1,611 @@ + + + + ДекорацияКартинка + 1 + + <key>ru</key> + <value>Декорация картинка</value> + + true + true + + true + + ShowRight + + ДекорацияКартинкаРасширеннаяПодсказка + 3 + + <key>ru</key> + <value>При отправке данных в другую программу обнаружены ошибки в коде правил конвертации объектов. Необходимо обновится на актуальную версию программы, либо связаться с обслуживающей организацией. Так же ошибка может быть связана с использованием неактуальных правил конвертации. Если предупреждение потеряло свою актуальность воспользуйтесь командой "Скрыть из списка"</value> + + Label + true + + Left + + + + ДекорацияКартинкаКонтекстноеМеню + 2 + true + + true + true + + + CommonPicture.Ошибка32 + + AsFileRef + + + + ДатаВозникновения + 23 + true + true + + true + + + ДатаВозникновения + + + ДатаВозникновенияРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДатаВозникновенияКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + 40 + true + true + + ru + ДЛФ=DDT + + + + + УзелИнформационнойБазы + 13 + true + true + + true + + + УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 15 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 14 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + ПроблемныйОбъект + 10 + true + true + + true + + + ПроблемныйОбъект + + true + + ПроблемныйОбъектРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПроблемныйОбъектКонтекстноеМеню + 11 + true + + LabelField + Enter + true + Left + true + + + Click + ПроблемныйОбъектНажатие + + true + true + true + + + + Описание + 4 + true + true + + true + + + Описание + + + ОписаниеРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 5 + true + + InputField + true + Enter + true + Left + true + + 9 + true + true + true + true + true + true + Normal + + + + КомментарийПредупреждения + 20 + true + true + + true + + + КомментарийПредупреждения + + + OnChange + КомментарийПредупрежденияПриИзменении + + + КомментарийПредупрежденияРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КомментарийПредупрежденияКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаСкрытьПредупреждение + 26 + + СкрытьПредупреждение + 28 + true + true + + true + + + СкрытьПредупреждение + + Right + Button + + OnChange + СкрытьПредупреждениеПриИзменении + + + СкрытьПредупреждениеРасширеннаяПодсказка + 30 + + <key>ru</key> + <value>Пользователь может самостоятельно определить, является ли текущее предупреждение проблемой. Если предупреждение более неактуально, можно выполнить команду "Скрыть из списка". После нажатия и сохранения предупреждение будет скрыто из общего списка.</value> + + Label + true + true + + Left + + + + СкрытьПредупреждениеКонтекстноеМеню + 29 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Скрыть предупреждение</value> + + true + + ГруппаСкрытьПредупреждениеРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Right + Auto + WeakSeparation + true + true + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 16 + true + true + + true + + + ФормаОКРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 18 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Описание + + <key>ru</key> + <value>Описание</value> + + 1 + + String + + + + true + + + true + + + + СкрытьПредупреждение + + <key>ru</key> + <value>Скрыть предупреждение</value> + + 2 + + Boolean + + + true + + + true + + + + ПроблемныйОбъект + + <key>ru</key> + <value>Объект</value> + + 3 + + DocumentRef + CatalogRef + + + true + + + true + + + + УзелИнформационнойБазы + + <key>ru</key> + <value>Синхронизация</value> + + 4 + + ExchangePlanRef + + + true + + + true + + + + ТипПредупреждения + 5 + + EnumRef.ТипыПроблемОбменаДанными + EnumRef.ТипыВерсийОбъекта + + + true + + + true + + + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка + 6 + + Boolean + + + true + + + true + + + + ТребуетсяОбновлениеКомментария + 7 + + Boolean + + + true + + + true + + + + ОбъектМетаданных + 8 + + CatalogRef.ИдентификаторыОбъектовРасширений + CatalogRef.ИдентификаторыОбъектовМетаданных + + + true + + + true + + + + КомментарийПредупреждения + + <key>ru</key> + <value>Комментарий администратора к предупреждению синхронизации</value> + + 9 + + String + + 1000 + + + + true + + + true + + + + КлючУникальностиЗаписиРегистраСведений + 10 + + String + + 32 + + + + true + + + true + + + + ДатаВозникновения + + <key>ru</key> + <value>Дата возникновения</value> + + 11 + + Date + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Module.bsl new file mode 100644 index 000000000..a565efa83 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияОбработчиковОтправкиПолучения/Module.bsl @@ -0,0 +1,145 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Параметры.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + Параметры.Свойство("Описание", Описание); + Параметры.Свойство("ТипПредупреждения", ТипПредупреждения); + Параметры.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы); + Параметры.Свойство("СкрытьПредупреждение", СкрытьПредупреждение); + Параметры.Свойство("ДатаВозникновения", ДатаВозникновения); + Параметры.Свойство("ОбъектМетаданных", ОбъектМетаданных); + Параметры.Свойство("КлючУникальности", КлючУникальностиЗаписиРегистраСведений); + Параметры.Свойство("КомментарийПредупреждения", КомментарийПредупреждения); + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Ложь; + ТребуетсяОбновлениеКомментария = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ИзменитьКартинкуДекорации() + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СкрытьПредупреждениеПриИзменении(Элемент) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроблемныйОбъектНажатие(Элемент, СтандартнаяОбработка) + + ТребуетсяОбновлениеПризнакаСкрытьИзСписка = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура КомментарийПредупрежденияПриИзменении(Элемент) + + ТребуетсяОбновлениеКомментария = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + + ПередЗакрытиемНаСервере(); + + Если ТребуетсяОбновлениеПризнакаСкрытьИзСписка + ИЛИ ТребуетсяОбновлениеКомментария Тогда + + Закрыть(Новый Структура("ТребуетсяОбновлениеСписка", Истина)); + + Иначе + + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ИзменитьКартинкуДекорации() + + Если СкрытьПредупреждение Тогда + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Информация32; + + Иначе + + Элементы.ДекорацияКартинка.Картинка = БиблиотекаКартинок.Ошибка32; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПередЗакрытиемНаСервере() + + Если НЕ ТребуетсяОбновлениеПризнакаСкрытьИзСписка + И НЕ ТребуетсяОбновлениеКомментария Тогда + + Возврат; + + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.РезультатыОбменаДанными.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ТипПроблемы = ТипПредупреждения; + МенеджерЗаписи.УзелИнформационнойБазы = УзелИнформационнойБазы; + МенеджерЗаписи.ОбъектМетаданных = ОбъектМетаданных; + МенеджерЗаписи.ПроблемныйОбъект = ПроблемныйОбъект; + МенеджерЗаписи.КлючУникальности = КлючУникальностиЗаписиРегистраСведений; + + МенеджерЗаписи.Прочитать(); // читаем для сохранения реквизитов, которые не передаем на форму + Если НЕ МенеджерЗаписи.Выбран() Тогда + + // Сценарий: открыли карточку предупреждения, а параллельно поправили проблему + Возврат; + + КонецЕсли; + + МенеджерЗаписи.ДатаВозникновения = ДатаВозникновения; + МенеджерЗаписи.Комментарий = КомментарийПредупреждения; + МенеджерЗаписи.Пропущена = СкрытьПредупреждение; + МенеджерЗаписи.Записать(Истина); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..66bb296d3 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,33 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + ДатаВозникновения + Asc + + + ТипПредупреждения + Asc + + + УзелИнформационнойБазы + Asc + + + ОбъектМетаданных + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Form.form new file mode 100644 index 000000000..622c5f778 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Form.form @@ -0,0 +1,2374 @@ + + + + <key>ru</key> + <value>Предупреждения синхронизации данных</value> + + + ГруппаОтборы + 74 + + ПредставлениеОтбораПоПериоду + 84 + true + true + + true + + + ПредставлениеОтбораПоПериоду + + + ПредставлениеОтбораПоПериодуРасширеннаяПодсказка + 86 + Label + true + true + + Left + + + + ПредставлениеОтбораПоПериодуКонтекстноеМеню + 85 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеОтбораПоПериодуНачалоВыбора + + + Clearing + ПредставлениеОтбораПоПериодуОчистка + + 20 + true + true + true + true + true + Normal + + + + ПредставлениеОтбораСинхронизаций + 135 + true + true + + true + + + ПредставлениеОтбораСинхронизаций + + + ПредставлениеОтбораСинхронизацийРасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + ПредставлениеОтбораСинхронизацийКонтекстноеМеню + 136 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеОтбораСинхронизацийНачалоВыбора + + + Clearing + ПредставлениеОтбораСинхронизацийОчистка + + true + true + true + true + true + true + Normal + + + + ПредставлениеОтбораТиповПредупреждений + 79 + true + true + + true + + + ПредставлениеОтбораТиповПредупреждений + + + ПредставлениеОтбораТиповПредупрежденийРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ПредставлениеОтбораТиповПредупрежденийКонтекстноеМеню + 80 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеОтбораТиповПредупрежденийНачалоВыбора + + + Clearing + ПредставлениеОтбораТиповПредупрежденийОчистка + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Отборы</value> + + + ГруппаОтборыРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + + ru + (Синхронизация с ERP - БП, Тип проблемы: Все...) + + true + Button + true + true + Auto + Auto + + + + ГруппаОсновная + 70 + + ГруппаСписок + 72 + + Список + 1 + true + true + + true + + + Список + + None + LoadDynamicListSettings + SaveDynamicListSettings + + ЕстьКомментарий + 206 + + <key>ru</key> + <value>Есть комментарий</value> + + true + true + + true + + + Список.ЕстьКомментарий + + None + + ЕстьКомментарийРасширеннаяПодсказка + 208 + Label + true + true + + Left + + + + ЕстьКомментарийКонтекстноеМеню + 207 + true + + PictureField + Enter + Left + true + + CommonPicture.Комментарий + + Left + true + + 3 + true + true + true + true + + CommonPicture.Комментарий + + + + 1 + + AsFileRef + + + + ДатаВозникновения + 17 + + <key>ru</key> + <value>Дата возникновения</value> + + true + true + + true + + + Список.ДатаВозникновения + + + ДатаВозникновенияРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ДатаВозникновенияКонтекстноеМеню + 18 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ПроблемныйОбъект + 53 + + <key>ru</key> + <value>Объект</value> + + true + true + + + Список.ПроблемныйОбъект + + + ПроблемныйОбъектРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ПроблемныйОбъектКонтекстноеМеню + 54 + true + + LabelField + true + Enter + true + Left + true + + true + true + + + + Описание + 50 + + <key>ru</key> + <value>Описание</value> + + true + true + + true + + + Список.Описание + + + ОписаниеРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + ОписаниеКонтекстноеМеню + 51 + true + + LabelField + Enter + true + Left + true + + true + true + true + + + + ПредставлениеТипаПредупреждения + 193 + + <key>ru</key> + <value>Тип</value> + + true + true + + true + + + Список.ПредставлениеТипаПредупреждения + + + ПредставлениеТипаПредупрежденияРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + + ПредставлениеТипаПредупрежденияКонтекстноеМеню + 194 + true + + LabelField + Enter + true + Left + true + + true + true + + + + УзелИнформационнойБазы + 65 + + <key>ru</key> + <value>Синхронизация</value> + + true + true + + + Список.УзелИнформационнойБазы + + + УзелИнформационнойБазыРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + + УзелИнформационнойБазыКонтекстноеМеню + 66 + true + + LabelField + Enter + true + Left + true + + true + true + + + + КлючУникальности + 209 + + <key>ru</key> + <value>Ключ уникальности</value> + + true + true + + + Список.КлючУникальности + + + КлючУникальностиРасширеннаяПодсказка + 211 + Label + true + true + + Left + + + + КлючУникальностиКонтекстноеМеню + 210 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВерсияИзДругойПрограммы + 187 + + <key>ru</key> + <value>Версия из другой программы</value> + + true + true + + + Список.ВерсияИзДругойПрограммы + + + ВерсияИзДругойПрограммыРасширеннаяПодсказка + 189 + Label + true + true + + Left + + + + ВерсияИзДругойПрограммыКонтекстноеМеню + 188 + true + + LabelField + Enter + true + Left + true + + true + true + + + + ВерсияЭтойПрограммы + 190 + + <key>ru</key> + <value>Версия этой программы</value> + + true + true + + + Список.ВерсияЭтойПрограммы + + + ВерсияЭтойПрограммыРасширеннаяПодсказка + 192 + Label + true + true + + Left + + + + ВерсияЭтойПрограммыКонтекстноеМеню + 191 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СкрытьПредупреждение + 56 + + <key>ru</key> + <value>Скрыть предупреждение</value> + + true + true + + + Список.СкрытьПредупреждение + + + СкрытьПредупреждениеРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + СкрытьПредупреждениеКонтекстноеМеню + 57 + true + + CheckBoxField + Enter + true + Left + true + + + + СписокКоманднаяПанель + 3 + + СписокОбновить + 226 + true + true + + true + + + СписокОбновитьРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Refresh + Normal + PictureAndText + true + true + UserCmds + + StdPicture.Refresh + + Auto + InCommandBarAndInAdditionalSubmenu + + + СписокОткрытьОбъект + 141 + true + true + + true + + + СписокОткрытьОбъектРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + Form.Command.ОткрытьОбъект + Auto + true + true + true + UserCmds + Auto + + + СписокГруппаАктуальностьПредупреждений + 108 + + СписокПредупрежденияСкрытьИзСписка + 183 + true + true + + true + + + СписокПредупрежденияСкрытьИзСпискаРасширеннаяПодсказка + 184 + Label + true + true + + Left + + + Form.Command.ПредупрежденияСкрытьИзСписка + Normal + Auto + true + true + UserCmds + Auto + + + СписокПредупрежденияПоказатьВСписке + 179 + true + true + + true + + + СписокПредупрежденияПоказатьВСпискеРасширеннаяПодсказка + 180 + Label + true + true + + Left + + + Form.Command.ПредупрежденияПоказатьВСписке + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СписокПредупрежденияПоказатьСкрытые + 181 + true + true + + true + + + СписокПредупрежденияПоказатьСкрытыеРасширеннаяПодсказка + 182 + Label + true + true + + Left + + + Form.Command.ПредупрежденияПоказатьСкрытые + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Показать, скрыть предупреждение</value> + + + ru + Список группа актуальность предупреждений + + + СписокГруппаАктуальностьПредупрежденийРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + + + СписокГруппаКомандИсправление + 234 + + СписокПровестиДокумент + 236 + true + true + + true + + + СписокПровестиДокументРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + Form.Command.ПровестиДокумент + Normal + Auto + true + true + UserCmds + Auto + + + СписокГрупповоеИзменениеРеквизитов + 242 + true + true + + true + + + СписокГрупповоеИзменениеРеквизитовРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + Form.Command.ГрупповоеИзменениеРеквизитов + Normal + Auto + true + true + UserCmds + Auto + + + СписокКоллизии + 238 + true + true + + true + + + СписокКоллизииРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + Form.Command.Коллизии + Normal + Auto + true + true + UserCmds + Auto + + + СписокЗапретЗагрузкиПоДате + 240 + true + true + + true + + + СписокЗапретЗагрузкиПоДатеРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + Form.Command.ЗапретЗагрузкиПоДате + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Групповая обработка</value> + + + СписокГруппаКомандИсправлениеРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + СписокГруппаТиповыхКоманд + 92 + + СписокПоискПоТекущемуЗначению + 212 + true + true + + true + + + СписокПоискПоТекущемуЗначениюРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.FindByCurrentValue + Normal + Auto + true + true + UserCmds + Auto + + + СписокНайти + 214 + true + true + + true + + + СписокНайтиРасширеннаяПодсказка + 215 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + СписокОтменитьПоиск + 216 + true + true + + true + + + СписокОтменитьПоискРасширеннаяПодсказка + 217 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + СписокГруппаКоманд1 + 224 + + СписокНастройкаСписка + 218 + true + true + + true + + + СписокНастройкаСпискаРасширеннаяПодсказка + 219 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.ListSettings + Normal + Auto + true + true + UserCmds + Auto + + + СписокСтандартныеНастройкиДинамическогоСписка + 220 + true + true + + true + + + СписокСтандартныеНастройкиДинамическогоСпискаРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.DynamicListStandardSettings + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Список группа команд1</value> + + + СписокГруппаКоманд1РасширеннаяПодсказка + 225 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Исправление</value> + + + ru + Список группа типовых команд + + + СписокГруппаТиповыхКомандРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + + + СписокГруппаДополнительныеКоманды + 228 + + СписокОтключитьАвтоматическоеОбновлениеФормы + 185 + true + true + + true + + + СписокОтключитьАвтоматическоеОбновлениеФормыРасширеннаяПодсказка + 186 + Label + true + true + + Left + + + Form.Command.ОтключитьАвтоматическоеОбновлениеФормы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СписокУдалениеУстаревшихЗаписей + 232 + true + true + + true + + + СписокУдалениеУстаревшихЗаписейРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + Form.Command.УдалениеУстаревшихЗаписей + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + СписокПредыдущаяФормаПредупреждений + 204 + true + true + + true + + + СписокПредыдущаяФормаПредупрежденийРасширеннаяПодсказка + 205 + Label + true + true + + Left + + + Form.Command.ПредыдущаяФормаПредупреждений + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Список группа дополнительные команды</value> + + + ru + Список группа дополнительные команды + + + СписокГруппаДополнительныеКомандыРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + + + СписокВывестиСписок + 222 + true + true + + true + + + СписокВывестиСписокРасширеннаяПодсказка + 223 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + СписокИзменитьФорму + 230 + true + true + + true + + + СписокИзменитьФормуРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + + СписокСправка + 177 + true + true + + true + + + СписокСправкаРасширеннаяПодсказка + 178 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + true + + + Selection + СписокВыбор + + + OnActivateRow + СписокПриАктивизацииСтроки + + + СписокСтрокаПоиска + 5 + + СписокСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 6 + true + + Список + + true + + + + СписокСостояниеПросмотра + 8 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 11 + + СписокУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + + СписокКонтекстноеМенюОткрытьОбъект + 173 + true + true + + true + + + СписокКонтекстноеМенюОткрытьОбъектРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + Form.Command.ОткрытьОбъект + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюГруппа1 + 124 + + СписокКонтекстноеМенюПредупрежденияСкрытьИзСписка + 171 + true + true + + true + + + СписокКонтекстноеМенюПредупрежденияСкрытьИзСпискаРасширеннаяПодсказка + 172 + Label + true + true + + Left + + + Form.Command.ПредупрежденияСкрытьИзСписка + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюПредупрежденияПоказатьВСписке + 167 + true + true + + true + + + СписокКонтекстноеМенюПредупрежденияПоказатьВСпискеРасширеннаяПодсказка + 168 + Label + true + true + + Left + + + Form.Command.ПредупрежденияПоказатьВСписке + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюПредупрежденияПоказатьСкрытые + 169 + true + true + + true + + + СписокКонтекстноеМенюПредупрежденияПоказатьСкрытыеРасширеннаяПодсказка + 170 + Label + true + true + + Left + + + Form.Command.ПредупрежденияПоказатьСкрытые + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + СписокКонтекстноеМенюГруппа1РасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + + + СписокКонтекстноеМенюЖурналРегистрацииВУказанноеВремя + 175 + true + true + + true + + + СписокКонтекстноеМенюЖурналРегистрацииВУказанноеВремяРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + Form.Command.ЖурналРегистрацииВУказанноеВремя + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + 10 + true + MultiRow +
              true
              + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + AsFileRef + + Список.DefaultPicture + + CommandBar + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
              + true + true + + true + + + <key>ru</key> + <value>Список предупреждений</value> + + + ГруппаСписокРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + +
              + true + true + + true + + + <key>ru</key> + <value>Основная</value> + + + ГруппаОсновнаяРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + WeakSeparation + true + true + Auto + Auto + +
              + + ГруппаПодвал + 196 + + ГруппаПодвалЛево + 200 + + ЖурналРегистрации + 82 + true + true + + true + + + ЖурналРегистрацииРасширеннаяПодсказка + 83 + Label + true + true + + Left + + + Hyperlink + Form.Command.ЖурналРегистрации + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Подвал, лево</value> + + + ГруппаПодвалЛевоРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + WeakSeparation + true + true + Auto + Auto + + + + ГруппаПодвалПраво + 202 + + УдалениеУстаревшихЗаписей + 198 + true + true + + true + + + УдалениеУстаревшихЗаписейРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + Hyperlink + Form.Command.УдалениеУстаревшихЗаписей + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Подвал, право</value> + + true + Right + + ГруппаПодвалПравоРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + UsualGroup + + Vertical + Right + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Подвал</value> + + + ГруппаПодвалРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + NotificationProcessing + ОбработкаОповещения + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + Use + true + true + Vertical + true + true + true + auto + true + + Список + + <key>ru</key> + <value>Список</value> + + 1 + + DynamicList + + + true + + + true + + + Список.АвторДругойВерсии + + + Список.НовыйОбъект + + + Список.НомерДругойВерсии + + + Список.НомерЭтойВерсии + + + Список.Пропущена + + + Список.ТипСтрокой + + + Список.ВерсияИзДругойПрограммы + + + Список.ВерсияИзДругойПрограммыПринята + + + Список.ВерсияЭтойПрограммы + + + Список.ДатаВозникновения + + + Список.ЕстьКомментарий + + + Список.КлючУникальности + + + Список.КомментарийПредупреждения + + + Список.ОбъектМетаданных + + + Список.Описание + + + Список.ПроблемныйОбъект + + + Список.СкрытьПредупреждение + + + Список.ТипПредупреждения + + + Список.УзелИнформационнойБазы + + + Список.ЭтоНовыйОбъект + +
              true
              + + ВЫБРАТЬ + РегистрСведенийРезультатыОбменаДанными.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + РегистрСведенийРезультатыОбменаДанными.ПроблемныйОбъект КАК ПроблемныйОбъект, + РегистрСведенийРезультатыОбменаДанными.ОбъектМетаданных КАК ОбъектМетаданных, + РегистрСведенийРезультатыОбменаДанными.ТипПроблемы КАК ТипПредупреждения, + ВЫБОР + КОГДА РегистрСведенийРезультатыОбменаДанными.ТипПроблемы = ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент) + ТОГДА &НепроведенныйДокумент + КОГДА РегистрСведенийРезультатыОбменаДанными.ТипПроблемы = ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты) + ТОГДА &ПустыеРеквизиты + КОГДА РегистрСведенийРезультатыОбменаДанными.ТипПроблемы = ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта) + ТОГДА &ПроверкаПередОтправкой + КОГДА РегистрСведенийРезультатыОбменаДанными.ТипПроблемы = ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных) + ТОГДА &ТехническаяОшибкаОтправка + КОГДА РегистрСведенийРезультатыОбменаДанными.ТипПроблемы = ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных) + ТОГДА &ТехническаяОшибкаПолучение + КОНЕЦ КАК ПредставлениеТипаПредупреждения, + РегистрСведенийРезультатыОбменаДанными.ДатаВозникновения КАК ДатаВозникновения, + ВЫРАЗИТЬ(РегистрСведенийРезультатыОбменаДанными.Причина КАК СТРОКА(1000)) КАК Описание, + РегистрСведенийРезультатыОбменаДанными.КлючУникальности КАК КлючУникальности, + РегистрСведенийРезультатыОбменаДанными.Пропущена КАК СкрытьПредупреждение, + ВЫБОР + КОГДА РегистрСведенийРезультатыОбменаДанными.Комментарий = "" + ТОГДА ЛОЖЬ + ИНАЧЕ ИСТИНА + КОНЕЦ КАК ЕстьКомментарий, + РегистрСведенийРезультатыОбменаДанными.Комментарий КАК КомментарийПредупреждения, + НЕОПРЕДЕЛЕНО КАК ВерсияИзДругойПрограммы, + НЕОПРЕДЕЛЕНО КАК ВерсияЭтойПрограммы, + НЕОПРЕДЕЛЕНО КАК ВерсияИзДругойПрограммыПринята, + НЕОПРЕДЕЛЕНО КАК ЭтоНовыйОбъект +ИЗ + РегистрСведений.РезультатыОбменаДанными КАК РегистрСведенийРезультатыОбменаДанными + +ОБЪЕДИНИТЬ ВСЕ + +ВЫБРАТЬ + НепринятаяВерсия.АвторВерсии, + НепринятаяВерсия.Объект, + НЕОПРЕДЕЛЕНО, + НепринятаяВерсия.ТипВерсииОбъекта, + ВЫБОР + КОГДА НепринятаяВерсия.ТипВерсииОбъекта = ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе) + ТОГДА &НепринятыйСуществующий + КОГДА НепринятаяВерсия.ТипВерсииОбъекта = ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе) + ТОГДА &НепринятыйНовый + КОНЕЦ, + НепринятаяВерсия.ДатаВерсии, + НепринятаяВерсия.ПредупреждениеСинхронизации, + НЕОПРЕДЕЛЕНО, + НепринятаяВерсия.ВерсияПроигнорирована, + ВЫБОР + КОГДА (ВЫРАЗИТЬ(НепринятаяВерсия.Комментарий КАК СТРОКА(1000))) = "" + ТОГДА ЛОЖЬ + ИНАЧЕ ИСТИНА + КОНЕЦ, + НепринятаяВерсия.Комментарий, + ЕСТЬNULL(НепринятаяВерсия.НомерВерсии, 0), + ЕСТЬNULL(ТекущаяВерсия.НомерВерсии, 0), + НЕОПРЕДЕЛЕНО, + ВЫБОР + КОГДА НепринятаяВерсия.ТипВерсииОбъекта = ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе) + ТОГДА ЛОЖЬ + ИНАЧЕ ИСТИНА + КОНЕЦ +ИЗ + РегистрСведений.ВерсииОбъектов КАК НепринятаяВерсия + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииОбъектов КАК ТекущаяВерсия + ПО НепринятаяВерсия.Объект = ТекущаяВерсия.Объект + И (НепринятаяВерсия.НомерВерсии = ТекущаяВерсия.НомерВерсии + 1) +ГДЕ + НепринятаяВерсия.ТипВерсииОбъекта В (ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе), ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе)) + +ОБЪЕДИНИТЬ ВСЕ + +ВЫБРАТЬ + ВерсииДругойПрограммы.АвторВерсии, + ВерсииДругойПрограммы.Объект, + НЕОПРЕДЕЛЕНО, + ВерсииДругойПрограммы.ТипВерсииОбъекта, + ВЫБОР + КОГДА ВерсииДругойПрограммы.ТипВерсииОбъекта = ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.ПринятыеДанныеПоКоллизии) + ТОГДА &ПринятыеДанныеКоллизии + КОГДА ВерсииДругойПрограммы.ТипВерсииОбъекта = ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НеПринятыеДанныеПоКоллизии) + ТОГДА &НепринятыеДанныеКоллизии + КОНЕЦ, + ВерсииДругойПрограммы.ДатаВерсии, + ВерсииДругойПрограммы.ПредупреждениеСинхронизации, + НЕОПРЕДЕЛЕНО, + ВерсииДругойПрограммы.ВерсияПроигнорирована, + ВЫБОР + КОГДА (ВЫРАЗИТЬ(ВерсииДругойПрограммы.Комментарий КАК СТРОКА(1024))) = "" + ТОГДА ЛОЖЬ + ИНАЧЕ ИСТИНА + КОНЕЦ, + ВерсииДругойПрограммы.Комментарий, + ЕСТЬNULL(ВерсииДругойПрограммы.НомерВерсии, 0), + ЕСТЬNULL(ВерсииЭтойПрограммы.НомерВерсии, 0), + ВЫБОР + КОГДА ВерсииДругойПрограммы.ТипВерсииОбъекта = ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.ПринятыеДанныеПоКоллизии) + ТОГДА ИСТИНА + ИНАЧЕ ЛОЖЬ + КОНЕЦ, + НЕОПРЕДЕЛЕНО +ИЗ + РегистрСведений.ВерсииОбъектов КАК ВерсииДругойПрограммы + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииОбъектов КАК ВерсииЭтойПрограммы + ПО ВерсииДругойПрограммы.Объект = ВерсииЭтойПрограммы.Объект + И (ВерсииДругойПрограммы.НомерВерсии = ВерсииЭтойПрограммы.НомерВерсии + 1) +ГДЕ + ВерсииДругойПрограммы.ТипВерсииОбъекта В (ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.ПринятыеДанныеПоКоллизии), ЗНАЧЕНИЕ(Перечисление.ТипыВерсийОбъекта.НеПринятыеДанныеПоКоллизии)) + true + true + true + true + +
              + + ПредставлениеОтбораСинхронизаций + + <key>ru</key> + <value>Синхронизация</value> + + 2 + + String + + 50 + + + + true + + + true + + + + ПредставлениеОтбораТиповПредупреждений + + <key>ru</key> + <value>Тип</value> + + 3 + + String + + 50 + + + + true + + + true + + + + ПредставлениеОтбораПоПериоду + + <key>ru</key> + <value>Период</value> + + 4 + + String + + 100 + + + + true + + + true + + + ПредставлениеОтбораПоПериоду + + + + КэшЗначений + 5 + + + true + + + true + + + + ПредупрежденияСкрытьИзСписка + + <key>ru</key> + <value>Скрыть из списка</value> + + 1 + + ru + Предупреждения скрыть из списка + + + true + + + + ПредупрежденияСкрытьИзСписка + + + Auto + Auto + + + ЖурналРегистрации + + <key>ru</key> + <value>Перейти в журнал регистрации</value> + + 2 + + true + + + + ЖурналРегистрации + + + Auto + Auto + + + ПредупрежденияПоказатьСкрытые + + <key>ru</key> + <value>Показать скрытые в списке</value> + + 8 + + ru + Показывать проигнорированные + + + true + + + + ПредупрежденияПоказатьСкрытые + + + DontUse + Auto + + + ПредупрежденияПоказатьВСписке + + <key>ru</key> + <value>Показать в списке</value> + + 9 + + ru + Отменить игнорирование непринятых по дате запрета данных + + + true + + + + ПредупрежденияПоказатьВСписке + + + DontUse + Auto + + + ОткрытьОбъект + + <key>ru</key> + <value>Открыть объект</value> + + 3 + + ru + Открыть объект + + + true + + + + ОткрытьОбъект + + + Auto + Auto + + + ЖурналРегистрацииВУказанноеВремя + + <key>ru</key> + <value>Журнал регистрации в указанное время</value> + + 4 + + ru + Журнал регистрации плюс/минус 1 секунда от указанного периода + + + true + + + + ЖурналРегистрацииВУказанноеВремя + + + Auto + Auto + + + ОтключитьАвтоматическоеОбновлениеФормы + + <key>ru</key> + <value>Отключить автоматическое обновление формы</value> + + 5 + + ru + Отключить автоматическое обновление формы + + + true + + + + ОтключитьАвтоматическоеОбновлениеФормы + + + Auto + Auto + + + УдалениеУстаревшихЗаписей + + <key>ru</key> + <value>Удаление устаревших записей</value> + + 6 + + ru + Удаление устаревших записей + + + true + + + + УдалениеУстаревшихЗаписей + + + Auto + Auto + + + ПредыдущаяФормаПредупреждений + + <key>ru</key> + <value>Предыдущая форма предупреждений</value> + + 7 + + ru + Предыдущая форма предупреждений + + + true + + + + ПредыдущаяФормаПредупреждений + + + Auto + Auto + + + ПровестиДокумент + + <key>ru</key> + <value>Проведение документов</value> + + 10 + + ru + Провести документ + + + true + + + StdPicture.Post + + + + ПровестиДокумент + + + TextPicture + DontUse + Auto + + + Коллизии + + <key>ru</key> + <value>Коллизии</value> + + 11 + + ru + Коллизии + + + true + + + CommonPicture.СинхронизацияДанныхКоллизия + + + + Коллизии + + + Auto + Auto + + + ЗапретЗагрузкиПоДате + + <key>ru</key> + <value>Запрет загрузки по дате</value> + + 12 + + ru + Запрет загрузки по дате + + + true + + + CommonPicture.СинхронизацияДанныхНепринятыеПоДате + + + + ЗапретЗагрузкиПоДате + + + Auto + Auto + + + ГрупповоеИзменениеРеквизитов + + <key>ru</key> + <value>Групповое изменение реквизитов</value> + + 13 + + ru + Групповое изменение реквизитов + + + true + + + + ГрупповоеИзменениеРеквизитов + + + Auto + Auto + + + УзлыОбмена + + + + + + + +
              diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Module.bsl new file mode 100644 index 000000000..690a1ea8d --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/ПредупрежденияСинхронизаций/Module.bsl @@ -0,0 +1,1049 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + УсловноеОформлениеФормы(); + + КэшЗначений = Новый Структура("МассивУзловПланаОбмена, ОтборПоДатеВозникновения, ОтборУзловПланаОбмена, ОтборТипыПредупреждений"); + КэшЗначений.Вставить("ПредупрежденияПоказатьСкрытые", Ложь); + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектСуществуетВБазе", Неопределено); + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе", Неопределено); + КэшЗначений.Вставить("НепринятыеДанныеПоКоллизии", Неопределено); + КэшЗначений.Вставить("ПринятыеДанныеПоКоллизии", Неопределено); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МенеджерПеречисления = Перечисления["ТипыВерсийОбъекта"]; + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектСуществуетВБазе", МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе); + КэшЗначений.Вставить("НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе", МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе); + КэшЗначений.Вставить("НепринятыеДанныеПоКоллизии", МенеджерПеречисления.НепринятыеДанныеПоКоллизии); + КэшЗначений.Вставить("ПринятыеДанныеПоКоллизии", МенеджерПеречисления.ПринятыеДанныеПоКоллизии); + + КонецЕсли; + + ОтборыПоПереданнымПараметрам(); + + МассивПолей = Новый Массив; + МассивПолей.Добавить("ЕстьКомментарий"); + МассивПолей.Добавить("ПроблемныйОбъект"); + МассивПолей.Добавить("Описание"); + + Список.УстановитьОграниченияИспользованияВПорядке(МассивПолей); + + Список.Параметры.УстановитьЗначениеПараметра("НепроведенныйДокумент", НСтр("ru ='Непроведенный документ'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("ПустыеРеквизиты", НСтр("ru ='Пустые реквизиты'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("ПроверкаПередОтправкой", НСтр("ru ='Проверка перед отправкой'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("ТехническаяОшибкаОтправка", НСтр("ru ='Тех. ошибка (отправка)'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("ТехническаяОшибкаПолучение", НСтр("ru ='Тех. ошибка (получение)'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("НепринятыйСуществующий", НСтр("ru ='Непринятый, существующий'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("НепринятыйНовый", НСтр("ru ='Непринятый, новый'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("ПринятыеДанныеКоллизии", НСтр("ru ='Приняты данные коллизии'", ОбщегоНазначения.КодОсновногоЯзыка())); + Список.Параметры.УстановитьЗначениеПараметра("НепринятыеДанныеКоллизии", НСтр("ru ='Неприняты данные коллизии'", ОбщегоНазначения.КодОсновногоЯзыка())); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПредставлениеОтбораПоПериоду(); + ПредставлениеОтбораУзловОбмена(); + ПредставлениеОтбораПоТипамПредупреждений(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если ИмяСобытия = "ИсправлениеПредупрежденийСинхронизацииПроведенияДокументов" + ИЛИ ИмяСобытия = "ИсправлениеПредупрежденийСинхронизацииПересмотрКоллизии" + ИЛИ ИмяСобытия = "ИсправлениеПредупрежденийСинхронизацииПересмотрДатыЗапрета" + Тогда + + ОбновитьСписокФормы(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПредставлениеОтбораПоПериодуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Диалог = Новый ДиалогРедактированияСтандартногоПериода(); + Диалог.Период = КэшЗначений.ОтборПоДатеВозникновения; + Диалог.Показать(Новый ОписаниеОповещения("ПослеОтбораПоДатеВозникновения", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОтбораПоДатеВозникновения(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("СтандартныйПериод") Тогда + + Возврат; + + КонецЕсли; + + КэшЗначений.ОтборПоДатеВозникновения = Результат; + ОтборПоДатеВозникновения(); + ПредставлениеОтбораПоПериоду(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораПоПериодуОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораСинхронизацийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("МассивУзловПланаОбмена", КэшЗначений.МассивУзловПланаОбмена); + ПараметрыОткрытия.Вставить("ОтборУзловПланаОбмена", КэшЗначений.ОтборУзловПланаОбмена); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОтбораУзловОбменов", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ОтборСинхронизаций", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОтбораУзловОбменов(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + КэшЗначений.ОтборУзловПланаОбмена = Результат; + ОтборПоУзламИнформационнойБазы(); + ПредставлениеОтбораУзловОбмена(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораСинхронизацийОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораТиповПредупрежденийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ОтборТипыПредупреждений", КэшЗначений.ОтборТипыПредупреждений); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОтбораПоТипуПредупреждений", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ОтборПредупрежденийПоТипам", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОтбораПоТипуПредупреждений(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + КэшЗначений.ОтборТипыПредупреждений = Результат; + ОтборПоТипамПредупреждений(); + ПредставлениеОтбораПоТипамПредупреждений(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораТиповПредупрежденийОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ДанныеТекущейСтроки = ТекущиеДанныеСпискаПредупреждений(); + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ДатаВозникновения", ДанныеТекущейСтроки.ДатаВозникновения); + ПараметрыОткрытия.Вставить("ПроблемныйОбъект", ДанныеТекущейСтроки.ПроблемныйОбъект); + ПараметрыОткрытия.Вставить("Описание", ДанныеТекущейСтроки.Описание); + ПараметрыОткрытия.Вставить("ТипПредупреждения", ДанныеТекущейСтроки.ТипПредупреждения); + ПараметрыОткрытия.Вставить("УзелИнформационнойБазы", ДанныеТекущейСтроки.УзелИнформационнойБазы); + ПараметрыОткрытия.Вставить("ОбъектМетаданных", ДанныеТекущейСтроки.ОбъектМетаданных); + ПараметрыОткрытия.Вставить("КлючУникальности", ДанныеТекущейСтроки.КлючУникальности); + ПараметрыОткрытия.Вставить("СкрытьПредупреждение", ДанныеТекущейСтроки.СкрытьПредупреждение); + ПараметрыОткрытия.Вставить("КомментарийПредупреждения", ДанныеТекущейСтроки.КомментарийПредупреждения); + ПараметрыОткрытия.Вставить("ВерсияИзДругойПрограммы", ДанныеТекущейСтроки.ВерсияИзДругойПрограммы); + ПараметрыОткрытия.Вставить("ВерсияЭтойПрограммы", ДанныеТекущейСтроки.ВерсияЭтойПрограммы); + ПараметрыОткрытия.Вставить("ВерсияЭтойПрограммы", ДанныеТекущейСтроки.ВерсияЭтойПрограммы); + ПараметрыОткрытия.Вставить("ВерсияИзДругойПрограммыПринята", ДанныеТекущейСтроки.ВерсияИзДругойПрограммыПринята); + ПараметрыОткрытия.Вставить("ЭтоНовыйОбъект", ДанныеТекущейСтроки.ЭтоНовыйОбъект); + + ОткрытьКарточкуПроблемы(ПараметрыОткрытия); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + + ПодключитьОбработчикОжидания("ДоступностьКомандСпискаФормы", 0.1, Истина); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОткрытьОбъект(Команда) + + ТекущиеДанныеСтроки = ТекущиеДанныеСпискаПредупреждений(); + ОткрытьОбъектТекущейСтроки(ТекущиеДанныеСтроки); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредупрежденияСкрытьИзСписка(Команда) + + ИзменитьСостояниеПредупреждения(Элементы.Список.ВыделенныеСтроки, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредупрежденияПоказатьВСписке(Команда) + + ИзменитьСостояниеПредупреждения(Элементы.Список.ВыделенныеСтроки, Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредупрежденияПоказатьСкрытые(Команда) + + КэшЗначений.ПредупрежденияПоказатьСкрытые = НЕ КэшЗначений.ПредупрежденияПоказатьСкрытые; + + ОтборСкрытыеПредупреждения(); + Элементы.СписокПредупрежденияПоказатьСкрытые.Пометка = КэшЗначений.ПредупрежденияПоказатьСкрытые; + Элементы.СписокКонтекстноеМенюПредупрежденияПоказатьСкрытые.Пометка = КэшЗначений.ПредупрежденияПоказатьСкрытые; + + +КонецПроцедуры + +&НаКлиенте +Процедура ЖурналРегистрации(Команда) + + УровниПредупреждений = Новый Массив; + УровниПредупреждений.Добавить(НСтр("ru ='Ошибка'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка())); + УровниПредупреждений.Добавить(НСтр("ru ='Предупреждение'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка())); + + ПараметрыОтбораЖурнала = Новый Структура; + ПараметрыОтбораЖурнала.Вставить("СобытиеЖурналаРегистрации", ОбменДаннымиКлиент.СобытиеЖурналаРегистрацииОбменДанными()); + ПараметрыОтбораЖурнала.Вставить("Уровень", УровниПредупреждений); + + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыОтбораЖурнала, ЭтотОбъект,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаКлиенте +Процедура ЖурналРегистрацииВУказанноеВремя(Команда) + + ДанныеТекущейСтроки = ТекущиеДанныеСпискаПредупреждений(); + + Если НЕ ЗначениеЗаполнено(ДанныеТекущейСтроки.ДатаВозникновения) Тогда + + ТекстПредупреждения = НСтр("ru ='В текущей строке не указано время и дата возникновения предупреждения'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ПоказатьПредупреждение(Неопределено, ТекстПредупреждения); + + КонецЕсли; + + ПараметрыОтбораЖурнала = Новый Структура; + ПараметрыОтбораЖурнала.Вставить("ДатаНачала", ДанныеТекущейСтроки.ДатаВозникновения - 1); + ПараметрыОтбораЖурнала.Вставить("ДатаОкончания", ДанныеТекущейСтроки.ДатаВозникновения + 1); + + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыОтбораЖурнала, ЭтотОбъект,,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтключитьАвтоматическоеОбновлениеФормы(Команда) + + Элементы.СписокОтключитьАвтоматическоеОбновлениеФормы.Пометка = НЕ Элементы.СписокОтключитьАвтоматическоеОбновлениеФормы.Пометка; + +КонецПроцедуры + +&НаКлиенте +Процедура УдалениеУстаревшихЗаписей(Команда) + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("МассивУзловПланаОбмена", КэшЗначений.МассивУзловПланаОбмена); + ПараметрыОткрытия.Вставить("ОтборПоДатеВозникновения", КэшЗначений.ОтборПоДатеВозникновения); + ПараметрыОткрытия.Вставить("ОтборУзловОбменов", КэшЗначений.ОтборУзловПланаОбмена); + ПараметрыОткрытия.Вставить("ОтборТипыПредупреждений", КэшЗначений.ОтборТипыПредупреждений); + ПараметрыОткрытия.Вставить("ТолькоСкрытыеЗаписи", Истина); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеУдаленияУстаревшихЗаписей", ЭтотОбъект); + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.УдалениеУстаревшихПредупреждений", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеУдаленияУстаревшихЗаписей(Результат, ДополнительныеПараметры) Экспорт + + ОбновитьСписокФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредыдущаяФормаПредупреждений(Команда) + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("УзлыОбмена", КэшЗначений.МассивУзловПланаОбмена); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.Форма", ПараметрыОткрытия, ЭтотОбъект); + + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПровестиДокумент(Команда) + + ПровестиДокументыПоВыделеннымСтрокам(Элементы.Список.ВыделенныеСтроки); + +КонецПроцедуры + +&НаКлиенте +Процедура Коллизии(Команда) + + КоллизииПоВыделеннымСтрокам(Элементы.Список.ВыделенныеСтроки); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗапретЗагрузкиПоДате(Команда) + + ЗапретЗагрузкиПоВыделеннымСтрокам(Элементы.Список.ВыделенныеСтроки); + +КонецПроцедуры + +&НаКлиенте +Процедура ГрупповоеИзменениеРеквизитов(Команда) + + ГрупповоеИзменениеРеквизитовПоВыделеннымСтрокам(Элементы.Список.ВыделенныеСтроки); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Функция ТекущиеДанныеСпискаПредупреждений() + + ДанныеТекущейСтроки = Элементы.Список.ТекущиеДанные; + Если ДанныеТекущейСтроки = Неопределено + ИЛИ ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") + Тогда + + ТекстИсключения = НСтр("ru ='Для текущей строки выполнение команды не предусмотрено'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + Возврат ДанныеТекущейСтроки; + +КонецФункции + +&НаКлиенте +Процедура ОткрытьОбъектТекущейСтроки(ДанныеТекущейСтроки) + + Если НЕ ЗначениеЗаполнено(ДанныеТекущейСтроки.ПроблемныйОбъект) Тогда + + ТекстПредупреждения = НСтр("ru ='Предупреждение в текущей строке не привязано к объекту информационной базы'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ПоказатьПредупреждение(Неопределено, ТекстПредупреждения); + Возврат; + + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОткрытияОбъекта", ЭтотОбъект); + ПоказатьЗначение(ОписаниеОповещения, ДанныеТекущейСтроки.ПроблемныйОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОткрытияОбъекта(ДополнительныеПараметры) Экспорт + + ОбновитьСписокФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораПоПериоду() + + Если НЕ ЗначениеЗаполнено(КэшЗначений.ОтборПоДатеВозникновения) Тогда + + ПредставлениеОтбораПоПериоду = НСтр("ru ='Отбор не установлен'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + Иначе + + ПредставлениеОтбораПоПериоду = СокрЛП(КэшЗначений.ОтборПоДатеВозникновения); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораУзловОбмена() + + Если КэшЗначений.ОтборУзловПланаОбмена = Неопределено + ИЛИ КэшЗначений.ОтборУзловПланаОбмена.Количество() = 0 Тогда + + ПредставлениеОтбораСинхронизаций = НСтр("ru ='Отбор не установлен'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ИначеЕсли КэшЗначений.ОтборУзловПланаОбмена.Количество() = 1 Тогда + + ПредставлениеОтбораСинхронизаций = Строка(КэшЗначений.ОтборУзловПланаОбмена[0]); + + Иначе + + ШаблонТекста = НСтр("ru ='%1%2 (и еще %3 шт.)'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + Троеточие = ?(СтрДлина(СокрЛП(КэшЗначений.ОтборУзловПланаОбмена[0])) > 32, "...", ""); + КоличествоЕще = КэшЗначений.ОтборУзловПланаОбмена.Количество() - 1; + + ПредставлениеОтбораСинхронизаций = СтрШаблон(ШаблонТекста, Лев(СокрЛП(КэшЗначений.ОтборУзловПланаОбмена[0]), 33), Троеточие, КоличествоЕще); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораПоТипамПредупреждений() + + Если КэшЗначений.ОтборТипыПредупреждений = Неопределено + ИЛИ КэшЗначений.ОтборТипыПредупреждений.Количество() = 0 Тогда + + ПредставлениеОтбораТиповПредупреждений = НСтр("ru ='Отбор не установлен'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ИначеЕсли КэшЗначений.ОтборТипыПредупреждений.Количество() = 1 Тогда + + ПредставлениеОтбораТиповПредупреждений = Строка(КэшЗначений.ОтборТипыПредупреждений[0]); + + ИначеЕсли КэшЗначений.ОтборТипыПредупреждений.Количество() > 8 Тогда + + ПредставлениеОтбораТиповПредупреждений = НСтр("ru ='Все типы предупреждений'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + Иначе + + ШаблонТекста = НСтр("ru ='%1%2 (и еще %3 шт.)'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + Троеточие = ?(СтрДлина(СокрЛП(КэшЗначений.ОтборТипыПредупреждений[0])) > 32, "...", ""); + КоличествоЕще = КэшЗначений.ОтборТипыПредупреждений.Количество() - 1; + + ПредставлениеОтбораТиповПредупреждений = СтрШаблон(ШаблонТекста, Лев(СокрЛП(КэшЗначений.ОтборТипыПредупреждений[0]), 33), Троеточие, КоличествоЕще); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКарточкуПроблемы(ПараметрыОткрытия) + Перем ПроблемныйОбъект, ТипПредупреждения; + + ПараметрыОткрытия.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + ПараметрыОткрытия.Свойство("ТипПредупреждения", ТипПредупреждения); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияКарточкиСПредупреждением", ЭтотОбъект); + + Если ТипПредупреждения = ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты") Тогда + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупреждениеНезаполненногоРеквизита", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + + ИначеЕсли ТипПредупреждения = ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент") Тогда + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупреждениеНепроведенногоДокумента", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + + ИначеЕсли ТипПредупреждения = ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных") + ИЛИ ТипПредупреждения = ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных") Тогда + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупрежденияОбработчиковОтправкиПолучения", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + + ИначеЕсли ТипПредупреждения = ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта") Тогда + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупреждениеКонвертацииОбъектаПриОтправке", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + + ИначеЕсли ТипПредупреждения = КэшЗначений.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе + ИЛИ ТипПредупреждения = КэшЗначений.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе Тогда + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупреждениеПоДатеЗапретаЗагрузки", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + + ИначеЕсли ТипПредупреждения = КэшЗначений.НепринятыеДанныеПоКоллизии + ИЛИ ТипПредупреждения = КэшЗначений.ПринятыеДанныеПоКоллизии Тогда + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ПредупреждениеОКоллизии", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗакрытияКарточкиСПредупреждением(Результат, ДополнительныеПараметры) Экспорт + + Если Результат <> Неопределено Тогда + + ОбновитьСписокФормы(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьСостояниеПредупреждения(ВыделенныеСтроки, СкрытьОтобразить) + + НаборСтруктур = Новый Массив; + Для Каждого ИндексСтроки Из ВыделенныеСтроки Цикл + + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ИндексСтроки); + Если ДанныеСтроки = Неопределено Тогда + + Продолжить; + + КонецЕсли; + + СтруктураДанныхСтроки = Новый Структура("ПроблемныйОбъект, ТипПредупреждения, УзелИнформационнойБазы, КлючУникальности, ВерсияИзДругойПрограммы"); + ЗаполнитьЗначенияСвойств(СтруктураДанныхСтроки, ДанныеСтроки); + + НаборСтруктур.Добавить(СтруктураДанныхСтроки); + + КонецЦикла; + + ИзменитьСостояниеПредупрежденияНаСервере(НаборСтруктур, СкрытьОтобразить); + ОбновитьСписокФормы(); + ДоступностьКомандСпискаФормы(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСписокФормы() + + Если НЕ Элементы.СписокОтключитьАвтоматическоеОбновлениеФормы.Пометка Тогда + + Элементы.Список.Обновить(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ДоступностьКомандСпискаФормы() + + ДанныеТекущейСтроки = Элементы.Список.ТекущиеДанные; + Если ДанныеТекущейСтроки = Неопределено + ИЛИ ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") + Тогда + + Элементы.СписокПредупрежденияСкрытьИзСписка.Доступность = Ложь; + Элементы.СписокПредупрежденияПоказатьВСписке.Доступность = Ложь; + Элементы.СписокКонтекстноеМенюПредупрежденияСкрытьИзСписка.Доступность = Ложь; + Элементы.СписокКонтекстноеМенюПредупрежденияПоказатьВСписке.Доступность = Ложь; + Элементы.СписокОткрытьОбъект.Доступность = Ложь; + Элементы.СписокПровестиДокумент.Доступность = Ложь; + Элементы.СписокГрупповоеИзменениеРеквизитов.Доступность = Ложь; + Элементы.СписокКоллизии.Доступность = Ложь; + Элементы.СписокЗапретЗагрузкиПоДате.Доступность = Ложь; + Возврат; + + КонецЕсли; + + Элементы.СписокПредупрежденияСкрытьИзСписка.Доступность = НЕ ДанныеТекущейСтроки.СкрытьПредупреждение; + Элементы.СписокПредупрежденияПоказатьВСписке.Доступность = ДанныеТекущейСтроки.СкрытьПредупреждение; + Элементы.СписокКонтекстноеМенюПредупрежденияСкрытьИзСписка.Доступность = НЕ ДанныеТекущейСтроки.СкрытьПредупреждение; + Элементы.СписокКонтекстноеМенюПредупрежденияПоказатьВСписке.Доступность = ДанныеТекущейСтроки.СкрытьПредупреждение; + + Если Элементы.СписокОткрытьОбъект.Доступность = Ложь Тогда + + Элементы.СписокОткрытьОбъект.Доступность = Истина; + Элементы.СписокПровестиДокумент.Доступность = Истина; + Элементы.СписокГрупповоеИзменениеРеквизитов.Доступность = Истина; + Элементы.СписокКоллизии.Доступность = Истина; + Элементы.СписокЗапретЗагрузкиПоДате.Доступность = Истина; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьПоляОформления(ЭлементУсловногоОформления, ИменаПолейОформления) + + Для каждого ИмяПоля Из ИменаПолейОформления Цикл + + ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УсловноеОформлениеФормы() + + ИменаПолейОформления = Новый Массив; + ИменаПолейОформления.Добавить("ДатаВозникновения"); + ИменаПолейОформления.Добавить("ПроблемныйОбъект"); + ИменаПолейОформления.Добавить("Описание"); + ИменаПолейОформления.Добавить("ПредставлениеТипаПредупреждения"); + ИменаПолейОформления.Добавить("УзелИнформационнойБазы"); + ИменаПолейОформления.Добавить("КлючУникальности"); + + // Блокирующие предупреждения красным + ТипыКритичныхПредупреждений = Новый СписокЗначений; + ТипыКритичныхПредупреждений.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных); + ТипыКритичныхПредупреждений.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных); + + ОшибкиКрасным = УсловноеОформление.Элементы.Добавить(); + ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ОшибкиКрасным.Отбор, "Список.ТипПредупреждения", ВидСравненияКомпоновкиДанных.ВСписке, ТипыКритичныхПредупреждений); + ОшибкиКрасным.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноКрасный); + ДобавитьПоляОформления(ОшибкиКрасным, ИменаПолейОформления); + + // Скрытые предупреждения серым + СкрытыеПредупрежденияСерым = УсловноеОформление.Элементы.Добавить(); + ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(СкрытыеПредупрежденияСерым.Отбор, "Список.СкрытьПредупреждение", ВидСравненияКомпоновкиДанных.Равно, Истина); + СкрытыеПредупрежденияСерым.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Серый); + ДобавитьПоляОформления(СкрытыеПредупрежденияСерым, ИменаПолейОформления); + +КонецПроцедуры + +&НаСервере +Процедура ОтборыПоПереданнымПараметрам() + + Параметры.Свойство("ОтборПоДатеВозникновения", КэшЗначений.ОтборПоДатеВозникновения); + ОтборПоДатеВозникновения(); + + Параметры.Свойство("УзлыОбмена", КэшЗначений.МассивУзловПланаОбмена); + Параметры.Свойство("ОтборУзловОбменов", КэшЗначений.ОтборУзловПланаОбмена); + ОтборПоУзламИнформационнойБазы(); + + Параметры.Свойство("ОтборТипыПредупреждений", КэшЗначений.ОтборТипыПредупреждений); + ОтборПоТипамПредупреждений(); + + ОтборСкрытыеПредупреждения() + +КонецПроцедуры + +&НаСервере +Процедура ОтборПоДатеВозникновения() + Перем ГруппаОтбораДанных; + + Если ТипЗнч(КэшЗначений.ОтборПоДатеВозникновения) <> Тип("СтандартныйПериод") Тогда + + КэшЗначений.ОтборПоДатеВозникновения = Новый СтандартныйПериод; + + КонецЕсли; + + Использование = ЗначениеЗаполнено(КэшЗначений.ОтборПоДатеВозникновения); + + ПредставлениеГруппыОтбора = НСтр("ru ='Отбор по дате возникновения'", ОбщегоНазначения.КодОсновногоЯзыка()); + + НайтиЭлементОтбораДинамическогоСписка(Неопределено, ГруппаОтбораДанных, Неопределено, ПредставлениеГруппыОтбора, Истина); + Если ГруппаОтбораДанных = Неопределено Тогда + + ГруппаОтбораДанных = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + ГруппаОтбораДанных.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; + ГруппаОтбораДанных.Представление = ПредставлениеГруппыОтбора; + ГруппаОтбораДанных.Использование = Использование; + + Иначе + + ГруппаОтбораДанных.Использование = Использование; + + КонецЕсли; + + ОтборПоДатеВозникновения = КэшЗначений.ОтборПоДатеВозникновения; // СтандартныйПериод + + ПараметрыЭлементаОтбора = Новый Структура; + ПараметрыЭлементаОтбора.Вставить("КоллекцияЭлементов", ГруппаОтбораДанных.Элементы); + ПараметрыЭлементаОтбора.Вставить("ЭлементОтбораДанных", Неопределено); + ПараметрыЭлементаОтбора.Вставить("ЛевоЗначениеОтбора", Новый ПолеКомпоновкиДанных("ДатаВозникновения")); + ПараметрыЭлементаОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.БольшеИлиРавно); + ПараметрыЭлементаОтбора.Вставить("ПравоеЗначение", ОтборПоДатеВозникновения.ДатаНачала); + ПараметрыЭлементаОтбора.Вставить("ПредставлениеОтбора", НСтр("ru ='Отбор даты с'", ОбщегоНазначения.КодОсновногоЯзыка())); + ПараметрыЭлементаОтбора.Вставить("Использование", Использование); + + УстановитьЗначениеОтбораДинамическогоСписка(ПараметрыЭлементаОтбора); + + ПараметрыЭлементаОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; + ПараметрыЭлементаОтбора.ПравоеЗначение = ОтборПоДатеВозникновения.ДатаОкончания; + ПараметрыЭлементаОтбора.ПредставлениеОтбора = НСтр("ru ='Отбор даты по'", ОбщегоНазначения.КодОсновногоЯзыка()); + + УстановитьЗначениеОтбораДинамическогоСписка(ПараметрыЭлементаОтбора); + +КонецПроцедуры + +&НаСервере +Процедура ОтборПоУзламИнформационнойБазы() + + Использование = ТипЗнч(КэшЗначений.ОтборУзловПланаОбмена) = Тип("Массив") + И (КэшЗначений.ОтборУзловПланаОбмена.Количество() > 0); + + ПараметрыЭлементаОтбора = Новый Структура; + ПараметрыЭлементаОтбора.Вставить("ЭлементОтбораДанных", Неопределено); + ПараметрыЭлементаОтбора.Вставить("ЛевоЗначениеОтбора", Новый ПолеКомпоновкиДанных("УзелИнформационнойБазы")); + ПараметрыЭлементаОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.ВСписке); + ПараметрыЭлементаОтбора.Вставить("ПравоеЗначение", КэшЗначений.ОтборУзловПланаОбмена); + ПараметрыЭлементаОтбора.Вставить("ПредставлениеОтбора", НСтр("ru ='Отбор синхронизаций'", ОбщегоНазначения.КодОсновногоЯзыка())); + ПараметрыЭлементаОтбора.Вставить("Использование", Использование); + + УстановитьЗначениеОтбораДинамическогоСписка(ПараметрыЭлементаОтбора); + +КонецПроцедуры + +&НаСервере +Процедура ОтборПоТипамПредупреждений() + + Использование = ТипЗнч(КэшЗначений.ОтборТипыПредупреждений) = Тип("Массив") + И (КэшЗначений.ОтборТипыПредупреждений.Количество() > 0); + + ПараметрыЭлементаОтбора = Новый Структура; + ПараметрыЭлементаОтбора.Вставить("ЭлементОтбораДанных", Неопределено); + ПараметрыЭлементаОтбора.Вставить("ЛевоЗначениеОтбора", Новый ПолеКомпоновкиДанных("ТипПредупреждения")); + ПараметрыЭлементаОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.ВСписке); + ПараметрыЭлементаОтбора.Вставить("ПравоеЗначение", КэшЗначений.ОтборТипыПредупреждений); + ПараметрыЭлементаОтбора.Вставить("ПредставлениеОтбора", НСтр("ru ='Отбор по типу предупреждения'", ОбщегоНазначения.КодОсновногоЯзыка())); + ПараметрыЭлементаОтбора.Вставить("Использование", Использование); + + УстановитьЗначениеОтбораДинамическогоСписка(ПараметрыЭлементаОтбора); + +КонецПроцедуры + +&НаСервере +Процедура ОтборСкрытыеПредупреждения() + + Использование = НЕ КэшЗначений.ПредупрежденияПоказатьСкрытые; + + ПараметрыЭлементаОтбора = Новый Структура; + ПараметрыЭлементаОтбора.Вставить("ЭлементОтбораДанных", Неопределено); + ПараметрыЭлементаОтбора.Вставить("ЛевоЗначениеОтбора", Новый ПолеКомпоновкиДанных("СкрытьПредупреждение")); + ПараметрыЭлементаОтбора.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.Равно); + ПараметрыЭлементаОтбора.Вставить("ПравоеЗначение", Ложь); + ПараметрыЭлементаОтбора.Вставить("ПредставлениеОтбора", НСтр("ru ='Отбор скрытых предупреждений'", ОбщегоНазначения.КодОсновногоЯзыка())); + ПараметрыЭлементаОтбора.Вставить("Использование", Использование); + + УстановитьЗначениеОтбораДинамическогоСписка(ПараметрыЭлементаОтбора); + +КонецПроцедуры + +&НаСервере +Процедура НайтиЭлементОтбораДинамическогоСписка(КоллекцияЭлементов, ЭлементОтбораДанных, ЛевоЗначениеОтбора, ПредставлениеОтбора, ИскатьГруппуЭлементов = Ложь) + + Если КоллекцияЭлементов = Неопределено Тогда + + КоллекцияЭлементов = Список.Отбор.Элементы; + + КонецЕсли; + + Для каждого ЭлементОтбора Из КоллекцияЭлементов Цикл + + Если ИскатьГруппуЭлементов + И ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") + И ЭлементОтбора.Представление = ПредставлениеОтбора Тогда + + ЭлементОтбораДанных = ЭлементОтбора; + Прервать; + + ИначеЕсли ЭлементОтбора.Представление = ПредставлениеОтбора + И ЭлементОтбора.ЛевоеЗначение = ЛевоЗначениеОтбора Тогда + + ЭлементОтбораДанных = ЭлементОтбора; + Прервать; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьЗначениеОтбораДинамическогоСписка(ПараметрыЭлементаОтбора) + Перем КоллекцияЭлементов, ЭлементОтбораДанных, ЛевоЗначениеОтбора, ВидСравненияОтбораДинамическогоСписка; + Перем ПравоеЗначение, ПредставлениеОтбора, Использование; + + ПараметрыЭлементаОтбора.Свойство("КоллекцияЭлементов", КоллекцияЭлементов); + ПараметрыЭлементаОтбора.Свойство("ЭлементОтбораДанных", ЭлементОтбораДанных); + ПараметрыЭлементаОтбора.Свойство("ЛевоЗначениеОтбора", ЛевоЗначениеОтбора); + ПараметрыЭлементаОтбора.Свойство("ВидСравнения", ВидСравненияОтбораДинамическогоСписка); + ПараметрыЭлементаОтбора.Свойство("ПравоеЗначение", ПравоеЗначение); + ПараметрыЭлементаОтбора.Свойство("ПредставлениеОтбора", ПредставлениеОтбора); + ПараметрыЭлементаОтбора.Свойство("Использование", Использование); + + Если КоллекцияЭлементов = Неопределено Тогда + + КоллекцияЭлементов = Список.Отбор.Элементы; + + КонецЕсли; + + Если ЭлементОтбораДанных = Неопределено Тогда + + НайтиЭлементОтбораДинамическогоСписка(КоллекцияЭлементов, ЭлементОтбораДанных, ЛевоЗначениеОтбора, ПредставлениеОтбора); + + КонецЕсли; + + Если ЭлементОтбораДанных = Неопределено Тогда + + ЭлементОтбораДанных = КоллекцияЭлементов.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = ЛевоЗначениеОтбора; + ЭлементОтбораДанных.ВидСравнения = ВидСравненияОтбораДинамическогоСписка; + ЭлементОтбораДанных.ПравоеЗначение = ПравоеЗначение; + ЭлементОтбораДанных.Представление = ПредставлениеОтбора; + ЭлементОтбораДанных.Использование = Использование; + + Иначе + + ЭлементОтбораДанных.ПравоеЗначение = ПравоеЗначение; + ЭлементОтбораДанных.Использование = Использование; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ИзменитьСостояниеПредупрежденияНаСервере(НаборСтруктур, СкрытьОтобразить) + + Для Каждого СтруктураСДаннымиСтроки Из НаборСтруктур Цикл + + Если ТипЗнч(СтруктураСДаннымиСтроки.ТипПредупреждения) = Тип("ПеречислениеСсылка.ТипыПроблемОбменаДанными") Тогда + + РегистрыСведений.РезультатыОбменаДанными.Игнорировать(СтруктураСДаннымиСтроки.ПроблемныйОбъект, СтруктураСДаннымиСтроки.ТипПредупреждения, СкрытьОтобразить, + СтруктураСДаннымиСтроки.УзелИнформационнойБазы, СтруктураСДаннымиСтроки.КлючУникальности); + + ИначеЕсли ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов.ИгнорироватьВерсиюОбъекта(СтруктураСДаннымиСтроки.ПроблемныйОбъект, СтруктураСДаннымиСтроки.ВерсияИзДругойПрограммы, СкрытьОтобразить); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#Область ПакетноеИсправлениеОшибок + +&НаКлиенте +Процедура ПровестиДокументыПоВыделеннымСтрокам(ВыделенныеСтроки); + + ДанныеВыделенныхСтрок = Новый Массив; + Для Каждого ИндексСтроки Из ВыделенныеСтроки Цикл + + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ИндексСтроки); + Если ДанныеСтроки = Неопределено + ИЛИ ДанныеСтроки.ТипПредупреждения <> ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент") + ИЛИ НЕ ЗначениеЗаполнено(ДанныеСтроки.ПроблемныйОбъект) + Тогда + + Продолжить; + + КонецЕсли; + + ДанныеВыделенныхСтрок.Добавить(ДанныеСтроки.ПроблемныйОбъект); + + КонецЦикла; + + Если ДанныеВыделенныхСтрок.Количество() = 0 Тогда + + СообщениеОбОшибке = НСтр("ru ='В выделенных строках нет предупреждений с типом <Непроведенный документ>'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + Возврат + + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ДанныеВыделенныхСтрок", ДанныеВыделенныхСтрок); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеГрупповойОбработкиПредупреждений", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ОбработкаПредупрежденийПроведения", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура КоллизииПоВыделеннымСтрокам(ВыделенныеСтроки); + + ТипыПредупрежденийКоллизии = Новый Массив(2); + ТипыПредупрежденийКоллизии[0] = КэшЗначений.НепринятыеДанныеПоКоллизии; + ТипыПредупрежденийКоллизии[1] = КэшЗначений.ПринятыеДанныеПоКоллизии; + + ДанныеВыделенныхСтрок = Новый Массив; + Для Каждого ИндексСтроки Из ВыделенныеСтроки Цикл + + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ИндексСтроки); + Если ДанныеСтроки = Неопределено + ИЛИ ТипыПредупрежденийКоллизии.Найти(ДанныеСтроки.ТипПредупреждения) = Неопределено + ИЛИ НЕ ЗначениеЗаполнено(ДанныеСтроки.ПроблемныйОбъект) + Тогда + + Продолжить; + + КонецЕсли; + + СтруктураДанных = Новый Структура; + СтруктураДанных.Вставить("ВерсияИзДругойПрограммы", ДанныеСтроки.ВерсияИзДругойПрограммы); + СтруктураДанных.Вставить("ВерсияЭтойПрограммы", ДанныеСтроки.ВерсияЭтойПрограммы); + СтруктураДанных.Вставить("ПроблемныйОбъект", ДанныеСтроки.ПроблемныйОбъект); + + ДанныеВыделенныхСтрок.Добавить(СтруктураДанных); + + КонецЦикла; + + Если ДанныеВыделенныхСтрок.Количество() = 0 Тогда + + СообщениеОбОшибке = НСтр("ru ='В выделенных строках нет предупреждений с типами <Неприняты данные коллизии>, <Приняты данные коллизии>'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + Возврат + + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ДанныеВыделенныхСтрок", ДанныеВыделенныхСтрок); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеГрупповойОбработкиПредупреждений", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ОбработкаПредупрежденийКоллизии", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗапретЗагрузкиПоВыделеннымСтрокам(ВыделенныеСтроки); + + ТипыПредупрежденийКоллизии = Новый Массив(2); + ТипыПредупрежденийКоллизии[0] = КэшЗначений.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе; + ТипыПредупрежденийКоллизии[1] = КэшЗначений.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе; + + ДанныеВыделенныхСтрок = Новый Массив; + Для Каждого ИндексСтроки Из ВыделенныеСтроки Цикл + + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ИндексСтроки); + Если ДанныеСтроки = Неопределено + ИЛИ ТипыПредупрежденийКоллизии.Найти(ДанныеСтроки.ТипПредупреждения) = Неопределено + ИЛИ НЕ ЗначениеЗаполнено(ДанныеСтроки.ПроблемныйОбъект) + Тогда + + Продолжить; + + КонецЕсли; + + СтруктураДанных = Новый Структура; + СтруктураДанных.Вставить("ВерсияИзДругойПрограммы", ДанныеСтроки.ВерсияИзДругойПрограммы); + СтруктураДанных.Вставить("ВерсияЭтойПрограммы", ДанныеСтроки.ВерсияЭтойПрограммы); + СтруктураДанных.Вставить("ПроблемныйОбъект", ДанныеСтроки.ПроблемныйОбъект); + + ДанныеВыделенныхСтрок.Добавить(СтруктураДанных); + + КонецЦикла; + + Если ДанныеВыделенныхСтрок.Количество() = 0 Тогда + + СообщениеОбОшибке = НСтр("ru ='В выделенных строках нет предупреждений с типами <Непринятый, существующий>, <Непринятый, новый>, + |которые возникли из-за попытки загрузить данных в закрытый период.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + Возврат + + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ДанныеВыделенныхСтрок", ДанныеВыделенныхСтрок); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеГрупповойОбработкиПредупреждений", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ОбработкаПредупрежденийПоДатеЗапретаЗагрузки", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ГрупповоеИзменениеРеквизитовПоВыделеннымСтрокам(ВыделенныеСтроки) + + ДанныеВыделенныхСтрок = Новый Массив; + Для Каждого ИндексСтроки Из ВыделенныеСтроки Цикл + + ДанныеСтроки = Элементы.Список.ДанныеСтроки(ИндексСтроки); + Если ДанныеСтроки = Неопределено + ИЛИ ДанныеСтроки.ТипПредупреждения <> ПредопределенноеЗначение("Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты") + ИЛИ НЕ ЗначениеЗаполнено(ДанныеСтроки.ПроблемныйОбъект) + Тогда + + Продолжить; + + КонецЕсли; + + ДанныеВыделенныхСтрок.Добавить(ДанныеСтроки.ПроблемныйОбъект); + + КонецЦикла; + + Если ДанныеВыделенныхСтрок.Количество() = 0 Тогда + + СообщениеОбОшибке = НСтр("ru ='В выделенных строках нет предупреждений с типами <Пустые реквизиты>.'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + ПоказатьПредупреждение(Неопределено, СообщениеОбОшибке); + Возврат + + КонецЕсли; + + ИзменитьРеквизитыГрупповойОбработкой(ДанныеВыделенныхСтрок) + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРеквизитыГрупповойОбработкой(ДанныеВыделенныхСтрок) + + Если НЕ ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + + Возврат; + + КонецЕсли; + + ПараметрыГрупповогоИзменения = Новый Структура; + ПараметрыГрупповогоИзменения.Вставить("МассивОбъектов", ДанныеВыделенныхСтрок); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеГрупповойОбработкиПредупреждений", ЭтотОбъект); + + МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); + МодульГрупповоеИзменениеОбъектовКлиент.НачатьИзменениеВыделенныхСОповещением(ПараметрыГрупповогоИзменения, ОписаниеОповещения) + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеГрупповойОбработкиПредупреждений(Результат, ДополнительныеПараметры) Экспорт + + // Добавить "Результат <> Неопределено" нельзя: + // 1. ИзменитьРеквизитыГрупповойОбработкой всегда возвращает Неопределено; + // 2. В других формах можно выполнить <исправление>, а потом нажать Отмена. + ОбновитьСписокФормы(); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Form.form new file mode 100644 index 000000000..e928831e3 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Form.form @@ -0,0 +1,939 @@ + + + + СтраницыФормы + 26 + + СтраницаОтборы + 1 + + ДекорацияИнформация + 23 + + <key>ru</key> + <value>Декорация информация</value> + + true + true + + true + + ShowRight + + ДекорацияИнформацияРасширеннаяПодсказка + 25 + + <key>ru</key> + <value>Операция позволяет почистить предупреждения синхронизации данных, которые потеряли свою актуальность. Это важная операция, потому что избыточное количество предупреждений замедляет работу списка. Но следует учитывать, что во время удаления предупреждений нужно приостановить работу всех синхронизаций данных, в том числе и тех, которые настроены на работу по расписанию.</value> + + Label + true + true + + Left + + + + ДекорацияИнформацияКонтекстноеМеню + 24 + true + + true + true + + + CommonPicture.Информация32 + + AsFileRef + + + + ДекорацияОтступ + 36 + true + true + + true + + + ДекорацияОтступРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + ДекорацияОтступКонтекстноеМеню + 37 + true + + Label + true + true + + Left + + + + Группа1 + 3 + + ПредставлениеОтбораПоПериоду + 57 + true + true + + true + + + ПредставлениеОтбораПоПериоду + + + ru + Если период не указан будут удаляться записи за весь период. Отбор предупреждений за период значительно увеличивает время обработки. + + Button + + ПредставлениеОтбораПоПериодуРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ПредставлениеОтбораПоПериодуКонтекстноеМеню + 58 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеОтбораПоПериодуНачалоВыбора + + + Clearing + ПредставлениеОтбораПоПериодуОчистка + + 20 + true + true + true + true + true + Normal + + + + ПредставлениеОтбораСинхронизаций + 63 + true + true + + true + + + ПредставлениеОтбораСинхронизаций + + + ru + Если настройка не заполнена, то будут удаляться предупреждения любой синхронизации данных. + + Button + + ПредставлениеОтбораСинхронизацийРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + ПредставлениеОтбораСинхронизацийКонтекстноеМеню + 64 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеОтбораСинхронизацийНачалоВыбора + + + Clearing + ПредставлениеОтбораСинхронизацийОчистка + + true + true + true + true + true + true + Normal + + + + ПредставлениеОтбораТиповПредупреждений + 60 + true + true + + true + + + ПредставлениеОтбораТиповПредупреждений + + + ru + Если отбор не установлен, то будут удаляться записи с любым типом предупреждения. + + Button + + ПредставлениеОтбораТиповПредупрежденийРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ПредставлениеОтбораТиповПредупрежденийКонтекстноеМеню + 61 + true + + InputField + Enter + true + Left + true + + + StartChoice + ПредставлениеОтбораТиповПредупрежденийНачалоВыбора + + + Clearing + ПредставлениеОтбораТиповПредупрежденийОчистка + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Группа 1</value> + + + Группа1РасширеннаяПодсказка + 4 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + ТолькоСкрытыеЗаписи + 16 + true + true + + true + + + ТолькоСкрытыеЗаписи + + Right + + ru + Очистить только скрытые предупреждения по указанным условиям. Установка опции значительно увеличивает время работы. + + Button + + ТолькоСкрытыеЗаписиРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + ТолькоСкрытыеЗаписиКонтекстноеМеню + 17 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + <key>ru</key> + <value>Отборы</value> + + + СтраницаОтборыРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаДлительнаяОперация + 28 + + ДекорацияДлительнаяОперация + 30 + + <key>ru</key> + <value>Длительная операция</value> + + true + true + + true + + ShowRight + + ДекорацияДлительнаяОперацияРасширеннаяПодсказка + 32 + + <key>ru</key> + <value>Подождите, пожалуйста, +производится удаление уставших записей…</value> + + Label + true + true + + Left + + + + ДекорацияДлительнаяОперацияКонтекстноеМеню + 31 + true + + true + true + + + CommonPicture.ДлительнаяОперация48 + + AsFileRef + + + + ДекорацияОтступ1 + 39 + true + true + + true + + + ДекорацияОтступ1РасширеннаяПодсказка + 41 + Label + true + true + + Left + + + + ДекорацияОтступ1КонтекстноеМеню + 40 + true + + Label + true + true + + Left + + + + Индикация + 33 + true + true + + true + + + Индикация + + None + + ИндикацияРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + ИндикацияКонтекстноеМеню + 34 + true + + ProgressBarField + Enter + true + Left + true + + 32 + true + 1 + true + true + 99 + true + + + true + true + + true + + + <key>ru</key> + <value>Длительная операция</value> + + + СтраницаДлительнаяОперацияРасширеннаяПодсказка + 29 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаОшибка + 47 + + ДекорацияЗаголовокОшибки + 49 + + <key>ru</key> + <value>Длительная операция</value> + + true + true + + true + + ShowRight + + ДекорацияЗаголовокОшибкиРасширеннаяПодсказка + 51 + + <key>ru</key> + <value>В процессе работы произошла ошибка... +Для устранения ошибки скопируйте приведенный ниже текст и передайте его администратору.</value> + + Label + true + true + + Left + + + + ДекорацияЗаголовокОшибкиКонтекстноеМеню + 50 + true + + true + true + + + CommonPicture.Ошибка32 + + AsFileRef + + + + ОписаниеОшибки + 42 + true + true + + true + + + ОписаниеОшибки + + Top + + ОписаниеОшибкиРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + + ОписаниеОшибкиКонтекстноеМеню + 43 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Ошибка</value> + + + СтраницаОшибкаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + СтраницаГотово + 52 + + ДекорацияЗаголовокГотово + 54 + + <key>ru</key> + <value>Длительная операция</value> + + true + true + + true + + ShowRight + + ДекорацияЗаголовокГотовоРасширеннаяПодсказка + 56 + + <key>ru</key> + <value>Очистка завершена, +устаревшие предупреждения удалены.</value> + + Label + true + true + + Left + + + + ДекорацияЗаголовокГотовоКонтекстноеМеню + 55 + true + + true + true + + + CommonPicture.Информация32 + + AsFileRef + + + true + true + + true + + + <key>ru</key> + <value>Готово</value> + + + ru + Страница ошибка + + + СтраницаГотовоРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Страницы формы</value> + + + СтраницыФормыРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + Pages + + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаУдалитьПредупреждения + 19 + true + true + + true + + + ФормаУдалитьПредупрежденияРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Form.Command.УдалитьПредупреждения + Auto + true + true + true + UserCmds + Auto + + + ФормаЗакрыть + 45 + true + true + + true + + + ФормаЗакрытьРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + ПредставлениеОтбораПоПериоду + + <key>ru</key> + <value>Период</value> + + 1 + + String + + 100 + + + + true + + + true + + + ПредставлениеОтбораПоПериоду + + + + ПредставлениеОтбораТиповПредупреждений + + <key>ru</key> + <value>Тип</value> + + 2 + + String + + 50 + + + + true + + + true + + + + ПредставлениеОтбораСинхронизаций + + <key>ru</key> + <value>Синхронизации</value> + + 3 + + String + + 50 + + + + true + + + true + + + + КэшЗначений + 4 + + + true + + + true + + + + ТолькоСкрытыеЗаписи + + <key>ru</key> + <value>Только скрытые записи, которые удовлетворяют условиям выше</value> + + 5 + + Boolean + + + true + + + true + + + + Индикация + + <key>ru</key> + <value>Индикация</value> + + 6 + + Number + + 2 + true + + + + true + + + true + + + + ДлительнаяОперация + 7 + + + true + + + true + + + + ОписаниеОшибки + + <key>ru</key> + <value>Ошибка (описание для администратора)</value> + + 8 + + String + + + + true + + + true + + + + УдалитьПредупреждения + + <key>ru</key> + <value>Удалить предупреждения</value> + + 1 + + ru + Удалить предупреждения + + + true + + + + УдалитьПредупреждения + + + Auto + Auto + + + + + + diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Module.bsl new file mode 100644 index 000000000..a0041f27e --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/УдалениеУстаревшихПредупреждений/Module.bsl @@ -0,0 +1,390 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + КэшЗначений = Новый Структура("МассивУзловПланаОбмена, ОтборПоДатеВозникновения, ОтборУзловПланаОбмена, ОтборТипыПредупреждений"); + + ОтборыПоПереданнымПараметрам(); + + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаОтборы; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + ПредставлениеОтбораПоПериоду(); + ПредставлениеОтбораУзловОбмена(); + ПредставлениеОтбораПоТипамПредупреждений(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПредставлениеОтбораПоПериодуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Диалог = Новый ДиалогРедактированияСтандартногоПериода(); + Диалог.Период = КэшЗначений.ОтборПоДатеВозникновения; + Диалог.Показать(Новый ОписаниеОповещения("ПослеОтбораПоДатеВозникновения", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОтбораПоДатеВозникновения(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("СтандартныйПериод") Тогда + + Возврат; + + КонецЕсли; + + КэшЗначений.ОтборПоДатеВозникновения = Результат; + ПредставлениеОтбораПоПериоду(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораПоПериодуОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораСинхронизацийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("МассивУзловПланаОбмена", КэшЗначений.МассивУзловПланаОбмена); + ПараметрыОткрытия.Вставить("ОтборУзловПланаОбмена", КэшЗначений.ОтборУзловПланаОбмена); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОтбораУзловОбменов", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ОтборСинхронизаций", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОтбораУзловОбменов(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + КэшЗначений.ОтборУзловПланаОбмена = Результат; + ПредставлениеОтбораУзловОбмена(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораСинхронизацийОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораТиповПредупрежденийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ОтборТипыПредупреждений", КэшЗначений.ОтборТипыПредупреждений); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОтбораПоТипуПредупреждений", ЭтотОбъект); + + ОткрытьФорму("РегистрСведений.РезультатыОбменаДанными.Форма.ОтборПредупрежденийПоТипам", ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОтбораПоТипуПредупреждений(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("Массив") Тогда + + Возврат; + + КонецЕсли; + + КэшЗначений.ОтборТипыПредупреждений = Результат; + ПредставлениеОтбораПоТипамПредупреждений(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораТиповПредупрежденийОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура УдалитьПредупреждения(Команда) + + УдалитьПредупрежденияВДлительнойОперации(); + ПослеНачалаДлительнойОперации(); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура ПредставлениеОтбораПоПериоду() + + Если НЕ ЗначениеЗаполнено(КэшЗначений.ОтборПоДатеВозникновения) Тогда + + ПредставлениеОтбораПоПериоду = НСтр("ru ='Отбор не установлен'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + Иначе + + ПредставлениеОтбораПоПериоду = СокрЛП(КэшЗначений.ОтборПоДатеВозникновения); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораУзловОбмена() + + Если КэшЗначений.ОтборУзловПланаОбмена = Неопределено + ИЛИ КэшЗначений.ОтборУзловПланаОбмена.Количество() = 0 Тогда + + ПредставлениеОтбораСинхронизаций = НСтр("ru ='Отбор не установлен'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ИначеЕсли КэшЗначений.ОтборУзловПланаОбмена.Количество() = 1 Тогда + + ПредставлениеОтбораСинхронизаций = Строка(КэшЗначений.ОтборУзловПланаОбмена[0]); + + Иначе + + ШаблонТекста = НСтр("ru ='%1%2 (и еще %3 шт.)'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + Троеточие = ?(СтрДлина(СокрЛП(КэшЗначений.ОтборУзловПланаОбмена[0])) > 29, "...", ""); + КоличествоЕще = КэшЗначений.ОтборУзловПланаОбмена.Количество() - 1; + + ПредставлениеОтбораСинхронизаций = СтрШаблон(ШаблонТекста, Лев(СокрЛП(КэшЗначений.ОтборУзловПланаОбмена[0]), 30), Троеточие, КоличествоЕще); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораПоТипамПредупреждений() + + Если КэшЗначений.ОтборТипыПредупреждений = Неопределено + ИЛИ КэшЗначений.ОтборТипыПредупреждений.Количество() = 0 Тогда + + ПредставлениеОтбораТиповПредупреждений = НСтр("ru ='Отбор не установлен'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + ИначеЕсли КэшЗначений.ОтборТипыПредупреждений.Количество() = 1 Тогда + + ПредставлениеОтбораТиповПредупреждений = Строка(КэшЗначений.ОтборТипыПредупреждений[0]); + + ИначеЕсли КэшЗначений.ОтборТипыПредупреждений.Количество() > 8 Тогда + + ПредставлениеОтбораТиповПредупреждений = НСтр("ru ='Все типы предупреждений'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + + Иначе + + ШаблонТекста = НСтр("ru ='%1%2 (и еще %3 шт.)'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); + Троеточие = ?(СтрДлина(СокрЛП(КэшЗначений.ОтборТипыПредупреждений[0])) > 29, "...", ""); + КоличествоЕще = КэшЗначений.ОтборТипыПредупреждений.Количество() - 1; + + ПредставлениеОтбораТиповПредупреждений = СтрШаблон(ШаблонТекста, Лев(СокрЛП(КэшЗначений.ОтборТипыПредупреждений[0]), 30), Троеточие, КоличествоЕще); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьОшибкуПользователю() + + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаОшибка; + ОписаниеОшибки = ДлительнаяОперация.ПодробноеПредставлениеОшибки; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеНачалаДлительнойОперации() + + Если ТипЗнч(ДлительнаяОперация) = Тип("Структура") + И ДлительнаяОперация.Статус = "Ошибка" Тогда + + ПоказатьОшибкуПользователю(); + Возврат; + + КонецЕсли; + + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; + + ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); + ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; + ПараметрыОжидания.ВыводитьСообщения = Истина; + ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина; + ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессУдаленияПредупрежденийСинхронизации", ЭтотОбъект); + + ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект); + ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗавершенияДлительнойОперации(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(ДлительнаяОперация) = Тип("Структура") + И ДлительнаяОперация.Статус = "Ошибка" Тогда + + ПоказатьОшибкуПользователю(); + Возврат; + + КонецЕсли; + + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаГотово; + +КонецПроцедуры + +&НаКлиенте +Процедура ПрогрессУдаленияПредупрежденийСинхронизации(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено + ИЛИ Результат.Статус <> "Выполняется" Тогда + + Возврат; + + КонецЕсли; + + Если Результат.Прогресс <> Неопределено Тогда + + Индикация = ?(Результат.Прогресс.Процент < 1, 1, Результат.Прогресс.Процент); + Элементы.Индикация.Подсказка = Результат.Прогресс.Текст; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ОтборыПоПереданнымПараметрам() + + Параметры.Свойство("МассивУзловПланаОбмена", КэшЗначений.МассивУзловПланаОбмена); + Параметры.Свойство("ОтборПоДатеВозникновения", КэшЗначений.ОтборПоДатеВозникновения); + Параметры.Свойство("ОтборУзловОбменов", КэшЗначений.ОтборУзловПланаОбмена); + Параметры.Свойство("ОтборТипыПредупреждений", КэшЗначений.ОтборТипыПредупреждений); + + Если НЕ Параметры.Свойство("ТолькоСкрытыеЗаписи", ТолькоСкрытыеЗаписи) Тогда + + ТолькоСкрытыеЗаписи = Ложь; + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура РазобратьПредупрежденияПоТипам(ПараметрыУдаления) + + ОтборТипыПредупрежденийОбменов = Новый Массив; + ОтборТипыПредупрежденийВерсий = Новый Массив; + + ЗначенияОбменов = Новый Массив; + ЗначенияОбменов.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта); + ЗначенияОбменов.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных); + ЗначенияОбменов.Добавить(Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент); + ЗначенияОбменов.Добавить(Перечисления.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты); + ЗначенияОбменов.Добавить(Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных); + + ЗначенияВерсий = Новый Массив; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МенеджерПеречисления = Перечисления["ТипыВерсийОбъекта"]; + ЗначенияВерсий.Добавить(МенеджерПеречисления.НепринятыеДанныеПоКоллизии); + ЗначенияВерсий.Добавить(МенеджерПеречисления.ПринятыеДанныеПоКоллизии); + ЗначенияВерсий.Добавить(МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектНеСуществуетВБазе); + ЗначенияВерсий.Добавить(МенеджерПеречисления.НепринятыйПоДатеЗапретаОбъектСуществуетВБазе); + + КонецЕсли; + + Если КэшЗначений.ОтборТипыПредупреждений.Количество() > 0 Тогда + + Для каждого ЭлементМассива Из КэшЗначений.ОтборТипыПредупреждений Цикл + + Если ЗначенияОбменов.Найти(ЭлементМассива) <> Неопределено Тогда + + ОтборТипыПредупрежденийОбменов.Добавить(ЭлементМассива); + + КонецЕсли; + + Если ЗначенияВерсий.Найти(ЭлементМассива) <> Неопределено Тогда + + ОтборТипыПредупрежденийВерсий.Добавить(ЭлементМассива); + + КонецЕсли; + + КонецЦикла; + + Иначе + + ОтборТипыПредупрежденийОбменов = ЗначенияОбменов; + ОтборТипыПредупрежденийВерсий = ЗначенияВерсий; + + КонецЕсли; + + ПараметрыУдаления.Вставить("ОтборТипыПредупрежденийОбменов", ОтборТипыПредупрежденийОбменов); + ПараметрыУдаления.Вставить("ОтборТипыПредупрежденийВерсий", ОтборТипыПредупрежденийВерсий); + +КонецПроцедуры + +&НаСервере +Процедура УдалитьПредупрежденияВДлительнойОперации() + + Если ДлительнаяОперация <> Неопределено Тогда + + ДлительныеОперации.ОтменитьВыполнениеЗадания(ДлительнаяОперация.ИдентификаторЗадания); + + КонецЕсли; + + Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация; + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Удаление предупреждений синхронизации'", ОбщегоНазначения.КодОсновногоЯзыка()); + + ПараметрыУдаления = Новый Структура; + ПараметрыУдаления.Вставить("ОтборПоДатеВозникновения", КэшЗначений.ОтборПоДатеВозникновения); + ПараметрыУдаления.Вставить("ОтборУзловПланаОбмена", КэшЗначений.ОтборУзловПланаОбмена); + ПараметрыУдаления.Вставить("ТолькоСкрытыеЗаписи", ТолькоСкрытыеЗаписи); + РазобратьПредупрежденияПоТипам(ПараметрыУдаления); + + КоличествоОпераций = ПараметрыУдаления.ОтборТипыПредупрежденийОбменов.Количество() + ПараметрыУдаления.ОтборТипыПредупрежденийВерсий.Количество(); + + ПараметрыУдаления.Вставить("КоличествоОперацийМаксимум", КоличествоОпераций); + ПараметрыУдаления.Вставить("КоличествоОперацийТекущийШаг", 0); + + ПараметрыМетода = Новый Структура("ПараметрыУдаления", ПараметрыУдаления); + ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне("РегистрыСведений.РезультатыОбменаДанными.ОчиститьПредупрежденияСинхронизации", ПараметрыМетода, ПараметрыВыполнения); + + Элементы.ФормаУдалитьПредупреждения.Доступность = Ложь; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form index 15859947d..18f8b5742 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Form.form @@ -5779,6 +5779,10 @@ 556 Left + + BeforeRowChange + ОшибкиПриВыполненииКодаОбработчиковОтправкиПередНачаломИзменения + ОшибкиПриВыполненииКодаОбработчиковОтправкиСтрокаПоиска 558 @@ -5900,6 +5904,7 @@ true + true true true @@ -6241,6 +6246,10 @@ 569 Left + + BeforeRowChange + ОшибкиПриВыполненииКодаОбработчиковПолученияПередНачаломИзменения + ОшибкиПриВыполненииКодаОбработчиковПолученияСтрокаПоиска 571 @@ -6362,6 +6371,7 @@ true + true true true diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Help/ru.html b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Help/ru.html new file mode 100644 index 000000000..06ac27c67 --- /dev/null +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Help/ru.html @@ -0,0 +1,48 @@ + +

              Предназначен для просмотра статистики по результатам синхронизации данных.

              +

              Результаты синхронизации данных в виде ссылки можно увидеть в списке Синхронизации данных, например, на рабочем столе программы. В зависимости от результатов ссылка принимает значения Предупреждений нет (в случае успешной синхронизации данных) или  Предупреждения (при этом в скобках указывается количество предупреждений). Для открытия списка результатов синхронизации данных пройдите по ссылке. 

              +

              При выполнении синхронизации данных возможно возникновение проблемных ситуаций, требующих вмешательства пользователя. В колонках списка выводится необходимая информация о данных, по которым возникли проблемы и причина, по которой они не были приняты. Причина кратко указывается в специальной колонке, при этом по выделенной строке в нижней части списка выводится подробная формулировка, с указанием проблемных полей списков или документов.

              +

              Отборы

              +

              Для удобства просмотра предусмотрены отборы:

              +
              •  Выберите Период, за который выдавать данные; 
              • +
              • В поле Отправитель  Выберите из списка информационную базу, которая вас интересует; 
              • +
              • В поле Причина напишите причину ошибки (данный отбор невозможен для вкладки Конфликты). 

              Проблемные ситуации можно условно разделить на следующие категории, которые в списке находятся на отдельных вкладках. В заголовке каждой вкладки в скобках указывается количество проблемных ситуаций:

              +

              Проблемы при отправке

              +

              +
              • Сообщения об ошибках при отправке записываются в журнал регистрации, но эти сведения предназначены для разработчиков и не всегда понятны. На данной вкладке можно посмотреть ошибки отправки в более наглядном виде.
              • +
              • Для того чтобы попытаться исправить ошибки, выделите их, нажмите кнопку Изменить выделенные объекты.
              • +
              • Для скрытия ошибки из списка без устранения проблемы нажмите кнопку Игнорировать ошибку.
              • +
              • Для того чтобы изменить вид списка, нажмите Настроить список.
              • +
              • Для того, чтобы открыть подробное описание ошибки, нажмите Еще - Изменить;
              • +
              • Увидеть скрытые из списка ошибки можно с помощью команды Показывать проигнорированные меню Еще;
              • +
              • Для возвращения проигнорированного документа в список выполните команду Еще - Не игнорировать.

              Непроведенные документы

              +
              • В этом списке показываются документы, которые не удалось провести по каким-либо причинам. Для решения проблемы с проведением документа рекомендуется открыть документ и устранить недочеты, мешающие его проведению (это может быть, например, недостаточный остаток по товару). Внизу списка отражается причина невозможности автоматического проведения.
              • +
              • Для того чтобы попытаться исправить ошибки в выбранных документах, нажмите Изменить выделенные. 
              • +
              • После устранения ошибок можно Провести документ. 
              • +
              • Для того чтобы открыть документ, нажмите Еще - Изменить. 
              • +
              • Для скрытия документа из этого списка без устранения проблемы с проведением нажмите Игнорировать. 
              • +
              • Для того, чтобы увидеть скрытые из списка документы, нажмите Еще - Показывать проигнорированные. 
              • +
              • Для возвращения проигнорированного документа в список нажмите Еще - Не игнорировать.

              Незаполненные реквизиты

              +
              • Содержит список незаполненных реквизитов элементов справочников. Для исправления необходимо открыть элемент справочника (это можно сделать по двойному клику мыши на нем) и заполнить обязательные для заполнения поля. После чего необходимо записать элемент. 
              • +
              • Для того чтобы попытаться заполнить реквизиты в выбранных элементах, нажмите Изменить выделенные. 
              • +
              • Для того чтобы открыть элемент, нажмите Еще - Изменить. 
              • +
              • Для удаления элемента справочника из этого списка без устранения заполнения обязательных реквизитов нажмите Игнорировать. 
              • +
              • Для того, чтобы показать скрытые из списка элементы, нажмите Еще - Показывать проигнорированные. 
              • +
              • Для возвращения проигнорированного элемента в список нажмите Еще - Не игнорировать.

              Конфликты

              +
              • При настроенной синхронизации данных между двумя программами возникают ситуации, когда одни и те же данные изменяются одновременно (в промежуток между выполнением сеанса синхронизации данных) в обеих программах. Это приводит к возникновению двух различающихся версий одинаковых данных в этих программах. Такая ситуация называется конфликтом изменения данных.
                Конфликты изменения данных разрешаются (выбирается одна из версий) автоматически, однако можно изменить результат автоматического разрешения конфликта. Для этого выделите элемент списка. 
              • +
              • В строке внизу списка выводится метод решения конфликта, который был выбран программой. 
              • +
              • Для выявления отличий между двумя версиями нажмите Показать отличия. 
              • +
              • Для принятия решения, какую версию принять, можно просмотреть обе версии. Для этого нажмите Еще - Показать версию, созданную в этой информационной базеили Еще - Показать версию, полученную из другой информационной базы. 
              • +
              • Для просмотра элемента списка нажмите Еще - Изменить данные. 
              • +
              • После принятия решения о версии, которая должна быть сохранена, нажмите Подтвердить для сохранения результата автоматического разрешения конфликта или Пересмотреть для изменения результата рассмотрения конфликта на противоположный. После этого элемент становится неактивным, ему присваивается признак Рассмотрено и по умолчанию он скрывается из списка. 
              • +
              • По умолчанию рассмотренные конфликты скрываются из списка. Для того чтобы показывать их тоже, нажмите Еще - Показывать рассмотренные конфликты. 
              • +
              • Для того чтобы заново проверить рассмотренные конфликты и что-либо изменить, нажмите Еще - Снять признак "Рассмотрено".

              Непринятые по дате запрета

              +
              • В этом списке отображаются данные, которые были отклонены из-за установленного запрета на загрузку данных прошлых периодов. 
              • +
              • Для сравнения отклоненных данных с текущими данными в программе нажмите Показать отличия (при наличии данных в текущей программе). 
              • +
              • Для того чтобы открыть элемент, нажмите Еще - Изменить. 
              • +
              • Для просмотра другой версии нажмите Еще - Показать непринятую версию. 
              • +
              • Для получения данных, несмотря на установленный запрет загрузки данных, нажмите Принять версию. 
              • +
              • Для удаления строки из списка без принятия решения нажмите Игнорировать. 
              • +
              • Для того, чтобы показать скрытые из списка элементы, нажмите Еще - Показывать проигнорированные. 
              • +
              • Для возвращения проигнорированного элемента в список нажмите Еще - Не игнорировать.

              См. также:

              + \ No newline at end of file diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl index c705a20c8..0660cb8f4 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Forms/Форма/Module.bsl @@ -293,6 +293,30 @@ #КонецОбласти +#Область ОбработчикиСобытийЭлементовТаблицыФормыОшибкиПриВыполненииКодаОбработчиковОтправки + +&НаКлиенте +Процедура ОшибкиПриВыполненииКодаОбработчиковОтправкиПередНачаломИзменения(Элемент, Отказ) + + ИзменениеОбъекта(); + Отказ = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыОшибкиПриВыполненииКодаОбработчиковОтправки + +&НаКлиенте +Процедура ОшибкиПриВыполненииКодаОбработчиковПолученияПередНачаломИзменения(Элемент, Отказ) + + ИзменениеОбъекта(); + Отказ = Истина; + +КонецПроцедуры + +#КонецОбласти + #Область ОбработчикиКомандФормы &НаКлиенте @@ -1088,6 +1112,14 @@ ОткрытьОбъект(Элементы.НепринятыеПоДате); + ИначеЕсли СтраницыРезультатов.ТекущаяСтраница = Элементы.СтраницаОшибкиПриВыполненииКодаОбработчиковОтправки Тогда + + ОткрытьОбъект(Элементы.ОшибкиПриВыполненииКодаОбработчиковОтправки); + + ИначеЕсли СтраницыРезультатов.ТекущаяСтраница = Элементы.СтраницаОшибкиПриВыполненииКодаОбработчиковПолучения Тогда + + ОткрытьОбъект(Элементы.ОшибкиПриВыполненииКодаОбработчиковПолучения); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html index 9346236fd..5c901ac59 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html @@ -1,76 +1,76 @@ -

              Предназначен для просмотра статистики по результатам синхронизации данных.

              -

              Результаты синхронизации данных в виде ссылки можно увидеть в списке Синхронизации данных, например, на рабочем столе программы. В зависимости от результатов ссылка принимает значения Предупреждений нет (в случае успешной синхронизации данных) или  Предупреждения (при этом в скобках указывается количество предупреждений). Для открытия списка результатов синхронизации данных пройдите по ссылке.

              -

              При выполнении синхронизации данных возможно возникновение проблемных ситуаций, требующих вмешательства пользователя. В колонках списка выводится необходимая информация о данных, по которым возникли проблемы и причина, по которой они не были приняты. Причина кратко указывается в специальной колонке, при этом по выделенной строке в нижней части списка выводится подробная формулировка, с указанием проблемных полей списков или документов.

              +

              Предназначен для просмотра информации о предупреждениях и связанных с ними объектах программы.

              +

              При выполнении синхронизации данных возможно возникновение проблемных ситуаций, требующих вмешательства пользователя.

              +

              Программа предоставляет возможность:

              +

              +
              • расследовать проблемы в обмене данными;
              • +
              • исправлять ошибки в исходных данных, препятствующие выгрузке;
              • +
              • под свою ответственность включить обмен проблемными данными.

              +

              С помощью кнопок панели навигации в списке можно:

              +

              +
              • Обновить - список не является динамическим, поэтому для получения новых предупреждений нажмите кнопку;
              • +
              • Открыть объект - быстрый переход к объекту программы - предмету предупреждения для исправления ошибок;
              • +
              • Скрыть из списка - не показывать это предупреждение. Кнопка выключает видимость предупреждения в списке, при этом само предупреждение остается в программе и к нему можно будет вернуться позже. Надо понимать, что проблема этим не решается, а игнорируется, откладывается на "потом".

              +

              Групповая обработка

              +

              С помощью кнопки Групповая обработка можно открыть выпадающее меню и выбрать нужную команду для быстрого решения проблем из нескольких однотипных предупреждений:

              +

              +
              • Проведение документов - после исправления ошибок несколько документов можно провести одновременно;
              • +
              • Групповое изменение реквизитов - можно заполнить или исправить реквизиты в нескольких объектах программы;
              • +
              • Коллизии - в списке коллизий с помощью кнопок панели навигации можно проверить правильность автоматического решения конфликта и выбрать нужную версию данных;
              • +
              • Запрет загрузки по дате - в списке с помощью кнопок панели навигации можно просмотреть обе версии данных и выбрать нужную.

              Команды для работы с предупреждениями

              В контекстном меню списка по правой кнопке мыши и в меню Еще можно найти дополнительные команды для работы со списком: +

              +

              +
              • Показать скрытые в списке - включить видимость ранее скрытых предупреждений;
              • +
              • Показать в списке - с помощью этой команды скрытые предупреждения становятся активными, с ними можно работать;
              • +
              • Журнал регистрации в указанное время - показывает весь журнал регистрации без отборов относительно поля Дата возникновения предупреждения + - 1 секунда от события, можно просмотреть и те процессы, которые происходили параллельно синхронизации. Это позволит проанализировать причины возникновения предупреждения. 
              • +
              • С помощью ссылки в нижней части списка можно Перейти в журнал регистрации с отбором по текущей дате.

              Отборы

              -

              Для удобства просмотра предусмотрены отборы:

              -
              •  Выберите Период, за который выдавать данные; -
              • -
              • В поле Отправитель  Выберите из списка информационную базу, которая вас интересует; -
              • -
              • В поле Причина напишите причину ошибки (данный отбор невозможен для вкладки Конфликты).

              Проблемные ситуации можно условно разделить на следующие категории, которые в списке находятся на отдельных вкладках. В заголовке каждой вкладки в скобках указывается количество проблемных ситуаций:

              -

              Проблемы при отправке

              -

              -

              -
              • Сообщения об ошибках при отправке записываются в журнал регистрации, но эти сведения предназначены для разработчиков и не всегда понятны. На данной вкладке можно посмотреть ошибки отправки в более наглядном виде.
              • -
              • Для того чтобы попытаться исправить ошибки, выделите их, нажмите кнопку Изменить выделенные объекты.
              • -
              • Для скрытия ошибки из списка без устранения проблемы нажмите кнопку Игнорировать ошибку.
              • -
              • Для того чтобы изменить вид списка, нажмите Настроить список.
              • -
              • Для того, чтобы открыть подробное описание ошибки, нажмите Еще - Изменить;
              • -
              • Увидеть скрытые из списка ошибки можно с помощью команды Показывать проигнорированные меню Еще;
              • -
              • Для возвращения проигнорированного документа в список выполните команду Еще - Не игнорировать.

              Непроведенные документы

              -
              • В этом списке показываются документы, которые не удалось провести по каким-либо причинам. Для решения проблемы с проведением документа рекомендуется открыть документ и устранить недочеты, мешающие его проведению (это может быть, например, недостаточный остаток по товару). Внизу списка отражается причина невозможности автоматического проведения.
              • -
              • Для того чтобы попытаться исправить ошибки в выбранных документах, нажмите Изменить выделенные. -
              • -
              • После устранения ошибок можно Провести документ. -
              • -
              • Для того чтобы открыть документ, нажмите Еще - Изменить. -
              • -
              • Для скрытия документа из этого списка без устранения проблемы с проведением нажмите Игнорировать. -
              • -
              • Для того, чтобы увидеть скрытые из списка документы, нажмите Еще - Показывать проигнорированные. -
              • -
              • Для возвращения проигнорированного документа в список нажмите Еще - Не игнорировать.

              Незаполненные реквизиты

              -
              • Содержит список незаполненных реквизитов элементов справочников. Для исправления необходимо открыть элемент справочника (это можно сделать по двойному клику мыши на нем) и заполнить обязательные для заполнения поля. После чего необходимо записать элемент. -
              • -
              • Для того чтобы попытаться заполнить реквизиты в выбранных элементах, нажмите Изменить выделенные. -
              • -
              • Для того чтобы открыть элемент, нажмите Еще - Изменить. -
              • -
              • Для удаления элемента справочника из этого списка без устранения заполнения обязательных реквизитов нажмите Игнорировать. -
              • -
              • Для того, чтобы показать скрытые из списка элементы, нажмите Еще - Показывать проигнорированные. -
              • -
              • Для возвращения проигнорированного элемента в список нажмите Еще - Не игнорировать.

              Конфликты

              -
              • При настроенной синхронизации данных между двумя программами возникают ситуации, когда одни и те же данные изменяются одновременно (в промежуток между выполнением сеанса синхронизации данных) в обеих программах. Это приводит к возникновению двух различающихся версий одинаковых данных в этих программах. Такая ситуация называется конфликтом изменения данных.
                Конфликты изменения данных разрешаются (выбирается одна из версий) автоматически, однако можно изменить результат автоматического разрешения конфликта. Для этого выделите элемент списка. -
              • -
              • В строке внизу списка выводится метод решения конфликта, который был выбран программой. -
              • -
              • Для выявления отличий между двумя версиями нажмите Показать отличия. -
              • -
              • Для принятия решения, какую версию принять, можно просмотреть обе версии. Для этого нажмите Еще - Показать версию, созданную в этой информационной базе или Еще - Показать версию, полученную из другой информационной базы. -
              • -
              • Для просмотра элемента списка нажмите Еще - Изменить данные. -
              • -
              • После принятия решения о версии, которая должна быть сохранена, нажмите Подтвердить для сохранения результата автоматического разрешения конфликта или Пересмотреть для изменения результата рассмотрения конфликта на противоположный. После этого элемент становится неактивным, ему присваивается признак Рассмотрено и по умолчанию он скрывается из списка. -
              • -
              • По умолчанию рассмотренные конфликты скрываются из списка. Для того чтобы показывать их тоже, нажмите Еще - Показывать рассмотренные конфликты. -
              • -
              • Для того чтобы заново проверить рассмотренные конфликты и что-либо изменить, нажмите Еще - Снять признак "Рассмотрено".

              Непринятые по дате запрета

              -
              • В этом списке отображаются данные, которые были отклонены из-за установленного запрета на загрузку данных прошлых периодов. -
              • -
              • Для сравнения отклоненных данных с текущими данными в программе нажмите Показать отличия (при наличии данных в текущей программе). -
              • -
              • Для того чтобы открыть элемент, нажмите Еще - Изменить. -
              • -
              • Для просмотра другой версии нажмите Еще - Показать непринятую версию. -
              • -
              • Для получения данных, несмотря на установленный запрет загрузки данных, нажмите Принять версию. -
              • -
              • Для удаления строки из списка без принятия решения нажмите Игнорировать. -
              • -
              • Для того, чтобы показать скрытые из списка элементы, нажмите Еще - Показывать проигнорированные. -
              • -
              • Для возвращения проигнорированного элемента в список нажмите Еще - Не игнорировать.

              См. также:

              +

              Для удобства просмотра предупреждений предусмотрены отборы:

              +

              +
              • Период;
              • +
              • Синхронизация - с помощью флажка выберите синхронизацию, по которой нужно отработать предупреждения. При переходе из списка синхронизаций автоматически выбирается отбор по выбранной синхронизации;
              • +
              • Тип - выберите нужные типы с помощью флажков:

              Ошибки проверки перед отправкой (XDTO)

              +

              +

              +
              • Ошибки проверки сконвертированного объекта дополнительно дублируются в журнале регистрации и говорят о том, что при попытке отправить данные программа обнаружила пустые сведения, которые обязательно должны быть заполнены. 
              • +
              • Можно перейти в объект программы с помощью кнопки панели навигации списка или ссылки в предупреждении и заполнить недостающие реквизиты. Иногда объект может не отображаться по умолчанию. В этом случае следует обратиться к администратору программы.

              +

              Непроведенные документы

              +

              +
              • Для решения проблемы с проведением документа откройте карточку предупреждения, перейдите в документ по ссылке. 
              • +
              • Необходимо устранить недочеты, мешающие его проведению (это может быть, например, недостаточный остаток по товару), а после этого провести. При проведении предупреждение будет удалено из списка.

              Незаполненные реквизиты

              +

              +

              Необходимо открыть объект программы (с помощью кнопки панели навигации списка или по ссылке из карточки предупреждения), заполнить обязательные для заполнения поля, затем сохранить изменения. При записи исправлений предупреждение будет автоматически удалено.

              +

              Коллизии

              +

              +
              • При настроенной синхронизации данных между двумя программами возникают ситуации, когда одни и те же данные изменяются одновременно (в промежуток между выполнением сеанса синхронизации данных) в обеих программах. Это приводит к возникновению двух различающихся версий одинаковых данных в этих программах. Такая ситуация называется конфликтом изменения данных.
              • +
              • Такие конфликты разрешаются автоматически (программа выбирает одну из версий), однако можно изменить результат автоматического решения конфликта.
              • +
              • В карточке предупреждения подробно описывается суть проблемы, выводится ссылка на объект программы, по которому произошла коллизия. Можно перейти по ссылке и проконтролировать правильность заполнения реквизитов после автоматического разрешения конфликта.
              • +
              • С помощью кнопок в карточке предупреждения можно:
              • +
              • Сравнить две версии данных с помощью кнопки Показать отличия;
              • +
              • Для принятия решения, какую версию оставить, можно просмотреть обе версии. Для этого предусмотрены кнопки Показать версию в этой программе или Показать версию из другой программы.
              • +
              • После принятия решения о версии, которая должна быть сохранена, нажмите кнопку Скрыть из списка для сохранения результата автоматического разрешения конфликта или кнопку Пересмотреть результат для изменения конфликта на противоположный.

              +

              Непринятые по дате запрета

              +

              +
              • В этих предупреждениях выводятся сведения о данных, которые были отклонены из-за установленного запрета на загрузку данных прошлых периодов.
              • +
              • По ссылке или с помощью кнопки панели навигации можно открыть объект программы и посмотреть, правильно ли заполнены реквизиты в результате автоматического решения проблемы. 
              • +
              • Для сравнения отклоненных данных с текущими данными в программе нажмите кнопку Показать отличия (при наличии данных в текущей программе).
              • +
              • Просмотреть версии данных для сравнения можно с помощью кнопок Показать версию этой программы или Показать непринятую версию.
              • +
              • Для получения данных несмотря на установленный запрет загрузки данных можно нажать кнопку Принять отклоненную версию.

              Ошибки кода обработчиков при отправке (получении)

              +

              +

              +
              • Ошибки обработчиков выделяются в списке красным цветом. В карточке предупреждения обработчиков отправки/получения указывается, что были обнаружены ошибки в коде правил конвертации объектов.
              • +
              • Указываются пути решения проблемы:
              • +
                • обновиться на актуальную версию программы;
                • +
                • использовать актуальные правила конвертации.

              Удаление устаревших предупреждений

              +
              +
              • С помощью ссылки в нижней части списка можно удалить устаревшие предупреждения.
              • +
              • При удалении предупреждений можно указать дополнительные параметры для отбора предупреждений:
              +
              +
                • Период;
                • +
                • Синхронизация;
                • +
                • Тип.
              • С помощью флажка Только скрытые записи, которые удовлетворяют условиям выше можно дополнить отбор и удалить те предупреждения, которые были помечены как скрытые. Внимание! 
              • +
                • Команда Скрыть из списка только отключает видимость предупреждений, а команда Удаление устаревших предупреждений физически удаляет предупреждения без возможности их восстановить.
              • Поэтому рекомендуется использовать эту команду ответственно, потому что удаление большей части предупреждений происходит автоматически при решении проблемы, а удаление предупреждений, связанных с коллизиями и датой запрета загрузки, приведет к удалению версий объектов.
              +

              +

              См. также:

              \ No newline at end of file diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl index 34434fc67..b2e1a3944 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/ManagerModule.bsl @@ -173,6 +173,120 @@ КонецПроцедуры +Процедура ДобавитьЗаписьОРезультатахОбмена(ПараметрыЗаписи) Экспорт + + Перем ПроблемныйОбъект, УзелИнформационнойБазы, Причина, ТипПроблемы, МетаданныеОбъекта, ИдентификаторОбъектаМетаданных, Ссылка, ЗначенияОтборовНезависимогоРегистра; + + ПараметрыЗаписи.Свойство("ПроблемныйОбъект", ПроблемныйОбъект); + ПараметрыЗаписи.Свойство("УзелИнформационнойБазы", УзелИнформационнойБазы); + ПараметрыЗаписи.Свойство("Причина", Причина); + ПараметрыЗаписи.Свойство("ТипПроблемы", ТипПроблемы); + + Если ЗначениеЗаполнено(ПроблемныйОбъект) Тогда + + МетаданныеОбъекта = ПроблемныйОбъект.Метаданные(); + ИдентификаторОбъектаМетаданных = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеОбъекта); + Если МетаданныеОбъекта.РасширениеКонфигурации() <> Неопределено Тогда + + Возврат; + + КонецЕсли; + + КонецЕсли; + + Если ПроблемныйОбъект = Неопределено Тогда + + Ссылка = Неопределено; + + ИначеЕсли ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда + + Ссылка = ПроблемныйОбъект; + + ИначеЕсли ОбщегоНазначения.ЭтоРегистр(МетаданныеОбъекта) Тогда + + Если ОбщегоНазначения.ЭтоРегистрСведений(МетаданныеОбъекта) + И МетаданныеОбъекта.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда + + ЗначенияОтборовНезависимогоРегистра = Новый Структура(); + + Для Каждого ЭлементОтбора Из ПроблемныйОбъект.Отбор Цикл + ЗначенияОтборовНезависимогоРегистра.Вставить(ЭлементОтбора.Имя, ЭлементОтбора.Значение); + КонецЦикла; + + Иначе + + Ссылка = ПроблемныйОбъект.Отбор.Регистратор.Значение; + + КонецЕсли; + + Иначе + + Возврат; + + КонецЕсли; + + НаборЗаписейКонфликта = СоздатьНаборЗаписей(); + НаборЗаписейКонфликта.Отбор.ТипПроблемы.Установить(ТипПроблемы); + НаборЗаписейКонфликта.Отбор.УзелИнформационнойБазы.Установить(УзелИнформационнойБазы); + НаборЗаписейКонфликта.Отбор.ОбъектМетаданных.Установить(ИдентификаторОбъектаМетаданных); + НаборЗаписейКонфликта.Отбор.ПроблемныйОбъект.Установить(ПроблемныйОбъект); + + СериализованныеЗначенияОтборов = Неопределено; + Если ЗначенияОтборовНезависимогоРегистра <> Неопределено Тогда + + СериализованныеЗначенияОтборов = СериализоватьЗначенияОтбора(ЗначенияОтборовНезависимогоРегистра, МетаданныеОбъекта); + НаборЗаписейКонфликта.Отбор.КлючУникальности.Установить(РассчитатьХешНезависимогоРегистра(СериализованныеЗначенияОтборов)); + + КонецЕсли; + + ЗаписьКонфликта = НаборЗаписейКонфликта.Добавить(); + ЗаписьКонфликта.ТипПроблемы = ТипПроблемы; + ЗаписьКонфликта.УзелИнформационнойБазы = УзелИнформационнойБазы; + ЗаписьКонфликта.ОбъектМетаданных = ИдентификаторОбъектаМетаданных; + ЗаписьКонфликта.ПроблемныйОбъект = Ссылка; + ЗаписьКонфликта.ДатаВозникновения = ТекущаяДатаСеанса(); + ЗаписьКонфликта.Причина = СокрЛП(Причина); + ЗаписьКонфликта.ПредставлениеОбъекта = Строка(ПроблемныйОбъект); + ЗаписьКонфликта.Пропущена = Ложь; + + Если ЗначенияОтборовНезависимогоРегистра <> Неопределено Тогда + + ЗаписьКонфликта.КлючУникальности = РассчитатьХешНезависимогоРегистра(СериализованныеЗначенияОтборов); + ЗаписьКонфликта.ЗначенияОтборовНезависимогоРегистра = СериализованныеЗначенияОтборов; + + КонецЕсли; + + Если МетаданныеОбъекта <> Неопределено + И ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда + + Если ТипПроблемы = Перечисления.ТипыПроблемОбменаДанными.НепроведенныйДокумент Тогда + + Если Ссылка.Метаданные().ДлинаНомера > 0 Тогда + + ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПроблемныйОбъект, "ПометкаУдаления, Номер, Дата"); + ЗаписьКонфликта.НомерДокумента = ЗначенияРеквизитов.Номер; + + Иначе + + ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПроблемныйОбъект, "ПометкаУдаления, Дата"); + + КонецЕсли; + + ЗаписьКонфликта.ДатаДокумента = ЗначенияРеквизитов.Дата; + ЗаписьКонфликта.ПометкаУдаления = ЗначенияРеквизитов.ПометкаУдаления; + + Иначе + + ЗаписьКонфликта.ПометкаУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПроблемныйОбъект, "ПометкаУдаления"); + + КонецЕсли; + + КонецЕсли; + + НаборЗаписейКонфликта.Записать(); + +КонецПроцедуры + Процедура ОчиститьПроблемыПриОтправке(УзлыИнформационнойБазы = Неопределено) Экспорт ТипыПроблем = Новый Массив; @@ -236,6 +350,30 @@ КонецПроцедуры +Процедура ОчиститьПредупрежденияСинхронизации(ПараметрыДлительнойОперации, АдресХранилища = Неопределено) Экспорт + + ПараметрыУдаления = ПараметрыДлительнойОперации.ПараметрыУдаления; + + Если ПараметрыУдаления.ОтборТипыПредупрежденийОбменов.Количество() > 0 Тогда + + ОчиститьПредупрежденияОбменаОбходом(ПараметрыУдаления); + + КонецЕсли; + + Если ПараметрыУдаления.ОтборТипыПредупрежденийВерсий.Количество() > 0 + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + ИмяСобытия = НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()); + РегистрыСведений["ВерсииОбъектов"].ОчиститьПредупрежденияВерсий(ПараметрыУдаления, ИмяСобытия); + + КонецЕсли; + + Шаблон = НСтр("ru = 'Удалено %1 из %1'"); + ТекстПрогресса = СтрШаблон(Шаблон, ПараметрыУдаления.КоличествоОперацийМаксимум); + ДлительныеОперации.СообщитьПрогресс(100, ТекстПрогресса); + +КонецПроцедуры + Функция ПараметрыПоискаПроблем() Экспорт Параметры = Новый Структура; @@ -343,6 +481,121 @@ КонецФункции +// Возвращает количество нерассмотренных предупреждений синхронизации. +// +// Параметры: +// Узлы - Массив из ПланОбменаСсылка - узлы обмена. +// +// Возвращаемое значение: +// Структура: +// * ПредупрежденияОбмена - Число - число предупреждений, которые зафиксированы в регистре сведений РезультатыОбменаДанными; +// * ПредупрежденияВерсий - Число - число предупреждений, которые зафиксированы в регистре сведений ВерсииОбъектов. +// +Функция КоличествоПредупрежденийДетально(УзлыСинхронизации = Неопределено) Экспорт + + СтруктураЗаголовков = Новый Структура; + СтруктураЗаголовков.Вставить("КоличествоПредупрежденийОтправки", 0); + СтруктураЗаголовков.Вставить("ЗаголовокПредупрежденийОтправки", ""); + СтруктураЗаголовков.Вставить("КартинкаПредупрежденийОтправки", Неопределено); + СтруктураЗаголовков.Вставить("КоличествоПредупрежденийПолучения", 0); + СтруктураЗаголовков.Вставить("ЗаголовокПредупрежденийПолучении", ""); + СтруктураЗаголовков.Вставить("КартинкаПредупрежденийПолучении", Неопределено); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("УзлыСинхронизации", УзлыСинхронизации); + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 101 + | Количество(1) КАК КоличествоПредупрежденийОтправка + |ИЗ + | РегистрСведений.РезультатыОбменаДанными КАК РезультатыОбменаДанными + |ГДЕ + | НЕ РезультатыОбменаДанными.Пропущена + | И РезультатыОбменаДанными.УзелИнформационнойБазы В (&УзлыСинхронизации) + | И РезультатыОбменаДанными.ТипПроблемы В (ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных), + | ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта)); + | + |////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 101 + | Количество(1) КАК КоличествоПредупрежденийПолучение + |ИЗ + | РегистрСведений.РезультатыОбменаДанными КАК РезультатыОбменаДанными + |ГДЕ + | НЕ РезультатыОбменаДанными.Пропущена + | И РезультатыОбменаДанными.УзелИнформационнойБазы В(&УзлыСинхронизации) + | И РезультатыОбменаДанными.ТипПроблемы В (ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.НезаполненныеРеквизиты), + | ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.НепроведенныйДокумент), + | ЗНАЧЕНИЕ(Перечисление.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных))"; + + РезультатЗапроса = Запрос.ВыполнитьПакет(); + Если НЕ РезультатЗапроса[0].Пустой() Тогда + + ВыборкаПроблемыПолучения = РезультатЗапроса[0].Выбрать(); + Если ВыборкаПроблемыПолучения.Следующий() Тогда + + СтруктураЗаголовков.КоличествоПредупрежденийОтправки = ВыборкаПроблемыПолучения.КоличествоПредупрежденийОтправка; + + КонецЕсли; + + КонецЕсли; + + Если НЕ РезультатЗапроса[1].Пустой() Тогда + + ВыборкаПроблемыПолучения = РезультатЗапроса[1].Выбрать(); + Если ВыборкаПроблемыПолучения.Следующий() Тогда + + СтруктураЗаголовков.КоличествоПредупрежденийПолучения = ВыборкаПроблемыПолучения.КоличествоПредупрежденийПолучение; + + КонецЕсли; + + КонецЕсли; + + Если СтруктураЗаголовков.КоличествоПредупрежденийПолучения < 101 Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); + СтруктураЗаголовков.КоличествоПредупрежденийПолучения = + СтруктураЗаголовков.КоличествоПредупрежденийПолучения + МодульВерсионированиеОбъектов.АктуализироватьИнформациюОПроблемахВерсийСинхронизацииДанных(УзлыСинхронизации); + + КонецЕсли; + + КонецЕсли; + + СтруктураЗаголовков.ЗаголовокПредупрежденийОтправки = ЗаголовокПредупрежденийПоКоличеству(СтруктураЗаголовков.КоличествоПредупрежденийОтправки); + СтруктураЗаголовков.КартинкаПредупрежденийОтправки = КартинкаПредупрежденийПоКоличеству(СтруктураЗаголовков.КоличествоПредупрежденийОтправки); + СтруктураЗаголовков.ЗаголовокПредупрежденийПолучении = ЗаголовокПредупрежденийПоКоличеству(СтруктураЗаголовков.КоличествоПредупрежденийПолучения); + СтруктураЗаголовков.КартинкаПредупрежденийПолучении = КартинкаПредупрежденийПоКоличеству(СтруктураЗаголовков.КоличествоПредупрежденийПолучения); + + Возврат СтруктураЗаголовков; + +КонецФункции + +// Возвращает структуру, которая включает описание наличия предупреждений синхронизации. +// +// Параметры: +// Узлы - Массив из ПланОбменаСсылка - узлы обмена. +// +// Возвращаемое значение: +// Структура: +// * Заголовок - Строка - заголовок гиперссылки. +// * Картинка - Картинка - картинка для гиперссылки. +// * Количество - Число - число предупреждений, . +// +Функция КоличествоПредупрежденийДляЭлементаФормы(Узлы = Неопределено) Экспорт + + СтруктураДанных = КоличествоПредупрежденийДетально(Узлы); + Количество = СтруктураДанных.КоличествоПредупрежденийОтправки + СтруктураДанных.КоличествоПредупрежденийПолучения; + + СтруктураЗаголовка = Новый Структура; + СтруктураЗаголовка.Вставить("Заголовок", ЗаголовокПредупрежденийПоКоличеству(Количество)); + СтруктураЗаголовка.Вставить("Картинка", КартинкаПредупрежденийПоКоличеству(Количество)); + СтруктураЗаголовка.Вставить("Количество", Количество); + + Возврат СтруктураЗаголовка; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -384,7 +637,50 @@ КонецФункции -Процедура Игнорировать(Ссылка, ТипПроблемы, Игнорировать, УзелИнформационнойБазы = Неопределено) Экспорт +Функция ЗаголовокПредупрежденийПоКоличеству(КоличествоПредупреждений) + + ЗаголовокПредупреждения = ""; + Если КоличествоПредупреждений > 100 Тогда + + ЗаголовокПредупреждения = НСтр("ru ='предупреждений более 100'", ОбщегоНазначения.КодОсновногоЯзыка()); + + ИначеЕсли КоличествоПредупреждений = 0 Тогда + + ЗаголовокПредупреждения = ""; + + Иначе + + ШаблонЗаголовка = НСтр("ru ='предупреждений %1'", ОбщегоНазначения.КодОсновногоЯзыка()); + ЗаголовокПредупреждения = СтрШаблон(ШаблонЗаголовка, КоличествоПредупреждений); + + КонецЕсли; + + Возврат ЗаголовокПредупреждения; + +КонецФункции + +Функция КартинкаПредупрежденийПоКоличеству(КоличествоПредупреждений) + + Возврат ?(КоличествоПредупреждений = 0, Новый Картинка, БиблиотекаКартинок.Предупреждение); + +КонецФункции + +Функция НаборЗаписейРегистраПоПараметрамОтбора(ПараметрыОтбора, МетаданныеОбъекта) + + НаборЗаписей = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(МетаданныеОбъекта.ПолноеИмя()).СоздатьНаборЗаписей(); + + Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл + ЗначениеОтбора = Неопределено; + Если ПараметрыОтбора.Свойство(ЭлементОтбора.Имя, ЗначениеОтбора) Тогда + ЭлементОтбора.Установить(ЗначениеОтбора); + КонецЕсли; + КонецЦикла; + + Возврат НаборЗаписей; + +КонецФункции + +Процедура Игнорировать(Ссылка, ТипПроблемы, Игнорировать, УзелИнформационнойБазы = Неопределено, КлючУникальности = "") Экспорт НаборЗаписейКонфликта = СоздатьНаборЗаписей(); @@ -406,26 +702,34 @@ КонецЕсли; + Если НЕ ПустаяСтрока(КлючУникальности) Тогда + + НаборЗаписейКонфликта.Отбор.КлючУникальности.Установить(КлючУникальности); + + КонецЕсли; + НаборЗаписейКонфликта.Прочитать(); - НаборЗаписейКонфликта[0].Пропущена = Игнорировать; - НаборЗаписейКонфликта.Записать(); + Если НаборЗаписейКонфликта.Количество() > 0 Тогда + + НаборЗаписейКонфликта[0].Пропущена = Игнорировать; + НаборЗаписейКонфликта.Записать(); + + КонецЕсли; КонецПроцедуры -Функция НаборЗаписейРегистраПоПараметрамОтбора(ПараметрыОтбора, МетаданныеОбъекта) +Процедура ПрогрессУдалениеПредупрежденийСинхронизации(Знач ТекущийШаг, Максимум) - НаборЗаписей = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(МетаданныеОбъекта.ПолноеИмя()).СоздатьНаборЗаписей(); + ТекущийШаг = ?(ТекущийШаг = 0, 1, ТекущийШаг); - Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл - ЗначениеОтбора = Неопределено; - Если ПараметрыОтбора.Свойство(ЭлементОтбора.Имя, ЗначениеОтбора) Тогда - ЭлементОтбора.Установить(ЗначениеОтбора); - КонецЕсли; - КонецЦикла; + Шаблон = НСтр("ru = 'Выполнено итераций %1 из %2'", ОбщегоНазначения.КодОсновногоЯзыка()); + ТекстПрогресса = СтрШаблон(Шаблон, ТекущийШаг, Максимум); - Возврат НаборЗаписей; + ПроцентВыполнения = ОКР(ТекущийШаг * 100 / Максимум, 0); -КонецФункции + ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, ТекстПрогресса); + +КонецПроцедуры Процедура ОчиститьЗаписиРегистра(ПараметрыОтбора) @@ -434,6 +738,121 @@ КонецПроцедуры +Процедура ОчиститьПредупрежденияОбменаОбходом(ПараметрыУдаления) + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ОтборТипыПредупрежденийОбменов", ПараметрыУдаления.ОтборТипыПредупрежденийОбменов); + + ТекстЗапроса = + "ВЫБРАТЬ + | РезультатыОбменаДанными.ТипПроблемы КАК ТипПроблемы, + | РезультатыОбменаДанными.УзелИнформационнойБазы КАК УзелИнформационнойБазы, + | РезультатыОбменаДанными.ОбъектМетаданных КАК ОбъектМетаданных, + | РезультатыОбменаДанными.ПроблемныйОбъект КАК ПроблемныйОбъект, + | РезультатыОбменаДанными.КлючУникальности КАК КлючУникальности, + | РезультатыОбменаДанными.ДатаВозникновения КАК ДатаВозникновения, + | РезультатыОбменаДанными.Пропущена КАК Пропущена + |ИЗ + | РегистрСведений.РезультатыОбменаДанными КАК РезультатыОбменаДанными + |ГДЕ + | РезультатыОбменаДанными.ТипПроблемы В(&ОтборТипыПредупрежденийОбменов) + | + |УПОРЯДОЧИТЬ ПО + | РезультатыОбменаДанными.ДатаВозникновения, + | РезультатыОбменаДанными.УзелИнформационнойБазы, + | РезультатыОбменаДанными.ТипПроблемы"; + + СхемаЗапроса = Новый СхемаЗапроса; + СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса); + + ОператорСхемыЗапроса = СхемаЗапроса.ПакетЗапросов[0].Операторы[0]; + + Если ПараметрыУдаления.ОтборУзловПланаОбмена.Количество() > 0 Тогда + + ОператорСхемыЗапроса.Отбор.Добавить("УзелИнформационнойБазы В(&ОтборУзловПланаОбмена)"); + Запрос.УстановитьПараметр("ОтборУзловПланаОбмена", ПараметрыУдаления.ОтборУзловПланаОбмена); + + КонецЕсли; + + Если ЗначениеЗаполнено(ПараметрыУдаления.ОтборПоДатеВозникновения) Тогда + + ОтборПоДатеВозникновения = ПараметрыУдаления.ОтборПоДатеВозникновения; // СтандартныйПериод + + ОператорСхемыЗапроса.Отбор.Добавить("ДатаВозникновения МЕЖДУ &ДатаНачала И &ДатаОкончания"); + Запрос.УстановитьПараметр("ДатаНачала", ОтборПоДатеВозникновения.ДатаНачала); + Запрос.УстановитьПараметр("ДатаОкончания", ОтборПоДатеВозникновения.ДатаОкончания); + + КонецЕсли; + + Если ПараметрыУдаления.ТолькоСкрытыеЗаписи Тогда + + ОператорСхемыЗапроса.Отбор.Добавить("Пропущена = ИСТИНА"); + + КонецЕсли; + + Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса(); + ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); + + Пропорция = ПараметрыУдаления.ОтборТипыПредупрежденийОбменов.Количество() / Макс(ВыборкаЗапроса.Количество(), 1); + ИтераторВыборки = 0; + + Пока ВыборкаЗапроса.Следующий() Цикл + + // 1. Начать транзакцию для пакета из двух операций чтения и записи регистра + НачатьТранзакцию(); + Попытка + + // 2. Установить исключительную блокировку на интересующую запись регистра, + // для того чтобы гарантировать, что в момент записи предупреждение не изменилось в каком-либо другом сеансе. + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.РезультатыОбменаДанными"); + ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировкиДанных.УстановитьЗначение("ТипПроблемы", ВыборкаЗапроса.ТипПроблемы); + ЭлементБлокировкиДанных.УстановитьЗначение("УзелИнформационнойБазы", ВыборкаЗапроса.УзелИнформационнойБазы); + ЭлементБлокировкиДанных.УстановитьЗначение("ОбъектМетаданных", ВыборкаЗапроса.ОбъектМетаданных); + ЭлементБлокировкиДанных.УстановитьЗначение("ПроблемныйОбъект", ВыборкаЗапроса.ПроблемныйОбъект); + ЭлементБлокировкиДанных.УстановитьЗначение("КлючУникальности", ВыборкаЗапроса.КлючУникальности); + БлокировкаДанных.Заблокировать(); + + // 3. Удаление записей + МенеджерЗаписи = РегистрыСведений.РезультатыОбменаДанными.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.ТипПроблемы = ВыборкаЗапроса.ТипПроблемы; + МенеджерЗаписи.УзелИнформационнойБазы = ВыборкаЗапроса.УзелИнформационнойБазы; + МенеджерЗаписи.ОбъектМетаданных = ВыборкаЗапроса.ОбъектМетаданных; + МенеджерЗаписи.ПроблемныйОбъект = ВыборкаЗапроса.ПроблемныйОбъект; + МенеджерЗаписи.КлючУникальности = ВыборкаЗапроса.КлючУникальности; + МенеджерЗаписи.Удалить(); + + ИтераторВыборки = ИтераторВыборки + 1; + Если ОКР(ИтераторВыборки * Пропорция, 0) <> ОКР((ИтераторВыборки - 1) * Пропорция, 0) Тогда + + // Увеличиваем шаг только с учетом пропорции, т.е. когда количество итераций умноженное на пропорцию изменяет значение + ПараметрыУдаления.КоличествоОперацийТекущийШаг = ПараметрыУдаления.КоличествоОперацийТекущийШаг + 1; + + КонецЕсли; + + ПрогрессУдалениеПредупрежденийСинхронизации(ПараметрыУдаления.КоличествоОперацийТекущийШаг, ПараметрыУдаления.КоличествоОперацийМаксимум); + + ЗафиксироватьТранзакцию(); + + Исключение + + // 4. Если при установке блокировки возникла исключительная ситуация из-за того, что регистр уже заблокирован в + // другом сеансе (или по другим причинам), отменить транзакцию и записать сведения об ошибке в журнал регистрации. + ОтменитьТранзакцию(); + + ИмяСобытия = НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение; + + КонецПопытки; + + КонецЦикла; + + ПараметрыУдаления.КоличествоОперацийТекущийШаг = ПараметрыУдаления.ОтборТипыПредупрежденийОбменов.Количество(); + +КонецПроцедуры + #Область ОбработчикиОбновления Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/РезультатыОбменаДанными.mdo b/SSL/src/InformationRegisters/РезультатыОбменаДанными/РезультатыОбменаДанными.mdo index f0618b4da..e9261c218 100644 --- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/РезультатыОбменаДанными.mdo +++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/РезультатыОбменаДанными.mdo @@ -212,6 +212,25 @@ Use + + Комментарий + + ru + Комментарий администратора к предупреждению синхронизации + + + String + + 1000 + + + true + + + Use + Use + + ТипПроблемы @@ -227,6 +246,7 @@ + Index Use Use @@ -266,6 +286,7 @@ + Index Use Use true @@ -324,6 +345,128 @@ ru Форма + + + ru + + + PersonalComputer + MobileDevice + + + ОбработкаПредупрежденийПоДатеЗапретаЗагрузки + + ru + Обработка предупреждений по дате запрета загрузки + + PersonalComputer + MobileDevice + + + ОбработкаПредупрежденийКоллизии + + ru + Обработка предупреждений коллизии + + PersonalComputer + MobileDevice + + + ОбработкаПредупрежденийПроведения + + ru + Обработка предупреждений проведения + + PersonalComputer + MobileDevice + + + ОтборПредупрежденийПоТипам + + ru + Отбор предупреждений по типам + + PersonalComputer + MobileDevice + + + ОтборСинхронизаций + + ru + Отбор Синхронизаций + + PersonalComputer + MobileDevice + + + ПредупреждениеНезаполненногоРеквизита + + ru + Предупреждение незаполненного реквизита + + PersonalComputer + MobileDevice + + + ПредупреждениеНепроведенногоДокумента + + ru + Предупреждение непроведенного документа + + PersonalComputer + MobileDevice + + + ПредупрежденияОбработчиковОтправкиПолучения + + ru + Предупреждения обработчиков отправки/получения + + PersonalComputer + MobileDevice + + + ПредупреждениеОКоллизии + + ru + Предупреждение о коллизии + + PersonalComputer + MobileDevice + + + ПредупреждениеПоДатеЗапретаЗагрузки + + ru + Предупреждение по дате запрета загрузки + + PersonalComputer + MobileDevice + + + ПредупреждениеКонвертацииОбъектаПриОтправке + + ru + Предупреждение конвертации объекта при отправке + + PersonalComputer + MobileDevice + + + ПредупрежденияСинхронизаций + + ru + Предупреждения синхронизаций + + PersonalComputer + MobileDevice + + + УдалениеУстаревшихПредупреждений + + ru + Удаление устаревших предупреждений + PersonalComputer MobileDevice diff --git a/SSL/src/InformationRegisters/СертификатыПользователяDSS/СертификатыПользователяDSS.mdo b/SSL/src/InformationRegisters/СертификатыПользователяDSS/СертификатыПользователяDSS.mdo new file mode 100644 index 000000000..cf2391930 --- /dev/null +++ b/SSL/src/InformationRegisters/СертификатыПользователяDSS/СертификатыПользователяDSS.mdo @@ -0,0 +1,279 @@ + + + + + + + + + + + + СертификатыПользователяDSS + + ru + Сертификаты пользователя DSS + + InDialog + + Use + Active + + Use + + + + + Use + LineNumber + + Use + + + + + Use + Recorder + + Use + + + + + Use + Period + + ShowError + Use + + + + Managed + + Идентификатор + + ru + Идентификатор + + + Number + + 10 + + + + + Use + Use + + + + СерийныйНомер + + ru + Серийный номер + + + String + + 100 + + + + + Use + Use + + Index + + + ДатаНачала + + ru + Дата начала + + + Date + + + + + Use + Use + + + + ДатаОкончания + + ru + Дата окончания + + + Date + + + + + Use + Use + + + + Наименование + + ru + Наименование + + + String + + 256 + + + + + Use + Use + + + + АлгоритмКлюча + + ru + Алгоритм ключа + + + String + + 100 + + + + + Use + Use + + + + АлгоритмПодписи + + ru + Алгоритм подписи + + + String + + 100 + + + + + Use + Use + + + + АлгоритмХеширования + + ru + Алгоритм хеширования + + + String + + 100 + + + + + Use + Use + + + + ДанныеСертификата + + ru + Данные сертификата + + + ValueStorage + + + + Use + Use + + + + ИдентификаторСертификата + + ru + Идентификатор сертификата + + + String + + 40 + + + + + Use + Use + + + + ДатаДобавления + + ru + Дата добавления + + + Date + + + + + Use + Use + + + + УчетнаяЗаписьDSS + + ru + Учетная запись DSS + + + CatalogRef.УчетныеЗаписиDSS + + + + ShowError + Use + Use + + true + + + Отпечаток + + ru + Отпечаток + + + String + + 40 + + + + + ShowError + Use + Use + + true + + diff --git a/SSL/src/InformationRegisters/СоставыГруппПользователей/ManagerModule.bsl b/SSL/src/InformationRegisters/СоставыГруппПользователей/ManagerModule.bsl index 77fdf5a09..fb7763f8f 100644 --- a/SSL/src/InformationRegisters/СоставыГруппПользователей/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СоставыГруппПользователей/ManagerModule.bsl @@ -8,32 +8,6 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -#Область ПрограммныйИнтерфейс - -#Область ДляВызоваИзДругихПодсистем - -// СтандартныеПодсистемы.УправлениеДоступом - -// Параметры: -// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. -// -Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт - - Ограничение.Текст = - "РазрешитьЧтениеИзменение - |ГДЕ - | ЭтоАвторизованныйПользователь(Пользователь)"; - - Ограничение.ТекстДляВнешнихПользователей = Ограничение.Текст; - -КонецПроцедуры - -// Конец СтандартныеПодсистемы.УправлениеДоступом - -#КонецОбласти - -#КонецОбласти - #Область СлужебныеПроцедурыИФункции // Процедура обновляет все данные регистра. diff --git a/SSL/src/InformationRegisters/СостоянияКонтактовВзаимодействий/ManagerModule.bsl b/SSL/src/InformationRegisters/СостоянияКонтактовВзаимодействий/ManagerModule.bsl index a1080d934..fdabdc07a 100644 --- a/SSL/src/InformationRegisters/СостоянияКонтактовВзаимодействий/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СостоянияКонтактовВзаимодействий/ManagerModule.bsl @@ -35,7 +35,7 @@ // Параметры: // Контакт - СправочникСсылка - контакт, для которого выполняется запись. // КоличествоНеРассмотрено - Число - количество не рассмотренных взаимодействий для контакта. -// ДатаПоследнегоВзаимодействия - ДатаВремя - дата последнего взаимодействия по контакту. +// ДатаПоследнегоВзаимодействия - Дата - дата последнего взаимодействия по контакту. // Процедура ВыполнитьЗаписьВРегистр(Контакт, КоличествоНеРассмотрено = Неопределено, ДатаПоследнегоВзаимодействия = Неопределено) Экспорт diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form index dac7fae9f..650e57ca0 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Form.form @@ -495,6 +495,39 @@ Auto + + + <key>ru</key> + <value>Поиск</value> + + true + true + + true + + Поиск + 163 + + ПоискРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + + ПоискКонтекстноеМеню + 164 + true + + КомплектПечатныхФорм + + true + false + + ГруппаПечатныеФормы 129 @@ -531,7 +564,6 @@ Right UserCmds Auto - InCommandBarAndInAdditionalSubmenu ПоказатьВсе @@ -561,7 +593,6 @@ true Right UserCmds - InCommandBarAndInAdditionalSubmenu true true @@ -923,6 +954,88 @@ 5 + + КомплектПечатныхФормДатаПоследнегоИзменения + 157 + true + true + + true + + + КомплектПечатныхФорм.ДатаПоследнегоИзменения + + + КомплектПечатныхФормДатаПоследнегоИзмененияРасширеннаяПодсказка + 159 + Label + true + true + + Left + + + + КомплектПечатныхФормДатаПоследнегоИзмененияКонтекстноеМеню + 158 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + КомплектПечатныхФормАвторИзменения + 160 + true + true + + true + + + КомплектПечатныхФорм.АвторИзменения + + + КомплектПечатныхФормАвторИзмененияРасширеннаяПодсказка + 162 + Label + true + true + + Left + + + + КомплектПечатныхФормАвторИзмененияКонтекстноеМеню + 161 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + КомплектПечатныхФормКоманднаяПанель 50 @@ -1206,7 +1319,7 @@ OnCreateAtServer ПриСозданииНаСервере - 50 + 55 LockOwner true true @@ -1350,6 +1463,49 @@ true + + Сотрудник + 10 + + + true + + + true + + + + ДатаПоследнегоИзменения + + <key>ru</key> + <value>Дата последнего изменения</value> + + 13 + + + true + + + true + + + + АвторИзменения + + <key>ru</key> + <value>Автор изменения</value> + + 14 + + CatalogRef.Пользователи + + + true + + + true + + СоответствиеКомандСостояниямОригинала @@ -1507,9 +1663,6 @@ Auto - - КомплектПечатныхФорм - Auto @@ -1532,9 +1685,6 @@ Auto - - КомплектПечатныхФорм - Auto diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Help/ru.html b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Help/ru.html index fc75ca471..5394fba99 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Help/ru.html +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Help/ru.html @@ -1,13 +1,21 @@ Предназначена для контроля и изменения состояний печатных форм.
              -
              Открывается по команде Уточнить по печатным формам выпадающего меню выбора состояний в списках документов. Выпадающее меню открывается по ссылке в колонке Состояние оригинала в списках документов. 

              +
              Открывается по команде Уточнить по печатным формам выпадающего меню выбора состояний в списках документов. Выпадающее меню открывается по ссылке в колонке Состояние оригинала в списках документов. 
              +
              В некоторых случаях требуется отслеживать состояния только по определенным печатным формам документа. Например, у документа Отпуск есть 4 печатных формы, но только в одной требуется подпись сотрудника и, соответственно, только по ней требуется отслеживать состояние оригинала. Наименования нужных форм указываются разработчиком.

              При работе в списках документов и распечатке печатных форм для отправки клиентам (поставщикам) предусмотрена возможность автоматического изменения состояния оригинала первичного документа. При получении оригиналов документов с подписью и печатями требуется изменить состояние оригинала. Существует несколько способов его изменения. У документа может быть несколько печатных форм, в этом случае общее состояние документа будет зависеть от состояний каждой печатной формы. В списке печатных форм можно посмотреть, все ли они были напечатаны, проконтролировать или изменить состояние каждой печатной формы.
              +
              В окне предусмотрены колонки:
              +
              +
              • Первичный документ;
              • +
              • Состояние оригинала;
              • +
              • Дата последнего изменения;
              • +
              • Автор изменения.

              Состояние оригинала

              В колонке Состояние оригинала выводится состояние печатной формы.
              С помощью кнопки Состояние оригинала можно открыть выпадающее меню, в котором можно:

              Установка состояния Оригинал получен

              +
            • С помощью команды Настроить перейти к списку состояний оригиналов первичных документов, в котором можно при необходимости ввести новое состояние.
            • +
            • Если изменилось состояние первичного документа, в колонке Дата последнего изменения устанавливается значение <только что>, в колонке Автор изменения - текущий пользователь.

            Установка состояния Оригинал получен

            • С помощью кнопки  можно быстро установить для выделенных печатных форм состояние Оригинал получен.
            • Для отдельной печатной формы можно также установить состояние Оригинал получен, нажав мышью по значку в колонке .
            • diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl index d50a5213f..935689916 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Forms/ИзменениеСостоянийОригиналовПервичныхДокументов/Module.bsl @@ -140,6 +140,9 @@ Элементы.КомплектПечатныхФорм.ТекущиеДанные.ОригиналПолученКартинка = 0; КонецЕсли; + Элементы.КомплектПечатныхФорм.ТекущиеДанные.АвторИзменения = ПользователиКлиент.ТекущийПользователь(); + Элементы.КомплектПечатныхФорм.ТекущиеДанные.ДатаПоследнегоИзменения = НСтр("ru = '<только что>'"); + КонецПроцедуры &НаКлиенте @@ -180,6 +183,8 @@ // Параметры: // Команда - КомандаФормы // +//@skip-warning +// &НаКлиенте Процедура Подключаемый_УстановитьСостояниеОригинала(Команда) @@ -308,34 +313,78 @@ СписокОбъектов = Новый Массив; СписокОбъектов.Добавить(ОбъектМетаданных); - КоллекцияПечатныхФорм = УправлениеПечатью.КомандыПечатиФормы("ФормаДокумента", СписокОбъектов); + КоллекцияПечатныхФорм = УправлениеПечатью.КомандыПечатиОбъекта(ОбъектМетаданных); + СписокПечатныхФорм = Новый СписокЗначений; + Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл + СписокПечатныхФорм.Добавить(ПечатнаяФорма.Идентификатор, ПечатнаяФорма.Представление); + КонецЦикла; + ОбъектыПечати = Новый СписокЗначений; + ОбъектыПечати.Добавить(Запись.Владелец); + УчетОригиналовПервичныхДокументов.ПриОпределенииСпискаПечатныхФорм(ОбъектыПечати, СписокПечатныхФорм); ОбъектМетаданных = ОбщегоНазначения.ИмяТаблицыПоСсылке(Запись.Владелец); - ЗапросТаблицаКоманд = ДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам(Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма,ОбъектМетаданных, Истина); - ТаблицаКоманд = ЗапросТаблицаКоманд.Выполнить().Выгрузить(); - - Для Каждого ТекСтрока Из КоллекцияПечатныхФорм Цикл + + Если ПравоДоступа("Чтение",Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда + ЗапросТаблицаКоманд = ДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам(Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма,ОбъектМетаданных, Истина); + ТаблицаКоманд = ЗапросТаблицаКоманд.Выполнить().Выгрузить(); + Иначе + ТаблицаКоманд = Новый ТаблицаЗначений; + КонецЕсли; + + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Владелец); + Если ТЧ <> "" Тогда + Для Каждого Сотрудник Из Запись.Владелец[ТЧ] Цикл + ФИО = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(Сотрудник.Сотрудник.Наименование); + Для Каждого ТекСтрока Из СписокПечатныхФорм Цикл + Значения = Новый Структура("Представление, ФИО", ТекСтрока.Представление,ФИО); + НоваяСтрока = КомплектПечатныхФорм.Добавить(); + НоваяСтрока.ИмяМакета = ТекСтрока.Значение; + НоваяСтрока.Представление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(НСтр("ru='[Представление] [ФИО]'"), Значения); + НоваяСтрока.Картинка = 1; + НоваяСтрока.ОригиналПолученКартинка = 0; + НоваяСтрока.Сотрудник = Сотрудник.Сотрудник; + КонецЦикла; + КонецЦикла; + Если ТаблицаКоманд.Количество() > 0 Тогда + Для Каждого Сотрудник Из Запись.Владелец[ТЧ] Цикл + ФИО = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(Сотрудник.Сотрудник.Наименование); + Для Каждого ТекСтрока Из ТаблицаКоманд Цикл + Значения = Новый Структура("Представление, ФИО", ТекСтрока.Представление,ФИО); + Если КомплектПечатныхФорм.НайтиСтроки(Новый Структура("ИмяМакета", ТекСтрока.Идентификатор)) = 0 Тогда + НоваяСтрока = КомплектПечатныхФорм.Добавить(); + НоваяСтрока.ИмяМакета = ТекСтрока.Значение; + НоваяСтрока.Представление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(НСтр("ru='[Представление] [ФИО]'"), Значения); + НоваяСтрока.Картинка = 1; + НоваяСтрока.ОригиналПолученКартинка = 0; + НоваяСтрока.Сотрудник = Сотрудник.Сотрудник; + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЕсли; + Иначе + Для Каждого ТекСтрока Из СписокПечатныхФорм Цикл НоваяСтрока = КомплектПечатныхФорм.Добавить(); - Идентификатор = ТекСтрока.Идентификатор; + Идентификатор = ТекСтрока.Значение; НоваяСтрока.ИмяМакета = Идентификатор; НоваяСтрока.Представление = ТекСтрока.Представление; НоваяСтрока.Картинка = 1; НоваяСтрока.ОригиналПолученКартинка = 0; - КонецЦикла; - - Если ТаблицаКоманд.Количество() > 0 Тогда - Для Каждого ТекСтрока Из ТаблицаКоманд Цикл - - Если КомплектПечатныхФорм.НайтиСтроки(Новый Структура("ИмяМакета", ТекСтрока.Идентификатор)) = 0 Тогда - НоваяСтрока = КомплектПечатныхФорм.Добавить(); - Идентификатор = ТекСтрока.Идентификатор; - НоваяСтрока.ИмяМакета = Идентификатор; - НоваяСтрока.Представление = ТекСтрока.Представление; - НоваяСтрока.Картинка = 1; - НоваяСтрока.ОригиналПолученКартинка = 0; - КонецЕсли; - КонецЦикла; + + Если ТаблицаКоманд.Количество() > 0 Тогда + Для Каждого ТекСтрока Из ТаблицаКоманд Цикл + + Если КомплектПечатныхФорм.НайтиСтроки(Новый Структура("ИмяМакета", ТекСтрока.Идентификатор)) = 0 Тогда + НоваяСтрока = КомплектПечатныхФорм.Добавить(); + Идентификатор = ТекСтрока.Значение; + НоваяСтрока.ИмяМакета = Идентификатор; + НоваяСтрока.Представление = ТекСтрока.Представление; + НоваяСтрока.Картинка = 1; + НоваяСтрока.ОригиналПолученКартинка = 0; + КонецЕсли; + + КонецЦикла; + КонецЕсли; КонецЕсли; НенужныеСтроки = КомплектПечатныхФорм.НайтиСтроки(Новый Структура("Представление","Комплект документов на принтер")); @@ -363,7 +412,10 @@ | СостоянияОригиналовПервичныхДокументов.ПервичныйДокумент КАК ПервичныйДокумент, | СостоянияОригиналовПервичныхДокументов.Состояние КАК Состояние, | СостоянияОригиналовПервичныхДокументов.ФормаИзвне КАК Извне, - | СостоянияОригиналовПервичныхДокументов.ПервичныйДокументПредставление КАК Представление + | СостоянияОригиналовПервичныхДокументов.ПервичныйДокументПредставление КАК Представление, + | СостоянияОригиналовПервичныхДокументов.ДатаПоследнегоИзменения КАК ДатаПоследнегоИзменения, + | СостоянияОригиналовПервичныхДокументов.АвторИзменения КАК АвторИзменения, + | СостоянияОригиналовПервичныхДокументов.Сотрудник КАК Сотрудник |ИЗ | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов |ГДЕ @@ -380,7 +432,10 @@ НоваяСтрока.Представление = Выборка.Представление; НоваяСтрока.Состояние = Выборка.Состояние; НоваяСтрока.Извне = Выборка.Извне; - + НоваяСтрока.ДатаПоследнегоИзменения = Выборка.ДатаПоследнегоИзменения; + НоваяСтрока.АвторИзменения = Выборка.АвторИзменения; + НоваяСтрока.Сотрудник = Выборка.Сотрудник; + Если Выборка.Извне = Истина Тогда НоваяСтрока.Картинка = 2; Иначе @@ -410,7 +465,10 @@ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СостоянияОригиналовПервичныхДокументов.ПервичныйДокумент КАК ПервичныйДокумент, - | СостоянияОригиналовПервичныхДокументов.ПервичныйДокументПредставление КАК Представление + | СостоянияОригиналовПервичныхДокументов.ПервичныйДокументПредставление КАК Представление, + | СостоянияОригиналовПервичныхДокументов.АвторИзменения КАК АвторИзменения, + | СостоянияОригиналовПервичныхДокументов.ДатаПоследнегоИзменения КАК ДатаПоследнегоИзменения, + | СостоянияОригиналовПервичныхДокументов.Сотрудник КАК Сотрудник |ИЗ | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов |ГДЕ @@ -420,7 +478,11 @@ | |СГРУППИРОВАТЬ ПО | СостоянияОригиналовПервичныхДокументов.ПервичныйДокумент, - | СостоянияОригиналовПервичныхДокументов.ПервичныйДокументПредставление"; + | СостоянияОригиналовПервичныхДокументов.ПервичныйДокументПредставление, + | СостоянияОригиналовПервичныхДокументов.АвторИзменения, + | СостоянияОригиналовПервичныхДокументов.ДатаПоследнегоИзменения, + | СостоянияОригиналовПервичныхДокументов.Сотрудник"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Тип","ТИП ("+ОбщегоНазначения.ИмяТаблицыПоСсылке(Запись.Владелец)+")"); Запрос.УстановитьПараметр("ДатаНачала",НачалоМесяца(НачалоДня(ТекущаяДатаСеанса()))); @@ -435,6 +497,9 @@ НоваяСтрока.Извне = Истина; НоваяСтрока.Картинка = 2; НоваяСтрока.ОригиналПолученКартинка = 0; + НоваяСтрока.ДатаПоследнегоИзменения = Выборка.ДатаПоследнегоИзменения; + НоваяСтрока.АвторИзменения = Выборка.АвторИзменения; + НоваяСтрока.Сотрудник = Выборка.Сотрудник; КонецЦикла; УдалитьДубликатыФорм(); @@ -456,7 +521,12 @@ Процедура УдалитьДубликатыФорм() Для Каждого Строка Из КомплектПечатныхФорм Цикл - Отбор = Новый Структура("ИмяМакета",Строка.ИмяМакета); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Владелец); + Если ТЧ <> "" Тогда + Отбор = Новый Структура("Представление",Строка.Представление); + Иначе + Отбор = Новый Структура("ИмяМакета",Строка.ИмяМакета); + КонецЕсли; НайденныеСтроки = КомплектПечатныхФорм.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество()> 1 Тогда Счетчик = НайденныеСтроки.Количество(); @@ -580,27 +650,33 @@ Если КомплектПечатныхФорм.Количество()<> 0 Тогда Для Каждого ПечатнаяФорма Из КомплектПечатныхФорм Цикл - + Если ЗначениеЗаполнено(ПечатнаяФорма.Состояние) Тогда - ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(ПечатнаяФорма.ИмяМакета); - ПроверкаЗаписьСостоянияОригинала.Прочитать(); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Запись.Владелец); + Если ТЧ = "" Тогда + ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(ПечатнаяФорма.ИмяМакета); + ПроверкаЗаписьСостоянияОригинала.Прочитать(); + Иначе + ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(ПечатнаяФорма.ИмяМакета); + ПроверкаЗаписьСостоянияОригинала.Отбор.Сотрудник.Установить(ПечатнаяФорма.Сотрудник); + ПроверкаЗаписьСостоянияОригинала.Прочитать(); + КонецЕсли; Если ПроверкаЗаписьСостоянияОригинала.Количество() > 0 Тогда Если ПроверкаЗаписьСостоянияОригинала[0].Состояние <> ПечатнаяФорма.Состояние Тогда РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Владелец, - ПечатнаяФорма.ИмяМакета,ПечатнаяФорма.Представление,ПечатнаяФорма.Состояние,ПечатнаяФорма.Извне); + ПечатнаяФорма.ИмяМакета,ПечатнаяФорма.Представление,ПечатнаяФорма.Состояние,ПечатнаяФорма.Извне, ПечатнаяФорма.Сотрудник); КонецЕсли; - Иначе - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Владелец, - ПечатнаяФорма.ИмяМакета,ПечатнаяФорма.Представление,ПечатнаяФорма.Состояние,ПечатнаяФорма.Извне); + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Владелец, + ПечатнаяФорма.ИмяМакета,ПечатнаяФорма.Представление,ПечатнаяФорма.Состояние,ПечатнаяФорма.Извне,ПечатнаяФорма.Сотрудник); + КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Владелец,Запись.Состояние); - КонецПроцедуры &НаСервере diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Help/ru.html b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Help/ru.html index e4338724f..edc9dd7b7 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Help/ru.html +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/Help/ru.html @@ -7,7 +7,10 @@
              • по которым получены и не получены подписанные оригиналы документов;
              • которые еще не отслеживались;
              • предусмотрены различные отборы для поиска документов;
              • -
              • имеется возможность изменения состояния первичного документа.
              +
            • имеется возможность изменения состояния первичного документа.

            Особенности работы с табличными документами

            +

            +
            • В программе может быть предусмотрена поддержка учета оригиналов табличных документов (для этого необходимы настройки разработчика), например Отпуск сотрудников, Отпуск без сохранения списком. В таких документах требуется подпись нескольких сотрудников, поэтому каждой подписи соответствует отдельная печатная форма. 
            • +
            • Такие документы в окне Изменение состояний оригинала документа выводятся в Такие первичные документы выводятся в виде "представление первичного документа + ФИО сотрудника"  

            Состояния оригиналов первичных документов

            При работе в списках документов и распечатке печатных форм для отправки клиентам (поставщикам) предусмотрена возможность автоматического изменения состояния оригинала первичного документа. 
            @@ -20,6 +23,5 @@
            • С помощью кнопки  Состояние оригинала можно установить любое состояние оригинала, выбрав его из списка;
            • С помощью кнопки  Оригинал получен можно быстро установить конечное состояние Оригинал получен.

            См. также:

            -

            +

            \ No newline at end of file diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl index 2d849dc82..e7821c639 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl @@ -15,8 +15,9 @@ // Параметры: // ОбъектыПечати - СписокЗначений - список документов. // ПечатныеФормы - СписокЗначений - наименование макетов и представление печатных форм. +// Записано - Булево - признак того, что состояние документа записано в регистр. // -Процедура ЗаписатьСостоянияОригиналовДокументаПослеПечатиФормы(ОбъектыПечати, ПечатныеФормы) Экспорт +Процедура ЗаписатьСостоянияОригиналовДокументаПослеПечатиФормы(ОбъектыПечати, ПечатныеФормы, Записано = Ложь) Экспорт Состояние = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана"); Если ЗначениеЗаполнено(ОбъектыПечати) Тогда @@ -26,16 +27,34 @@ Если УчетОригиналовПервичныхДокументов.ЭтоОбъектУчета(Документ.Значение) Тогда // Записываем общее состояние ЗаписатьОбщееСостояниеОригиналаДокумента(Документ.Значение,Состояние); - Для Каждого Форма Из ПечатныеФормы Цикл //Если документов и форм несколько, записываем для каждого документа, состояние каждой формы - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, Форма.Значение, Форма.Представление, Состояние, Ложь); - КонецЦикла; + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ.Значение); + Если ТЧ <> "" Тогда + Для Каждого Сотрудник Из Документ.Значение[ТЧ] Цикл + Для Каждого Форма Из ПечатныеФормы Цикл //Если документов и форм несколько, записываем для каждого документа, состояние каждой формы + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, Форма.Значение, Форма.Представление, Состояние, Ложь, Сотрудник.Сотрудник); + КонецЦикла; + КонецЦикла; + Иначе + Для Каждого Форма Из ПечатныеФормы Цикл //Если документов и форм несколько, записываем для каждого документа, состояние каждой формы + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, Форма.Значение, Форма.Представление, Состояние, Ложь); + КонецЦикла; + КонецЕсли; + Записано = Истина; КонецЕсли; КонецЦикла; Иначе Для Каждого Документ Из ОбъектыПечати Цикл Если УчетОригиналовПервичныхДокументов.ЭтоОбъектУчета(Документ.Значение) Тогда - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь); - ЗаписатьОбщееСостояниеОригиналаДокумента(Документ.Значение,Состояние); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ.Значение); + Если ТЧ <> "" Тогда + Для Каждого Сотрудник Из Документ.Значение[ТЧ] Цикл + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь,Сотрудник.Сотрудник); + КонецЦикла; + Иначе + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ.Значение, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь); + КонецЕсли; + ЗаписатьОбщееСостояниеОригиналаДокумента(Документ.Значение,Состояние); + Записано = Истина; КонецЕсли; КонецЦикла; КонецЕсли; @@ -43,13 +62,30 @@ Документ = ОбъектыПечати[0].Значение; Если УчетОригиналовПервичныхДокументов.ЭтоОбъектУчета(Документ) Тогда Если ПечатныеФормы.Количество() > 1 Тогда - Для Каждого Форма Из ПечатныеФормы Цикл - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, Форма.Значение,Форма.Представление, Состояние, Ложь); - КонецЦикла; + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ); + Если ТЧ <> "" Тогда + Для Каждого Сотрудник Из Документ[ТЧ] Цикл + Для Каждого Форма Из ПечатныеФормы Цикл + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, Форма.Значение,Форма.Представление, Состояние, Ложь,Сотрудник.Сотрудник); + КонецЦикла; + КонецЦикла; + Иначе + Для Каждого Форма Из ПечатныеФормы Цикл + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, Форма.Значение,Форма.Представление, Состояние, Ложь); + КонецЦикла; + КонецЕсли; Иначе - ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь); + ТЧ = УчетОригиналовПервичныхДокументов.ТабличнаяЧастьМногосотрудниковаДокумента(Документ); + Если ТЧ <> "" Тогда + Для Каждого Сотрудник Из Документ[ТЧ] Цикл + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь, Сотрудник.Сотрудник); + КонецЦикла; + Иначе + ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатныеФормы[0].Значение,ПечатныеФормы[0].Представление, Состояние, Ложь); + КонецЕсли; КонецЕсли; ЗаписатьОбщееСостояниеОригиналаДокумента(Документ,Состояние); + Записано = Истина; КонецЕсли; КонецЕсли; КонецЕсли; @@ -65,10 +101,11 @@ // Состояние - Строка - наименование состояния оригинала печатной формы // - СправочникСсылка - ссылка на состояние оригинала печатной формы. // Извне - Булево - признак, показывающий принадлежит ли форма системе 1С. +// Сотрудник - СправочникСсылка - ссылка на сотрудника, если оригинал документа является многосотрудниковым. // -Процедура ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатнаяФорма, Представление, Состояние, Извне) Экспорт - - УстановитьПривилегированныйРежим(Истина); +Процедура ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ, ПечатнаяФорма, Представление, Состояние, Извне, Сотрудник = Неопределено) Экспорт + +УстановитьПривилегированныйРежим(Истина); НачатьТранзакцию(); @@ -77,12 +114,24 @@ ЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьМенеджерЗаписи(); ЗаписьСостоянияОригинала.Владелец = Документ.Ссылка; ЗаписьСостоянияОригинала.ПервичныйДокумент = ПечатнаяФорма; - ЗаписьСостоянияОригинала.ПервичныйДокументПредставление = Представление; + Если Сотрудник <> Неопределено Тогда + ФИО = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(Сотрудник.Наименование); + Значения = Новый Структура("Представление, ФИО", Представление, ФИО); + ПредставлениеСотрудник = СтрНайти(Представление, ФИО); + Если ПредставлениеСотрудник = 0 Тогда + ЗаписьСостоянияОригинала.ПервичныйДокументПредставление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(НСтр("ru='[Представление] [ФИО]'"), Значения); + Иначе + ЗаписьСостоянияОригинала.ПервичныйДокументПредставление = Представление; + КонецЕсли; + Иначе + ЗаписьСостоянияОригинала.ПервичныйДокументПредставление = Представление; + КонецЕсли; ЗаписьСостоянияОригинала.Состояние = Справочники.СостоянияОригиналовПервичныхДокументов.НайтиПоНаименованию(Состояние); ЗаписьСостоянияОригинала.АвторИзменения = Пользователи.АвторизованныйПользователь(); ЗаписьСостоянияОригинала.ОбщееСостояние = Ложь; ЗаписьСостоянияОригинала.ФормаИзвне = Извне; ЗаписьСостоянияОригинала.ДатаПоследнегоИзменения = ТекущаяДатаСеанса(); + ЗаписьСостоянияОригинала.Сотрудник = Сотрудник; ЗаписьСостоянияОригинала.Записать(); ЗафиксироватьТранзакцию(); diff --git a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/СостоянияОригиналовПервичныхДокументов.mdo b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/СостоянияОригиналовПервичныхДокументов.mdo index 075e40da2..060788cd4 100644 --- a/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/СостоянияОригиналовПервичныхДокументов.mdo +++ b/SSL/src/InformationRegisters/СостоянияОригиналовПервичныхДокументов/СостоянияОригиналовПервичныхДокументов.mdo @@ -216,6 +216,22 @@ true + + Сотрудник + + ru + Сотрудник + + + DefinedType.Сотрудник + + + + Use + Use + + true + ФормаЗаписи diff --git a/SSL/src/InformationRegisters/СостоянияПапокПисем/ManagerModule.bsl b/SSL/src/InformationRegisters/СостоянияПапокПисем/ManagerModule.bsl index 0a1401201..7b4681d42 100644 --- a/SSL/src/InformationRegisters/СостоянияПапокПисем/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СостоянияПапокПисем/ManagerModule.bsl @@ -13,9 +13,8 @@ // Удаляет либо одну, либо все записи из регистра. // // Параметры: -// Папка - Справочник.ПапкиЭлектронныхПисем -// - Неопределено - папка, для которой удаляется запись. -// Если указано значение Неопределено, то регистр будет очищен полностью. +// Папка - СправочникСсылка.ПапкиЭлектронныхПисем - папка, для которой удаляется запись. +// - Неопределено - регистр будет очищен полностью. // Процедура УдалитьЗаписьИзРегистра(Папка = Неопределено) Экспорт @@ -33,7 +32,7 @@ // Выполняет запись в регистр сведений для указанной папки. // // Параметры: -// Папка - Справочник.ПапкиЭлектронныхПисем - папка, для которой выполняется запись. +// Папка - СправочникСсылка.ПапкиЭлектронныхПисем - папка, для которой выполняется запись. // Количество - Число - количество не рассмотренных взаимодействий для этой папки. // Процедура ВыполнитьЗаписьВРегистр(Папка, Количество) Экспорт diff --git a/SSL/src/InformationRegisters/СостоянияПредметовВзаимодействий/ManagerModule.bsl b/SSL/src/InformationRegisters/СостоянияПредметовВзаимодействий/ManagerModule.bsl index 7c60d83dc..84ffaadbe 100644 --- a/SSL/src/InformationRegisters/СостоянияПредметовВзаимодействий/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СостоянияПредметовВзаимодействий/ManagerModule.bsl @@ -38,8 +38,8 @@ // Предмет - ДокументСсылка // - СправочникСсылка - предмет, для которого выполняется запись. // КоличествоНеРассмотрено - Число - количество не рассмотренных взаимодействий для предмета. -// ДатаПоследнегоВзаимодействия - ДатаВремя - дата последнего взаимодействия по предмету. -// Активен - Булево - признак активности предмета. +// ДатаПоследнегоВзаимодействия - Дата - дата последнего взаимодействия по предмету. +// Активен - Булево - признак активности предмета. // Процедура ВыполнитьЗаписьВРегистр(Предмет, КоличествоНеРассмотрено = Неопределено, diff --git a/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl b/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl index 383a8cde8..c77d60b9c 100644 --- a/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/СтатистикаКонфигурации/ManagerModule.bsl @@ -320,9 +320,20 @@ КонецЦикла; КонецПроцедуры +// Записывает данные в регистр сведений +// +// Параметры: +// СтатистикаКонфигурации - Соответствие из КлючИЗначение: +// * Ключ - Строка - имя объекта метаданных. +// * Значение - Структура: +// ** Запрос - Строка, ОбъектМетаданных - текст запрос или объект метаданных, в котором хранится значение. +// ** ОперацииСтатистики - Массив - содержит операции статистики. +// ** ВидСтатистики - Число - признак статистики. +// * Область - УникальныйИдентификатор - уникальный идентификатор области статистики. +// Процедура Записать(СтатистикаКонфигурации, Область) Экспорт - НаборЗаписей = СоздатьНаборЗаписей(); + НаборЗаписей = СоздатьНаборЗаписей(); ЕстьЗапись = Ложь; ОперацииСсылки = Новый Соответствие; @@ -410,6 +421,9 @@ КонецПроцедуры +// Возвращаемое значение: +// - РезультатЗапроса +// Функция ПолучитьОбластиДанныхРезультатЗапроса() Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form index 0ce32c39e..6e35cbfb2 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Form.form @@ -91,7 +91,7 @@ ВертикальнаяГруппа1 50 - Чтение + ПравоЧтение 20 true true @@ -99,7 +99,7 @@ true - Чтение + ПравоЧтение Right @@ -107,7 +107,7 @@ Флажок, установленный истина, показывает наличие права добавления в заданной таблице для заданного пользователя в пределах заданной группы доступа - ЧтениеExtendedTooltip + ПравоЧтениеРасширеннаяПодсказка 25 Label true @@ -117,7 +117,7 @@ - ЧтениеКонтекстноеМеню + ПравоЧтениеКонтекстноеМеню 21 true @@ -130,7 +130,7 @@ - Изменение + ПравоИзменение 9 true true @@ -138,11 +138,11 @@ true - Запись.Изменение + Запись.ПравоИзменение Right - ИзменениеExtendedTooltip + ПравоИзменениеРасширеннаяПодсказка 27 Label true @@ -152,7 +152,7 @@ - ИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 10 true @@ -164,7 +164,7 @@ - Добавление + ПравоДобавление 42 true true @@ -172,11 +172,11 @@ true - Запись.Добавление + Запись.ПравоДобавление Right - ДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 44 Label true @@ -186,7 +186,7 @@ - ДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 43 true @@ -230,7 +230,7 @@ ВертикальнаяГруппа2 52 - ЧтениеБезОграничения + ПравоЧтениеБезОграничения 30 true true @@ -238,11 +238,11 @@ true - Запись.ЧтениеБезОграничения + Запись.ПравоЧтениеБезОграничения Right - ЧтениеБезОграниченияРасширеннаяПодсказка + ПравоЧтениеБезОграниченияРасширеннаяПодсказка 32 Label true @@ -252,7 +252,7 @@ - ЧтениеБезОграниченияКонтекстноеМеню + ПравоЧтениеБезОграниченияКонтекстноеМеню 31 true @@ -264,7 +264,7 @@ - ИзменениеБезОграничения + ПравоИзменениеБезОграничения 33 true true @@ -272,11 +272,11 @@ true - Запись.ИзменениеБезОграничения + Запись.ПравоИзменениеБезОграничения Right - ИзменениеБезОграниченияРасширеннаяПодсказка + ПравоИзменениеБезОграниченияРасширеннаяПодсказка 35 Label true @@ -286,7 +286,7 @@ - ИзменениеБезОграниченияКонтекстноеМеню + ПравоИзменениеБезОграниченияКонтекстноеМеню 34 true @@ -298,7 +298,7 @@ - ДобавлениеБезОграничения + ПравоДобавлениеБезОграничения 45 true true @@ -306,11 +306,11 @@ true - Запись.ДобавлениеБезОграничения + Запись.ПравоДобавлениеБезОграничения Right - ДобавлениеБезОграниченияРасширеннаяПодсказка + ПравоДобавлениеБезОграниченияРасширеннаяПодсказка 47 Label true @@ -320,7 +320,7 @@ - ДобавлениеБезОграниченияКонтекстноеМеню + ПравоДобавлениеБезОграниченияКонтекстноеМеню 46 true @@ -494,10 +494,10 @@ true - Чтение + ПравоЧтение <key>ru</key> - <value>Чтение</value> + <value>Право чтение</value> 2 diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Module.bsl index 3f578474b..c5591e43c 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Module.bsl +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаЗаписи/Module.bsl @@ -11,7 +11,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - Чтение = Истина; + ПравоЧтение = Истина; ТолькоПросмотр = Истина; diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form index ef2bb18e6..a66f9f206 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/Forms/ФормаСписка/Form.form @@ -134,7 +134,7 @@ None Copy - СписокТаблица + Таблица 4 true true @@ -146,7 +146,7 @@ true - СписокТаблицаРасширеннаяПодсказка + ТаблицаРасширеннаяПодсказка 29 Label true @@ -156,7 +156,7 @@ - СписокТаблицаКонтекстноеМеню + ТаблицаКонтекстноеМеню 5 true @@ -171,7 +171,7 @@ - СписокГруппаДоступа + ГруппаДоступа 8 true true @@ -183,7 +183,7 @@ true - СписокГруппаДоступаРасширеннаяПодсказка + ГруппаДоступаРасширеннаяПодсказка 30 Label true @@ -193,7 +193,7 @@ - СписокГруппаДоступаКонтекстноеМеню + ГруппаДоступаКонтекстноеМеню 9 true @@ -208,14 +208,14 @@ - СписокГруппаПравоЧтение + ГруппаПравоЧтение 61 - СписокЧтение + ПравоЧтение 24 <key>ru</key> - <value>Чтение</value> + <value>Право чтение</value> true true @@ -223,14 +223,14 @@ true - Список.Чтение + Список.ПравоЧтение ru Флажок, установленный истина, показывает наличие права добавления в заданной таблице для заданного пользователя в пределах заданной группы доступа - СписокЧтениеРасширеннаяПодсказка + ПравоЧтениеРасширеннаяПодсказка 31 Label true @@ -240,7 +240,7 @@ - СписокЧтениеКонтекстноеМеню + ПравоЧтениеКонтекстноеМеню 25 true @@ -252,7 +252,7 @@ - СписокЧтениеБезОграничения + ПравоЧтениеБезОграничения 49 <key>ru</key> @@ -264,10 +264,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ЧтениеБезОграничения</segments> + <segments>Список.ПравоЧтениеБезОграничения</segments> </dataPath> <extendedTooltip> - <name>СписокЧтениеБезОграниченияРасширеннаяПодсказка</name> + <name>ПравоЧтениеБезОграниченияРасширеннаяПодсказка</name> <id>51</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -277,7 +277,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокЧтениеБезОграниченияКонтекстноеМеню</name> + <name>ПравоЧтениеБезОграниченияКонтекстноеМеню</name> <id>50</id> <autoFill>true</autoFill> </contextMenu> @@ -295,10 +295,10 @@ </userVisible> <title> <key>ru</key> - <value>Право Чтение</value> + <value>Право чтение</value> - СписокГруппаПравоЧтениеРасширеннаяПодсказка + ГруппаПравоЧтениеРасширеннаяПодсказка 62 Label true @@ -315,10 +315,10 @@ - СписокГруппаПравоИзменение + ГруппаПравоИзменение 63 - СписокИзменение + ПравоИзменение 12 true true @@ -326,11 +326,11 @@ true - Список.Изменение + Список.ПравоИзменение true - СписокИзменениеРасширеннаяПодсказка + ПравоИзменениеРасширеннаяПодсказка 33 Label true @@ -340,7 +340,7 @@ - СписокИзменениеКонтекстноеМеню + ПравоИзменениеКонтекстноеМеню 13 true @@ -352,7 +352,7 @@ - СписокИзменениеБезОграничения + ПравоИзменениеБезОграничения 52 <key>ru</key> @@ -364,10 +364,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ИзменениеБезОграничения</segments> + <segments>Список.ПравоИзменение</segments> </dataPath> <extendedTooltip> - <name>СписокИзменениеБезОграниченияРасширеннаяПодсказка</name> + <name>ПравоИзменениеБезОграниченияРасширеннаяПодсказка</name> <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -377,7 +377,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокИзменениеБезОграниченияКонтекстноеМеню</name> + <name>ПравоИзменениеБезОграниченияКонтекстноеМеню</name> <id>53</id> <autoFill>true</autoFill> </contextMenu> @@ -395,10 +395,10 @@ </userVisible> <title> <key>ru</key> - <value>Право Изменение</value> + <value>Право изменение</value> - СписокГруппаПравоИзменениеРасширеннаяПодсказка + ГруппаПравоИзменениеРасширеннаяПодсказка 64 Label true @@ -415,10 +415,10 @@ - СписокГруппаПравоДобавление + ГруппаПравоДобавление 65 - СписокДобавление + ПравоДобавление 55 true true @@ -426,10 +426,10 @@ true - Список.Добавление + Список.ПравоДобавление - СписокДобавлениеРасширеннаяПодсказка + ПравоДобавлениеРасширеннаяПодсказка 57 Label true @@ -439,7 +439,7 @@ - СписокДобавлениеКонтекстноеМеню + ПравоДобавлениеКонтекстноеМеню 56 true @@ -451,7 +451,7 @@ - СписокДобавлениеБезОграничения + ПравоДобавлениеБезОграничения 58 <key>ru</key> @@ -463,10 +463,10 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ДобавлениеБезОграничения</segments> + <segments>Список.ПравоДобавление</segments> </dataPath> <extendedTooltip> - <name>СписокДобавлениеБезОграниченияРасширеннаяПодсказка</name> + <name>ПравоДобавлениеБезОграниченияРасширеннаяПодсказка</name> <id>60</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -476,7 +476,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокДобавлениеБезОграниченияКонтекстноеМеню</name> + <name>ПравоДобавлениеБезОграниченияКонтекстноеМеню</name> <id>59</id> <autoFill>true</autoFill> </contextMenu> @@ -494,10 +494,10 @@ </userVisible> <title> <key>ru</key> - <value>Право Добавление</value> + <value>Право добавление</value> - СписокГруппаПравоДобавлениеРасширеннаяПодсказка + ГруппаПравоДобавлениеРасширеннаяПодсказка 66 Label true @@ -514,7 +514,7 @@ - СписокТипТаблицы + ТипТаблицы 16 true true @@ -526,7 +526,7 @@ true - СписокТипТаблицыРасширеннаяПодсказка + ТипТаблицыРасширеннаяПодсказка 35 Label true @@ -536,7 +536,7 @@ - СписокТипТаблицыКонтекстноеМеню + ТипТаблицыКонтекстноеМеню 17 true @@ -715,12 +715,12 @@ ВЫБРАТЬ ТаблицыГруппДоступа.Таблица КАК Таблица, ТаблицыГруппДоступа.ГруппаДоступа КАК ГруппаДоступа, - ИСТИНА КАК Чтение, - ТаблицыГруппДоступа.Изменение КАК Изменение, - ТаблицыГруппДоступа.Добавление КАК Добавление, - ТаблицыГруппДоступа.ЧтениеБезОграничения КАК ЧтениеБезОграничения, - ТаблицыГруппДоступа.ИзменениеБезОграничения КАК ИзменениеБезОграничения, - ТаблицыГруппДоступа.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения, + ИСТИНА КАК ПравоЧтение, + ТаблицыГруппДоступа.ПравоИзменение КАК ПравоИзменение, + ТаблицыГруппДоступа.ПравоДобавление КАК ПравоДобавление, + ТаблицыГруппДоступа.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + ТаблицыГруппДоступа.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + ТаблицыГруппДоступа.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, ТаблицыГруппДоступа.ТипТаблицы КАК ТипТаблицы ИЗ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl index aca3057b8..7bd5cf8c3 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ManagerModule.bsl @@ -51,12 +51,12 @@ // // Параметры: // ГруппыДоступа - СправочникСсылка.ГруппыДоступа. -// - массив значений указанного выше типа. +// - Массив - значения указанного выше типа. // - Неопределено - без отбора. // -// Таблицы - СправочникСсылка.ИдентификаторыОбъектовМетаданных. -// - массив значений указанного выше типа. -// - Неопределено - без отбора. +// Таблицы - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - СправочникСсылка.ИдентификаторыОбъектовРасширений +// - Массив - значения указанных выше типов. // // ЕстьИзменения - Булево - (возвращаемое значение) - если производилась запись, // устанавливается Истина, иначе не изменяется. @@ -100,11 +100,11 @@ "ВЫБРАТЬ | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолейРасширений.Роль КАК Роль, - | ПраваРолейРасширений.Изменение КАК Изменение, - | ПраваРолейРасширений.Добавление КАК Добавление, - | ПраваРолейРасширений.ЧтениеБезОграничения КАК ЧтениеБезОграничения, - | ПраваРолейРасширений.ИзменениеБезОграничения КАК ИзменениеБезОграничения, - | ПраваРолейРасширений.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения, + | ПраваРолейРасширений.ПравоИзменение КАК ПравоИзменение, + | ПраваРолейРасширений.ПравоДобавление КАК ПравоДобавление, + | ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + | ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + | ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, | ПраваРолейРасширений.ВидИзмененияСтроки КАК ВидИзмененияСтроки |ПОМЕСТИТЬ ПраваРолейРасширений |ИЗ @@ -115,11 +115,11 @@ |ВЫБРАТЬ | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолейРасширений.Роль КАК Роль, - | ПраваРолейРасширений.Изменение КАК Изменение, - | ПраваРолейРасширений.Добавление КАК Добавление, - | ПраваРолейРасширений.ЧтениеБезОграничения КАК ЧтениеБезОграничения, - | ПраваРолейРасширений.ИзменениеБезОграничения КАК ИзменениеБезОграничения, - | ПраваРолейРасширений.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения + | ПраваРолейРасширений.ПравоИзменение КАК ПравоИзменение, + | ПраваРолейРасширений.ПравоДобавление КАК ПравоДобавление, + | ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + | ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + | ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения |ПОМЕСТИТЬ ПраваРолей |ИЗ | ПраваРолейРасширений КАК ПраваРолейРасширений @@ -131,11 +131,11 @@ |ВЫБРАТЬ | ПраваРолей.ОбъектМетаданных, | ПраваРолей.Роль, - | ПраваРолей.Изменение, - | ПраваРолей.Добавление, - | ПраваРолей.ЧтениеБезОграничения, - | ПраваРолей.ИзменениеБезОграничения, - | ПраваРолей.ДобавлениеБезОграничения + | ПраваРолей.ПравоИзменение, + | ПраваРолей.ПравоДобавление, + | ПраваРолей.ПравоЧтениеБезОграничения, + | ПраваРолей.ПравоИзменениеБезОграничения, + | ПраваРолей.ПравоДобавлениеБезОграничения |ИЗ | РегистрСведений.ПраваРолей КАК ПраваРолей | ЛЕВОЕ СОЕДИНЕНИЕ ПраваРолейРасширений КАК ПраваРолейРасширений @@ -154,7 +154,7 @@ | Справочник.ГруппыДоступа КАК ГруппыДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа | ПО ГруппыДоступа.Профиль = ПрофилиГруппДоступа.Ссылка - | И (ГруппыДоступа.Профиль <> ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор)) + | И (ГруппыДоступа.Профиль <> &ПрофильАдминистратор) | И (НЕ ГруппыДоступа.ПометкаУдаления) | И (НЕ ПрофилиГруппДоступа.ПометкаУдаления) | И (&УсловиеОтбораГруппДоступа1) @@ -186,13 +186,13 @@ | РолиПрофилей.Ссылка КАК Профиль, | ПраваРолей.ОбъектМетаданных КАК Таблица, | ПраваРолей.ОбъектМетаданных.ЗначениеПустойСсылки КАК ТипТаблицы, - | МАКСИМУМ(ПраваРолей.Изменение) КАК Изменение, - | МАКСИМУМ(ПраваРолей.Изменение) - | И МАКСИМУМ(ПраваРолей.Добавление) КАК Добавление, - | МАКСИМУМ(ПраваРолей.ЧтениеБезОграничения) КАК ЧтениеБезОграничения, - | МАКСИМУМ(ПраваРолей.ИзменениеБезОграничения) КАК ИзменениеБезОграничения, - | МАКСИМУМ(ПраваРолей.ИзменениеБезОграничения) - | И МАКСИМУМ(ПраваРолей.ДобавлениеБезОграничения) КАК ДобавлениеБезОграничения + | МАКСИМУМ(ПраваРолей.ПравоИзменение) КАК ПравоИзменение, + | МАКСИМУМ(ПраваРолей.ПравоИзменение) + | И МАКСИМУМ(ПраваРолей.ПравоДобавление) КАК ПравоДобавление, + | МАКСИМУМ(ПраваРолей.ПравоЧтениеБезОграничения) КАК ПравоЧтениеБезОграничения, + | МАКСИМУМ(ПраваРолей.ПравоИзменениеБезОграничения) КАК ПравоИзменениеБезОграничения, + | МАКСИМУМ(ПраваРолей.ПравоИзменениеБезОграничения) + | И МАКСИМУМ(ПраваРолей.ПравоДобавлениеБезОграничения) КАК ПравоДобавлениеБезОграничения |ПОМЕСТИТЬ ТаблицыПрофилей |ИЗ | Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей @@ -217,11 +217,11 @@ |ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицыПрофилей.Таблица КАК Таблица, | ГруппыДоступа.Ссылка КАК ГруппаДоступа, - | ТаблицыПрофилей.Изменение КАК Изменение, - | ТаблицыПрофилей.Добавление КАК Добавление, - | ТаблицыПрофилей.ЧтениеБезОграничения КАК ЧтениеБезОграничения, - | ТаблицыПрофилей.ИзменениеБезОграничения КАК ИзменениеБезОграничения, - | ТаблицыПрофилей.ДобавлениеБезОграничения КАК ДобавлениеБезОграничения, + | ТаблицыПрофилей.ПравоИзменение КАК ПравоИзменение, + | ТаблицыПрофилей.ПравоДобавление КАК ПравоДобавление, + | ТаблицыПрофилей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + | ТаблицыПрофилей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + | ТаблицыПрофилей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, | ТаблицыПрофилей.ТипТаблицы КАК ТипТаблицы |ПОМЕСТИТЬ НовыеДанные |ИЗ @@ -237,11 +237,11 @@ "ВЫБРАТЬ | НовыеДанные.Таблица, | НовыеДанные.ГруппаДоступа, - | НовыеДанные.Изменение, - | НовыеДанные.Добавление, - | НовыеДанные.ЧтениеБезОграничения, - | НовыеДанные.ИзменениеБезОграничения, - | НовыеДанные.ДобавлениеБезОграничения, + | НовыеДанные.ПравоИзменение, + | НовыеДанные.ПравоДобавление, + | НовыеДанные.ПравоЧтениеБезОграничения, + | НовыеДанные.ПравоИзменениеБезОграничения, + | НовыеДанные.ПравоДобавлениеБезОграничения, | НовыеДанные.ТипТаблицы, | &ПодстановкаПоляВидИзмененияСтроки |ИЗ @@ -251,14 +251,15 @@ Поля = Новый Массив; Поля.Добавить(Новый Структура("Таблица", "&УсловиеОтбораТаблиц2")); Поля.Добавить(Новый Структура("ГруппаДоступа", "&УсловиеОтбораГруппДоступа2")); - Поля.Добавить(Новый Структура("Изменение")); - Поля.Добавить(Новый Структура("Добавление")); - Поля.Добавить(Новый Структура("ЧтениеБезОграничения")); - Поля.Добавить(Новый Структура("ИзменениеБезОграничения")); - Поля.Добавить(Новый Структура("ДобавлениеБезОграничения")); + Поля.Добавить(Новый Структура("ПравоИзменение")); + Поля.Добавить(Новый Структура("ПравоДобавление")); + Поля.Добавить(Новый Структура("ПравоЧтениеБезОграничения")); + Поля.Добавить(Новый Структура("ПравоИзменениеБезОграничения")); + Поля.Добавить(Новый Структура("ПравоДобавлениеБезОграничения")); Поля.Добавить(Новый Структура("ТипТаблицы")); Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ПрофильАдминистратор", УправлениеДоступом.ПрофильАдминистратор()); Запрос.УстановитьПараметр("ПраваРолейРасширений", УправлениеДоступомСлужебный.ПраваРолейРасширений()); Запрос.Текст = УправлениеДоступомСлужебный.ТекстЗапросаВыбораИзменений( ТекстЗапроса, Поля, "РегистрСведений.ТаблицыГруппДоступа", ТекстЗапросовВременныхТаблиц); @@ -311,14 +312,16 @@ Если ЕстьТекущиеИзменения Тогда СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); ЕстьИзменения = Истина; + СоставИзменений = Данные.ИзмененияСоставаСтрок.Скопировать(, "Таблица"); + СоставИзменений.Свернуть("Таблица"); + ИзменениеТаблиц = СоставИзменений.ВыгрузитьКолонку("Таблица"); + РегистрыСведений.ИспользуемыеВидыДоступаПоТаблицам.ОбновитьДанныеРегистра(ИзменениеТаблиц); КонецЕсли; Если ЕстьТекущиеИзменения И УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда // Планирование обновления доступа. - СоставИзменений = Данные.ИзмененияСоставаСтрок.Скопировать(, "Таблица"); - СоставИзменений.Свернуть("Таблица"); УправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступаПриИзмененииТаблицГруппДоступа(СоставИзменений); КонецЕсли; diff --git a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo index 5b073f168..8c2bf0a2e 100644 --- a/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo +++ b/SSL/src/InformationRegisters/ТаблицыГруппДоступа/ТаблицыГруппДоступа.mdo @@ -51,10 +51,10 @@ Managed - Изменение + ПравоИзменение ru - Изменение + Право изменение Boolean @@ -70,10 +70,10 @@ Index - Добавление + ПравоДобавление ru - Добавление + Право добавление Boolean @@ -89,10 +89,10 @@ Index - ЧтениеБезОграничения + ПравоЧтениеБезОграничения ru - Чтение без ограничения + Право чтение без ограничения Boolean @@ -107,10 +107,10 @@ - ИзменениеБезОграничения + ПравоИзменениеБезОграничения ru - Изменение без ограничения + Право изменение без ограничения Boolean @@ -125,10 +125,10 @@ - ДобавлениеБезОграничения + ПравоДобавлениеБезОграничения ru - Добавление без ограничения + Право добавление без ограничения Boolean diff --git a/SSL/src/InformationRegisters/УдалитьРезультатыОбменаДанными/Help/ru.html b/SSL/src/InformationRegisters/УдалитьРезультатыОбменаДанными/Help/ru.html index 56065d466..e72054d29 100644 --- a/SSL/src/InformationRegisters/УдалитьРезультатыОбменаДанными/Help/ru.html +++ b/SSL/src/InformationRegisters/УдалитьРезультатыОбменаДанными/Help/ru.html @@ -1,6 +1,6 @@

            Предназначен для просмотра статистики по результатам синхронизации данных.

            -

            Результаты синхронизации данных в виде ссылки можно увидеть в списке Синхронизации данных, например, на рабочем столе программы. В зависимости от результатов ссылка принимает значения Предупреждений нет (в случае успешной синхронизации данных) или  Предупреждения (при этом в скобках указывается количество предупреждений). Для открытия списка результатов синхронизации данных пройдите по ссылке.

            +

            Результаты синхронизации данных в виде ссылки можно увидеть в списке Синхронизации данных, например, на рабочем столе программы. В зависимости от результатов ссылка принимает значения Предупреждений нет (в случае успешной синхронизации данных) или  Предупреждения (при этом в скобках указывается количество предупреждений). Для открытия списка результатов синхронизации данных пройдите по ссылке.

            При выполнении синхронизации данных возможно возникновение проблемных ситуаций, требующих вмешательства пользователя. В колонках списка выводится необходимая информация о данных, по которым возникли проблемы и причина, по которой они не были приняты. Причина кратко указывается в специальной колонке, при этом по выделенной строке в нижней части списка выводится подробная формулировка, с указанием проблемных полей списков или документов.

            Отборы

            Для удобства просмотра предусмотрены отборы:

            diff --git a/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl b/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl index 632d90ef9..de6ec3d94 100644 --- a/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl +++ b/SSL/src/Reports/АнализЖурналаРегистрации/ManagerModule.bsl @@ -1565,7 +1565,7 @@ // Возвращаемое значение: // Строка - представление информационной базы. // -// Пример возвращаемого результата: +// Пример: // - для ИБ в файлом режиме: \\FileServer\1c_ib\ // - для ИБ в серверном режиме: ServerName:1111 / information_base_name. // diff --git a/SSL/src/Reports/АнализОпроса/ObjectModule.bsl b/SSL/src/Reports/АнализОпроса/ObjectModule.bsl index f8bde906c..863669bcd 100644 --- a/SSL/src/Reports/АнализОпроса/ObjectModule.bsl +++ b/SSL/src/Reports/АнализОпроса/ObjectModule.bsl @@ -78,9 +78,9 @@ // Вызывается рекурсивно, формирует полный код, и вызывает процедуры вывода вопросов и разделов . // // Параметры: -// СтрокиДерева - СтрокиДереваЗначений - строки дерева, для которых выполняется действие. +// СтрокиДерева - КоллекцияСтрокДереваЗначений - строки дерева, для которых выполняется действие. // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод данных. -// Макет - Макет - макет используемый для вывода данных. +// Макет - ТабличныйДокумент - макет, используемый для вывода данных. // УровеньРекурсии - Число - текущий уровень рекурсии. // МассивПолныйКод - Массив - используется для формирования полного когда обрабатываемой строки. // @@ -120,7 +120,7 @@ // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными: // * Наименование - Строка -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // Процедура ВывестиРаздел(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) @@ -138,7 +138,7 @@ // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными: // * Наименование - Строка -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // Полный код - Строка - полный код строки, выводимой в отчет. // Процедура ВывестиВопрос(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод, ПредставленияВопросов) @@ -169,7 +169,7 @@ // Параметры: // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными. -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // ПредставленияВопросов - Соответствие - содержит информацию о формулировке и признаке "Агрегировать в отчетах". // @@ -200,7 +200,7 @@ // Параметры: // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными. -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // ПредставленияВопросов - Соответствие - содержит информацию о формулировке и признаке "Агрегировать в отчетах". // @@ -267,7 +267,7 @@ // Параметры: // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными. -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // ПредставленияВопросов - Соответствие - содержит информацию о формулировке и признаке "Агрегировать в отчетах". // @@ -343,7 +343,7 @@ // Параметры: // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными. -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // ПредставленияВопросов - Соответствие - содержит информацию о формулировке и признаке "Агрегировать в отчетах". // @@ -423,7 +423,7 @@ // Параметры: // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными. -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // ПредставленияВопросов - Соответствие - содержит информацию о формулировке и признаке "Агрегировать в отчетах". // @@ -472,7 +472,7 @@ // Параметры: // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными. -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // Процедура ВывестиОтветПростойВопрос(ТаблицаОтчета, СтрокаДерева, Макет, ПолныйКод) @@ -502,7 +502,7 @@ // Параметры: // ТаблицаОтчета - ТабличныйДокумент - в него осуществляется вывод информации. // СтрокаДерева - СтрокаДереваЗначений - текущая строка с данными. -// Макет - Макет - макет, используемый для вывода информации. +// Макет - ТабличныйДокумент - макет, используемый для вывода информации. // ПолныйКод - Строка - полный код строки, выводимой в отчет. // Процедура ВывестиОтветВариантыОтвета(ТаблицаОтчета,СтрокаДерева,Макет,ПолныйКод) @@ -546,7 +546,7 @@ // // Параметры: // Опрос - ДокументСсылка.НазначениеОпросов - опрос, по которому строится запрос. -// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет, по которому проводился опрос. +// ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - по которому проводился опрос. // // Возвращаемое значение: // РезультатЗапроса - результат выполненного запроса. @@ -877,10 +877,10 @@ // Преобразует агрегатные значения запроса в строку, для дальнейшего вывода в отчет. // // Параметры: -// СтрокаДерева - строка дерева значений - строка дерева, данные которой будут преобразованы. +// СтрокаДерева - СтрокаДереваЗначений // // Возвращаемое значение: -// Строка - строка, предназначенная для вывод в отчет. +// Строка // Функция АгрегатныеЗначенияВСтроку(СтрокаДерева,АгрегироватьСуммуВОтчетах = Неопределено) @@ -919,8 +919,8 @@ // Формирует отчет в варианте анализа ответивших. // // Параметры: -// ТаблицаОтчета - ТабличныйДокумент - табличный документ в который выводится отчет. -// Опрос - Документ.НазначениеОпросов - опрос, для которого строится отчет. +// ТаблицаОтчета - ТабличныйДокумент - табличный документ, в который выводится отчет. +// Опрос - ДокументСсылка.НазначениеОпросов - опрос, для которого строится отчет. // Процедура СформироватьОтчетАнализОтветивших(ТаблицаОтчета,Опрос) @@ -1002,9 +1002,10 @@ // Формирует и выполняет запрос, для свободных опросов. // // Параметры: -// Опрос - Документ.НазначениеОпросов - опрос, для которого строится отчет. +// Опрос - ДокументСсылка.НазначениеОпросов - опрос, для которого строится отчет. +// // Возвращаемое значение: -// РезультатЗапроса - результат выполненного запроса. +// РезультатЗапроса // Функция ВыполнитьЗапросПоОтветившимОпросСОпределеннымСоставомРеспондентов(Опрос) @@ -1061,11 +1062,11 @@ // Формирует и выполняет запрос, для свободных опросов. // // Параметры: -// Опрос - Документ.НазначениеОпросов - опрос, для которого строится отчет. +// Опрос - ДокументСсылка.НазначениеОпросов - опрос, для которого строится отчет. // ТипРеспондентов - СправочникСсылка - пустая ссылка на справочник, элементы которого являются // респондентами для данного опроса. // Возвращаемое значение: -// РезультатЗапроса - результат выполненного запроса. +// РезультатЗапроса // Функция ВыполнитьЗапросПоОтветившимСвободныйОпрос(Опрос,ТипРеспондентов) diff --git a/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl b/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl index f131cd6c6..9aeb0f9c5 100644 --- a/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl +++ b/SSL/src/Reports/АнализПравДоступа/ManagerModule.bsl @@ -13,7 +13,7 @@ #Область ДляВызоваИзДругихПодсистем // См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов. -Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка) Экспорт +Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда Возврат; @@ -28,10 +28,10 @@ Команда.МножественныйВыбор = Истина; Команда.Менеджер= "Отчет.АнализПравДоступа"; - Если НастройкиФормы.ИмяФормы = "Справочник.Пользователи.Форма.ФормаСписка" Тогда + Если Параметры.ИмяФормы = "Справочник.Пользователи.Форма.ФормаСписка" Тогда Команда.Представление = НСтр("ru = 'Права пользователя'"); Команда.КлючВарианта = "ПраваПользователейНаТаблицы"; - ИначеЕсли НастройкиФормы.ИмяФормы = "Справочник.Пользователи.Форма.ФормаЭлемента" Тогда + ИначеЕсли Параметры.ИмяФормы = "Справочник.Пользователи.Форма.ФормаЭлемента" Тогда Команда.Представление = НСтр("ru = 'Права пользователя'"); Команда.КлючВарианта = "ПраваПользователяНаТаблицы"; Иначе diff --git a/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl b/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl index 077b15b85..d73dfeb7b 100644 --- a/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl +++ b/SSL/src/Reports/АнализПравДоступа/ObjectModule.bsl @@ -214,6 +214,9 @@ ГруппаДоступаЗаголовок = НСтр("ru = 'Профиль пользователя'"); КонецЕсли; + КартинкаПросмотр = БиблиотекаКартинок.Просмотр; + КартинкаРедактирование = БиблиотекаКартинок.Редактирование; + КартинкаСоздание = БиблиотекаКартинок.Создание; Для НомерСтроки = 1 По ДокументРезультат.ВысотаТаблицы Цикл Для НомерКолонки = 1 По ДокументРезультат.ШиринаТаблицы Цикл Область = ДокументРезультат.Область(НомерСтроки, НомерКолонки); @@ -229,13 +232,13 @@ Если ЗначенияПолей.Найти("Право") <> Неопределено Тогда Если Область.Текст = "1" Тогда - Область.Картинка = БиблиотекаКартинок.Просмотр; + Область.Картинка = КартинкаПросмотр; Область.Текст = ""; ИначеЕсли Область.Текст = "2" Тогда - Область.Картинка = БиблиотекаКартинок.Редактирование; + Область.Картинка = КартинкаРедактирование; Область.Текст = ""; ИначеЕсли Область.Текст = "3" Тогда - Область.Картинка = БиблиотекаКартинок.Создание; + Область.Картинка = КартинкаСоздание; Область.Текст = ""; КонецЕсли; КонецЕсли; @@ -377,9 +380,9 @@ Для Каждого Роль Из Метаданные.Роли Цикл Если ПравоДоступа("Просмотр", Отчет, Роль) Тогда СтрокаТаблицы = Результат.Добавить(); - СтрокаТаблицы.Отчет= ИдентификаторыОбъектовМетаданных[Отчет.ПолноеИмя()]; - СтрокаТаблицы.Роль = ИдентификаторыОбъектовМетаданных[Роль.ПолноеИмя()]; - СтрокаТаблицы.Просмотр = Истина; + СтрокаТаблицы.Отчет = ИдентификаторыОбъектовМетаданных[Отчет.ПолноеИмя()]; + СтрокаТаблицы.Роль = ИдентификаторыОбъектовМетаданных[Роль.ПолноеИмя()]; + СтрокаТаблицы.ПравоПросмотр = Истина; КонецЕсли; КонецЦикла; КонецЦикла; @@ -393,7 +396,7 @@ Результат = Новый ТаблицаЗначений; Результат.Колонки.Добавить("Отчет", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных,СправочникСсылка.ИдентификаторыОбъектовРасширений")); Результат.Колонки.Добавить("Роль", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных,СправочникСсылка.ИдентификаторыОбъектовРасширений")); - Результат.Колонки.Добавить("Просмотр", Новый ОписаниеТипов("Булево")); + Результат.Колонки.Добавить("ПравоПросмотр", Новый ОписаниеТипов("Булево")); Возврат Результат; @@ -442,7 +445,7 @@ |ВЫБРАТЬ | ПраваРолей.Отчет КАК Отчет, | ПраваРолей.Роль КАК Роль, - | ПраваРолей.Просмотр КАК Просмотр + | ПраваРолей.ПравоПросмотр КАК ПравоПросмотр |ПОМЕСТИТЬ ПраваРолейНаОтчеты |ИЗ | &ПраваОтчетов КАК ПраваРолей @@ -452,9 +455,9 @@ |ВЫБРАТЬ | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолейРасширений.Роль КАК Роль, - | ПраваРолейРасширений.Просмотр КАК Просмотр, - | ПраваРолейРасширений.Редактирование КАК Редактирование, - | ПраваРолейРасширений.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, + | ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр, + | ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование, + | ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, | ПраваРолейРасширений.ВидИзмененияСтроки КАК ВидИзмененияСтроки |ПОМЕСТИТЬ ПраваРолейРасширений |ИЗ @@ -465,9 +468,9 @@ |ВЫБРАТЬ | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолейРасширений.Роль КАК Роль, - | ПраваРолейРасширений.Просмотр КАК Просмотр, - | ПраваРолейРасширений.Редактирование КАК Редактирование, - | ПраваРолейРасширений.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление + | ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр, + | ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование, + | ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление |ПОМЕСТИТЬ ПраваРолей |ИЗ | ПраваРолейРасширений КАК ПраваРолейРасширений @@ -479,9 +482,9 @@ |ВЫБРАТЬ | ПраваРолей.ОбъектМетаданных, | ПраваРолей.Роль, - | ПраваРолей.Просмотр, - | ПраваРолей.Редактирование, - | ПраваРолей.ИнтерактивноеДобавление + | ПраваРолей.ПравоПросмотр, + | ПраваРолей.ПравоРедактирование, + | ПраваРолей.ПравоИнтерактивноеДобавление |ИЗ | РегистрСведений.ПраваРолей КАК ПраваРолей | ЛЕВОЕ СОЕДИНЕНИЕ ПраваРолейРасширений КАК ПраваРолейРасширений @@ -495,23 +498,23 @@ |ВЫБРАТЬ | ПраваРолей.Отчет, | ПраваРолей.Роль, - | ПраваРолей.Просмотр, + | ПраваРолей.ПравоПросмотр, | ЛОЖЬ, | ЛОЖЬ |ИЗ | ПраваРолейНаОтчеты КАК ПраваРолей | |ИНДЕКСИРОВАТЬ ПО - | ПраваРолейРасширений.Роль + | Роль |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПраваРолей.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолей.Роль КАК Роль, - | ПраваРолей.Просмотр КАК Просмотр, - | ПраваРолей.Редактирование КАК Редактирование, - | ПраваРолей.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, + | ПраваРолей.ПравоПросмотр КАК ПравоПросмотр, + | ПраваРолей.ПравоРедактирование КАК ПравоРедактирование, + | ПраваРолей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, | ПрофилиГруппДоступаРоли.Ссылка КАК Профиль |ПОМЕСТИТЬ ПраваПрофилей |ИЗ @@ -523,9 +526,9 @@ | ПраваРолей.ОбъектМетаданных, | ПраваРолей.Роль, | ПрофилиГруппДоступаРоли.Ссылка, - | ПраваРолей.ИнтерактивноеДобавление, - | ПраваРолей.Просмотр, - | ПраваРолей.Редактирование + | ПраваРолей.ПравоИнтерактивноеДобавление, + | ПраваРолей.ПравоПросмотр, + | ПраваРолей.ПравоРедактирование | |ИНДЕКСИРОВАТЬ ПО | Профиль @@ -548,9 +551,9 @@ | ГруппыДоступаПользователей.Пользователь КАК Пользователь, | ГруппыДоступаПользователей.ГруппаДоступа КАК ГруппаДоступа, | ПраваПрофилей.ОбъектМетаданных КАК ОбъектМетаданных, - | МАКСИМУМ(ПраваПрофилей.Просмотр) КАК Просмотр, - | МАКСИМУМ(ПраваПрофилей.Редактирование) КАК Редактирование, - | МАКСИМУМ(ПраваПрофилей.ИнтерактивноеДобавление) КАК ИнтерактивноеДобавление, + | МАКСИМУМ(ПраваПрофилей.ПравоПросмотр) КАК ПравоПросмотр, + | МАКСИМУМ(ПраваПрофилей.ПравоРедактирование) КАК ПравоРедактирование, + | МАКСИМУМ(ПраваПрофилей.ПравоИнтерактивноеДобавление) КАК ПравоИнтерактивноеДобавление, | ПраваПрофилей.Профиль КАК Профиль |ПОМЕСТИТЬ ПраваОбъектов |ИЗ @@ -573,7 +576,7 @@ | ПраваОбъектов.Пользователь КАК Пользователь, | ПраваОбъектов.ГруппаДоступа КАК ГруппаДоступа, | ПраваОбъектов.ОбъектМетаданных КАК ОбъектМетаданных, - | ПраваОбъектов.Просмотр КАК Просмотр + | ПраваОбъектов.ПравоПросмотр КАК ПравоПросмотр |ПОМЕСТИТЬ ПраваОтчетов |ИЗ | ПраваОбъектов КАК ПраваОбъектов @@ -591,9 +594,9 @@ | ПраваОбъектов.Пользователь КАК Пользователь, | ПраваОбъектов.ГруппаДоступа КАК ГруппаДоступа, | ПраваОбъектов.ОбъектМетаданных КАК ОбъектМетаданных, - | ПраваОбъектов.Просмотр КАК Просмотр, - | ПраваОбъектов.Редактирование КАК Редактирование, - | ПраваОбъектов.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, + | ПраваОбъектов.ПравоПросмотр КАК ПравоПросмотр, + | ПраваОбъектов.ПравоРедактирование КАК ПравоРедактирование, + | ПраваОбъектов.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, | ТаблицыОтчетов.Отчет КАК Отчет, | ПраваОбъектов.Профиль КАК Профиль |ПОМЕСТИТЬ ПраваОбъектовИСвязанныеОтчеты @@ -615,46 +618,46 @@ | ПраваОбъектовИСвязанныеОтчеты.Пользователь КАК Пользователь, | ПраваОбъектовИСвязанныеОтчеты.ГруппаДоступа КАК ГруппаДоступа, | ПраваОбъектовИСвязанныеОтчеты.ОбъектМетаданных КАК ОбъектМетаданных, - | ПраваОбъектовИСвязанныеОтчеты.Просмотр КАК Просмотр, - | ПраваОбъектовИСвязанныеОтчеты.Редактирование КАК Редактирование, - | ПраваОбъектовИСвязанныеОтчеты.ИнтерактивноеДобавление КАК ИнтерактивноеДобавление, + | ПраваОбъектовИСвязанныеОтчеты.ПравоПросмотр КАК ПравоПросмотр, + | ПраваОбъектовИСвязанныеОтчеты.ПравоРедактирование КАК ПравоРедактирование, + | ПраваОбъектовИСвязанныеОтчеты.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, | ВЫБОР - | КОГДА ПраваОбъектовИСвязанныеОтчеты.ИнтерактивноеДобавление + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоИнтерактивноеДобавление | ТОГДА 3 - | КОГДА ПраваОбъектовИСвязанныеОтчеты.Редактирование + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоРедактирование | ТОГДА 2 - | КОГДА ПраваОбъектовИСвязанныеОтчеты.Просмотр + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоПросмотр | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК Право, | ВЫБОР - | КОГДА ПраваОбъектовИСвязанныеОтчеты.ИнтерактивноеДобавление + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоИнтерактивноеДобавление | ТОГДА &КартинкаСоздание - | КОГДА ПраваОбъектовИСвязанныеОтчеты.Редактирование + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоРедактирование | ТОГДА &КартинкаРедактирование - | КОГДА ПраваОбъектовИСвязанныеОтчеты.Просмотр + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоПросмотр | ТОГДА &КартинкаПросмотр | ИНАЧЕ 0 | КОНЕЦ КАК КартинкаПраво, | ВЫБОР - | КОГДА ПраваОбъектовИСвязанныеОтчеты.Просмотр + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоПросмотр | ТОГДА &КартинкаПросмотр | ИНАЧЕ """" | КОНЕЦ КАК КартинкаПросмотр, | ВЫБОР - | КОГДА ПраваОбъектовИСвязанныеОтчеты.Редактирование + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоРедактирование | ТОГДА &КартинкаРедактирование | ИНАЧЕ """" | КОНЕЦ КАК КартинкаРедактирование, | ВЫБОР - | КОГДА ПраваОбъектовИСвязанныеОтчеты.ИнтерактивноеДобавление + | КОГДА ПраваОбъектовИСвязанныеОтчеты.ПравоИнтерактивноеДобавление | ТОГДА &КартинкаСоздание | ИНАЧЕ """" | КОНЕЦ КАК КартинкаСоздание, | ПраваОбъектовИСвязанныеОтчеты.Отчет КАК Отчет, | ПраваОтчетов.ГруппаДоступа КАК ГруппаДоступаОтчета, | ВЫБОР - | КОГДА ПраваОтчетов.Просмотр + | КОГДА ПраваОтчетов.ПравоПросмотр | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК ПравоОтчета, @@ -715,9 +718,9 @@ | ИНАЧЕ ПраваПользователейСНастроеннымиПравами.ГруппаДоступа | КОНЕЦ КАК ГруппаДоступа, | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.ОбъектМетаданных, ВсеПользователиИОбъекты.ОбъектМетаданных) КАК ОбъектМетаданных, - | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.Просмотр, ЛОЖЬ) КАК Просмотр, - | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.Редактирование, ЛОЖЬ) КАК Редактирование, - | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.ИнтерактивноеДобавление, ЛОЖЬ) КАК ИнтерактивноеДобавление, + | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.ПравоПросмотр, ЛОЖЬ) КАК ПравоПросмотр, + | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.ПравоРедактирование, ЛОЖЬ) КАК ПравоРедактирование, + | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.ПравоИнтерактивноеДобавление, ЛОЖЬ) КАК ПравоИнтерактивноеДобавление, | ЕСТЬNULL(ПраваПользователейСНастроеннымиПравами.Право, 0) КАК Право, | ПраваПользователейСНастроеннымиПравами.КартинкаПраво КАК КартинкаПраво, | ПраваПользователейСНастроеннымиПравами.КартинкаПросмотр КАК КартинкаПросмотр, diff --git a/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs b/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs index f15172f49..e437065b6 100644 --- a/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs +++ b/SSL/src/Reports/АнализПравДоступа/Templates/Макет/Template.dcs @@ -54,8 +54,8 @@
            - ИнтерактивноеДобавление - ИнтерактивноеДобавление + ПравоИнтерактивноеДобавление + ПравоИнтерактивноеДобавление <v8:item> <v8:lang>ru</v8:lang> @@ -67,8 +67,8 @@ </valueType> </field> <field xsi:type="DataSetFieldField"> - <dataPath>Просмотр</dataPath> - <field>Просмотр</field> + <dataPath>ПравоПросмотр</dataPath> + <field>ПравоПросмотр</field> <title xsi:type="v8:LocalStringType"> <v8:item> <v8:lang>ru</v8:lang> @@ -80,8 +80,8 @@ </valueType> </field> <field xsi:type="DataSetFieldField"> - <dataPath>Редактирование</dataPath> - <field>Редактирование</field> + <dataPath>ПравоРедактирование</dataPath> + <field>ПравоРедактирование</field> <title xsi:type="v8:LocalStringType"> <v8:item> <v8:lang>ru</v8:lang> @@ -267,16 +267,16 @@ <expression>Максимум(КартинкаСоздание)</expression> </totalField> <totalField> - <dataPath>Просмотр</dataPath> - <expression>Максимум(Просмотр)</expression> + <dataPath>ПравоПросмотр</dataPath> + <expression>Максимум(ПравоПросмотр)</expression> </totalField> <totalField> - <dataPath>Редактирование</dataPath> - <expression>Максимум(Редактирование)</expression> + <dataPath>ПравоРедактирование</dataPath> + <expression>Максимум(ПравоРедактирование)</expression> </totalField> <totalField> - <dataPath>ИнтерактивноеДобавление</dataPath> - <expression>Максимум(ИнтерактивноеДобавление)</expression> + <dataPath>ПравоИнтерактивноеДобавление</dataPath> + <expression>Максимум(ПравоИнтерактивноеДобавление)</expression> </totalField> <totalField> <dataPath>Право</dataPath> @@ -1948,12 +1948,12 @@ <dcsset:field>КартинкаПросмотр</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Просмотр</dcsset:field> + <dcsset:field>ПравоПросмотр</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Просмотр</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоПросмотр</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -1976,12 +1976,12 @@ <dcsset:field>КартинкаРедактирование</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Редактирование</dcsset:field> + <dcsset:field>ПравоРедактирование</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Редактирование</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоРедактирование</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2004,12 +2004,12 @@ <dcsset:field>КартинкаСоздание</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>ИнтерактивноеДобавление</dcsset:field> + <dcsset:field>ПравоИнтерактивноеДобавление</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">ИнтерактивноеДобавление</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоИнтерактивноеДобавление</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2356,12 +2356,12 @@ <dcsset:field>КартинкаПросмотр</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Просмотр</dcsset:field> + <dcsset:field>ПравоПросмотр</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Просмотр</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоПросмотр</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2379,12 +2379,12 @@ <dcsset:field>КартинкаРедактирование</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Редактирование</dcsset:field> + <dcsset:field>ПравоРедактирование</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Редактирование</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоРедактирование</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2402,12 +2402,12 @@ <dcsset:field>КартинкаСоздание</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>ИнтерактивноеДобавление</dcsset:field> + <dcsset:field>ПравоИнтерактивноеДобавление</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">ИнтерактивноеДобавление</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоИнтерактивноеДобавление</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2469,12 +2469,12 @@ <dcsset:field>КартинкаПросмотр</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Просмотр</dcsset:field> + <dcsset:field>ПравоПросмотр</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Просмотр</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоПросмотр</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2497,12 +2497,12 @@ <dcsset:field>КартинкаРедактирование</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Редактирование</dcsset:field> + <dcsset:field>ПравоРедактирование</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Редактирование</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоРедактирование</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2525,12 +2525,12 @@ <dcsset:field>КартинкаСоздание</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>ИнтерактивноеДобавление</dcsset:field> + <dcsset:field>ПравоИнтерактивноеДобавление</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">ИнтерактивноеДобавление</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоИнтерактивноеДобавление</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2701,7 +2701,7 @@ <dcsset:item> <dcsset:selection> <dcsset:item> - <dcsset:field>Просмотр</dcsset:field> + <dcsset:field>ПравоПросмотр</dcsset:field> </dcsset:item> <dcsset:item> <dcsset:field>КартинкаПросмотр</dcsset:field> @@ -2709,7 +2709,7 @@ </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Просмотр</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоПросмотр</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2724,7 +2724,7 @@ <dcsset:item> <dcsset:selection> <dcsset:item> - <dcsset:field>Редактирование</dcsset:field> + <dcsset:field>ПравоРедактирование</dcsset:field> </dcsset:item> <dcsset:item> <dcsset:field>КартинкаРедактирование</dcsset:field> @@ -2732,7 +2732,7 @@ </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Редактирование</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоРедактирование</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2747,7 +2747,7 @@ <dcsset:item> <dcsset:selection> <dcsset:item> - <dcsset:field>ИнтерактивноеДобавление</dcsset:field> + <dcsset:field>ПравоИнтерактивноеДобавление</dcsset:field> </dcsset:item> <dcsset:item> <dcsset:field>КартинкаСоздание</dcsset:field> @@ -2755,7 +2755,7 @@ </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">ИнтерактивноеДобавление</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоИнтерактивноеДобавление</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2770,7 +2770,7 @@ <dcsset:item> <dcsset:selection> <dcsset:item> - <dcsset:field>Просмотр</dcsset:field> + <dcsset:field>ПравоПросмотр</dcsset:field> </dcsset:item> <dcsset:item> <dcsset:field>КартинкаПросмотр</dcsset:field> @@ -2778,7 +2778,7 @@ </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Просмотр</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоПросмотр</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2798,7 +2798,7 @@ <dcsset:item> <dcsset:selection> <dcsset:item> - <dcsset:field>Редактирование</dcsset:field> + <dcsset:field>ПравоРедактирование</dcsset:field> </dcsset:item> <dcsset:item> <dcsset:field>КартинкаРедактирование</dcsset:field> @@ -2806,7 +2806,7 @@ </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Редактирование</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоРедактирование</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -2826,7 +2826,7 @@ <dcsset:item> <dcsset:selection> <dcsset:item> - <dcsset:field>ИнтерактивноеДобавление</dcsset:field> + <dcsset:field>ПравоИнтерактивноеДобавление</dcsset:field> </dcsset:item> <dcsset:item> <dcsset:field>КартинкаСоздание</dcsset:field> @@ -2834,7 +2834,7 @@ </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">ИнтерактивноеДобавление</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоИнтерактивноеДобавление</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -3894,12 +3894,12 @@ <dcsset:field>КартинкаПросмотр</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Просмотр</dcsset:field> + <dcsset:field>ПравоПросмотр</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Просмотр</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоПросмотр</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -3922,12 +3922,12 @@ <dcsset:field>КартинкаРедактирование</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>Редактирование</dcsset:field> + <dcsset:field>ПравоРедактирование</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">Редактирование</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоРедактирование</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> @@ -3950,12 +3950,12 @@ <dcsset:field>КартинкаСоздание</dcsset:field> </dcsset:item> <dcsset:item> - <dcsset:field>ИнтерактивноеДобавление</dcsset:field> + <dcsset:field>ПравоИнтерактивноеДобавление</dcsset:field> </dcsset:item> </dcsset:selection> <dcsset:filter> <dcsset:item xsi:type="dcsset:FilterItemComparison"> - <dcsset:left xsi:type="dcscor:Field">ИнтерактивноеДобавление</dcsset:left> + <dcsset:left xsi:type="dcscor:Field">ПравоИнтерактивноеДобавление</dcsset:left> <dcsset:comparisonType>Equal</dcsset:comparisonType> <dcsset:right xsi:type="xs:boolean">true</dcsset:right> </dcsset:item> diff --git a/SSL/src/Reports/ДвиженияДокумента/ObjectModule.bsl b/SSL/src/Reports/ДвиженияДокумента/ObjectModule.bsl index 747d78ca4..e18603c3b 100644 --- a/SSL/src/Reports/ДвиженияДокумента/ObjectModule.bsl +++ b/SSL/src/Reports/ДвиженияДокумента/ObjectModule.bsl @@ -1526,7 +1526,9 @@ Процедура УстановитьУсловноеОформление(Настройки) ЭлементыОформления = Настройки.УсловноеОформление.Элементы; + ОформитьОтрицательныеЧисла(ЭлементыОформления); + ОформитьРесурсы(Настройки); Если СвойстваРегистров.Найти("Остатки", "ВидРегистраНакопления") = Неопределено Тогда Возврат; @@ -1587,6 +1589,96 @@ КонецПроцедуры +Процедура ОформитьРесурсы(Настройки) + + Для Каждого СвойстваРегистра Из СвойстваРегистров Цикл + + ФорматыРесурсов = СвойстваРегистра.ФорматыРесурсов; + + Если ФорматыРесурсов.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ДетальныеЗаписиРегистра = ДетальныеЗаписиРегистра(Настройки, СвойстваРегистра); + + Если ДетальныеЗаписиРегистра = Неопределено Тогда + Продолжить; + КонецЕсли; + + ЭлементыОформления = ДетальныеЗаписиРегистра.УсловноеОформление.Элементы; + + Для Каждого ФорматРесурса Из ФорматыРесурсов Цикл + + Элемент = ЭлементыОформления.Добавить(); + + Для Каждого Ресурс Из ФорматРесурса.Значение Цикл + + ОформляемоеПоле = Элемент.Поля.Элементы.Добавить(); + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Ресурс); + + КонецЦикла; + + Элемент.Оформление.УстановитьЗначениеПараметра("Формат", ФорматРесурса.Ключ); + + Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; + Элемент.Использование = Истина; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +Функция ДетальныеЗаписиРегистра(Настройки, СвойстваРегистра, ЭлементыСтруктуры = Неопределено, ДетальныеЗаписиРегистра = Неопределено) + + Если ЭлементыСтруктуры = Неопределено Тогда + + ГруппировкаРегистра = ГруппировкаРегистра(Настройки.Структура, СвойстваРегистра); + + Если ГруппировкаРегистра = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ЭлементыСтруктуры = ГруппировкаРегистра.Структура; + + КонецЕсли; + + Для Каждого ЭлементСтруктуры Из ЭлементыСтруктуры Цикл + + Если ТипЗнч(ЭлементСтруктуры) <> Тип("ГруппировкаКомпоновкиДанных") Тогда + Продолжить; + КонецЕсли; + + Если ЭлементСтруктуры.ПоляГруппировки.Элементы.Количество() = 0 Тогда + ДетальныеЗаписиРегистра = ЭлементСтруктуры; + Иначе + ДетальныеЗаписиРегистра(Настройки, СвойстваРегистра, ЭлементСтруктуры.Структура, ДетальныеЗаписиРегистра); + КонецЕсли; + + КонецЦикла; + + Возврат ДетальныеЗаписиРегистра; + +КонецФункции + +Функция ГруппировкаРегистра(ЭлементыСтруктуры, СвойстваРегистра) + + Для Каждого ЭлементСтруктуры Из ЭлементыСтруктуры Цикл + + Если ТипЗнч(ЭлементСтруктуры) <> Тип("ГруппировкаКомпоновкиДанных") Тогда + Продолжить; + КонецЕсли; + + Если ЭлементСтруктуры.Имя = СвойстваРегистра.ИмяГруппировки Тогда + Возврат ЭлементСтруктуры; + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + #КонецОбласти #Область ПолучениеСвойствРегистров @@ -1650,6 +1742,8 @@ ЗаголовокТаблицы = СвойстваРегистра.ПредставлениеВидаРегистра + " """ + СвойстваРегистра.ПредставлениеРегистра + """"; СвойстваРегистра.ЗаголовокТаблицы = ВРег(ЗаголовокТаблицы); + ОпределитьФорматыРесурсов(МетаданныеРегистра, СвойстваРегистра); + КонецЦикла; СвойстваРегистров.Сортировать("Приоритет, ПредставлениеРегистра"); @@ -1717,6 +1811,7 @@ // * ИмяПоляРегистратора - Строка // * КоличествоЗаписей - Число // * ЗаголовокТаблицы - Строка +// * ФорматыРесурсов - Соответствие // Функция ПалитраСвойствРегистров() @@ -1724,6 +1819,7 @@ ОписаниеЧисла = Новый ОписаниеТипов("Число"); ОписаниеСтроки = Новый ОписаниеТипов("Строка"); + ОписаниеСоответствия = Новый ОписаниеТипов("Соответствие"); ПалитраСвойствРегистров.Колонки.Добавить("Приоритет", ОписаниеЧисла); ПалитраСвойствРегистров.Колонки.Добавить("ПолноеИмяРегистра", ОписаниеСтроки); @@ -1739,11 +1835,52 @@ ПалитраСвойствРегистров.Колонки.Добавить("ИмяПоляРегистратора", ОписаниеСтроки); ПалитраСвойствРегистров.Колонки.Добавить("КоличествоЗаписей", ОписаниеЧисла); ПалитраСвойствРегистров.Колонки.Добавить("ЗаголовокТаблицы", ОписаниеСтроки); + ПалитраСвойствРегистров.Колонки.Добавить("ФорматыРесурсов", ОписаниеСоответствия); Возврат ПалитраСвойствРегистров; КонецФункции +Процедура ОпределитьФорматыРесурсов(МетаданныеРегистра, СвойстваРегистра) + + ШаблонФорматаРесурса = "ЧЦ=%1; ЧДЦ=%2; ЧРГ=' '"; + ЭтоРегистрБухгалтерии = ОбщегоНазначения.ЭтоРегистрБухгалтерии(МетаданныеРегистра); + + Для Каждого Ресурс Из МетаданныеРегистра.Ресурсы Цикл + + ТипРесурса = Ресурс.Тип; + + Если Не ТипРесурса.СодержитТип(Тип("Число")) Тогда + Продолжить; + КонецЕсли; + + КвалификаторыРесурса = ТипРесурса.КвалификаторыЧисла; + + ФорматРесурса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонФорматаРесурса, КвалификаторыРесурса.Разрядность, КвалификаторыРесурса.РазрядностьДробнойЧасти); + + РесурсыФормата = СвойстваРегистра.ФорматыРесурсов[ФорматРесурса]; + + Если РесурсыФормата = Неопределено Тогда + РесурсыФормата = Новый Массив; + КонецЕсли; + + Если ЭтоРегистрБухгалтерии + И МетаданныеРегистра.Корреспонденция + И Не Ресурс.Балансовый Тогда + + РесурсыФормата.Добавить(Ресурс.Имя + "Дт"); + РесурсыФормата.Добавить(Ресурс.Имя + "Кт"); + Иначе + РесурсыФормата.Добавить(Ресурс.Имя); + КонецЕсли; + + СвойстваРегистра.ФорматыРесурсов.Вставить(ФорматРесурса, РесурсыФормата); + + КонецЦикла; + +КонецПроцедуры + #КонецОбласти #Область ФормированиеПримечаний @@ -2005,7 +2142,7 @@ Если ЗначениеЗаполнено(ТекстЗапроса) Тогда ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "%1 ОБЪЕДИНИТЬ ВСЕ %2", ТекстЗапроса, СтрЗаменить(ТекстЗапросаШаблон, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ")); + "%1 ОБЪЕДИНИТЬ ВСЕ %2", ТекстЗапроса, СтрЗаменить(ТекстЗапросаШаблон, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ")); // @query-part-2 @query-part-3 для этого случая Иначе ТекстЗапроса = ТекстЗапросаШаблон; diff --git a/SSL/src/Reports/ИспользуемыеВнешниеРесурсы/ManagerModule.bsl b/SSL/src/Reports/ИспользуемыеВнешниеРесурсы/ManagerModule.bsl index 7a7b94f11..021d82d37 100644 --- a/SSL/src/Reports/ИспользуемыеВнешниеРесурсы/ManagerModule.bsl +++ b/SSL/src/Reports/ИспользуемыеВнешниеРесурсы/ManagerModule.bsl @@ -235,6 +235,7 @@ // Процедура СформироватьПредставлениеОпераций(ТабличныйДокумент, Знач Макет, Знач ОперацииАдминистрирования) + КартинкаУдалить = БиблиотекаКартинок.Удалить; Для Каждого Описание Из ОперацииАдминистрирования Цикл Если Описание.Операция = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Удаление Тогда @@ -266,10 +267,8 @@ Если Не ЭтоПрофильКонфигурации Тогда Область.Параметры["ПрограммныйМодуль"] = ПрограммныйМодуль; КонецЕсли; - Область.Параметры["Пиктограмма"] = БиблиотекаКартинок.Удалить; - + Область.Параметры["Пиктограмма"] = КартинкаУдалить; ТабличныйДокумент.Вывести(Область); - ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; diff --git a/SSL/src/Reports/ОбъемНенужныхФайлов/ObjectModule.bsl b/SSL/src/Reports/ОбъемНенужныхФайлов/ObjectModule.bsl index c853dfed9..26c975aa7 100644 --- a/SSL/src/Reports/ОбъемНенужныхФайлов/ObjectModule.bsl +++ b/SSL/src/Reports/ОбъемНенужныхФайлов/ObjectModule.bsl @@ -97,12 +97,6 @@ КонецПроцедуры -Функция ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение) - - Возврат РаботаСФайламиСлужебный.ТекстЗапросаДляОчисткиФайлов(ВладелецФайла, Настройка, МассивИсключений, ЭлементИсключение, Истина); - -КонецФункции - Функция ВыбратьДанныеПоПравилу(НастройкаОчистки, МассивИсключений) ВременныйКомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; @@ -134,11 +128,8 @@ ЭлементИсключение = Неопределено; КонецЕсли; - ВременнаяСхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаДляОчисткиФайлов( - ВладелецФайла, - НастройкаОчистки, - МассивИсключений, - ЭлементИсключение); + ВременнаяСхемаКомпоновкиДанных.НаборыДанных[0].Запрос = РаботаСФайламиСлужебный.ТекстЗапросаДляОчисткиФайлов( + ВладелецФайла, НастройкаОчистки, МассивИсключений, ЭлементИсключение); Структура = ВременныйКомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); diff --git a/SSL/src/Reports/ОценкаПроизводительности/ManagerModule.bsl b/SSL/src/Reports/ОценкаПроизводительности/ManagerModule.bsl index da94a87a5..b5d9f3f56 100644 --- a/SSL/src/Reports/ОценкаПроизводительности/ManagerModule.bsl +++ b/SSL/src/Reports/ОценкаПроизводительности/ManagerModule.bsl @@ -24,15 +24,15 @@ Если ВариантыОтчетовСуществует Тогда МодульВариантыОтчетов = ОценкаПроизводительностиСлужебный.ОбщийМодуль("ВариантыОтчетов"); - НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ОценкаПроизводительностиПоКлючевымОперациям"); + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ОценкаПроизводительностиПоКлючевымОперациям"); // см. ВариантыОтчетов.ОписаниеВарианта НастройкиВарианта.Описание = НСтр("ru = 'Предоставляет информацию об оценке производительности'"); - НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "СравнениеОценкиПроизводительности"); + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "СравнениеОценкиПроизводительности"); // см. ВариантыОтчетов.ОписаниеВарианта НастройкиВарианта.Описание = НСтр("ru = 'Предоставляет информацию о сравнении оценки производительности за период'"); - НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ОценкаПроизводительностиПериодВКолонках"); + НастройкиВарианта = МодульВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "ОценкаПроизводительностиПериодВКолонках"); // см. ВариантыОтчетов.ОписаниеВарианта НастройкиВарианта.Описание = НСтр("ru = 'Предоставляет информацию об оценке производительности в разрезе периодов. Периоды представлены в колонках'"); КонецЕсли; diff --git a/SSL/src/Reports/ОценкаПроизводительности/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/Reports/ОценкаПроизводительности/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs index e60fff221..03262f33c 100644 --- a/SSL/src/Reports/ОценкаПроизводительности/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs +++ b/SSL/src/Reports/ОценкаПроизводительности/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -495,11 +495,11 @@ ЕСТЬNULL(ЗамерыТекущие.ВыполненСОшибкой, ЗамерыПредыдущие.ВыполненСОшибкой) КАК ВыполненСОшибкой ИЗ ЗамерыТекущие КАК ЗамерыТекущие - {ЛЕВОЕ СОЕДИНЕНИЕ} ЗамерыПредыдущие КАК ЗамерыПредыдущие + {ЛЕВОЕ СОЕДИНЕНИЕ ЗамерыПредыдущие КАК ЗамерыПредыдущие ПО (ЗамерыПредыдущие.ПериодЗамера = ЗамерыТекущие.ПериодЗамера) И (ЗамерыПредыдущие.КлючеваяОперация = ЗамерыТекущие.КлючеваяОперация) И (ЗамерыПредыдущие.Пользователь = ЗамерыТекущие.Пользователь) - И (ЗамерыПредыдущие.ВыполненСОшибкой = ЗамерыТекущие.ВыполненСОшибкой)</query> + И (ЗамерыПредыдущие.ВыполненСОшибкой = ЗамерыТекущие.ВыполненСОшибкой)}</query> </dataSet> <calculatedField> <dataPath>APDEX</dataPath> diff --git a/SSL/src/Reports/ПраваДоступа/Forms/ФормаОтчета/Module.bsl b/SSL/src/Reports/ПраваДоступа/Forms/ФормаОтчета/Module.bsl index 9218b05df..11fa74f94 100644 --- a/SSL/src/Reports/ПраваДоступа/Forms/ФормаОтчета/Module.bsl +++ b/SSL/src/Reports/ПраваДоступа/Forms/ФормаОтчета/Module.bsl @@ -142,14 +142,14 @@ "ВЫБРАТЬ | ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных, | ПраваРолейРасширений.Роль КАК Роль, - | ПраваРолейРасширений.Добавление КАК ПравоДобавление, - | ПраваРолейРасширений.Изменение КАК ПравоИзменение, - | ПраваРолейРасширений.ЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, - | ПраваРолейРасширений.ДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, - | ПраваРолейРасширений.ИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, - | ПраваРолейРасширений.Просмотр КАК ПравоПросмотр, - | ПраваРолейРасширений.ИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, - | ПраваРолейРасширений.Редактирование КАК ПравоРедактирование, + | ПраваРолейРасширений.ПравоДобавление КАК ПравоДобавление, + | ПраваРолейРасширений.ПравоИзменение КАК ПравоИзменение, + | ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения, + | ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения, + | ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения, + | ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр, + | ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление, + | ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование, | ПраваРолейРасширений.ВидИзмененияСтроки КАК ВидИзмененияСтроки |ПОМЕСТИТЬ ПраваРолейРасширений |ИЗ @@ -179,14 +179,14 @@ |ВЫБРАТЬ | ПраваРолей.ОбъектМетаданных, | ПраваРолей.Роль, - | ПраваРолей.Добавление, - | ПраваРолей.Изменение, - | ПраваРолей.ЧтениеБезОграничения, - | ПраваРолей.ДобавлениеБезОграничения, - | ПраваРолей.ИзменениеБезОграничения, - | ПраваРолей.Просмотр, - | ПраваРолей.ИнтерактивноеДобавление, - | ПраваРолей.Редактирование + | ПраваРолей.ПравоДобавление, + | ПраваРолей.ПравоИзменение, + | ПраваРолей.ПравоЧтениеБезОграничения, + | ПраваРолей.ПравоДобавлениеБезОграничения, + | ПраваРолей.ПравоИзменениеБезОграничения, + | ПраваРолей.ПравоПросмотр, + | ПраваРолей.ПравоИнтерактивноеДобавление, + | ПраваРолей.ПравоРедактирование |ИЗ | РегистрСведений.ПраваРолей КАК ПраваРолей | ЛЕВОЕ СОЕДИНЕНИЕ ПраваРолейРасширений КАК ПраваРолейРасширений diff --git a/SSL/src/Reports/РезультатыПроверкиУчета/Forms/АвтоисправлениеПроблемы/Module.bsl b/SSL/src/Reports/РезультатыПроверкиУчета/Forms/АвтоисправлениеПроблемы/Module.bsl index 50f9a2468..40842ce4f 100644 --- a/SSL/src/Reports/РезультатыПроверкиУчета/Forms/АвтоисправлениеПроблемы/Module.bsl +++ b/SSL/src/Reports/РезультатыПроверкиУчета/Forms/АвтоисправлениеПроблемы/Module.bsl @@ -189,11 +189,27 @@ Если РезультатЗапроса.Пустой() Тогда Продолжить; КонецЕсли; - РезультатЗапроса = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка");// Массив из ЛюбаяСсылка + РезультатЗапроса = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка"); // Массив из ЛюбаяСсылка Ссылка = РезультатЗапроса[0]; - Объект = Ссылка.ПолучитьОбъект(); - Объект.ИмяПредопределенныхДанных = Свойство.ИмяПредопределенныхДанных; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(Ссылка.Метаданные().ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Ссылка); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + Объект = Ссылка.ПолучитьОбъект(); + Объект.ИмяПредопределенныхДанных = Свойство.ИмяПредопределенныхДанных; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЦикла; КонецЕсли; КонецЦикла; @@ -239,7 +255,8 @@ Для Каждого Строка Из ПредопределенныеВДанных Цикл Объект = Строка.Ссылка.ПолучитьОбъект(); Объект.ИмяПредопределенныхДанных = ""; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + // Конкурентной работы с некорректным предопределенным элементом не ожидается. + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); // АПК:1327 КонецЦикла; Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); Менеджер.УстановитьИнициализациюПредопределенныхДанных(Ложь); diff --git a/SSL/src/Reports/РезультатыПроверкиУчета/ManagerModule.bsl b/SSL/src/Reports/РезультатыПроверкиУчета/ManagerModule.bsl index 7d72a119f..6a7aa15a3 100644 --- a/SSL/src/Reports/РезультатыПроверкиУчета/ManagerModule.bsl +++ b/SSL/src/Reports/РезультатыПроверкиУчета/ManagerModule.bsl @@ -40,13 +40,13 @@ КонецПроцедуры // См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов -Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, НастройкиФормы, СтандартнаяОбработка) Экспорт +Процедура ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт Если Не ПравоДоступа("Просмотр", Метаданные.Отчеты.РезультатыПроверкиУчета) Тогда Возврат; КонецЕсли; - Если Не СтрНачинаетсяС(НастройкиФормы.ИмяФормы, Метаданные.Справочники.ПравилаПроверкиУчета.ПолноеИмя()) Тогда + Если Не СтрНачинаетсяС(Параметры.ИмяФормы, Метаданные.Справочники.ПравилаПроверкиУчета.ПолноеИмя()) Тогда Возврат; КонецЕсли; diff --git a/SSL/src/Reports/РезультатыПроверкиУчета/ObjectModule.bsl b/SSL/src/Reports/РезультатыПроверкиУчета/ObjectModule.bsl index a44ab4139..94807c4b0 100644 --- a/SSL/src/Reports/РезультатыПроверкиУчета/ObjectModule.bsl +++ b/SSL/src/Reports/РезультатыПроверкиУчета/ObjectModule.bsl @@ -366,28 +366,18 @@ ШиринаТаблицы = ДокументРезультат.ШиринаТаблицы; ВысотаТаблицы = ДокументРезультат.ВысотаТаблицы; + СтруктураЛокализованныхПараметров = СтруктураЛокализованныхПараметров(); + Для ИндексСтрок = 1 По ВысотаТаблицы Цикл - Для ИндексКолонок = 1 По ШиринаТаблицы Цикл - - ИмяОбласти = "R" + Формат(ИндексСтрок, "ЧГ=0") + "C" + Формат(ИндексКолонок, "ЧГ=0"); - Область = ДокументРезультат.Область(ИмяОбласти); - - Если СокрЛП(ВРег(Область.Текст)) = НСтр("ru = 'ИТОГО'") Тогда - Область.ЦветФона = ЦветаСтиля.ЦветФонаПодсказки; - Прервать; - КонецЕсли; - - КонецЦикла; - ИмяОбласти = "R" + Формат(ИндексСтрок, "ЧГ=0") + "C1"; Область = ДокументРезультат.Область(ИмяОбласти); ТекстОбласти = СокрЛП(ВРег(Область.Текст)); - Если ТекстОбласти = НСтр("ru = 'ОШИБКА'") - Или ТекстОбласти = НСтр("ru = 'ВОЗМОЖНЫЕ ПРИЧИНЫ'") - Или ТекстОбласти = НСтр("ru = 'РЕКОМЕНДАЦИИ'") - Или ТекстОбласти = НСтр("ru = 'РЕШЕНИЕ'") Тогда + Если ТекстОбласти = ВРег(СтруктураЛокализованныхПараметров.НадписьОшибка) + Или ТекстОбласти = ВРег(СтруктураЛокализованныхПараметров.НадписьВозможныеПричины) + Или ТекстОбласти = ВРег(СтруктураЛокализованныхПараметров.НадписьРекомендации) + Или ТекстОбласти = ВРег(СтруктураЛокализованныхПараметров.НадписьРешение) Тогда Для ИндексКолонок = 3 По ШиринаТаблицы Цикл ИмяОбластиРесурсов = "R" + Формат(ИндексСтрок, "ЧГ=0") + "C" + Формат(ИндексКолонок, "ЧГ=0"); @@ -579,12 +569,7 @@ ПараметрыДанных = НастройкиКД.ПараметрыДанных.Элементы; - СтруктураЛокализованныхПараметров = Новый Структура; - СтруктураЛокализованныхПараметров.Вставить("НадписьОшибка", НСтр("ru = 'Ошибка'")); - СтруктураЛокализованныхПараметров.Вставить("НадписьВозможныеПричины", НСтр("ru = 'Возможные причины'")); - СтруктураЛокализованныхПараметров.Вставить("НадписьРекомендации", НСтр("ru = 'Рекомендации'")); - СтруктураЛокализованныхПараметров.Вставить("НадписьРешение", НСтр("ru = 'Решение'")); - СтруктураЛокализованныхПараметров.Вставить("НадписьПроблемныеОбъекты", НСтр("ru = 'Проблемные объекты'")); + СтруктураЛокализованныхПараметров = СтруктураЛокализованныхПараметров(); Для Каждого ЭлементСтруктуры Из СтруктураЛокализованныхПараметров Цикл @@ -603,6 +588,19 @@ КонецПроцедуры +Функция СтруктураЛокализованныхПараметров() + + СтруктураЛокализованныхПараметров = Новый Структура; + СтруктураЛокализованныхПараметров.Вставить("НадписьОшибка", НСтр("ru = 'Ошибка'")); + СтруктураЛокализованныхПараметров.Вставить("НадписьВозможныеПричины", НСтр("ru = 'Возможные причины'")); + СтруктураЛокализованныхПараметров.Вставить("НадписьРекомендации", НСтр("ru = 'Рекомендации'")); + СтруктураЛокализованныхПараметров.Вставить("НадписьРешение", НСтр("ru = 'Решение'")); + СтруктураЛокализованныхПараметров.Вставить("НадписьПроблемныеОбъекты", НСтр("ru = 'Проблемные объекты'")); + + Возврат СтруктураЛокализованныхПараметров; + +КонецФункции + Процедура УстановитьОтборПоСпискуПроблем(ОтборНастроекКД, ПользовательскиеНастройки, ЗначениеОтбора) ПредставлениеОтбора = ""; diff --git a/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/Help/ru.html b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/Help/ru.html new file mode 100644 index 000000000..e126c26be --- /dev/null +++ b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/Help/ru.html @@ -0,0 +1,2 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link></head><body>Служебный отчет, отображает данные об активной учетной записи облачной подписи, полученные с сервиса облачной подписи в момент авторизации пользователя. +<div><br></div></body></html> \ No newline at end of file diff --git a/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/ManagerModule.bsl b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/ManagerModule.bsl new file mode 100644 index 000000000..bc465e105 --- /dev/null +++ b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/ManagerModule.bsl @@ -0,0 +1,419 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ВариантыОтчетов + +// Параметры: +// Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки. +// НастройкиОтчета - см. ВариантыОтчетов.ОписаниеОтчета. +// +Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт + + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.УстановитьРежимВыводаВПанеляхОтчетов(Настройки, НастройкиОтчета, Ложь); + + НастройкиОтчета.ОпределитьНастройкиФормы = Истина; + +КонецПроцедуры + +// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. +Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт + + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СостояниеУчетнойЗаписиDSS); + МодульВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.СостояниеУчетнойЗаписиDSS).Включен = Ложь; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ВариантыОтчетов + +#КонецОбласти + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность + +// Формирует данные об активной учетной записи облачной подписи. Данные могут использоваться для формирования отчета +// или технологических данных. +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +// Возвращаемое значение: +// Структура: +// * Таблицы - Структура: +// ** ОсновныеДанные - ТаблицаЗначений +// ** ПараметрыПодключения - ТаблицаЗначений +// ** СписокОпераций - ТаблицаЗначений +// ** Сертификаты - ТаблицаЗначений +// ** ТипыПодписи - ТаблицаЗначений +// ** УдостоверяющиеЦентры - ТаблицаЗначений +// ** Криптопровайдеры - ТаблицаЗначений +// ** УдостоверяющиеЦентры - ТаблицаЗначений +// +Функция СформироватьДанныеСостоянияУчетнойЗаписи(НастройкиПользователя) Экспорт + + ВсеТаблицы = Новый Структура; + Если НастройкиПользователя = Неопределено Тогда + ВсеТаблицы.Вставить("ОсновныеДанные", ТаблицаОсновныеДанные()); + ВсеТаблицы.Вставить("ПараметрыПодключения", ТаблицаПараметрыПодключения()); + ВсеТаблицы.Вставить("СписокОпераций", ТаблицаСписокОпераций()); + ВсеТаблицы.Вставить("Сертификаты", ТаблицаСписокСертификатов()); + ВсеТаблицы.Вставить("СерверыШтамповВремени", ТаблицаСерверовШтамповВремени()); + ВсеТаблицы.Вставить("ТипыПодписи", ТаблицаСписокТиповПодписи()); + ВсеТаблицы.Вставить("УдостоверяющиеЦентры", ТаблицаСписокУдостоверяющихЦентров()); + ВсеТаблицы.Вставить("Криптопровайдеры", ТаблицаСписокКриптопровайдеров()); + Иначе + ВсеТаблицы.Вставить("ОсновныеДанные", ЗаполнитьОсновныеДанные(НастройкиПользователя)); + ВсеТаблицы.Вставить("ПараметрыПодключения", ЗаполнитьПараметрыПодключения(НастройкиПользователя)); + ВсеТаблицы.Вставить("СписокОпераций", ЗаполнитьСписокОпераций(НастройкиПользователя)); + ВсеТаблицы.Вставить("Сертификаты", ЗаполнитьСписокСертификатов(НастройкиПользователя)); + ВсеТаблицы.Вставить("СерверыШтамповВремени", ЗаполнитьСписокСерверовШтамповВремени(НастройкиПользователя)); + ВсеТаблицы.Вставить("ТипыПодписи", ЗаполнитьСписокТиповПодписей(НастройкиПользователя)); + ВсеТаблицы.Вставить("УдостоверяющиеЦентры", ЗаполнитьСписокУдостоверяющихЦентров(НастройкиПользователя)); + ВсеТаблицы.Вставить("Криптопровайдеры", ЗаполнитьСписокКриптопровайдеров(НастройкиПользователя)); + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("Таблицы", ВсеТаблицы); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПростойТип(Вид, ДлинаОбщая = 0, Знаков = 0) + + Результат = Неопределено; + + Если Вид = "Строка" Тогда + Результат = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(ДлинаОбщая)); + ИначеЕсли Вид = "Булево" Тогда + Результат = Новый ОписаниеТипов("Булево"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьЗакрытыеДанные(НастройкиПользователя, ОписаниеДанных) + + Результат = СервисКриптографииDSSСлужебный.ПолучитьЗакрытыеДанные(НастройкиПользователя.УникальныйИдентификатор, ОписаниеДанных); + Возврат Результат; + +КонецФункции + +Функция ДобавитьЗаголовок(ТаблицаДанных, ЗаголовокСтроки, ЗначениеСтроки) + + Результат = Неопределено; + + Если ЗначениеЗаполнено(ЗначениеСтроки) Тогда + Результат = ТаблицаДанных.Добавить(); + Результат.Заголовок = ЗаголовокСтроки + ":"; + Результат.Значение = СокрЛП(ЗначениеСтроки); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ТаблицаОсновныеДанные() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Заголовок", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("Значение", ПростойТип("Строка")); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ТаблицаПараметрыПодключения() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Заголовок", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("Значение", ПростойТип("Строка")); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ТаблицаСписокОпераций() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Имя", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("Подтверждать", ПростойТип("Строка")); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ТаблицаСписокСертификатов() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("ОбщееИмя", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("Отпечаток", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("ДатаНачала", ПростойТип("Дата")); + ТаблицаДанных.Колонки.Добавить("ДатаОкончания", ПростойТип("Дата")); + ТаблицаДанных.Колонки.Добавить("Просрочен", ПростойТип("Булево")); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ТаблицаСерверовШтамповВремени() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Имя", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("Адрес", ПростойТип("Строка")); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ТаблицаСписокТиповПодписи() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Имя", ПростойТип("Строка")); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ТаблицаСписокУдостоверяющихЦентров() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Имя", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("Идентификатор", ПростойТип("Строка")); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ТаблицаСписокКриптопровайдеров() + + ТаблицаДанных = Новый ТаблицаЗначений; + ТаблицаДанных.Колонки.Добавить("Имя", ПростойТип("Строка")); + ТаблицаДанных.Колонки.Добавить("Идентификатор", ПростойТип("Строка", 36)); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ЗаполнитьОсновныеДанные(НастройкиПользователя) + + ТаблицаДанных = ТаблицаОсновныеДанные(); + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + СертификатАутентификации = ЗначениеЗаполнено(ПолучитьЗакрытыеДанные(НастройкиПользователя, "СертификатАвторизации")); + + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Учетная запись'", КодЯзыка), НастройкиПользователя.Ссылка); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Способ авторизации'", КодЯзыка), НастройкиПользователя.ПервичнаяАутентификация); + + Если НастройкиПользователя.ПервичнаяАутентификация = Перечисления.СпособыАвторизацииDSS.Первичный_СертификатАвторизации Тогда + ДобавитьЗаголовок(ТаблицаДанных, + НСтр("ru = 'Сертификат авторизации'", КодЯзыка), + ?(СертификатАутентификации, НСтр("ru = 'Не указан'", КодЯзыка), НСтр("ru = 'В безопасном хранилище'", КодЯзыка))); + КонецЕсли; + + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Телефон'", КодЯзыка), СервисКриптографииDSSКлиентСервер.ПредставлениеТелефона(НастройкиПользователя.Телефон)); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Электронная почта'", КодЯзыка), СервисКриптографииDSSКлиентСервер.ПредставлениеАдресаПочты(НастройкиПользователя.ЭлектроннаяПочта)); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Срок действия маркера'", КодЯзыка), НастройкиПользователя.ТокенАвторизации.СрокДействия); + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ЗаполнитьПараметрыПодключения(НастройкиПользователя) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + ТаблицаДанных = ТаблицаПараметрыПодключения(); + + Если НЕ СервисКриптографииDSSСлужебный.ПроверитьПраво("ЭкземплярыСервераDSS") Тогда + Возврат ТаблицаДанных; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ЭкземплярыСервераDSS.АдресСервера КАК АдресСервера, + | ЭкземплярыСервераDSS.СервисИдентификации КАК СервисИдентификации, + | ЭкземплярыСервераDSS.СервисПодписи КАК СервисПодписи, + | ЭкземплярыСервераDSS.СервисПроверки КАК СервисПроверки, + | ЭкземплярыСервераDSS.СервисАудита КАК СервисАудита, + | ЭкземплярыСервераDSS.СервисОбработкиДокументов КАК СервисОбработкиДокументов, + | ЭкземплярыСервераDSS.ИдентификаторЦИ КАК ИдентификаторЦИ, + | ЭкземплярыСервераDSS.ИдентификаторСЭП КАК ИдентификаторСЭП, + | ЭкземплярыСервераDSS.АдресЛичногоКабинета КАК АдресЛичногоКабинета, + | ЭкземплярыСервераDSS.ТаймАут КАК ТаймАут, + | ЭкземплярыСервераDSS.ВерсияАПИ КАК ВерсияАПИ + |ИЗ + | Справочник.УчетныеЗаписиDSS КАК УчетныеЗаписиDSS + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ЭкземплярыСервераDSS КАК ЭкземплярыСервераDSS + | ПО УчетныеЗаписиDSS.Владелец = ЭкземплярыСервераDSS.Ссылка + |ГДЕ + | УчетныеЗаписиDSS.Ссылка = &УчетнаяЗапись"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("УчетнаяЗапись", НастройкиПользователя.Ссылка); + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Следующий() Тогда + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Сервер'", КодЯзыка), Выборка.АдресСервера); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Сервер ЦИ'", КодЯзыка), Выборка.СервисИдентификации); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Сервер СЭП'", КодЯзыка), Выборка.СервисПодписи); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Сервер проверки'", КодЯзыка), Выборка.СервисПроверки); + Если ЗначениеЗаполнено(Выборка.СервисАудита) Тогда + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Сервер аудита'", КодЯзыка), Выборка.СервисАудита); + КонецЕсли; + Если ЗначениеЗаполнено(Выборка.СервисОбработкиДокументов) Тогда + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Сервер обработки документов'", КодЯзыка), Выборка.СервисОбработкиДокументов); + КонецЕсли; + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Идентификатор ЦИ'", КодЯзыка), Выборка.ИдентификаторЦИ); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Идентификатор СЭП'", КодЯзыка), Выборка.ИдентификаторСЭП); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Личный кабинет'", КодЯзыка), Выборка.АдресЛичногоКабинета); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Тайм-аут'", КодЯзыка), Выборка.ТаймАут); + ДобавитьЗаголовок(ТаблицаДанных, НСтр("ru = 'Версия АПИ'", КодЯзыка), Выборка.ВерсияАПИ); + КонецЕсли; + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ЗаполнитьСписокОпераций(НастройкиПользователя) + + КодЯзыка = СервисКриптографииDSSСлужебный.КодЯзыка(); + // "ru = 'Список подтверждаемых операций'" + + ТаблицаДанных = ТаблицаСписокОпераций(); + + ПредставлениеОперации = Новый Соответствие(); + ПредставлениеОперации.Вставить("ВыпускМаркера", НСтр("ru = 'Выпуск маркера'", КодЯзыка)); + ПредставлениеОперации.Вставить("ПодписьДокумента", НСтр("ru = 'Подпись документа'", КодЯзыка)); + ПредставлениеОперации.Вставить("ПодписьПакета", НСтр("ru = 'Подпись пакета документов'", КодЯзыка)); + ПредставлениеОперации.Вставить("Расшифрование", НСтр("ru = 'Расшифрование'", КодЯзыка)); + ПредставлениеОперации.Вставить("ЗапросНаСертификат", НСтр("ru = 'Формирование запроса на сертификат'", КодЯзыка)); + ПредставлениеОперации.Вставить("СменаПинКода", НСтр("ru = 'Смена пин-кода к закрытому ключу'", КодЯзыка)); + ПредставлениеОперации.Вставить("ОбновлениеСертификата", НСтр("ru = 'Обновление сертификата'", КодЯзыка)); + ПредставлениеОперации.Вставить("ОтзывСертификата", НСтр("ru = 'Отзыв сертификата'", КодЯзыка)); + ПредставлениеОперации.Вставить("ПриостановкаСертификата", НСтр("ru = 'Приостановка сертификата'", КодЯзыка)); + ПредставлениеОперации.Вставить("ВосстановлениеСертификата", НСтр("ru = 'Восстановление сертификата'", КодЯзыка)); + ПредставлениеОперации.Вставить("УдалениеСертификата", НСтр("ru = 'Удаление сертификата'", КодЯзыка)); + ПредставлениеОперации.Вставить("ДоступККлючу", НСтр("ru = 'Доступ к ключу'", КодЯзыка)); + + ВесьСписок = НастройкиПользователя.Политика.Действия; + + Для Каждого СтрокаКлюча Из ВесьСписок Цикл + НоваяСтрока = ТаблицаДанных.Добавить(); + НоваяСтрока.Имя = ПредставлениеОперации[СтрокаКлюча.Ключ]; + НоваяСтрока.Подтверждать = ?(СтрокаКлюча.Значение.Подтверждать, НСтр("ru = 'Подтверждать'", КодЯзыка), ""); + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ЗаполнитьСписокСертификатов(НастройкиПользователя) + + ТаблицаДанных = ТаблицаСписокСертификатов(); + + ВесьСписок = НастройкиПользователя.Сертификаты; + РабочаяДата = ТекущаяДатаСеанса(); + + Для Каждого СтрокаКлюча Из ВесьСписок Цикл + Сертификат = СтрокаКлюча.Значение; + НоваяСтрока = ТаблицаДанных.Добавить(); + НоваяСтрока.ОбщееИмя = Сертификат.Представление; + НоваяСтрока.Отпечаток = Сертификат.Отпечаток; + НоваяСтрока.ДатаНачала = Сертификат.ДатаНачала; + НоваяСтрока.ДатаОкончания = Сертификат.ДатаОкончания; + НоваяСтрока.Просрочен = РабочаяДата > Сертификат.ДатаОкончания; + + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ЗаполнитьСписокСерверовШтамповВремени(НастройкиПользователя) + + ТаблицаДанных = ТаблицаСерверовШтамповВремени(); + + ВесьСписок = НастройкиПользователя.Политика.СервераШтамповВремени; + + Для Каждого СтрокаМассива Из ВесьСписок Цикл + НоваяСтрока = ТаблицаДанных.Добавить(); + НоваяСтрока.Имя = СтрокаМассива.Имя; + НоваяСтрока.Адрес = СтрокаМассива.Адрес; + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ЗаполнитьСписокТиповПодписей(НастройкиПользователя) + + ТаблицаДанных = ТаблицаСписокТиповПодписи(); + + ВсеТипы = СервисКриптографииDSSКлиентСервер.ПолучитьТипыПодписей(); + ВесьСписок = НастройкиПользователя.Политика.ТипыПодписей; + + Для Каждого СтрокаМассива Из ВесьСписок Цикл + НоваяСтрока = ТаблицаДанных.Добавить(); + НоваяСтрока.Имя = ВсеТипы[СтрокаМассива]; + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + +// Формирует таблицу УЦ +// +// Параметры: +// НастройкиПользователя - см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию +// +Функция ЗаполнитьСписокУдостоверяющихЦентров(НастройкиПользователя) + + ТаблицаДанных = ТаблицаСписокУдостоверяющихЦентров(); + + ВесьСписок = НастройкиПользователя.Политика.УЦ; + + Для Каждого СтрокаКлюча Из ВесьСписок Цикл + НоваяСтрока = ТаблицаДанных.Добавить(); + НоваяСтрока.Имя = СтрокаКлюча.Имя; + НоваяСтрока.Идентификатор = СтрокаКлюча.Идентификатор; + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + +Функция ЗаполнитьСписокКриптопровайдеров(НастройкиПользователя) + + ТаблицаДанных = ТаблицаСписокКриптопровайдеров(); + + ВесьСписок = НастройкиПользователя.Политика.Криптопровайдеры; + + Для Каждого СтрокаКлюча Из ВесьСписок Цикл + НоваяСтрока = ТаблицаДанных.Добавить(); + НоваяСтрока.Имя = СтрокаКлюча.Описание; + НоваяСтрока.Идентификатор = СтрокаКлюча.Идентификатор; + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/ObjectModule.bsl b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/ObjectModule.bsl new file mode 100644 index 000000000..b955b2ef5 --- /dev/null +++ b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/ObjectModule.bsl @@ -0,0 +1,143 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2021, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +#Область ДляВызоваИзДругихПодсистем + +// СтандартныеПодсистемы.ВариантыОтчетов + +// Настройки общей формы отчета подсистемы "Варианты отчетов". +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения, Неопределено - форма отчета или форма настроек отчета. +// Неопределено когда вызов без контекста. +// КлючВарианта - Строка, Неопределено - имя предопределенного +// или уникальный идентификатор пользовательского варианта отчета. +// Неопределено когда вызов без контекста. +// Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию +// +Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт + + Настройки.ВыводитьСуммуВыделенныхЯчеек = Ложь; + Настройки.РазрешеноВыбиратьИНастраиватьВариантыБезСохранения = Истина; + Настройки.СкрытьКомандыРассылки = Истина; + Настройки.РазрешеноИзменятьСтруктуру = Ложь; + Настройки.РазрешеноИзменятьВарианты = Ложь; + Настройки.РазрешеноЗагружатьСхему = Ложь; + Настройки.РазрешеноРедактироватьСхему = Ложь; + Настройки.РазрешеноВосстанавливатьСтандартнуюСхему = Истина; + + Настройки.События.ПриСозданииНаСервере = Истина; + + Настройки.ФормироватьСразу = Истина; + +КонецПроцедуры + +// См. ОтчетыПереопределяемый.ПриСозданииНаСервере. +Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт + + УчетнаяЗапись = Неопределено; + + Если Форма.Параметры.Свойство("УчетнаяЗапись") Тогда + УчетнаяЗапись = Форма.Параметры.УчетнаяЗапись; + УстановитьПараметрыДанных(КомпоновщикНастроек.Настройки, УчетнаяЗапись); + Форма.КлючНазначенияИспользования = УчетнаяЗапись.Метаданные().ПолноеИмя(); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ВариантыОтчетов + +// Следующие процедуры и функции предназначены для интеграции с 1С-Отчетность + +// Предназначена для формирования данных о состояние учетной записи облачной подписи. +// +// Параметры: +// ДанныеРасшифровки - Неопределено - возвращает данные о расшифровке +// ДокументРезультат - ТабличныйДокумент +// - Неопределено +// +// Возвращаемое значение: +// - ТабличныйДокумент +// - Строка +// +// +Функция СформироватьДанныеОтчета(ДанныеРасшифровки, ДокументРезультат = Неопределено) Экспорт + + Если ДокументРезультат = Неопределено Тогда + ДокументРезультат = Новый ТабличныйДокумент; + КонецЕсли; + + НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки(); + НастройкиПользователя = НастройкиОтчета.ПараметрыДанных.Элементы.Найти("НастройкиПользователя").Значение; + ФорматРезультат = НастройкиОтчета.ПараметрыДанных.Элементы.Найти("ФорматРезультата").Значение; + + ДанныеОтчета = Отчеты.СостояниеУчетнойЗаписиDSS.СформироватьДанныеСостоянияУчетнойЗаписи(НастройкиПользователя); + + Если ФорматРезультат = "XML" Тогда + ЗаписьДанных = Новый ЗаписьXML; + ЗаписьДанных.УстановитьСтроку(); + ЗаписьДанных.ЗаписатьНачалоЭлемента("Начало"); + + Для каждого СтрокаКлюча Из ДанныеОтчета.Таблицы Цикл + ЗаписьДанных.ЗаписатьНачалоЭлемента(СтрокаКлюча.Ключ); + СериализаторXDTO.ЗаписатьXML(ЗаписьДанных, СтрокаКлюча.Значение); + ЗаписьДанных.ЗаписатьКонецЭлемента(); + КонецЦикла; + + ЗаписьДанных.ЗаписатьКонецЭлемента(); + ДокументРезультат = ЗаписьДанных.Закрыть(); + + Иначе + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки); + ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; + ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ДанныеОтчета.Таблицы, ДанныеРасшифровки, Истина); + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; + ПроцессорВывода.УстановитьДокумент(ДокументРезультат); + ПроцессорВывода.Вывести(ПроцессорКомпоновки); + + КонецЕсли; + + Возврат ДокументРезультат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область ОбработчикиСобытий + +Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) + + СтандартнаяОбработка= Ложь; + СформироватьДанныеОтчета(ДанныеРасшифровки, ДокументРезультат); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура УстановитьПараметрыДанных(Настройки, УчетнаяЗапись, ПользовательскиеНастройки = Неопределено) + + НастройкиПользователя = СервисКриптографииDSSСлужебный.ПолучитьНастройкиПользователя(УчетнаяЗапись); + ПараметрыДанных = Настройки.ПараметрыДанных; + ПараметрыДанных.УстановитьЗначениеПараметра("НастройкиПользователя", НастройкиПользователя); + +КонецПроцедуры + +#КонецОбласти + +#Иначе +ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); +#КонецЕсли diff --git a/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/Templates/СостояниеУчетнойЗаписиDSS/Template.dcs b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/Templates/СостояниеУчетнойЗаписиDSS/Template.dcs new file mode 100644 index 000000000..071fd611c --- /dev/null +++ b/SSL/src/Reports/СостояниеУчетнойЗаписиDSS/Templates/СостояниеУчетнойЗаписиDSS/Template.dcs @@ -0,0 +1,761 @@ +<?xml version="1.0" encoding="UTF-8"?> +<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <dataSource> + <name>ИсточникДанных1</name> + <dataSourceType>Local</dataSourceType> + </dataSource> + <dataSet xsi:type="DataSetObject"> + <name>СписокОпераций</name> + <field xsi:type="DataSetFieldField"> + <dataPath>СписокОпераций_Имя</dataPath> + <field>Имя</field> + <title xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вид операции</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + СписокОпераций_Подтверждать + Подтверждать + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Подтверждение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + ИсточникДанных1 + СписокОпераций + + + ОсновныеДанные + + ОсновныеДанные_Заголовок + Заголовок + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content> </v8:content> + </v8:item> + + + + ОсновныеДанные_Значение + Значение + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content> </v8:content> + </v8:item> + + + ИсточникДанных1 + ОсновныеДанные + + + Сертификаты + + Сертификаты_ОбщееИмя + ОбщееИмя + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Кому выдан</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + Сертификаты_Отпечаток + Отпечаток + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Отпечаток</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + Сертификаты_ДатаНачала + ДатаНачала + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата начала</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + + + Формат + + + ru + ДФ='dd.MM.yyyy hh:mm:ss' + + + + + + + Сертификаты_ДатаОкончания + ДатаОкончания + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата окончания</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + + + Формат + + + ru + ДФ='dd.MM.yyyy hh:mm:ss' + + + + + + + Сертификаты_Просрочен + Просрочен + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сертификаты просрочен</v8:content> + </v8:item> + + + xs:boolean + + + ИсточникДанных1 + Сертификаты + + + СерверыШтамповВремени + + TSPСерверы_Имя + Имя + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + TSPСерверы_Адрес + Адрес + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Адрес</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + ИсточникДанных1 + СерверыШтамповВремени + + + ТипыПодписи + + ТипПодписи_Имя + Имя + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип подписи</v8:content> + </v8:item> + + + xs:string + + 30 + Variable + + + + + МинимальнаяШирина + 10 + + + + ИсточникДанных1 + ТипыПодписи + + + УдостоверяющиеЦентры + + УдостоверяющиеЦентры_Имя + Имя + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>УЦ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + УдостоверяющиеЦентры_Идентификатор + Идентификатор + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + ИсточникДанных1 + УдостоверяющиеЦентры + + + Криптопровайдеры + + Криптопровайдеры_Имя + Имя + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Криптопровайдер</v8:content> + </v8:item> + + + + КриптоПровайдеры_Идентификатор + Идентификатор + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор</v8:content> + </v8:item> + + + ИсточникДанных1 + Криптопровайдеры + + + ПараметрыПодключения + + ПараметрыПодключения_Заголовок + Заголовок + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Заголовок</v8:content> + </v8:item> + + + + ПараметрыПодключения_Значение + Значение + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + ИсточникДанных1 + ПараметрыПодключения + + + ДатаСеанса + 1 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата сеанса</v8:content> + </v8:item> + + + + НастройкиПользователя + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Настройки пользователя</v8:content> + </v8:item> + + + true + false + + + ФорматРезультата + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Формат результата</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + true + false + +